diff --git a/.eslintignore b/.eslintignore index fba46e43283..303356d0450 100644 --- a/.eslintignore +++ b/.eslintignore @@ -26,3 +26,5 @@ scripts/skipPrepareScript.js .eslintignore .prettierignore *.json +Dockerfile* +*.properties \ No newline at end of file diff --git a/.github/workflows/allure-test-reporter.yml b/.github/workflows/allure-test-reporter.yml new file mode 100644 index 00000000000..959127a2a65 --- /dev/null +++ b/.github/workflows/allure-test-reporter.yml @@ -0,0 +1,114 @@ +name: Allure Test Reporter + +on: + pull_request: + types: + - opened + - reopened + - synchronize + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.sha }} + cancel-in-progress: true + +permissions: + id-token: write + contents: write # Required for gh-pages deployment + +jobs: + test_and_publish: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4.2.1 + + - name: Setup Node + uses: actions/setup-node@v4.0.4 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install Dependencies + run: npm ci + + - name: Run Tests and Generate Report + run: | + npm run test:ts:silent + + - name: Install Allure + run: npm install -g allure-commandline + + - name: Generate Allure Report + run: | + REPO_NAME=$(basename ${{ github.repository }}) + PR_NUMBER=${{ github.event.pull_request.number }} + REPORT_FOLDER="${REPO_NAME}/${PR_NUMBER}" + allure generate allure-results --clean -o "${REPORT_FOLDER}" + echo "REPORT_FOLDER=${REPORT_FOLDER}" >> $GITHUB_ENV # Persist this variable + + - name: Checkout Reports Repository + uses: actions/checkout@v4 + with: + repository: rudderlabs/test-reports + token: ${{ secrets.PAT }} + path: test-reports + + - name: Copy Allure Report to Reports Repository + run: | + mkdir -p "test-reports/$REPORT_FOLDER" + cp -r $REPORT_FOLDER/* test-reports/$REPORT_FOLDER/ + + - name: Cleanup Old Reports (Keep Only Last 50) + run: | + REPO_NAME=$(basename ${{ github.repository }}) + cd test-reports/${REPO_NAME} + ls -t | tail -n +51 | xargs rm -rf || echo "No old reports to delete" + + - name: Commit and Push Report + env: + GITHUB_TOKEN: ${{ secrets.PAT }} + run: | + cd test-reports + git config --global user.name "github-actions" + git config --global user.email "github-actions@github.com" + + # Stash any unstaged changes before pulling + git add . + git stash || echo "No changes to stash" + + # Pull latest changes safely + git pull --rebase origin main + + # Apply the stashed changes back + git stash pop || echo "No stash to apply" + + # Commit new report if there are changes + git add . + git commit -m "chore: add allure report for $REPORT_FOLDER" || echo "No changes to commit" + + # Push changes with retry logic + for i in {1..5}; do + git push origin main && break || sleep 5 + git pull --rebase origin main + done + + - name: Add Test Report Link as Comment on PR + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.PAT }} + script: | + const { owner, repo } = context.repo; + const prNumber = context.payload.pull_request.number; + + const reportFolder = process.env.REPORT_FOLDER; // Read from environment variable + const commentBody = `Allure Test reports for this run are available at: + - Allure Report: [View Report](https://rudderlabs.github.io/test-reports/${reportFolder}/index.html)`; + + // Comment on the pull request + await github.rest.issues.createComment({ + owner, + repo, + issue_number: prNumber, + body: commentBody + }); diff --git a/.github/workflows/build-pr-artifacts.yml b/.github/workflows/build-pr-artifacts.yml index 46670fba846..cd8cea2b643 100644 --- a/.github/workflows/build-pr-artifacts.yml +++ b/.github/workflows/build-pr-artifacts.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest name: Generate Tag Names # Skip for the release pull requests as staging artifacts will be generated - if: startsWith(github.event.pull_request.head.ref, 'release/') != true && startsWith(github.event.pull_request.head.ref, 'hotfix-release/') != true && github.event.pull_request.head.ref != 'main' + if: startsWith(github.event.pull_request.head.ref, 'release/') != true && startsWith(github.event.pull_request.head.ref, 'hotfix-release/') != true && github.event.pull_request.head.ref != 'master' outputs: tag_name: ${{ steps.gen_tag_names.outputs.tag_name }} tag_name_ut: ${{ steps.gen_tag_names.outputs.tag_name_ut }} @@ -42,31 +42,35 @@ jobs: name: Build Transformer Docker Image - PR # Skip for the release pull requests as staging artifacts will be generated # Skip main to develop sync pull requests - if: startsWith(github.event.pull_request.head.ref, 'release/') != true && startsWith(github.event.pull_request.head.ref, 'hotfix-release/') != true && github.event.pull_request.head.ref != 'main' + if: startsWith(github.event.pull_request.head.ref, 'release/') != true && startsWith(github.event.pull_request.head.ref, 'hotfix-release/') != true && github.event.pull_request.head.ref != 'master' needs: [generate-tag-names] uses: ./.github/workflows/build-push-docker-image.yml with: - build_tag: rudderstack/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} - push_tags: rudderstack/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + build_tag: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + push_tags: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name }} dockerfile: Dockerfile load_target: development push_target: production secrets: DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} build-user-transformer-image: name: Build User Transformer Docker Image - PR # Skip for the release pull requests as staging artifacts will be generated - if: startsWith(github.event.pull_request.head.ref, 'release/') != true && startsWith(github.event.pull_request.head.ref, 'hotfix-release/') != true && github.event.pull_request.head.ref != 'main' + if: startsWith(github.event.pull_request.head.ref, 'release/') != true && startsWith(github.event.pull_request.head.ref, 'hotfix-release/') != true && github.event.pull_request.head.ref != 'master' needs: [generate-tag-names] uses: ./.github/workflows/build-push-docker-image.yml with: - build_tag: rudderstack/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} - push_tags: rudderstack/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} + build_tag: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} + push_tags: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name_ut }} dockerfile: Dockerfile-ut-func load_target: development push_target: production secrets: DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} diff --git a/.github/workflows/build-push-docker-image.yml b/.github/workflows/build-push-docker-image.yml index ba62e5d8d17..b4fc2e7d95d 100644 --- a/.github/workflows/build-push-docker-image.yml +++ b/.github/workflows/build-push-docker-image.yml @@ -33,11 +33,16 @@ on: workflow_url: type: string secrets: - DOCKERHUB_PROD_TOKEN: + DOCKERHUB_TOKEN: + required: true + DOCKERHUB_USERNAME: + required: true + DOCKERHUB_TOKEN: required: true env: - DOCKERHUB_USERNAME: rudderlabs + DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} jobs: get_sha: @@ -96,13 +101,13 @@ jobs: with: ref: ${{ needs.get_sha.outputs.sha }} fetch-depth: 1 - + - name: Login to DockerHub uses: docker/login-action@v3.3.0 with: - username: ${{ env.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PROD_TOKEN }} - + registry: dockeronce.azurecr.io + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3.7.1 @@ -149,12 +154,12 @@ jobs: with: ref: ${{ needs.get_sha.outputs.sha }} fetch-depth: 1 - + - name: Login to DockerHub uses: docker/login-action@v3.3.0 with: username: ${{ env.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Setup Docker Buildx uses: docker/setup-buildx-action@v3.7.1 @@ -202,7 +207,7 @@ jobs: uses: docker/login-action@v3.3.0 with: username: ${{ env.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.7.1 diff --git a/.github/workflows/component-test-report.yml b/.github/workflows/component-test-report.yml deleted file mode 100644 index 8d739c5aee6..00000000000 --- a/.github/workflows/component-test-report.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: Component Test Reporter - -on: - pull_request: - types: - - opened - - reopened - - synchronize - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.sha }} - cancel-in-progress: true - -permissions: - id-token: write # allows the JWT to be requested from GitHub's OIDC provider - contents: read # This is required for actions/checkout - -jobs: - test_and_upload: - runs-on: ubuntu-latest - - steps: - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v4 - with: - role-to-assume: arn:aws:iam::${{ secrets.AWS_DEV_ACCOUNT_ID }}:role/${{ secrets.AWS_DEV_S3_SYNC_ROLE }} - aws-region: us-east-1 - - - name: Checkout - uses: actions/checkout@v4.2.1 - with: - fetch-depth: 1 - - - name: Setup Node - uses: actions/setup-node@v4.0.4 - with: - node-version-file: '.nvmrc' - cache: 'npm' - - - name: Install Dependencies - run: npm ci - - - name: Run Tests and Generate Report - run: | - npm run test:ts -- component - - - name: Uplaod Report to S3 - run: | - aws s3 cp ./test_reports/ s3://test-integrations-dev/integrations-test-reports/rudder-transformer/${{ github.event.number }}/ --recursive - - - name: Add Test Report Link as Comment on PR - uses: actions/github-script@v7 - with: - github-token: ${{ secrets.PAT }} - script: | - const { owner, repo } = context.repo; - // Get the pull request number - const prNumber = context.payload.pull_request.number; - const commentBody = `Test report for this run is available at: https://test-integrations-dev.s3.amazonaws.com/integrations-test-reports/rudder-transformer/${prNumber}/test-report.html`; - - // find all the comments of the PR - const issueComments = await github.paginate(github.rest.issues.listComments, { - owner, - repo, - issue_number: prNumber, - }); - - for (const comment of issueComments) { - if (comment.body === commentBody) { - console.log('Comment already exists'); - return; - } - } - - // Comment on the pull request - await github.rest.issues.createComment({ - owner, - repo, - issue_number: prNumber, - body: commentBody - }); diff --git a/.github/workflows/create-hotfix-branch.yml b/.github/workflows/create-hotfix-branch.yml index 994283a9f43..3cdc27609ee 100644 --- a/.github/workflows/create-hotfix-branch.yml +++ b/.github/workflows/create-hotfix-branch.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest # Only allow these users to create new hotfix branch from 'main' - if: github.ref == 'refs/heads/main' && (github.actor == 'ItsSudip' || github.actor == 'krishna2020' || github.actor == 'koladilip' || github.actor == 'saikumarrs' || github.actor == 'sandeepdsvs' || github.actor == 'shrouti1507' || github.actor == 'anantjain45823' || github.actor == 'chandumlg' || github.actor == 'mihir-4116' || github.actor == 'utsabc') && (github.triggering_actor == 'ItsSudip' || github.triggering_actor == 'krishna2020' || github.triggering_actor == 'saikumarrs' || github.triggering_actor == 'sandeepdsvs' || github.triggering_actor == 'koladilip' || github.triggering_actor == 'shrouti1507' || github.triggering_actor == 'anantjain45823' || github.triggering_actor == 'chandumlg' || github.triggering_actor == 'mihir-4116' || github.triggering_actor == 'sanpj2292' || github.triggering_actor == 'utsabc') + if: github.ref == 'refs/heads/main' && (github.actor == 'vinayteki95' || github.actor == 'ItsSudip' || github.actor == 'krishna2020' || github.actor == 'koladilip' || github.actor == 'saikumarrs' || github.actor == 'sandeepdsvs' || github.actor == 'shrouti1507' || github.actor == 'anantjain45823' || github.actor == 'chandumlg' || github.actor == 'mihir-4116' || github.actor == 'utsabc') && (github.triggering_actor == 'ItsSudip' || github.triggering_actor == 'krishna2020' || github.triggering_actor == 'saikumarrs' || github.triggering_actor == 'sandeepdsvs' || github.triggering_actor == 'koladilip' || github.triggering_actor == 'shrouti1507' || github.triggering_actor == 'anantjain45823' || github.triggering_actor == 'chandumlg' || github.triggering_actor == 'mihir-4116' || github.triggering_actor == 'sanpj2292' || github.triggering_actor == 'utsabc' || github.triggering_actor == 'vinayteki95') steps: - name: Create Branch uses: peterjgrainger/action-create-branch@v2.4.0 diff --git a/.github/workflows/draft-new-release.yml b/.github/workflows/draft-new-release.yml index 602ded980fd..726b28cc96c 100644 --- a/.github/workflows/draft-new-release.yml +++ b/.github/workflows/draft-new-release.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest # Only allow release stakeholders to initiate releases - if: (github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/heads/hotfix/')) && (github.actor == 'ItsSudip' || github.actor == 'krishna2020' || github.actor == 'saikumarrs' || github.actor == 'sandeepdsvs' || github.actor == 'koladilip' || github.actor == 'shrouti1507' || github.actor == 'anantjain45823' || github.actor == 'chandumlg' || github.actor == 'mihir-4116' || github.actor == 'yashasvibajpai' || github.actor == 'sanpj2292' || github.actor == 'utsabc') && (github.triggering_actor == 'ItsSudip' || github.triggering_actor == 'krishna2020' || github.triggering_actor == 'koladilip' || github.triggering_actor == 'saikumarrs' || github.triggering_actor == 'sandeepdsvs' || github.triggering_actor == 'shrouti1507' || github.triggering_actor == 'anantjain45823' || github.triggering_actor == 'chandumlg' || github.triggering_actor == 'mihir-4116' || github.triggering_actor == 'yashasvibajpai' || github.triggering_actor == 'sanpj2292' || github.triggering_actor == 'utsabc') + if: (github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/heads/hotfix/')) && (github.actor == 'ItsSudip' || github.actor == 'krishna2020' || github.actor == 'sandeepdsvs' || github.actor == 'koladilip' || github.actor == 'yashasvibajpai' || github.actor == 'sanpj2292' || github.actor == 'utsabc' || github.actor == 'vinayteki95') && (github.triggering_actor == 'ItsSudip' || github.triggering_actor == 'krishna2020' || github.triggering_actor == 'koladilip' || github.triggering_actor == 'saikumarrs' || github.triggering_actor == 'sandeepdsvs' || github.triggering_actor == 'shrouti1507' || github.triggering_actor == 'anantjain45823' || github.triggering_actor == 'chandumlg' || github.triggering_actor == 'mihir-4116' || github.triggering_actor == 'yashasvibajpai' || github.triggering_actor == 'sanpj2292' || github.triggering_actor == 'utsabc') steps: - name: Checkout uses: actions/checkout@v4.2.1 @@ -79,10 +79,11 @@ jobs: git push - name: Create Pull Request - uses: repo-sync/pull-request@v2.12.1 - with: - source_branch: ${{ steps.create-release.outputs.branch_name }} - destination_branch: 'main' - github_token: ${{ secrets.PAT }} - pr_title: 'chore(release): pull ${{ steps.create-release.outputs.branch_name }} into main' - pr_body: ':crown: *An automated PR*' + run: | + gh pr create \ + --base main \ + --head "${{ steps.create-release.outputs.branch_name }}" \ + --title "chore(release): pull ${{ steps.create-release.outputs.branch_name }} into main" \ + --body ":crown: *An automated PR*" + env: + GH_TOKEN: ${{ secrets.PAT }} diff --git a/.github/workflows/prepare-for-dev-deploy.yml b/.github/workflows/prepare-for-dev-deploy.yml index b5482bcddf1..a43cb95d330 100644 --- a/.github/workflows/prepare-for-dev-deploy.yml +++ b/.github/workflows/prepare-for-dev-deploy.yml @@ -1,14 +1,9 @@ name: Prepare for Dev Environment Deployment on: - push: - branches: - - develop pull_request: types: - closed - branches: - - develop concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.sha }} @@ -54,8 +49,8 @@ jobs: needs: [generate-tag-names] uses: ./.github/workflows/build-push-docker-image.yml with: - build_tag: rudderstack/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} - push_tags: rudderstack/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + build_tag: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + push_tags: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name }} dockerfile: Dockerfile load_target: development @@ -63,6 +58,8 @@ jobs: use_merge_sha: true secrets: DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} build-user-transformer-image: name: Build User Transformer Docker Image - Dev @@ -71,11 +68,13 @@ jobs: needs: [generate-tag-names] uses: ./.github/workflows/build-push-docker-image.yml with: - build_tag: rudderstack/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} - push_tags: rudderstack/develop-rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} + build_tag: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} + push_tags: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name_ut }} dockerfile: Dockerfile-ut-func load_target: development push_target: production secrets: DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }} diff --git a/.github/workflows/prepare-for-prod-dt-deploy.yml b/.github/workflows/prepare-for-prod-dt-deploy.yml index 0a61a359bfa..44c3813a8a7 100644 --- a/.github/workflows/prepare-for-prod-dt-deploy.yml +++ b/.github/workflows/prepare-for-prod-dt-deploy.yml @@ -3,12 +3,12 @@ name: Prepare for DT Production Environment Deployment on: push: branches: - - main + - master pull_request: types: - closed branches: - - main + - master concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.sha }} @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest name: Generate Tag Names # Only merged pull requests from release candidate branches must trigger - if: ((startsWith(github.event.pull_request.head.ref, 'release/') || startsWith(github.event.pull_request.head.ref, 'hotfix-release/')) && github.event.pull_request.merged == true) + if: ((startsWith(github.event.pull_request.head.ref, 'release/') || startsWith(github.event.pull_request.head.ref, 'hotfix-release/') || startsWith(github.event.pull_request.head.ref, 'master')) && github.event.pull_request.merged == true) outputs: tag_name: ${{ steps.gen_tag_names.outputs.tag_name }} tag_name_ut: ${{ steps.gen_tag_names.outputs.tag_name_ut }} @@ -46,12 +46,12 @@ jobs: build-transformer-image: name: Build Transformer Docker Image - Prod # Only merged pull requests from release candidate branches must trigger - if: ((startsWith(github.event.pull_request.head.ref, 'release/') || startsWith(github.event.pull_request.head.ref, 'hotfix-release/')) && github.event.pull_request.merged == true) + if: ((startsWith(github.event.pull_request.head.ref, 'release/') || startsWith(github.event.pull_request.head.ref, 'hotfix-release/') || startsWith(github.event.pull_request.head.ref, 'master')) && github.event.pull_request.merged == true) needs: [generate-tag-names] uses: ./.github/workflows/build-push-docker-image.yml with: - build_tag: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} - push_tags: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + build_tag: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + push_tags: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }},dockeronce.azurecr.io/kubernetes/rudder-transformer:latest img_tag: ${{ needs.generate-tag-names.outputs.tag_name }} dockerfile: Dockerfile load_target: development @@ -61,6 +61,8 @@ jobs: skip_tests: ${{startsWith(github.event.pull_request.head.ref, 'hotfix-release/')}} secrets: DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} create-pull-request: name: Update Helm Charts For Production and Create Pull Request @@ -159,7 +161,7 @@ jobs: cd customer-objects - declare -a enabled_ut_customers=() + declare -a enabled_dt_customers=() declare -a sub_directories=('enterprise-us' 'enterprise-eu') # identify the customers enabled in sub-directories @@ -167,21 +169,21 @@ jobs: for f in "./$directory"/*; do [[ -f $f ]] || continue - enabled="$(yq e '.spec.user_transformer.enabled' $f)" + enabled="$(yq e '.spec.transformer.enabled' $f)" if [ $enabled == "true" ]; then - enabled_ut_customers+=( $f ) + enabled_dt_customers+=( $f ) fi done done # bump up the customers version and repository information - for customer in "${enabled_ut_customers[@]}"; do - yq eval -i ".spec.user_transformer.image.version=\"$TAG_NAME\"" $customer - yq eval -i ".spec.user_transformer.image.repository=\"$TF_IMAGE_REPOSITORY\"" $customer + for customer in "${enabled_dt_customers[@]}"; do + yq eval -i ".spec.transformer.image.version=\"$TAG_NAME\"" $customer + yq eval -i ".spec.transformer.image.repository=\"$TF_IMAGE_REPOSITORY\"" $customer git add $customer done - git commit -m "chore: upgrade dedicated transformers to $TAG_NAME" + git commit -m "chore: upgrade dedicated dt transformers to $TAG_NAME" git push -u origin dedicated-transformer-$TAG_NAME gh pr create --fill diff --git a/.github/workflows/prepare-for-prod-ut-deploy.yml b/.github/workflows/prepare-for-prod-ut-deploy.yml index 3053979b3e0..3a20a506b53 100644 --- a/.github/workflows/prepare-for-prod-ut-deploy.yml +++ b/.github/workflows/prepare-for-prod-ut-deploy.yml @@ -3,12 +3,12 @@ name: Prepare for UT Production Environment Deployment on: push: branches: - - main + - master pull_request: types: - closed branches: - - main + - master concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.sha }} @@ -26,9 +26,10 @@ jobs: runs-on: ubuntu-latest name: Generate Tag Names # Only merged pull requests from release candidate branches must trigger - if: ((startsWith(github.event.pull_request.head.ref, 'release/') || startsWith(github.event.pull_request.head.ref, 'hotfix-release/')) && github.event.pull_request.merged == true) + if: ((startsWith(github.event.pull_request.head.ref, 'release/') || startsWith(github.event.pull_request.head.ref, 'hotfix-release/') || startsWith(github.event.pull_request.head.ref, 'master')) && github.event.pull_request.merged == true) outputs: tag_name_ut: ${{ steps.gen_tag_names.outputs.tag_name_ut }} + tag_name: ${{ steps.gen_tag_names.outputs.tag_name }} steps: - name: Checkout uses: actions/checkout@v4.2.1 @@ -49,12 +50,12 @@ jobs: build-user-transformer-image: name: Build User Transformer Docker Image - Prod # Only merged pull requests from release candidate branches must trigger - if: ((startsWith(github.event.pull_request.head.ref, 'release/') || startsWith(github.event.pull_request.head.ref, 'hotfix-release/')) && github.event.pull_request.merged == true) + if: ((startsWith(github.event.pull_request.head.ref, 'release/') || startsWith(github.event.pull_request.head.ref, 'hotfix-release/') || startsWith(github.event.pull_request.head.ref, 'master')) && github.event.pull_request.merged == true) needs: [generate-tag-names] uses: ./.github/workflows/build-push-docker-image.yml with: - build_tag: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} - push_tags: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} + build_tag: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} + push_tags: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }},dockeronce.azurecr.io/kubernetes/rudder-transformer:ut-latest img_tag: ${{ needs.generate-tag-names.outputs.tag_name_ut }} dockerfile: Dockerfile-ut-func load_target: development @@ -64,6 +65,8 @@ jobs: skip_tests: ${{startsWith(github.event.pull_request.head.ref, 'hotfix-release/')}} secrets: DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} create-pull-request: name: Update Helm Charts For Production and Create Pull Request @@ -71,6 +74,7 @@ jobs: needs: [generate-tag-names, build-user-transformer-image] env: UT_TAG_NAME: ${{ needs.generate-tag-names.outputs.tag_name_ut }} + TAG_NAME: ${{ needs.generate-tag-names.outputs.tag_name }} TF_IMAGE_REPOSITORY: rudderstack/rudder-transformer steps: - name: Checkout @@ -134,3 +138,39 @@ jobs: git push -u origin hosted-user-transformer-$UT_TAG_NAME gh pr create --fill + + - name: Update helm charts and raise pull request for enterprise customers on dedicated transformers + env: + GITHUB_TOKEN: ${{ secrets.PAT }} + run: | + cd rudder-devops + git checkout -b dedicated-user-transformer-$TAG_NAME + + cd customer-objects + + declare -a enabled_ut_customers=() + declare -a sub_directories=('enterprise-us' 'enterprise-eu') + + # identify the customers enabled in sub-directories + for directory in "${sub_directories[@]}"; do + for f in "./$directory"/*; do + [[ -f $f ]] || continue + + enabled="$(yq e '.spec.user_transformer.enabled' $f)" + if [ $enabled == "true" ]; then + enabled_ut_customers+=( $f ) + fi + done + done + + # bump up the customers version and repository information + for customer in "${enabled_ut_customers[@]}"; do + yq eval -i ".spec.user_transformer.image.version=\"$TAG_NAME\"" $customer + yq eval -i ".spec.user_transformer.image.repository=\"$TF_IMAGE_REPOSITORY\"" $customer + git add $customer + done + + git commit -m "chore: upgrade dedicated user transformers to $TAG_NAME" + git push -u origin dedicated-user-transformer-$TAG_NAME + + gh pr create --fill diff --git a/.github/workflows/prepare-for-staging-deploy.yml b/.github/workflows/prepare-for-staging-deploy.yml index cdf27f78327..3716ecb5709 100644 --- a/.github/workflows/prepare-for-staging-deploy.yml +++ b/.github/workflows/prepare-for-staging-deploy.yml @@ -7,7 +7,7 @@ on: - reopened - synchronize branches: - - main + - master concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.sha }} @@ -46,8 +46,8 @@ jobs: needs: [generate-tag-names] uses: ./.github/workflows/build-push-docker-image.yml with: - build_tag: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} - push_tags: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + build_tag: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} + push_tags: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name }} dockerfile: Dockerfile load_target: development @@ -55,6 +55,8 @@ jobs: use_merge_sha: true secrets: DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} build-user-transformer-image: name: Build User Transformer Docker Image - Staging @@ -64,14 +66,16 @@ jobs: needs: [generate-tag-names] uses: ./.github/workflows/build-push-docker-image.yml with: - build_tag: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} - push_tags: rudderstack/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} + build_tag: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} + push_tags: dockeronce.azurecr.io/kubernetes/rudder-transformer:${{ needs.generate-tag-names.outputs.tag_name_ut }} img_tag: ${{ needs.generate-tag-names.outputs.tag_name_ut }} dockerfile: Dockerfile-ut-func load_target: development push_target: production secrets: DOCKERHUB_PROD_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} + DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }} + DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_PROD_TOKEN }} create-pull-request: name: Update Helm Charts For Staging and Create Pull Request diff --git a/.github/workflows/publish-new-release.yml b/.github/workflows/publish-new-release.yml index a91a1e2b22b..5953f94c93e 100644 --- a/.github/workflows/publish-new-release.yml +++ b/.github/workflows/publish-new-release.yml @@ -63,13 +63,14 @@ jobs: echo "DATE=$(date)" >> $GITHUB_ENV - name: Pull Changes Into develop Branch - uses: repo-sync/pull-request@v2.12.1 - with: - source_branch: 'main' - destination_branch: 'develop' - github_token: ${{ secrets.PAT }} - pr_title: 'chore(release): pull main into develop post release v${{ steps.extract-version.outputs.release_version }}' - pr_body: ':crown: *An automated PR*' + run: | + gh pr create \ + --base develop \ + --head main \ + --title "chore(release): pull main into develop post release v${{ steps.extract-version.outputs.release_version }}" \ + --body ":crown: *An automated PR*" + env: + GH_TOKEN: ${{ secrets.PAT }} - name: Delete Release Branch uses: koj-co/delete-merged-action@master @@ -99,7 +100,7 @@ jobs: channel-id: ${{ secrets.SLACK_RELEASE_CHANNEL_ID }} payload: | { - "text": "*<${{env.RELEASES_URL}}v${{ steps.extract-version.outputs.release_version }}|v${{ steps.extract-version.outputs.release_version }}>*\nCC: <@U03KG4BK1L1> <@U024YF8CR53> <@U01LVJ30QEB>", + "text": "*<${{env.RELEASES_URL}}v${{ steps.extract-version.outputs.release_version }}|v${{ steps.extract-version.outputs.release_version }}>*\nCC: <@S02AEQL26CT> <@S03SEKBFX0D> <@U021E50QAGY>", "blocks": [ { "type": "header", diff --git a/.gitignore b/.gitignore index 84421f49d9b..5526573051e 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ bower_components # Compiled binary addons (https://nodejs.org/api/addons.html) build/Release +build/ # Dependency directories node_modules/ @@ -91,6 +92,7 @@ out # Nuxt.js build / generate output .nuxt dist +dist-test # Gatsby files .cache/ @@ -139,4 +141,11 @@ dist # component test report test_reports/ -temp/ \ No newline at end of file +temp/ + +# Allure +allure-results/ +allure-report/ + +# local scripts +*/scripts/local/ \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index 99c98cdd6a8..87bc4c77fe1 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18.20.1 +20.18.3 diff --git a/.vscode/launch.json b/.vscode/launch.json index d6feaf356ee..4834a273d9b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,38 +1,19 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - { - "name": "transformer", - "type": "node", - "request": "launch", - "program": "${workspaceRoot}/index.js", - "runtimeArgs": ["--nolazy"], - "sourceMaps": true, - "runtimeExecutable": "/usr/local/bin/node" - }, { "type": "node", "request": "launch", - "name": "Launch TS", - "program": "${workspaceFolder}/dist/src/index.js", + "name": "transformer", + "program": "${workspaceFolder}/src/index.ts", "outFiles": ["${workspaceFolder}/dist/src/**/*.js"], - "runtimeExecutable": "/usr/local/bin/node" - }, - { - "name": "benchmark", - "type": "node", - "request": "launch", - "program": "${workspaceRoot}/benchmark", - "args": ["--destinations=${input:destinations}", "--feature=${input:feature}"], - "runtimeArgs": ["--nolazy"], - "sourceMaps": true, - "runtimeExecutable": "/usr/local/bin/node" + "runtimeArgs": ["--require", "${workspaceFolder}/node_modules/ts-node/register"], + "resolveSourceMapLocations": ["${workspaceFolder}/**", "!**/node_modules/**"], + "env": { + "NODE_ENV": "development" + } }, { - "runtimeExecutable": "/usr/local/bin/node", "type": "node", "request": "launch", "name": "Jest Current File", @@ -40,24 +21,34 @@ "args": ["${fileBasenameNoExtension}", "--config", "jest.config.js"], "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, + "runtimeArgs": ["--require", "${workspaceFolder}/node_modules/ts-node/register"], "windows": { "program": "${workspaceFolder}/node_modules/jest/bin/jest" + }, + "env": { + "NODE_ENV": "test" } - } - ], - "inputs": [ - { - "id": "destinations", - "type": "promptString", - "description": "Enter destinations", - "default": "algolia" }, { - "id": "feature", - "type": "promptString", - "description": "Enter Feature", - "default": "proc" + "type": "node", + "request": "launch", + "name": "Test Single Component", + "program": "${workspaceFolder}/node_modules/.bin/jest", + "args": [ + "-c", + "jest.config.typescript.js", + "component", + "--destination=monday", + "--feature=processor" + ], + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "runtimeArgs": ["--require", "${workspaceFolder}/node_modules/ts-node/register"], + "env": { + "NODE_ENV": "test", + "NODE_OPTIONS": "--no-node-snapshot", + "LOG_LEVEL": "silent" + } } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index e742ea1f553..3b256264fc4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,194 @@ 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.93.0](https://github.com/rudderlabs/rudder-transformer/compare/v1.92.1...v1.93.0) (2025-03-10) + + +### Features + +* **destination:** pass object data in event for moengage ([#4111](https://github.com/rudderlabs/rudder-transformer/issues/4111)) ([5edfbb8](https://github.com/rudderlabs/rudder-transformer/commit/5edfbb834bfde0d39f6f177406ebf70a1138ddad)) +* onboarding new source facebook lead ads ([#4132](https://github.com/rudderlabs/rudder-transformer/issues/4132)) ([7e54fa2](https://github.com/rudderlabs/rudder-transformer/commit/7e54fa22e416aa998e6d2d009b36cff814df94a1)) + + +### Bug Fixes + +* **destination:** use coql api to delete record for zoho ([#4134](https://github.com/rudderlabs/rudder-transformer/issues/4134)) ([2c67c9a](https://github.com/rudderlabs/rudder-transformer/commit/2c67c9abe6ca50320bea195d22bc00f70ee65ddf)) +* marketo get auth token cache issue ([#4140](https://github.com/rudderlabs/rudder-transformer/issues/4140)) ([29175ac](https://github.com/rudderlabs/rudder-transformer/commit/29175ac13e1918a67e9a8367423fd9c1327aacc5)) + +### [1.92.1](https://github.com/rudderlabs/rudder-transformer/compare/v1.92.0...v1.92.1) (2025-03-07) + + +### Bug Fixes + +* wrong method during update call when dont batch true ([#4146](https://github.com/rudderlabs/rudder-transformer/issues/4146)) ([3aae1cb](https://github.com/rudderlabs/rudder-transformer/commit/3aae1cbba494c29824154d98beff5ae5ec67b506)) + +## [1.92.0](https://github.com/rudderlabs/rudder-transformer/compare/v1.91.5...v1.92.0) (2025-03-03) + + +### Features + +* added event validation in braze source ([#4104](https://github.com/rudderlabs/rudder-transformer/issues/4104)) ([bcb98e1](https://github.com/rudderlabs/rudder-transformer/commit/bcb98e13509b734d68d20fbc42277cc94398eeba)) +* id stitching improvement in shopify pixel transformations ([#4060](https://github.com/rudderlabs/rudder-transformer/issues/4060)) ([558eab6](https://github.com/rudderlabs/rudder-transformer/commit/558eab64652da9f75ca9bc4a5484460e3a95b8e9)), closes [#4074](https://github.com/rudderlabs/rudder-transformer/issues/4074) [#4092](https://github.com/rudderlabs/rudder-transformer/issues/4092) +* remove consent from db-config and add store sales to integrations object ([#4091](https://github.com/rudderlabs/rudder-transformer/issues/4091)) ([2943b3d](https://github.com/rudderlabs/rudder-transformer/commit/2943b3d77f177d6b93fb5231eead81f9f05accb9)) +* zoho vdmv2 ([#4096](https://github.com/rudderlabs/rudder-transformer/issues/4096)) ([2d129a7](https://github.com/rudderlabs/rudder-transformer/commit/2d129a79ce8e8599e4bd5d5718afb25100a689ff)) + + +### Bug Fixes + +* add module in the search url path for zoho ([#4126](https://github.com/rudderlabs/rudder-transformer/issues/4126)) ([f7ed9a4](https://github.com/rudderlabs/rudder-transformer/commit/f7ed9a434299b750095642b0030323bc72f1341c)) +* added missing email check during primary email id filtering in zendesk destination ([#4124](https://github.com/rudderlabs/rudder-transformer/issues/4124)) ([b991017](https://github.com/rudderlabs/rudder-transformer/commit/b991017faffed3479d805a276d53f58469f16699)) +* mixpanel ios property mapping ios_app_release and ios_app_version ([#4072](https://github.com/rudderlabs/rudder-transformer/issues/4072)) ([d9eb0c5](https://github.com/rudderlabs/rudder-transformer/commit/d9eb0c5da16eccedac8d1b9bf524ef8bd6569fa4)) +* vs code debugger config ([#4130](https://github.com/rudderlabs/rudder-transformer/issues/4130)) ([bbb969b](https://github.com/rudderlabs/rudder-transformer/commit/bbb969b90c3e82f73d2bbd99f5ec62bb8dd67a8c)) + +### [1.91.5](https://github.com/rudderlabs/rudder-transformer/compare/v1.91.4...v1.91.5) (2025-02-28) + + +### Bug Fixes + +* mailjet handling of v2 spec ([94611c9](https://github.com/rudderlabs/rudder-transformer/commit/94611c942afca4b17f4dd60024172ce4bc599563)) + +### [1.91.4](https://github.com/rudderlabs/rudder-transformer/compare/v1.91.3...v1.91.4) (2025-02-27) + +### [1.91.3](https://github.com/rudderlabs/rudder-transformer/compare/v1.91.2...v1.91.3) (2025-02-25) + +### [1.91.2](https://github.com/rudderlabs/rudder-transformer/compare/v1.91.1...v1.91.2) (2025-02-24) + +### [1.91.1](https://github.com/rudderlabs/rudder-transformer/compare/v1.91.0...v1.91.1) (2025-02-19) + + +### Bug Fixes + +* snapchat util function for normalizing phone number ([#4093](https://github.com/rudderlabs/rudder-transformer/issues/4093)) ([17ff7f9](https://github.com/rudderlabs/rudder-transformer/commit/17ff7f96a2a911485592afb379dd2886ee8b9982)) + +## [1.91.0](https://github.com/rudderlabs/rudder-transformer/compare/v1.90.2...v1.91.0) (2025-02-17) + + +### Features + +* add support for hashed cart token as anonymousid ([#4048](https://github.com/rudderlabs/rudder-transformer/issues/4048)) ([2b350fe](https://github.com/rudderlabs/rudder-transformer/commit/2b350fe22919d99b803cb17629b30f0c83dc5f8a)) +* added drop traits in track call feature for mixpanel ([#4034](https://github.com/rudderlabs/rudder-transformer/issues/4034)) ([bdd735d](https://github.com/rudderlabs/rudder-transformer/commit/bdd735df38d92b6658250e500d13f3e4b4c7ffad)) +* **http:** add support for isDefaultMapping ([#4073](https://github.com/rudderlabs/rudder-transformer/issues/4073)) ([05553eb](https://github.com/rudderlabs/rudder-transformer/commit/05553eb5cbf3aa0afd752dca9af74e32722876ed)) + + +### Bug Fixes + +* airship array handling ([#4011](https://github.com/rudderlabs/rudder-transformer/issues/4011)) ([ce86cec](https://github.com/rudderlabs/rudder-transformer/commit/ce86cecbc0a2edbdff8878541771a2ebcf3f6dd9)) +* content_price should be a number with decimal point in twitter ads ([#4075](https://github.com/rudderlabs/rudder-transformer/issues/4075)) ([711e18b](https://github.com/rudderlabs/rudder-transformer/commit/711e18bfcec1518830076bbe7e49ba7b2f2e3757)) +* fixing wrong identifiers in payload for twitter ads destination ([#3988](https://github.com/rudderlabs/rudder-transformer/issues/3988)) ([3fdc92b](https://github.com/rudderlabs/rudder-transformer/commit/3fdc92b93869e875c50c482f890283c97611dc4f)) + +### [1.90.2](https://github.com/rudderlabs/rudder-transformer/compare/v1.90.1...v1.90.2) (2025-02-11) + + +### Bug Fixes + +* better error handling in webhook v2 ([9f224ec](https://github.com/rudderlabs/rudder-transformer/commit/9f224ec03b91f1a4d85b117dbf6972bb1ef40c6d)) +* improve error handling for webhook v2 ([f44d5a5](https://github.com/rudderlabs/rudder-transformer/commit/f44d5a56fd6ee183aea73eaba7e73c121f8bc470)) +* improve error handling for webhook v2 ([#4061](https://github.com/rudderlabs/rudder-transformer/issues/4061)) ([5d1e1bd](https://github.com/rudderlabs/rudder-transformer/commit/5d1e1bdb26bacddb3838bd16752b333d7814c294)) +* improve error handling for webhook v2 ([#4062](https://github.com/rudderlabs/rudder-transformer/issues/4062)) ([d795830](https://github.com/rudderlabs/rudder-transformer/commit/d79583087e98d713afb9b38d3a25d4e580a36c76)) + +### [1.90.1](https://github.com/rudderlabs/rudder-transformer/compare/v1.90.0...v1.90.1) (2025-02-06) + + +### Bug Fixes + +* update google ads api version for gaoc ([#4047](https://github.com/rudderlabs/rudder-transformer/issues/4047)) ([62705c0](https://github.com/rudderlabs/rudder-transformer/commit/62705c0613f3c38b8f3e6baf047467ce97878625)) + +## [1.90.0](https://github.com/rudderlabs/rudder-transformer/compare/v1.89.1...v1.90.0) (2025-02-03) + + +### Features + +* **http:** enclose constants with quotes in mappings ([#4037](https://github.com/rudderlabs/rudder-transformer/issues/4037)) ([d62ba40](https://github.com/rudderlabs/rudder-transformer/commit/d62ba40ff26d1f4fc27b54f1546094f384ee7266)) +* **http:** minor bug fixes and enhancements related to XML and FORM formats ([#4022](https://github.com/rudderlabs/rudder-transformer/issues/4022)) ([241250d](https://github.com/rudderlabs/rudder-transformer/commit/241250d10e1d8cb904ec188312e1ec5532379e93)) +* onboarding customerio segment destination ([#4028](https://github.com/rudderlabs/rudder-transformer/issues/4028)) ([16b927a](https://github.com/rudderlabs/rudder-transformer/commit/16b927a97b64d3033e33a047429d0bbd15c7e1fd)) + + +### Bug Fixes + +* add phone e164 format validation for klaviyo ([#4025](https://github.com/rudderlabs/rudder-transformer/issues/4025)) ([ea46afe](https://github.com/rudderlabs/rudder-transformer/commit/ea46afef39bc85727a5258737987e4da1104ac3d)) + +### [1.89.1](https://github.com/rudderlabs/rudder-transformer/compare/v1.89.0...v1.89.1) (2025-01-29) + + +### Bug Fixes + +* extend statuscode check to 502 to retry the request ([#4029](https://github.com/rudderlabs/rudder-transformer/issues/4029)) ([d003676](https://github.com/rudderlabs/rudder-transformer/commit/d00367691400402011d624c5b993d0f152191edd)) + +## [1.89.0](https://github.com/rudderlabs/rudder-transformer/compare/v1.88.3...v1.89.0) (2025-01-27) + + +### Features + +* add DATA WAREHOUSE to integrations object in shopify pixel source ([#3980](https://github.com/rudderlabs/rudder-transformer/issues/3980)) ([3c20393](https://github.com/rudderlabs/rudder-transformer/commit/3c20393a0e4e3ec98d316820d187310bfec1faea)), closes [#3973](https://github.com/rudderlabs/rudder-transformer/issues/3973) [#3957](https://github.com/rudderlabs/rudder-transformer/issues/3957) [#3957](https://github.com/rudderlabs/rudder-transformer/issues/3957) +* add redis support in shopify pixel for id stitching ([#4001](https://github.com/rudderlabs/rudder-transformer/issues/4001)) ([23ad10a](https://github.com/rudderlabs/rudder-transformer/commit/23ad10a4bd470f09a75e9230d8c860b703a5a1f9)), closes [#3957](https://github.com/rudderlabs/rudder-transformer/issues/3957) +* add support for form format ([#4000](https://github.com/rudderlabs/rudder-transformer/issues/4000)) ([1fc15bf](https://github.com/rudderlabs/rudder-transformer/commit/1fc15bfd4b88e0b252c780a278376cea4c594057)) +* **http:** resolves bug fixes raised during testing ([#3991](https://github.com/rudderlabs/rudder-transformer/issues/3991)) ([a86f009](https://github.com/rudderlabs/rudder-transformer/commit/a86f0094cbef9428e7aeda4965b580f29c89f706)) + + +### Bug Fixes + +* add mappings to mp event ([#3997](https://github.com/rudderlabs/rudder-transformer/issues/3997)) ([2eab465](https://github.com/rudderlabs/rudder-transformer/commit/2eab46557743702a834597d0d0267a17e561516d)) +* sonar issues in adobe analytics ([#3999](https://github.com/rudderlabs/rudder-transformer/issues/3999)) ([d74c4ab](https://github.com/rudderlabs/rudder-transformer/commit/d74c4ab7ef582eb83d67c4b295aa5d3845c15166)) +* sonar issues in user transformations static lookup ([#3998](https://github.com/rudderlabs/rudder-transformer/issues/3998)) ([a7d6b8f](https://github.com/rudderlabs/rudder-transformer/commit/a7d6b8fca8681d2eb3bf1751bf7855a7cc220d3b)) +* sonar issues in various components ([#4006](https://github.com/rudderlabs/rudder-transformer/issues/4006)) ([454451d](https://github.com/rudderlabs/rudder-transformer/commit/454451dba3260a3664088e2bb009fd8a11cbf957)) + +### [1.88.3](https://github.com/rudderlabs/rudder-transformer/compare/v1.88.2...v1.88.3) (2025-01-24) + + +### Bug Fixes + +* iterable device token registration api issues ([#4013](https://github.com/rudderlabs/rudder-transformer/issues/4013)) ([a986138](https://github.com/rudderlabs/rudder-transformer/commit/a986138d43d2cabcaa597b70fa7871b383cb1427)) + +### [1.88.2](https://github.com/rudderlabs/rudder-transformer/compare/v1.88.1...v1.88.2) (2025-01-22) + + +### Bug Fixes + +* revert feat added drop traits in track call feature for mixpanel ([#4003](https://github.com/rudderlabs/rudder-transformer/issues/4003)) ([ba2accd](https://github.com/rudderlabs/rudder-transformer/commit/ba2accd14a9d99f2c55a9eab34f65e6e4d989e4a)) + +### [1.88.1](https://github.com/rudderlabs/rudder-transformer/compare/v1.88.0...v1.88.1) (2025-01-21) + +## [1.88.0](https://github.com/rudderlabs/rudder-transformer/compare/v1.87.1...v1.88.0) (2025-01-20) + + +### Features + +* add redis support in shopify pixel for id stitching ([#3957](https://github.com/rudderlabs/rudder-transformer/issues/3957)) ([165e06d](https://github.com/rudderlabs/rudder-transformer/commit/165e06de1ac22cda5c4db0b0b23e6e9972d5fa94)) +* added drop traits in track call feature for mixpanel ([#3986](https://github.com/rudderlabs/rudder-transformer/issues/3986)) ([6ec3d55](https://github.com/rudderlabs/rudder-transformer/commit/6ec3d552b845535965bc6c7b9990161a168b9a4e)) + + +### Bug Fixes + +* add email validation in HS ([#3972](https://github.com/rudderlabs/rudder-transformer/issues/3972)) ([1c45db8](https://github.com/rudderlabs/rudder-transformer/commit/1c45db8e6ec6b9436ef08eaa9dfcc99c8953397b)) +* fixing mismatch of schedule field value in clicksend destination ([#3975](https://github.com/rudderlabs/rudder-transformer/issues/3975)) ([12e8a52](https://github.com/rudderlabs/rudder-transformer/commit/12e8a528148454e2113c9c68b575d25695c1d55a)) +* refactor code and add validation for values ([#3971](https://github.com/rudderlabs/rudder-transformer/issues/3971)) ([fc09080](https://github.com/rudderlabs/rudder-transformer/commit/fc090806235f2599703098c9f3fc83c4bdf7d599)) +* removing device token from if condition in mixpanel destination ([#3982](https://github.com/rudderlabs/rudder-transformer/issues/3982)) ([b0e0b15](https://github.com/rudderlabs/rudder-transformer/commit/b0e0b15ee3cb7aeab0162c91fdcf98fca1e16722)) +* sonar issues in regex expressions ([#3979](https://github.com/rudderlabs/rudder-transformer/issues/3979)) ([0e0944d](https://github.com/rudderlabs/rudder-transformer/commit/0e0944d2372fa53b1a6db56fd382fc42c57e5068)) + +### [1.87.1](https://github.com/rudderlabs/rudder-transformer/compare/v1.87.0...v1.87.1) (2025-01-06) + + +### Bug Fixes + +* added missing eu url in delete flow for amplitude destination ([#3952](https://github.com/rudderlabs/rudder-transformer/issues/3952)) ([ac673fc](https://github.com/rudderlabs/rudder-transformer/commit/ac673fc22094d5567691ceaf13adca15442ea896)) +* adding transformer proxy for iterable ([#3878](https://github.com/rudderlabs/rudder-transformer/issues/3878)) ([c47488d](https://github.com/rudderlabs/rudder-transformer/commit/c47488decf8e79b9a2e0277bd85a8e895ffecc56)), closes [#3918](https://github.com/rudderlabs/rudder-transformer/issues/3918) +* **airship:** resolved minor bugsnag error ([#3942](https://github.com/rudderlabs/rudder-transformer/issues/3942)) ([1d8532e](https://github.com/rudderlabs/rudder-transformer/commit/1d8532e743aad1e27efbe2975551ed174cf6ae6c)) +* property and event name mappings in shopify v2 ([#3941](https://github.com/rudderlabs/rudder-transformer/issues/3941)) ([0dedaa2](https://github.com/rudderlabs/rudder-transformer/commit/0dedaa2983b25ab529a5bc5b34ab70ebbf94fb3e)) +* use correct endpoint for custom events ([#3954](https://github.com/rudderlabs/rudder-transformer/issues/3954)) ([49eb591](https://github.com/rudderlabs/rudder-transformer/commit/49eb59180581b34252b601101ce2450e639c0850)) +* user order ([#3944](https://github.com/rudderlabs/rudder-transformer/issues/3944)) ([43abf9c](https://github.com/rudderlabs/rudder-transformer/commit/43abf9ca193a9d16a9eddc28cc6117beadd76b41)), closes [#3914](https://github.com/rudderlabs/rudder-transformer/issues/3914) + +## [1.87.0](https://github.com/rudderlabs/rudder-transformer/compare/v1.86.0...v1.87.0) (2024-12-13) + + +### Features + +* onboard topsort destination ([#3913](https://github.com/rudderlabs/rudder-transformer/issues/3913)) ([227419f](https://github.com/rudderlabs/rudder-transformer/commit/227419f1ff618f96aafa849862828e2315e4ac55)) + + +### Bug Fixes + +* handling partial error in a batch for reddit destination ([#3935](https://github.com/rudderlabs/rudder-transformer/issues/3935)) ([d40db6c](https://github.com/rudderlabs/rudder-transformer/commit/d40db6c1e7f71c5ab5fc3a3659d1fc51b6d527fa)) + ## [1.86.0](https://github.com/rudderlabs/rudder-transformer/compare/v1.85.1...v1.86.0) (2024-12-09) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f735f4f04b4..6a810cd0df5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ See the project's [README](README.md) for further information about working in t 1. Submit an [issue][issue] describing your proposed change. 2. We will try to respond to your issue promptly. 3. Fork this repo, develop and test your code changes. See the project's [README](README.md) for further information about working in this repository. -4. Submit a pull request against this repo's `main` branch. +4. Submit a pull request against this repo's `develop` branch. - Include instructions on how to test your changes. 5. Your branch may be merged once all configured checks pass, including: - A review from appropriate maintainers @@ -31,11 +31,37 @@ See the project's [README](README.md) for further information about working in t ### Are you developing a new Integration with us? 1. Fork this repo, develop and test your code changes. See the project's [README](README.md) for further information about working in this repository. -2. Submit a pull request against this repo's `main` branch. +2. Submit a pull request against this repo's `develop` branch. - Include instructions on how to test your changes. 3. Your branch may be merged once all configured checks pass, including: - A review from appropriate maintainers +### Test-Driven Development (Recommended) + +1. **Write Component Test Cases First:** + Before developing a new integration (whether for a source or destination), start by writing [component test cases](./test/integrations/). This approach ensures clarity on expected behavior and outcomes. + +2. **Use Skipped Tests for Context:** + Write your test cases with the `skip` option to prevent them from running initially. This allows reviewers to understand the business context and requirements before the actual integration is developed. Once the test cases are approved, proceed with the implementation. + +3. **Skipping Entire Test Files:** + To skip an entire test file, use the following syntax. See this [example](./test/integrations/destinations/examples/processor/data.ts): + ```ts + export const skip = true; + export const data = [...] + ``` + +4. **Skipping Individual Test Cases:** + To skip specific test cases within a file, use this syntax. See this [example](./test/integrations/destinations/examples/router/data.ts): + ```ts + export const data = [ + { + skip: true, + ... + } + ] + ``` + ## Committing We prefer squash or rebase commits so that all changes from a branch are diff --git a/Dockerfile b/Dockerfile index 9fe3c1cdb2c..21bc095bc5d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # syntax=docker/dockerfile:1.4 -FROM node:18.20.1-alpine3.18 AS base +FROM node:20.18.3-alpine3.21 AS base ENV HUSKY 0 RUN apk update @@ -33,7 +33,7 @@ RUN npm run setup:swagger ENTRYPOINT ["/sbin/tini", "--"] HEALTHCHECK --interval=1s --timeout=30s --retries=30 \ -CMD wget --no-verbose --tries=5 --spider http://localhost:9090/health || exit 1 + CMD wget --no-verbose --tries=5 --spider http://localhost:9090/health || exit 1 CMD [ "npm", "start" ] @@ -72,7 +72,7 @@ COPY --chown=node:node --from=development /home/node/app/dist/ ./dist ENTRYPOINT ["/sbin/tini", "--"] HEALTHCHECK --interval=1s --timeout=30s --retries=30 \ -CMD wget --no-verbose --tries=5 --spider http://localhost:9090/health || exit 1 + CMD wget --no-verbose --tries=5 --spider http://localhost:9090/health || exit 1 CMD [ "npm", "start" ] diff --git a/Dockerfile-ut-func b/Dockerfile-ut-func index e6bd28857bb..a331a0c3a64 100644 --- a/Dockerfile-ut-func +++ b/Dockerfile-ut-func @@ -5,7 +5,7 @@ ENV HUSKY 0 RUN apt-get update \ && apt-get install -y curl make g++ \ && apt-get install -y cpio \ - && curl -sL https://deb.nodesource.com/setup_18.x | bash \ + && curl -sL https://deb.nodesource.com/setup_20.x | bash \ && apt-get install -y nodejs \ && rm -rf /var/lib/apt/lists/* \ && rm -rf /var/lib/apt/lists.d/* \ diff --git a/benchmark/index.js b/benchmark/index.js deleted file mode 100644 index 919fa3c6de0..00000000000 --- a/benchmark/index.js +++ /dev/null @@ -1,193 +0,0 @@ -/* eslint-disable import/no-extraneous-dependencies */ -/* eslint-disable func-names */ -/* eslint-disable no-restricted-syntax */ -/* eslint-disable guard-for-in */ -/* eslint-disable no-await-in-loop */ -/* eslint-disable no-use-before-define */ -/* eslint-disable import/no-dynamic-require */ -/* eslint-disable global-require */ -const Benchmark = require('benchmark-suite'); -const fs = require('fs'); -const path = require('path'); -const Commander = require('commander'); -const logger = require('./metaLogger'); -const versionedRouter = require('../src/versionedRouter'); -const cdkV2Handler = require('../src/cdk/v2/handler'); - -const supportedDestinations = ['algolia', 'pinterest_tag']; - -logger.info(); - -const command = new Commander.Command(); -command - .allowUnknownOption() - .option( - '-d, --destinations ', - 'Enter destination names separated by comma', - supportedDestinations.toString(), - ) - .option( - '-bt, --benchmarktype ', - 'Enter the benchmark type (Operations or Memory)', - 'Operations', - ) - .option('-f, --feature ', 'Enter feature name (proc or rt)', 'proc') - .parse(); - -const getTestFileName = (intg, testSufix) => { - const featureSufix = cmdOpts.feature === 'rt' ? '_router' : ''; - return `${intg}${featureSufix}${testSufix}.json`; -}; - -const testDataDir = path.join(__dirname, '../test/__tests__/data'); -const getTestData = (intgList, fileNameSuffixes) => { - const intgTestData = {}; - intgList.forEach((intg) => { - // Use the last valid test data file - fileNameSuffixes.forEach((fileNameSuffix) => { - try { - intgTestData[intg] = JSON.parse( - fs.readFileSync(path.join(testDataDir, getTestFileName(intg, fileNameSuffix)), { - encoding: 'utf-8', - }), - ); - } catch (err) { - // logger.error( - // `Unable to load the data for: "${intg}" suffix: "${fileNameSuffix}"` - // ); - // logger.error(`Raw error: "${err}"`); - } - }); - }); - return intgTestData; -}; - -const cmdOpts = command.opts(); - -// Initialize data for destinations -const destinationsList = cmdOpts.destinations - .split(',') - .map((x) => x.trim()) - .filter((x) => x !== ''); -logger.info('Destinations:', destinationsList, 'feature:', cmdOpts.feature); -logger.info(); -const destDataset = getTestData(destinationsList, ['_input', '']); - -const nativeDestHandlers = {}; -const destCdKWorkflowEngines = {}; - -const benchmarkType = cmdOpts.benchmarktype.trim(); - -const getNativeHandleName = () => { - let handleName = 'process'; - if (cmdOpts.feature === 'rt') { - handleName = 'processRouterDest'; - } - return handleName; -}; - -async function initializeHandlers() { - for (const idx in destinationsList) { - const dest = destinationsList[idx]; - - // Native destination handler - nativeDestHandlers[dest] = versionedRouter.getDestHandler('v0', dest)[getNativeHandleName()]; - - // Get the CDK 2.0 workflow engine instance - destCdKWorkflowEngines[dest] = await cdkV2Handler.getWorkflowEngine(dest, cmdOpts.feature); - } -} - -async function runDataset(suitDesc, input, intg, params) { - logger.info('=========================================='); - logger.info(suitDesc); - logger.info('=========================================='); - - const results = {}; - const suite = new Benchmark(suitDesc, benchmarkType); - - Object.keys(params).forEach((opName) => { - const handler = params[opName].handlerResolver(intg); - const args = params[opName].argsResolver(intg, input); - suite.add(opName, async () => { - try { - await handler(...args); - } catch (err) { - // logger.info(err); - // Do nothing - } - }); - }); - - suite - .on('cycle', (result) => { - results[result.end.name] = { stats: result.end.stats }; - }) - .on('complete', (result) => { - logger.info( - benchmarkType === 'Operations' ? 'Fastest: ' : 'Memory intensive: ', - `"${result.end.name}"`, - ); - logger.info(); - Object.keys(results).forEach((impl) => { - logger.info(`"${impl}" - `, suite.formatStats(results[impl].stats)); - - if (result.end.name !== impl) { - if (benchmarkType === 'Operations') { - logger.info( - `-> "${result.end.name}" is faster by ${( - results[impl].stats.mean / result.end.stats.mean - ).toFixed(1)} times to "${impl}"`, - ); - } else { - logger.info( - `-> "${result.end.name}" consumed ${( - result.end.stats.mean / results[impl].stats.mean - ).toFixed(1)} times memory compared to "${impl}"`, - ); - } - } - - logger.info(); - }); - }); - - await suite.run({ time: 1000 }); -} - -async function runIntgDataset(dataset, type, params) { - for (const intg in dataset) { - for (const tc in dataset[intg]) { - const curTcData = dataset[intg][tc]; - let tcInput = curTcData; - let tcDesc = `${type} - ${intg} - ${cmdOpts.feature} - ${tc}`; - // New test data file structure - if ('description' in curTcData && 'input' in curTcData && 'output' in curTcData) { - tcInput = curTcData.input; - tcDesc += ` - "${curTcData.description}"`; - } - - await runDataset(tcDesc, tcInput, intg, params); - } - } -} - -async function run() { - // Initialize CDK and native handlers - await initializeHandlers(); - - // Destinations - await runIntgDataset(destDataset, 'Destination', { - native: { - handlerResolver: (intg) => nativeDestHandlers[intg], - argsResolver: (_intg, input) => [input], - }, - 'CDK 2.0': { - handlerResolver: () => cdkV2Handler.process, - argsResolver: (intg, input) => [destCdKWorkflowEngines[intg], input], - }, - }); -} - -// Start suites -run(); diff --git a/benchmark/metaLogger.js b/benchmark/metaLogger.js deleted file mode 100644 index b89ad71066d..00000000000 --- a/benchmark/metaLogger.js +++ /dev/null @@ -1,36 +0,0 @@ -/* istanbul ignore file */ - -const logger = require('../src/logger'); - -logger.setLogLevel('random'); - -const debug = (...args) => { - logger.setLogLevel('debug'); - logger.debug(...args); - logger.setLogLevel('random'); -}; - -const info = (...args) => { - logger.setLogLevel('info'); - logger.info(...args); - logger.setLogLevel('random'); -}; - -const warn = (...args) => { - logger.setLogLevel('warn'); - logger.warn(...args); - logger.setLogLevel('random'); -}; - -const error = (...args) => { - logger.setLogLevel('error'); - logger.error(...args); - logger.setLogLevel('random'); -}; - -module.exports = { - debug, - info, - warn, - error, -}; diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 00000000000..b38aa639f21 --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,11443 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 00000000000..8c2384a0113 --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,180 @@ +{"D:\\WIP\\rudder-transformer\\routerUtils.js": {"path":"D:\\WIP\\rudder-transformer\\routerUtils.js","statementMap":{"0":{"start":{"line":3,"column":15},"end":{"line":3,"column":34}},"1":{"start":{"line":4,"column":25},"end":{"line":4,"column":54}},"2":{"start":{"line":5,"column":33},"end":{"line":5,"column":73}},"3":{"start":{"line":7,"column":26},"end":{"line":7,"column":28}},"4":{"start":{"line":8,"column":25},"end":{"line":13,"column":1}},"5":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"6":{"start":{"line":10,"column":4},"end":{"line":10,"column":75}},"7":{"start":{"line":12,"column":2},"end":{"line":12,"column":35}},"8":{"start":{"line":15,"column":29},"end":{"line":20,"column":1}},"9":{"start":{"line":16,"column":2},"end":{"line":18,"column":3}},"10":{"start":{"line":17,"column":4},"end":{"line":17,"column":68}},"11":{"start":{"line":19,"column":2},"end":{"line":19,"column":47}},"12":{"start":{"line":24,"column":2},"end":{"line":24,"column":63}},"13":{"start":{"line":25,"column":15},"end":{"line":25,"column":42}},"14":{"start":{"line":27,"column":2},"end":{"line":35,"column":3}},"15":{"start":{"line":28,"column":25},"end":{"line":28,"column":29}},"16":{"start":{"line":29,"column":4},"end":{"line":33,"column":6}},"17":{"start":{"line":34,"column":4},"end":{"line":34,"column":26}},"18":{"start":{"line":37,"column":30},"end":{"line":37,"column":34}},"19":{"start":{"line":39,"column":2},"end":{"line":54,"column":3}},"20":{"start":{"line":40,"column":23},"end":{"line":40,"column":55}},"21":{"start":{"line":41,"column":4},"end":{"line":46,"column":6}},"22":{"start":{"line":48,"column":4},"end":{"line":53,"column":6}},"23":{"start":{"line":55,"column":2},"end":{"line":55,"column":24}},"24":{"start":{"line":58,"column":0},"end":{"line":61,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":25},"end":{"line":8,"column":26}},"loc":{"start":{"line":8,"column":31},"end":{"line":13,"column":1}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":29},"end":{"line":15,"column":30}},"loc":{"start":{"line":15,"column":35},"end":{"line":20,"column":1}},"line":15},"2":{"name":"sendToDestination","decl":{"start":{"line":22,"column":15},"end":{"line":22,"column":32}},"loc":{"start":{"line":22,"column":55},"end":{"line":56,"column":1}},"line":22}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},{"start":{"line":9,"column":2},"end":{"line":11,"column":3}}],"line":9},"1":{"loc":{"start":{"line":10,"column":26},"end":{"line":10,"column":74}},"type":"cond-expr","locations":[{"start":{"line":10,"column":69},"end":{"line":10,"column":70}},{"start":{"line":10,"column":73},"end":{"line":10,"column":74}}],"line":10},"2":{"loc":{"start":{"line":16,"column":2},"end":{"line":18,"column":3}},"type":"if","locations":[{"start":{"line":16,"column":2},"end":{"line":18,"column":3}},{"start":{"line":16,"column":2},"end":{"line":18,"column":3}}],"line":16},"3":{"loc":{"start":{"line":27,"column":2},"end":{"line":35,"column":3}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":35,"column":3}},{"start":{"line":27,"column":2},"end":{"line":35,"column":3}}],"line":27},"4":{"loc":{"start":{"line":39,"column":2},"end":{"line":54,"column":3}},"type":"if","locations":[{"start":{"line":39,"column":2},"end":{"line":54,"column":3}},{"start":{"line":39,"column":2},"end":{"line":54,"column":3}}],"line":39},"5":{"loc":{"start":{"line":39,"column":6},"end":{"line":39,"column":35}},"type":"binary-expr","locations":[{"start":{"line":39,"column":6},"end":{"line":39,"column":21}},{"start":{"line":39,"column":25},"end":{"line":39,"column":35}}],"line":39},"6":{"loc":{"start":{"line":52,"column":8},"end":{"line":52,"column":73}},"type":"binary-expr","locations":[{"start":{"line":52,"column":8},"end":{"line":52,"column":27}},{"start":{"line":52,"column":31},"end":{"line":52,"column":73}}],"line":52}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":1},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4f1c649f97213a1d7cba39d2c510e7a2947ae94e"} +,"D:\\WIP\\rudder-transformer\\testRouter.js": {"path":"D:\\WIP\\rudder-transformer\\testRouter.js","statementMap":{"0":{"start":{"line":5,"column":11},"end":{"line":5,"column":24}},"1":{"start":{"line":6,"column":13},"end":{"line":6,"column":28}},"2":{"start":{"line":7,"column":15},"end":{"line":7,"column":36}},"3":{"start":{"line":8,"column":52},"end":{"line":8,"column":76}},"4":{"start":{"line":10,"column":16},"end":{"line":10,"column":20}},"5":{"start":{"line":11,"column":20},"end":{"line":11,"column":23}},"6":{"start":{"line":13,"column":31},"end":{"line":30,"column":1}},"7":{"start":{"line":14,"column":18},"end":{"line":14,"column":23}},"8":{"start":{"line":15,"column":34},"end":{"line":19,"column":3}},"9":{"start":{"line":20,"column":2},"end":{"line":28,"column":3}},"10":{"start":{"line":21,"column":4},"end":{"line":27,"column":7}},"11":{"start":{"line":22,"column":6},"end":{"line":25,"column":7}},"12":{"start":{"line":23,"column":8},"end":{"line":23,"column":25}},"13":{"start":{"line":24,"column":8},"end":{"line":24,"column":20}},"14":{"start":{"line":26,"column":6},"end":{"line":26,"column":19}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":19}},"16":{"start":{"line":32,"column":19},"end":{"line":32,"column":57}},"17":{"start":{"line":34,"column":23},"end":{"line":36,"column":1}},"18":{"start":{"line":35,"column":2},"end":{"line":35,"column":71}},"19":{"start":{"line":38,"column":24},"end":{"line":40,"column":1}},"20":{"start":{"line":39,"column":2},"end":{"line":39,"column":74}},"21":{"start":{"line":42,"column":29},"end":{"line":60,"column":1}},"22":{"start":{"line":44,"column":4},"end":{"line":46,"column":47}},"23":{"start":{"line":48,"column":25},"end":{"line":48,"column":27}},"24":{"start":{"line":49,"column":36},"end":{"line":49,"column":40}},"25":{"start":{"line":50,"column":2},"end":{"line":52,"column":5}},"26":{"start":{"line":51,"column":4},"end":{"line":51,"column":48}},"27":{"start":{"line":54,"column":18},"end":{"line":54,"column":20}},"28":{"start":{"line":55,"column":2},"end":{"line":57,"column":5}},"29":{"start":{"line":56,"column":4},"end":{"line":56,"column":58}},"30":{"start":{"line":58,"column":2},"end":{"line":58,"column":49}},"31":{"start":{"line":59,"column":2},"end":{"line":59,"column":24}},"32":{"start":{"line":62,"column":24},"end":{"line":208,"column":1}},"33":{"start":{"line":63,"column":2},"end":{"line":207,"column":3}},"34":{"start":{"line":64,"column":23},"end":{"line":64,"column":39}},"35":{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},"36":{"start":{"line":66,"column":6},"end":{"line":66,"column":61}},"37":{"start":{"line":68,"column":21},"end":{"line":68,"column":23}},"38":{"start":{"line":69,"column":4},"end":{"line":69,"column":39}},"39":{"start":{"line":70,"column":4},"end":{"line":199,"column":6}},"40":{"start":{"line":72,"column":59},"end":{"line":72,"column":64}},"41":{"start":{"line":73,"column":19},"end":{"line":77,"column":9}},"42":{"start":{"line":79,"column":23},"end":{"line":79,"column":25}},"43":{"start":{"line":80,"column":25},"end":{"line":80,"column":30}},"44":{"start":{"line":82,"column":8},"end":{"line":121,"column":9}},"45":{"start":{"line":83,"column":36},"end":{"line":83,"column":38}},"46":{"start":{"line":84,"column":10},"end":{"line":88,"column":11}},"47":{"start":{"line":85,"column":12},"end":{"line":87,"column":14}},"48":{"start":{"line":86,"column":25},"end":{"line":86,"column":42}},"49":{"start":{"line":90,"column":12},"end":{"line":93,"column":55}},"50":{"start":{"line":95,"column":10},"end":{"line":120,"column":11}},"51":{"start":{"line":96,"column":12},"end":{"line":115,"column":13}},"52":{"start":{"line":97,"column":44},"end":{"line":101,"column":15}},"53":{"start":{"line":102,"column":43},"end":{"line":102,"column":67}},"54":{"start":{"line":103,"column":14},"end":{"line":105,"column":15}},"55":{"start":{"line":104,"column":16},"end":{"line":104,"column":60}},"56":{"start":{"line":107,"column":14},"end":{"line":108,"column":54}},"57":{"start":{"line":109,"column":14},"end":{"line":109,"column":65}},"58":{"start":{"line":111,"column":14},"end":{"line":111,"column":32}},"59":{"start":{"line":112,"column":14},"end":{"line":114,"column":16}},"60":{"start":{"line":117,"column":12},"end":{"line":119,"column":14}},"61":{"start":{"line":123,"column":8},"end":{"line":144,"column":9}},"62":{"start":{"line":124,"column":10},"end":{"line":143,"column":11}},"63":{"start":{"line":125,"column":12},"end":{"line":138,"column":13}},"64":{"start":{"line":126,"column":34},"end":{"line":126,"column":63}},"65":{"start":{"line":127,"column":40},"end":{"line":127,"column":69}},"66":{"start":{"line":128,"column":14},"end":{"line":132,"column":15}},"67":{"start":{"line":129,"column":16},"end":{"line":129,"column":70}},"68":{"start":{"line":131,"column":16},"end":{"line":131,"column":72}},"69":{"start":{"line":134,"column":14},"end":{"line":134,"column":32}},"70":{"start":{"line":135,"column":14},"end":{"line":137,"column":16}},"71":{"start":{"line":140,"column":12},"end":{"line":142,"column":14}},"72":{"start":{"line":146,"column":8},"end":{"line":196,"column":9}},"73":{"start":{"line":148,"column":10},"end":{"line":195,"column":11}},"74":{"start":{"line":149,"column":34},"end":{"line":149,"column":36}},"75":{"start":{"line":150,"column":41},"end":{"line":150,"column":43}},"76":{"start":{"line":152,"column":40},"end":{"line":152,"column":73}},"77":{"start":{"line":154,"column":12},"end":{"line":185,"column":13}},"78":{"start":{"line":156,"column":37},"end":{"line":156,"column":75}},"79":{"start":{"line":158,"column":32},"end":{"line":158,"column":34}},"80":{"start":{"line":159,"column":29},"end":{"line":159,"column":31}},"81":{"start":{"line":160,"column":14},"end":{"line":167,"column":15}},"82":{"start":{"line":161,"column":16},"end":{"line":161,"column":69}},"83":{"start":{"line":162,"column":16},"end":{"line":164,"column":17}},"84":{"start":{"line":163,"column":18},"end":{"line":163,"column":53}},"85":{"start":{"line":165,"column":21},"end":{"line":167,"column":15}},"86":{"start":{"line":166,"column":16},"end":{"line":166,"column":51}},"87":{"start":{"line":169,"column":14},"end":{"line":169,"column":43}},"88":{"start":{"line":170,"column":14},"end":{"line":170,"column":63}},"89":{"start":{"line":186,"column":12},"end":{"line":190,"column":14}},"90":{"start":{"line":192,"column":12},"end":{"line":194,"column":14}},"91":{"start":{"line":197,"column":8},"end":{"line":197,"column":32}},"92":{"start":{"line":200,"column":4},"end":{"line":200,"column":24}},"93":{"start":{"line":203,"column":4},"end":{"line":205,"column":6}},"94":{"start":{"line":206,"column":4},"end":{"line":206,"column":21}},"95":{"start":{"line":210,"column":0},"end":{"line":215,"column":3}},"96":{"start":{"line":211,"column":2},"end":{"line":214,"column":5}},"97":{"start":{"line":212,"column":4},"end":{"line":212,"column":44}},"98":{"start":{"line":213,"column":4},"end":{"line":213,"column":15}},"99":{"start":{"line":217,"column":0},"end":{"line":219,"column":3}},"100":{"start":{"line":218,"column":2},"end":{"line":218,"column":18}},"101":{"start":{"line":221,"column":0},"end":{"line":221,"column":49}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":13,"column":31},"end":{"line":13,"column":32}},"loc":{"start":{"line":13,"column":46},"end":{"line":30,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":33},"end":{"line":21,"column":34}},"loc":{"start":{"line":21,"column":41},"end":{"line":27,"column":5}},"line":21},"2":{"name":"(anonymous_2)","decl":{"start":{"line":34,"column":23},"end":{"line":34,"column":24}},"loc":{"start":{"line":34,"column":49},"end":{"line":36,"column":1}},"line":34},"3":{"name":"(anonymous_3)","decl":{"start":{"line":38,"column":24},"end":{"line":38,"column":25}},"loc":{"start":{"line":38,"column":30},"end":{"line":40,"column":1}},"line":38},"4":{"name":"(anonymous_4)","decl":{"start":{"line":42,"column":29},"end":{"line":42,"column":30}},"loc":{"start":{"line":42,"column":37},"end":{"line":60,"column":1}},"line":42},"5":{"name":"capitalize","decl":{"start":{"line":43,"column":11},"end":{"line":43,"column":21}},"loc":{"start":{"line":43,"column":25},"end":{"line":47,"column":3}},"line":43},"6":{"name":"(anonymous_6)","decl":{"start":{"line":50,"column":28},"end":{"line":50,"column":29}},"loc":{"start":{"line":50,"column":35},"end":{"line":52,"column":3}},"line":50},"7":{"name":"(anonymous_7)","decl":{"start":{"line":55,"column":45},"end":{"line":55,"column":46}},"loc":{"start":{"line":55,"column":52},"end":{"line":57,"column":3}},"line":55},"8":{"name":"(anonymous_8)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":45},"end":{"line":208,"column":1}},"line":62},"9":{"name":"(anonymous_9)","decl":{"start":{"line":71,"column":17},"end":{"line":71,"column":18}},"loc":{"start":{"line":71,"column":32},"end":{"line":198,"column":7}},"line":71},"10":{"name":"(anonymous_10)","decl":{"start":{"line":86,"column":14},"end":{"line":86,"column":15}},"loc":{"start":{"line":86,"column":25},"end":{"line":86,"column":42}},"line":86},"11":{"name":"(anonymous_11)","decl":{"start":{"line":210,"column":26},"end":{"line":210,"column":27}},"loc":{"start":{"line":210,"column":47},"end":{"line":215,"column":1}},"line":210},"12":{"name":"(anonymous_12)","decl":{"start":{"line":211,"column":48},"end":{"line":211,"column":49}},"loc":{"start":{"line":211,"column":61},"end":{"line":214,"column":3}},"line":211},"13":{"name":"(anonymous_13)","decl":{"start":{"line":217,"column":37},"end":{"line":217,"column":38}},"loc":{"start":{"line":217,"column":44},"end":{"line":219,"column":1}},"line":217}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":2},"end":{"line":28,"column":3}},"type":"if","locations":[{"start":{"line":20,"column":2},"end":{"line":28,"column":3}},{"start":{"line":20,"column":2},"end":{"line":28,"column":3}}],"line":20},"1":{"loc":{"start":{"line":22,"column":6},"end":{"line":25,"column":7}},"type":"if","locations":[{"start":{"line":22,"column":6},"end":{"line":25,"column":7}},{"start":{"line":22,"column":6},"end":{"line":25,"column":7}}],"line":22},"2":{"loc":{"start":{"line":44,"column":11},"end":{"line":46,"column":46}},"type":"cond-expr","locations":[{"start":{"line":45,"column":8},"end":{"line":45,"column":23}},{"start":{"line":46,"column":8},"end":{"line":46,"column":46}}],"line":44},"3":{"loc":{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},"type":"if","locations":[{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},{"start":{"line":65,"column":4},"end":{"line":67,"column":5}}],"line":65},"4":{"loc":{"start":{"line":65,"column":8},"end":{"line":65,"column":41}},"type":"binary-expr","locations":[{"start":{"line":65,"column":8},"end":{"line":65,"column":15}},{"start":{"line":65,"column":19},"end":{"line":65,"column":41}}],"line":65},"5":{"loc":{"start":{"line":82,"column":8},"end":{"line":121,"column":9}},"type":"if","locations":[{"start":{"line":82,"column":8},"end":{"line":121,"column":9}},{"start":{"line":82,"column":8},"end":{"line":121,"column":9}}],"line":82},"6":{"loc":{"start":{"line":84,"column":10},"end":{"line":88,"column":11}},"type":"if","locations":[{"start":{"line":84,"column":10},"end":{"line":88,"column":11}},{"start":{"line":84,"column":10},"end":{"line":88,"column":11}}],"line":84},"7":{"loc":{"start":{"line":90,"column":12},"end":{"line":93,"column":55}},"type":"binary-expr","locations":[{"start":{"line":90,"column":12},"end":{"line":90,"column":26}},{"start":{"line":91,"column":12},"end":{"line":91,"column":42}},{"start":{"line":92,"column":12},"end":{"line":92,"column":45}},{"start":{"line":93,"column":12},"end":{"line":93,"column":55}}],"line":90},"8":{"loc":{"start":{"line":95,"column":10},"end":{"line":120,"column":11}},"type":"if","locations":[{"start":{"line":95,"column":10},"end":{"line":120,"column":11}},{"start":{"line":95,"column":10},"end":{"line":120,"column":11}}],"line":95},"9":{"loc":{"start":{"line":103,"column":14},"end":{"line":105,"column":15}},"type":"if","locations":[{"start":{"line":103,"column":14},"end":{"line":105,"column":15}},{"start":{"line":103,"column":14},"end":{"line":105,"column":15}}],"line":103},"10":{"loc":{"start":{"line":113,"column":23},"end":{"line":113,"column":57}},"type":"binary-expr","locations":[{"start":{"line":113,"column":23},"end":{"line":113,"column":34}},{"start":{"line":113,"column":38},"end":{"line":113,"column":57}}],"line":113},"11":{"loc":{"start":{"line":123,"column":8},"end":{"line":144,"column":9}},"type":"if","locations":[{"start":{"line":123,"column":8},"end":{"line":144,"column":9}},{"start":{"line":123,"column":8},"end":{"line":144,"column":9}}],"line":123},"12":{"loc":{"start":{"line":124,"column":10},"end":{"line":143,"column":11}},"type":"if","locations":[{"start":{"line":124,"column":10},"end":{"line":143,"column":11}},{"start":{"line":124,"column":10},"end":{"line":143,"column":11}}],"line":124},"13":{"loc":{"start":{"line":128,"column":14},"end":{"line":132,"column":15}},"type":"if","locations":[{"start":{"line":128,"column":14},"end":{"line":132,"column":15}},{"start":{"line":128,"column":14},"end":{"line":132,"column":15}}],"line":128},"14":{"loc":{"start":{"line":136,"column":23},"end":{"line":136,"column":57}},"type":"binary-expr","locations":[{"start":{"line":136,"column":23},"end":{"line":136,"column":34}},{"start":{"line":136,"column":38},"end":{"line":136,"column":57}}],"line":136},"15":{"loc":{"start":{"line":146,"column":8},"end":{"line":196,"column":9}},"type":"if","locations":[{"start":{"line":146,"column":8},"end":{"line":196,"column":9}},{"start":{"line":146,"column":8},"end":{"line":196,"column":9}}],"line":146},"16":{"loc":{"start":{"line":146,"column":12},"end":{"line":146,"column":61}},"type":"binary-expr","locations":[{"start":{"line":146,"column":12},"end":{"line":146,"column":32}},{"start":{"line":146,"column":36},"end":{"line":146,"column":61}}],"line":146},"17":{"loc":{"start":{"line":148,"column":10},"end":{"line":195,"column":11}},"type":"if","locations":[{"start":{"line":148,"column":10},"end":{"line":195,"column":11}},{"start":{"line":148,"column":10},"end":{"line":195,"column":11}}],"line":148},"18":{"loc":{"start":{"line":160,"column":14},"end":{"line":167,"column":15}},"type":"if","locations":[{"start":{"line":160,"column":14},"end":{"line":167,"column":15}},{"start":{"line":160,"column":14},"end":{"line":167,"column":15}}],"line":160},"19":{"loc":{"start":{"line":162,"column":16},"end":{"line":164,"column":17}},"type":"if","locations":[{"start":{"line":162,"column":16},"end":{"line":164,"column":17}},{"start":{"line":162,"column":16},"end":{"line":164,"column":17}}],"line":162},"20":{"loc":{"start":{"line":165,"column":21},"end":{"line":167,"column":15}},"type":"if","locations":[{"start":{"line":165,"column":21},"end":{"line":167,"column":15}},{"start":{"line":165,"column":21},"end":{"line":167,"column":15}}],"line":165},"21":{"loc":{"start":{"line":204,"column":13},"end":{"line":204,"column":47}},"type":"binary-expr","locations":[{"start":{"line":204,"column":13},"end":{"line":204,"column":24}},{"start":{"line":204,"column":28},"end":{"line":204,"column":47}}],"line":204}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":1,"17":1,"18":2,"19":1,"20":1,"21":1,"22":40,"23":2,"24":2,"25":2,"26":22,"27":2,"28":2,"29":18,"30":2,"31":2,"32":1,"33":3,"34":3,"35":3,"36":1,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":2,"44":2,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":2,"62":2,"63":2,"64":2,"65":2,"66":2,"67":1,"68":1,"69":0,"70":0,"71":0,"72":2,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":2,"92":2,"93":1,"94":1,"95":1,"96":91,"97":0,"98":0,"99":1,"100":0,"101":1},"f":{"0":0,"1":0,"2":2,"3":1,"4":2,"5":40,"6":22,"7":18,"8":3,"9":2,"10":0,"11":91,"12":0,"13":0},"b":{"0":[0,0],"1":[0,0],"2":[4,36],"3":[1,2],"4":[3,2],"5":[0,2],"6":[0,0],"7":[0,0,0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[2,0],"12":[2,0],"13":[1,1],"14":[0,0],"15":[0,2],"16":[2,2],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f076a2f609e903c36c6280c6d90075803d2e2121"} +,"D:\\WIP\\rudder-transformer\\adapters\\network.js": {"path":"D:\\WIP\\rudder-transformer\\adapters\\network.js","statementMap":{"0":{"start":{"line":4,"column":10},"end":{"line":4,"column":27}},"1":{"start":{"line":5,"column":13},"end":{"line":5,"column":28}},"2":{"start":{"line":6,"column":14},"end":{"line":6,"column":30}},"3":{"start":{"line":7,"column":14},"end":{"line":7,"column":30}},"4":{"start":{"line":8,"column":12},"end":{"line":8,"column":32}},"5":{"start":{"line":11,"column":2},"end":{"line":11,"column":59}},"6":{"start":{"line":12,"column":24},"end":{"line":12,"column":78}},"7":{"start":{"line":14,"column":29},"end":{"line":41,"column":1}},"8":{"start":{"line":48,"column":17},"end":{"line":64,"column":1}},"9":{"start":{"line":51,"column":25},"end":{"line":56,"column":3}},"10":{"start":{"line":57,"column":2},"end":{"line":62,"column":3}},"11":{"start":{"line":58,"column":21},"end":{"line":58,"column":48}},"12":{"start":{"line":59,"column":4},"end":{"line":59,"column":49}},"13":{"start":{"line":61,"column":4},"end":{"line":61,"column":55}},"14":{"start":{"line":63,"column":2},"end":{"line":63,"column":24}},"15":{"start":{"line":74,"column":16},"end":{"line":83,"column":1}},"16":{"start":{"line":76,"column":2},"end":{"line":81,"column":3}},"17":{"start":{"line":77,"column":21},"end":{"line":77,"column":50}},"18":{"start":{"line":78,"column":4},"end":{"line":78,"column":49}},"19":{"start":{"line":80,"column":4},"end":{"line":80,"column":55}},"20":{"start":{"line":82,"column":2},"end":{"line":82,"column":24}},"21":{"start":{"line":93,"column":19},"end":{"line":102,"column":1}},"22":{"start":{"line":95,"column":2},"end":{"line":100,"column":3}},"23":{"start":{"line":96,"column":21},"end":{"line":96,"column":53}},"24":{"start":{"line":97,"column":4},"end":{"line":97,"column":49}},"25":{"start":{"line":99,"column":4},"end":{"line":99,"column":55}},"26":{"start":{"line":101,"column":2},"end":{"line":101,"column":24}},"27":{"start":{"line":113,"column":17},"end":{"line":122,"column":1}},"28":{"start":{"line":115,"column":2},"end":{"line":120,"column":3}},"29":{"start":{"line":116,"column":21},"end":{"line":116,"column":57}},"30":{"start":{"line":117,"column":4},"end":{"line":117,"column":49}},"31":{"start":{"line":119,"column":4},"end":{"line":119,"column":55}},"32":{"start":{"line":121,"column":2},"end":{"line":121,"column":24}},"33":{"start":{"line":133,"column":16},"end":{"line":142,"column":1}},"34":{"start":{"line":135,"column":2},"end":{"line":140,"column":3}},"35":{"start":{"line":136,"column":21},"end":{"line":136,"column":56}},"36":{"start":{"line":137,"column":4},"end":{"line":137,"column":49}},"37":{"start":{"line":139,"column":4},"end":{"line":139,"column":55}},"38":{"start":{"line":141,"column":2},"end":{"line":141,"column":24}},"39":{"start":{"line":153,"column":18},"end":{"line":162,"column":1}},"40":{"start":{"line":155,"column":2},"end":{"line":160,"column":3}},"41":{"start":{"line":156,"column":21},"end":{"line":156,"column":58}},"42":{"start":{"line":157,"column":4},"end":{"line":157,"column":49}},"43":{"start":{"line":159,"column":4},"end":{"line":159,"column":55}},"44":{"start":{"line":161,"column":2},"end":{"line":161,"column":24}},"45":{"start":{"line":170,"column":21},"end":{"line":221,"column":1}},"46":{"start":{"line":171,"column":45},"end":{"line":171,"column":52}},"47":{"start":{"line":172,"column":20},"end":{"line":172,"column":27}},"48":{"start":{"line":176,"column":2},"end":{"line":181,"column":3}},"49":{"start":{"line":177,"column":4},"end":{"line":180,"column":5}},"50":{"start":{"line":178,"column":6},"end":{"line":178,"column":22}},"51":{"start":{"line":179,"column":6},"end":{"line":179,"column":26}},"52":{"start":{"line":183,"column":2},"end":{"line":211,"column":3}},"53":{"start":{"line":185,"column":6},"end":{"line":185,"column":27}},"54":{"start":{"line":187,"column":6},"end":{"line":187,"column":12}},"55":{"start":{"line":189,"column":6},"end":{"line":189,"column":21}},"56":{"start":{"line":190,"column":6},"end":{"line":190,"column":67}},"57":{"start":{"line":191,"column":6},"end":{"line":191,"column":12}},"58":{"start":{"line":193,"column":6},"end":{"line":193,"column":26}},"59":{"start":{"line":194,"column":6},"end":{"line":194,"column":66}},"60":{"start":{"line":195,"column":6},"end":{"line":195,"column":12}},"61":{"start":{"line":197,"column":6},"end":{"line":197,"column":35}},"62":{"start":{"line":198,"column":6},"end":{"line":200,"column":9}},"63":{"start":{"line":199,"column":8},"end":{"line":199,"column":49}},"64":{"start":{"line":201,"column":6},"end":{"line":204,"column":8}},"65":{"start":{"line":205,"column":6},"end":{"line":205,"column":12}},"66":{"start":{"line":208,"column":6},"end":{"line":208,"column":12}},"67":{"start":{"line":210,"column":6},"end":{"line":210,"column":62}},"68":{"start":{"line":212,"column":25},"end":{"line":218,"column":3}},"69":{"start":{"line":219,"column":19},"end":{"line":219,"column":49}},"70":{"start":{"line":220,"column":2},"end":{"line":220,"column":18}},"71":{"start":{"line":222,"column":0},"end":{"line":230,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":48,"column":17},"end":{"line":48,"column":18}},"loc":{"start":{"line":48,"column":34},"end":{"line":64,"column":1}},"line":48},"1":{"name":"(anonymous_1)","decl":{"start":{"line":74,"column":16},"end":{"line":74,"column":17}},"loc":{"start":{"line":74,"column":40},"end":{"line":83,"column":1}},"line":74},"2":{"name":"(anonymous_2)","decl":{"start":{"line":93,"column":19},"end":{"line":93,"column":20}},"loc":{"start":{"line":93,"column":43},"end":{"line":102,"column":1}},"line":93},"3":{"name":"(anonymous_3)","decl":{"start":{"line":113,"column":17},"end":{"line":113,"column":18}},"loc":{"start":{"line":113,"column":47},"end":{"line":122,"column":1}},"line":113},"4":{"name":"(anonymous_4)","decl":{"start":{"line":133,"column":16},"end":{"line":133,"column":17}},"loc":{"start":{"line":133,"column":46},"end":{"line":142,"column":1}},"line":133},"5":{"name":"(anonymous_5)","decl":{"start":{"line":153,"column":18},"end":{"line":153,"column":19}},"loc":{"start":{"line":153,"column":48},"end":{"line":162,"column":1}},"line":153},"6":{"name":"(anonymous_6)","decl":{"start":{"line":170,"column":21},"end":{"line":170,"column":22}},"loc":{"start":{"line":170,"column":38},"end":{"line":221,"column":1}},"line":170},"7":{"name":"(anonymous_7)","decl":{"start":{"line":198,"column":35},"end":{"line":198,"column":36}},"loc":{"start":{"line":198,"column":42},"end":{"line":200,"column":7}},"line":198}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":59}},"type":"binary-expr","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":46}},{"start":{"line":11,"column":50},"end":{"line":11,"column":59}}],"line":11},"1":{"loc":{"start":{"line":12,"column":24},"end":{"line":12,"column":78}},"type":"binary-expr","locations":[{"start":{"line":12,"column":24},"end":{"line":12,"column":65}},{"start":{"line":12,"column":69},"end":{"line":12,"column":78}}],"line":12},"2":{"loc":{"start":{"line":177,"column":4},"end":{"line":180,"column":5}},"type":"if","locations":[{"start":{"line":177,"column":4},"end":{"line":180,"column":5}},{"start":{"line":177,"column":4},"end":{"line":180,"column":5}}],"line":177},"3":{"loc":{"start":{"line":183,"column":2},"end":{"line":211,"column":3}},"type":"switch","locations":[{"start":{"line":184,"column":4},"end":{"line":187,"column":12}},{"start":{"line":188,"column":4},"end":{"line":191,"column":12}},{"start":{"line":192,"column":4},"end":{"line":195,"column":12}},{"start":{"line":196,"column":4},"end":{"line":205,"column":12}},{"start":{"line":206,"column":4},"end":{"line":208,"column":12}},{"start":{"line":209,"column":4},"end":{"line":210,"column":62}}],"line":183}},"s":{"0":7,"1":7,"2":7,"3":7,"4":7,"5":7,"6":7,"7":7,"8":7,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":7,"16":27,"17":27,"18":22,"19":5,"20":27,"21":7,"22":0,"23":0,"24":0,"25":0,"26":0,"27":7,"28":26,"29":26,"30":26,"31":0,"32":26,"33":7,"34":0,"35":0,"36":0,"37":0,"38":0,"39":7,"40":0,"41":0,"42":0,"43":0,"44":0,"45":7,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":7},"f":{"0":0,"1":27,"2":0,"3":26,"4":0,"5":0,"6":0,"7":0},"b":{"0":[7,7],"1":[7,7],"2":[0,0],"3":[0,0,0,0,0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"595fe0cb997a42afdc5a64f83b58e2d4a0733d5d"} +,"D:\\WIP\\rudder-transformer\\adapters\\utils\\networkUtils.js": {"path":"D:\\WIP\\rudder-transformer\\adapters\\utils\\networkUtils.js","statementMap":{"0":{"start":{"line":2,"column":10},"end":{"line":2,"column":27}},"1":{"start":{"line":3,"column":20},"end":{"line":3,"column":37}},"2":{"start":{"line":9,"column":4},"end":{"line":9,"column":28}},"3":{"start":{"line":10,"column":31},"end":{"line":10,"column":64}},"4":{"start":{"line":11,"column":21},"end":{"line":11,"column":51}},"5":{"start":{"line":13,"column":29},"end":{"line":73,"column":1}},"6":{"start":{"line":14,"column":30},"end":{"line":71,"column":3}},"7":{"start":{"line":72,"column":2},"end":{"line":72,"column":76}},"8":{"start":{"line":76,"column":23},"end":{"line":86,"column":1}},"9":{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},"10":{"start":{"line":78,"column":4},"end":{"line":78,"column":66}},"11":{"start":{"line":80,"column":2},"end":{"line":85,"column":3}},"12":{"start":{"line":82,"column":6},"end":{"line":82,"column":68}},"13":{"start":{"line":84,"column":6},"end":{"line":84,"column":68}},"14":{"start":{"line":88,"column":26},"end":{"line":136,"column":1}},"15":{"start":{"line":89,"column":19},"end":{"line":93,"column":3}},"16":{"start":{"line":95,"column":2},"end":{"line":107,"column":3}},"17":{"start":{"line":99,"column":4},"end":{"line":106,"column":15}},"18":{"start":{"line":108,"column":35},"end":{"line":108,"column":47}},"19":{"start":{"line":110,"column":2},"end":{"line":124,"column":3}},"20":{"start":{"line":116,"column":4},"end":{"line":123,"column":15}},"21":{"start":{"line":126,"column":2},"end":{"line":130,"column":3}},"22":{"start":{"line":127,"column":4},"end":{"line":127,"column":54}},"23":{"start":{"line":129,"column":4},"end":{"line":129,"column":72}},"24":{"start":{"line":131,"column":2},"end":{"line":135,"column":4}},"25":{"start":{"line":139,"column":29},"end":{"line":170,"column":1}},"26":{"start":{"line":140,"column":2},"end":{"line":163,"column":3}},"27":{"start":{"line":141,"column":31},"end":{"line":141,"column":54}},"28":{"start":{"line":143,"column":4},"end":{"line":149,"column":5}},"29":{"start":{"line":144,"column":30},"end":{"line":144,"column":56}},"30":{"start":{"line":145,"column":6},"end":{"line":148,"column":8}},"31":{"start":{"line":151,"column":4},"end":{"line":157,"column":5}},"32":{"start":{"line":152,"column":31},"end":{"line":152,"column":39}},"33":{"start":{"line":153,"column":6},"end":{"line":156,"column":8}},"34":{"start":{"line":159,"column":4},"end":{"line":162,"column":6}},"35":{"start":{"line":165,"column":27},"end":{"line":165,"column":50}},"36":{"start":{"line":166,"column":2},"end":{"line":169,"column":4}},"37":{"start":{"line":172,"column":0},"end":{"line":177,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":13,"column":29},"end":{"line":13,"column":30}},"loc":{"start":{"line":13,"column":37},"end":{"line":73,"column":1}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":76,"column":23},"end":{"line":76,"column":24}},"loc":{"start":{"line":76,"column":37},"end":{"line":86,"column":1}},"line":76},"2":{"name":"(anonymous_2)","decl":{"start":{"line":88,"column":26},"end":{"line":88,"column":27}},"loc":{"start":{"line":88,"column":57},"end":{"line":136,"column":1}},"line":88},"3":{"name":"(anonymous_3)","decl":{"start":{"line":139,"column":29},"end":{"line":139,"column":30}},"loc":{"start":{"line":139,"column":47},"end":{"line":170,"column":1}},"line":139}},"branchMap":{"0":{"loc":{"start":{"line":72,"column":9},"end":{"line":72,"column":75}},"type":"binary-expr","locations":[{"start":{"line":72,"column":9},"end":{"line":72,"column":34}},{"start":{"line":72,"column":38},"end":{"line":72,"column":75}}],"line":72},"1":{"loc":{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},"type":"if","locations":[{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},{"start":{"line":77,"column":2},"end":{"line":79,"column":3}}],"line":77},"2":{"loc":{"start":{"line":80,"column":2},"end":{"line":85,"column":3}},"type":"switch","locations":[{"start":{"line":81,"column":4},"end":{"line":82,"column":68}},{"start":{"line":83,"column":4},"end":{"line":84,"column":68}}],"line":80},"3":{"loc":{"start":{"line":95,"column":2},"end":{"line":107,"column":3}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":107,"column":3}},{"start":{"line":95,"column":2},"end":{"line":107,"column":3}}],"line":95},"4":{"loc":{"start":{"line":96,"column":4},"end":{"line":97,"column":34}},"type":"binary-expr","locations":[{"start":{"line":96,"column":4},"end":{"line":96,"column":49}},{"start":{"line":97,"column":4},"end":{"line":97,"column":34}}],"line":96},"5":{"loc":{"start":{"line":110,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":110,"column":2},"end":{"line":124,"column":3}},{"start":{"line":110,"column":2},"end":{"line":124,"column":3}}],"line":110},"6":{"loc":{"start":{"line":111,"column":4},"end":{"line":114,"column":16}},"type":"binary-expr","locations":[{"start":{"line":111,"column":4},"end":{"line":111,"column":38}},{"start":{"line":112,"column":4},"end":{"line":112,"column":32}},{"start":{"line":113,"column":4},"end":{"line":113,"column":23}},{"start":{"line":114,"column":4},"end":{"line":114,"column":16}}],"line":111},"7":{"loc":{"start":{"line":129,"column":29},"end":{"line":129,"column":71}},"type":"cond-expr","locations":[{"start":{"line":129,"column":54},"end":{"line":129,"column":66}},{"start":{"line":129,"column":69},"end":{"line":129,"column":71}}],"line":129},"8":{"loc":{"start":{"line":140,"column":2},"end":{"line":163,"column":3}},"type":"if","locations":[{"start":{"line":140,"column":2},"end":{"line":163,"column":3}},{"start":{"line":140,"column":2},"end":{"line":163,"column":3}}],"line":140},"9":{"loc":{"start":{"line":143,"column":4},"end":{"line":149,"column":5}},"type":"if","locations":[{"start":{"line":143,"column":4},"end":{"line":149,"column":5}},{"start":{"line":143,"column":4},"end":{"line":149,"column":5}}],"line":143},"10":{"loc":{"start":{"line":143,"column":8},"end":{"line":143,"column":25}},"type":"binary-expr","locations":[{"start":{"line":143,"column":8},"end":{"line":143,"column":17}},{"start":{"line":143,"column":21},"end":{"line":143,"column":25}}],"line":143},"11":{"loc":{"start":{"line":151,"column":4},"end":{"line":157,"column":5}},"type":"if","locations":[{"start":{"line":151,"column":4},"end":{"line":157,"column":5}},{"start":{"line":151,"column":4},"end":{"line":157,"column":5}}],"line":151},"12":{"loc":{"start":{"line":154,"column":18},"end":{"line":154,"column":28}},"type":"binary-expr","locations":[{"start":{"line":154,"column":18},"end":{"line":154,"column":22}},{"start":{"line":154,"column":26},"end":{"line":154,"column":28}}],"line":154},"13":{"loc":{"start":{"line":155,"column":16},"end":{"line":155,"column":29}},"type":"binary-expr","locations":[{"start":{"line":155,"column":16},"end":{"line":155,"column":22}},{"start":{"line":155,"column":26},"end":{"line":155,"column":29}}],"line":155},"14":{"loc":{"start":{"line":167,"column":14},"end":{"line":167,"column":24}},"type":"binary-expr","locations":[{"start":{"line":167,"column":14},"end":{"line":167,"column":18}},{"start":{"line":167,"column":22},"end":{"line":167,"column":24}}],"line":167},"15":{"loc":{"start":{"line":168,"column":12},"end":{"line":168,"column":25}},"type":"binary-expr","locations":[{"start":{"line":168,"column":12},"end":{"line":168,"column":18}},{"start":{"line":168,"column":22},"end":{"line":168,"column":25}}],"line":168}},"s":{"0":6,"1":6,"2":6,"3":6,"4":6,"5":6,"6":0,"7":0,"8":6,"9":0,"10":0,"11":0,"12":0,"13":0,"14":6,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":6,"26":8,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":8,"36":8,"37":6},"f":{"0":0,"1":0,"2":0,"3":8},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0,0,0],"7":[0,0],"8":[0,8],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[8,0],"15":[8,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0d6d34d9135ed8674c523e1379395dfdb739b143"} +,"D:\\WIP\\rudder-transformer\\cdk\\heap\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\cdk\\heap\\transform.js","statementMap":{"0":{"start":{"line":2,"column":26},"end":{"line":2,"column":31}},"1":{"start":{"line":3,"column":18},"end":{"line":3,"column":31}},"2":{"start":{"line":4,"column":2},"end":{"line":6,"column":3}},"3":{"start":{"line":5,"column":4},"end":{"line":5,"column":45}},"4":{"start":{"line":7,"column":23},"end":{"line":10,"column":3}},"5":{"start":{"line":12,"column":2},"end":{"line":12,"column":22}},"6":{"start":{"line":15,"column":0},"end":{"line":15,"column":38}}},"fnMap":{"0":{"name":"commonPostMapper","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":25}},"loc":{"start":{"line":1,"column":63},"end":{"line":13,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":2},"end":{"line":6,"column":3}},"type":"if","locations":[{"start":{"line":4,"column":2},"end":{"line":6,"column":3}},{"start":{"line":4,"column":2},"end":{"line":6,"column":3}}],"line":4},"1":{"loc":{"start":{"line":4,"column":6},"end":{"line":4,"column":61}},"type":"binary-expr","locations":[{"start":{"line":4,"column":6},"end":{"line":4,"column":24}},{"start":{"line":4,"column":28},"end":{"line":4,"column":61}}],"line":4}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":1},"f":{"0":2},"b":{"0":[2,0],"1":[2,2]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"cf9d86ea79e195b9b97eaf413a9084259617601c"} +,"D:\\WIP\\rudder-transformer\\constants\\destinationCanonicalNames.js": {"path":"D:\\WIP\\rudder-transformer\\constants\\destinationCanonicalNames.js","statementMap":{"0":{"start":{"line":1,"column":23},"end":{"line":3,"column":1}},"1":{"start":{"line":5,"column":27},"end":{"line":31,"column":1}},"2":{"start":{"line":33,"column":0},"end":{"line":33,"column":56}}},"fnMap":{},"branchMap":{},"s":{"0":70,"1":70,"2":70},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"58112a78b420caf794a0d3090d81ac38873149c8"} +,"D:\\WIP\\rudder-transformer\\constants\\index.js": {"path":"D:\\WIP\\rudder-transformer\\constants\\index.js","statementMap":{"0":{"start":{"line":1,"column":18},"end":{"line":10,"column":1}},"1":{"start":{"line":12,"column":16},"end":{"line":18,"column":1}},"2":{"start":{"line":20,"column":22},"end":{"line":22,"column":1}},"3":{"start":{"line":24,"column":21},"end":{"line":24,"column":32}},"4":{"start":{"line":26,"column":26},"end":{"line":47,"column":1}},"5":{"start":{"line":49,"column":31},"end":{"line":49,"column":60}},"6":{"start":{"line":51,"column":0},"end":{"line":57,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":56,"1":56,"2":56,"3":56,"4":56,"5":56,"6":56},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a540a2949db50f92251efc846bd15f8accc7578c"} +,"D:\\WIP\\rudder-transformer\\util\\stats.js": {"path":"D:\\WIP\\rudder-transformer\\util\\stats.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":36}},"1":{"start":{"line":3,"column":20},"end":{"line":3,"column":56}},"2":{"start":{"line":4,"column":24},"end":{"line":4,"column":69}},"3":{"start":{"line":5,"column":24},"end":{"line":5,"column":78}},"4":{"start":{"line":7,"column":21},"end":{"line":12,"column":2}},"5":{"start":{"line":15,"column":15},"end":{"line":19,"column":1}},"6":{"start":{"line":16,"column":2},"end":{"line":18,"column":3}},"7":{"start":{"line":17,"column":4},"end":{"line":17,"column":43}},"8":{"start":{"line":21,"column":18},"end":{"line":25,"column":1}},"9":{"start":{"line":22,"column":2},"end":{"line":24,"column":3}},"10":{"start":{"line":23,"column":4},"end":{"line":23,"column":46}},"11":{"start":{"line":27,"column":18},"end":{"line":31,"column":1}},"12":{"start":{"line":28,"column":2},"end":{"line":30,"column":3}},"13":{"start":{"line":29,"column":4},"end":{"line":29,"column":46}},"14":{"start":{"line":33,"column":16},"end":{"line":37,"column":1}},"15":{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},"16":{"start":{"line":35,"column":4},"end":{"line":35,"column":44}},"17":{"start":{"line":39,"column":14},"end":{"line":43,"column":1}},"18":{"start":{"line":40,"column":2},"end":{"line":42,"column":3}},"19":{"start":{"line":41,"column":4},"end":{"line":41,"column":42}},"20":{"start":{"line":45,"column":0},"end":{"line":45,"column":66}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":15,"column":15},"end":{"line":15,"column":16}},"loc":{"start":{"line":15,"column":43},"end":{"line":19,"column":1}},"line":15},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":18},"end":{"line":21,"column":19}},"loc":{"start":{"line":21,"column":50},"end":{"line":25,"column":1}},"line":21},"2":{"name":"(anonymous_2)","decl":{"start":{"line":27,"column":18},"end":{"line":27,"column":19}},"loc":{"start":{"line":27,"column":51},"end":{"line":31,"column":1}},"line":27},"3":{"name":"(anonymous_3)","decl":{"start":{"line":33,"column":16},"end":{"line":33,"column":17}},"loc":{"start":{"line":33,"column":44},"end":{"line":37,"column":1}},"line":33},"4":{"name":"(anonymous_4)","decl":{"start":{"line":39,"column":14},"end":{"line":39,"column":15}},"loc":{"start":{"line":39,"column":42},"end":{"line":43,"column":1}},"line":39}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":24},"end":{"line":4,"column":69}},"type":"binary-expr","locations":[{"start":{"line":4,"column":24},"end":{"line":4,"column":54}},{"start":{"line":4,"column":58},"end":{"line":4,"column":69}}],"line":4},"1":{"loc":{"start":{"line":5,"column":33},"end":{"line":5,"column":73}},"type":"binary-expr","locations":[{"start":{"line":5,"column":33},"end":{"line":5,"column":63}},{"start":{"line":5,"column":67},"end":{"line":5,"column":73}}],"line":5},"2":{"loc":{"start":{"line":15,"column":29},"end":{"line":15,"column":38}},"type":"default-arg","locations":[{"start":{"line":15,"column":36},"end":{"line":15,"column":38}}],"line":15},"3":{"loc":{"start":{"line":16,"column":2},"end":{"line":18,"column":3}},"type":"if","locations":[{"start":{"line":16,"column":2},"end":{"line":18,"column":3}},{"start":{"line":16,"column":2},"end":{"line":18,"column":3}}],"line":16},"4":{"loc":{"start":{"line":21,"column":25},"end":{"line":21,"column":34}},"type":"default-arg","locations":[{"start":{"line":21,"column":33},"end":{"line":21,"column":34}}],"line":21},"5":{"loc":{"start":{"line":21,"column":36},"end":{"line":21,"column":45}},"type":"default-arg","locations":[{"start":{"line":21,"column":43},"end":{"line":21,"column":45}}],"line":21},"6":{"loc":{"start":{"line":22,"column":2},"end":{"line":24,"column":3}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":24,"column":3}},{"start":{"line":22,"column":2},"end":{"line":24,"column":3}}],"line":22},"7":{"loc":{"start":{"line":27,"column":25},"end":{"line":27,"column":35}},"type":"default-arg","locations":[{"start":{"line":27,"column":33},"end":{"line":27,"column":35}}],"line":27},"8":{"loc":{"start":{"line":27,"column":37},"end":{"line":27,"column":46}},"type":"default-arg","locations":[{"start":{"line":27,"column":44},"end":{"line":27,"column":46}}],"line":27},"9":{"loc":{"start":{"line":28,"column":2},"end":{"line":30,"column":3}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":30,"column":3}},{"start":{"line":28,"column":2},"end":{"line":30,"column":3}}],"line":28},"10":{"loc":{"start":{"line":33,"column":30},"end":{"line":33,"column":39}},"type":"default-arg","locations":[{"start":{"line":33,"column":37},"end":{"line":33,"column":39}}],"line":33},"11":{"loc":{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},{"start":{"line":34,"column":2},"end":{"line":36,"column":3}}],"line":34},"12":{"loc":{"start":{"line":39,"column":28},"end":{"line":39,"column":37}},"type":"default-arg","locations":[{"start":{"line":39,"column":35},"end":{"line":39,"column":37}}],"line":39},"13":{"loc":{"start":{"line":40,"column":2},"end":{"line":42,"column":3}},"type":"if","locations":[{"start":{"line":40,"column":2},"end":{"line":42,"column":3}},{"start":{"line":40,"column":2},"end":{"line":42,"column":3}}],"line":40}},"s":{"0":70,"1":70,"2":70,"3":70,"4":70,"5":70,"6":0,"7":0,"8":70,"9":16,"10":16,"11":70,"12":0,"13":0,"14":70,"15":0,"16":0,"17":70,"18":0,"19":0,"20":70},"f":{"0":0,"1":16,"2":0,"3":0,"4":0},"b":{"0":[70,70],"1":[70,70],"2":[0],"3":[0,0],"4":[0],"5":[6],"6":[16,0],"7":[0],"8":[0],"9":[0,0],"10":[0],"11":[0,0],"12":[0],"13":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"aafdaa10ff9ff01cf39a218122d5d316fdd70930"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\active_campaign\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\active_campaign\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":23,"column":26},"end":{"line":48,"column":1}},"2":{"start":{"line":50,"column":23},"end":{"line":50,"column":69}},"3":{"start":{"line":52,"column":0},"end":{"line":55,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bd1cacf26f285e3866db176233671791506e8683"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\active_campaign\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\active_campaign\\transform.js","statementMap":{"0":{"start":{"line":3,"column":12},"end":{"line":3,"column":32}},"1":{"start":{"line":4,"column":22},"end":{"line":4,"column":51}},"2":{"start":{"line":5,"column":46},"end":{"line":5,"column":65}},"3":{"start":{"line":14,"column":4},"end":{"line":14,"column":25}},"4":{"start":{"line":15,"column":25},"end":{"line":15,"column":42}},"5":{"start":{"line":16,"column":30},"end":{"line":16,"column":66}},"6":{"start":{"line":20,"column":30},"end":{"line":51,"column":1}},"7":{"start":{"line":21,"column":2},"end":{"line":48,"column":3}},"8":{"start":{"line":22,"column":21},"end":{"line":22,"column":43}},"9":{"start":{"line":23,"column":4},"end":{"line":46,"column":5}},"10":{"start":{"line":26,"column":8},"end":{"line":26,"column":79}},"11":{"start":{"line":27,"column":8},"end":{"line":27,"column":65}},"12":{"start":{"line":28,"column":8},"end":{"line":31,"column":10}},"13":{"start":{"line":32,"column":8},"end":{"line":32,"column":37}},"14":{"start":{"line":33,"column":8},"end":{"line":33,"column":14}},"15":{"start":{"line":36,"column":8},"end":{"line":36,"column":51}},"16":{"start":{"line":37,"column":8},"end":{"line":37,"column":65}},"17":{"start":{"line":38,"column":8},"end":{"line":41,"column":10}},"18":{"start":{"line":42,"column":8},"end":{"line":42,"column":37}},"19":{"start":{"line":43,"column":8},"end":{"line":43,"column":14}},"20":{"start":{"line":45,"column":8},"end":{"line":45,"column":72}},"21":{"start":{"line":47,"column":4},"end":{"line":47,"column":20}},"22":{"start":{"line":50,"column":2},"end":{"line":50,"column":65}},"23":{"start":{"line":53,"column":20},"end":{"line":73,"column":1}},"24":{"start":{"line":54,"column":19},"end":{"line":54,"column":69}},"25":{"start":{"line":55,"column":22},"end":{"line":57,"column":3}},"26":{"start":{"line":58,"column":25},"end":{"line":63,"column":3}},"27":{"start":{"line":64,"column":14},"end":{"line":64,"column":67}},"28":{"start":{"line":65,"column":2},"end":{"line":67,"column":3}},"29":{"start":{"line":66,"column":4},"end":{"line":66,"column":63}},"30":{"start":{"line":68,"column":25},"end":{"line":68,"column":58}},"31":{"start":{"line":69,"column":2},"end":{"line":71,"column":3}},"32":{"start":{"line":70,"column":4},"end":{"line":70,"column":55}},"33":{"start":{"line":72,"column":2},"end":{"line":72,"column":27}},"34":{"start":{"line":75,"column":27},"end":{"line":221,"column":1}},"35":{"start":{"line":81,"column":26},"end":{"line":81,"column":28}},"36":{"start":{"line":82,"column":17},"end":{"line":82,"column":19}},"37":{"start":{"line":89,"column":4},"end":{"line":89,"column":70}},"38":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"39":{"start":{"line":93,"column":4},"end":{"line":93,"column":11}},"40":{"start":{"line":99,"column":2},"end":{"line":101,"column":43}},"41":{"start":{"line":102,"column":2},"end":{"line":107,"column":4}},"42":{"start":{"line":108,"column":2},"end":{"line":108,"column":48}},"43":{"start":{"line":109,"column":2},"end":{"line":111,"column":3}},"44":{"start":{"line":110,"column":4},"end":{"line":110,"column":71}},"45":{"start":{"line":113,"column":21},"end":{"line":113,"column":23}},"46":{"start":{"line":114,"column":2},"end":{"line":160,"column":3}},"47":{"start":{"line":118,"column":4},"end":{"line":120,"column":7}},"48":{"start":{"line":119,"column":6},"end":{"line":119,"column":31}},"49":{"start":{"line":125,"column":21},"end":{"line":125,"column":23}},"50":{"start":{"line":126,"column":4},"end":{"line":151,"column":5}},"51":{"start":{"line":127,"column":20},"end":{"line":129,"column":7}},"52":{"start":{"line":130,"column":6},"end":{"line":142,"column":7}},"53":{"start":{"line":130,"column":19},"end":{"line":130,"column":20}},"54":{"start":{"line":131,"column":8},"end":{"line":133,"column":45}},"55":{"start":{"line":134,"column":8},"end":{"line":139,"column":10}},"56":{"start":{"line":140,"column":21},"end":{"line":140,"column":54}},"57":{"start":{"line":141,"column":8},"end":{"line":141,"column":28}},"58":{"start":{"line":143,"column":22},"end":{"line":143,"column":49}},"59":{"start":{"line":144,"column":6},"end":{"line":150,"column":9}},"60":{"start":{"line":145,"column":8},"end":{"line":149,"column":9}},"61":{"start":{"line":146,"column":10},"end":{"line":148,"column":13}},"62":{"start":{"line":147,"column":12},"end":{"line":147,"column":37}},"63":{"start":{"line":156,"column":4},"end":{"line":159,"column":7}},"64":{"start":{"line":157,"column":6},"end":{"line":158,"column":40}},"65":{"start":{"line":157,"column":28},"end":{"line":157,"column":54}},"66":{"start":{"line":158,"column":11},"end":{"line":158,"column":40}},"67":{"start":{"line":165,"column":2},"end":{"line":190,"column":3}},"68":{"start":{"line":166,"column":4},"end":{"line":189,"column":6}},"69":{"start":{"line":168,"column":8},"end":{"line":168,"column":73}},"70":{"start":{"line":169,"column":8},"end":{"line":175,"column":10}},"71":{"start":{"line":176,"column":8},"end":{"line":181,"column":10}},"72":{"start":{"line":182,"column":8},"end":{"line":182,"column":68}},"73":{"start":{"line":183,"column":8},"end":{"line":186,"column":9}},"74":{"start":{"line":184,"column":10},"end":{"line":184,"column":65}},"75":{"start":{"line":187,"column":8},"end":{"line":187,"column":79}},"76":{"start":{"line":187,"column":41},"end":{"line":187,"column":79}},"77":{"start":{"line":195,"column":23},"end":{"line":213,"column":3}},"78":{"start":{"line":197,"column":6},"end":{"line":197,"column":82}},"79":{"start":{"line":198,"column":6},"end":{"line":203,"column":8}},"80":{"start":{"line":204,"column":6},"end":{"line":209,"column":8}},"81":{"start":{"line":210,"column":6},"end":{"line":210,"column":60}},"82":{"start":{"line":211,"column":6},"end":{"line":211,"column":17}},"83":{"start":{"line":214,"column":2},"end":{"line":220,"column":5}},"84":{"start":{"line":215,"column":4},"end":{"line":219,"column":8}},"85":{"start":{"line":216,"column":6},"end":{"line":219,"column":8}},"86":{"start":{"line":223,"column":29},"end":{"line":325,"column":1}},"87":{"start":{"line":224,"column":26},"end":{"line":224,"column":28}},"88":{"start":{"line":228,"column":4},"end":{"line":229,"column":36}},"89":{"start":{"line":232,"column":2},"end":{"line":234,"column":3}},"90":{"start":{"line":233,"column":4},"end":{"line":233,"column":14}},"91":{"start":{"line":235,"column":20},"end":{"line":235,"column":42}},"92":{"start":{"line":239,"column":17},"end":{"line":241,"column":44}},"93":{"start":{"line":242,"column":25},"end":{"line":246,"column":3}},"94":{"start":{"line":247,"column":14},"end":{"line":247,"column":53}},"95":{"start":{"line":248,"column":2},"end":{"line":250,"column":3}},"96":{"start":{"line":249,"column":4},"end":{"line":249,"column":68}},"97":{"start":{"line":251,"column":2},"end":{"line":253,"column":4}},"98":{"start":{"line":255,"column":19},"end":{"line":255,"column":21}},"99":{"start":{"line":256,"column":16},"end":{"line":258,"column":3}},"100":{"start":{"line":259,"column":2},"end":{"line":280,"column":3}},"101":{"start":{"line":260,"column":4},"end":{"line":271,"column":5}},"102":{"start":{"line":260,"column":17},"end":{"line":260,"column":18}},"103":{"start":{"line":261,"column":6},"end":{"line":263,"column":43}},"104":{"start":{"line":264,"column":25},"end":{"line":268,"column":7}},"105":{"start":{"line":269,"column":19},"end":{"line":269,"column":48}},"106":{"start":{"line":270,"column":6},"end":{"line":270,"column":26}},"107":{"start":{"line":272,"column":20},"end":{"line":272,"column":47}},"108":{"start":{"line":273,"column":4},"end":{"line":279,"column":7}},"109":{"start":{"line":274,"column":6},"end":{"line":278,"column":7}},"110":{"start":{"line":275,"column":8},"end":{"line":275,"column":56}},"111":{"start":{"line":277,"column":8},"end":{"line":277,"column":73}},"112":{"start":{"line":284,"column":19},"end":{"line":284,"column":21}},"113":{"start":{"line":286,"column":2},"end":{"line":290,"column":5}},"114":{"start":{"line":287,"column":4},"end":{"line":289,"column":7}},"115":{"start":{"line":288,"column":6},"end":{"line":288,"column":39}},"116":{"start":{"line":292,"column":23},"end":{"line":292,"column":44}},"117":{"start":{"line":293,"column":28},"end":{"line":293,"column":30}},"118":{"start":{"line":294,"column":2},"end":{"line":299,"column":5}},"119":{"start":{"line":296,"column":4},"end":{"line":298,"column":5}},"120":{"start":{"line":297,"column":6},"end":{"line":297,"column":39}},"121":{"start":{"line":307,"column":26},"end":{"line":307,"column":28}},"122":{"start":{"line":308,"column":2},"end":{"line":322,"column":5}},"123":{"start":{"line":310,"column":4},"end":{"line":317,"column":5}},"124":{"start":{"line":311,"column":6},"end":{"line":311,"column":22}},"125":{"start":{"line":312,"column":6},"end":{"line":314,"column":9}},"126":{"start":{"line":313,"column":8},"end":{"line":313,"column":40}},"127":{"start":{"line":316,"column":6},"end":{"line":316,"column":32}},"128":{"start":{"line":318,"column":4},"end":{"line":321,"column":7}},"129":{"start":{"line":324,"column":2},"end":{"line":324,"column":25}},"130":{"start":{"line":327,"column":28},"end":{"line":382,"column":1}},"131":{"start":{"line":334,"column":19},"end":{"line":336,"column":34}},"132":{"start":{"line":337,"column":2},"end":{"line":339,"column":3}},"133":{"start":{"line":338,"column":4},"end":{"line":338,"column":11}},"134":{"start":{"line":341,"column":18},"end":{"line":341,"column":20}},"135":{"start":{"line":342,"column":2},"end":{"line":348,"column":3}},"136":{"start":{"line":343,"column":4},"end":{"line":345,"column":7}},"137":{"start":{"line":344,"column":6},"end":{"line":344,"column":25}},"138":{"start":{"line":347,"column":4},"end":{"line":347,"column":27}},"139":{"start":{"line":352,"column":19},"end":{"line":352,"column":21}},"140":{"start":{"line":353,"column":2},"end":{"line":372,"column":5}},"141":{"start":{"line":354,"column":4},"end":{"line":371,"column":5}},"142":{"start":{"line":355,"column":23},"end":{"line":355,"column":88}},"143":{"start":{"line":356,"column":26},"end":{"line":362,"column":7}},"144":{"start":{"line":363,"column":29},"end":{"line":368,"column":7}},"145":{"start":{"line":369,"column":18},"end":{"line":369,"column":65}},"146":{"start":{"line":370,"column":6},"end":{"line":370,"column":25}},"147":{"start":{"line":373,"column":20},"end":{"line":373,"column":47}},"148":{"start":{"line":374,"column":2},"end":{"line":381,"column":5}},"149":{"start":{"line":375,"column":4},"end":{"line":380,"column":5}},"150":{"start":{"line":376,"column":6},"end":{"line":379,"column":8}},"151":{"start":{"line":387,"column":31},"end":{"line":410,"column":1}},"152":{"start":{"line":389,"column":23},"end":{"line":389,"column":79}},"153":{"start":{"line":390,"column":2},"end":{"line":390,"column":64}},"154":{"start":{"line":392,"column":20},"end":{"line":392,"column":76}},"155":{"start":{"line":394,"column":2},"end":{"line":394,"column":70}},"156":{"start":{"line":396,"column":2},"end":{"line":396,"column":71}},"157":{"start":{"line":398,"column":22},"end":{"line":402,"column":3}},"158":{"start":{"line":403,"column":2},"end":{"line":403,"column":43}},"159":{"start":{"line":404,"column":2},"end":{"line":404,"column":64}},"160":{"start":{"line":405,"column":18},"end":{"line":407,"column":3}},"161":{"start":{"line":409,"column":2},"end":{"line":409,"column":63}},"162":{"start":{"line":414,"column":27},"end":{"line":419,"column":1}},"163":{"start":{"line":415,"column":18},"end":{"line":417,"column":3}},"164":{"start":{"line":418,"column":2},"end":{"line":418,"column":63}},"165":{"start":{"line":421,"column":29},"end":{"line":486,"column":1}},"166":{"start":{"line":426,"column":17},"end":{"line":426,"column":75}},"167":{"start":{"line":427,"column":25},"end":{"line":432,"column":3}},"168":{"start":{"line":433,"column":2},"end":{"line":433,"column":48}},"169":{"start":{"line":434,"column":2},"end":{"line":436,"column":3}},"170":{"start":{"line":435,"column":4},"end":{"line":435,"column":60}},"171":{"start":{"line":438,"column":2},"end":{"line":439,"column":80}},"172":{"start":{"line":439,"column":4},"end":{"line":439,"column":80}},"173":{"start":{"line":441,"column":26},"end":{"line":441,"column":63}},"174":{"start":{"line":442,"column":23},"end":{"line":442,"column":25}},"175":{"start":{"line":443,"column":2},"end":{"line":445,"column":5}},"176":{"start":{"line":444,"column":4},"end":{"line":444,"column":31}},"177":{"start":{"line":448,"column":2},"end":{"line":473,"column":3}},"178":{"start":{"line":450,"column":4},"end":{"line":450,"column":74}},"179":{"start":{"line":451,"column":24},"end":{"line":455,"column":5}},"180":{"start":{"line":456,"column":23},"end":{"line":461,"column":5}},"181":{"start":{"line":462,"column":4},"end":{"line":462,"column":60}},"182":{"start":{"line":463,"column":4},"end":{"line":465,"column":5}},"183":{"start":{"line":464,"column":6},"end":{"line":464,"column":59}},"184":{"start":{"line":467,"column":4},"end":{"line":472,"column":5}},"185":{"start":{"line":468,"column":6},"end":{"line":471,"column":8}},"186":{"start":{"line":478,"column":18},"end":{"line":478,"column":74}},"187":{"start":{"line":479,"column":2},"end":{"line":479,"column":43}},"188":{"start":{"line":480,"column":2},"end":{"line":480,"column":44}},"189":{"start":{"line":481,"column":2},"end":{"line":483,"column":3}},"190":{"start":{"line":482,"column":4},"end":{"line":482,"column":61}},"191":{"start":{"line":484,"column":2},"end":{"line":484,"column":72}},"192":{"start":{"line":485,"column":2},"end":{"line":485,"column":63}},"193":{"start":{"line":488,"column":28},"end":{"line":553,"column":1}},"194":{"start":{"line":492,"column":17},"end":{"line":492,"column":75}},"195":{"start":{"line":493,"column":25},"end":{"line":497,"column":3}},"196":{"start":{"line":498,"column":12},"end":{"line":498,"column":51}},"197":{"start":{"line":500,"column":2},"end":{"line":502,"column":3}},"198":{"start":{"line":501,"column":4},"end":{"line":501,"column":60}},"199":{"start":{"line":504,"column":2},"end":{"line":508,"column":6}},"200":{"start":{"line":505,"column":4},"end":{"line":508,"column":6}},"201":{"start":{"line":510,"column":26},"end":{"line":510,"column":63}},"202":{"start":{"line":511,"column":23},"end":{"line":511,"column":25}},"203":{"start":{"line":512,"column":2},"end":{"line":514,"column":5}},"204":{"start":{"line":513,"column":4},"end":{"line":513,"column":31}},"205":{"start":{"line":517,"column":2},"end":{"line":538,"column":3}},"206":{"start":{"line":519,"column":4},"end":{"line":519,"column":74}},"207":{"start":{"line":520,"column":24},"end":{"line":524,"column":5}},"208":{"start":{"line":525,"column":23},"end":{"line":530,"column":5}},"209":{"start":{"line":531,"column":4},"end":{"line":531,"column":60}},"210":{"start":{"line":532,"column":4},"end":{"line":537,"column":5}},"211":{"start":{"line":533,"column":6},"end":{"line":536,"column":8}},"212":{"start":{"line":544,"column":18},"end":{"line":544,"column":74}},"213":{"start":{"line":545,"column":2},"end":{"line":545,"column":43}},"214":{"start":{"line":546,"column":2},"end":{"line":546,"column":44}},"215":{"start":{"line":547,"column":2},"end":{"line":549,"column":3}},"216":{"start":{"line":548,"column":4},"end":{"line":548,"column":61}},"217":{"start":{"line":550,"column":2},"end":{"line":550,"column":72}},"218":{"start":{"line":552,"column":2},"end":{"line":552,"column":63}},"219":{"start":{"line":558,"column":21},"end":{"line":589,"column":1}},"220":{"start":{"line":559,"column":2},"end":{"line":564,"column":3}},"221":{"start":{"line":560,"column":4},"end":{"line":563,"column":6}},"222":{"start":{"line":565,"column":22},"end":{"line":565,"column":48}},"223":{"start":{"line":568,"column":2},"end":{"line":587,"column":3}},"224":{"start":{"line":570,"column":6},"end":{"line":570,"column":44}},"225":{"start":{"line":571,"column":6},"end":{"line":571,"column":78}},"226":{"start":{"line":572,"column":6},"end":{"line":572,"column":12}},"227":{"start":{"line":574,"column":6},"end":{"line":574,"column":40}},"228":{"start":{"line":575,"column":6},"end":{"line":575,"column":68}},"229":{"start":{"line":576,"column":6},"end":{"line":576,"column":12}},"230":{"start":{"line":578,"column":6},"end":{"line":578,"column":42}},"231":{"start":{"line":579,"column":6},"end":{"line":579,"column":76}},"232":{"start":{"line":580,"column":6},"end":{"line":580,"column":12}},"233":{"start":{"line":582,"column":6},"end":{"line":582,"column":41}},"234":{"start":{"line":583,"column":6},"end":{"line":583,"column":75}},"235":{"start":{"line":584,"column":6},"end":{"line":584,"column":12}},"236":{"start":{"line":586,"column":6},"end":{"line":586,"column":63}},"237":{"start":{"line":588,"column":2},"end":{"line":588,"column":18}},"238":{"start":{"line":591,"column":16},"end":{"line":594,"column":1}},"239":{"start":{"line":592,"column":17},"end":{"line":592,"column":69}},"240":{"start":{"line":593,"column":2},"end":{"line":593,"column":16}},"241":{"start":{"line":596,"column":26},"end":{"line":633,"column":1}},"242":{"start":{"line":597,"column":2},"end":{"line":600,"column":3}},"243":{"start":{"line":598,"column":23},"end":{"line":598,"column":75}},"244":{"start":{"line":599,"column":4},"end":{"line":599,"column":24}},"245":{"start":{"line":602,"column":19},"end":{"line":631,"column":3}},"246":{"start":{"line":604,"column":6},"end":{"line":629,"column":7}},"247":{"start":{"line":605,"column":8},"end":{"line":612,"column":9}},"248":{"start":{"line":607,"column":10},"end":{"line":611,"column":12}},"249":{"start":{"line":614,"column":8},"end":{"line":618,"column":10}},"250":{"start":{"line":620,"column":8},"end":{"line":628,"column":10}},"251":{"start":{"line":632,"column":2},"end":{"line":632,"column":18}},"252":{"start":{"line":635,"column":0},"end":{"line":635,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":20,"column":30},"end":{"line":20,"column":31}},"loc":{"start":{"line":20,"column":66},"end":{"line":51,"column":1}},"line":20},"1":{"name":"(anonymous_1)","decl":{"start":{"line":53,"column":20},"end":{"line":53,"column":21}},"loc":{"start":{"line":53,"column":69},"end":{"line":73,"column":1}},"line":53},"2":{"name":"(anonymous_2)","decl":{"start":{"line":75,"column":27},"end":{"line":75,"column":28}},"loc":{"start":{"line":80,"column":5},"end":{"line":221,"column":1}},"line":80},"3":{"name":"(anonymous_3)","decl":{"start":{"line":118,"column":31},"end":{"line":118,"column":32}},"loc":{"start":{"line":118,"column":36},"end":{"line":120,"column":5}},"line":118},"4":{"name":"(anonymous_4)","decl":{"start":{"line":144,"column":22},"end":{"line":144,"column":23}},"loc":{"start":{"line":144,"column":30},"end":{"line":150,"column":7}},"line":144},"5":{"name":"(anonymous_5)","decl":{"start":{"line":146,"column":38},"end":{"line":146,"column":39}},"loc":{"start":{"line":146,"column":43},"end":{"line":148,"column":11}},"line":146},"6":{"name":"(anonymous_6)","decl":{"start":{"line":156,"column":13},"end":{"line":156,"column":14}},"loc":{"start":{"line":156,"column":20},"end":{"line":159,"column":5}},"line":156},"7":{"name":"(anonymous_7)","decl":{"start":{"line":167,"column":26},"end":{"line":167,"column":27}},"loc":{"start":{"line":167,"column":39},"end":{"line":188,"column":7}},"line":167},"8":{"name":"(anonymous_8)","decl":{"start":{"line":196,"column":15},"end":{"line":196,"column":16}},"loc":{"start":{"line":196,"column":30},"end":{"line":212,"column":5}},"line":196},"9":{"name":"(anonymous_9)","decl":{"start":{"line":214,"column":23},"end":{"line":214,"column":24}},"loc":{"start":{"line":214,"column":35},"end":{"line":220,"column":3}},"line":214},"10":{"name":"(anonymous_10)","decl":{"start":{"line":223,"column":29},"end":{"line":223,"column":30}},"loc":{"start":{"line":223,"column":71},"end":{"line":325,"column":1}},"line":223},"11":{"name":"(anonymous_11)","decl":{"start":{"line":273,"column":20},"end":{"line":273,"column":21}},"loc":{"start":{"line":273,"column":28},"end":{"line":279,"column":5}},"line":273},"12":{"name":"(anonymous_12)","decl":{"start":{"line":286,"column":26},"end":{"line":286,"column":27}},"loc":{"start":{"line":286,"column":38},"end":{"line":290,"column":3}},"line":286},"13":{"name":"(anonymous_13)","decl":{"start":{"line":287,"column":17},"end":{"line":287,"column":18}},"loc":{"start":{"line":287,"column":26},"end":{"line":289,"column":5}},"line":287},"14":{"name":"(anonymous_14)","decl":{"start":{"line":294,"column":16},"end":{"line":294,"column":17}},"loc":{"start":{"line":294,"column":28},"end":{"line":299,"column":3}},"line":294},"15":{"name":"(anonymous_15)","decl":{"start":{"line":308,"column":24},"end":{"line":308,"column":25}},"loc":{"start":{"line":308,"column":31},"end":{"line":322,"column":3}},"line":308},"16":{"name":"(anonymous_16)","decl":{"start":{"line":312,"column":25},"end":{"line":312,"column":26}},"loc":{"start":{"line":312,"column":31},"end":{"line":314,"column":7}},"line":312},"17":{"name":"(anonymous_17)","decl":{"start":{"line":327,"column":28},"end":{"line":327,"column":29}},"loc":{"start":{"line":332,"column":5},"end":{"line":382,"column":1}},"line":332},"18":{"name":"(anonymous_18)","decl":{"start":{"line":343,"column":17},"end":{"line":343,"column":18}},"loc":{"start":{"line":343,"column":25},"end":{"line":345,"column":5}},"line":343},"19":{"name":"(anonymous_19)","decl":{"start":{"line":353,"column":14},"end":{"line":353,"column":15}},"loc":{"start":{"line":353,"column":26},"end":{"line":372,"column":3}},"line":353},"20":{"name":"(anonymous_20)","decl":{"start":{"line":374,"column":20},"end":{"line":374,"column":21}},"loc":{"start":{"line":374,"column":32},"end":{"line":381,"column":3}},"line":374},"21":{"name":"(anonymous_21)","decl":{"start":{"line":387,"column":31},"end":{"line":387,"column":32}},"loc":{"start":{"line":387,"column":73},"end":{"line":410,"column":1}},"line":387},"22":{"name":"(anonymous_22)","decl":{"start":{"line":414,"column":27},"end":{"line":414,"column":28}},"loc":{"start":{"line":414,"column":63},"end":{"line":419,"column":1}},"line":414},"23":{"name":"(anonymous_23)","decl":{"start":{"line":421,"column":29},"end":{"line":421,"column":30}},"loc":{"start":{"line":421,"column":71},"end":{"line":486,"column":1}},"line":421},"24":{"name":"(anonymous_24)","decl":{"start":{"line":443,"column":22},"end":{"line":443,"column":23}},"loc":{"start":{"line":443,"column":28},"end":{"line":445,"column":3}},"line":443},"25":{"name":"(anonymous_25)","decl":{"start":{"line":488,"column":28},"end":{"line":488,"column":29}},"loc":{"start":{"line":488,"column":70},"end":{"line":553,"column":1}},"line":488},"26":{"name":"(anonymous_26)","decl":{"start":{"line":512,"column":22},"end":{"line":512,"column":23}},"loc":{"start":{"line":512,"column":28},"end":{"line":514,"column":3}},"line":512},"27":{"name":"(anonymous_27)","decl":{"start":{"line":558,"column":21},"end":{"line":558,"column":22}},"loc":{"start":{"line":558,"column":53},"end":{"line":589,"column":1}},"line":558},"28":{"name":"(anonymous_28)","decl":{"start":{"line":591,"column":16},"end":{"line":591,"column":17}},"loc":{"start":{"line":591,"column":31},"end":{"line":594,"column":1}},"line":591},"29":{"name":"(anonymous_29)","decl":{"start":{"line":596,"column":26},"end":{"line":596,"column":27}},"loc":{"start":{"line":596,"column":42},"end":{"line":633,"column":1}},"line":596},"30":{"name":"(anonymous_30)","decl":{"start":{"line":603,"column":15},"end":{"line":603,"column":16}},"loc":{"start":{"line":603,"column":30},"end":{"line":630,"column":5}},"line":603}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":48,"column":3}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":48,"column":3}},{"start":{"line":21,"column":2},"end":{"line":48,"column":3}}],"line":21},"1":{"loc":{"start":{"line":23,"column":4},"end":{"line":46,"column":5}},"type":"switch","locations":[{"start":{"line":24,"column":6},"end":{"line":24,"column":24}},{"start":{"line":25,"column":6},"end":{"line":33,"column":14}},{"start":{"line":34,"column":6},"end":{"line":34,"column":22}},{"start":{"line":35,"column":6},"end":{"line":43,"column":14}},{"start":{"line":44,"column":6},"end":{"line":45,"column":72}}],"line":23},"2":{"loc":{"start":{"line":65,"column":2},"end":{"line":67,"column":3}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":67,"column":3}},{"start":{"line":65,"column":2},"end":{"line":67,"column":3}}],"line":65},"3":{"loc":{"start":{"line":69,"column":2},"end":{"line":71,"column":3}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":71,"column":3}},{"start":{"line":69,"column":2},"end":{"line":71,"column":3}}],"line":69},"4":{"loc":{"start":{"line":89,"column":4},"end":{"line":89,"column":70}},"type":"binary-expr","locations":[{"start":{"line":89,"column":4},"end":{"line":89,"column":39}},{"start":{"line":89,"column":43},"end":{"line":89,"column":70}}],"line":89},"5":{"loc":{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":92,"column":2},"end":{"line":94,"column":3}},{"start":{"line":92,"column":2},"end":{"line":94,"column":3}}],"line":92},"6":{"loc":{"start":{"line":92,"column":6},"end":{"line":92,"column":35}},"type":"binary-expr","locations":[{"start":{"line":92,"column":6},"end":{"line":92,"column":11}},{"start":{"line":92,"column":15},"end":{"line":92,"column":35}}],"line":92},"7":{"loc":{"start":{"line":109,"column":2},"end":{"line":111,"column":3}},"type":"if","locations":[{"start":{"line":109,"column":2},"end":{"line":111,"column":3}},{"start":{"line":109,"column":2},"end":{"line":111,"column":3}}],"line":109},"8":{"loc":{"start":{"line":114,"column":2},"end":{"line":160,"column":3}},"type":"if","locations":[{"start":{"line":114,"column":2},"end":{"line":160,"column":3}},{"start":{"line":114,"column":2},"end":{"line":160,"column":3}}],"line":114},"9":{"loc":{"start":{"line":126,"column":4},"end":{"line":151,"column":5}},"type":"if","locations":[{"start":{"line":126,"column":4},"end":{"line":151,"column":5}},{"start":{"line":126,"column":4},"end":{"line":151,"column":5}}],"line":126},"10":{"loc":{"start":{"line":145,"column":8},"end":{"line":149,"column":9}},"type":"if","locations":[{"start":{"line":145,"column":8},"end":{"line":149,"column":9}},{"start":{"line":145,"column":8},"end":{"line":149,"column":9}}],"line":145},"11":{"loc":{"start":{"line":145,"column":12},"end":{"line":145,"column":65}},"type":"binary-expr","locations":[{"start":{"line":145,"column":12},"end":{"line":145,"column":33}},{"start":{"line":145,"column":37},"end":{"line":145,"column":65}}],"line":145},"12":{"loc":{"start":{"line":157,"column":6},"end":{"line":158,"column":40}},"type":"if","locations":[{"start":{"line":157,"column":6},"end":{"line":158,"column":40}},{"start":{"line":157,"column":6},"end":{"line":158,"column":40}}],"line":157},"13":{"loc":{"start":{"line":165,"column":2},"end":{"line":190,"column":3}},"type":"if","locations":[{"start":{"line":165,"column":2},"end":{"line":190,"column":3}},{"start":{"line":165,"column":2},"end":{"line":190,"column":3}}],"line":165},"14":{"loc":{"start":{"line":183,"column":8},"end":{"line":186,"column":9}},"type":"if","locations":[{"start":{"line":183,"column":8},"end":{"line":186,"column":9}},{"start":{"line":183,"column":8},"end":{"line":186,"column":9}}],"line":183},"15":{"loc":{"start":{"line":187,"column":8},"end":{"line":187,"column":79}},"type":"if","locations":[{"start":{"line":187,"column":8},"end":{"line":187,"column":79}},{"start":{"line":187,"column":8},"end":{"line":187,"column":79}}],"line":187},"16":{"loc":{"start":{"line":215,"column":4},"end":{"line":219,"column":8}},"type":"if","locations":[{"start":{"line":215,"column":4},"end":{"line":219,"column":8}},{"start":{"line":215,"column":4},"end":{"line":219,"column":8}}],"line":215},"17":{"loc":{"start":{"line":228,"column":4},"end":{"line":229,"column":36}},"type":"binary-expr","locations":[{"start":{"line":228,"column":4},"end":{"line":228,"column":44}},{"start":{"line":229,"column":4},"end":{"line":229,"column":36}}],"line":228},"18":{"loc":{"start":{"line":232,"column":2},"end":{"line":234,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":234,"column":3}},{"start":{"line":232,"column":2},"end":{"line":234,"column":3}}],"line":232},"19":{"loc":{"start":{"line":248,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":248,"column":2},"end":{"line":250,"column":3}},{"start":{"line":248,"column":2},"end":{"line":250,"column":3}}],"line":248},"20":{"loc":{"start":{"line":252,"column":4},"end":{"line":252,"column":63}},"type":"cond-expr","locations":[{"start":{"line":252,"column":34},"end":{"line":252,"column":58}},{"start":{"line":252,"column":61},"end":{"line":252,"column":63}}],"line":252},"21":{"loc":{"start":{"line":259,"column":2},"end":{"line":280,"column":3}},"type":"if","locations":[{"start":{"line":259,"column":2},"end":{"line":280,"column":3}},{"start":{"line":259,"column":2},"end":{"line":280,"column":3}}],"line":259},"22":{"loc":{"start":{"line":274,"column":6},"end":{"line":278,"column":7}},"type":"if","locations":[{"start":{"line":274,"column":6},"end":{"line":278,"column":7}},{"start":{"line":274,"column":6},"end":{"line":278,"column":7}}],"line":274},"23":{"loc":{"start":{"line":274,"column":10},"end":{"line":274,"column":63}},"type":"binary-expr","locations":[{"start":{"line":274,"column":10},"end":{"line":274,"column":31}},{"start":{"line":274,"column":35},"end":{"line":274,"column":63}}],"line":274},"24":{"loc":{"start":{"line":296,"column":4},"end":{"line":298,"column":5}},"type":"if","locations":[{"start":{"line":296,"column":4},"end":{"line":298,"column":5}},{"start":{"line":296,"column":4},"end":{"line":298,"column":5}}],"line":296},"25":{"loc":{"start":{"line":310,"column":4},"end":{"line":317,"column":5}},"type":"if","locations":[{"start":{"line":310,"column":4},"end":{"line":317,"column":5}},{"start":{"line":310,"column":4},"end":{"line":317,"column":5}}],"line":310},"26":{"loc":{"start":{"line":334,"column":19},"end":{"line":336,"column":34}},"type":"cond-expr","locations":[{"start":{"line":335,"column":6},"end":{"line":335,"column":42}},{"start":{"line":336,"column":6},"end":{"line":336,"column":34}}],"line":334},"27":{"loc":{"start":{"line":337,"column":2},"end":{"line":339,"column":3}},"type":"if","locations":[{"start":{"line":337,"column":2},"end":{"line":339,"column":3}},{"start":{"line":337,"column":2},"end":{"line":339,"column":3}}],"line":337},"28":{"loc":{"start":{"line":342,"column":2},"end":{"line":348,"column":3}},"type":"if","locations":[{"start":{"line":342,"column":2},"end":{"line":348,"column":3}},{"start":{"line":342,"column":2},"end":{"line":348,"column":3}}],"line":342},"29":{"loc":{"start":{"line":354,"column":4},"end":{"line":371,"column":5}},"type":"if","locations":[{"start":{"line":354,"column":4},"end":{"line":371,"column":5}},{"start":{"line":354,"column":4},"end":{"line":371,"column":5}}],"line":354},"30":{"loc":{"start":{"line":354,"column":8},"end":{"line":354,"column":64}},"type":"binary-expr","locations":[{"start":{"line":354,"column":8},"end":{"line":354,"column":33}},{"start":{"line":354,"column":37},"end":{"line":354,"column":64}}],"line":354},"31":{"loc":{"start":{"line":360,"column":18},"end":{"line":360,"column":55}},"type":"cond-expr","locations":[{"start":{"line":360,"column":46},"end":{"line":360,"column":49}},{"start":{"line":360,"column":52},"end":{"line":360,"column":55}}],"line":360},"32":{"loc":{"start":{"line":375,"column":4},"end":{"line":380,"column":5}},"type":"if","locations":[{"start":{"line":375,"column":4},"end":{"line":380,"column":5}},{"start":{"line":375,"column":4},"end":{"line":380,"column":5}}],"line":375},"33":{"loc":{"start":{"line":434,"column":2},"end":{"line":436,"column":3}},"type":"if","locations":[{"start":{"line":434,"column":2},"end":{"line":436,"column":3}},{"start":{"line":434,"column":2},"end":{"line":436,"column":3}}],"line":434},"34":{"loc":{"start":{"line":438,"column":2},"end":{"line":439,"column":80}},"type":"if","locations":[{"start":{"line":438,"column":2},"end":{"line":439,"column":80}},{"start":{"line":438,"column":2},"end":{"line":439,"column":80}}],"line":438},"35":{"loc":{"start":{"line":439,"column":52},"end":{"line":439,"column":78}},"type":"binary-expr","locations":[{"start":{"line":439,"column":52},"end":{"line":439,"column":71}},{"start":{"line":439,"column":75},"end":{"line":439,"column":78}}],"line":439},"36":{"loc":{"start":{"line":448,"column":2},"end":{"line":473,"column":3}},"type":"if","locations":[{"start":{"line":448,"column":2},"end":{"line":473,"column":3}},{"start":{"line":448,"column":2},"end":{"line":473,"column":3}}],"line":448},"37":{"loc":{"start":{"line":463,"column":4},"end":{"line":465,"column":5}},"type":"if","locations":[{"start":{"line":463,"column":4},"end":{"line":465,"column":5}},{"start":{"line":463,"column":4},"end":{"line":465,"column":5}}],"line":463},"38":{"loc":{"start":{"line":467,"column":4},"end":{"line":472,"column":5}},"type":"if","locations":[{"start":{"line":467,"column":4},"end":{"line":472,"column":5}},{"start":{"line":467,"column":4},"end":{"line":472,"column":5}}],"line":467},"39":{"loc":{"start":{"line":470,"column":8},"end":{"line":470,"column":34}},"type":"binary-expr","locations":[{"start":{"line":470,"column":8},"end":{"line":470,"column":27}},{"start":{"line":470,"column":31},"end":{"line":470,"column":34}}],"line":470},"40":{"loc":{"start":{"line":481,"column":2},"end":{"line":483,"column":3}},"type":"if","locations":[{"start":{"line":481,"column":2},"end":{"line":483,"column":3}},{"start":{"line":481,"column":2},"end":{"line":483,"column":3}}],"line":481},"41":{"loc":{"start":{"line":500,"column":2},"end":{"line":502,"column":3}},"type":"if","locations":[{"start":{"line":500,"column":2},"end":{"line":502,"column":3}},{"start":{"line":500,"column":2},"end":{"line":502,"column":3}}],"line":500},"42":{"loc":{"start":{"line":504,"column":2},"end":{"line":508,"column":6}},"type":"if","locations":[{"start":{"line":504,"column":2},"end":{"line":508,"column":6}},{"start":{"line":504,"column":2},"end":{"line":508,"column":6}}],"line":504},"43":{"loc":{"start":{"line":507,"column":6},"end":{"line":507,"column":32}},"type":"binary-expr","locations":[{"start":{"line":507,"column":6},"end":{"line":507,"column":25}},{"start":{"line":507,"column":29},"end":{"line":507,"column":32}}],"line":507},"44":{"loc":{"start":{"line":517,"column":2},"end":{"line":538,"column":3}},"type":"if","locations":[{"start":{"line":517,"column":2},"end":{"line":538,"column":3}},{"start":{"line":517,"column":2},"end":{"line":538,"column":3}}],"line":517},"45":{"loc":{"start":{"line":532,"column":4},"end":{"line":537,"column":5}},"type":"if","locations":[{"start":{"line":532,"column":4},"end":{"line":537,"column":5}},{"start":{"line":532,"column":4},"end":{"line":537,"column":5}}],"line":532},"46":{"loc":{"start":{"line":535,"column":8},"end":{"line":535,"column":34}},"type":"binary-expr","locations":[{"start":{"line":535,"column":8},"end":{"line":535,"column":27}},{"start":{"line":535,"column":31},"end":{"line":535,"column":34}}],"line":535},"47":{"loc":{"start":{"line":547,"column":2},"end":{"line":549,"column":3}},"type":"if","locations":[{"start":{"line":547,"column":2},"end":{"line":549,"column":3}},{"start":{"line":547,"column":2},"end":{"line":549,"column":3}}],"line":547},"48":{"loc":{"start":{"line":559,"column":2},"end":{"line":564,"column":3}},"type":"if","locations":[{"start":{"line":559,"column":2},"end":{"line":564,"column":3}},{"start":{"line":559,"column":2},"end":{"line":564,"column":3}}],"line":559},"49":{"loc":{"start":{"line":568,"column":2},"end":{"line":587,"column":3}},"type":"switch","locations":[{"start":{"line":569,"column":4},"end":{"line":572,"column":12}},{"start":{"line":573,"column":4},"end":{"line":576,"column":12}},{"start":{"line":577,"column":4},"end":{"line":580,"column":12}},{"start":{"line":581,"column":4},"end":{"line":584,"column":12}},{"start":{"line":585,"column":4},"end":{"line":586,"column":63}}],"line":568},"50":{"loc":{"start":{"line":597,"column":2},"end":{"line":600,"column":3}},"type":"if","locations":[{"start":{"line":597,"column":2},"end":{"line":600,"column":3}},{"start":{"line":597,"column":2},"end":{"line":600,"column":3}}],"line":597},"51":{"loc":{"start":{"line":597,"column":6},"end":{"line":597,"column":50}},"type":"binary-expr","locations":[{"start":{"line":597,"column":6},"end":{"line":597,"column":28}},{"start":{"line":597,"column":32},"end":{"line":597,"column":50}}],"line":597},"52":{"loc":{"start":{"line":605,"column":8},"end":{"line":612,"column":9}},"type":"if","locations":[{"start":{"line":605,"column":8},"end":{"line":612,"column":9}},{"start":{"line":605,"column":8},"end":{"line":612,"column":9}}],"line":605},"53":{"loc":{"start":{"line":622,"column":10},"end":{"line":626,"column":17}},"type":"cond-expr","locations":[{"start":{"line":623,"column":14},"end":{"line":623,"column":35}},{"start":{"line":624,"column":14},"end":{"line":626,"column":17}}],"line":622},"54":{"loc":{"start":{"line":624,"column":14},"end":{"line":626,"column":17}},"type":"cond-expr","locations":[{"start":{"line":625,"column":14},"end":{"line":625,"column":24}},{"start":{"line":626,"column":14},"end":{"line":626,"column":17}}],"line":624},"55":{"loc":{"start":{"line":627,"column":10},"end":{"line":627,"column":69}},"type":"binary-expr","locations":[{"start":{"line":627,"column":10},"end":{"line":627,"column":23}},{"start":{"line":627,"column":27},"end":{"line":627,"column":69}}],"line":627}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":7,"8":7,"9":7,"10":5,"11":5,"12":5,"13":5,"14":5,"15":2,"16":2,"17":2,"18":2,"19":2,"20":0,"21":7,"22":0,"23":1,"24":3,"25":3,"26":3,"27":3,"28":3,"29":0,"30":3,"31":3,"32":0,"33":3,"34":1,"35":3,"36":3,"37":3,"38":3,"39":0,"40":3,"41":3,"42":3,"43":3,"44":0,"45":3,"46":3,"47":3,"48":15,"49":3,"50":3,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":3,"64":9,"65":6,"66":3,"67":3,"68":3,"69":6,"70":6,"71":6,"72":6,"73":6,"74":0,"75":6,"76":6,"77":3,"78":9,"79":9,"80":9,"81":9,"82":9,"83":3,"84":9,"85":0,"86":1,"87":3,"88":3,"89":3,"90":0,"91":3,"92":3,"93":3,"94":3,"95":3,"96":0,"97":3,"98":3,"99":3,"100":3,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":3,"113":3,"114":3,"115":15,"116":3,"117":3,"118":3,"119":12,"120":12,"121":3,"122":3,"123":12,"124":3,"125":3,"126":6,"127":9,"128":12,"129":3,"130":1,"131":3,"132":3,"133":0,"134":3,"135":3,"136":3,"137":9,"138":0,"139":3,"140":3,"141":9,"142":6,"143":6,"144":6,"145":6,"146":6,"147":3,"148":3,"149":6,"150":0,"151":1,"152":3,"153":3,"154":3,"155":3,"156":3,"157":3,"158":3,"159":3,"160":3,"161":3,"162":1,"163":2,"164":2,"165":1,"166":1,"167":1,"168":1,"169":1,"170":0,"171":1,"172":0,"173":1,"174":1,"175":1,"176":2,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":0,"184":1,"185":0,"186":1,"187":1,"188":1,"189":1,"190":0,"191":1,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":0,"199":1,"200":0,"201":1,"202":1,"203":1,"204":2,"205":1,"206":1,"207":1,"208":1,"209":1,"210":1,"211":0,"212":1,"213":1,"214":1,"215":1,"216":0,"217":1,"218":1,"219":1,"220":7,"221":0,"222":7,"223":7,"224":3,"225":3,"226":3,"227":2,"228":2,"229":2,"230":1,"231":1,"232":1,"233":1,"234":1,"235":1,"236":0,"237":7,"238":1,"239":7,"240":7,"241":1,"242":1,"243":0,"244":0,"245":1,"246":2,"247":2,"248":0,"249":2,"250":0,"251":1,"252":1},"f":{"0":7,"1":3,"2":3,"3":15,"4":0,"5":0,"6":9,"7":6,"8":9,"9":9,"10":3,"11":0,"12":3,"13":15,"14":12,"15":12,"16":6,"17":3,"18":9,"19":9,"20":6,"21":3,"22":2,"23":1,"24":2,"25":1,"26":2,"27":7,"28":7,"29":1,"30":2},"b":{"0":[7,0],"1":[3,5,1,2,0],"2":[0,3],"3":[0,3],"4":[3,3],"5":[0,3],"6":[3,0],"7":[0,3],"8":[3,0],"9":[0,3],"10":[0,0],"11":[0,0],"12":[6,3],"13":[3,0],"14":[0,6],"15":[6,0],"16":[0,9],"17":[3,3],"18":[0,3],"19":[0,3],"20":[3,0],"21":[0,3],"22":[0,0],"23":[0,0],"24":[12,0],"25":[3,9],"26":[0,3],"27":[0,3],"28":[3,0],"29":[6,3],"30":[9,6],"31":[3,3],"32":[0,6],"33":[0,1],"34":[0,1],"35":[0,0],"36":[1,0],"37":[0,1],"38":[0,1],"39":[0,0],"40":[0,1],"41":[0,1],"42":[0,1],"43":[0,0],"44":[1,0],"45":[0,1],"46":[0,0],"47":[0,1],"48":[0,7],"49":[3,2,1,1,0],"50":[0,1],"51":[1,1],"52":[0,2],"53":[0,0],"54":[0,0],"55":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"88198f1b33ffd6be1c9bdd012598342527d6773e"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\active_campaign\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\active_campaign\\util.js","statementMap":{"0":{"start":{"line":3,"column":4},"end":{"line":3,"column":51}},"1":{"start":{"line":4,"column":24},"end":{"line":4,"column":45}},"2":{"start":{"line":6,"column":21},"end":{"line":18,"column":1}},"3":{"start":{"line":7,"column":2},"end":{"line":17,"column":3}},"4":{"start":{"line":8,"column":4},"end":{"line":13,"column":6}},"5":{"start":{"line":15,"column":22},"end":{"line":15,"column":52}},"6":{"start":{"line":16,"column":4},"end":{"line":16,"column":79}},"7":{"start":{"line":20,"column":0},"end":{"line":20,"column":34}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":21},"end":{"line":6,"column":22}},"loc":{"start":{"line":6,"column":39},"end":{"line":18,"column":1}},"line":6}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":2},"end":{"line":17,"column":3}},"type":"if","locations":[{"start":{"line":7,"column":2},"end":{"line":17,"column":3}},{"start":{"line":7,"column":2},"end":{"line":17,"column":3}}],"line":7},"1":{"loc":{"start":{"line":12,"column":6},"end":{"line":12,"column":32}},"type":"binary-expr","locations":[{"start":{"line":12,"column":6},"end":{"line":12,"column":25}},{"start":{"line":12,"column":29},"end":{"line":12,"column":32}}],"line":12}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":1},"f":{"0":0},"b":{"0":[0,0],"1":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"569bc2ec95ddd75f8baf9b5b9bc5465176df3e38"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\adj\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\adj\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":21},"end":{"line":3,"column":51}},"2":{"start":{"line":5,"column":26},"end":{"line":7,"column":1}},"3":{"start":{"line":8,"column":23},"end":{"line":8,"column":69}},"4":{"start":{"line":10,"column":0},"end":{"line":14,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"6e5075566ef2cbd4509ed7be59e6178fbc30a5df"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\adj\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\adj\\transform.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":51}},"1":{"start":{"line":2,"column":60},"end":{"line":2,"column":79}},"2":{"start":{"line":14,"column":4},"end":{"line":14,"column":25}},"3":{"start":{"line":16,"column":21},"end":{"line":16,"column":44}},"4":{"start":{"line":19,"column":18},"end":{"line":19,"column":74}},"5":{"start":{"line":20,"column":52},"end":{"line":20,"column":70}},"6":{"start":{"line":21,"column":19},"end":{"line":21,"column":46}},"7":{"start":{"line":22,"column":2},"end":{"line":28,"column":3}},"8":{"start":{"line":27,"column":4},"end":{"line":27,"column":62}},"9":{"start":{"line":29,"column":2},"end":{"line":37,"column":3}},"10":{"start":{"line":30,"column":4},"end":{"line":30,"column":24}},"11":{"start":{"line":31,"column":4},"end":{"line":31,"column":24}},"12":{"start":{"line":32,"column":9},"end":{"line":37,"column":3}},"13":{"start":{"line":33,"column":4},"end":{"line":33,"column":30}},"14":{"start":{"line":34,"column":4},"end":{"line":34,"column":28}},"15":{"start":{"line":36,"column":4},"end":{"line":36,"column":56}},"16":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"17":{"start":{"line":39,"column":4},"end":{"line":39,"column":60}},"18":{"start":{"line":41,"column":18},"end":{"line":41,"column":71}},"19":{"start":{"line":42,"column":2},"end":{"line":67,"column":3}},"20":{"start":{"line":43,"column":21},"end":{"line":43,"column":43}},"21":{"start":{"line":44,"column":4},"end":{"line":46,"column":6}},"22":{"start":{"line":47,"column":4},"end":{"line":56,"column":5}},"23":{"start":{"line":48,"column":6},"end":{"line":50,"column":9}},"24":{"start":{"line":49,"column":8},"end":{"line":49,"column":52}},"25":{"start":{"line":51,"column":6},"end":{"line":53,"column":8}},"26":{"start":{"line":55,"column":6},"end":{"line":55,"column":37}},"27":{"start":{"line":58,"column":4},"end":{"line":58,"column":37}},"28":{"start":{"line":59,"column":4},"end":{"line":59,"column":61}},"29":{"start":{"line":60,"column":4},"end":{"line":60,"column":42}},"30":{"start":{"line":61,"column":4},"end":{"line":61,"column":20}},"31":{"start":{"line":62,"column":4},"end":{"line":62,"column":33}},"32":{"start":{"line":63,"column":4},"end":{"line":63,"column":49}},"33":{"start":{"line":64,"column":4},"end":{"line":64,"column":65}},"34":{"start":{"line":65,"column":4},"end":{"line":65,"column":60}},"35":{"start":{"line":66,"column":4},"end":{"line":66,"column":20}},"36":{"start":{"line":69,"column":2},"end":{"line":73,"column":3}},"37":{"start":{"line":70,"column":4},"end":{"line":70,"column":71}},"38":{"start":{"line":72,"column":4},"end":{"line":72,"column":67}},"39":{"start":{"line":76,"column":21},"end":{"line":95,"column":1}},"40":{"start":{"line":77,"column":2},"end":{"line":82,"column":3}},"41":{"start":{"line":78,"column":4},"end":{"line":81,"column":6}},"42":{"start":{"line":83,"column":22},"end":{"line":83,"column":48}},"43":{"start":{"line":85,"column":2},"end":{"line":91,"column":3}},"44":{"start":{"line":87,"column":6},"end":{"line":87,"column":41}},"45":{"start":{"line":88,"column":6},"end":{"line":88,"column":12}},"46":{"start":{"line":90,"column":6},"end":{"line":90,"column":63}},"47":{"start":{"line":94,"column":2},"end":{"line":94,"column":63}},"48":{"start":{"line":97,"column":16},"end":{"line":99,"column":1}},"49":{"start":{"line":98,"column":2},"end":{"line":98,"column":56}},"50":{"start":{"line":100,"column":26},"end":{"line":137,"column":1}},"51":{"start":{"line":101,"column":2},"end":{"line":104,"column":3}},"52":{"start":{"line":102,"column":23},"end":{"line":102,"column":75}},"53":{"start":{"line":103,"column":4},"end":{"line":103,"column":24}},"54":{"start":{"line":106,"column":19},"end":{"line":135,"column":3}},"55":{"start":{"line":108,"column":6},"end":{"line":133,"column":7}},"56":{"start":{"line":109,"column":8},"end":{"line":116,"column":9}},"57":{"start":{"line":111,"column":10},"end":{"line":115,"column":12}},"58":{"start":{"line":118,"column":8},"end":{"line":122,"column":10}},"59":{"start":{"line":124,"column":8},"end":{"line":132,"column":10}},"60":{"start":{"line":136,"column":2},"end":{"line":136,"column":18}},"61":{"start":{"line":139,"column":0},"end":{"line":139,"column":48}}},"fnMap":{"0":{"name":"responseBuilderSimple","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":30}},"loc":{"start":{"line":18,"column":63},"end":{"line":74,"column":1}},"line":18},"1":{"name":"(anonymous_1)","decl":{"start":{"line":48,"column":27},"end":{"line":48,"column":28}},"loc":{"start":{"line":48,"column":42},"end":{"line":50,"column":7}},"line":48},"2":{"name":"(anonymous_2)","decl":{"start":{"line":76,"column":21},"end":{"line":76,"column":22}},"loc":{"start":{"line":76,"column":47},"end":{"line":95,"column":1}},"line":76},"3":{"name":"(anonymous_3)","decl":{"start":{"line":97,"column":16},"end":{"line":97,"column":17}},"loc":{"start":{"line":97,"column":25},"end":{"line":99,"column":1}},"line":97},"4":{"name":"(anonymous_4)","decl":{"start":{"line":100,"column":26},"end":{"line":100,"column":27}},"loc":{"start":{"line":100,"column":42},"end":{"line":137,"column":1}},"line":100},"5":{"name":"(anonymous_5)","decl":{"start":{"line":107,"column":15},"end":{"line":107,"column":16}},"loc":{"start":{"line":107,"column":30},"end":{"line":134,"column":5}},"line":107}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":2},"end":{"line":28,"column":3}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":28,"column":3}},{"start":{"line":22,"column":2},"end":{"line":28,"column":3}}],"line":22},"1":{"loc":{"start":{"line":23,"column":4},"end":{"line":25,"column":30}},"type":"binary-expr","locations":[{"start":{"line":23,"column":4},"end":{"line":23,"column":27}},{"start":{"line":24,"column":4},"end":{"line":24,"column":32}},{"start":{"line":25,"column":4},"end":{"line":25,"column":30}}],"line":23},"2":{"loc":{"start":{"line":29,"column":2},"end":{"line":37,"column":3}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":37,"column":3}},{"start":{"line":29,"column":2},"end":{"line":37,"column":3}}],"line":29},"3":{"loc":{"start":{"line":32,"column":9},"end":{"line":37,"column":3}},"type":"if","locations":[{"start":{"line":32,"column":9},"end":{"line":37,"column":3}},{"start":{"line":32,"column":9},"end":{"line":37,"column":3}}],"line":32},"4":{"loc":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},{"start":{"line":38,"column":2},"end":{"line":40,"column":3}}],"line":38},"5":{"loc":{"start":{"line":39,"column":23},"end":{"line":39,"column":59}},"type":"binary-expr","locations":[{"start":{"line":39,"column":23},"end":{"line":39,"column":50}},{"start":{"line":39,"column":54},"end":{"line":39,"column":59}}],"line":39},"6":{"loc":{"start":{"line":42,"column":2},"end":{"line":67,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":67,"column":3}},{"start":{"line":42,"column":2},"end":{"line":67,"column":3}}],"line":42},"7":{"loc":{"start":{"line":42,"column":6},"end":{"line":42,"column":56}},"type":"binary-expr","locations":[{"start":{"line":42,"column":6},"end":{"line":42,"column":13}},{"start":{"line":42,"column":17},"end":{"line":42,"column":30}},{"start":{"line":42,"column":34},"end":{"line":42,"column":56}}],"line":42},"8":{"loc":{"start":{"line":47,"column":4},"end":{"line":56,"column":5}},"type":"if","locations":[{"start":{"line":47,"column":4},"end":{"line":56,"column":5}},{"start":{"line":47,"column":4},"end":{"line":56,"column":5}}],"line":47},"9":{"loc":{"start":{"line":64,"column":26},"end":{"line":64,"column":64}},"type":"cond-expr","locations":[{"start":{"line":64,"column":40},"end":{"line":64,"column":52}},{"start":{"line":64,"column":55},"end":{"line":64,"column":64}}],"line":64},"10":{"loc":{"start":{"line":69,"column":2},"end":{"line":73,"column":3}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":73,"column":3}},{"start":{"line":69,"column":2},"end":{"line":73,"column":3}}],"line":69},"11":{"loc":{"start":{"line":69,"column":6},"end":{"line":69,"column":47}},"type":"binary-expr","locations":[{"start":{"line":69,"column":6},"end":{"line":69,"column":20}},{"start":{"line":69,"column":24},"end":{"line":69,"column":47}}],"line":69},"12":{"loc":{"start":{"line":77,"column":2},"end":{"line":82,"column":3}},"type":"if","locations":[{"start":{"line":77,"column":2},"end":{"line":82,"column":3}},{"start":{"line":77,"column":2},"end":{"line":82,"column":3}}],"line":77},"13":{"loc":{"start":{"line":85,"column":2},"end":{"line":91,"column":3}},"type":"switch","locations":[{"start":{"line":86,"column":4},"end":{"line":88,"column":12}},{"start":{"line":89,"column":4},"end":{"line":90,"column":63}}],"line":85},"14":{"loc":{"start":{"line":101,"column":2},"end":{"line":104,"column":3}},"type":"if","locations":[{"start":{"line":101,"column":2},"end":{"line":104,"column":3}},{"start":{"line":101,"column":2},"end":{"line":104,"column":3}}],"line":101},"15":{"loc":{"start":{"line":101,"column":6},"end":{"line":101,"column":50}},"type":"binary-expr","locations":[{"start":{"line":101,"column":6},"end":{"line":101,"column":28}},{"start":{"line":101,"column":32},"end":{"line":101,"column":50}}],"line":101},"16":{"loc":{"start":{"line":109,"column":8},"end":{"line":116,"column":9}},"type":"if","locations":[{"start":{"line":109,"column":8},"end":{"line":116,"column":9}},{"start":{"line":109,"column":8},"end":{"line":116,"column":9}}],"line":109},"17":{"loc":{"start":{"line":126,"column":10},"end":{"line":130,"column":17}},"type":"cond-expr","locations":[{"start":{"line":127,"column":14},"end":{"line":127,"column":35}},{"start":{"line":128,"column":14},"end":{"line":130,"column":17}}],"line":126},"18":{"loc":{"start":{"line":128,"column":14},"end":{"line":130,"column":17}},"type":"cond-expr","locations":[{"start":{"line":129,"column":14},"end":{"line":129,"column":24}},{"start":{"line":130,"column":14},"end":{"line":130,"column":17}}],"line":128},"19":{"loc":{"start":{"line":131,"column":10},"end":{"line":131,"column":69}},"type":"binary-expr","locations":[{"start":{"line":131,"column":10},"end":{"line":131,"column":23}},{"start":{"line":131,"column":27},"end":{"line":131,"column":69}}],"line":131}},"s":{"0":1,"1":1,"2":1,"3":1,"4":16,"5":15,"6":15,"7":15,"8":1,"9":14,"10":7,"11":7,"12":7,"13":6,"14":6,"15":1,"16":13,"17":10,"18":13,"19":13,"20":12,"21":12,"22":12,"23":9,"24":18,"25":9,"26":3,"27":12,"28":12,"29":12,"30":12,"31":12,"32":12,"33":12,"34":12,"35":12,"36":1,"37":1,"38":0,"39":1,"40":18,"41":1,"42":17,"43":17,"44":16,"45":16,"46":1,"47":16,"48":1,"49":18,"50":1,"51":1,"52":0,"53":0,"54":1,"55":2,"56":2,"57":0,"58":2,"59":0,"60":1,"61":1},"f":{"0":16,"1":18,"2":18,"3":18,"4":1,"5":2},"b":{"0":[1,14],"1":[15,15,14],"2":[7,7],"3":[6,1],"4":[10,3],"5":[10,3],"6":[12,1],"7":[13,13,13],"8":[9,3],"9":[10,2],"10":[1,0],"11":[1,1],"12":[1,17],"13":[16,1],"14":[0,1],"15":[1,1],"16":[0,2],"17":[0,0],"18":[0,0],"19":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4406a5bc9e2b02b382bf4489d44cb95ed6912ddd"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\airship\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\airship\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":20},"end":{"line":3,"column":49}},"2":{"start":{"line":4,"column":20},"end":{"line":4,"column":43}},"3":{"start":{"line":6,"column":26},"end":{"line":19,"column":1}},"4":{"start":{"line":21,"column":32},"end":{"line":30,"column":1}},"5":{"start":{"line":32,"column":32},"end":{"line":42,"column":1}},"6":{"start":{"line":44,"column":23},"end":{"line":44,"column":69}},"7":{"start":{"line":46,"column":0},"end":{"line":56,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"de4725f7429e191ca0d3edc1b2d09e7d9c5e7694"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\airship\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\airship\\transform.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":51}},"1":{"start":{"line":11,"column":4},"end":{"line":11,"column":23}},"2":{"start":{"line":26,"column":4},"end":{"line":26,"column":25}},"3":{"start":{"line":28,"column":32},"end":{"line":128,"column":1}},"4":{"start":{"line":29,"column":21},"end":{"line":29,"column":63}},"5":{"start":{"line":30,"column":33},"end":{"line":30,"column":39}},"6":{"start":{"line":32,"column":2},"end":{"line":36,"column":6}},"7":{"start":{"line":33,"column":4},"end":{"line":36,"column":6}},"8":{"start":{"line":38,"column":17},"end":{"line":38,"column":28}},"9":{"start":{"line":40,"column":2},"end":{"line":40,"column":49}},"10":{"start":{"line":42,"column":17},"end":{"line":42,"column":73}},"11":{"start":{"line":43,"column":2},"end":{"line":48,"column":3}},"12":{"start":{"line":44,"column":4},"end":{"line":47,"column":6}},"13":{"start":{"line":51,"column":2},"end":{"line":51,"column":51}},"14":{"start":{"line":52,"column":2},"end":{"line":52,"column":54}},"15":{"start":{"line":53,"column":18},"end":{"line":53,"column":64}},"16":{"start":{"line":54,"column":2},"end":{"line":54,"column":74}},"17":{"start":{"line":57,"column":27},"end":{"line":57,"column":29}},"18":{"start":{"line":58,"column":2},"end":{"line":58,"column":35}},"19":{"start":{"line":59,"column":2},"end":{"line":84,"column":5}},"20":{"start":{"line":61,"column":4},"end":{"line":69,"column":5}},"21":{"start":{"line":62,"column":18},"end":{"line":62,"column":55}},"22":{"start":{"line":63,"column":6},"end":{"line":65,"column":7}},"23":{"start":{"line":64,"column":8},"end":{"line":64,"column":57}},"24":{"start":{"line":66,"column":6},"end":{"line":68,"column":7}},"25":{"start":{"line":67,"column":8},"end":{"line":67,"column":60}},"26":{"start":{"line":71,"column":4},"end":{"line":83,"column":5}},"27":{"start":{"line":72,"column":24},"end":{"line":72,"column":26}},"28":{"start":{"line":73,"column":6},"end":{"line":73,"column":31}},"29":{"start":{"line":74,"column":24},"end":{"line":74,"column":66}},"30":{"start":{"line":75,"column":6},"end":{"line":79,"column":7}},"31":{"start":{"line":76,"column":8},"end":{"line":76,"column":34}},"32":{"start":{"line":78,"column":8},"end":{"line":78,"column":48}},"33":{"start":{"line":80,"column":6},"end":{"line":80,"column":36}},"34":{"start":{"line":81,"column":6},"end":{"line":81,"column":38}},"35":{"start":{"line":82,"column":6},"end":{"line":82,"column":50}},"36":{"start":{"line":88,"column":23},"end":{"line":88,"column":25}},"37":{"start":{"line":90,"column":2},"end":{"line":107,"column":3}},"38":{"start":{"line":94,"column":4},"end":{"line":94,"column":78}},"39":{"start":{"line":94,"column":56},"end":{"line":94,"column":78}},"40":{"start":{"line":95,"column":4},"end":{"line":96,"column":31}},"41":{"start":{"line":96,"column":6},"end":{"line":96,"column":31}},"42":{"start":{"line":97,"column":4},"end":{"line":97,"column":41}},"43":{"start":{"line":98,"column":4},"end":{"line":98,"column":62}},"44":{"start":{"line":99,"column":4},"end":{"line":103,"column":6}},"45":{"start":{"line":104,"column":4},"end":{"line":104,"column":64}},"46":{"start":{"line":105,"column":4},"end":{"line":105,"column":69}},"47":{"start":{"line":106,"column":4},"end":{"line":106,"column":35}},"48":{"start":{"line":109,"column":2},"end":{"line":125,"column":3}},"49":{"start":{"line":110,"column":4},"end":{"line":110,"column":47}},"50":{"start":{"line":111,"column":4},"end":{"line":114,"column":19}},"51":{"start":{"line":115,"column":4},"end":{"line":119,"column":6}},"52":{"start":{"line":120,"column":4},"end":{"line":120,"column":70}},"53":{"start":{"line":121,"column":4},"end":{"line":123,"column":6}},"54":{"start":{"line":124,"column":4},"end":{"line":124,"column":41}},"55":{"start":{"line":127,"column":2},"end":{"line":127,"column":22}},"56":{"start":{"line":130,"column":29},"end":{"line":188,"column":1}},"57":{"start":{"line":131,"column":13},"end":{"line":131,"column":26}},"58":{"start":{"line":132,"column":2},"end":{"line":134,"column":3}},"59":{"start":{"line":133,"column":4},"end":{"line":133,"column":67}},"60":{"start":{"line":136,"column":2},"end":{"line":136,"column":28}},"61":{"start":{"line":137,"column":18},"end":{"line":137,"column":57}},"62":{"start":{"line":138,"column":19},"end":{"line":138,"column":21}},"63":{"start":{"line":139,"column":2},"end":{"line":144,"column":4}},"64":{"start":{"line":145,"column":2},"end":{"line":147,"column":3}},"65":{"start":{"line":146,"column":4},"end":{"line":146,"column":36}},"66":{"start":{"line":149,"column":2},"end":{"line":149,"column":43}},"67":{"start":{"line":150,"column":2},"end":{"line":152,"column":3}},"68":{"start":{"line":151,"column":4},"end":{"line":151,"column":39}},"69":{"start":{"line":153,"column":41},"end":{"line":153,"column":47}},"70":{"start":{"line":155,"column":2},"end":{"line":166,"column":3}},"71":{"start":{"line":156,"column":4},"end":{"line":165,"column":8}},"72":{"start":{"line":157,"column":6},"end":{"line":160,"column":8}},"73":{"start":{"line":162,"column":6},"end":{"line":165,"column":8}},"74":{"start":{"line":167,"column":17},"end":{"line":167,"column":28}},"75":{"start":{"line":169,"column":2},"end":{"line":169,"column":49}},"76":{"start":{"line":171,"column":19},"end":{"line":171,"column":41}},"77":{"start":{"line":172,"column":20},"end":{"line":172,"column":66}},"78":{"start":{"line":173,"column":2},"end":{"line":173,"column":56}},"79":{"start":{"line":173,"column":17},"end":{"line":173,"column":56}},"80":{"start":{"line":174,"column":2},"end":{"line":174,"column":31}},"81":{"start":{"line":175,"column":2},"end":{"line":175,"column":57}},"82":{"start":{"line":176,"column":2},"end":{"line":181,"column":4}},"83":{"start":{"line":183,"column":2},"end":{"line":183,"column":54}},"84":{"start":{"line":184,"column":2},"end":{"line":184,"column":59}},"85":{"start":{"line":185,"column":2},"end":{"line":185,"column":31}},"86":{"start":{"line":186,"column":2},"end":{"line":186,"column":36}},"87":{"start":{"line":187,"column":2},"end":{"line":187,"column":18}},"88":{"start":{"line":190,"column":29},"end":{"line":289,"column":1}},"89":{"start":{"line":191,"column":21},"end":{"line":191,"column":60}},"90":{"start":{"line":192,"column":33},"end":{"line":192,"column":39}},"91":{"start":{"line":194,"column":2},"end":{"line":198,"column":6}},"92":{"start":{"line":195,"column":4},"end":{"line":198,"column":6}},"93":{"start":{"line":200,"column":17},"end":{"line":200,"column":28}},"94":{"start":{"line":202,"column":2},"end":{"line":202,"column":49}},"95":{"start":{"line":204,"column":17},"end":{"line":204,"column":73}},"96":{"start":{"line":205,"column":2},"end":{"line":210,"column":3}},"97":{"start":{"line":206,"column":4},"end":{"line":209,"column":6}},"98":{"start":{"line":212,"column":2},"end":{"line":212,"column":57}},"99":{"start":{"line":213,"column":2},"end":{"line":213,"column":60}},"100":{"start":{"line":214,"column":18},"end":{"line":214,"column":64}},"101":{"start":{"line":215,"column":2},"end":{"line":215,"column":74}},"102":{"start":{"line":217,"column":27},"end":{"line":217,"column":29}},"103":{"start":{"line":218,"column":2},"end":{"line":218,"column":35}},"104":{"start":{"line":219,"column":2},"end":{"line":244,"column":5}},"105":{"start":{"line":221,"column":4},"end":{"line":229,"column":5}},"106":{"start":{"line":222,"column":18},"end":{"line":222,"column":55}},"107":{"start":{"line":223,"column":6},"end":{"line":225,"column":7}},"108":{"start":{"line":224,"column":8},"end":{"line":224,"column":63}},"109":{"start":{"line":226,"column":6},"end":{"line":228,"column":7}},"110":{"start":{"line":227,"column":8},"end":{"line":227,"column":66}},"111":{"start":{"line":231,"column":4},"end":{"line":243,"column":5}},"112":{"start":{"line":232,"column":24},"end":{"line":232,"column":26}},"113":{"start":{"line":233,"column":6},"end":{"line":233,"column":31}},"114":{"start":{"line":234,"column":24},"end":{"line":234,"column":66}},"115":{"start":{"line":235,"column":6},"end":{"line":239,"column":7}},"116":{"start":{"line":236,"column":8},"end":{"line":236,"column":34}},"117":{"start":{"line":238,"column":8},"end":{"line":238,"column":48}},"118":{"start":{"line":240,"column":6},"end":{"line":240,"column":36}},"119":{"start":{"line":241,"column":6},"end":{"line":241,"column":38}},"120":{"start":{"line":242,"column":6},"end":{"line":242,"column":50}},"121":{"start":{"line":248,"column":23},"end":{"line":248,"column":25}},"122":{"start":{"line":250,"column":2},"end":{"line":269,"column":3}},"123":{"start":{"line":254,"column":4},"end":{"line":255,"column":28}},"124":{"start":{"line":255,"column":6},"end":{"line":255,"column":28}},"125":{"start":{"line":256,"column":4},"end":{"line":257,"column":31}},"126":{"start":{"line":257,"column":6},"end":{"line":257,"column":31}},"127":{"start":{"line":259,"column":4},"end":{"line":259,"column":41}},"128":{"start":{"line":260,"column":4},"end":{"line":260,"column":62}},"129":{"start":{"line":261,"column":4},"end":{"line":265,"column":6}},"130":{"start":{"line":266,"column":4},"end":{"line":266,"column":64}},"131":{"start":{"line":267,"column":4},"end":{"line":267,"column":69}},"132":{"start":{"line":268,"column":4},"end":{"line":268,"column":35}},"133":{"start":{"line":271,"column":2},"end":{"line":287,"column":3}},"134":{"start":{"line":272,"column":4},"end":{"line":272,"column":47}},"135":{"start":{"line":273,"column":4},"end":{"line":276,"column":19}},"136":{"start":{"line":277,"column":4},"end":{"line":281,"column":6}},"137":{"start":{"line":282,"column":4},"end":{"line":282,"column":70}},"138":{"start":{"line":283,"column":4},"end":{"line":285,"column":6}},"139":{"start":{"line":286,"column":4},"end":{"line":286,"column":41}},"140":{"start":{"line":288,"column":2},"end":{"line":288,"column":22}},"141":{"start":{"line":291,"column":16},"end":{"line":317,"column":1}},"142":{"start":{"line":292,"column":35},"end":{"line":292,"column":40}},"143":{"start":{"line":293,"column":2},"end":{"line":298,"column":3}},"144":{"start":{"line":294,"column":4},"end":{"line":297,"column":6}},"145":{"start":{"line":300,"column":22},"end":{"line":300,"column":48}},"146":{"start":{"line":303,"column":2},"end":{"line":315,"column":3}},"147":{"start":{"line":305,"column":6},"end":{"line":305,"column":69}},"148":{"start":{"line":306,"column":6},"end":{"line":306,"column":12}},"149":{"start":{"line":308,"column":6},"end":{"line":308,"column":66}},"150":{"start":{"line":309,"column":6},"end":{"line":309,"column":12}},"151":{"start":{"line":311,"column":6},"end":{"line":311,"column":66}},"152":{"start":{"line":312,"column":6},"end":{"line":312,"column":12}},"153":{"start":{"line":314,"column":6},"end":{"line":314,"column":78}},"154":{"start":{"line":316,"column":2},"end":{"line":316,"column":18}},"155":{"start":{"line":319,"column":26},"end":{"line":356,"column":1}},"156":{"start":{"line":320,"column":2},"end":{"line":323,"column":3}},"157":{"start":{"line":321,"column":23},"end":{"line":321,"column":75}},"158":{"start":{"line":322,"column":4},"end":{"line":322,"column":24}},"159":{"start":{"line":325,"column":19},"end":{"line":354,"column":3}},"160":{"start":{"line":327,"column":6},"end":{"line":352,"column":7}},"161":{"start":{"line":328,"column":8},"end":{"line":335,"column":9}},"162":{"start":{"line":330,"column":10},"end":{"line":334,"column":12}},"163":{"start":{"line":337,"column":8},"end":{"line":341,"column":10}},"164":{"start":{"line":343,"column":8},"end":{"line":351,"column":10}},"165":{"start":{"line":355,"column":2},"end":{"line":355,"column":18}},"166":{"start":{"line":358,"column":0},"end":{"line":358,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":28,"column":32},"end":{"line":28,"column":33}},"loc":{"start":{"line":28,"column":57},"end":{"line":128,"column":1}},"line":28},"1":{"name":"(anonymous_1)","decl":{"start":{"line":59,"column":30},"end":{"line":59,"column":31}},"loc":{"start":{"line":59,"column":37},"end":{"line":84,"column":3}},"line":59},"2":{"name":"(anonymous_2)","decl":{"start":{"line":130,"column":29},"end":{"line":130,"column":30}},"loc":{"start":{"line":130,"column":60},"end":{"line":188,"column":1}},"line":130},"3":{"name":"(anonymous_3)","decl":{"start":{"line":190,"column":29},"end":{"line":190,"column":30}},"loc":{"start":{"line":190,"column":54},"end":{"line":289,"column":1}},"line":190},"4":{"name":"(anonymous_4)","decl":{"start":{"line":219,"column":30},"end":{"line":219,"column":31}},"loc":{"start":{"line":219,"column":37},"end":{"line":244,"column":3}},"line":219},"5":{"name":"(anonymous_5)","decl":{"start":{"line":291,"column":16},"end":{"line":291,"column":17}},"loc":{"start":{"line":291,"column":31},"end":{"line":317,"column":1}},"line":291},"6":{"name":"(anonymous_6)","decl":{"start":{"line":319,"column":26},"end":{"line":319,"column":27}},"loc":{"start":{"line":319,"column":42},"end":{"line":356,"column":1}},"line":319},"7":{"name":"(anonymous_7)","decl":{"start":{"line":326,"column":15},"end":{"line":326,"column":16}},"loc":{"start":{"line":326,"column":30},"end":{"line":353,"column":5}},"line":326}},"branchMap":{"0":{"loc":{"start":{"line":32,"column":2},"end":{"line":36,"column":6}},"type":"if","locations":[{"start":{"line":32,"column":2},"end":{"line":36,"column":6}},{"start":{"line":32,"column":2},"end":{"line":36,"column":6}}],"line":32},"1":{"loc":{"start":{"line":40,"column":13},"end":{"line":40,"column":48}},"type":"cond-expr","locations":[{"start":{"line":40,"column":26},"end":{"line":40,"column":37}},{"start":{"line":40,"column":40},"end":{"line":40,"column":48}}],"line":40},"2":{"loc":{"start":{"line":43,"column":2},"end":{"line":48,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":48,"column":3}},{"start":{"line":43,"column":2},"end":{"line":48,"column":3}}],"line":43},"3":{"loc":{"start":{"line":61,"column":4},"end":{"line":69,"column":5}},"type":"if","locations":[{"start":{"line":61,"column":4},"end":{"line":69,"column":5}},{"start":{"line":61,"column":4},"end":{"line":69,"column":5}}],"line":61},"4":{"loc":{"start":{"line":63,"column":6},"end":{"line":65,"column":7}},"type":"if","locations":[{"start":{"line":63,"column":6},"end":{"line":65,"column":7}},{"start":{"line":63,"column":6},"end":{"line":65,"column":7}}],"line":63},"5":{"loc":{"start":{"line":66,"column":6},"end":{"line":68,"column":7}},"type":"if","locations":[{"start":{"line":66,"column":6},"end":{"line":68,"column":7}},{"start":{"line":66,"column":6},"end":{"line":68,"column":7}}],"line":66},"6":{"loc":{"start":{"line":71,"column":4},"end":{"line":83,"column":5}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":83,"column":5}},{"start":{"line":71,"column":4},"end":{"line":83,"column":5}}],"line":71},"7":{"loc":{"start":{"line":75,"column":6},"end":{"line":79,"column":7}},"type":"if","locations":[{"start":{"line":75,"column":6},"end":{"line":79,"column":7}},{"start":{"line":75,"column":6},"end":{"line":79,"column":7}}],"line":75},"8":{"loc":{"start":{"line":90,"column":2},"end":{"line":107,"column":3}},"type":"if","locations":[{"start":{"line":90,"column":2},"end":{"line":107,"column":3}},{"start":{"line":90,"column":2},"end":{"line":107,"column":3}}],"line":90},"9":{"loc":{"start":{"line":91,"column":4},"end":{"line":92,"column":52}},"type":"binary-expr","locations":[{"start":{"line":91,"column":4},"end":{"line":91,"column":49}},{"start":{"line":92,"column":4},"end":{"line":92,"column":52}}],"line":91},"10":{"loc":{"start":{"line":94,"column":4},"end":{"line":94,"column":78}},"type":"if","locations":[{"start":{"line":94,"column":4},"end":{"line":94,"column":78}},{"start":{"line":94,"column":4},"end":{"line":94,"column":78}}],"line":94},"11":{"loc":{"start":{"line":95,"column":4},"end":{"line":96,"column":31}},"type":"if","locations":[{"start":{"line":95,"column":4},"end":{"line":96,"column":31}},{"start":{"line":95,"column":4},"end":{"line":96,"column":31}}],"line":95},"12":{"loc":{"start":{"line":109,"column":2},"end":{"line":125,"column":3}},"type":"if","locations":[{"start":{"line":109,"column":2},"end":{"line":125,"column":3}},{"start":{"line":109,"column":2},"end":{"line":125,"column":3}}],"line":109},"13":{"loc":{"start":{"line":132,"column":2},"end":{"line":134,"column":3}},"type":"if","locations":[{"start":{"line":132,"column":2},"end":{"line":134,"column":3}},{"start":{"line":132,"column":2},"end":{"line":134,"column":3}}],"line":132},"14":{"loc":{"start":{"line":145,"column":2},"end":{"line":147,"column":3}},"type":"if","locations":[{"start":{"line":145,"column":2},"end":{"line":147,"column":3}},{"start":{"line":145,"column":2},"end":{"line":147,"column":3}}],"line":145},"15":{"loc":{"start":{"line":150,"column":2},"end":{"line":152,"column":3}},"type":"if","locations":[{"start":{"line":150,"column":2},"end":{"line":152,"column":3}},{"start":{"line":150,"column":2},"end":{"line":152,"column":3}}],"line":150},"16":{"loc":{"start":{"line":155,"column":2},"end":{"line":166,"column":3}},"type":"if","locations":[{"start":{"line":155,"column":2},"end":{"line":166,"column":3}},{"start":{"line":155,"column":2},"end":{"line":166,"column":3}}],"line":155},"17":{"loc":{"start":{"line":155,"column":6},"end":{"line":155,"column":24}},"type":"binary-expr","locations":[{"start":{"line":155,"column":6},"end":{"line":155,"column":13}},{"start":{"line":155,"column":17},"end":{"line":155,"column":24}}],"line":155},"18":{"loc":{"start":{"line":156,"column":4},"end":{"line":165,"column":8}},"type":"if","locations":[{"start":{"line":156,"column":4},"end":{"line":165,"column":8}},{"start":{"line":156,"column":4},"end":{"line":165,"column":8}}],"line":156},"19":{"loc":{"start":{"line":169,"column":13},"end":{"line":169,"column":48}},"type":"cond-expr","locations":[{"start":{"line":169,"column":26},"end":{"line":169,"column":37}},{"start":{"line":169,"column":40},"end":{"line":169,"column":48}}],"line":169},"20":{"loc":{"start":{"line":173,"column":2},"end":{"line":173,"column":56}},"type":"if","locations":[{"start":{"line":173,"column":2},"end":{"line":173,"column":56}},{"start":{"line":173,"column":2},"end":{"line":173,"column":56}}],"line":173},"21":{"loc":{"start":{"line":194,"column":2},"end":{"line":198,"column":6}},"type":"if","locations":[{"start":{"line":194,"column":2},"end":{"line":198,"column":6}},{"start":{"line":194,"column":2},"end":{"line":198,"column":6}}],"line":194},"22":{"loc":{"start":{"line":202,"column":13},"end":{"line":202,"column":48}},"type":"cond-expr","locations":[{"start":{"line":202,"column":26},"end":{"line":202,"column":37}},{"start":{"line":202,"column":40},"end":{"line":202,"column":48}}],"line":202},"23":{"loc":{"start":{"line":205,"column":2},"end":{"line":210,"column":3}},"type":"if","locations":[{"start":{"line":205,"column":2},"end":{"line":210,"column":3}},{"start":{"line":205,"column":2},"end":{"line":210,"column":3}}],"line":205},"24":{"loc":{"start":{"line":221,"column":4},"end":{"line":229,"column":5}},"type":"if","locations":[{"start":{"line":221,"column":4},"end":{"line":229,"column":5}},{"start":{"line":221,"column":4},"end":{"line":229,"column":5}}],"line":221},"25":{"loc":{"start":{"line":223,"column":6},"end":{"line":225,"column":7}},"type":"if","locations":[{"start":{"line":223,"column":6},"end":{"line":225,"column":7}},{"start":{"line":223,"column":6},"end":{"line":225,"column":7}}],"line":223},"26":{"loc":{"start":{"line":226,"column":6},"end":{"line":228,"column":7}},"type":"if","locations":[{"start":{"line":226,"column":6},"end":{"line":228,"column":7}},{"start":{"line":226,"column":6},"end":{"line":228,"column":7}}],"line":226},"27":{"loc":{"start":{"line":231,"column":4},"end":{"line":243,"column":5}},"type":"if","locations":[{"start":{"line":231,"column":4},"end":{"line":243,"column":5}},{"start":{"line":231,"column":4},"end":{"line":243,"column":5}}],"line":231},"28":{"loc":{"start":{"line":235,"column":6},"end":{"line":239,"column":7}},"type":"if","locations":[{"start":{"line":235,"column":6},"end":{"line":239,"column":7}},{"start":{"line":235,"column":6},"end":{"line":239,"column":7}}],"line":235},"29":{"loc":{"start":{"line":250,"column":2},"end":{"line":269,"column":3}},"type":"if","locations":[{"start":{"line":250,"column":2},"end":{"line":269,"column":3}},{"start":{"line":250,"column":2},"end":{"line":269,"column":3}}],"line":250},"30":{"loc":{"start":{"line":251,"column":4},"end":{"line":252,"column":58}},"type":"binary-expr","locations":[{"start":{"line":251,"column":4},"end":{"line":251,"column":55}},{"start":{"line":252,"column":4},"end":{"line":252,"column":58}}],"line":251},"31":{"loc":{"start":{"line":254,"column":4},"end":{"line":255,"column":28}},"type":"if","locations":[{"start":{"line":254,"column":4},"end":{"line":255,"column":28}},{"start":{"line":254,"column":4},"end":{"line":255,"column":28}}],"line":254},"32":{"loc":{"start":{"line":256,"column":4},"end":{"line":257,"column":31}},"type":"if","locations":[{"start":{"line":256,"column":4},"end":{"line":257,"column":31}},{"start":{"line":256,"column":4},"end":{"line":257,"column":31}}],"line":256},"33":{"loc":{"start":{"line":271,"column":2},"end":{"line":287,"column":3}},"type":"if","locations":[{"start":{"line":271,"column":2},"end":{"line":287,"column":3}},{"start":{"line":271,"column":2},"end":{"line":287,"column":3}}],"line":271},"34":{"loc":{"start":{"line":293,"column":2},"end":{"line":298,"column":3}},"type":"if","locations":[{"start":{"line":293,"column":2},"end":{"line":298,"column":3}},{"start":{"line":293,"column":2},"end":{"line":298,"column":3}}],"line":293},"35":{"loc":{"start":{"line":303,"column":2},"end":{"line":315,"column":3}},"type":"switch","locations":[{"start":{"line":304,"column":4},"end":{"line":306,"column":12}},{"start":{"line":307,"column":4},"end":{"line":309,"column":12}},{"start":{"line":310,"column":4},"end":{"line":312,"column":12}},{"start":{"line":313,"column":4},"end":{"line":314,"column":78}}],"line":303},"36":{"loc":{"start":{"line":320,"column":2},"end":{"line":323,"column":3}},"type":"if","locations":[{"start":{"line":320,"column":2},"end":{"line":323,"column":3}},{"start":{"line":320,"column":2},"end":{"line":323,"column":3}}],"line":320},"37":{"loc":{"start":{"line":320,"column":6},"end":{"line":320,"column":50}},"type":"binary-expr","locations":[{"start":{"line":320,"column":6},"end":{"line":320,"column":28}},{"start":{"line":320,"column":32},"end":{"line":320,"column":50}}],"line":320},"38":{"loc":{"start":{"line":328,"column":8},"end":{"line":335,"column":9}},"type":"if","locations":[{"start":{"line":328,"column":8},"end":{"line":335,"column":9}},{"start":{"line":328,"column":8},"end":{"line":335,"column":9}}],"line":328},"39":{"loc":{"start":{"line":345,"column":10},"end":{"line":349,"column":17}},"type":"cond-expr","locations":[{"start":{"line":346,"column":14},"end":{"line":346,"column":35}},{"start":{"line":347,"column":14},"end":{"line":349,"column":17}}],"line":345},"40":{"loc":{"start":{"line":347,"column":14},"end":{"line":349,"column":17}},"type":"cond-expr","locations":[{"start":{"line":348,"column":14},"end":{"line":348,"column":24}},{"start":{"line":349,"column":14},"end":{"line":349,"column":17}}],"line":347},"41":{"loc":{"start":{"line":350,"column":10},"end":{"line":350,"column":69}},"type":"binary-expr","locations":[{"start":{"line":350,"column":10},"end":{"line":350,"column":23}},{"start":{"line":350,"column":27},"end":{"line":350,"column":69}}],"line":350}},"s":{"0":1,"1":1,"2":1,"3":1,"4":7,"5":7,"6":7,"7":1,"8":6,"9":6,"10":6,"11":6,"12":1,"13":5,"14":5,"15":5,"16":5,"17":5,"18":5,"19":5,"20":52,"21":12,"22":12,"23":8,"24":12,"25":4,"26":52,"27":40,"28":40,"29":40,"30":40,"31":20,"32":20,"33":40,"34":40,"35":40,"36":5,"37":5,"38":4,"39":0,"40":4,"41":0,"42":4,"43":4,"44":4,"45":4,"46":4,"47":4,"48":5,"49":4,"50":4,"51":4,"52":4,"53":4,"54":4,"55":5,"56":1,"57":9,"58":9,"59":1,"60":8,"61":8,"62":8,"63":8,"64":8,"65":5,"66":8,"67":8,"68":1,"69":8,"70":8,"71":2,"72":1,"73":1,"74":6,"75":6,"76":6,"77":6,"78":6,"79":6,"80":6,"81":6,"82":6,"83":6,"84":6,"85":6,"86":6,"87":6,"88":1,"89":8,"90":8,"91":8,"92":1,"93":7,"94":7,"95":7,"96":7,"97":1,"98":6,"99":6,"100":6,"101":6,"102":6,"103":6,"104":6,"105":65,"106":15,"107":15,"108":10,"109":15,"110":5,"111":65,"112":50,"113":50,"114":50,"115":50,"116":25,"117":25,"118":50,"119":50,"120":50,"121":6,"122":6,"123":5,"124":0,"125":5,"126":0,"127":5,"128":5,"129":5,"130":5,"131":5,"132":5,"133":6,"134":5,"135":5,"136":5,"137":5,"138":5,"139":5,"140":6,"141":1,"142":25,"143":25,"144":0,"145":25,"146":25,"147":7,"148":5,"149":9,"150":6,"151":8,"152":6,"153":1,"154":17,"155":1,"156":1,"157":0,"158":0,"159":1,"160":3,"161":3,"162":0,"163":3,"164":0,"165":1,"166":1},"f":{"0":7,"1":52,"2":9,"3":8,"4":65,"5":25,"6":1,"7":3},"b":{"0":[1,6],"1":[2,4],"2":[1,5],"3":[12,40],"4":[8,4],"5":[4,8],"6":[40,12],"7":[20,20],"8":[4,1],"9":[5,1],"10":[0,4],"11":[0,4],"12":[4,1],"13":[1,8],"14":[5,3],"15":[1,7],"16":[2,6],"17":[8,7],"18":[1,1],"19":[1,5],"20":[6,0],"21":[1,7],"22":[2,5],"23":[1,6],"24":[15,50],"25":[10,5],"26":[5,10],"27":[50,15],"28":[25,25],"29":[5,1],"30":[6,1],"31":[0,5],"32":[0,5],"33":[5,1],"34":[0,25],"35":[7,9,8,1],"36":[0,1],"37":[1,1],"38":[0,3],"39":[0,0],"40":[0,0],"41":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"b094f30885afd64375fd1be08a0f61b8ef73dc6d"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\algolia\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\algolia\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":55}},"2":{"start":{"line":4,"column":26},"end":{"line":6,"column":1}},"3":{"start":{"line":7,"column":20},"end":{"line":7,"column":51}},"4":{"start":{"line":8,"column":23},"end":{"line":8,"column":27}},"5":{"start":{"line":9,"column":23},"end":{"line":9,"column":69}},"6":{"start":{"line":10,"column":0},"end":{"line":15,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"72e2a7d506aab05d61ca6cc2931188a0d49593fd"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\algolia\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\algolia\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":22},"end":{"line":2,"column":51}},"2":{"start":{"line":13,"column":4},"end":{"line":13,"column":31}},"3":{"start":{"line":15,"column":51},"end":{"line":15,"column":70}},"4":{"start":{"line":22,"column":4},"end":{"line":22,"column":21}},"5":{"start":{"line":24,"column":29},"end":{"line":89,"column":1}},"6":{"start":{"line":25,"column":14},"end":{"line":25,"column":51}},"7":{"start":{"line":26,"column":2},"end":{"line":28,"column":3}},"8":{"start":{"line":27,"column":4},"end":{"line":27,"column":67}},"9":{"start":{"line":29,"column":2},"end":{"line":29,"column":37}},"10":{"start":{"line":30,"column":16},"end":{"line":30,"column":55}},"11":{"start":{"line":31,"column":23},"end":{"line":31,"column":47}},"12":{"start":{"line":32,"column":2},"end":{"line":32,"column":28}},"13":{"start":{"line":33,"column":2},"end":{"line":34,"column":80}},"14":{"start":{"line":36,"column":2},"end":{"line":38,"column":3}},"15":{"start":{"line":37,"column":4},"end":{"line":37,"column":72}},"16":{"start":{"line":39,"column":2},"end":{"line":39,"column":45}},"17":{"start":{"line":41,"column":2},"end":{"line":66,"column":3}},"18":{"start":{"line":42,"column":21},"end":{"line":42,"column":72}},"19":{"start":{"line":43,"column":4},"end":{"line":65,"column":5}},"20":{"start":{"line":44,"column":43},"end":{"line":47,"column":7}},"21":{"start":{"line":48,"column":21},"end":{"line":48,"column":38}},"22":{"start":{"line":49,"column":21},"end":{"line":49,"column":40}},"23":{"start":{"line":50,"column":6},"end":{"line":53,"column":7}},"24":{"start":{"line":51,"column":8},"end":{"line":51,"column":39}},"25":{"start":{"line":52,"column":8},"end":{"line":52,"column":37}},"26":{"start":{"line":54,"column":6},"end":{"line":57,"column":7}},"27":{"start":{"line":55,"column":8},"end":{"line":55,"column":41}},"28":{"start":{"line":56,"column":8},"end":{"line":56,"column":37}},"29":{"start":{"line":59,"column":6},"end":{"line":64,"column":7}},"30":{"start":{"line":60,"column":8},"end":{"line":63,"column":10}},"31":{"start":{"line":68,"column":2},"end":{"line":70,"column":3}},"32":{"start":{"line":69,"column":4},"end":{"line":69,"column":76}},"33":{"start":{"line":71,"column":2},"end":{"line":76,"column":3}},"34":{"start":{"line":72,"column":4},"end":{"line":75,"column":6}},"35":{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},"36":{"start":{"line":78,"column":4},"end":{"line":78,"column":45}},"37":{"start":{"line":80,"column":19},"end":{"line":80,"column":41}},"38":{"start":{"line":81,"column":2},"end":{"line":81,"column":59}},"39":{"start":{"line":82,"column":2},"end":{"line":82,"column":75}},"40":{"start":{"line":83,"column":2},"end":{"line":83,"column":31}},"41":{"start":{"line":84,"column":2},"end":{"line":87,"column":4}},"42":{"start":{"line":88,"column":2},"end":{"line":88,"column":18}},"43":{"start":{"line":91,"column":16},"end":{"line":117,"column":1}},"44":{"start":{"line":92,"column":35},"end":{"line":92,"column":40}},"45":{"start":{"line":93,"column":2},"end":{"line":98,"column":3}},"46":{"start":{"line":94,"column":4},"end":{"line":97,"column":6}},"47":{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},"48":{"start":{"line":101,"column":4},"end":{"line":101,"column":50}},"49":{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},"50":{"start":{"line":104,"column":4},"end":{"line":104,"column":57}},"51":{"start":{"line":106,"column":22},"end":{"line":106,"column":48}},"52":{"start":{"line":109,"column":2},"end":{"line":115,"column":3}},"53":{"start":{"line":111,"column":6},"end":{"line":111,"column":60}},"54":{"start":{"line":112,"column":6},"end":{"line":112,"column":12}},"55":{"start":{"line":114,"column":6},"end":{"line":114,"column":78}},"56":{"start":{"line":116,"column":2},"end":{"line":116,"column":18}},"57":{"start":{"line":119,"column":26},"end":{"line":173,"column":1}},"58":{"start":{"line":120,"column":2},"end":{"line":123,"column":3}},"59":{"start":{"line":121,"column":23},"end":{"line":121,"column":75}},"60":{"start":{"line":122,"column":4},"end":{"line":122,"column":24}},"61":{"start":{"line":125,"column":22},"end":{"line":125,"column":68}},"62":{"start":{"line":126,"column":22},"end":{"line":126,"column":24}},"63":{"start":{"line":127,"column":20},"end":{"line":127,"column":22}},"64":{"start":{"line":128,"column":2},"end":{"line":171,"column":5}},"65":{"start":{"line":129,"column":23},"end":{"line":129,"column":25}},"66":{"start":{"line":130,"column":25},"end":{"line":130,"column":27}},"67":{"start":{"line":134,"column":28},"end":{"line":134,"column":36}},"68":{"start":{"line":135,"column":4},"end":{"line":155,"column":7}},"69":{"start":{"line":136,"column":6},"end":{"line":154,"column":7}},"70":{"start":{"line":137,"column":8},"end":{"line":137,"column":47}},"71":{"start":{"line":139,"column":33},"end":{"line":139,"column":47}},"72":{"start":{"line":140,"column":8},"end":{"line":140,"column":62}},"73":{"start":{"line":141,"column":8},"end":{"line":141,"column":42}},"74":{"start":{"line":143,"column":8},"end":{"line":153,"column":10}},"75":{"start":{"line":157,"column":4},"end":{"line":170,"column":5}},"76":{"start":{"line":159,"column":29},"end":{"line":159,"column":51}},"77":{"start":{"line":160,"column":6},"end":{"line":160,"column":41}},"78":{"start":{"line":161,"column":6},"end":{"line":164,"column":8}},"79":{"start":{"line":165,"column":6},"end":{"line":165,"column":56}},"80":{"start":{"line":167,"column":6},"end":{"line":169,"column":8}},"81":{"start":{"line":172,"column":2},"end":{"line":172,"column":40}},"82":{"start":{"line":175,"column":0},"end":{"line":175,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":24,"column":29},"end":{"line":24,"column":30}},"loc":{"start":{"line":24,"column":54},"end":{"line":89,"column":1}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":91,"column":16},"end":{"line":91,"column":17}},"loc":{"start":{"line":91,"column":25},"end":{"line":117,"column":1}},"line":91},"2":{"name":"(anonymous_2)","decl":{"start":{"line":119,"column":26},"end":{"line":119,"column":27}},"loc":{"start":{"line":119,"column":42},"end":{"line":173,"column":1}},"line":119},"3":{"name":"(anonymous_3)","decl":{"start":{"line":128,"column":22},"end":{"line":128,"column":23}},"loc":{"start":{"line":128,"column":31},"end":{"line":171,"column":3}},"line":128},"4":{"name":"(anonymous_4)","decl":{"start":{"line":135,"column":18},"end":{"line":135,"column":19}},"loc":{"start":{"line":135,"column":33},"end":{"line":155,"column":5}},"line":135}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":2},"end":{"line":28,"column":3}},"type":"if","locations":[{"start":{"line":26,"column":2},"end":{"line":28,"column":3}},{"start":{"line":26,"column":2},"end":{"line":28,"column":3}}],"line":26},"1":{"loc":{"start":{"line":34,"column":4},"end":{"line":34,"column":79}},"type":"binary-expr","locations":[{"start":{"line":34,"column":4},"end":{"line":34,"column":56}},{"start":{"line":34,"column":60},"end":{"line":34,"column":79}}],"line":34},"2":{"loc":{"start":{"line":36,"column":2},"end":{"line":38,"column":3}},"type":"if","locations":[{"start":{"line":36,"column":2},"end":{"line":38,"column":3}},{"start":{"line":36,"column":2},"end":{"line":38,"column":3}}],"line":36},"3":{"loc":{"start":{"line":41,"column":2},"end":{"line":66,"column":3}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":66,"column":3}},{"start":{"line":41,"column":2},"end":{"line":66,"column":3}}],"line":41},"4":{"loc":{"start":{"line":41,"column":6},"end":{"line":41,"column":68}},"type":"binary-expr","locations":[{"start":{"line":41,"column":6},"end":{"line":41,"column":37}},{"start":{"line":41,"column":41},"end":{"line":41,"column":68}}],"line":41},"5":{"loc":{"start":{"line":43,"column":4},"end":{"line":65,"column":5}},"type":"if","locations":[{"start":{"line":43,"column":4},"end":{"line":65,"column":5}},{"start":{"line":43,"column":4},"end":{"line":65,"column":5}}],"line":43},"6":{"loc":{"start":{"line":50,"column":6},"end":{"line":53,"column":7}},"type":"if","locations":[{"start":{"line":50,"column":6},"end":{"line":53,"column":7}},{"start":{"line":50,"column":6},"end":{"line":53,"column":7}}],"line":50},"7":{"loc":{"start":{"line":54,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":54,"column":6},"end":{"line":57,"column":7}},{"start":{"line":54,"column":6},"end":{"line":57,"column":7}}],"line":54},"8":{"loc":{"start":{"line":59,"column":6},"end":{"line":64,"column":7}},"type":"if","locations":[{"start":{"line":59,"column":6},"end":{"line":64,"column":7}},{"start":{"line":59,"column":6},"end":{"line":64,"column":7}}],"line":59},"9":{"loc":{"start":{"line":59,"column":10},"end":{"line":59,"column":55}},"type":"binary-expr","locations":[{"start":{"line":59,"column":10},"end":{"line":59,"column":20}},{"start":{"line":59,"column":24},"end":{"line":59,"column":34}},{"start":{"line":59,"column":38},"end":{"line":59,"column":55}}],"line":59},"10":{"loc":{"start":{"line":68,"column":2},"end":{"line":70,"column":3}},"type":"if","locations":[{"start":{"line":68,"column":2},"end":{"line":70,"column":3}},{"start":{"line":68,"column":2},"end":{"line":70,"column":3}}],"line":68},"11":{"loc":{"start":{"line":68,"column":6},"end":{"line":68,"column":44}},"type":"binary-expr","locations":[{"start":{"line":68,"column":6},"end":{"line":68,"column":22}},{"start":{"line":68,"column":26},"end":{"line":68,"column":44}}],"line":68},"12":{"loc":{"start":{"line":71,"column":2},"end":{"line":76,"column":3}},"type":"if","locations":[{"start":{"line":71,"column":2},"end":{"line":76,"column":3}},{"start":{"line":71,"column":2},"end":{"line":76,"column":3}}],"line":71},"13":{"loc":{"start":{"line":71,"column":6},"end":{"line":71,"column":42}},"type":"binary-expr","locations":[{"start":{"line":71,"column":6},"end":{"line":71,"column":21}},{"start":{"line":71,"column":25},"end":{"line":71,"column":42}}],"line":71},"14":{"loc":{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},"type":"if","locations":[{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},{"start":{"line":77,"column":2},"end":{"line":79,"column":3}}],"line":77},"15":{"loc":{"start":{"line":93,"column":2},"end":{"line":98,"column":3}},"type":"if","locations":[{"start":{"line":93,"column":2},"end":{"line":98,"column":3}},{"start":{"line":93,"column":2},"end":{"line":98,"column":3}}],"line":93},"16":{"loc":{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},"type":"if","locations":[{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},{"start":{"line":100,"column":2},"end":{"line":102,"column":3}}],"line":100},"17":{"loc":{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},{"start":{"line":103,"column":2},"end":{"line":105,"column":3}}],"line":103},"18":{"loc":{"start":{"line":109,"column":2},"end":{"line":115,"column":3}},"type":"switch","locations":[{"start":{"line":110,"column":4},"end":{"line":112,"column":12}},{"start":{"line":113,"column":4},"end":{"line":114,"column":78}}],"line":109},"19":{"loc":{"start":{"line":120,"column":2},"end":{"line":123,"column":3}},"type":"if","locations":[{"start":{"line":120,"column":2},"end":{"line":123,"column":3}},{"start":{"line":120,"column":2},"end":{"line":123,"column":3}}],"line":120},"20":{"loc":{"start":{"line":120,"column":6},"end":{"line":120,"column":50}},"type":"binary-expr","locations":[{"start":{"line":120,"column":6},"end":{"line":120,"column":28}},{"start":{"line":120,"column":32},"end":{"line":120,"column":50}}],"line":120},"21":{"loc":{"start":{"line":146,"column":12},"end":{"line":150,"column":19}},"type":"cond-expr","locations":[{"start":{"line":147,"column":16},"end":{"line":147,"column":37}},{"start":{"line":148,"column":16},"end":{"line":150,"column":19}}],"line":146},"22":{"loc":{"start":{"line":148,"column":16},"end":{"line":150,"column":19}},"type":"cond-expr","locations":[{"start":{"line":149,"column":16},"end":{"line":149,"column":26}},{"start":{"line":150,"column":16},"end":{"line":150,"column":19}}],"line":148},"23":{"loc":{"start":{"line":151,"column":12},"end":{"line":151,"column":71}},"type":"binary-expr","locations":[{"start":{"line":151,"column":12},"end":{"line":151,"column":25}},{"start":{"line":151,"column":29},"end":{"line":151,"column":71}}],"line":151},"24":{"loc":{"start":{"line":157,"column":4},"end":{"line":170,"column":5}},"type":"if","locations":[{"start":{"line":157,"column":4},"end":{"line":170,"column":5}},{"start":{"line":157,"column":4},"end":{"line":170,"column":5}}],"line":157}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":10,"7":10,"8":0,"9":10,"10":10,"11":10,"12":10,"13":10,"14":10,"15":1,"16":9,"17":8,"18":5,"19":5,"20":5,"21":5,"22":5,"23":5,"24":5,"25":5,"26":5,"27":3,"28":3,"29":5,"30":0,"31":8,"32":1,"33":7,"34":0,"35":7,"36":5,"37":5,"38":5,"39":5,"40":5,"41":5,"42":5,"43":1,"44":10,"45":10,"46":0,"47":10,"48":0,"49":10,"50":0,"51":10,"52":10,"53":10,"54":5,"55":0,"56":5,"57":1,"58":1,"59":0,"60":0,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":2,"70":2,"71":2,"72":2,"73":2,"74":0,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1},"f":{"0":10,"1":10,"2":1,"3":1,"4":2},"b":{"0":[0,10],"1":[10,9],"2":[1,9],"3":[5,3],"4":[8,3],"5":[5,0],"6":[5,0],"7":[3,2],"8":[0,5],"9":[5,3,3],"10":[1,7],"11":[8,6],"12":[0,7],"13":[7,2],"14":[5,2],"15":[0,10],"16":[0,10],"17":[0,10],"18":[10,0],"19":[0,1],"20":[1,1],"21":[0,0],"22":[0,0],"23":[0,0],"24":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"861390163b986a9e742d0e5b5a0f5ba8c999cdcf"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\algolia\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\algolia\\util.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":41}},"1":{"start":{"line":2,"column":24},"end":{"line":2,"column":45}},"2":{"start":{"line":3,"column":24},"end":{"line":3,"column":43}},"3":{"start":{"line":5,"column":25},"end":{"line":19,"column":1}},"4":{"start":{"line":6,"column":19},"end":{"line":6,"column":21}},"5":{"start":{"line":7,"column":18},"end":{"line":7,"column":20}},"6":{"start":{"line":8,"column":2},"end":{"line":17,"column":3}},"7":{"start":{"line":9,"column":4},"end":{"line":16,"column":7}},"8":{"start":{"line":10,"column":6},"end":{"line":15,"column":7}},"9":{"start":{"line":11,"column":8},"end":{"line":11,"column":52}},"10":{"start":{"line":12,"column":8},"end":{"line":14,"column":9}},"11":{"start":{"line":13,"column":10},"end":{"line":13,"column":62}},"12":{"start":{"line":18,"column":2},"end":{"line":18,"column":18}},"13":{"start":{"line":21,"column":32},"end":{"line":62,"column":1}},"14":{"start":{"line":22,"column":25},"end":{"line":22,"column":32}},"15":{"start":{"line":23,"column":2},"end":{"line":23,"column":68}},"16":{"start":{"line":24,"column":2},"end":{"line":29,"column":3}},"17":{"start":{"line":25,"column":4},"end":{"line":28,"column":6}},"18":{"start":{"line":30,"column":2},"end":{"line":33,"column":3}},"19":{"start":{"line":31,"column":4},"end":{"line":31,"column":34}},"20":{"start":{"line":32,"column":4},"end":{"line":32,"column":59}},"21":{"start":{"line":34,"column":2},"end":{"line":40,"column":3}},"22":{"start":{"line":35,"column":15},"end":{"line":35,"column":31}},"23":{"start":{"line":36,"column":4},"end":{"line":39,"column":5}},"24":{"start":{"line":37,"column":6},"end":{"line":37,"column":36}},"25":{"start":{"line":38,"column":6},"end":{"line":38,"column":72}},"26":{"start":{"line":41,"column":2},"end":{"line":44,"column":3}},"27":{"start":{"line":42,"column":4},"end":{"line":42,"column":36}},"28":{"start":{"line":43,"column":4},"end":{"line":43,"column":58}},"29":{"start":{"line":45,"column":2},"end":{"line":47,"column":3}},"30":{"start":{"line":46,"column":4},"end":{"line":46,"column":40}},"31":{"start":{"line":48,"column":2},"end":{"line":54,"column":3}},"32":{"start":{"line":49,"column":17},"end":{"line":49,"column":47}},"33":{"start":{"line":50,"column":4},"end":{"line":53,"column":5}},"34":{"start":{"line":51,"column":6},"end":{"line":51,"column":38}},"35":{"start":{"line":52,"column":6},"end":{"line":52,"column":56}},"36":{"start":{"line":55,"column":2},"end":{"line":57,"column":3}},"37":{"start":{"line":56,"column":4},"end":{"line":56,"column":36}},"38":{"start":{"line":58,"column":2},"end":{"line":60,"column":3}},"39":{"start":{"line":59,"column":4},"end":{"line":59,"column":38}},"40":{"start":{"line":61,"column":2},"end":{"line":61,"column":24}},"41":{"start":{"line":63,"column":26},"end":{"line":87,"column":1}},"42":{"start":{"line":64,"column":21},"end":{"line":64,"column":23}},"43":{"start":{"line":65,"column":23},"end":{"line":65,"column":25}},"44":{"start":{"line":66,"column":2},"end":{"line":85,"column":3}},"45":{"start":{"line":67,"column":4},"end":{"line":84,"column":7}},"46":{"start":{"line":68,"column":6},"end":{"line":83,"column":7}},"47":{"start":{"line":69,"column":8},"end":{"line":80,"column":9}},"48":{"start":{"line":70,"column":10},"end":{"line":77,"column":11}},"49":{"start":{"line":71,"column":12},"end":{"line":71,"column":45}},"50":{"start":{"line":72,"column":12},"end":{"line":72,"column":47}},"51":{"start":{"line":74,"column":12},"end":{"line":76,"column":14}},"52":{"start":{"line":79,"column":10},"end":{"line":79,"column":43}},"53":{"start":{"line":82,"column":8},"end":{"line":82,"column":80}},"54":{"start":{"line":86,"column":2},"end":{"line":86,"column":38}},"55":{"start":{"line":89,"column":30},"end":{"line":131,"column":1}},"56":{"start":{"line":90,"column":25},"end":{"line":90,"column":32}},"57":{"start":{"line":91,"column":2},"end":{"line":104,"column":3}},"58":{"start":{"line":92,"column":4},"end":{"line":95,"column":5}},"59":{"start":{"line":93,"column":6},"end":{"line":93,"column":38}},"60":{"start":{"line":94,"column":6},"end":{"line":94,"column":64}},"61":{"start":{"line":96,"column":4},"end":{"line":103,"column":7}},"62":{"start":{"line":97,"column":6},"end":{"line":102,"column":7}},"63":{"start":{"line":98,"column":8},"end":{"line":98,"column":54}},"64":{"start":{"line":100,"column":8},"end":{"line":100,"column":40}},"65":{"start":{"line":101,"column":8},"end":{"line":101,"column":21}},"66":{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},"67":{"start":{"line":106,"column":4},"end":{"line":106,"column":40}},"68":{"start":{"line":108,"column":2},"end":{"line":110,"column":3}},"69":{"start":{"line":109,"column":4},"end":{"line":109,"column":40}},"70":{"start":{"line":111,"column":2},"end":{"line":118,"column":3}},"71":{"start":{"line":112,"column":4},"end":{"line":117,"column":5}},"72":{"start":{"line":113,"column":6},"end":{"line":116,"column":8}},"73":{"start":{"line":119,"column":2},"end":{"line":129,"column":3}},"74":{"start":{"line":120,"column":4},"end":{"line":128,"column":5}},"75":{"start":{"line":124,"column":6},"end":{"line":127,"column":8}},"76":{"start":{"line":130,"column":2},"end":{"line":130,"column":24}},"77":{"start":{"line":133,"column":0},"end":{"line":138,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":25},"end":{"line":5,"column":26}},"loc":{"start":{"line":5,"column":35},"end":{"line":19,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":37},"end":{"line":9,"column":38}},"loc":{"start":{"line":9,"column":46},"end":{"line":16,"column":5}},"line":9},"2":{"name":"(anonymous_2)","decl":{"start":{"line":21,"column":32},"end":{"line":21,"column":33}},"loc":{"start":{"line":21,"column":43},"end":{"line":62,"column":1}},"line":21},"3":{"name":"(anonymous_3)","decl":{"start":{"line":63,"column":26},"end":{"line":63,"column":27}},"loc":{"start":{"line":63,"column":50},"end":{"line":87,"column":1}},"line":63},"4":{"name":"(anonymous_4)","decl":{"start":{"line":67,"column":20},"end":{"line":67,"column":21}},"loc":{"start":{"line":67,"column":39},"end":{"line":84,"column":5}},"line":67},"5":{"name":"(anonymous_5)","decl":{"start":{"line":89,"column":30},"end":{"line":89,"column":31}},"loc":{"start":{"line":89,"column":41},"end":{"line":131,"column":1}},"line":89},"6":{"name":"(anonymous_6)","decl":{"start":{"line":96,"column":34},"end":{"line":96,"column":35}},"loc":{"start":{"line":96,"column":50},"end":{"line":103,"column":5}},"line":96}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":2},"end":{"line":17,"column":3}},"type":"if","locations":[{"start":{"line":8,"column":2},"end":{"line":17,"column":3}},{"start":{"line":8,"column":2},"end":{"line":17,"column":3}}],"line":8},"1":{"loc":{"start":{"line":10,"column":6},"end":{"line":15,"column":7}},"type":"if","locations":[{"start":{"line":10,"column":6},"end":{"line":15,"column":7}},{"start":{"line":10,"column":6},"end":{"line":15,"column":7}}],"line":10},"2":{"loc":{"start":{"line":10,"column":10},"end":{"line":10,"column":32}},"type":"binary-expr","locations":[{"start":{"line":10,"column":10},"end":{"line":10,"column":20}},{"start":{"line":10,"column":24},"end":{"line":10,"column":32}}],"line":10},"3":{"loc":{"start":{"line":12,"column":8},"end":{"line":14,"column":9}},"type":"if","locations":[{"start":{"line":12,"column":8},"end":{"line":14,"column":9}},{"start":{"line":12,"column":8},"end":{"line":14,"column":9}}],"line":12},"4":{"loc":{"start":{"line":24,"column":2},"end":{"line":29,"column":3}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":29,"column":3}},{"start":{"line":24,"column":2},"end":{"line":29,"column":3}}],"line":24},"5":{"loc":{"start":{"line":30,"column":2},"end":{"line":33,"column":3}},"type":"if","locations":[{"start":{"line":30,"column":2},"end":{"line":33,"column":3}},{"start":{"line":30,"column":2},"end":{"line":33,"column":3}}],"line":30},"6":{"loc":{"start":{"line":30,"column":6},"end":{"line":30,"column":56}},"type":"binary-expr","locations":[{"start":{"line":30,"column":6},"end":{"line":30,"column":21}},{"start":{"line":30,"column":25},"end":{"line":30,"column":56}}],"line":30},"7":{"loc":{"start":{"line":34,"column":2},"end":{"line":40,"column":3}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":40,"column":3}},{"start":{"line":34,"column":2},"end":{"line":40,"column":3}}],"line":34},"8":{"loc":{"start":{"line":36,"column":4},"end":{"line":39,"column":5}},"type":"if","locations":[{"start":{"line":36,"column":4},"end":{"line":39,"column":5}},{"start":{"line":36,"column":4},"end":{"line":39,"column":5}}],"line":36},"9":{"loc":{"start":{"line":36,"column":8},"end":{"line":36,"column":74}},"type":"binary-expr","locations":[{"start":{"line":36,"column":8},"end":{"line":36,"column":37}},{"start":{"line":36,"column":41},"end":{"line":36,"column":74}}],"line":36},"10":{"loc":{"start":{"line":41,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":44,"column":3}},{"start":{"line":41,"column":2},"end":{"line":44,"column":3}}],"line":41},"11":{"loc":{"start":{"line":41,"column":6},"end":{"line":41,"column":60}},"type":"binary-expr","locations":[{"start":{"line":41,"column":6},"end":{"line":41,"column":23}},{"start":{"line":41,"column":27},"end":{"line":41,"column":60}}],"line":41},"12":{"loc":{"start":{"line":45,"column":2},"end":{"line":47,"column":3}},"type":"if","locations":[{"start":{"line":45,"column":2},"end":{"line":47,"column":3}},{"start":{"line":45,"column":2},"end":{"line":47,"column":3}}],"line":45},"13":{"loc":{"start":{"line":45,"column":6},"end":{"line":45,"column":56}},"type":"binary-expr","locations":[{"start":{"line":45,"column":6},"end":{"line":45,"column":23}},{"start":{"line":45,"column":27},"end":{"line":45,"column":56}}],"line":45},"14":{"loc":{"start":{"line":48,"column":2},"end":{"line":54,"column":3}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":54,"column":3}},{"start":{"line":48,"column":2},"end":{"line":54,"column":3}}],"line":48},"15":{"loc":{"start":{"line":50,"column":4},"end":{"line":53,"column":5}},"type":"if","locations":[{"start":{"line":50,"column":4},"end":{"line":53,"column":5}},{"start":{"line":50,"column":4},"end":{"line":53,"column":5}}],"line":50},"16":{"loc":{"start":{"line":55,"column":2},"end":{"line":57,"column":3}},"type":"if","locations":[{"start":{"line":55,"column":2},"end":{"line":57,"column":3}},{"start":{"line":55,"column":2},"end":{"line":57,"column":3}}],"line":55},"17":{"loc":{"start":{"line":55,"column":6},"end":{"line":55,"column":56}},"type":"binary-expr","locations":[{"start":{"line":55,"column":6},"end":{"line":55,"column":35}},{"start":{"line":55,"column":39},"end":{"line":55,"column":56}}],"line":55},"18":{"loc":{"start":{"line":58,"column":2},"end":{"line":60,"column":3}},"type":"if","locations":[{"start":{"line":58,"column":2},"end":{"line":60,"column":3}},{"start":{"line":58,"column":2},"end":{"line":60,"column":3}}],"line":58},"19":{"loc":{"start":{"line":58,"column":6},"end":{"line":58,"column":52}},"type":"binary-expr","locations":[{"start":{"line":58,"column":6},"end":{"line":58,"column":21}},{"start":{"line":58,"column":25},"end":{"line":58,"column":52}}],"line":58},"20":{"loc":{"start":{"line":66,"column":2},"end":{"line":85,"column":3}},"type":"if","locations":[{"start":{"line":66,"column":2},"end":{"line":85,"column":3}},{"start":{"line":66,"column":2},"end":{"line":85,"column":3}}],"line":66},"21":{"loc":{"start":{"line":68,"column":6},"end":{"line":83,"column":7}},"type":"if","locations":[{"start":{"line":68,"column":6},"end":{"line":83,"column":7}},{"start":{"line":68,"column":6},"end":{"line":83,"column":7}}],"line":68},"22":{"loc":{"start":{"line":69,"column":8},"end":{"line":80,"column":9}},"type":"if","locations":[{"start":{"line":69,"column":8},"end":{"line":80,"column":9}},{"start":{"line":69,"column":8},"end":{"line":80,"column":9}}],"line":69},"23":{"loc":{"start":{"line":70,"column":10},"end":{"line":77,"column":11}},"type":"if","locations":[{"start":{"line":70,"column":10},"end":{"line":77,"column":11}},{"start":{"line":70,"column":10},"end":{"line":77,"column":11}}],"line":70},"24":{"loc":{"start":{"line":91,"column":2},"end":{"line":104,"column":3}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":104,"column":3}},{"start":{"line":91,"column":2},"end":{"line":104,"column":3}}],"line":91},"25":{"loc":{"start":{"line":92,"column":4},"end":{"line":95,"column":5}},"type":"if","locations":[{"start":{"line":92,"column":4},"end":{"line":95,"column":5}},{"start":{"line":92,"column":4},"end":{"line":95,"column":5}}],"line":92},"26":{"loc":{"start":{"line":97,"column":6},"end":{"line":102,"column":7}},"type":"if","locations":[{"start":{"line":97,"column":6},"end":{"line":102,"column":7}},{"start":{"line":97,"column":6},"end":{"line":102,"column":7}}],"line":97},"27":{"loc":{"start":{"line":97,"column":10},"end":{"line":97,"column":62}},"type":"binary-expr","locations":[{"start":{"line":97,"column":10},"end":{"line":97,"column":29}},{"start":{"line":97,"column":33},"end":{"line":97,"column":62}}],"line":97},"28":{"loc":{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},{"start":{"line":105,"column":2},"end":{"line":107,"column":3}}],"line":105},"29":{"loc":{"start":{"line":108,"column":2},"end":{"line":110,"column":3}},"type":"if","locations":[{"start":{"line":108,"column":2},"end":{"line":110,"column":3}},{"start":{"line":108,"column":2},"end":{"line":110,"column":3}}],"line":108},"30":{"loc":{"start":{"line":111,"column":2},"end":{"line":118,"column":3}},"type":"if","locations":[{"start":{"line":111,"column":2},"end":{"line":118,"column":3}},{"start":{"line":111,"column":2},"end":{"line":118,"column":3}}],"line":111},"31":{"loc":{"start":{"line":111,"column":6},"end":{"line":111,"column":44}},"type":"binary-expr","locations":[{"start":{"line":111,"column":6},"end":{"line":111,"column":23}},{"start":{"line":111,"column":27},"end":{"line":111,"column":44}}],"line":111},"32":{"loc":{"start":{"line":112,"column":4},"end":{"line":117,"column":5}},"type":"if","locations":[{"start":{"line":112,"column":4},"end":{"line":117,"column":5}},{"start":{"line":112,"column":4},"end":{"line":117,"column":5}}],"line":112},"33":{"loc":{"start":{"line":119,"column":2},"end":{"line":129,"column":3}},"type":"if","locations":[{"start":{"line":119,"column":2},"end":{"line":129,"column":3}},{"start":{"line":119,"column":2},"end":{"line":129,"column":3}}],"line":119},"34":{"loc":{"start":{"line":120,"column":4},"end":{"line":128,"column":5}},"type":"if","locations":[{"start":{"line":120,"column":4},"end":{"line":128,"column":5}},{"start":{"line":120,"column":4},"end":{"line":128,"column":5}}],"line":120},"35":{"loc":{"start":{"line":121,"column":6},"end":{"line":122,"column":45}},"type":"binary-expr","locations":[{"start":{"line":121,"column":7},"end":{"line":121,"column":24}},{"start":{"line":121,"column":28},"end":{"line":121,"column":44}},{"start":{"line":122,"column":7},"end":{"line":122,"column":25}},{"start":{"line":122,"column":29},"end":{"line":122,"column":44}}],"line":121}},"s":{"0":1,"1":1,"2":1,"3":1,"4":10,"5":10,"6":10,"7":8,"8":10,"9":10,"10":10,"11":10,"12":10,"13":1,"14":9,"15":9,"16":9,"17":1,"18":8,"19":0,"20":0,"21":8,"22":5,"23":5,"24":0,"25":0,"26":8,"27":0,"28":0,"29":8,"30":0,"31":8,"32":0,"33":0,"34":0,"35":0,"36":8,"37":0,"38":8,"39":0,"40":8,"41":1,"42":5,"43":5,"44":5,"45":5,"46":10,"47":10,"48":6,"49":6,"50":6,"51":0,"52":4,"53":0,"54":5,"55":1,"56":5,"57":5,"58":3,"59":0,"60":0,"61":3,"62":6,"63":5,"64":1,"65":1,"66":5,"67":3,"68":5,"69":2,"70":5,"71":2,"72":0,"73":5,"74":3,"75":2,"76":3,"77":1},"f":{"0":10,"1":10,"2":9,"3":5,"4":10,"5":5,"6":6},"b":{"0":[8,2],"1":[10,0],"2":[10,10],"3":[10,0],"4":[1,8],"5":[0,8],"6":[8,2],"7":[5,3],"8":[0,5],"9":[5,5],"10":[0,8],"11":[8,0],"12":[0,8],"13":[8,0],"14":[0,8],"15":[0,0],"16":[0,8],"17":[8,2],"18":[0,8],"19":[8,2],"20":[5,0],"21":[10,0],"22":[6,4],"23":[6,0],"24":[3,2],"25":[0,3],"26":[5,1],"27":[6,5],"28":[3,2],"29":[2,3],"30":[2,3],"31":[5,3],"32":[0,2],"33":[3,2],"34":[2,1],"35":[3,2,2,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"360a38f170e6f77ca05d6d2b2e8133da20584b1b"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\am\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\am\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":23},"end":{"line":37,"column":1}},"2":{"start":{"line":39,"column":14},"end":{"line":108,"column":1}},"3":{"start":{"line":110,"column":17},"end":{"line":110,"column":44}},"4":{"start":{"line":111,"column":20},"end":{"line":111,"column":50}},"5":{"start":{"line":113,"column":22},"end":{"line":113,"column":65}},"6":{"start":{"line":115,"column":2},"end":{"line":115,"column":61}},"7":{"start":{"line":116,"column":23},"end":{"line":116,"column":25}},"8":{"start":{"line":117,"column":15},"end":{"line":117,"column":33}},"9":{"start":{"line":118,"column":0},"end":{"line":120,"column":3}},"10":{"start":{"line":119,"column":2},"end":{"line":119,"column":51}},"11":{"start":{"line":121,"column":20},"end":{"line":121,"column":31}},"12":{"start":{"line":123,"column":0},"end":{"line":132,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":118,"column":15},"end":{"line":118,"column":16}},"loc":{"start":{"line":118,"column":24},"end":{"line":120,"column":1}},"line":118}},"branchMap":{"0":{"loc":{"start":{"line":115,"column":2},"end":{"line":115,"column":61}},"type":"binary-expr","locations":[{"start":{"line":115,"column":2},"end":{"line":115,"column":52}},{"start":{"line":115,"column":56},"end":{"line":115,"column":61}}],"line":115}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":3,"10":51,"11":3,"12":3},"f":{"0":51},"b":{"0":[3,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8c5ff0849f3d7646b0f19b6dcdbf6214665044ef"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\am\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\am\\transform.js","statementMap":{"0":{"start":{"line":4,"column":12},"end":{"line":4,"column":32}},"1":{"start":{"line":5,"column":12},"end":{"line":5,"column":32}},"2":{"start":{"line":11,"column":4},"end":{"line":11,"column":33}},"3":{"start":{"line":12,"column":31},"end":{"line":12,"column":61}},"4":{"start":{"line":31,"column":4},"end":{"line":31,"column":25}},"5":{"start":{"line":32,"column":21},"end":{"line":32,"column":48}},"6":{"start":{"line":40,"column":4},"end":{"line":40,"column":23}},"7":{"start":{"line":42,"column":16},"end":{"line":42,"column":34}},"8":{"start":{"line":44,"column":15},"end":{"line":44,"column":41}},"9":{"start":{"line":46,"column":25},"end":{"line":46,"column":41}},"10":{"start":{"line":47,"column":26},"end":{"line":47,"column":29}},"11":{"start":{"line":49,"column":21},"end":{"line":60,"column":1}},"12":{"start":{"line":51,"column":2},"end":{"line":58,"column":3}},"13":{"start":{"line":53,"column":6},"end":{"line":53,"column":27}},"14":{"start":{"line":54,"column":6},"end":{"line":54,"column":12}},"15":{"start":{"line":57,"column":6},"end":{"line":57,"column":24}},"16":{"start":{"line":59,"column":2},"end":{"line":59,"column":16}},"17":{"start":{"line":62,"column":24},"end":{"line":65,"column":1}},"18":{"start":{"line":63,"column":17},"end":{"line":63,"column":56}},"19":{"start":{"line":64,"column":2},"end":{"line":64,"column":16}},"20":{"start":{"line":67,"column":25},"end":{"line":70,"column":1}},"21":{"start":{"line":68,"column":17},"end":{"line":68,"column":55}},"22":{"start":{"line":69,"column":2},"end":{"line":69,"column":16}},"23":{"start":{"line":72,"column":22},"end":{"line":75,"column":1}},"24":{"start":{"line":73,"column":17},"end":{"line":73,"column":52}},"25":{"start":{"line":74,"column":2},"end":{"line":74,"column":16}},"26":{"start":{"line":77,"column":22},"end":{"line":80,"column":1}},"27":{"start":{"line":78,"column":17},"end":{"line":78,"column":60}},"28":{"start":{"line":79,"column":2},"end":{"line":79,"column":16}},"29":{"start":{"line":82,"column":22},"end":{"line":85,"column":1}},"30":{"start":{"line":83,"column":17},"end":{"line":83,"column":54}},"31":{"start":{"line":84,"column":2},"end":{"line":84,"column":16}},"32":{"start":{"line":88,"column":20},"end":{"line":88,"column":38}},"33":{"start":{"line":89,"column":2},"end":{"line":94,"column":3}},"34":{"start":{"line":90,"column":4},"end":{"line":92,"column":5}},"35":{"start":{"line":91,"column":6},"end":{"line":91,"column":80}},"36":{"start":{"line":93,"column":4},"end":{"line":93,"column":21}},"37":{"start":{"line":95,"column":2},"end":{"line":95,"column":12}},"38":{"start":{"line":99,"column":2},"end":{"line":99,"column":30}},"39":{"start":{"line":105,"column":2},"end":{"line":111,"column":3}},"40":{"start":{"line":106,"column":4},"end":{"line":106,"column":37}},"41":{"start":{"line":107,"column":4},"end":{"line":107,"column":48}},"42":{"start":{"line":109,"column":4},"end":{"line":109,"column":39}},"43":{"start":{"line":110,"column":4},"end":{"line":110,"column":17}},"44":{"start":{"line":112,"column":2},"end":{"line":112,"column":27}},"45":{"start":{"line":113,"column":2},"end":{"line":113,"column":33}},"46":{"start":{"line":114,"column":2},"end":{"line":114,"column":50}},"47":{"start":{"line":115,"column":2},"end":{"line":115,"column":20}},"48":{"start":{"line":119,"column":2},"end":{"line":119,"column":55}},"49":{"start":{"line":120,"column":2},"end":{"line":123,"column":16}},"50":{"start":{"line":124,"column":2},"end":{"line":124,"column":61}},"51":{"start":{"line":125,"column":2},"end":{"line":125,"column":20}},"52":{"start":{"line":129,"column":27},"end":{"line":129,"column":70}},"53":{"start":{"line":130,"column":2},"end":{"line":130,"column":55}},"54":{"start":{"line":131,"column":2},"end":{"line":131,"column":47}},"55":{"start":{"line":132,"column":2},"end":{"line":132,"column":22}},"56":{"start":{"line":136,"column":2},"end":{"line":136,"column":31}},"57":{"start":{"line":137,"column":2},"end":{"line":140,"column":5}},"58":{"start":{"line":138,"column":21},"end":{"line":138,"column":41}},"59":{"start":{"line":139,"column":4},"end":{"line":139,"column":73}},"60":{"start":{"line":141,"column":2},"end":{"line":141,"column":22}},"61":{"start":{"line":145,"column":21},"end":{"line":145,"column":61}},"62":{"start":{"line":147,"column":2},"end":{"line":154,"column":3}},"63":{"start":{"line":148,"column":22},"end":{"line":148,"column":28}},"64":{"start":{"line":149,"column":4},"end":{"line":153,"column":6}},"65":{"start":{"line":155,"column":2},"end":{"line":162,"column":3}},"66":{"start":{"line":156,"column":22},"end":{"line":156,"column":32}},"67":{"start":{"line":157,"column":4},"end":{"line":161,"column":6}},"68":{"start":{"line":163,"column":2},"end":{"line":170,"column":3}},"69":{"start":{"line":164,"column":22},"end":{"line":164,"column":31}},"70":{"start":{"line":165,"column":4},"end":{"line":169,"column":6}},"71":{"start":{"line":171,"column":2},"end":{"line":178,"column":3}},"72":{"start":{"line":172,"column":22},"end":{"line":172,"column":32}},"73":{"start":{"line":173,"column":4},"end":{"line":177,"column":6}},"74":{"start":{"line":179,"column":2},"end":{"line":179,"column":22}},"75":{"start":{"line":189,"column":21},"end":{"line":189,"column":45}},"76":{"start":{"line":190,"column":2},"end":{"line":241,"column":5}},"77":{"start":{"line":192,"column":4},"end":{"line":240,"column":5}},"78":{"start":{"line":193,"column":43},"end":{"line":193,"column":65}},"79":{"start":{"line":194,"column":6},"end":{"line":215,"column":7}},"80":{"start":{"line":195,"column":8},"end":{"line":214,"column":9}},"81":{"start":{"line":196,"column":23},"end":{"line":196,"column":43}},"82":{"start":{"line":197,"column":10},"end":{"line":202,"column":11}},"83":{"start":{"line":198,"column":24},"end":{"line":198,"column":69}},"84":{"start":{"line":199,"column":12},"end":{"line":201,"column":13}},"85":{"start":{"line":200,"column":14},"end":{"line":200,"column":40}},"86":{"start":{"line":204,"column":23},"end":{"line":204,"column":50}},"87":{"start":{"line":207,"column":10},"end":{"line":213,"column":11}},"88":{"start":{"line":208,"column":12},"end":{"line":208,"column":39}},"89":{"start":{"line":209,"column":12},"end":{"line":209,"column":42}},"90":{"start":{"line":212,"column":12},"end":{"line":212,"column":80}},"91":{"start":{"line":218,"column":6},"end":{"line":239,"column":7}},"92":{"start":{"line":220,"column":28},"end":{"line":220,"column":71}},"93":{"start":{"line":221,"column":8},"end":{"line":231,"column":9}},"94":{"start":{"line":222,"column":10},"end":{"line":222,"column":60}},"95":{"start":{"line":224,"column":23},"end":{"line":224,"column":59}},"96":{"start":{"line":225,"column":10},"end":{"line":230,"column":11}},"97":{"start":{"line":226,"column":24},"end":{"line":226,"column":47}},"98":{"start":{"line":227,"column":12},"end":{"line":229,"column":13}},"99":{"start":{"line":228,"column":14},"end":{"line":228,"column":56}},"100":{"start":{"line":233,"column":21},"end":{"line":233,"column":64}},"101":{"start":{"line":234,"column":8},"end":{"line":238,"column":9}},"102":{"start":{"line":235,"column":10},"end":{"line":235,"column":53}},"103":{"start":{"line":237,"column":10},"end":{"line":237,"column":72}},"104":{"start":{"line":252,"column":19},"end":{"line":252,"column":21}},"105":{"start":{"line":253,"column":21},"end":{"line":253,"column":30}},"106":{"start":{"line":254,"column":19},"end":{"line":254,"column":21}},"107":{"start":{"line":255,"column":19},"end":{"line":255,"column":41}},"108":{"start":{"line":256,"column":24},"end":{"line":256,"column":46}},"109":{"start":{"line":257,"column":24},"end":{"line":257,"column":46}},"110":{"start":{"line":261,"column":17},"end":{"line":261,"column":52}},"111":{"start":{"line":264,"column":2},"end":{"line":277,"column":3}},"112":{"start":{"line":266,"column":4},"end":{"line":276,"column":5}},"113":{"start":{"line":267,"column":6},"end":{"line":267,"column":37}},"114":{"start":{"line":268,"column":29},"end":{"line":271,"column":7}},"115":{"start":{"line":272,"column":6},"end":{"line":275,"column":7}},"116":{"start":{"line":274,"column":8},"end":{"line":274,"column":41}},"117":{"start":{"line":284,"column":2},"end":{"line":290,"column":4}},"118":{"start":{"line":293,"column":19},"end":{"line":293,"column":57}},"119":{"start":{"line":294,"column":21},"end":{"line":300,"column":3}},"120":{"start":{"line":301,"column":18},"end":{"line":301,"column":39}},"121":{"start":{"line":303,"column":2},"end":{"line":306,"column":5}},"122":{"start":{"line":304,"column":4},"end":{"line":304,"column":69}},"123":{"start":{"line":305,"column":4},"end":{"line":305,"column":28}},"124":{"start":{"line":311,"column":2},"end":{"line":311,"column":64}},"125":{"start":{"line":312,"column":2},"end":{"line":316,"column":4}},"126":{"start":{"line":318,"column":2},"end":{"line":401,"column":3}},"127":{"start":{"line":321,"column":6},"end":{"line":321,"column":53}},"128":{"start":{"line":323,"column":6},"end":{"line":323,"column":52}},"129":{"start":{"line":325,"column":6},"end":{"line":357,"column":7}},"130":{"start":{"line":328,"column":8},"end":{"line":328,"column":61}},"131":{"start":{"line":329,"column":8},"end":{"line":331,"column":9}},"132":{"start":{"line":330,"column":10},"end":{"line":330,"column":53}},"133":{"start":{"line":332,"column":8},"end":{"line":335,"column":10}},"134":{"start":{"line":336,"column":8},"end":{"line":356,"column":9}},"135":{"start":{"line":337,"column":10},"end":{"line":355,"column":13}},"136":{"start":{"line":338,"column":12},"end":{"line":354,"column":13}},"137":{"start":{"line":339,"column":30},"end":{"line":339,"column":50}},"138":{"start":{"line":340,"column":14},"end":{"line":351,"column":17}},"139":{"start":{"line":341,"column":33},"end":{"line":341,"column":69}},"140":{"start":{"line":344,"column":16},"end":{"line":350,"column":17}},"141":{"start":{"line":345,"column":18},"end":{"line":349,"column":20}},"142":{"start":{"line":353,"column":14},"end":{"line":353,"column":78}},"143":{"start":{"line":359,"column":6},"end":{"line":371,"column":7}},"144":{"start":{"line":362,"column":8},"end":{"line":370,"column":9}},"145":{"start":{"line":363,"column":10},"end":{"line":363,"column":22}},"146":{"start":{"line":364,"column":10},"end":{"line":364,"column":63}},"147":{"start":{"line":365,"column":10},"end":{"line":369,"column":12}},"148":{"start":{"line":372,"column":6},"end":{"line":372,"column":12}},"149":{"start":{"line":374,"column":6},"end":{"line":374,"column":51}},"150":{"start":{"line":375,"column":6},"end":{"line":375,"column":12}},"151":{"start":{"line":377,"column":6},"end":{"line":377,"column":59}},"152":{"start":{"line":378,"column":6},"end":{"line":378,"column":62}},"153":{"start":{"line":380,"column":6},"end":{"line":385,"column":7}},"154":{"start":{"line":381,"column":8},"end":{"line":384,"column":10}},"155":{"start":{"line":387,"column":6},"end":{"line":387,"column":37}},"156":{"start":{"line":388,"column":6},"end":{"line":388,"column":42}},"157":{"start":{"line":389,"column":6},"end":{"line":399,"column":7}},"158":{"start":{"line":391,"column":8},"end":{"line":391,"column":63}},"159":{"start":{"line":393,"column":8},"end":{"line":398,"column":9}},"160":{"start":{"line":394,"column":10},"end":{"line":394,"column":51}},"161":{"start":{"line":395,"column":10},"end":{"line":395,"column":56}},"162":{"start":{"line":396,"column":10},"end":{"line":396,"column":54}},"163":{"start":{"line":397,"column":10},"end":{"line":397,"column":53}},"164":{"start":{"line":400,"column":6},"end":{"line":400,"column":53}},"165":{"start":{"line":406,"column":2},"end":{"line":406,"column":36}},"166":{"start":{"line":407,"column":16},"end":{"line":407,"column":49}},"167":{"start":{"line":409,"column":2},"end":{"line":521,"column":3}},"168":{"start":{"line":414,"column":6},"end":{"line":414,"column":65}},"169":{"start":{"line":415,"column":6},"end":{"line":419,"column":7}},"170":{"start":{"line":416,"column":8},"end":{"line":416,"column":38}},"171":{"start":{"line":417,"column":8},"end":{"line":417,"column":38}},"172":{"start":{"line":418,"column":8},"end":{"line":418,"column":29}},"173":{"start":{"line":420,"column":6},"end":{"line":420,"column":68}},"174":{"start":{"line":421,"column":6},"end":{"line":421,"column":65}},"175":{"start":{"line":422,"column":6},"end":{"line":422,"column":49}},"176":{"start":{"line":423,"column":6},"end":{"line":423,"column":47}},"177":{"start":{"line":424,"column":6},"end":{"line":427,"column":8}},"178":{"start":{"line":428,"column":6},"end":{"line":428,"column":35}},"179":{"start":{"line":429,"column":6},"end":{"line":429,"column":12}},"180":{"start":{"line":431,"column":6},"end":{"line":452,"column":7}},"181":{"start":{"line":432,"column":8},"end":{"line":438,"column":9}},"182":{"start":{"line":433,"column":10},"end":{"line":437,"column":12}},"183":{"start":{"line":440,"column":25},"end":{"line":440,"column":58}},"184":{"start":{"line":441,"column":25},"end":{"line":441,"column":60}},"185":{"start":{"line":442,"column":25},"end":{"line":442,"column":69}},"186":{"start":{"line":444,"column":8},"end":{"line":451,"column":9}},"187":{"start":{"line":445,"column":10},"end":{"line":450,"column":11}},"188":{"start":{"line":446,"column":12},"end":{"line":446,"column":43}},"189":{"start":{"line":447,"column":12},"end":{"line":447,"column":43}},"190":{"start":{"line":448,"column":17},"end":{"line":450,"column":11}},"191":{"start":{"line":449,"column":12},"end":{"line":449,"column":43}},"192":{"start":{"line":454,"column":6},"end":{"line":456,"column":18}},"193":{"start":{"line":459,"column":6},"end":{"line":466,"column":7}},"194":{"start":{"line":465,"column":8},"end":{"line":465,"column":41}},"195":{"start":{"line":467,"column":6},"end":{"line":467,"column":49}},"196":{"start":{"line":469,"column":6},"end":{"line":475,"column":8}},"197":{"start":{"line":482,"column":6},"end":{"line":489,"column":7}},"198":{"start":{"line":483,"column":8},"end":{"line":483,"column":44}},"199":{"start":{"line":484,"column":8},"end":{"line":484,"column":47}},"200":{"start":{"line":485,"column":8},"end":{"line":488,"column":9}},"201":{"start":{"line":486,"column":10},"end":{"line":486,"column":54}},"202":{"start":{"line":487,"column":10},"end":{"line":487,"column":57}},"203":{"start":{"line":490,"column":6},"end":{"line":490,"column":40}},"204":{"start":{"line":491,"column":6},"end":{"line":491,"column":38}},"205":{"start":{"line":492,"column":6},"end":{"line":492,"column":54}},"206":{"start":{"line":493,"column":6},"end":{"line":493,"column":35}},"207":{"start":{"line":494,"column":6},"end":{"line":494,"column":63}},"208":{"start":{"line":495,"column":6},"end":{"line":497,"column":8}},"209":{"start":{"line":498,"column":6},"end":{"line":498,"column":44}},"210":{"start":{"line":499,"column":6},"end":{"line":503,"column":8}},"211":{"start":{"line":504,"column":6},"end":{"line":504,"column":30}},"212":{"start":{"line":508,"column":6},"end":{"line":519,"column":7}},"213":{"start":{"line":509,"column":8},"end":{"line":509,"column":70}},"214":{"start":{"line":510,"column":8},"end":{"line":510,"column":67}},"215":{"start":{"line":511,"column":27},"end":{"line":511,"column":51}},"216":{"start":{"line":512,"column":8},"end":{"line":512,"column":51}},"217":{"start":{"line":513,"column":8},"end":{"line":513,"column":59}},"218":{"start":{"line":514,"column":8},"end":{"line":517,"column":10}},"219":{"start":{"line":518,"column":8},"end":{"line":518,"column":37}},"220":{"start":{"line":520,"column":6},"end":{"line":520,"column":12}},"221":{"start":{"line":523,"column":2},"end":{"line":523,"column":18}},"222":{"start":{"line":529,"column":26},"end":{"line":529,"column":34}},"223":{"start":{"line":536,"column":18},"end":{"line":536,"column":76}},"224":{"start":{"line":537,"column":17},"end":{"line":537,"column":39}},"225":{"start":{"line":539,"column":22},"end":{"line":539,"column":48}},"226":{"start":{"line":540,"column":2},"end":{"line":663,"column":3}},"227":{"start":{"line":542,"column":6},"end":{"line":542,"column":35}},"228":{"start":{"line":543,"column":6},"end":{"line":543,"column":26}},"229":{"start":{"line":544,"column":6},"end":{"line":544,"column":41}},"230":{"start":{"line":545,"column":6},"end":{"line":545,"column":12}},"231":{"start":{"line":547,"column":6},"end":{"line":549,"column":18}},"232":{"start":{"line":550,"column":6},"end":{"line":553,"column":8}},"233":{"start":{"line":554,"column":6},"end":{"line":554,"column":37}},"234":{"start":{"line":555,"column":6},"end":{"line":555,"column":12}},"235":{"start":{"line":557,"column":6},"end":{"line":560,"column":20}},"236":{"start":{"line":561,"column":6},"end":{"line":565,"column":8}},"237":{"start":{"line":566,"column":6},"end":{"line":566,"column":39}},"238":{"start":{"line":567,"column":6},"end":{"line":567,"column":12}},"239":{"start":{"line":569,"column":6},"end":{"line":569,"column":23}},"240":{"start":{"line":570,"column":6},"end":{"line":570,"column":35}},"241":{"start":{"line":571,"column":6},"end":{"line":571,"column":38}},"242":{"start":{"line":575,"column":6},"end":{"line":575,"column":69}},"243":{"start":{"line":578,"column":6},"end":{"line":578,"column":65}},"244":{"start":{"line":579,"column":6},"end":{"line":579,"column":67}},"245":{"start":{"line":580,"column":6},"end":{"line":614,"column":7}},"246":{"start":{"line":581,"column":31},"end":{"line":581,"column":63}},"247":{"start":{"line":582,"column":31},"end":{"line":582,"column":64}},"248":{"start":{"line":587,"column":8},"end":{"line":613,"column":9}},"249":{"start":{"line":594,"column":10},"end":{"line":594,"column":25}},"250":{"start":{"line":595,"column":10},"end":{"line":595,"column":48}},"251":{"start":{"line":596,"column":10},"end":{"line":596,"column":49}},"252":{"start":{"line":598,"column":10},"end":{"line":598,"column":51}},"253":{"start":{"line":600,"column":10},"end":{"line":600,"column":62}},"254":{"start":{"line":601,"column":10},"end":{"line":612,"column":21}},"255":{"start":{"line":615,"column":6},"end":{"line":615,"column":12}},"256":{"start":{"line":617,"column":6},"end":{"line":617,"column":23}},"257":{"start":{"line":620,"column":6},"end":{"line":620,"column":36}},"258":{"start":{"line":621,"column":6},"end":{"line":621,"column":38}},"259":{"start":{"line":622,"column":6},"end":{"line":622,"column":12}},"260":{"start":{"line":624,"column":6},"end":{"line":624,"column":29}},"261":{"start":{"line":625,"column":6},"end":{"line":637,"column":7}},"262":{"start":{"line":626,"column":8},"end":{"line":636,"column":19}},"263":{"start":{"line":638,"column":6},"end":{"line":647,"column":7}},"264":{"start":{"line":645,"column":8},"end":{"line":645,"column":42}},"265":{"start":{"line":646,"column":8},"end":{"line":646,"column":14}},"266":{"start":{"line":649,"column":6},"end":{"line":649,"column":12}},"267":{"start":{"line":651,"column":6},"end":{"line":651,"column":47}},"268":{"start":{"line":652,"column":6},"end":{"line":662,"column":17}},"269":{"start":{"line":664,"column":2},"end":{"line":671,"column":4}},"270":{"start":{"line":675,"column":36},"end":{"line":675,"column":71}},"271":{"start":{"line":677,"column":2},"end":{"line":677,"column":56}},"272":{"start":{"line":679,"column":2},"end":{"line":679,"column":49}},"273":{"start":{"line":681,"column":2},"end":{"line":683,"column":3}},"274":{"start":{"line":682,"column":4},"end":{"line":682,"column":47}},"275":{"start":{"line":685,"column":2},"end":{"line":685,"column":74}},"276":{"start":{"line":686,"column":2},"end":{"line":686,"column":35}},"277":{"start":{"line":691,"column":4},"end":{"line":693,"column":54}},"278":{"start":{"line":694,"column":2},"end":{"line":694,"column":24}},"279":{"start":{"line":698,"column":33},"end":{"line":698,"column":35}},"280":{"start":{"line":699,"column":2},"end":{"line":713,"column":3}},"281":{"start":{"line":700,"column":18},"end":{"line":700,"column":19}},"282":{"start":{"line":703,"column":4},"end":{"line":712,"column":7}},"283":{"start":{"line":704,"column":6},"end":{"line":704,"column":19}},"284":{"start":{"line":705,"column":36},"end":{"line":710,"column":7}},"285":{"start":{"line":711,"column":6},"end":{"line":711,"column":57}},"286":{"start":{"line":714,"column":2},"end":{"line":714,"column":32}},"287":{"start":{"line":718,"column":19},"end":{"line":718,"column":21}},"288":{"start":{"line":719,"column":24},"end":{"line":719,"column":59}},"289":{"start":{"line":721,"column":2},"end":{"line":734,"column":3}},"290":{"start":{"line":722,"column":4},"end":{"line":728,"column":5}},"291":{"start":{"line":724,"column":6},"end":{"line":724,"column":47}},"292":{"start":{"line":727,"column":6},"end":{"line":727,"column":37}},"293":{"start":{"line":729,"column":9},"end":{"line":734,"column":3}},"294":{"start":{"line":733,"column":4},"end":{"line":733,"column":35}},"295":{"start":{"line":736,"column":2},"end":{"line":738,"column":3}},"296":{"start":{"line":737,"column":4},"end":{"line":737,"column":35}},"297":{"start":{"line":740,"column":2},"end":{"line":740,"column":33}},"298":{"start":{"line":742,"column":2},"end":{"line":753,"column":3}},"299":{"start":{"line":746,"column":35},"end":{"line":749,"column":5}},"300":{"start":{"line":750,"column":4},"end":{"line":752,"column":5}},"301":{"start":{"line":751,"column":6},"end":{"line":751,"column":62}},"302":{"start":{"line":754,"column":2},"end":{"line":754,"column":20}},"303":{"start":{"line":758,"column":19},"end":{"line":758,"column":21}},"304":{"start":{"line":759,"column":35},"end":{"line":759,"column":40}},"305":{"start":{"line":760,"column":22},"end":{"line":760,"column":48}},"306":{"start":{"line":761,"column":23},"end":{"line":761,"column":25}},"307":{"start":{"line":762,"column":2},"end":{"line":774,"column":3}},"308":{"start":{"line":763,"column":27},"end":{"line":763,"column":34}},"309":{"start":{"line":764,"column":4},"end":{"line":771,"column":5}},"310":{"start":{"line":765,"column":28},"end":{"line":765,"column":67}},"311":{"start":{"line":766,"column":6},"end":{"line":768,"column":9}},"312":{"start":{"line":767,"column":8},"end":{"line":767,"column":40}},"313":{"start":{"line":770,"column":6},"end":{"line":770,"column":33}},"314":{"start":{"line":773,"column":4},"end":{"line":773,"column":31}},"315":{"start":{"line":776,"column":2},"end":{"line":778,"column":5}},"316":{"start":{"line":777,"column":4},"end":{"line":777,"column":67}},"317":{"start":{"line":779,"column":2},"end":{"line":779,"column":18}},"318":{"start":{"line":783,"column":22},"end":{"line":783,"column":27}},"319":{"start":{"line":785,"column":4},"end":{"line":785,"column":68}},"320":{"start":{"line":786,"column":25},"end":{"line":786,"column":66}},"321":{"start":{"line":788,"column":4},"end":{"line":788,"column":61}},"322":{"start":{"line":789,"column":30},"end":{"line":789,"column":55}},"323":{"start":{"line":790,"column":29},"end":{"line":790,"column":61}},"324":{"start":{"line":793,"column":2},"end":{"line":795,"column":27}},"325":{"start":{"line":796,"column":17},"end":{"line":796,"column":45}},"326":{"start":{"line":810,"column":2},"end":{"line":812,"column":3}},"327":{"start":{"line":811,"column":4},"end":{"line":811,"column":40}},"328":{"start":{"line":814,"column":2},"end":{"line":814,"column":59}},"329":{"start":{"line":816,"column":25},"end":{"line":816,"column":58}},"330":{"start":{"line":817,"column":2},"end":{"line":848,"column":3}},"331":{"start":{"line":818,"column":4},"end":{"line":826,"column":5}},"332":{"start":{"line":819,"column":6},"end":{"line":819,"column":39}},"333":{"start":{"line":820,"column":6},"end":{"line":822,"column":9}},"334":{"start":{"line":824,"column":6},"end":{"line":824,"column":73}},"335":{"start":{"line":825,"column":6},"end":{"line":825,"column":47}},"336":{"start":{"line":829,"column":4},"end":{"line":847,"column":5}},"337":{"start":{"line":835,"column":6},"end":{"line":835,"column":49}},"338":{"start":{"line":836,"column":6},"end":{"line":836,"column":36}},"339":{"start":{"line":837,"column":6},"end":{"line":841,"column":8}},"340":{"start":{"line":842,"column":6},"end":{"line":842,"column":58}},"341":{"start":{"line":846,"column":6},"end":{"line":846,"column":27}},"342":{"start":{"line":849,"column":2},"end":{"line":849,"column":23}},"343":{"start":{"line":853,"column":19},"end":{"line":853,"column":21}},"344":{"start":{"line":854,"column":27},"end":{"line":854,"column":54}},"345":{"start":{"line":862,"column":2},"end":{"line":925,"column":5}},"346":{"start":{"line":863,"column":47},"end":{"line":863,"column":49}},"347":{"start":{"line":864,"column":4},"end":{"line":864,"column":43}},"348":{"start":{"line":865,"column":4},"end":{"line":865,"column":41}},"349":{"start":{"line":866,"column":4},"end":{"line":866,"column":52}},"350":{"start":{"line":867,"column":4},"end":{"line":872,"column":20}},"351":{"start":{"line":873,"column":4},"end":{"line":878,"column":20}},"352":{"start":{"line":881,"column":4},"end":{"line":883,"column":5}},"353":{"start":{"line":882,"column":6},"end":{"line":882,"column":13}},"354":{"start":{"line":887,"column":4},"end":{"line":924,"column":5}},"355":{"start":{"line":897,"column":6},"end":{"line":897,"column":45}},"356":{"start":{"line":898,"column":6},"end":{"line":898,"column":70}},"357":{"start":{"line":899,"column":6},"end":{"line":899,"column":37}},"358":{"start":{"line":900,"column":6},"end":{"line":900,"column":47}},"359":{"start":{"line":901,"column":6},"end":{"line":901,"column":30}},"360":{"start":{"line":904,"column":6},"end":{"line":909,"column":8}},"361":{"start":{"line":910,"column":6},"end":{"line":923,"column":7}},"362":{"start":{"line":913,"column":8},"end":{"line":913,"column":59}},"363":{"start":{"line":914,"column":8},"end":{"line":914,"column":49}},"364":{"start":{"line":915,"column":8},"end":{"line":915,"column":57}},"365":{"start":{"line":916,"column":8},"end":{"line":916,"column":59}},"366":{"start":{"line":917,"column":8},"end":{"line":922,"column":10}},"367":{"start":{"line":927,"column":2},"end":{"line":930,"column":3}},"368":{"start":{"line":928,"column":4},"end":{"line":928,"column":55}},"369":{"start":{"line":929,"column":4},"end":{"line":929,"column":38}},"370":{"start":{"line":931,"column":2},"end":{"line":931,"column":18}},"371":{"start":{"line":934,"column":26},"end":{"line":973,"column":1}},"372":{"start":{"line":935,"column":2},"end":{"line":938,"column":3}},"373":{"start":{"line":936,"column":23},"end":{"line":936,"column":75}},"374":{"start":{"line":937,"column":4},"end":{"line":937,"column":24}},"375":{"start":{"line":940,"column":19},"end":{"line":971,"column":3}},"376":{"start":{"line":942,"column":6},"end":{"line":969,"column":7}},"377":{"start":{"line":943,"column":8},"end":{"line":950,"column":9}},"378":{"start":{"line":945,"column":10},"end":{"line":949,"column":12}},"379":{"start":{"line":952,"column":8},"end":{"line":956,"column":10}},"380":{"start":{"line":958,"column":23},"end":{"line":962,"column":9}},"381":{"start":{"line":963,"column":8},"end":{"line":968,"column":10}},"382":{"start":{"line":972,"column":2},"end":{"line":972,"column":18}},"383":{"start":{"line":975,"column":26},"end":{"line":981,"column":1}},"384":{"start":{"line":976,"column":2},"end":{"line":980,"column":4}},"385":{"start":{"line":983,"column":0},"end":{"line":983,"column":74}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":49,"column":21},"end":{"line":49,"column":22}},"loc":{"start":{"line":49,"column":35},"end":{"line":60,"column":1}},"line":49},"1":{"name":"(anonymous_1)","decl":{"start":{"line":62,"column":24},"end":{"line":62,"column":25}},"loc":{"start":{"line":62,"column":38},"end":{"line":65,"column":1}},"line":62},"2":{"name":"(anonymous_2)","decl":{"start":{"line":67,"column":25},"end":{"line":67,"column":26}},"loc":{"start":{"line":67,"column":39},"end":{"line":70,"column":1}},"line":67},"3":{"name":"(anonymous_3)","decl":{"start":{"line":72,"column":22},"end":{"line":72,"column":23}},"loc":{"start":{"line":72,"column":36},"end":{"line":75,"column":1}},"line":72},"4":{"name":"(anonymous_4)","decl":{"start":{"line":77,"column":22},"end":{"line":77,"column":23}},"loc":{"start":{"line":77,"column":36},"end":{"line":80,"column":1}},"line":77},"5":{"name":"(anonymous_5)","decl":{"start":{"line":82,"column":22},"end":{"line":82,"column":23}},"loc":{"start":{"line":82,"column":36},"end":{"line":85,"column":1}},"line":82},"6":{"name":"getSessionId","decl":{"start":{"line":87,"column":9},"end":{"line":87,"column":21}},"loc":{"start":{"line":87,"column":31},"end":{"line":96,"column":1}},"line":87},"7":{"name":"addMinIdlength","decl":{"start":{"line":98,"column":9},"end":{"line":98,"column":23}},"loc":{"start":{"line":98,"column":26},"end":{"line":100,"column":1}},"line":98},"8":{"name":"setPriceQuanityInPayload","decl":{"start":{"line":102,"column":9},"end":{"line":102,"column":33}},"loc":{"start":{"line":102,"column":55},"end":{"line":116,"column":1}},"line":102},"9":{"name":"createRevenuePayload","decl":{"start":{"line":118,"column":9},"end":{"line":118,"column":29}},"loc":{"start":{"line":118,"column":51},"end":{"line":126,"column":1}},"line":118},"10":{"name":"updateTraitsObject","decl":{"start":{"line":128,"column":9},"end":{"line":128,"column":27}},"loc":{"start":{"line":128,"column":63},"end":{"line":133,"column":1}},"line":128},"11":{"name":"prepareTraitsConfig","decl":{"start":{"line":135,"column":9},"end":{"line":135,"column":28}},"loc":{"start":{"line":135,"column":75},"end":{"line":142,"column":1}},"line":135},"12":{"name":"(anonymous_12)","decl":{"start":{"line":137,"column":30},"end":{"line":137,"column":31}},"loc":{"start":{"line":137,"column":47},"end":{"line":140,"column":3}},"line":137},"13":{"name":"handleTraits","decl":{"start":{"line":144,"column":9},"end":{"line":144,"column":21}},"loc":{"start":{"line":144,"column":49},"end":{"line":180,"column":1}},"line":144},"14":{"name":"updateConfigProperty","decl":{"start":{"line":182,"column":9},"end":{"line":182,"column":29}},"loc":{"start":{"line":188,"column":2},"end":{"line":242,"column":1}},"line":188},"15":{"name":"(anonymous_15)","decl":{"start":{"line":190,"column":21},"end":{"line":190,"column":22}},"loc":{"start":{"line":190,"column":34},"end":{"line":241,"column":3}},"line":190},"16":{"name":"responseBuilderSimple","decl":{"start":{"line":244,"column":9},"end":{"line":244,"column":30}},"loc":{"start":{"line":251,"column":2},"end":{"line":524,"column":1}},"line":251},"17":{"name":"(anonymous_17)","decl":{"start":{"line":303,"column":18},"end":{"line":303,"column":19}},"loc":{"start":{"line":303,"column":28},"end":{"line":306,"column":3}},"line":303},"18":{"name":"(anonymous_18)","decl":{"start":{"line":337,"column":38},"end":{"line":337,"column":39}},"loc":{"start":{"line":337,"column":47},"end":{"line":355,"column":11}},"line":337},"19":{"name":"(anonymous_19)","decl":{"start":{"line":340,"column":43},"end":{"line":340,"column":44}},"loc":{"start":{"line":340,"column":50},"end":{"line":351,"column":15}},"line":340},"20":{"name":"processSingleMessage","decl":{"start":{"line":528,"column":9},"end":{"line":528,"column":29}},"loc":{"start":{"line":528,"column":52},"end":{"line":672,"column":1}},"line":528},"21":{"name":"createProductPurchasedEvent","decl":{"start":{"line":674,"column":9},"end":{"line":674,"column":36}},"loc":{"start":{"line":674,"column":77},"end":{"line":687,"column":1}},"line":674},"22":{"name":"isProductArrayInPayload","decl":{"start":{"line":689,"column":9},"end":{"line":689,"column":32}},"loc":{"start":{"line":689,"column":42},"end":{"line":695,"column":1}},"line":689},"23":{"name":"getProductPurchasedEvents","decl":{"start":{"line":697,"column":9},"end":{"line":697,"column":34}},"loc":{"start":{"line":697,"column":57},"end":{"line":715,"column":1}},"line":697},"24":{"name":"(anonymous_24)","decl":{"start":{"line":703,"column":40},"end":{"line":703,"column":41}},"loc":{"start":{"line":703,"column":51},"end":{"line":712,"column":5}},"line":703},"25":{"name":"trackRevenueEvent","decl":{"start":{"line":717,"column":9},"end":{"line":717,"column":26}},"loc":{"start":{"line":717,"column":49},"end":{"line":755,"column":1}},"line":717},"26":{"name":"process","decl":{"start":{"line":757,"column":9},"end":{"line":757,"column":16}},"loc":{"start":{"line":757,"column":24},"end":{"line":780,"column":1}},"line":757},"27":{"name":"(anonymous_27)","decl":{"start":{"line":766,"column":28},"end":{"line":766,"column":29}},"loc":{"start":{"line":766,"column":44},"end":{"line":768,"column":7}},"line":766},"28":{"name":"(anonymous_28)","decl":{"start":{"line":776,"column":23},"end":{"line":776,"column":24}},"loc":{"start":{"line":776,"column":36},"end":{"line":778,"column":3}},"line":776},"29":{"name":"getBatchEvents","decl":{"start":{"line":782,"column":9},"end":{"line":782,"column":23}},"loc":{"start":{"line":782,"column":76},"end":{"line":850,"column":1}},"line":782},"30":{"name":"batch","decl":{"start":{"line":852,"column":9},"end":{"line":852,"column":14}},"loc":{"start":{"line":852,"column":27},"end":{"line":932,"column":1}},"line":852},"31":{"name":"(anonymous_31)","decl":{"start":{"line":862,"column":21},"end":{"line":862,"column":22}},"loc":{"start":{"line":862,"column":27},"end":{"line":925,"column":3}},"line":862},"32":{"name":"(anonymous_32)","decl":{"start":{"line":934,"column":26},"end":{"line":934,"column":27}},"loc":{"start":{"line":934,"column":42},"end":{"line":973,"column":1}},"line":934},"33":{"name":"(anonymous_33)","decl":{"start":{"line":941,"column":15},"end":{"line":941,"column":16}},"loc":{"start":{"line":941,"column":30},"end":{"line":970,"column":5}},"line":941},"34":{"name":"(anonymous_34)","decl":{"start":{"line":975,"column":26},"end":{"line":975,"column":27}},"loc":{"start":{"line":975,"column":35},"end":{"line":981,"column":1}},"line":975}},"branchMap":{"0":{"loc":{"start":{"line":51,"column":2},"end":{"line":58,"column":3}},"type":"switch","locations":[{"start":{"line":52,"column":4},"end":{"line":54,"column":12}},{"start":{"line":55,"column":4},"end":{"line":57,"column":24}}],"line":51},"1":{"loc":{"start":{"line":89,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":89,"column":2},"end":{"line":94,"column":3}},{"start":{"line":89,"column":2},"end":{"line":94,"column":3}}],"line":89},"2":{"loc":{"start":{"line":90,"column":4},"end":{"line":92,"column":5}},"type":"if","locations":[{"start":{"line":90,"column":4},"end":{"line":92,"column":5}},{"start":{"line":90,"column":4},"end":{"line":92,"column":5}}],"line":90},"3":{"loc":{"start":{"line":105,"column":2},"end":{"line":111,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":111,"column":3}},{"start":{"line":105,"column":2},"end":{"line":111,"column":3}}],"line":105},"4":{"loc":{"start":{"line":107,"column":15},"end":{"line":107,"column":47}},"type":"binary-expr","locations":[{"start":{"line":107,"column":15},"end":{"line":107,"column":42}},{"start":{"line":107,"column":46},"end":{"line":107,"column":47}}],"line":107},"5":{"loc":{"start":{"line":121,"column":4},"end":{"line":123,"column":15}},"type":"binary-expr","locations":[{"start":{"line":121,"column":4},"end":{"line":121,"column":34}},{"start":{"line":122,"column":4},"end":{"line":122,"column":35}},{"start":{"line":123,"column":4},"end":{"line":123,"column":15}}],"line":121},"6":{"loc":{"start":{"line":147,"column":2},"end":{"line":154,"column":3}},"type":"if","locations":[{"start":{"line":147,"column":2},"end":{"line":154,"column":3}},{"start":{"line":147,"column":2},"end":{"line":154,"column":3}}],"line":147},"7":{"loc":{"start":{"line":155,"column":2},"end":{"line":162,"column":3}},"type":"if","locations":[{"start":{"line":155,"column":2},"end":{"line":162,"column":3}},{"start":{"line":155,"column":2},"end":{"line":162,"column":3}}],"line":155},"8":{"loc":{"start":{"line":163,"column":2},"end":{"line":170,"column":3}},"type":"if","locations":[{"start":{"line":163,"column":2},"end":{"line":170,"column":3}},{"start":{"line":163,"column":2},"end":{"line":170,"column":3}}],"line":163},"9":{"loc":{"start":{"line":171,"column":2},"end":{"line":178,"column":3}},"type":"if","locations":[{"start":{"line":171,"column":2},"end":{"line":178,"column":3}},{"start":{"line":171,"column":2},"end":{"line":178,"column":3}}],"line":171},"10":{"loc":{"start":{"line":192,"column":4},"end":{"line":240,"column":5}},"type":"if","locations":[{"start":{"line":192,"column":4},"end":{"line":240,"column":5}},{"start":{"line":192,"column":4},"end":{"line":240,"column":5}}],"line":192},"11":{"loc":{"start":{"line":194,"column":6},"end":{"line":215,"column":7}},"type":"if","locations":[{"start":{"line":194,"column":6},"end":{"line":215,"column":7}},{"start":{"line":194,"column":6},"end":{"line":215,"column":7}}],"line":194},"12":{"loc":{"start":{"line":195,"column":8},"end":{"line":214,"column":9}},"type":"if","locations":[{"start":{"line":195,"column":8},"end":{"line":214,"column":9}},{"start":{"line":195,"column":8},"end":{"line":214,"column":9}}],"line":195},"13":{"loc":{"start":{"line":197,"column":10},"end":{"line":202,"column":11}},"type":"if","locations":[{"start":{"line":197,"column":10},"end":{"line":202,"column":11}},{"start":{"line":197,"column":10},"end":{"line":202,"column":11}}],"line":197},"14":{"loc":{"start":{"line":199,"column":12},"end":{"line":201,"column":13}},"type":"if","locations":[{"start":{"line":199,"column":12},"end":{"line":201,"column":13}},{"start":{"line":199,"column":12},"end":{"line":201,"column":13}}],"line":199},"15":{"loc":{"start":{"line":199,"column":16},"end":{"line":199,"column":49}},"type":"binary-expr","locations":[{"start":{"line":199,"column":16},"end":{"line":199,"column":19}},{"start":{"line":199,"column":23},"end":{"line":199,"column":36}},{"start":{"line":199,"column":40},"end":{"line":199,"column":49}}],"line":199},"16":{"loc":{"start":{"line":207,"column":10},"end":{"line":213,"column":11}},"type":"if","locations":[{"start":{"line":207,"column":10},"end":{"line":213,"column":11}},{"start":{"line":207,"column":10},"end":{"line":213,"column":11}}],"line":207},"17":{"loc":{"start":{"line":218,"column":6},"end":{"line":239,"column":7}},"type":"if","locations":[{"start":{"line":218,"column":6},"end":{"line":239,"column":7}},{"start":{"line":218,"column":6},"end":{"line":239,"column":7}}],"line":218},"18":{"loc":{"start":{"line":221,"column":8},"end":{"line":231,"column":9}},"type":"if","locations":[{"start":{"line":221,"column":8},"end":{"line":231,"column":9}},{"start":{"line":221,"column":8},"end":{"line":231,"column":9}}],"line":221},"19":{"loc":{"start":{"line":225,"column":10},"end":{"line":230,"column":11}},"type":"if","locations":[{"start":{"line":225,"column":10},"end":{"line":230,"column":11}},{"start":{"line":225,"column":10},"end":{"line":230,"column":11}}],"line":225},"20":{"loc":{"start":{"line":227,"column":12},"end":{"line":229,"column":13}},"type":"if","locations":[{"start":{"line":227,"column":12},"end":{"line":229,"column":13}},{"start":{"line":227,"column":12},"end":{"line":229,"column":13}}],"line":227},"21":{"loc":{"start":{"line":227,"column":16},"end":{"line":227,"column":49}},"type":"binary-expr","locations":[{"start":{"line":227,"column":16},"end":{"line":227,"column":19}},{"start":{"line":227,"column":23},"end":{"line":227,"column":36}},{"start":{"line":227,"column":40},"end":{"line":227,"column":49}}],"line":227},"22":{"loc":{"start":{"line":234,"column":8},"end":{"line":238,"column":9}},"type":"if","locations":[{"start":{"line":234,"column":8},"end":{"line":238,"column":9}},{"start":{"line":234,"column":8},"end":{"line":238,"column":9}}],"line":234},"23":{"loc":{"start":{"line":264,"column":2},"end":{"line":277,"column":3}},"type":"if","locations":[{"start":{"line":264,"column":2},"end":{"line":277,"column":3}},{"start":{"line":264,"column":2},"end":{"line":277,"column":3}}],"line":264},"24":{"loc":{"start":{"line":266,"column":4},"end":{"line":276,"column":5}},"type":"if","locations":[{"start":{"line":266,"column":4},"end":{"line":276,"column":5}},{"start":{"line":266,"column":4},"end":{"line":276,"column":5}}],"line":266},"25":{"loc":{"start":{"line":272,"column":6},"end":{"line":275,"column":7}},"type":"if","locations":[{"start":{"line":272,"column":6},"end":{"line":275,"column":7}},{"start":{"line":272,"column":6},"end":{"line":275,"column":7}}],"line":272},"26":{"loc":{"start":{"line":293,"column":19},"end":{"line":293,"column":57}},"type":"binary-expr","locations":[{"start":{"line":293,"column":19},"end":{"line":293,"column":51}},{"start":{"line":293,"column":55},"end":{"line":293,"column":57}}],"line":293},"27":{"loc":{"start":{"line":311,"column":31},"end":{"line":311,"column":63}},"type":"binary-expr","locations":[{"start":{"line":311,"column":31},"end":{"line":311,"column":57}},{"start":{"line":311,"column":61},"end":{"line":311,"column":63}}],"line":311},"28":{"loc":{"start":{"line":318,"column":2},"end":{"line":401,"column":3}},"type":"switch","locations":[{"start":{"line":319,"column":4},"end":{"line":319,"column":28}},{"start":{"line":320,"column":4},"end":{"line":372,"column":12}},{"start":{"line":373,"column":4},"end":{"line":375,"column":12}},{"start":{"line":376,"column":4},"end":{"line":400,"column":53}}],"line":318},"29":{"loc":{"start":{"line":325,"column":6},"end":{"line":357,"column":7}},"type":"if","locations":[{"start":{"line":325,"column":6},"end":{"line":357,"column":7}},{"start":{"line":325,"column":6},"end":{"line":357,"column":7}}],"line":325},"30":{"loc":{"start":{"line":329,"column":8},"end":{"line":331,"column":9}},"type":"if","locations":[{"start":{"line":329,"column":8},"end":{"line":331,"column":9}},{"start":{"line":329,"column":8},"end":{"line":331,"column":9}}],"line":329},"31":{"loc":{"start":{"line":336,"column":8},"end":{"line":356,"column":9}},"type":"if","locations":[{"start":{"line":336,"column":8},"end":{"line":356,"column":9}},{"start":{"line":336,"column":8},"end":{"line":356,"column":9}}],"line":336},"32":{"loc":{"start":{"line":338,"column":12},"end":{"line":354,"column":13}},"type":"if","locations":[{"start":{"line":338,"column":12},"end":{"line":354,"column":13}},{"start":{"line":338,"column":12},"end":{"line":354,"column":13}}],"line":338},"33":{"loc":{"start":{"line":344,"column":16},"end":{"line":350,"column":17}},"type":"if","locations":[{"start":{"line":344,"column":16},"end":{"line":350,"column":17}},{"start":{"line":344,"column":16},"end":{"line":350,"column":17}}],"line":344},"34":{"loc":{"start":{"line":359,"column":6},"end":{"line":371,"column":7}},"type":"if","locations":[{"start":{"line":359,"column":6},"end":{"line":371,"column":7}},{"start":{"line":359,"column":6},"end":{"line":371,"column":7}}],"line":359},"35":{"loc":{"start":{"line":362,"column":8},"end":{"line":370,"column":9}},"type":"if","locations":[{"start":{"line":362,"column":8},"end":{"line":370,"column":9}},{"start":{"line":362,"column":8},"end":{"line":370,"column":9}}],"line":362},"36":{"loc":{"start":{"line":362,"column":12},"end":{"line":362,"column":70}},"type":"binary-expr","locations":[{"start":{"line":362,"column":12},"end":{"line":362,"column":21}},{"start":{"line":362,"column":25},"end":{"line":362,"column":45}},{"start":{"line":362,"column":49},"end":{"line":362,"column":70}}],"line":362},"37":{"loc":{"start":{"line":380,"column":6},"end":{"line":385,"column":7}},"type":"if","locations":[{"start":{"line":380,"column":6},"end":{"line":385,"column":7}},{"start":{"line":380,"column":6},"end":{"line":385,"column":7}}],"line":380},"38":{"loc":{"start":{"line":389,"column":6},"end":{"line":399,"column":7}},"type":"if","locations":[{"start":{"line":389,"column":6},"end":{"line":399,"column":7}},{"start":{"line":389,"column":6},"end":{"line":399,"column":7}}],"line":389},"39":{"loc":{"start":{"line":393,"column":8},"end":{"line":398,"column":9}},"type":"if","locations":[{"start":{"line":393,"column":8},"end":{"line":398,"column":9}},{"start":{"line":393,"column":8},"end":{"line":398,"column":9}}],"line":393},"40":{"loc":{"start":{"line":400,"column":15},"end":{"line":400,"column":52}},"type":"binary-expr","locations":[{"start":{"line":400,"column":15},"end":{"line":400,"column":24}},{"start":{"line":400,"column":28},"end":{"line":400,"column":52}}],"line":400},"41":{"loc":{"start":{"line":409,"column":2},"end":{"line":521,"column":3}},"type":"switch","locations":[{"start":{"line":410,"column":4},"end":{"line":429,"column":12}},{"start":{"line":430,"column":4},"end":{"line":520,"column":12}}],"line":409},"42":{"loc":{"start":{"line":415,"column":6},"end":{"line":419,"column":7}},"type":"if","locations":[{"start":{"line":415,"column":6},"end":{"line":419,"column":7}},{"start":{"line":415,"column":6},"end":{"line":419,"column":7}}],"line":415},"43":{"loc":{"start":{"line":431,"column":6},"end":{"line":452,"column":7}},"type":"if","locations":[{"start":{"line":431,"column":6},"end":{"line":452,"column":7}},{"start":{"line":431,"column":6},"end":{"line":452,"column":7}}],"line":431},"44":{"loc":{"start":{"line":432,"column":8},"end":{"line":438,"column":9}},"type":"if","locations":[{"start":{"line":432,"column":8},"end":{"line":438,"column":9}},{"start":{"line":432,"column":8},"end":{"line":438,"column":9}}],"line":432},"45":{"loc":{"start":{"line":444,"column":8},"end":{"line":451,"column":9}},"type":"if","locations":[{"start":{"line":444,"column":8},"end":{"line":451,"column":9}},{"start":{"line":444,"column":8},"end":{"line":451,"column":9}}],"line":444},"46":{"loc":{"start":{"line":445,"column":10},"end":{"line":450,"column":11}},"type":"if","locations":[{"start":{"line":445,"column":10},"end":{"line":450,"column":11}},{"start":{"line":445,"column":10},"end":{"line":450,"column":11}}],"line":445},"47":{"loc":{"start":{"line":448,"column":17},"end":{"line":450,"column":11}},"type":"if","locations":[{"start":{"line":448,"column":17},"end":{"line":450,"column":11}},{"start":{"line":448,"column":17},"end":{"line":450,"column":11}}],"line":448},"48":{"loc":{"start":{"line":459,"column":6},"end":{"line":466,"column":7}},"type":"if","locations":[{"start":{"line":459,"column":6},"end":{"line":466,"column":7}},{"start":{"line":459,"column":6},"end":{"line":466,"column":7}}],"line":459},"49":{"loc":{"start":{"line":460,"column":8},"end":{"line":463,"column":31}},"type":"binary-expr","locations":[{"start":{"line":460,"column":8},"end":{"line":460,"column":22}},{"start":{"line":461,"column":8},"end":{"line":461,"column":29}},{"start":{"line":462,"column":8},"end":{"line":462,"column":33}},{"start":{"line":463,"column":8},"end":{"line":463,"column":31}}],"line":460},"50":{"loc":{"start":{"line":482,"column":6},"end":{"line":489,"column":7}},"type":"if","locations":[{"start":{"line":482,"column":6},"end":{"line":489,"column":7}},{"start":{"line":482,"column":6},"end":{"line":489,"column":7}}],"line":482},"51":{"loc":{"start":{"line":485,"column":8},"end":{"line":488,"column":9}},"type":"if","locations":[{"start":{"line":485,"column":8},"end":{"line":488,"column":9}},{"start":{"line":485,"column":8},"end":{"line":488,"column":9}}],"line":485},"52":{"loc":{"start":{"line":508,"column":6},"end":{"line":519,"column":7}},"type":"if","locations":[{"start":{"line":508,"column":6},"end":{"line":519,"column":7}},{"start":{"line":508,"column":6},"end":{"line":519,"column":7}}],"line":508},"53":{"loc":{"start":{"line":508,"column":10},"end":{"line":508,"column":49}},"type":"binary-expr","locations":[{"start":{"line":508,"column":10},"end":{"line":508,"column":36}},{"start":{"line":508,"column":40},"end":{"line":508,"column":49}}],"line":508},"54":{"loc":{"start":{"line":536,"column":18},"end":{"line":536,"column":76}},"type":"binary-expr","locations":[{"start":{"line":536,"column":18},"end":{"line":536,"column":63}},{"start":{"line":536,"column":67},"end":{"line":536,"column":76}}],"line":536},"55":{"loc":{"start":{"line":540,"column":2},"end":{"line":663,"column":3}},"type":"switch","locations":[{"start":{"line":541,"column":4},"end":{"line":545,"column":12}},{"start":{"line":546,"column":4},"end":{"line":555,"column":12}},{"start":{"line":556,"column":4},"end":{"line":567,"column":12}},{"start":{"line":568,"column":4},"end":{"line":615,"column":12}},{"start":{"line":616,"column":4},"end":{"line":622,"column":12}},{"start":{"line":623,"column":4},"end":{"line":649,"column":12}},{"start":{"line":650,"column":4},"end":{"line":662,"column":17}}],"line":540},"56":{"loc":{"start":{"line":547,"column":25},"end":{"line":549,"column":10}},"type":"binary-expr","locations":[{"start":{"line":547,"column":25},"end":{"line":547,"column":37}},{"start":{"line":548,"column":8},"end":{"line":548,"column":43}},{"start":{"line":549,"column":8},"end":{"line":549,"column":10}}],"line":547},"57":{"loc":{"start":{"line":552,"column":14},"end":{"line":552,"column":65}},"type":"binary-expr","locations":[{"start":{"line":552,"column":14},"end":{"line":552,"column":26}},{"start":{"line":552,"column":30},"end":{"line":552,"column":65}}],"line":552},"58":{"loc":{"start":{"line":557,"column":25},"end":{"line":560,"column":10}},"type":"binary-expr","locations":[{"start":{"line":557,"column":25},"end":{"line":557,"column":37}},{"start":{"line":558,"column":8},"end":{"line":558,"column":21}},{"start":{"line":559,"column":8},"end":{"line":559,"column":43}},{"start":{"line":560,"column":8},"end":{"line":560,"column":10}}],"line":557},"59":{"loc":{"start":{"line":564,"column":10},"end":{"line":564,"column":78}},"type":"binary-expr","locations":[{"start":{"line":564,"column":10},"end":{"line":564,"column":22}},{"start":{"line":564,"column":26},"end":{"line":564,"column":39}},{"start":{"line":564,"column":43},"end":{"line":564,"column":78}}],"line":564},"60":{"loc":{"start":{"line":580,"column":6},"end":{"line":614,"column":7}},"type":"if","locations":[{"start":{"line":580,"column":6},"end":{"line":614,"column":7}},{"start":{"line":580,"column":6},"end":{"line":614,"column":7}}],"line":580},"61":{"loc":{"start":{"line":580,"column":10},"end":{"line":580,"column":43}},"type":"binary-expr","locations":[{"start":{"line":580,"column":10},"end":{"line":580,"column":24}},{"start":{"line":580,"column":28},"end":{"line":580,"column":43}}],"line":580},"62":{"loc":{"start":{"line":587,"column":8},"end":{"line":613,"column":9}},"type":"if","locations":[{"start":{"line":587,"column":8},"end":{"line":613,"column":9}},{"start":{"line":587,"column":8},"end":{"line":613,"column":9}}],"line":587},"63":{"loc":{"start":{"line":588,"column":10},"end":{"line":592,"column":47}},"type":"binary-expr","locations":[{"start":{"line":588,"column":10},"end":{"line":588,"column":24}},{"start":{"line":589,"column":10},"end":{"line":589,"column":44}},{"start":{"line":590,"column":10},"end":{"line":590,"column":24}},{"start":{"line":591,"column":11},"end":{"line":591,"column":45}},{"start":{"line":592,"column":12},"end":{"line":592,"column":46}}],"line":588},"64":{"loc":{"start":{"line":625,"column":6},"end":{"line":637,"column":7}},"type":"if","locations":[{"start":{"line":625,"column":6},"end":{"line":637,"column":7}},{"start":{"line":625,"column":6},"end":{"line":637,"column":7}}],"line":625},"65":{"loc":{"start":{"line":638,"column":6},"end":{"line":647,"column":7}},"type":"if","locations":[{"start":{"line":638,"column":6},"end":{"line":647,"column":7}},{"start":{"line":638,"column":6},"end":{"line":647,"column":7}}],"line":638},"66":{"loc":{"start":{"line":639,"column":8},"end":{"line":641,"column":60}},"type":"binary-expr","locations":[{"start":{"line":639,"column":8},"end":{"line":639,"column":26}},{"start":{"line":640,"column":8},"end":{"line":640,"column":55}},{"start":{"line":641,"column":8},"end":{"line":641,"column":60}}],"line":639},"67":{"loc":{"start":{"line":681,"column":2},"end":{"line":683,"column":3}},"type":"if","locations":[{"start":{"line":681,"column":2},"end":{"line":683,"column":3}},{"start":{"line":681,"column":2},"end":{"line":683,"column":3}}],"line":681},"68":{"loc":{"start":{"line":691,"column":5},"end":{"line":693,"column":44}},"type":"binary-expr","locations":[{"start":{"line":691,"column":5},"end":{"line":691,"column":32}},{"start":{"line":692,"column":6},"end":{"line":692,"column":48}},{"start":{"line":693,"column":6},"end":{"line":693,"column":44}}],"line":691},"69":{"loc":{"start":{"line":699,"column":2},"end":{"line":713,"column":3}},"type":"if","locations":[{"start":{"line":699,"column":2},"end":{"line":713,"column":3}},{"start":{"line":699,"column":2},"end":{"line":713,"column":3}}],"line":699},"70":{"loc":{"start":{"line":721,"column":2},"end":{"line":734,"column":3}},"type":"if","locations":[{"start":{"line":721,"column":2},"end":{"line":734,"column":3}},{"start":{"line":721,"column":2},"end":{"line":734,"column":3}}],"line":721},"71":{"loc":{"start":{"line":722,"column":4},"end":{"line":728,"column":5}},"type":"if","locations":[{"start":{"line":722,"column":4},"end":{"line":728,"column":5}},{"start":{"line":722,"column":4},"end":{"line":728,"column":5}}],"line":722},"72":{"loc":{"start":{"line":729,"column":9},"end":{"line":734,"column":3}},"type":"if","locations":[{"start":{"line":729,"column":9},"end":{"line":734,"column":3}},{"start":{"line":729,"column":9},"end":{"line":734,"column":3}}],"line":729},"73":{"loc":{"start":{"line":736,"column":2},"end":{"line":738,"column":3}},"type":"if","locations":[{"start":{"line":736,"column":2},"end":{"line":738,"column":3}},{"start":{"line":736,"column":2},"end":{"line":738,"column":3}}],"line":736},"74":{"loc":{"start":{"line":742,"column":2},"end":{"line":753,"column":3}},"type":"if","locations":[{"start":{"line":742,"column":2},"end":{"line":753,"column":3}},{"start":{"line":742,"column":2},"end":{"line":753,"column":3}}],"line":742},"75":{"loc":{"start":{"line":743,"column":4},"end":{"line":744,"column":50}},"type":"binary-expr","locations":[{"start":{"line":743,"column":4},"end":{"line":743,"column":54}},{"start":{"line":744,"column":4},"end":{"line":744,"column":50}}],"line":743},"76":{"loc":{"start":{"line":750,"column":4},"end":{"line":752,"column":5}},"type":"if","locations":[{"start":{"line":750,"column":4},"end":{"line":752,"column":5}},{"start":{"line":750,"column":4},"end":{"line":752,"column":5}}],"line":750},"77":{"loc":{"start":{"line":762,"column":2},"end":{"line":774,"column":3}},"type":"if","locations":[{"start":{"line":762,"column":2},"end":{"line":774,"column":3}},{"start":{"line":762,"column":2},"end":{"line":774,"column":3}}],"line":762},"78":{"loc":{"start":{"line":764,"column":4},"end":{"line":771,"column":5}},"type":"if","locations":[{"start":{"line":764,"column":4},"end":{"line":771,"column":5}},{"start":{"line":764,"column":4},"end":{"line":771,"column":5}}],"line":764},"79":{"loc":{"start":{"line":764,"column":8},"end":{"line":764,"column":61}},"type":"binary-expr","locations":[{"start":{"line":764,"column":8},"end":{"line":764,"column":18}},{"start":{"line":764,"column":22},"end":{"line":764,"column":61}}],"line":764},"80":{"loc":{"start":{"line":785,"column":4},"end":{"line":785,"column":68}},"type":"binary-expr","locations":[{"start":{"line":785,"column":4},"end":{"line":785,"column":62}},{"start":{"line":785,"column":66},"end":{"line":785,"column":68}}],"line":785},"81":{"loc":{"start":{"line":786,"column":25},"end":{"line":786,"column":66}},"type":"binary-expr","locations":[{"start":{"line":786,"column":25},"end":{"line":786,"column":60}},{"start":{"line":786,"column":64},"end":{"line":786,"column":66}}],"line":786},"82":{"loc":{"start":{"line":788,"column":4},"end":{"line":788,"column":61}},"type":"binary-expr","locations":[{"start":{"line":788,"column":4},"end":{"line":788,"column":55}},{"start":{"line":788,"column":59},"end":{"line":788,"column":61}}],"line":788},"83":{"loc":{"start":{"line":793,"column":25},"end":{"line":795,"column":26}},"type":"cond-expr","locations":[{"start":{"line":794,"column":6},"end":{"line":794,"column":29}},{"start":{"line":795,"column":6},"end":{"line":795,"column":26}}],"line":793},"84":{"loc":{"start":{"line":810,"column":2},"end":{"line":812,"column":3}},"type":"if","locations":[{"start":{"line":810,"column":2},"end":{"line":812,"column":3}},{"start":{"line":810,"column":2},"end":{"line":812,"column":3}}],"line":810},"85":{"loc":{"start":{"line":810,"column":6},"end":{"line":810,"column":77}},"type":"binary-expr","locations":[{"start":{"line":810,"column":6},"end":{"line":810,"column":46}},{"start":{"line":810,"column":50},"end":{"line":810,"column":56}},{"start":{"line":810,"column":60},"end":{"line":810,"column":77}}],"line":810},"86":{"loc":{"start":{"line":817,"column":2},"end":{"line":848,"column":3}},"type":"if","locations":[{"start":{"line":817,"column":2},"end":{"line":848,"column":3}},{"start":{"line":817,"column":2},"end":{"line":848,"column":3}}],"line":817},"87":{"loc":{"start":{"line":818,"column":4},"end":{"line":826,"column":5}},"type":"if","locations":[{"start":{"line":818,"column":4},"end":{"line":826,"column":5}},{"start":{"line":818,"column":4},"end":{"line":826,"column":5}}],"line":818},"88":{"loc":{"start":{"line":829,"column":4},"end":{"line":847,"column":5}},"type":"if","locations":[{"start":{"line":829,"column":4},"end":{"line":847,"column":5}},{"start":{"line":829,"column":4},"end":{"line":847,"column":5}}],"line":829},"89":{"loc":{"start":{"line":830,"column":6},"end":{"line":833,"column":24}},"type":"binary-expr","locations":[{"start":{"line":830,"column":6},"end":{"line":830,"column":48}},{"start":{"line":831,"column":6},"end":{"line":833,"column":24}}],"line":830},"90":{"loc":{"start":{"line":868,"column":6},"end":{"line":872,"column":19}},"type":"cond-expr","locations":[{"start":{"line":869,"column":10},"end":{"line":869,"column":33}},{"start":{"line":870,"column":10},"end":{"line":872,"column":19}}],"line":868},"91":{"loc":{"start":{"line":868,"column":6},"end":{"line":868,"column":49}},"type":"binary-expr","locations":[{"start":{"line":868,"column":6},"end":{"line":868,"column":18}},{"start":{"line":868,"column":22},"end":{"line":868,"column":49}}],"line":868},"92":{"loc":{"start":{"line":870,"column":10},"end":{"line":872,"column":19}},"type":"cond-expr","locations":[{"start":{"line":871,"column":10},"end":{"line":871,"column":30}},{"start":{"line":872,"column":10},"end":{"line":872,"column":19}}],"line":870},"93":{"loc":{"start":{"line":874,"column":6},"end":{"line":878,"column":19}},"type":"cond-expr","locations":[{"start":{"line":875,"column":10},"end":{"line":875,"column":35}},{"start":{"line":876,"column":10},"end":{"line":878,"column":19}}],"line":874},"94":{"loc":{"start":{"line":874,"column":6},"end":{"line":874,"column":49}},"type":"binary-expr","locations":[{"start":{"line":874,"column":6},"end":{"line":874,"column":18}},{"start":{"line":874,"column":22},"end":{"line":874,"column":49}}],"line":874},"95":{"loc":{"start":{"line":876,"column":10},"end":{"line":878,"column":19}},"type":"cond-expr","locations":[{"start":{"line":877,"column":10},"end":{"line":877,"column":32}},{"start":{"line":878,"column":10},"end":{"line":878,"column":19}}],"line":876},"96":{"loc":{"start":{"line":881,"column":4},"end":{"line":883,"column":5}},"type":"if","locations":[{"start":{"line":881,"column":4},"end":{"line":883,"column":5}},{"start":{"line":881,"column":4},"end":{"line":883,"column":5}}],"line":881},"97":{"loc":{"start":{"line":881,"column":8},"end":{"line":881,"column":44}},"type":"binary-expr","locations":[{"start":{"line":881,"column":8},"end":{"line":881,"column":20}},{"start":{"line":881,"column":24},"end":{"line":881,"column":31}},{"start":{"line":881,"column":35},"end":{"line":881,"column":44}}],"line":881},"98":{"loc":{"start":{"line":887,"column":4},"end":{"line":924,"column":5}},"type":"if","locations":[{"start":{"line":887,"column":4},"end":{"line":924,"column":5}},{"start":{"line":887,"column":4},"end":{"line":924,"column":5}}],"line":887},"99":{"loc":{"start":{"line":888,"column":6},"end":{"line":895,"column":18}},"type":"binary-expr","locations":[{"start":{"line":888,"column":6},"end":{"line":888,"column":40}},{"start":{"line":889,"column":7},"end":{"line":889,"column":48}},{"start":{"line":890,"column":8},"end":{"line":890,"column":14}},{"start":{"line":891,"column":8},"end":{"line":891,"column":25}},{"start":{"line":892,"column":7},"end":{"line":892,"column":47}},{"start":{"line":893,"column":8},"end":{"line":893,"column":14}},{"start":{"line":894,"column":8},"end":{"line":894,"column":25}},{"start":{"line":895,"column":8},"end":{"line":895,"column":17}}],"line":888},"100":{"loc":{"start":{"line":910,"column":6},"end":{"line":923,"column":7}},"type":"if","locations":[{"start":{"line":910,"column":6},"end":{"line":923,"column":7}},{"start":{"line":910,"column":6},"end":{"line":923,"column":7}}],"line":910},"101":{"loc":{"start":{"line":927,"column":2},"end":{"line":930,"column":3}},"type":"if","locations":[{"start":{"line":927,"column":2},"end":{"line":930,"column":3}},{"start":{"line":927,"column":2},"end":{"line":930,"column":3}}],"line":927},"102":{"loc":{"start":{"line":927,"column":6},"end":{"line":927,"column":64}},"type":"binary-expr","locations":[{"start":{"line":927,"column":6},"end":{"line":927,"column":35}},{"start":{"line":927,"column":39},"end":{"line":927,"column":64}}],"line":927},"103":{"loc":{"start":{"line":935,"column":2},"end":{"line":938,"column":3}},"type":"if","locations":[{"start":{"line":935,"column":2},"end":{"line":938,"column":3}},{"start":{"line":935,"column":2},"end":{"line":938,"column":3}}],"line":935},"104":{"loc":{"start":{"line":935,"column":6},"end":{"line":935,"column":50}},"type":"binary-expr","locations":[{"start":{"line":935,"column":6},"end":{"line":935,"column":28}},{"start":{"line":935,"column":32},"end":{"line":935,"column":50}}],"line":935},"105":{"loc":{"start":{"line":943,"column":8},"end":{"line":950,"column":9}},"type":"if","locations":[{"start":{"line":943,"column":8},"end":{"line":950,"column":9}},{"start":{"line":943,"column":8},"end":{"line":950,"column":9}}],"line":943},"106":{"loc":{"start":{"line":965,"column":10},"end":{"line":965,"column":29}},"type":"binary-expr","locations":[{"start":{"line":965,"column":10},"end":{"line":965,"column":22}},{"start":{"line":965,"column":26},"end":{"line":965,"column":29}}],"line":965},"107":{"loc":{"start":{"line":966,"column":10},"end":{"line":966,"column":69}},"type":"binary-expr","locations":[{"start":{"line":966,"column":10},"end":{"line":966,"column":23}},{"start":{"line":966,"column":27},"end":{"line":966,"column":69}}],"line":966}},"s":{"0":3,"1":3,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":3,"10":3,"11":3,"12":123,"13":8,"14":8,"15":115,"16":123,"17":3,"18":90,"19":90,"20":3,"21":0,"22":0,"23":3,"24":22,"25":22,"26":3,"27":3,"28":3,"29":3,"30":8,"31":8,"32":65,"33":65,"34":14,"35":13,"36":1,"37":51,"38":65,"39":15,"40":15,"41":15,"42":0,"43":0,"44":15,"45":15,"46":15,"47":15,"48":15,"49":15,"50":15,"51":15,"52":16,"53":16,"54":16,"55":16,"56":8,"57":8,"58":16,"59":16,"60":8,"61":17,"62":17,"63":2,"64":2,"65":17,"66":2,"67":2,"68":17,"69":2,"70":2,"71":17,"72":2,"73":2,"74":17,"75":134,"76":134,"77":1702,"78":434,"79":434,"80":434,"81":0,"82":0,"83":0,"84":0,"85":0,"86":434,"87":434,"88":4,"89":4,"90":430,"91":1268,"92":650,"93":650,"94":12,"95":638,"96":638,"97":600,"98":600,"99":78,"100":618,"101":618,"102":9,"103":609,"104":69,"105":69,"106":69,"107":69,"108":69,"109":69,"110":69,"111":69,"112":69,"113":4,"114":4,"115":4,"116":0,"117":69,"118":69,"119":69,"120":69,"121":69,"122":42,"123":42,"124":69,"125":69,"126":69,"127":21,"128":21,"129":21,"130":18,"131":18,"132":17,"133":18,"134":18,"135":17,"136":101,"137":8,"138":8,"139":40,"140":40,"141":36,"142":93,"143":21,"144":3,"145":3,"146":3,"147":3,"148":21,"149":4,"150":4,"151":44,"152":44,"153":44,"154":41,"155":44,"156":44,"157":44,"158":15,"159":15,"160":15,"161":15,"162":15,"163":15,"164":44,"165":69,"166":69,"167":69,"168":4,"169":4,"170":1,"171":1,"172":1,"173":4,"174":4,"175":4,"176":4,"177":4,"178":4,"179":4,"180":65,"181":15,"182":14,"183":15,"184":15,"185":15,"186":15,"187":13,"188":5,"189":5,"190":8,"191":8,"192":65,"193":65,"194":51,"195":65,"196":65,"197":65,"198":65,"199":65,"200":65,"201":22,"202":22,"203":65,"204":65,"205":65,"206":65,"207":65,"208":65,"209":65,"210":65,"211":65,"212":65,"213":3,"214":3,"215":3,"216":3,"217":3,"218":3,"219":3,"220":65,"221":69,"222":70,"223":70,"224":70,"225":70,"226":70,"227":18,"228":18,"229":18,"230":18,"231":4,"232":4,"233":4,"234":4,"235":5,"236":5,"237":5,"238":5,"239":4,"240":4,"241":4,"242":4,"243":4,"244":4,"245":4,"246":4,"247":4,"248":4,"249":3,"250":3,"251":3,"252":3,"253":1,"254":1,"255":3,"256":4,"257":4,"258":4,"259":4,"260":35,"261":35,"262":0,"263":35,"264":0,"265":0,"266":35,"267":0,"268":0,"269":69,"270":10,"271":10,"272":10,"273":10,"274":8,"275":10,"276":10,"277":19,"278":19,"279":8,"280":8,"281":5,"282":5,"283":10,"284":10,"285":10,"286":8,"287":11,"288":11,"289":11,"290":5,"291":3,"292":2,"293":6,"294":2,"295":11,"296":5,"297":11,"298":11,"299":8,"300":8,"301":5,"302":11,"303":60,"304":60,"305":60,"306":60,"307":60,"308":25,"309":25,"310":11,"311":11,"312":21,"313":14,"314":35,"315":60,"316":70,"317":59,"318":22,"319":22,"320":22,"321":22,"322":22,"323":22,"324":22,"325":22,"326":22,"327":1,"328":22,"329":22,"330":22,"331":5,"332":5,"333":5,"334":5,"335":5,"336":17,"337":17,"338":17,"339":17,"340":17,"341":0,"342":22,"343":5,"344":5,"345":5,"346":33,"347":33,"348":33,"349":33,"350":33,"351":33,"352":33,"353":0,"354":33,"355":11,"356":11,"357":11,"358":11,"359":11,"360":22,"361":22,"362":0,"363":0,"364":0,"365":0,"366":0,"367":5,"368":5,"369":5,"370":5,"371":3,"372":1,"373":0,"374":0,"375":1,"376":2,"377":2,"378":0,"379":2,"380":0,"381":0,"382":1,"383":3,"384":0,"385":3},"f":{"0":123,"1":90,"2":0,"3":22,"4":3,"5":8,"6":65,"7":65,"8":15,"9":15,"10":16,"11":8,"12":16,"13":17,"14":134,"15":1702,"16":69,"17":42,"18":101,"19":40,"20":70,"21":10,"22":19,"23":8,"24":10,"25":11,"26":60,"27":21,"28":70,"29":22,"30":5,"31":33,"32":1,"33":2,"34":0},"b":{"0":[8,115],"1":[14,51],"2":[13,1],"3":[15,0],"4":[15,0],"5":[15,15,15],"6":[2,15],"7":[2,15],"8":[2,15],"9":[2,15],"10":[434,1268],"11":[434,0],"12":[0,434],"13":[0,0],"14":[0,0],"15":[0,0,0],"16":[4,430],"17":[650,618],"18":[12,638],"19":[600,38],"20":[78,522],"21":[600,522,522],"22":[9,609],"23":[69,0],"24":[4,65],"25":[0,4],"26":[69,56],"27":[69,69],"28":[18,21,4,44],"29":[18,3],"30":[17,1],"31":[17,1],"32":[8,93],"33":[36,4],"34":[3,18],"35":[3,0],"36":[3,3,3],"37":[41,3],"38":[15,29],"39":[15,0],"40":[44,1],"41":[4,65],"42":[1,3],"43":[15,50],"44":[14,1],"45":[13,2],"46":[5,8],"47":[8,0],"48":[51,14],"49":[65,51,51,51],"50":[65,0],"51":[22,43],"52":[3,62],"53":[65,3],"54":[70,69],"55":[18,4,5,4,4,35,0],"56":[4,0,0],"57":[4,0],"58":[5,5,0,0],"59":[5,5,0],"60":[4,0],"61":[4,4],"62":[3,1],"63":[4,4,4,4,1],"64":[0,35],"65":[0,35],"66":[35,26,11],"67":[8,2],"68":[19,12,12],"69":[5,3],"70":[5,6],"71":[3,2],"72":[2,4],"73":[5,6],"74":[8,3],"75":[11,5],"76":[5,3],"77":[25,35],"78":[11,14],"79":[25,16],"80":[22,5],"81":[22,5],"82":[22,0],"83":[13,9],"84":[1,21],"85":[22,9,9],"86":[5,17],"87":[5,0],"88":[17,0],"89":[17,17],"90":[15,18],"91":[33,25],"92":[10,8],"93":[15,18],"94":[33,25],"95":[10,8],"96":[0,33],"97":[33,25,5],"98":[11,22],"99":[33,25,15,10,23,10,10,2],"100":[0,22],"101":[5,0],"102":[5,5],"103":[0,1],"104":[1,1],"105":[0,2],"106":[0,0],"107":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e792166477bcdccb3e0e26c8de82199e0204f93d"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\am\\utils.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\am\\utils.js","statementMap":{"0":{"start":{"line":11,"column":15},"end":{"line":11,"column":41}},"1":{"start":{"line":12,"column":12},"end":{"line":12,"column":32}},"2":{"start":{"line":13,"column":17},"end":{"line":13,"column":51}},"3":{"start":{"line":14,"column":43},"end":{"line":14,"column":64}},"4":{"start":{"line":17,"column":13},"end":{"line":17,"column":46}},"5":{"start":{"line":18,"column":18},"end":{"line":18,"column":40}},"6":{"start":{"line":19,"column":2},"end":{"line":19,"column":42}},"7":{"start":{"line":23,"column":21},"end":{"line":23,"column":44}},"8":{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},"9":{"start":{"line":25,"column":4},"end":{"line":25,"column":62}},"10":{"start":{"line":27,"column":2},"end":{"line":27,"column":20}},"11":{"start":{"line":31,"column":21},"end":{"line":31,"column":44}},"12":{"start":{"line":33,"column":2},"end":{"line":35,"column":3}},"13":{"start":{"line":34,"column":4},"end":{"line":34,"column":65}},"14":{"start":{"line":36,"column":2},"end":{"line":36,"column":20}},"15":{"start":{"line":40,"column":21},"end":{"line":40,"column":44}},"16":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"17":{"start":{"line":43,"column":4},"end":{"line":43,"column":57}},"18":{"start":{"line":45,"column":2},"end":{"line":45,"column":20}},"19":{"start":{"line":49,"column":21},"end":{"line":49,"column":44}},"20":{"start":{"line":51,"column":2},"end":{"line":53,"column":3}},"21":{"start":{"line":52,"column":4},"end":{"line":52,"column":63}},"22":{"start":{"line":54,"column":2},"end":{"line":54,"column":20}},"23":{"start":{"line":58,"column":21},"end":{"line":58,"column":44}},"24":{"start":{"line":59,"column":2},"end":{"line":63,"column":17}},"25":{"start":{"line":67,"column":2},"end":{"line":70,"column":3}},"26":{"start":{"line":68,"column":23},"end":{"line":68,"column":46}},"27":{"start":{"line":69,"column":4},"end":{"line":69,"column":22}},"28":{"start":{"line":71,"column":2},"end":{"line":71,"column":19}},"29":{"start":{"line":75,"column":18},"end":{"line":75,"column":41}},"30":{"start":{"line":77,"column":2},"end":{"line":81,"column":3}},"31":{"start":{"line":78,"column":4},"end":{"line":80,"column":26}},"32":{"start":{"line":79,"column":6},"end":{"line":79,"column":53}},"33":{"start":{"line":80,"column":11},"end":{"line":80,"column":26}},"34":{"start":{"line":82,"column":2},"end":{"line":82,"column":19}},"35":{"start":{"line":85,"column":0},"end":{"line":93,"column":2}}},"fnMap":{"0":{"name":"getInfoFromUA","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":22}},"loc":{"start":{"line":16,"column":50},"end":{"line":20,"column":1}},"line":16},"1":{"name":"getOSName","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":18}},"loc":{"start":{"line":22,"column":39},"end":{"line":28,"column":1}},"line":22},"2":{"name":"getOSVersion","decl":{"start":{"line":30,"column":9},"end":{"line":30,"column":21}},"loc":{"start":{"line":30,"column":42},"end":{"line":37,"column":1}},"line":30},"3":{"name":"getDeviceModel","decl":{"start":{"line":39,"column":9},"end":{"line":39,"column":23}},"loc":{"start":{"line":39,"column":44},"end":{"line":46,"column":1}},"line":39},"4":{"name":"getDeviceManufacturer","decl":{"start":{"line":48,"column":9},"end":{"line":48,"column":30}},"loc":{"start":{"line":48,"column":51},"end":{"line":55,"column":1}},"line":48},"5":{"name":"getPlatform","decl":{"start":{"line":57,"column":9},"end":{"line":57,"column":20}},"loc":{"start":{"line":57,"column":41},"end":{"line":64,"column":1}},"line":57},"6":{"name":"getBrand","decl":{"start":{"line":66,"column":9},"end":{"line":66,"column":17}},"loc":{"start":{"line":66,"column":46},"end":{"line":72,"column":1}},"line":66},"7":{"name":"getEventId","decl":{"start":{"line":74,"column":9},"end":{"line":74,"column":19}},"loc":{"start":{"line":74,"column":40},"end":{"line":83,"column":1}},"line":74}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":18},"end":{"line":18,"column":40}},"type":"cond-expr","locations":[{"start":{"line":18,"column":23},"end":{"line":18,"column":35}},{"start":{"line":18,"column":38},"end":{"line":18,"column":40}}],"line":18},"1":{"loc":{"start":{"line":19,"column":9},"end":{"line":19,"column":41}},"type":"binary-expr","locations":[{"start":{"line":19,"column":9},"end":{"line":19,"column":27}},{"start":{"line":19,"column":31},"end":{"line":19,"column":41}}],"line":19},"2":{"loc":{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},{"start":{"line":24,"column":2},"end":{"line":26,"column":3}}],"line":24},"3":{"loc":{"start":{"line":24,"column":6},"end":{"line":24,"column":64}},"type":"binary-expr","locations":[{"start":{"line":24,"column":6},"end":{"line":24,"column":21}},{"start":{"line":24,"column":25},"end":{"line":24,"column":64}}],"line":24},"4":{"loc":{"start":{"line":33,"column":2},"end":{"line":35,"column":3}},"type":"if","locations":[{"start":{"line":33,"column":2},"end":{"line":35,"column":3}},{"start":{"line":33,"column":2},"end":{"line":35,"column":3}}],"line":33},"5":{"loc":{"start":{"line":33,"column":6},"end":{"line":33,"column":64}},"type":"binary-expr","locations":[{"start":{"line":33,"column":6},"end":{"line":33,"column":21}},{"start":{"line":33,"column":25},"end":{"line":33,"column":64}}],"line":33},"6":{"loc":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},{"start":{"line":42,"column":2},"end":{"line":44,"column":3}}],"line":42},"7":{"loc":{"start":{"line":42,"column":6},"end":{"line":42,"column":64}},"type":"binary-expr","locations":[{"start":{"line":42,"column":6},"end":{"line":42,"column":21}},{"start":{"line":42,"column":25},"end":{"line":42,"column":64}}],"line":42},"8":{"loc":{"start":{"line":51,"column":2},"end":{"line":53,"column":3}},"type":"if","locations":[{"start":{"line":51,"column":2},"end":{"line":53,"column":3}},{"start":{"line":51,"column":2},"end":{"line":53,"column":3}}],"line":51},"9":{"loc":{"start":{"line":51,"column":6},"end":{"line":51,"column":64}},"type":"binary-expr","locations":[{"start":{"line":51,"column":6},"end":{"line":51,"column":21}},{"start":{"line":51,"column":25},"end":{"line":51,"column":64}}],"line":51},"10":{"loc":{"start":{"line":59,"column":9},"end":{"line":63,"column":16}},"type":"cond-expr","locations":[{"start":{"line":60,"column":6},"end":{"line":62,"column":18}},{"start":{"line":63,"column":6},"end":{"line":63,"column":16}}],"line":59},"11":{"loc":{"start":{"line":60,"column":6},"end":{"line":62,"column":18}},"type":"cond-expr","locations":[{"start":{"line":61,"column":8},"end":{"line":61,"column":13}},{"start":{"line":62,"column":8},"end":{"line":62,"column":18}}],"line":60},"12":{"loc":{"start":{"line":67,"column":2},"end":{"line":70,"column":3}},"type":"if","locations":[{"start":{"line":67,"column":2},"end":{"line":70,"column":3}},{"start":{"line":67,"column":2},"end":{"line":70,"column":3}}],"line":67},"13":{"loc":{"start":{"line":77,"column":2},"end":{"line":81,"column":3}},"type":"if","locations":[{"start":{"line":77,"column":2},"end":{"line":81,"column":3}},{"start":{"line":77,"column":2},"end":{"line":81,"column":3}}],"line":77},"14":{"loc":{"start":{"line":78,"column":4},"end":{"line":80,"column":26}},"type":"if","locations":[{"start":{"line":78,"column":4},"end":{"line":80,"column":26}},{"start":{"line":78,"column":4},"end":{"line":80,"column":26}}],"line":78}},"s":{"0":3,"1":3,"2":3,"3":3,"4":84,"5":84,"6":84,"7":60,"8":60,"9":22,"10":38,"11":56,"12":56,"13":18,"14":38,"15":60,"16":60,"17":22,"18":38,"19":60,"20":60,"21":22,"22":38,"23":60,"24":60,"25":65,"26":3,"27":3,"28":62,"29":69,"30":69,"31":9,"32":1,"33":8,"34":61,"35":3},"f":{"0":84,"1":60,"2":56,"3":60,"4":60,"5":60,"6":65,"7":69},"b":{"0":[84,0],"1":[84,22],"2":[22,38],"3":[60,35],"4":[18,38],"5":[56,31],"6":[22,38],"7":[60,35],"8":[22,38],"9":[60,35],"10":[35,25],"11":[22,13],"12":[3,62],"13":[9,60],"14":[1,8]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"77c55f67dbdb90127201976c9c0f2a74d7daed1c"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\appcues\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\appcues\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":23},"end":{"line":19,"column":1}},"2":{"start":{"line":22,"column":2},"end":{"line":22,"column":85}},"3":{"start":{"line":25,"column":22},"end":{"line":25,"column":65}},"4":{"start":{"line":27,"column":0},"end":{"line":31,"column":2}}},"fnMap":{"0":{"name":"getEndpoint","decl":{"start":{"line":21,"column":9},"end":{"line":21,"column":20}},"loc":{"start":{"line":21,"column":40},"end":{"line":23,"column":1}},"line":21}},"branchMap":{},"s":{"0":1,"1":1,"2":11,"3":1,"4":1},"f":{"0":11},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bfae8a621d8574539ea9a9e44835a8b33c76eda1"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\appcues\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\appcues\\transform.js","statementMap":{"0":{"start":{"line":2,"column":22},"end":{"line":2,"column":51}},"1":{"start":{"line":12,"column":4},"end":{"line":12,"column":25}},"2":{"start":{"line":14,"column":55},"end":{"line":14,"column":74}},"3":{"start":{"line":17,"column":19},"end":{"line":17,"column":41}},"4":{"start":{"line":18,"column":2},"end":{"line":18,"column":31}},"5":{"start":{"line":19,"column":2},"end":{"line":19,"column":61}},"6":{"start":{"line":20,"column":2},"end":{"line":25,"column":4}},"7":{"start":{"line":29,"column":22},"end":{"line":32,"column":3}},"8":{"start":{"line":34,"column":20},"end":{"line":34,"column":58}},"9":{"start":{"line":35,"column":2},"end":{"line":35,"column":35}},"10":{"start":{"line":37,"column":2},"end":{"line":40,"column":4}},"11":{"start":{"line":44,"column":22},"end":{"line":47,"column":3}},"12":{"start":{"line":50,"column":22},"end":{"line":50,"column":64}},"13":{"start":{"line":51,"column":2},"end":{"line":51,"column":56}},"14":{"start":{"line":52,"column":2},"end":{"line":52,"column":43}},"15":{"start":{"line":55,"column":20},"end":{"line":55,"column":60}},"16":{"start":{"line":57,"column":2},"end":{"line":59,"column":4}},"17":{"start":{"line":61,"column":2},"end":{"line":61,"column":35}},"18":{"start":{"line":63,"column":2},"end":{"line":66,"column":4}},"19":{"start":{"line":70,"column":35},"end":{"line":70,"column":40}},"20":{"start":{"line":72,"column":2},"end":{"line":77,"column":3}},"21":{"start":{"line":73,"column":4},"end":{"line":76,"column":6}},"22":{"start":{"line":79,"column":2},"end":{"line":84,"column":3}},"23":{"start":{"line":80,"column":4},"end":{"line":83,"column":6}},"24":{"start":{"line":86,"column":22},"end":{"line":86,"column":48}},"25":{"start":{"line":88,"column":2},"end":{"line":117,"column":3}},"26":{"start":{"line":90,"column":6},"end":{"line":94,"column":8}},"27":{"start":{"line":96,"column":6},"end":{"line":96,"column":39}},"28":{"start":{"line":97,"column":6},"end":{"line":102,"column":8}},"29":{"start":{"line":104,"column":6},"end":{"line":104,"column":40}},"30":{"start":{"line":105,"column":6},"end":{"line":109,"column":8}},"31":{"start":{"line":111,"column":6},"end":{"line":114,"column":8}},"32":{"start":{"line":116,"column":6},"end":{"line":116,"column":66}},"33":{"start":{"line":120,"column":26},"end":{"line":157,"column":1}},"34":{"start":{"line":121,"column":2},"end":{"line":124,"column":3}},"35":{"start":{"line":122,"column":23},"end":{"line":122,"column":75}},"36":{"start":{"line":123,"column":4},"end":{"line":123,"column":24}},"37":{"start":{"line":126,"column":19},"end":{"line":155,"column":3}},"38":{"start":{"line":128,"column":6},"end":{"line":153,"column":7}},"39":{"start":{"line":129,"column":8},"end":{"line":136,"column":9}},"40":{"start":{"line":131,"column":10},"end":{"line":135,"column":12}},"41":{"start":{"line":138,"column":8},"end":{"line":142,"column":10}},"42":{"start":{"line":144,"column":8},"end":{"line":152,"column":10}},"43":{"start":{"line":156,"column":2},"end":{"line":156,"column":18}},"44":{"start":{"line":159,"column":0},"end":{"line":159,"column":48}}},"fnMap":{"0":{"name":"buildResponse","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":22}},"loc":{"start":{"line":16,"column":42},"end":{"line":26,"column":1}},"line":16},"1":{"name":"processTrackEvent","decl":{"start":{"line":28,"column":9},"end":{"line":28,"column":26}},"loc":{"start":{"line":28,"column":62},"end":{"line":41,"column":1}},"line":28},"2":{"name":"processPage","decl":{"start":{"line":43,"column":9},"end":{"line":43,"column":20}},"loc":{"start":{"line":43,"column":75},"end":{"line":67,"column":1}},"line":43},"3":{"name":"process","decl":{"start":{"line":69,"column":9},"end":{"line":69,"column":16}},"loc":{"start":{"line":69,"column":24},"end":{"line":118,"column":1}},"line":69},"4":{"name":"(anonymous_4)","decl":{"start":{"line":120,"column":26},"end":{"line":120,"column":27}},"loc":{"start":{"line":120,"column":42},"end":{"line":157,"column":1}},"line":120},"5":{"name":"(anonymous_5)","decl":{"start":{"line":127,"column":15},"end":{"line":127,"column":16}},"loc":{"start":{"line":127,"column":30},"end":{"line":154,"column":5}},"line":127}},"branchMap":{"0":{"loc":{"start":{"line":72,"column":2},"end":{"line":77,"column":3}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":77,"column":3}},{"start":{"line":72,"column":2},"end":{"line":77,"column":3}}],"line":72},"1":{"loc":{"start":{"line":79,"column":2},"end":{"line":84,"column":3}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":84,"column":3}},{"start":{"line":79,"column":2},"end":{"line":84,"column":3}}],"line":79},"2":{"loc":{"start":{"line":88,"column":2},"end":{"line":117,"column":3}},"type":"switch","locations":[{"start":{"line":89,"column":4},"end":{"line":94,"column":8}},{"start":{"line":95,"column":4},"end":{"line":102,"column":8}},{"start":{"line":103,"column":4},"end":{"line":109,"column":8}},{"start":{"line":110,"column":4},"end":{"line":114,"column":8}},{"start":{"line":115,"column":4},"end":{"line":116,"column":66}}],"line":88},"3":{"loc":{"start":{"line":121,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":121,"column":2},"end":{"line":124,"column":3}},{"start":{"line":121,"column":2},"end":{"line":124,"column":3}}],"line":121},"4":{"loc":{"start":{"line":121,"column":6},"end":{"line":121,"column":50}},"type":"binary-expr","locations":[{"start":{"line":121,"column":6},"end":{"line":121,"column":28}},{"start":{"line":121,"column":32},"end":{"line":121,"column":50}}],"line":121},"5":{"loc":{"start":{"line":129,"column":8},"end":{"line":136,"column":9}},"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":136,"column":9}},{"start":{"line":129,"column":8},"end":{"line":136,"column":9}}],"line":129},"6":{"loc":{"start":{"line":146,"column":10},"end":{"line":150,"column":17}},"type":"cond-expr","locations":[{"start":{"line":147,"column":14},"end":{"line":147,"column":35}},{"start":{"line":148,"column":14},"end":{"line":150,"column":17}}],"line":146},"7":{"loc":{"start":{"line":148,"column":14},"end":{"line":150,"column":17}},"type":"cond-expr","locations":[{"start":{"line":149,"column":14},"end":{"line":149,"column":24}},{"start":{"line":150,"column":14},"end":{"line":150,"column":17}}],"line":148},"8":{"loc":{"start":{"line":151,"column":10},"end":{"line":151,"column":69}},"type":"binary-expr","locations":[{"start":{"line":151,"column":10},"end":{"line":151,"column":23}},{"start":{"line":151,"column":27},"end":{"line":151,"column":69}}],"line":151}},"s":{"0":1,"1":1,"2":1,"3":11,"4":11,"5":11,"6":11,"7":3,"8":3,"9":3,"10":3,"11":4,"12":4,"13":4,"14":4,"15":4,"16":4,"17":4,"18":4,"19":14,"20":14,"21":1,"22":13,"23":1,"24":12,"25":12,"26":2,"27":4,"28":4,"29":1,"30":1,"31":4,"32":1,"33":1,"34":1,"35":0,"36":0,"37":1,"38":2,"39":2,"40":0,"41":2,"42":0,"43":1,"44":1},"f":{"0":11,"1":3,"2":4,"3":14,"4":1,"5":2},"b":{"0":[1,13],"1":[1,12],"2":[2,4,1,4,1],"3":[0,1],"4":[1,1],"5":[0,2],"6":[0,0],"7":[0,0],"8":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0103c99131bbbd2b78d73faed0ec810de5852317"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\azure_event_hub\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\azure_event_hub\\transform.js","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":5,"column":3}},"1":{"start":{"line":6,"column":2},"end":{"line":6,"column":16}},"2":{"start":{"line":9,"column":0},"end":{"line":9,"column":26}}},"fnMap":{"0":{"name":"process","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":16}},"loc":{"start":{"line":1,"column":24},"end":{"line":7,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":12},"end":{"line":4,"column":61}},"type":"binary-expr","locations":[{"start":{"line":4,"column":12},"end":{"line":4,"column":32}},{"start":{"line":4,"column":36},"end":{"line":4,"column":61}}],"line":4}},"s":{"0":5,"1":5,"2":1},"f":{"0":5},"b":{"0":[5,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1a8e348c2fb55281b349bdc7661f8eb287c64fe0"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\azure_synapse\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\azure_synapse\\transform.js","statementMap":{"0":{"start":{"line":1,"column":36},"end":{"line":1,"column":65}},"1":{"start":{"line":3,"column":21},"end":{"line":3,"column":36}},"2":{"start":{"line":6,"column":2},"end":{"line":6,"column":51}},"3":{"start":{"line":12,"column":26},"end":{"line":12,"column":69}},"4":{"start":{"line":13,"column":23},"end":{"line":13,"column":71}},"5":{"start":{"line":14,"column":19},"end":{"line":14,"column":31}},"6":{"start":{"line":15,"column":2},"end":{"line":22,"column":5}},"7":{"start":{"line":25,"column":0},"end":{"line":28,"column":2}}},"fnMap":{"0":{"name":"processSingleMessage","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":29}},"loc":{"start":{"line":5,"column":48},"end":{"line":7,"column":1}},"line":5},"1":{"name":"getDataTypeOverride","decl":{"start":{"line":9,"column":9},"end":{"line":9,"column":28}},"loc":{"start":{"line":9,"column":48},"end":{"line":9,"column":50}},"line":9},"2":{"name":"process","decl":{"start":{"line":11,"column":9},"end":{"line":11,"column":16}},"loc":{"start":{"line":11,"column":24},"end":{"line":23,"column":1}},"line":11}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":26},"end":{"line":12,"column":69}},"type":"binary-expr","locations":[{"start":{"line":12,"column":26},"end":{"line":12,"column":61}},{"start":{"line":12,"column":65},"end":{"line":12,"column":69}}],"line":12},"1":{"loc":{"start":{"line":21,"column":20},"end":{"line":21,"column":73}},"type":"cond-expr","locations":[{"start":{"line":21,"column":37},"end":{"line":21,"column":66}},{"start":{"line":21,"column":69},"end":{"line":21,"column":73}}],"line":21}},"s":{"0":3,"1":3,"2":124,"3":124,"4":124,"5":124,"6":124,"7":3},"f":{"0":124,"1":2917,"2":124},"b":{"0":[124,0],"1":[6,118]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"80b29aee80ec5d4b5819382d011a1130ea45195b"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\blueshift\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\blueshift\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":47}},"2":{"start":{"line":4,"column":20},"end":{"line":4,"column":53}},"3":{"start":{"line":6,"column":26},"end":{"line":19,"column":1}},"4":{"start":{"line":20,"column":27},"end":{"line":30,"column":1}},"5":{"start":{"line":32,"column":37},"end":{"line":45,"column":1}},"6":{"start":{"line":47,"column":23},"end":{"line":47,"column":69}},"7":{"start":{"line":48,"column":0},"end":{"line":55,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"eadb3c309edf93613cac02dcc809a3fc5e2060bc"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\blueshift\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\blueshift\\transform.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":51}},"1":{"start":{"line":13,"column":4},"end":{"line":13,"column":25}},"2":{"start":{"line":22,"column":4},"end":{"line":22,"column":23}},"3":{"start":{"line":25,"column":2},"end":{"line":26,"column":16}},"4":{"start":{"line":26,"column":4},"end":{"line":26,"column":16}},"5":{"start":{"line":27,"column":2},"end":{"line":27,"column":15}},"6":{"start":{"line":30,"column":19},"end":{"line":40,"column":1}},"7":{"start":{"line":32,"column":2},"end":{"line":38,"column":3}},"8":{"start":{"line":34,"column":6},"end":{"line":34,"column":29}},"9":{"start":{"line":35,"column":6},"end":{"line":35,"column":12}},"10":{"start":{"line":37,"column":6},"end":{"line":37,"column":26}},"11":{"start":{"line":39,"column":2},"end":{"line":39,"column":18}},"12":{"start":{"line":42,"column":29},"end":{"line":89,"column":1}},"13":{"start":{"line":43,"column":14},"end":{"line":43,"column":51}},"14":{"start":{"line":44,"column":2},"end":{"line":49,"column":3}},"15":{"start":{"line":45,"column":4},"end":{"line":48,"column":6}},"16":{"start":{"line":51,"column":2},"end":{"line":56,"column":3}},"17":{"start":{"line":52,"column":4},"end":{"line":55,"column":6}},"18":{"start":{"line":57,"column":16},"end":{"line":57,"column":72}},"19":{"start":{"line":59,"column":2},"end":{"line":62,"column":3}},"20":{"start":{"line":61,"column":4},"end":{"line":61,"column":70}},"21":{"start":{"line":64,"column":2},"end":{"line":64,"column":23}},"22":{"start":{"line":65,"column":2},"end":{"line":67,"column":3}},"23":{"start":{"line":66,"column":4},"end":{"line":66,"column":46}},"24":{"start":{"line":68,"column":2},"end":{"line":68,"column":53}},"25":{"start":{"line":69,"column":2},"end":{"line":74,"column":3}},"26":{"start":{"line":70,"column":4},"end":{"line":73,"column":6}},"27":{"start":{"line":75,"column":2},"end":{"line":75,"column":70}},"28":{"start":{"line":77,"column":19},"end":{"line":77,"column":41}},"29":{"start":{"line":78,"column":18},"end":{"line":78,"column":36}},"30":{"start":{"line":79,"column":2},"end":{"line":79,"column":48}},"31":{"start":{"line":81,"column":2},"end":{"line":81,"column":59}},"32":{"start":{"line":82,"column":20},"end":{"line":82,"column":70}},"33":{"start":{"line":83,"column":2},"end":{"line":86,"column":4}},"34":{"start":{"line":87,"column":2},"end":{"line":87,"column":31}},"35":{"start":{"line":88,"column":2},"end":{"line":88,"column":18}},"36":{"start":{"line":91,"column":32},"end":{"line":123,"column":1}},"37":{"start":{"line":92,"column":2},"end":{"line":97,"column":3}},"38":{"start":{"line":93,"column":4},"end":{"line":96,"column":6}},"39":{"start":{"line":98,"column":16},"end":{"line":98,"column":72}},"40":{"start":{"line":100,"column":2},"end":{"line":103,"column":3}},"41":{"start":{"line":102,"column":4},"end":{"line":102,"column":70}},"42":{"start":{"line":105,"column":2},"end":{"line":110,"column":4}},"43":{"start":{"line":111,"column":19},"end":{"line":111,"column":41}},"44":{"start":{"line":112,"column":18},"end":{"line":112,"column":36}},"45":{"start":{"line":113,"column":2},"end":{"line":113,"column":52}},"46":{"start":{"line":115,"column":2},"end":{"line":115,"column":59}},"47":{"start":{"line":116,"column":20},"end":{"line":116,"column":70}},"48":{"start":{"line":117,"column":2},"end":{"line":120,"column":4}},"49":{"start":{"line":121,"column":2},"end":{"line":121,"column":31}},"50":{"start":{"line":122,"column":2},"end":{"line":122,"column":18}},"51":{"start":{"line":125,"column":29},"end":{"line":154,"column":1}},"52":{"start":{"line":126,"column":2},"end":{"line":131,"column":3}},"53":{"start":{"line":127,"column":4},"end":{"line":130,"column":6}},"54":{"start":{"line":133,"column":16},"end":{"line":133,"column":72}},"55":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"56":{"start":{"line":137,"column":4},"end":{"line":137,"column":70}},"57":{"start":{"line":139,"column":2},"end":{"line":139,"column":29}},"58":{"start":{"line":140,"column":2},"end":{"line":140,"column":66}},"59":{"start":{"line":142,"column":18},"end":{"line":142,"column":36}},"60":{"start":{"line":143,"column":19},"end":{"line":143,"column":41}},"61":{"start":{"line":144,"column":2},"end":{"line":144,"column":48}},"62":{"start":{"line":146,"column":2},"end":{"line":146,"column":59}},"63":{"start":{"line":147,"column":20},"end":{"line":147,"column":70}},"64":{"start":{"line":148,"column":2},"end":{"line":151,"column":4}},"65":{"start":{"line":152,"column":2},"end":{"line":152,"column":31}},"66":{"start":{"line":153,"column":2},"end":{"line":153,"column":18}},"67":{"start":{"line":156,"column":16},"end":{"line":182,"column":1}},"68":{"start":{"line":157,"column":35},"end":{"line":157,"column":40}},"69":{"start":{"line":158,"column":2},"end":{"line":163,"column":3}},"70":{"start":{"line":159,"column":4},"end":{"line":162,"column":6}},"71":{"start":{"line":165,"column":22},"end":{"line":165,"column":48}},"72":{"start":{"line":166,"column":19},"end":{"line":166,"column":64}},"73":{"start":{"line":168,"column":2},"end":{"line":180,"column":3}},"74":{"start":{"line":170,"column":6},"end":{"line":170,"column":76}},"75":{"start":{"line":171,"column":6},"end":{"line":171,"column":12}},"76":{"start":{"line":173,"column":6},"end":{"line":173,"column":79}},"77":{"start":{"line":174,"column":6},"end":{"line":174,"column":12}},"78":{"start":{"line":176,"column":6},"end":{"line":176,"column":76}},"79":{"start":{"line":177,"column":6},"end":{"line":177,"column":12}},"80":{"start":{"line":179,"column":6},"end":{"line":179,"column":78}},"81":{"start":{"line":181,"column":2},"end":{"line":181,"column":18}},"82":{"start":{"line":184,"column":26},"end":{"line":221,"column":1}},"83":{"start":{"line":185,"column":2},"end":{"line":188,"column":3}},"84":{"start":{"line":186,"column":23},"end":{"line":186,"column":75}},"85":{"start":{"line":187,"column":4},"end":{"line":187,"column":24}},"86":{"start":{"line":190,"column":19},"end":{"line":219,"column":3}},"87":{"start":{"line":192,"column":6},"end":{"line":217,"column":7}},"88":{"start":{"line":193,"column":8},"end":{"line":200,"column":9}},"89":{"start":{"line":195,"column":10},"end":{"line":199,"column":12}},"90":{"start":{"line":202,"column":8},"end":{"line":206,"column":10}},"91":{"start":{"line":208,"column":8},"end":{"line":216,"column":10}},"92":{"start":{"line":220,"column":2},"end":{"line":220,"column":18}},"93":{"start":{"line":223,"column":0},"end":{"line":223,"column":48}}},"fnMap":{"0":{"name":"checkValidEventName","decl":{"start":{"line":24,"column":9},"end":{"line":24,"column":28}},"loc":{"start":{"line":24,"column":34},"end":{"line":28,"column":1}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":30,"column":19},"end":{"line":30,"column":20}},"loc":{"start":{"line":30,"column":29},"end":{"line":40,"column":1}},"line":30},"2":{"name":"(anonymous_2)","decl":{"start":{"line":42,"column":29},"end":{"line":42,"column":30}},"loc":{"start":{"line":42,"column":70},"end":{"line":89,"column":1}},"line":42},"3":{"name":"(anonymous_3)","decl":{"start":{"line":91,"column":32},"end":{"line":91,"column":33}},"loc":{"start":{"line":91,"column":73},"end":{"line":123,"column":1}},"line":91},"4":{"name":"(anonymous_4)","decl":{"start":{"line":125,"column":29},"end":{"line":125,"column":30}},"loc":{"start":{"line":125,"column":70},"end":{"line":154,"column":1}},"line":125},"5":{"name":"(anonymous_5)","decl":{"start":{"line":156,"column":16},"end":{"line":156,"column":17}},"loc":{"start":{"line":156,"column":31},"end":{"line":182,"column":1}},"line":156},"6":{"name":"(anonymous_6)","decl":{"start":{"line":184,"column":26},"end":{"line":184,"column":27}},"loc":{"start":{"line":184,"column":42},"end":{"line":221,"column":1}},"line":184},"7":{"name":"(anonymous_7)","decl":{"start":{"line":191,"column":15},"end":{"line":191,"column":16}},"loc":{"start":{"line":191,"column":30},"end":{"line":218,"column":5}},"line":191}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":2},"end":{"line":26,"column":16}},"type":"if","locations":[{"start":{"line":25,"column":2},"end":{"line":26,"column":16}},{"start":{"line":25,"column":2},"end":{"line":26,"column":16}}],"line":25},"1":{"loc":{"start":{"line":25,"column":6},"end":{"line":25,"column":69}},"type":"binary-expr","locations":[{"start":{"line":25,"column":6},"end":{"line":25,"column":29}},{"start":{"line":25,"column":33},"end":{"line":25,"column":50}},{"start":{"line":25,"column":54},"end":{"line":25,"column":69}}],"line":25},"2":{"loc":{"start":{"line":32,"column":2},"end":{"line":38,"column":3}},"type":"switch","locations":[{"start":{"line":33,"column":4},"end":{"line":35,"column":12}},{"start":{"line":36,"column":4},"end":{"line":37,"column":26}}],"line":32},"3":{"loc":{"start":{"line":44,"column":2},"end":{"line":49,"column":3}},"type":"if","locations":[{"start":{"line":44,"column":2},"end":{"line":49,"column":3}},{"start":{"line":44,"column":2},"end":{"line":49,"column":3}}],"line":44},"4":{"loc":{"start":{"line":51,"column":2},"end":{"line":56,"column":3}},"type":"if","locations":[{"start":{"line":51,"column":2},"end":{"line":56,"column":3}},{"start":{"line":51,"column":2},"end":{"line":56,"column":3}}],"line":51},"5":{"loc":{"start":{"line":59,"column":2},"end":{"line":62,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":62,"column":3}},{"start":{"line":59,"column":2},"end":{"line":62,"column":3}}],"line":59},"6":{"loc":{"start":{"line":65,"column":2},"end":{"line":67,"column":3}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":67,"column":3}},{"start":{"line":65,"column":2},"end":{"line":67,"column":3}}],"line":65},"7":{"loc":{"start":{"line":69,"column":2},"end":{"line":74,"column":3}},"type":"if","locations":[{"start":{"line":69,"column":2},"end":{"line":74,"column":3}},{"start":{"line":69,"column":2},"end":{"line":74,"column":3}}],"line":69},"8":{"loc":{"start":{"line":92,"column":2},"end":{"line":97,"column":3}},"type":"if","locations":[{"start":{"line":92,"column":2},"end":{"line":97,"column":3}},{"start":{"line":92,"column":2},"end":{"line":97,"column":3}}],"line":92},"9":{"loc":{"start":{"line":100,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":100,"column":2},"end":{"line":103,"column":3}},{"start":{"line":100,"column":2},"end":{"line":103,"column":3}}],"line":100},"10":{"loc":{"start":{"line":126,"column":2},"end":{"line":131,"column":3}},"type":"if","locations":[{"start":{"line":126,"column":2},"end":{"line":131,"column":3}},{"start":{"line":126,"column":2},"end":{"line":131,"column":3}}],"line":126},"11":{"loc":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},{"start":{"line":135,"column":2},"end":{"line":138,"column":3}}],"line":135},"12":{"loc":{"start":{"line":158,"column":2},"end":{"line":163,"column":3}},"type":"if","locations":[{"start":{"line":158,"column":2},"end":{"line":163,"column":3}},{"start":{"line":158,"column":2},"end":{"line":163,"column":3}}],"line":158},"13":{"loc":{"start":{"line":168,"column":2},"end":{"line":180,"column":3}},"type":"switch","locations":[{"start":{"line":169,"column":4},"end":{"line":171,"column":12}},{"start":{"line":172,"column":4},"end":{"line":174,"column":12}},{"start":{"line":175,"column":4},"end":{"line":177,"column":12}},{"start":{"line":178,"column":4},"end":{"line":179,"column":78}}],"line":168},"14":{"loc":{"start":{"line":185,"column":2},"end":{"line":188,"column":3}},"type":"if","locations":[{"start":{"line":185,"column":2},"end":{"line":188,"column":3}},{"start":{"line":185,"column":2},"end":{"line":188,"column":3}}],"line":185},"15":{"loc":{"start":{"line":185,"column":6},"end":{"line":185,"column":50}},"type":"binary-expr","locations":[{"start":{"line":185,"column":6},"end":{"line":185,"column":28}},{"start":{"line":185,"column":32},"end":{"line":185,"column":50}}],"line":185},"16":{"loc":{"start":{"line":193,"column":8},"end":{"line":200,"column":9}},"type":"if","locations":[{"start":{"line":193,"column":8},"end":{"line":200,"column":9}},{"start":{"line":193,"column":8},"end":{"line":200,"column":9}}],"line":193},"17":{"loc":{"start":{"line":210,"column":10},"end":{"line":214,"column":17}},"type":"cond-expr","locations":[{"start":{"line":211,"column":14},"end":{"line":211,"column":35}},{"start":{"line":212,"column":14},"end":{"line":214,"column":17}}],"line":210},"18":{"loc":{"start":{"line":212,"column":14},"end":{"line":214,"column":17}},"type":"cond-expr","locations":[{"start":{"line":213,"column":14},"end":{"line":213,"column":24}},{"start":{"line":214,"column":14},"end":{"line":214,"column":17}}],"line":212},"19":{"loc":{"start":{"line":215,"column":10},"end":{"line":215,"column":69}},"type":"binary-expr","locations":[{"start":{"line":215,"column":10},"end":{"line":215,"column":23}},{"start":{"line":215,"column":27},"end":{"line":215,"column":69}}],"line":215}},"s":{"0":1,"1":1,"2":1,"3":8,"4":2,"5":6,"6":1,"7":12,"8":4,"9":4,"10":8,"11":12,"12":1,"13":9,"14":9,"15":0,"16":9,"17":1,"18":8,"19":8,"20":0,"21":8,"22":8,"23":3,"24":8,"25":8,"26":2,"27":6,"28":6,"29":6,"30":6,"31":6,"32":6,"33":6,"34":6,"35":6,"36":1,"37":5,"38":1,"39":4,"40":3,"41":0,"42":3,"43":3,"44":3,"45":3,"46":3,"47":3,"48":3,"49":3,"50":3,"51":1,"52":5,"53":1,"54":4,"55":3,"56":0,"57":3,"58":3,"59":3,"60":3,"61":3,"62":3,"63":3,"64":3,"65":3,"66":3,"67":1,"68":21,"69":21,"70":1,"71":20,"72":20,"73":20,"74":9,"75":6,"76":5,"77":3,"78":5,"79":3,"80":1,"81":12,"82":1,"83":1,"84":0,"85":0,"86":1,"87":3,"88":3,"89":0,"90":3,"91":0,"92":1,"93":1},"f":{"0":8,"1":12,"2":9,"3":5,"4":5,"5":21,"6":1,"7":3},"b":{"0":[2,6],"1":[8,7,6],"2":[4,8],"3":[0,9],"4":[1,8],"5":[0,8],"6":[3,5],"7":[2,6],"8":[1,4],"9":[0,3],"10":[1,4],"11":[0,3],"12":[1,20],"13":[9,5,5,1],"14":[0,1],"15":[1,1],"16":[0,3],"17":[0,0],"18":[0,0],"19":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8aff44e4f0e5be479cb2bd78adb99825dc8950e1"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\bq\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\bq\\transform.js","statementMap":{"0":{"start":{"line":1,"column":36},"end":{"line":1,"column":65}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":21}},"2":{"start":{"line":6,"column":2},"end":{"line":6,"column":51}},"3":{"start":{"line":12,"column":26},"end":{"line":12,"column":69}},"4":{"start":{"line":13,"column":22},"end":{"line":13,"column":73}},"5":{"start":{"line":14,"column":23},"end":{"line":14,"column":71}},"6":{"start":{"line":15,"column":19},"end":{"line":15,"column":27}},"7":{"start":{"line":16,"column":2},"end":{"line":24,"column":5}},"8":{"start":{"line":27,"column":0},"end":{"line":30,"column":2}}},"fnMap":{"0":{"name":"processSingleMessage","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":29}},"loc":{"start":{"line":5,"column":48},"end":{"line":7,"column":1}},"line":5},"1":{"name":"getDataTypeOverride","decl":{"start":{"line":9,"column":9},"end":{"line":9,"column":28}},"loc":{"start":{"line":9,"column":48},"end":{"line":9,"column":50}},"line":9},"2":{"name":"process","decl":{"start":{"line":11,"column":9},"end":{"line":11,"column":16}},"loc":{"start":{"line":11,"column":24},"end":{"line":25,"column":1}},"line":11}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":26},"end":{"line":12,"column":69}},"type":"binary-expr","locations":[{"start":{"line":12,"column":26},"end":{"line":12,"column":61}},{"start":{"line":12,"column":65},"end":{"line":12,"column":69}}],"line":12},"1":{"loc":{"start":{"line":13,"column":22},"end":{"line":13,"column":73}},"type":"binary-expr","locations":[{"start":{"line":13,"column":22},"end":{"line":13,"column":64}},{"start":{"line":13,"column":68},"end":{"line":13,"column":73}}],"line":13},"2":{"loc":{"start":{"line":23,"column":20},"end":{"line":23,"column":73}},"type":"cond-expr","locations":[{"start":{"line":23,"column":37},"end":{"line":23,"column":66}},{"start":{"line":23,"column":69},"end":{"line":23,"column":73}}],"line":23}},"s":{"0":3,"1":3,"2":124,"3":124,"4":124,"5":124,"6":124,"7":124,"8":3},"f":{"0":124,"1":2917,"2":124},"b":{"0":[124,0],"1":[124,124],"2":[6,118]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"119c484aac84577b9d9b88135d4fa6f9d74e8efb"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\bqstream\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\bqstream\\transform.js","statementMap":{"0":{"start":{"line":2,"column":22},"end":{"line":2,"column":51}},"1":{"start":{"line":3,"column":24},"end":{"line":3,"column":45}},"2":{"start":{"line":5,"column":28},"end":{"line":15,"column":1}},"3":{"start":{"line":6,"column":2},"end":{"line":13,"column":3}},"4":{"start":{"line":12,"column":4},"end":{"line":12,"column":40}},"5":{"start":{"line":14,"column":2},"end":{"line":14,"column":14}},"6":{"start":{"line":17,"column":16},"end":{"line":43,"column":1}},"7":{"start":{"line":18,"column":22},"end":{"line":18,"column":27}},"8":{"start":{"line":19,"column":31},"end":{"line":19,"column":38}},"9":{"start":{"line":21,"column":2},"end":{"line":23,"column":3}},"10":{"start":{"line":22,"column":4},"end":{"line":22,"column":70}},"11":{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},"12":{"start":{"line":25,"column":4},"end":{"line":25,"column":70}},"13":{"start":{"line":31,"column":6},"end":{"line":31,"column":11}},"14":{"start":{"line":32,"column":23},"end":{"line":32,"column":70}},"15":{"start":{"line":33,"column":16},"end":{"line":33,"column":33}},"16":{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},"17":{"start":{"line":35,"column":4},"end":{"line":35,"column":34}},"18":{"start":{"line":37,"column":2},"end":{"line":42,"column":4}},"19":{"start":{"line":45,"column":0},"end":{"line":45,"column":29}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":28},"end":{"line":5,"column":29}},"loc":{"start":{"line":5,"column":57},"end":{"line":15,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":16},"end":{"line":17,"column":17}},"loc":{"start":{"line":17,"column":31},"end":{"line":43,"column":1}},"line":17}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":2},"end":{"line":13,"column":3}},"type":"if","locations":[{"start":{"line":6,"column":2},"end":{"line":13,"column":3}},{"start":{"line":6,"column":2},"end":{"line":13,"column":3}}],"line":6},"1":{"loc":{"start":{"line":7,"column":4},"end":{"line":10,"column":50}},"type":"binary-expr","locations":[{"start":{"line":7,"column":4},"end":{"line":7,"column":15}},{"start":{"line":8,"column":4},"end":{"line":8,"column":27}},{"start":{"line":9,"column":5},"end":{"line":9,"column":48}},{"start":{"line":10,"column":6},"end":{"line":10,"column":49}}],"line":7},"2":{"loc":{"start":{"line":21,"column":2},"end":{"line":23,"column":3}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":23,"column":3}},{"start":{"line":21,"column":2},"end":{"line":23,"column":3}}],"line":21},"3":{"loc":{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},{"start":{"line":24,"column":2},"end":{"line":26,"column":3}}],"line":24},"4":{"loc":{"start":{"line":24,"column":6},"end":{"line":24,"column":51}},"type":"binary-expr","locations":[{"start":{"line":24,"column":6},"end":{"line":24,"column":17}},{"start":{"line":24,"column":21},"end":{"line":24,"column":51}}],"line":24},"5":{"loc":{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},{"start":{"line":34,"column":2},"end":{"line":36,"column":3}}],"line":34}},"s":{"0":1,"1":1,"2":1,"3":2,"4":1,"5":1,"6":1,"7":2,"8":2,"9":2,"10":0,"11":2,"12":0,"13":2,"14":2,"15":2,"16":2,"17":1,"18":2,"19":1},"f":{"0":2,"1":2},"b":{"0":[1,1],"1":[2,1,1,1],"2":[0,2],"3":[0,2],"4":[2,2],"5":[1,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8d90617a96b2682f929a8858421c2f8d46048976"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\branch\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\branch\\config.js","statementMap":{"0":{"start":{"line":1,"column":21},"end":{"line":1,"column":45}},"1":{"start":{"line":2,"column":18},"end":{"line":5,"column":1}},"2":{"start":{"line":7,"column":0},"end":{"line":9,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"45db512608ddd1519477ac7198e142e05a7b95ef"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\branch\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\branch\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":22},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":22},"end":{"line":3,"column":41}},"3":{"start":{"line":4,"column":27},"end":{"line":4,"column":57}},"4":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"5":{"start":{"line":18,"column":19},"end":{"line":18,"column":41}},"6":{"start":{"line":20,"column":2},"end":{"line":24,"column":3}},"7":{"start":{"line":21,"column":4},"end":{"line":21,"column":49}},"8":{"start":{"line":23,"column":4},"end":{"line":23,"column":51}},"9":{"start":{"line":25,"column":2},"end":{"line":25,"column":59}},"10":{"start":{"line":27,"column":2},"end":{"line":30,"column":5}},"11":{"start":{"line":32,"column":2},"end":{"line":39,"column":4}},"12":{"start":{"line":43,"column":2},"end":{"line":57,"column":3}},"13":{"start":{"line":43,"column":15},"end":{"line":43,"column":16}},"14":{"start":{"line":44,"column":21},"end":{"line":44,"column":38}},"15":{"start":{"line":45,"column":23},"end":{"line":45,"column":27}},"16":{"start":{"line":46,"column":27},"end":{"line":46,"column":31}},"17":{"start":{"line":48,"column":4},"end":{"line":53,"column":7}},"18":{"start":{"line":49,"column":6},"end":{"line":52,"column":7}},"19":{"start":{"line":50,"column":8},"end":{"line":50,"column":48}},"20":{"start":{"line":51,"column":8},"end":{"line":51,"column":36}},"21":{"start":{"line":54,"column":4},"end":{"line":56,"column":5}},"22":{"start":{"line":55,"column":6},"end":{"line":55,"column":66}},"23":{"start":{"line":58,"column":2},"end":{"line":58,"column":57}},"24":{"start":{"line":64,"column":13},"end":{"line":64,"column":44}},"25":{"start":{"line":66,"column":17},"end":{"line":77,"column":3}},"26":{"start":{"line":79,"column":2},"end":{"line":94,"column":3}},"27":{"start":{"line":80,"column":4},"end":{"line":93,"column":5}},"28":{"start":{"line":81,"column":6},"end":{"line":83,"column":53}},"29":{"start":{"line":85,"column":6},"end":{"line":86,"column":74}},"30":{"start":{"line":87,"column":11},"end":{"line":93,"column":5}},"31":{"start":{"line":88,"column":6},"end":{"line":89,"column":80}},"32":{"start":{"line":90,"column":6},"end":{"line":92,"column":53}},"33":{"start":{"line":96,"column":14},"end":{"line":96,"column":62}},"34":{"start":{"line":97,"column":2},"end":{"line":103,"column":3}},"35":{"start":{"line":98,"column":4},"end":{"line":102,"column":5}},"36":{"start":{"line":99,"column":6},"end":{"line":99,"column":41}},"37":{"start":{"line":100,"column":11},"end":{"line":102,"column":5}},"38":{"start":{"line":101,"column":6},"end":{"line":101,"column":40}},"39":{"start":{"line":105,"column":2},"end":{"line":105,"column":52}},"40":{"start":{"line":107,"column":2},"end":{"line":107,"column":18}},"41":{"start":{"line":111,"column":23},"end":{"line":111,"column":25}},"42":{"start":{"line":112,"column":20},"end":{"line":112,"column":22}},"43":{"start":{"line":113,"column":21},"end":{"line":113,"column":23}},"44":{"start":{"line":115,"column":17},"end":{"line":115,"column":22}},"45":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"46":{"start":{"line":117,"column":4},"end":{"line":125,"column":7}},"47":{"start":{"line":118,"column":6},"end":{"line":123,"column":7}},"48":{"start":{"line":119,"column":27},"end":{"line":119,"column":72}},"49":{"start":{"line":120,"column":8},"end":{"line":120,"column":71}},"50":{"start":{"line":121,"column":8},"end":{"line":121,"column":24}},"51":{"start":{"line":122,"column":8},"end":{"line":122,"column":20}},"52":{"start":{"line":124,"column":6},"end":{"line":124,"column":19}},"53":{"start":{"line":128,"column":2},"end":{"line":139,"column":3}},"54":{"start":{"line":129,"column":4},"end":{"line":138,"column":5}},"55":{"start":{"line":130,"column":6},"end":{"line":137,"column":9}},"56":{"start":{"line":131,"column":8},"end":{"line":135,"column":9}},"57":{"start":{"line":132,"column":10},"end":{"line":132,"column":74}},"58":{"start":{"line":133,"column":10},"end":{"line":133,"column":26}},"59":{"start":{"line":134,"column":10},"end":{"line":134,"column":22}},"60":{"start":{"line":136,"column":8},"end":{"line":136,"column":21}},"61":{"start":{"line":141,"column":2},"end":{"line":143,"column":3}},"62":{"start":{"line":142,"column":4},"end":{"line":142,"column":69}},"63":{"start":{"line":144,"column":2},"end":{"line":148,"column":4}},"64":{"start":{"line":152,"column":21},"end":{"line":152,"column":23}},"65":{"start":{"line":154,"column":23},"end":{"line":154,"column":25}},"66":{"start":{"line":155,"column":20},"end":{"line":155,"column":22}},"67":{"start":{"line":156,"column":21},"end":{"line":156,"column":23}},"68":{"start":{"line":157,"column":19},"end":{"line":157,"column":21}},"69":{"start":{"line":160,"column":2},"end":{"line":169,"column":3}},"70":{"start":{"line":162,"column":6},"end":{"line":164,"column":15}},"71":{"start":{"line":165,"column":6},"end":{"line":165,"column":12}},"72":{"start":{"line":167,"column":6},"end":{"line":167,"column":72}},"73":{"start":{"line":168,"column":6},"end":{"line":168,"column":12}},"74":{"start":{"line":171,"column":2},"end":{"line":212,"column":3}},"75":{"start":{"line":172,"column":4},"end":{"line":201,"column":7}},"76":{"start":{"line":173,"column":6},"end":{"line":200,"column":7}},"77":{"start":{"line":174,"column":8},"end":{"line":174,"column":24}},"78":{"start":{"line":175,"column":8},"end":{"line":190,"column":9}},"79":{"start":{"line":175,"column":21},"end":{"line":175,"column":22}},"80":{"start":{"line":176,"column":26},"end":{"line":176,"column":57}},"81":{"start":{"line":178,"column":10},"end":{"line":187,"column":13}},"82":{"start":{"line":179,"column":69},"end":{"line":183,"column":13}},"83":{"start":{"line":184,"column":12},"end":{"line":184,"column":55}},"84":{"start":{"line":185,"column":12},"end":{"line":185,"column":51}},"85":{"start":{"line":186,"column":12},"end":{"line":186,"column":53}},"86":{"start":{"line":188,"column":10},"end":{"line":188,"column":40}},"87":{"start":{"line":189,"column":10},"end":{"line":189,"column":26}},"88":{"start":{"line":192,"column":65},"end":{"line":196,"column":9}},"89":{"start":{"line":197,"column":8},"end":{"line":197,"column":51}},"90":{"start":{"line":198,"column":8},"end":{"line":198,"column":47}},"91":{"start":{"line":199,"column":8},"end":{"line":199,"column":49}},"92":{"start":{"line":202,"column":4},"end":{"line":202,"column":34}},"93":{"start":{"line":203,"column":4},"end":{"line":203,"column":40}},"94":{"start":{"line":204,"column":4},"end":{"line":204,"column":44}},"95":{"start":{"line":205,"column":4},"end":{"line":205,"column":38}},"96":{"start":{"line":207,"column":4},"end":{"line":211,"column":7}},"97":{"start":{"line":208,"column":6},"end":{"line":210,"column":7}},"98":{"start":{"line":209,"column":8},"end":{"line":209,"column":31}},"99":{"start":{"line":213,"column":2},"end":{"line":213,"column":46}},"100":{"start":{"line":214,"column":2},"end":{"line":214,"column":27}},"101":{"start":{"line":216,"column":2},"end":{"line":216,"column":20}},"102":{"start":{"line":228,"column":2},"end":{"line":240,"column":3}},"103":{"start":{"line":230,"column":6},"end":{"line":232,"column":7}},"104":{"start":{"line":231,"column":8},"end":{"line":231,"column":61}},"105":{"start":{"line":233,"column":33},"end":{"line":233,"column":66}},"106":{"start":{"line":234,"column":6},"end":{"line":234,"column":12}},"107":{"start":{"line":236,"column":33},"end":{"line":236,"column":67}},"108":{"start":{"line":237,"column":6},"end":{"line":237,"column":12}},"109":{"start":{"line":239,"column":6},"end":{"line":239,"column":66}},"110":{"start":{"line":241,"column":21},"end":{"line":241,"column":64}},"111":{"start":{"line":242,"column":2},"end":{"line":242,"column":69}},"112":{"start":{"line":246,"column":35},"end":{"line":246,"column":40}},"113":{"start":{"line":247,"column":2},"end":{"line":247,"column":46}},"114":{"start":{"line":250,"column":26},"end":{"line":287,"column":1}},"115":{"start":{"line":251,"column":2},"end":{"line":254,"column":3}},"116":{"start":{"line":252,"column":23},"end":{"line":252,"column":75}},"117":{"start":{"line":253,"column":4},"end":{"line":253,"column":24}},"118":{"start":{"line":256,"column":19},"end":{"line":285,"column":3}},"119":{"start":{"line":258,"column":6},"end":{"line":283,"column":7}},"120":{"start":{"line":259,"column":8},"end":{"line":266,"column":9}},"121":{"start":{"line":261,"column":10},"end":{"line":265,"column":12}},"122":{"start":{"line":268,"column":8},"end":{"line":272,"column":10}},"123":{"start":{"line":274,"column":8},"end":{"line":282,"column":10}},"124":{"start":{"line":286,"column":2},"end":{"line":286,"column":18}},"125":{"start":{"line":289,"column":0},"end":{"line":289,"column":48}}},"fnMap":{"0":{"name":"responseBuilder","decl":{"start":{"line":17,"column":9},"end":{"line":17,"column":24}},"loc":{"start":{"line":17,"column":66},"end":{"line":40,"column":1}},"line":17},"1":{"name":"getCategoryAndName","decl":{"start":{"line":42,"column":9},"end":{"line":42,"column":27}},"loc":{"start":{"line":42,"column":45},"end":{"line":59,"column":1}},"line":42},"2":{"name":"(anonymous_2)","decl":{"start":{"line":48,"column":36},"end":{"line":48,"column":37}},"loc":{"start":{"line":48,"column":49},"end":{"line":53,"column":5}},"line":48},"3":{"name":"getUserData","decl":{"start":{"line":61,"column":9},"end":{"line":61,"column":20}},"loc":{"start":{"line":61,"column":30},"end":{"line":108,"column":1}},"line":61},"4":{"name":"mapPayload","decl":{"start":{"line":110,"column":9},"end":{"line":110,"column":19}},"loc":{"start":{"line":110,"column":67},"end":{"line":149,"column":1}},"line":110},"5":{"name":"(anonymous_5)","decl":{"start":{"line":117,"column":45},"end":{"line":117,"column":46}},"loc":{"start":{"line":117,"column":70},"end":{"line":125,"column":5}},"line":117},"6":{"name":"(anonymous_6)","decl":{"start":{"line":130,"column":31},"end":{"line":130,"column":32}},"loc":{"start":{"line":130,"column":56},"end":{"line":137,"column":7}},"line":130},"7":{"name":"getCommonPayload","decl":{"start":{"line":151,"column":9},"end":{"line":151,"column":25}},"loc":{"start":{"line":151,"column":53},"end":{"line":217,"column":1}},"line":151},"8":{"name":"(anonymous_8)","decl":{"start":{"line":172,"column":41},"end":{"line":172,"column":42}},"loc":{"start":{"line":172,"column":59},"end":{"line":201,"column":5}},"line":172},"9":{"name":"(anonymous_9)","decl":{"start":{"line":178,"column":35},"end":{"line":178,"column":36}},"loc":{"start":{"line":178,"column":50},"end":{"line":187,"column":11}},"line":178},"10":{"name":"(anonymous_10)","decl":{"start":{"line":207,"column":32},"end":{"line":207,"column":33}},"loc":{"start":{"line":207,"column":39},"end":{"line":211,"column":5}},"line":207},"11":{"name":"processMessage","decl":{"start":{"line":227,"column":9},"end":{"line":227,"column":23}},"loc":{"start":{"line":227,"column":46},"end":{"line":243,"column":1}},"line":227},"12":{"name":"process","decl":{"start":{"line":245,"column":9},"end":{"line":245,"column":16}},"loc":{"start":{"line":245,"column":24},"end":{"line":248,"column":1}},"line":245},"13":{"name":"(anonymous_13)","decl":{"start":{"line":250,"column":26},"end":{"line":250,"column":27}},"loc":{"start":{"line":250,"column":42},"end":{"line":287,"column":1}},"line":250},"14":{"name":"(anonymous_14)","decl":{"start":{"line":257,"column":15},"end":{"line":257,"column":16}},"loc":{"start":{"line":257,"column":30},"end":{"line":284,"column":5}},"line":257}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":2},"end":{"line":24,"column":3}},"type":"if","locations":[{"start":{"line":20,"column":2},"end":{"line":24,"column":3}},{"start":{"line":20,"column":2},"end":{"line":24,"column":3}}],"line":20},"1":{"loc":{"start":{"line":49,"column":6},"end":{"line":52,"column":7}},"type":"if","locations":[{"start":{"line":49,"column":6},"end":{"line":52,"column":7}},{"start":{"line":49,"column":6},"end":{"line":52,"column":7}}],"line":49},"2":{"loc":{"start":{"line":54,"column":4},"end":{"line":56,"column":5}},"type":"if","locations":[{"start":{"line":54,"column":4},"end":{"line":56,"column":5}},{"start":{"line":54,"column":4},"end":{"line":56,"column":5}}],"line":54},"3":{"loc":{"start":{"line":54,"column":8},"end":{"line":54,"column":56}},"type":"binary-expr","locations":[{"start":{"line":54,"column":8},"end":{"line":54,"column":28}},{"start":{"line":54,"column":32},"end":{"line":54,"column":56}}],"line":54},"4":{"loc":{"start":{"line":79,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":94,"column":3}},{"start":{"line":79,"column":2},"end":{"line":94,"column":3}}],"line":79},"5":{"loc":{"start":{"line":80,"column":4},"end":{"line":93,"column":5}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":93,"column":5}},{"start":{"line":80,"column":4},"end":{"line":93,"column":5}}],"line":80},"6":{"loc":{"start":{"line":82,"column":8},"end":{"line":83,"column":52}},"type":"binary-expr","locations":[{"start":{"line":82,"column":8},"end":{"line":82,"column":36}},{"start":{"line":83,"column":8},"end":{"line":83,"column":52}}],"line":82},"7":{"loc":{"start":{"line":86,"column":8},"end":{"line":86,"column":73}},"type":"binary-expr","locations":[{"start":{"line":86,"column":8},"end":{"line":86,"column":36}},{"start":{"line":86,"column":40},"end":{"line":86,"column":73}}],"line":86},"8":{"loc":{"start":{"line":87,"column":11},"end":{"line":93,"column":5}},"type":"if","locations":[{"start":{"line":87,"column":11},"end":{"line":93,"column":5}},{"start":{"line":87,"column":11},"end":{"line":93,"column":5}}],"line":87},"9":{"loc":{"start":{"line":89,"column":8},"end":{"line":89,"column":79}},"type":"binary-expr","locations":[{"start":{"line":89,"column":8},"end":{"line":89,"column":42}},{"start":{"line":89,"column":46},"end":{"line":89,"column":79}}],"line":89},"10":{"loc":{"start":{"line":91,"column":8},"end":{"line":92,"column":52}},"type":"binary-expr","locations":[{"start":{"line":91,"column":8},"end":{"line":91,"column":36}},{"start":{"line":92,"column":8},"end":{"line":92,"column":52}}],"line":91},"11":{"loc":{"start":{"line":97,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":97,"column":2},"end":{"line":103,"column":3}},{"start":{"line":97,"column":2},"end":{"line":103,"column":3}}],"line":97},"12":{"loc":{"start":{"line":98,"column":4},"end":{"line":102,"column":5}},"type":"if","locations":[{"start":{"line":98,"column":4},"end":{"line":102,"column":5}},{"start":{"line":98,"column":4},"end":{"line":102,"column":5}}],"line":98},"13":{"loc":{"start":{"line":100,"column":11},"end":{"line":102,"column":5}},"type":"if","locations":[{"start":{"line":100,"column":11},"end":{"line":102,"column":5}},{"start":{"line":100,"column":11},"end":{"line":102,"column":5}}],"line":100},"14":{"loc":{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":126,"column":3}},{"start":{"line":116,"column":2},"end":{"line":126,"column":3}}],"line":116},"15":{"loc":{"start":{"line":118,"column":6},"end":{"line":123,"column":7}},"type":"if","locations":[{"start":{"line":118,"column":6},"end":{"line":123,"column":7}},{"start":{"line":118,"column":6},"end":{"line":123,"column":7}}],"line":118},"16":{"loc":{"start":{"line":128,"column":2},"end":{"line":139,"column":3}},"type":"if","locations":[{"start":{"line":128,"column":2},"end":{"line":139,"column":3}},{"start":{"line":128,"column":2},"end":{"line":139,"column":3}}],"line":128},"17":{"loc":{"start":{"line":129,"column":4},"end":{"line":138,"column":5}},"type":"if","locations":[{"start":{"line":129,"column":4},"end":{"line":138,"column":5}},{"start":{"line":129,"column":4},"end":{"line":138,"column":5}}],"line":129},"18":{"loc":{"start":{"line":131,"column":8},"end":{"line":135,"column":9}},"type":"if","locations":[{"start":{"line":131,"column":8},"end":{"line":135,"column":9}},{"start":{"line":131,"column":8},"end":{"line":135,"column":9}}],"line":131},"19":{"loc":{"start":{"line":141,"column":2},"end":{"line":143,"column":3}},"type":"if","locations":[{"start":{"line":141,"column":2},"end":{"line":143,"column":3}},{"start":{"line":141,"column":2},"end":{"line":143,"column":3}}],"line":141},"20":{"loc":{"start":{"line":160,"column":2},"end":{"line":169,"column":3}},"type":"switch","locations":[{"start":{"line":161,"column":4},"end":{"line":165,"column":12}},{"start":{"line":166,"column":4},"end":{"line":168,"column":12}}],"line":160},"21":{"loc":{"start":{"line":162,"column":28},"end":{"line":164,"column":14}},"type":"cond-expr","locations":[{"start":{"line":163,"column":10},"end":{"line":163,"column":28}},{"start":{"line":164,"column":10},"end":{"line":164,"column":14}}],"line":162},"22":{"loc":{"start":{"line":171,"column":2},"end":{"line":212,"column":3}},"type":"if","locations":[{"start":{"line":171,"column":2},"end":{"line":212,"column":3}},{"start":{"line":171,"column":2},"end":{"line":212,"column":3}}],"line":171},"23":{"loc":{"start":{"line":173,"column":6},"end":{"line":200,"column":7}},"type":"if","locations":[{"start":{"line":173,"column":6},"end":{"line":200,"column":7}},{"start":{"line":173,"column":6},"end":{"line":200,"column":7}}],"line":173},"24":{"loc":{"start":{"line":208,"column":6},"end":{"line":210,"column":7}},"type":"if","locations":[{"start":{"line":208,"column":6},"end":{"line":210,"column":7}},{"start":{"line":208,"column":6},"end":{"line":210,"column":7}}],"line":208},"25":{"loc":{"start":{"line":228,"column":2},"end":{"line":240,"column":3}},"type":"switch","locations":[{"start":{"line":229,"column":4},"end":{"line":234,"column":12}},{"start":{"line":235,"column":4},"end":{"line":237,"column":12}},{"start":{"line":238,"column":4},"end":{"line":239,"column":66}}],"line":228},"26":{"loc":{"start":{"line":230,"column":6},"end":{"line":232,"column":7}},"type":"if","locations":[{"start":{"line":230,"column":6},"end":{"line":232,"column":7}},{"start":{"line":230,"column":6},"end":{"line":232,"column":7}}],"line":230},"27":{"loc":{"start":{"line":251,"column":2},"end":{"line":254,"column":3}},"type":"if","locations":[{"start":{"line":251,"column":2},"end":{"line":254,"column":3}},{"start":{"line":251,"column":2},"end":{"line":254,"column":3}}],"line":251},"28":{"loc":{"start":{"line":251,"column":6},"end":{"line":251,"column":50}},"type":"binary-expr","locations":[{"start":{"line":251,"column":6},"end":{"line":251,"column":28}},{"start":{"line":251,"column":32},"end":{"line":251,"column":50}}],"line":251},"29":{"loc":{"start":{"line":259,"column":8},"end":{"line":266,"column":9}},"type":"if","locations":[{"start":{"line":259,"column":8},"end":{"line":266,"column":9}},{"start":{"line":259,"column":8},"end":{"line":266,"column":9}}],"line":259},"30":{"loc":{"start":{"line":276,"column":10},"end":{"line":280,"column":17}},"type":"cond-expr","locations":[{"start":{"line":277,"column":14},"end":{"line":277,"column":35}},{"start":{"line":278,"column":14},"end":{"line":280,"column":17}}],"line":276},"31":{"loc":{"start":{"line":278,"column":14},"end":{"line":280,"column":17}},"type":"cond-expr","locations":[{"start":{"line":279,"column":14},"end":{"line":279,"column":24}},{"start":{"line":280,"column":14},"end":{"line":280,"column":17}}],"line":278},"32":{"loc":{"start":{"line":281,"column":10},"end":{"line":281,"column":69}},"type":"binary-expr","locations":[{"start":{"line":281,"column":10},"end":{"line":281,"column":23}},{"start":{"line":281,"column":27},"end":{"line":281,"column":69}}],"line":281}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":12,"6":12,"7":4,"8":8,"9":12,"10":12,"11":12,"12":12,"13":12,"14":20,"15":20,"16":20,"17":20,"18":180,"19":8,"20":8,"21":20,"22":8,"23":4,"24":12,"25":12,"26":12,"27":11,"28":9,"29":9,"30":2,"31":2,"32":2,"33":12,"34":12,"35":10,"36":7,"37":3,"38":3,"39":12,"40":12,"41":13,"42":13,"43":13,"44":13,"45":13,"46":5,"47":50,"48":5,"49":5,"50":5,"51":5,"52":45,"53":13,"54":8,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":13,"62":8,"63":13,"64":12,"65":12,"66":12,"67":12,"68":12,"69":12,"70":8,"71":8,"72":4,"73":4,"74":12,"75":9,"76":13,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":13,"89":13,"90":13,"91":13,"92":9,"93":9,"94":9,"95":9,"96":9,"97":27,"98":14,"99":12,"100":12,"101":12,"102":14,"103":9,"104":1,"105":8,"106":8,"107":4,"108":4,"109":1,"110":12,"111":12,"112":14,"113":14,"114":1,"115":1,"116":0,"117":0,"118":1,"119":2,"120":2,"121":0,"122":2,"123":0,"124":1,"125":1},"f":{"0":12,"1":12,"2":180,"3":12,"4":13,"5":50,"6":0,"7":12,"8":13,"9":0,"10":27,"11":14,"12":14,"13":1,"14":2},"b":{"0":[4,8],"1":[8,172],"2":[8,12],"3":[20,8],"4":[11,1],"5":[9,2],"6":[9,9],"7":[9,9],"8":[2,0],"9":[2,2],"10":[2,2],"11":[10,2],"12":[7,3],"13":[3,0],"14":[5,8],"15":[5,45],"16":[8,5],"17":[0,8],"18":[0,0],"19":[8,5],"20":[8,4],"21":[5,3],"22":[9,3],"23":[0,13],"24":[14,13],"25":[9,4,1],"26":[1,8],"27":[0,1],"28":[1,1],"29":[0,2],"30":[0,0],"31":[0,0],"32":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"14e0909ae5991ef4c646c2cb7e2a307115f00b3f"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\branch\\data\\eventMapping.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\branch\\data\\eventMapping.js","statementMap":{"0":{"start":{"line":1,"column":16},"end":{"line":30,"column":1}},"1":{"start":{"line":32,"column":28},"end":{"line":57,"column":1}},"2":{"start":{"line":59,"column":27},"end":{"line":71,"column":1}},"3":{"start":{"line":73,"column":29},"end":{"line":85,"column":1}},"4":{"start":{"line":87,"column":23},"end":{"line":91,"column":1}},"5":{"start":{"line":93,"column":0},"end":{"line":95,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0136b10426c9446af6738a19c5011c4a10817f3a"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\braze\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\braze\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":23},"end":{"line":10,"column":1}},"2":{"start":{"line":13,"column":2},"end":{"line":13,"column":38}},"3":{"start":{"line":17,"column":2},"end":{"line":17,"column":35}},"4":{"start":{"line":20,"column":22},"end":{"line":20,"column":65}},"5":{"start":{"line":22,"column":27},"end":{"line":22,"column":40}},"6":{"start":{"line":26,"column":34},"end":{"line":26,"column":36}},"7":{"start":{"line":27,"column":37},"end":{"line":27,"column":39}},"8":{"start":{"line":29,"column":20},"end":{"line":29,"column":27}},"9":{"start":{"line":31,"column":0},"end":{"line":40,"column":2}}},"fnMap":{"0":{"name":"getIdentifyEndpoint","decl":{"start":{"line":12,"column":9},"end":{"line":12,"column":28}},"loc":{"start":{"line":12,"column":39},"end":{"line":14,"column":1}},"line":12},"1":{"name":"getTrackEndPoint","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":25}},"loc":{"start":{"line":16,"column":36},"end":{"line":18,"column":1}},"line":16}},"branchMap":{},"s":{"0":2,"1":2,"2":6,"3":14,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2},"f":{"0":6,"1":14},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f8e640a2caf6fa3b6f74910ca43d7df18bcb6896"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\braze\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\braze\\transform.js","statementMap":{"0":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"1":{"start":{"line":4,"column":46},"end":{"line":4,"column":75}},"2":{"start":{"line":16,"column":4},"end":{"line":16,"column":25}},"3":{"start":{"line":17,"column":31},"end":{"line":17,"column":61}},"4":{"start":{"line":18,"column":21},"end":{"line":18,"column":48}},"5":{"start":{"line":29,"column":4},"end":{"line":29,"column":23}},"6":{"start":{"line":33,"column":2},"end":{"line":35,"column":3}},"7":{"start":{"line":34,"column":4},"end":{"line":34,"column":15}},"8":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"9":{"start":{"line":39,"column":4},"end":{"line":39,"column":15}},"10":{"start":{"line":43,"column":2},"end":{"line":45,"column":3}},"11":{"start":{"line":44,"column":4},"end":{"line":44,"column":15}},"12":{"start":{"line":47,"column":2},"end":{"line":47,"column":14}},"13":{"start":{"line":51,"column":19},"end":{"line":51,"column":41}},"14":{"start":{"line":52,"column":2},"end":{"line":52,"column":31}},"15":{"start":{"line":53,"column":2},"end":{"line":53,"column":58}},"16":{"start":{"line":54,"column":2},"end":{"line":54,"column":57}},"17":{"start":{"line":55,"column":2},"end":{"line":63,"column":4}},"18":{"start":{"line":67,"column":2},"end":{"line":72,"column":3}},"19":{"start":{"line":68,"column":4},"end":{"line":71,"column":6}},"20":{"start":{"line":73,"column":2},"end":{"line":73,"column":17}},"21":{"start":{"line":78,"column":4},"end":{"line":78,"column":74}},"22":{"start":{"line":79,"column":2},"end":{"line":81,"column":3}},"23":{"start":{"line":80,"column":4},"end":{"line":80,"column":37}},"24":{"start":{"line":82,"column":2},"end":{"line":82,"column":17}},"25":{"start":{"line":86,"column":17},"end":{"line":86,"column":64}},"26":{"start":{"line":87,"column":2},"end":{"line":89,"column":3}},"27":{"start":{"line":88,"column":4},"end":{"line":88,"column":43}},"28":{"start":{"line":91,"column":2},"end":{"line":91,"column":40}},"29":{"start":{"line":92,"column":2},"end":{"line":92,"column":52}},"30":{"start":{"line":96,"column":16},"end":{"line":96,"column":18}},"31":{"start":{"line":97,"column":2},"end":{"line":97,"column":55}},"32":{"start":{"line":98,"column":2},"end":{"line":98,"column":44}},"33":{"start":{"line":99,"column":2},"end":{"line":99,"column":44}},"34":{"start":{"line":105,"column":15},"end":{"line":105,"column":17}},"35":{"start":{"line":107,"column":17},"end":{"line":107,"column":60}},"36":{"start":{"line":110,"column":2},"end":{"line":112,"column":3}},"37":{"start":{"line":111,"column":4},"end":{"line":111,"column":18}},"38":{"start":{"line":115,"column":2},"end":{"line":124,"column":5}},"39":{"start":{"line":116,"column":16},"end":{"line":116,"column":49}},"40":{"start":{"line":117,"column":4},"end":{"line":123,"column":5}},"41":{"start":{"line":119,"column":6},"end":{"line":121,"column":7}},"42":{"start":{"line":120,"column":8},"end":{"line":120,"column":36}},"43":{"start":{"line":122,"column":6},"end":{"line":122,"column":28}},"44":{"start":{"line":127,"column":23},"end":{"line":136,"column":3}},"45":{"start":{"line":138,"column":2},"end":{"line":149,"column":3}},"46":{"start":{"line":140,"column":4},"end":{"line":148,"column":7}},"47":{"start":{"line":142,"column":6},"end":{"line":147,"column":7}},"48":{"start":{"line":143,"column":22},"end":{"line":143,"column":43}},"49":{"start":{"line":144,"column":8},"end":{"line":146,"column":9}},"50":{"start":{"line":145,"column":10},"end":{"line":145,"column":33}},"51":{"start":{"line":151,"column":2},"end":{"line":151,"column":14}},"52":{"start":{"line":156,"column":30},"end":{"line":156,"column":66}},"53":{"start":{"line":157,"column":2},"end":{"line":159,"column":3}},"54":{"start":{"line":158,"column":4},"end":{"line":158,"column":37}},"55":{"start":{"line":161,"column":2},"end":{"line":166,"column":4}},"56":{"start":{"line":170,"column":16},"end":{"line":170,"column":61}},"57":{"start":{"line":171,"column":2},"end":{"line":179,"column":3}},"58":{"start":{"line":172,"column":4},"end":{"line":172,"column":59}},"59":{"start":{"line":173,"column":4},"end":{"line":178,"column":6}},"60":{"start":{"line":180,"column":2},"end":{"line":180,"column":14}},"61":{"start":{"line":186,"column":19},"end":{"line":193,"column":3}},"62":{"start":{"line":195,"column":2},"end":{"line":197,"column":5}},"63":{"start":{"line":196,"column":4},"end":{"line":196,"column":26}},"64":{"start":{"line":198,"column":2},"end":{"line":198,"column":15}},"65":{"start":{"line":202,"column":2},"end":{"line":202,"column":31}},"66":{"start":{"line":203,"column":2},"end":{"line":203,"column":35}},"67":{"start":{"line":204,"column":2},"end":{"line":204,"column":17}},"68":{"start":{"line":214,"column":2},"end":{"line":222,"column":3}},"69":{"start":{"line":215,"column":4},"end":{"line":221,"column":6}},"70":{"start":{"line":223,"column":2},"end":{"line":223,"column":14}},"71":{"start":{"line":227,"column":23},"end":{"line":227,"column":41}},"72":{"start":{"line":228,"column":23},"end":{"line":228,"column":50}},"73":{"start":{"line":230,"column":23},"end":{"line":230,"column":25}},"74":{"start":{"line":232,"column":2},"end":{"line":254,"column":3}},"75":{"start":{"line":234,"column":4},"end":{"line":253,"column":7}},"76":{"start":{"line":235,"column":24},"end":{"line":235,"column":57}},"77":{"start":{"line":236,"column":44},"end":{"line":236,"column":51}},"78":{"start":{"line":237,"column":6},"end":{"line":252,"column":7}},"79":{"start":{"line":238,"column":8},"end":{"line":240,"column":9}},"80":{"start":{"line":239,"column":10},"end":{"line":239,"column":17}},"81":{"start":{"line":241,"column":26},"end":{"line":247,"column":9}},"82":{"start":{"line":248,"column":8},"end":{"line":251,"column":9}},"83":{"start":{"line":249,"column":10},"end":{"line":249,"column":73}},"84":{"start":{"line":250,"column":10},"end":{"line":250,"column":41}},"85":{"start":{"line":256,"column":2},"end":{"line":256,"column":57}},"86":{"start":{"line":260,"column":20},"end":{"line":260,"column":33}},"87":{"start":{"line":262,"column":2},"end":{"line":264,"column":3}},"88":{"start":{"line":263,"column":4},"end":{"line":263,"column":28}},"89":{"start":{"line":265,"column":23},"end":{"line":265,"column":30}},"90":{"start":{"line":266,"column":22},"end":{"line":268,"column":3}},"91":{"start":{"line":270,"column":25},"end":{"line":270,"column":70}},"92":{"start":{"line":271,"column":2},"end":{"line":274,"column":3}},"93":{"start":{"line":272,"column":4},"end":{"line":272,"column":77}},"94":{"start":{"line":273,"column":4},"end":{"line":273,"column":48}},"95":{"start":{"line":276,"column":2},"end":{"line":312,"column":3}},"96":{"start":{"line":280,"column":25},"end":{"line":280,"column":49}},"97":{"start":{"line":282,"column":4},"end":{"line":301,"column":5}},"98":{"start":{"line":284,"column":6},"end":{"line":284,"column":33}},"99":{"start":{"line":285,"column":6},"end":{"line":285,"column":33}},"100":{"start":{"line":287,"column":20},"end":{"line":287,"column":22}},"101":{"start":{"line":288,"column":6},"end":{"line":288,"column":38}},"102":{"start":{"line":290,"column":6},"end":{"line":290,"column":61}},"103":{"start":{"line":291,"column":6},"end":{"line":300,"column":8}},"104":{"start":{"line":302,"column":4},"end":{"line":311,"column":15}},"105":{"start":{"line":313,"column":2},"end":{"line":313,"column":52}},"106":{"start":{"line":314,"column":16},"end":{"line":314,"column":18}},"107":{"start":{"line":317,"column":2},"end":{"line":317,"column":58}},"108":{"start":{"line":318,"column":2},"end":{"line":318,"column":34}},"109":{"start":{"line":320,"column":2},"end":{"line":320,"column":57}},"110":{"start":{"line":321,"column":2},"end":{"line":323,"column":3}},"111":{"start":{"line":322,"column":4},"end":{"line":322,"column":35}},"112":{"start":{"line":324,"column":2},"end":{"line":329,"column":4}},"113":{"start":{"line":338,"column":25},"end":{"line":338,"column":27}},"114":{"start":{"line":339,"column":18},"end":{"line":339,"column":62}},"115":{"start":{"line":340,"column":2},"end":{"line":351,"column":3}},"116":{"start":{"line":341,"column":4},"end":{"line":350,"column":15}},"117":{"start":{"line":352,"column":2},"end":{"line":352,"column":54}},"118":{"start":{"line":353,"column":2},"end":{"line":353,"column":41}},"119":{"start":{"line":354,"column":2},"end":{"line":362,"column":4}},"120":{"start":{"line":366,"column":19},"end":{"line":366,"column":21}},"121":{"start":{"line":368,"column":35},"end":{"line":368,"column":40}},"122":{"start":{"line":369,"column":22},"end":{"line":369,"column":48}},"123":{"start":{"line":372,"column":2},"end":{"line":372,"column":63}},"124":{"start":{"line":374,"column":2},"end":{"line":381,"column":3}},"125":{"start":{"line":375,"column":26},"end":{"line":375,"column":73}},"126":{"start":{"line":376,"column":4},"end":{"line":380,"column":5}},"127":{"start":{"line":377,"column":6},"end":{"line":377,"column":67}},"128":{"start":{"line":379,"column":6},"end":{"line":379,"column":85}},"129":{"start":{"line":383,"column":17},"end":{"line":383,"column":39}},"130":{"start":{"line":384,"column":2},"end":{"line":449,"column":3}},"131":{"start":{"line":386,"column":6},"end":{"line":391,"column":8}},"132":{"start":{"line":392,"column":6},"end":{"line":392,"column":30}},"133":{"start":{"line":393,"column":6},"end":{"line":393,"column":12}},"134":{"start":{"line":395,"column":6},"end":{"line":396,"column":73}},"135":{"start":{"line":397,"column":6},"end":{"line":402,"column":8}},"136":{"start":{"line":403,"column":6},"end":{"line":403,"column":30}},"137":{"start":{"line":404,"column":6},"end":{"line":404,"column":12}},"138":{"start":{"line":406,"column":6},"end":{"line":407,"column":75}},"139":{"start":{"line":408,"column":6},"end":{"line":413,"column":8}},"140":{"start":{"line":414,"column":6},"end":{"line":414,"column":30}},"141":{"start":{"line":415,"column":6},"end":{"line":415,"column":12}},"142":{"start":{"line":417,"column":6},"end":{"line":417,"column":41}},"143":{"start":{"line":418,"column":6},"end":{"line":421,"column":7}},"144":{"start":{"line":419,"column":8},"end":{"line":419,"column":57}},"145":{"start":{"line":420,"column":8},"end":{"line":420,"column":32}},"146":{"start":{"line":423,"column":6},"end":{"line":427,"column":8}},"147":{"start":{"line":429,"column":6},"end":{"line":431,"column":7}},"148":{"start":{"line":430,"column":8},"end":{"line":430,"column":32}},"149":{"start":{"line":432,"column":6},"end":{"line":432,"column":12}},"150":{"start":{"line":434,"column":6},"end":{"line":434,"column":52}},"151":{"start":{"line":435,"column":6},"end":{"line":435,"column":30}},"152":{"start":{"line":436,"column":6},"end":{"line":436,"column":12}},"153":{"start":{"line":438,"column":6},"end":{"line":448,"column":17}},"154":{"start":{"line":451,"column":2},"end":{"line":451,"column":18}},"155":{"start":{"line":469,"column":19},"end":{"line":469,"column":46}},"156":{"start":{"line":470,"column":2},"end":{"line":470,"column":41}},"157":{"start":{"line":471,"column":2},"end":{"line":471,"column":35}},"158":{"start":{"line":472,"column":2},"end":{"line":472,"column":37}},"159":{"start":{"line":473,"column":2},"end":{"line":473,"column":18}},"160":{"start":{"line":477,"column":19},"end":{"line":477,"column":21}},"161":{"start":{"line":483,"column":24},"end":{"line":483,"column":26}},"162":{"start":{"line":484,"column":20},"end":{"line":484,"column":22}},"163":{"start":{"line":485,"column":23},"end":{"line":485,"column":25}},"164":{"start":{"line":486,"column":27},"end":{"line":486,"column":29}},"165":{"start":{"line":487,"column":30},"end":{"line":487,"column":32}},"166":{"start":{"line":488,"column":19},"end":{"line":488,"column":21}},"167":{"start":{"line":489,"column":14},"end":{"line":489,"column":15}},"168":{"start":{"line":491,"column":2},"end":{"line":612,"column":3}},"169":{"start":{"line":493,"column":15},"end":{"line":493,"column":32}},"170":{"start":{"line":494,"column":47},"end":{"line":494,"column":49}},"171":{"start":{"line":497,"column":4},"end":{"line":497,"column":41}},"172":{"start":{"line":500,"column":4},"end":{"line":500,"column":40}},"173":{"start":{"line":501,"column":4},"end":{"line":501,"column":73}},"174":{"start":{"line":503,"column":4},"end":{"line":503,"column":15}},"175":{"start":{"line":507,"column":4},"end":{"line":611,"column":5}},"176":{"start":{"line":509,"column":6},"end":{"line":511,"column":7}},"177":{"start":{"line":510,"column":8},"end":{"line":510,"column":33}},"178":{"start":{"line":514,"column":48},"end":{"line":514,"column":56}},"179":{"start":{"line":517,"column":23},"end":{"line":521,"column":7}},"180":{"start":{"line":523,"column":6},"end":{"line":557,"column":7}},"181":{"start":{"line":524,"column":8},"end":{"line":556,"column":9}},"182":{"start":{"line":529,"column":32},"end":{"line":529,"column":54}},"183":{"start":{"line":530,"column":10},"end":{"line":530,"column":50}},"184":{"start":{"line":531,"column":10},"end":{"line":531,"column":49}},"185":{"start":{"line":532,"column":35},"end":{"line":534,"column":11}},"186":{"start":{"line":535,"column":10},"end":{"line":537,"column":11}},"187":{"start":{"line":536,"column":12},"end":{"line":536,"column":58}},"188":{"start":{"line":538,"column":10},"end":{"line":540,"column":11}},"189":{"start":{"line":539,"column":12},"end":{"line":539,"column":50}},"190":{"start":{"line":541,"column":10},"end":{"line":543,"column":11}},"191":{"start":{"line":542,"column":12},"end":{"line":542,"column":56}},"192":{"start":{"line":544,"column":10},"end":{"line":544,"column":53}},"193":{"start":{"line":546,"column":10},"end":{"line":546,"column":49}},"194":{"start":{"line":547,"column":10},"end":{"line":549,"column":12}},"195":{"start":{"line":552,"column":10},"end":{"line":552,"column":31}},"196":{"start":{"line":553,"column":10},"end":{"line":553,"column":27}},"197":{"start":{"line":554,"column":10},"end":{"line":554,"column":30}},"198":{"start":{"line":555,"column":10},"end":{"line":555,"column":34}},"199":{"start":{"line":560,"column":6},"end":{"line":562,"column":7}},"200":{"start":{"line":561,"column":8},"end":{"line":561,"column":44}},"201":{"start":{"line":564,"column":6},"end":{"line":566,"column":7}},"202":{"start":{"line":565,"column":8},"end":{"line":565,"column":36}},"203":{"start":{"line":568,"column":6},"end":{"line":570,"column":7}},"204":{"start":{"line":569,"column":8},"end":{"line":569,"column":42}},"205":{"start":{"line":573,"column":6},"end":{"line":573,"column":40}},"206":{"start":{"line":576,"column":6},"end":{"line":578,"column":7}},"207":{"start":{"line":577,"column":8},"end":{"line":577,"column":36}},"208":{"start":{"line":579,"column":29},"end":{"line":579,"column":65}},"209":{"start":{"line":581,"column":8},"end":{"line":581,"column":72}},"210":{"start":{"line":583,"column":6},"end":{"line":602,"column":7}},"211":{"start":{"line":585,"column":30},"end":{"line":585,"column":52}},"212":{"start":{"line":586,"column":8},"end":{"line":586,"column":48}},"213":{"start":{"line":587,"column":8},"end":{"line":587,"column":50}},"214":{"start":{"line":588,"column":33},"end":{"line":590,"column":9}},"215":{"start":{"line":591,"column":8},"end":{"line":593,"column":9}},"216":{"start":{"line":592,"column":10},"end":{"line":592,"column":65}},"217":{"start":{"line":594,"column":8},"end":{"line":594,"column":51}},"218":{"start":{"line":595,"column":8},"end":{"line":597,"column":10}},"219":{"start":{"line":600,"column":8},"end":{"line":600,"column":24}},"220":{"start":{"line":601,"column":8},"end":{"line":601,"column":35}},"221":{"start":{"line":606,"column":6},"end":{"line":608,"column":7}},"222":{"start":{"line":607,"column":8},"end":{"line":607,"column":43}},"223":{"start":{"line":610,"column":6},"end":{"line":610,"column":43}},"224":{"start":{"line":615,"column":13},"end":{"line":615,"column":34}},"225":{"start":{"line":616,"column":35},"end":{"line":616,"column":37}},"226":{"start":{"line":617,"column":2},"end":{"line":634,"column":3}},"227":{"start":{"line":618,"column":34},"end":{"line":618,"column":56}},"228":{"start":{"line":619,"column":4},"end":{"line":619,"column":52}},"229":{"start":{"line":620,"column":37},"end":{"line":622,"column":5}},"230":{"start":{"line":623,"column":4},"end":{"line":623,"column":62}},"231":{"start":{"line":624,"column":4},"end":{"line":624,"column":63}},"232":{"start":{"line":626,"column":4},"end":{"line":626,"column":54}},"233":{"start":{"line":627,"column":4},"end":{"line":633,"column":6}},"234":{"start":{"line":637,"column":2},"end":{"line":663,"column":3}},"235":{"start":{"line":642,"column":31},"end":{"line":642,"column":53}},"236":{"start":{"line":643,"column":4},"end":{"line":643,"column":49}},"237":{"start":{"line":644,"column":4},"end":{"line":644,"column":48}},"238":{"start":{"line":645,"column":34},"end":{"line":647,"column":5}},"239":{"start":{"line":648,"column":4},"end":{"line":650,"column":5}},"240":{"start":{"line":649,"column":6},"end":{"line":649,"column":57}},"241":{"start":{"line":651,"column":4},"end":{"line":653,"column":5}},"242":{"start":{"line":652,"column":6},"end":{"line":652,"column":49}},"243":{"start":{"line":654,"column":4},"end":{"line":656,"column":5}},"244":{"start":{"line":655,"column":6},"end":{"line":655,"column":55}},"245":{"start":{"line":657,"column":4},"end":{"line":657,"column":57}},"246":{"start":{"line":659,"column":4},"end":{"line":659,"column":48}},"247":{"start":{"line":660,"column":4},"end":{"line":662,"column":6}},"248":{"start":{"line":665,"column":2},"end":{"line":665,"column":18}},"249":{"start":{"line":668,"column":26},"end":{"line":707,"column":1}},"250":{"start":{"line":669,"column":2},"end":{"line":672,"column":3}},"251":{"start":{"line":670,"column":23},"end":{"line":670,"column":75}},"252":{"start":{"line":671,"column":4},"end":{"line":671,"column":24}},"253":{"start":{"line":674,"column":19},"end":{"line":705,"column":3}},"254":{"start":{"line":676,"column":6},"end":{"line":703,"column":7}},"255":{"start":{"line":677,"column":8},"end":{"line":684,"column":9}},"256":{"start":{"line":679,"column":10},"end":{"line":683,"column":12}},"257":{"start":{"line":686,"column":8},"end":{"line":690,"column":10}},"258":{"start":{"line":692,"column":23},"end":{"line":696,"column":9}},"259":{"start":{"line":697,"column":8},"end":{"line":702,"column":10}},"260":{"start":{"line":706,"column":2},"end":{"line":706,"column":18}},"261":{"start":{"line":709,"column":0},"end":{"line":709,"column":55}}},"fnMap":{"0":{"name":"formatGender","decl":{"start":{"line":31,"column":9},"end":{"line":31,"column":21}},"loc":{"start":{"line":31,"column":30},"end":{"line":48,"column":1}},"line":31},"1":{"name":"buildResponse","decl":{"start":{"line":50,"column":9},"end":{"line":50,"column":22}},"loc":{"start":{"line":50,"column":67},"end":{"line":64,"column":1}},"line":50},"2":{"name":"setAliasObjectWithAnonId","decl":{"start":{"line":66,"column":9},"end":{"line":66,"column":33}},"loc":{"start":{"line":66,"column":52},"end":{"line":74,"column":1}},"line":66},"3":{"name":"setExternalId","decl":{"start":{"line":76,"column":9},"end":{"line":76,"column":22}},"loc":{"start":{"line":76,"column":41},"end":{"line":83,"column":1}},"line":76},"4":{"name":"setExternalIdOrAliasObject","decl":{"start":{"line":85,"column":9},"end":{"line":85,"column":35}},"loc":{"start":{"line":85,"column":54},"end":{"line":93,"column":1}},"line":85},"5":{"name":"getIdentifyPayload","decl":{"start":{"line":95,"column":9},"end":{"line":95,"column":27}},"loc":{"start":{"line":95,"column":37},"end":{"line":100,"column":1}},"line":95},"6":{"name":"getUserAttributesObject","decl":{"start":{"line":103,"column":9},"end":{"line":103,"column":32}},"loc":{"start":{"line":103,"column":55},"end":{"line":152,"column":1}},"line":103},"7":{"name":"(anonymous_7)","decl":{"start":{"line":115,"column":35},"end":{"line":115,"column":36}},"loc":{"start":{"line":115,"column":46},"end":{"line":124,"column":3}},"line":115},"8":{"name":"(anonymous_8)","decl":{"start":{"line":140,"column":32},"end":{"line":140,"column":33}},"loc":{"start":{"line":140,"column":44},"end":{"line":148,"column":5}},"line":140},"9":{"name":"processIdentify","decl":{"start":{"line":154,"column":9},"end":{"line":154,"column":24}},"loc":{"start":{"line":154,"column":47},"end":{"line":167,"column":1}},"line":154},"10":{"name":"processTrackWithUserAttributes","decl":{"start":{"line":169,"column":9},"end":{"line":169,"column":39}},"loc":{"start":{"line":169,"column":75},"end":{"line":181,"column":1}},"line":169},"11":{"name":"handleReservedProperties","decl":{"start":{"line":183,"column":9},"end":{"line":183,"column":33}},"loc":{"start":{"line":183,"column":41},"end":{"line":199,"column":1}},"line":183},"12":{"name":"(anonymous_12)","decl":{"start":{"line":195,"column":19},"end":{"line":195,"column":20}},"loc":{"start":{"line":195,"column":30},"end":{"line":197,"column":3}},"line":195},"13":{"name":"addMandatoryEventProperties","decl":{"start":{"line":201,"column":9},"end":{"line":201,"column":36}},"loc":{"start":{"line":201,"column":55},"end":{"line":205,"column":1}},"line":201},"14":{"name":"addMandatoryPurchaseProperties","decl":{"start":{"line":207,"column":9},"end":{"line":207,"column":39}},"loc":{"start":{"line":213,"column":2},"end":{"line":224,"column":1}},"line":213},"15":{"name":"getPurchaseObjs","decl":{"start":{"line":226,"column":9},"end":{"line":226,"column":24}},"loc":{"start":{"line":226,"column":34},"end":{"line":257,"column":1}},"line":226},"16":{"name":"(anonymous_16)","decl":{"start":{"line":234,"column":21},"end":{"line":234,"column":22}},"loc":{"start":{"line":234,"column":32},"end":{"line":253,"column":5}},"line":234},"17":{"name":"processTrackEvent","decl":{"start":{"line":259,"column":9},"end":{"line":259,"column":26}},"loc":{"start":{"line":259,"column":75},"end":{"line":330,"column":1}},"line":259},"18":{"name":"processGroup","decl":{"start":{"line":337,"column":9},"end":{"line":337,"column":21}},"loc":{"start":{"line":337,"column":44},"end":{"line":363,"column":1}},"line":337},"19":{"name":"process","decl":{"start":{"line":365,"column":9},"end":{"line":365,"column":16}},"loc":{"start":{"line":365,"column":24},"end":{"line":452,"column":1}},"line":365},"20":{"name":"formatBatchResponse","decl":{"start":{"line":468,"column":9},"end":{"line":468,"column":28}},"loc":{"start":{"line":468,"column":70},"end":{"line":474,"column":1}},"line":468},"21":{"name":"batch","decl":{"start":{"line":476,"column":9},"end":{"line":476,"column":14}},"loc":{"start":{"line":476,"column":27},"end":{"line":666,"column":1}},"line":476},"22":{"name":"(anonymous_22)","decl":{"start":{"line":668,"column":26},"end":{"line":668,"column":27}},"loc":{"start":{"line":668,"column":42},"end":{"line":707,"column":1}},"line":668},"23":{"name":"(anonymous_23)","decl":{"start":{"line":675,"column":15},"end":{"line":675,"column":16}},"loc":{"start":{"line":675,"column":30},"end":{"line":704,"column":5}},"line":675}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":2},"end":{"line":35,"column":3}},"type":"if","locations":[{"start":{"line":33,"column":2},"end":{"line":35,"column":3}},{"start":{"line":33,"column":2},"end":{"line":35,"column":3}}],"line":33},"1":{"loc":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},{"start":{"line":38,"column":2},"end":{"line":40,"column":3}}],"line":38},"2":{"loc":{"start":{"line":43,"column":2},"end":{"line":45,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":45,"column":3}},{"start":{"line":43,"column":2},"end":{"line":45,"column":3}}],"line":43},"3":{"loc":{"start":{"line":53,"column":20},"end":{"line":53,"column":57}},"type":"binary-expr","locations":[{"start":{"line":53,"column":20},"end":{"line":53,"column":34}},{"start":{"line":53,"column":38},"end":{"line":53,"column":57}}],"line":53},"4":{"loc":{"start":{"line":62,"column":12},"end":{"line":62,"column":49}},"type":"binary-expr","locations":[{"start":{"line":62,"column":12},"end":{"line":62,"column":26}},{"start":{"line":62,"column":30},"end":{"line":62,"column":49}}],"line":62},"5":{"loc":{"start":{"line":67,"column":2},"end":{"line":72,"column":3}},"type":"if","locations":[{"start":{"line":67,"column":2},"end":{"line":72,"column":3}},{"start":{"line":67,"column":2},"end":{"line":72,"column":3}}],"line":67},"6":{"loc":{"start":{"line":78,"column":4},"end":{"line":78,"column":74}},"type":"binary-expr","locations":[{"start":{"line":78,"column":4},"end":{"line":78,"column":56}},{"start":{"line":78,"column":60},"end":{"line":78,"column":74}}],"line":78},"7":{"loc":{"start":{"line":79,"column":2},"end":{"line":81,"column":3}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":81,"column":3}},{"start":{"line":79,"column":2},"end":{"line":81,"column":3}}],"line":79},"8":{"loc":{"start":{"line":87,"column":2},"end":{"line":89,"column":3}},"type":"if","locations":[{"start":{"line":87,"column":2},"end":{"line":89,"column":3}},{"start":{"line":87,"column":2},"end":{"line":89,"column":3}}],"line":87},"9":{"loc":{"start":{"line":87,"column":6},"end":{"line":87,"column":68}},"type":"binary-expr","locations":[{"start":{"line":87,"column":6},"end":{"line":87,"column":12}},{"start":{"line":87,"column":16},"end":{"line":87,"column":68}}],"line":87},"10":{"loc":{"start":{"line":110,"column":2},"end":{"line":112,"column":3}},"type":"if","locations":[{"start":{"line":110,"column":2},"end":{"line":112,"column":3}},{"start":{"line":110,"column":2},"end":{"line":112,"column":3}}],"line":110},"11":{"loc":{"start":{"line":117,"column":4},"end":{"line":123,"column":5}},"type":"if","locations":[{"start":{"line":117,"column":4},"end":{"line":123,"column":5}},{"start":{"line":117,"column":4},"end":{"line":123,"column":5}}],"line":117},"12":{"loc":{"start":{"line":119,"column":6},"end":{"line":121,"column":7}},"type":"if","locations":[{"start":{"line":119,"column":6},"end":{"line":121,"column":7}},{"start":{"line":119,"column":6},"end":{"line":121,"column":7}}],"line":119},"13":{"loc":{"start":{"line":138,"column":2},"end":{"line":149,"column":3}},"type":"if","locations":[{"start":{"line":138,"column":2},"end":{"line":149,"column":3}},{"start":{"line":138,"column":2},"end":{"line":149,"column":3}}],"line":138},"14":{"loc":{"start":{"line":142,"column":6},"end":{"line":147,"column":7}},"type":"if","locations":[{"start":{"line":142,"column":6},"end":{"line":147,"column":7}},{"start":{"line":142,"column":6},"end":{"line":147,"column":7}}],"line":142},"15":{"loc":{"start":{"line":144,"column":8},"end":{"line":146,"column":9}},"type":"if","locations":[{"start":{"line":144,"column":8},"end":{"line":146,"column":9}},{"start":{"line":144,"column":8},"end":{"line":146,"column":9}}],"line":144},"16":{"loc":{"start":{"line":157,"column":2},"end":{"line":159,"column":3}},"type":"if","locations":[{"start":{"line":157,"column":2},"end":{"line":159,"column":3}},{"start":{"line":157,"column":2},"end":{"line":159,"column":3}}],"line":157},"17":{"loc":{"start":{"line":171,"column":2},"end":{"line":179,"column":3}},"type":"if","locations":[{"start":{"line":171,"column":2},"end":{"line":179,"column":3}},{"start":{"line":171,"column":2},"end":{"line":179,"column":3}}],"line":171},"18":{"loc":{"start":{"line":171,"column":6},"end":{"line":171,"column":48}},"type":"binary-expr","locations":[{"start":{"line":171,"column":6},"end":{"line":171,"column":13}},{"start":{"line":171,"column":17},"end":{"line":171,"column":48}}],"line":171},"19":{"loc":{"start":{"line":214,"column":2},"end":{"line":222,"column":3}},"type":"if","locations":[{"start":{"line":214,"column":2},"end":{"line":222,"column":3}},{"start":{"line":214,"column":2},"end":{"line":222,"column":3}}],"line":214},"20":{"loc":{"start":{"line":232,"column":2},"end":{"line":254,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":254,"column":3}},{"start":{"line":232,"column":2},"end":{"line":254,"column":3}}],"line":232},"21":{"loc":{"start":{"line":235,"column":24},"end":{"line":235,"column":57}},"type":"binary-expr","locations":[{"start":{"line":235,"column":24},"end":{"line":235,"column":42}},{"start":{"line":235,"column":46},"end":{"line":235,"column":57}}],"line":235},"22":{"loc":{"start":{"line":237,"column":6},"end":{"line":252,"column":7}},"type":"if","locations":[{"start":{"line":237,"column":6},"end":{"line":252,"column":7}},{"start":{"line":237,"column":6},"end":{"line":252,"column":7}}],"line":237},"23":{"loc":{"start":{"line":237,"column":10},"end":{"line":237,"column":61}},"type":"binary-expr","locations":[{"start":{"line":237,"column":10},"end":{"line":237,"column":19}},{"start":{"line":237,"column":23},"end":{"line":237,"column":49}},{"start":{"line":237,"column":53},"end":{"line":237,"column":61}}],"line":237},"24":{"loc":{"start":{"line":238,"column":8},"end":{"line":240,"column":9}},"type":"if","locations":[{"start":{"line":238,"column":8},"end":{"line":240,"column":9}},{"start":{"line":238,"column":8},"end":{"line":240,"column":9}}],"line":238},"25":{"loc":{"start":{"line":238,"column":12},"end":{"line":238,"column":57}},"type":"binary-expr","locations":[{"start":{"line":238,"column":12},"end":{"line":238,"column":31}},{"start":{"line":238,"column":35},"end":{"line":238,"column":57}}],"line":238},"26":{"loc":{"start":{"line":244,"column":10},"end":{"line":244,"column":34}},"type":"binary-expr","locations":[{"start":{"line":244,"column":10},"end":{"line":244,"column":22}},{"start":{"line":244,"column":26},"end":{"line":244,"column":34}}],"line":244},"27":{"loc":{"start":{"line":248,"column":8},"end":{"line":251,"column":9}},"type":"if","locations":[{"start":{"line":248,"column":8},"end":{"line":251,"column":9}},{"start":{"line":248,"column":8},"end":{"line":251,"column":9}}],"line":248},"28":{"loc":{"start":{"line":256,"column":9},"end":{"line":256,"column":56}},"type":"cond-expr","locations":[{"start":{"line":256,"column":37},"end":{"line":256,"column":41}},{"start":{"line":256,"column":44},"end":{"line":256,"column":56}}],"line":256},"29":{"loc":{"start":{"line":262,"column":2},"end":{"line":264,"column":3}},"type":"if","locations":[{"start":{"line":262,"column":2},"end":{"line":264,"column":3}},{"start":{"line":262,"column":2},"end":{"line":264,"column":3}}],"line":262},"30":{"loc":{"start":{"line":271,"column":2},"end":{"line":274,"column":3}},"type":"if","locations":[{"start":{"line":271,"column":2},"end":{"line":274,"column":3}},{"start":{"line":271,"column":2},"end":{"line":274,"column":3}}],"line":271},"31":{"loc":{"start":{"line":271,"column":6},"end":{"line":271,"column":66}},"type":"binary-expr","locations":[{"start":{"line":271,"column":6},"end":{"line":271,"column":22}},{"start":{"line":271,"column":26},"end":{"line":271,"column":66}}],"line":271},"32":{"loc":{"start":{"line":276,"column":2},"end":{"line":312,"column":3}},"type":"if","locations":[{"start":{"line":276,"column":2},"end":{"line":312,"column":3}},{"start":{"line":276,"column":2},"end":{"line":312,"column":3}}],"line":276},"33":{"loc":{"start":{"line":277,"column":4},"end":{"line":278,"column":49}},"type":"binary-expr","locations":[{"start":{"line":277,"column":4},"end":{"line":277,"column":35}},{"start":{"line":278,"column":4},"end":{"line":278,"column":49}}],"line":277},"34":{"loc":{"start":{"line":282,"column":4},"end":{"line":301,"column":5}},"type":"if","locations":[{"start":{"line":282,"column":4},"end":{"line":301,"column":5}},{"start":{"line":282,"column":4},"end":{"line":301,"column":5}}],"line":282},"35":{"loc":{"start":{"line":321,"column":2},"end":{"line":323,"column":3}},"type":"if","locations":[{"start":{"line":321,"column":2},"end":{"line":323,"column":3}},{"start":{"line":321,"column":2},"end":{"line":323,"column":3}}],"line":321},"36":{"loc":{"start":{"line":340,"column":2},"end":{"line":351,"column":3}},"type":"if","locations":[{"start":{"line":340,"column":2},"end":{"line":351,"column":3}},{"start":{"line":340,"column":2},"end":{"line":351,"column":3}}],"line":340},"37":{"loc":{"start":{"line":374,"column":2},"end":{"line":381,"column":3}},"type":"if","locations":[{"start":{"line":374,"column":2},"end":{"line":381,"column":3}},{"start":{"line":374,"column":2},"end":{"line":381,"column":3}}],"line":374},"38":{"loc":{"start":{"line":376,"column":4},"end":{"line":380,"column":5}},"type":"if","locations":[{"start":{"line":376,"column":4},"end":{"line":380,"column":5}},{"start":{"line":376,"column":4},"end":{"line":380,"column":5}}],"line":376},"39":{"loc":{"start":{"line":384,"column":2},"end":{"line":449,"column":3}},"type":"switch","locations":[{"start":{"line":385,"column":4},"end":{"line":393,"column":12}},{"start":{"line":394,"column":4},"end":{"line":404,"column":12}},{"start":{"line":405,"column":4},"end":{"line":415,"column":12}},{"start":{"line":416,"column":4},"end":{"line":432,"column":12}},{"start":{"line":433,"column":4},"end":{"line":436,"column":12}},{"start":{"line":437,"column":4},"end":{"line":448,"column":17}}],"line":384},"40":{"loc":{"start":{"line":396,"column":8},"end":{"line":396,"column":72}},"type":"binary-expr","locations":[{"start":{"line":396,"column":8},"end":{"line":396,"column":20}},{"start":{"line":396,"column":24},"end":{"line":396,"column":55}},{"start":{"line":396,"column":59},"end":{"line":396,"column":72}}],"line":396},"41":{"loc":{"start":{"line":407,"column":8},"end":{"line":407,"column":74}},"type":"binary-expr","locations":[{"start":{"line":407,"column":8},"end":{"line":407,"column":20}},{"start":{"line":407,"column":24},"end":{"line":407,"column":55}},{"start":{"line":407,"column":59},"end":{"line":407,"column":74}}],"line":407},"42":{"loc":{"start":{"line":418,"column":6},"end":{"line":421,"column":7}},"type":"if","locations":[{"start":{"line":418,"column":6},"end":{"line":421,"column":7}},{"start":{"line":418,"column":6},"end":{"line":421,"column":7}}],"line":418},"43":{"loc":{"start":{"line":429,"column":6},"end":{"line":431,"column":7}},"type":"if","locations":[{"start":{"line":429,"column":6},"end":{"line":431,"column":7}},{"start":{"line":429,"column":6},"end":{"line":431,"column":7}}],"line":429},"44":{"loc":{"start":{"line":501,"column":11},"end":{"line":501,"column":72}},"type":"cond-expr","locations":[{"start":{"line":501,"column":52},"end":{"line":501,"column":59}},{"start":{"line":501,"column":62},"end":{"line":501,"column":72}}],"line":501},"45":{"loc":{"start":{"line":501,"column":11},"end":{"line":501,"column":49}},"type":"binary-expr","locations":[{"start":{"line":501,"column":11},"end":{"line":501,"column":19}},{"start":{"line":501,"column":23},"end":{"line":501,"column":49}}],"line":501},"46":{"loc":{"start":{"line":507,"column":4},"end":{"line":611,"column":5}},"type":"if","locations":[{"start":{"line":507,"column":4},"end":{"line":611,"column":5}},{"start":{"line":507,"column":4},"end":{"line":611,"column":5}}],"line":507},"47":{"loc":{"start":{"line":509,"column":6},"end":{"line":511,"column":7}},"type":"if","locations":[{"start":{"line":509,"column":6},"end":{"line":511,"column":7}},{"start":{"line":509,"column":6},"end":{"line":511,"column":7}}],"line":509},"48":{"loc":{"start":{"line":518,"column":34},"end":{"line":518,"column":68}},"type":"cond-expr","locations":[{"start":{"line":518,"column":47},"end":{"line":518,"column":64}},{"start":{"line":518,"column":67},"end":{"line":518,"column":68}}],"line":518},"49":{"loc":{"start":{"line":519,"column":30},"end":{"line":519,"column":56}},"type":"cond-expr","locations":[{"start":{"line":519,"column":39},"end":{"line":519,"column":52}},{"start":{"line":519,"column":55},"end":{"line":519,"column":56}}],"line":519},"50":{"loc":{"start":{"line":520,"column":33},"end":{"line":520,"column":65}},"type":"cond-expr","locations":[{"start":{"line":520,"column":45},"end":{"line":520,"column":61}},{"start":{"line":520,"column":64},"end":{"line":520,"column":65}}],"line":520},"51":{"loc":{"start":{"line":523,"column":6},"end":{"line":557,"column":7}},"type":"if","locations":[{"start":{"line":523,"column":6},"end":{"line":557,"column":7}},{"start":{"line":523,"column":6},"end":{"line":557,"column":7}}],"line":523},"52":{"loc":{"start":{"line":524,"column":8},"end":{"line":556,"column":9}},"type":"if","locations":[{"start":{"line":524,"column":8},"end":{"line":556,"column":9}},{"start":{"line":524,"column":8},"end":{"line":556,"column":9}}],"line":524},"53":{"loc":{"start":{"line":525,"column":10},"end":{"line":527,"column":35}},"type":"binary-expr","locations":[{"start":{"line":525,"column":10},"end":{"line":525,"column":36}},{"start":{"line":526,"column":10},"end":{"line":526,"column":32}},{"start":{"line":527,"column":10},"end":{"line":527,"column":35}}],"line":525},"54":{"loc":{"start":{"line":535,"column":10},"end":{"line":537,"column":11}},"type":"if","locations":[{"start":{"line":535,"column":10},"end":{"line":537,"column":11}},{"start":{"line":535,"column":10},"end":{"line":537,"column":11}}],"line":535},"55":{"loc":{"start":{"line":538,"column":10},"end":{"line":540,"column":11}},"type":"if","locations":[{"start":{"line":538,"column":10},"end":{"line":540,"column":11}},{"start":{"line":538,"column":10},"end":{"line":540,"column":11}}],"line":538},"56":{"loc":{"start":{"line":541,"column":10},"end":{"line":543,"column":11}},"type":"if","locations":[{"start":{"line":541,"column":10},"end":{"line":543,"column":11}},{"start":{"line":541,"column":10},"end":{"line":543,"column":11}}],"line":541},"57":{"loc":{"start":{"line":560,"column":6},"end":{"line":562,"column":7}},"type":"if","locations":[{"start":{"line":560,"column":6},"end":{"line":562,"column":7}},{"start":{"line":560,"column":6},"end":{"line":562,"column":7}}],"line":560},"58":{"loc":{"start":{"line":564,"column":6},"end":{"line":566,"column":7}},"type":"if","locations":[{"start":{"line":564,"column":6},"end":{"line":566,"column":7}},{"start":{"line":564,"column":6},"end":{"line":566,"column":7}}],"line":564},"59":{"loc":{"start":{"line":568,"column":6},"end":{"line":570,"column":7}},"type":"if","locations":[{"start":{"line":568,"column":6},"end":{"line":570,"column":7}},{"start":{"line":568,"column":6},"end":{"line":570,"column":7}}],"line":568},"60":{"loc":{"start":{"line":576,"column":6},"end":{"line":578,"column":7}},"type":"if","locations":[{"start":{"line":576,"column":6},"end":{"line":578,"column":7}},{"start":{"line":576,"column":6},"end":{"line":578,"column":7}}],"line":576},"61":{"loc":{"start":{"line":581,"column":29},"end":{"line":581,"column":71}},"type":"cond-expr","locations":[{"start":{"line":581,"column":46},"end":{"line":581,"column":67}},{"start":{"line":581,"column":70},"end":{"line":581,"column":71}}],"line":581},"62":{"loc":{"start":{"line":583,"column":6},"end":{"line":602,"column":7}},"type":"if","locations":[{"start":{"line":583,"column":6},"end":{"line":602,"column":7}},{"start":{"line":583,"column":6},"end":{"line":602,"column":7}}],"line":583},"63":{"loc":{"start":{"line":591,"column":8},"end":{"line":593,"column":9}},"type":"if","locations":[{"start":{"line":591,"column":8},"end":{"line":593,"column":9}},{"start":{"line":591,"column":8},"end":{"line":593,"column":9}}],"line":591},"64":{"loc":{"start":{"line":606,"column":6},"end":{"line":608,"column":7}},"type":"if","locations":[{"start":{"line":606,"column":6},"end":{"line":608,"column":7}},{"start":{"line":606,"column":6},"end":{"line":608,"column":7}}],"line":606},"65":{"loc":{"start":{"line":617,"column":2},"end":{"line":634,"column":3}},"type":"if","locations":[{"start":{"line":617,"column":2},"end":{"line":634,"column":3}},{"start":{"line":617,"column":2},"end":{"line":634,"column":3}}],"line":617},"66":{"loc":{"start":{"line":637,"column":2},"end":{"line":663,"column":3}},"type":"if","locations":[{"start":{"line":637,"column":2},"end":{"line":663,"column":3}},{"start":{"line":637,"column":2},"end":{"line":663,"column":3}}],"line":637},"67":{"loc":{"start":{"line":638,"column":4},"end":{"line":640,"column":29}},"type":"binary-expr","locations":[{"start":{"line":638,"column":4},"end":{"line":638,"column":30}},{"start":{"line":639,"column":4},"end":{"line":639,"column":26}},{"start":{"line":640,"column":4},"end":{"line":640,"column":29}}],"line":638},"68":{"loc":{"start":{"line":648,"column":4},"end":{"line":650,"column":5}},"type":"if","locations":[{"start":{"line":648,"column":4},"end":{"line":650,"column":5}},{"start":{"line":648,"column":4},"end":{"line":650,"column":5}}],"line":648},"69":{"loc":{"start":{"line":651,"column":4},"end":{"line":653,"column":5}},"type":"if","locations":[{"start":{"line":651,"column":4},"end":{"line":653,"column":5}},{"start":{"line":651,"column":4},"end":{"line":653,"column":5}}],"line":651},"70":{"loc":{"start":{"line":654,"column":4},"end":{"line":656,"column":5}},"type":"if","locations":[{"start":{"line":654,"column":4},"end":{"line":656,"column":5}},{"start":{"line":654,"column":4},"end":{"line":656,"column":5}}],"line":654},"71":{"loc":{"start":{"line":669,"column":2},"end":{"line":672,"column":3}},"type":"if","locations":[{"start":{"line":669,"column":2},"end":{"line":672,"column":3}},{"start":{"line":669,"column":2},"end":{"line":672,"column":3}}],"line":669},"72":{"loc":{"start":{"line":669,"column":6},"end":{"line":669,"column":50}},"type":"binary-expr","locations":[{"start":{"line":669,"column":6},"end":{"line":669,"column":28}},{"start":{"line":669,"column":32},"end":{"line":669,"column":50}}],"line":669},"73":{"loc":{"start":{"line":677,"column":8},"end":{"line":684,"column":9}},"type":"if","locations":[{"start":{"line":677,"column":8},"end":{"line":684,"column":9}},{"start":{"line":677,"column":8},"end":{"line":684,"column":9}}],"line":677},"74":{"loc":{"start":{"line":699,"column":10},"end":{"line":699,"column":29}},"type":"binary-expr","locations":[{"start":{"line":699,"column":10},"end":{"line":699,"column":22}},{"start":{"line":699,"column":26},"end":{"line":699,"column":29}}],"line":699},"75":{"loc":{"start":{"line":700,"column":10},"end":{"line":700,"column":69}},"type":"binary-expr","locations":[{"start":{"line":700,"column":10},"end":{"line":700,"column":23}},{"start":{"line":700,"column":27},"end":{"line":700,"column":69}}],"line":700}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":1,"7":1,"8":0,"9":0,"10":0,"11":0,"12":0,"13":20,"14":20,"15":20,"16":20,"17":20,"18":23,"19":23,"20":23,"21":13,"22":13,"23":10,"24":13,"25":23,"26":23,"27":6,"28":17,"29":17,"30":6,"31":6,"32":6,"33":6,"34":15,"35":15,"36":15,"37":1,"38":14,"39":126,"40":126,"41":12,"42":1,"43":12,"44":14,"45":14,"46":12,"47":36,"48":24,"49":24,"50":24,"51":14,"52":6,"53":6,"54":1,"55":6,"56":6,"57":6,"58":5,"59":5,"60":1,"61":6,"62":6,"63":36,"64":6,"65":6,"66":6,"67":6,"68":5,"69":4,"70":1,"71":3,"72":3,"73":3,"74":3,"75":3,"76":6,"77":6,"78":6,"79":5,"80":0,"81":5,"82":5,"83":4,"84":4,"85":3,"86":9,"87":9,"88":0,"89":9,"90":9,"91":9,"92":9,"93":6,"94":6,"95":9,"96":3,"97":3,"98":2,"99":2,"100":2,"101":2,"102":2,"103":2,"104":1,"105":6,"106":6,"107":6,"108":6,"109":6,"110":6,"111":6,"112":6,"113":1,"114":1,"115":1,"116":0,"117":1,"118":1,"119":1,"120":16,"121":16,"122":16,"123":16,"124":16,"125":8,"126":8,"127":2,"128":6,"129":16,"130":16,"131":7,"132":6,"133":6,"134":2,"135":2,"136":2,"137":2,"138":0,"139":0,"140":0,"141":0,"142":6,"143":6,"144":6,"145":6,"146":6,"147":6,"148":5,"149":6,"150":1,"151":1,"152":1,"153":0,"154":15,"155":6,"156":6,"157":6,"158":6,"159":6,"160":3,"161":3,"162":3,"163":3,"164":3,"165":3,"166":3,"167":3,"168":3,"169":181,"170":181,"171":181,"172":181,"173":181,"174":181,"175":181,"176":160,"177":3,"178":160,"179":160,"180":160,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"189":1,"190":1,"191":0,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":160,"200":159,"201":160,"202":114,"203":160,"204":1,"205":160,"206":21,"207":2,"208":21,"209":21,"210":21,"211":0,"212":0,"213":0,"214":0,"215":0,"216":0,"217":0,"218":0,"219":0,"220":0,"221":21,"222":21,"223":21,"224":3,"225":3,"226":3,"227":2,"228":2,"229":2,"230":2,"231":2,"232":2,"233":2,"234":3,"235":3,"236":3,"237":3,"238":3,"239":3,"240":3,"241":3,"242":3,"243":3,"244":1,"245":3,"246":3,"247":3,"248":3,"249":2,"250":1,"251":0,"252":0,"253":1,"254":2,"255":2,"256":0,"257":2,"258":0,"259":0,"260":1,"261":2},"f":{"0":1,"1":20,"2":23,"3":13,"4":23,"5":6,"6":15,"7":126,"8":36,"9":6,"10":6,"11":6,"12":36,"13":6,"14":5,"15":3,"16":6,"17":9,"18":1,"19":16,"20":6,"21":3,"22":1,"23":2},"b":{"0":[1,0],"1":[0,0],"2":[0,0],"3":[20,12],"4":[20,12],"5":[23,0],"6":[13,13],"7":[10,3],"8":[6,17],"9":[23,17],"10":[1,14],"11":[12,114],"12":[1,11],"13":[12,2],"14":[24,12],"15":[24,0],"16":[1,5],"17":[5,1],"18":[6,6],"19":[4,1],"20":[3,0],"21":[6,0],"22":[5,1],"23":[6,6,5],"24":[0,5],"25":[5,5],"26":[5,1],"27":[4,1],"28":[1,2],"29":[0,9],"30":[6,3],"31":[9,9],"32":[3,6],"33":[9,7],"34":[2,1],"35":[6,0],"36":[0,1],"37":[8,8],"38":[2,6],"39":[7,2,0,6,1,0],"40":[2,2,2],"41":[0,0,0],"42":[6,0],"43":[5,1],"44":[160,21],"45":[181,181],"46":[160,21],"47":[3,157],"48":[159,1],"49":[114,46],"50":[1,159],"51":[1,159],"52":[1,0],"53":[1,0,0],"54":[1,0],"55":[1,0],"56":[0,1],"57":[159,1],"58":[114,46],"59":[1,159],"60":[2,19],"61":[21,0],"62":[0,21],"63":[0,0],"64":[21,0],"65":[2,1],"66":[3,0],"67":[3,0,0],"68":[3,0],"69":[3,0],"70":[1,2],"71":[0,1],"72":[1,1],"73":[0,2],"74":[0,0],"75":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0deb9705bf7ff414f4ab789c92fcddb2007107ae"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\candu\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\candu\\config.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":56}},"1":{"start":{"line":2,"column":29},"end":{"line":2,"column":50}},"2":{"start":{"line":4,"column":26},"end":{"line":7,"column":1}},"3":{"start":{"line":9,"column":23},"end":{"line":9,"column":69}},"4":{"start":{"line":11,"column":0},"end":{"line":15,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d442b6b46d121a20dd83d97b173cbe5b6cbe710b"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\candu\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\candu\\transform.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":51}},"1":{"start":{"line":9,"column":4},"end":{"line":9,"column":25}},"2":{"start":{"line":10,"column":60},"end":{"line":10,"column":79}},"3":{"start":{"line":12,"column":24},"end":{"line":29,"column":1}},"4":{"start":{"line":13,"column":18},"end":{"line":13,"column":22}},"5":{"start":{"line":14,"column":2},"end":{"line":16,"column":4}},"6":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"7":{"start":{"line":18,"column":4},"end":{"line":18,"column":41}},"8":{"start":{"line":20,"column":19},"end":{"line":20,"column":41}},"9":{"start":{"line":21,"column":2},"end":{"line":21,"column":31}},"10":{"start":{"line":22,"column":2},"end":{"line":22,"column":61}},"11":{"start":{"line":23,"column":20},"end":{"line":23,"column":65}},"12":{"start":{"line":24,"column":2},"end":{"line":27,"column":4}},"13":{"start":{"line":28,"column":2},"end":{"line":28,"column":18}},"14":{"start":{"line":31,"column":21},"end":{"line":58,"column":1}},"15":{"start":{"line":32,"column":2},"end":{"line":33,"column":68}},"16":{"start":{"line":33,"column":4},"end":{"line":33,"column":68}},"17":{"start":{"line":34,"column":2},"end":{"line":39,"column":3}},"18":{"start":{"line":35,"column":4},"end":{"line":38,"column":6}},"19":{"start":{"line":40,"column":22},"end":{"line":40,"column":48}},"20":{"start":{"line":41,"column":16},"end":{"line":41,"column":18}},"21":{"start":{"line":42,"column":2},"end":{"line":56,"column":3}},"22":{"start":{"line":44,"column":6},"end":{"line":44,"column":63}},"23":{"start":{"line":45,"column":6},"end":{"line":45,"column":32}},"24":{"start":{"line":46,"column":6},"end":{"line":46,"column":12}},"25":{"start":{"line":48,"column":6},"end":{"line":48,"column":60}},"26":{"start":{"line":49,"column":6},"end":{"line":49,"column":29}},"27":{"start":{"line":50,"column":6},"end":{"line":50,"column":12}},"28":{"start":{"line":52,"column":6},"end":{"line":55,"column":8}},"29":{"start":{"line":57,"column":2},"end":{"line":57,"column":47}},"30":{"start":{"line":60,"column":16},"end":{"line":62,"column":1}},"31":{"start":{"line":61,"column":2},"end":{"line":61,"column":56}},"32":{"start":{"line":63,"column":26},"end":{"line":100,"column":1}},"33":{"start":{"line":64,"column":2},"end":{"line":67,"column":3}},"34":{"start":{"line":65,"column":23},"end":{"line":65,"column":75}},"35":{"start":{"line":66,"column":4},"end":{"line":66,"column":24}},"36":{"start":{"line":69,"column":19},"end":{"line":98,"column":3}},"37":{"start":{"line":71,"column":6},"end":{"line":96,"column":7}},"38":{"start":{"line":72,"column":8},"end":{"line":79,"column":9}},"39":{"start":{"line":74,"column":10},"end":{"line":78,"column":12}},"40":{"start":{"line":81,"column":8},"end":{"line":85,"column":10}},"41":{"start":{"line":87,"column":8},"end":{"line":95,"column":10}},"42":{"start":{"line":99,"column":2},"end":{"line":99,"column":18}},"43":{"start":{"line":102,"column":0},"end":{"line":102,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":12,"column":24},"end":{"line":12,"column":25}},"loc":{"start":{"line":12,"column":46},"end":{"line":29,"column":1}},"line":12},"1":{"name":"(anonymous_1)","decl":{"start":{"line":31,"column":21},"end":{"line":31,"column":22}},"loc":{"start":{"line":31,"column":47},"end":{"line":58,"column":1}},"line":31},"2":{"name":"(anonymous_2)","decl":{"start":{"line":60,"column":16},"end":{"line":60,"column":17}},"loc":{"start":{"line":60,"column":25},"end":{"line":62,"column":1}},"line":60},"3":{"name":"(anonymous_3)","decl":{"start":{"line":63,"column":26},"end":{"line":63,"column":27}},"loc":{"start":{"line":63,"column":42},"end":{"line":100,"column":1}},"line":63},"4":{"name":"(anonymous_4)","decl":{"start":{"line":70,"column":15},"end":{"line":70,"column":16}},"loc":{"start":{"line":70,"column":30},"end":{"line":97,"column":5}},"line":70}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"1":{"loc":{"start":{"line":32,"column":2},"end":{"line":33,"column":68}},"type":"if","locations":[{"start":{"line":32,"column":2},"end":{"line":33,"column":68}},{"start":{"line":32,"column":2},"end":{"line":33,"column":68}}],"line":32},"2":{"loc":{"start":{"line":34,"column":2},"end":{"line":39,"column":3}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":39,"column":3}},{"start":{"line":34,"column":2},"end":{"line":39,"column":3}}],"line":34},"3":{"loc":{"start":{"line":42,"column":2},"end":{"line":56,"column":3}},"type":"switch","locations":[{"start":{"line":43,"column":4},"end":{"line":46,"column":12}},{"start":{"line":47,"column":4},"end":{"line":50,"column":12}},{"start":{"line":51,"column":4},"end":{"line":55,"column":8}}],"line":42},"4":{"loc":{"start":{"line":64,"column":2},"end":{"line":67,"column":3}},"type":"if","locations":[{"start":{"line":64,"column":2},"end":{"line":67,"column":3}},{"start":{"line":64,"column":2},"end":{"line":67,"column":3}}],"line":64},"5":{"loc":{"start":{"line":64,"column":6},"end":{"line":64,"column":50}},"type":"binary-expr","locations":[{"start":{"line":64,"column":6},"end":{"line":64,"column":28}},{"start":{"line":64,"column":32},"end":{"line":64,"column":50}}],"line":64},"6":{"loc":{"start":{"line":72,"column":8},"end":{"line":79,"column":9}},"type":"if","locations":[{"start":{"line":72,"column":8},"end":{"line":79,"column":9}},{"start":{"line":72,"column":8},"end":{"line":79,"column":9}}],"line":72},"7":{"loc":{"start":{"line":89,"column":10},"end":{"line":93,"column":17}},"type":"cond-expr","locations":[{"start":{"line":90,"column":14},"end":{"line":90,"column":35}},{"start":{"line":91,"column":14},"end":{"line":93,"column":17}}],"line":89},"8":{"loc":{"start":{"line":91,"column":14},"end":{"line":93,"column":17}},"type":"cond-expr","locations":[{"start":{"line":92,"column":14},"end":{"line":92,"column":24}},{"start":{"line":93,"column":14},"end":{"line":93,"column":17}}],"line":91},"9":{"loc":{"start":{"line":94,"column":10},"end":{"line":94,"column":69}},"type":"binary-expr","locations":[{"start":{"line":94,"column":10},"end":{"line":94,"column":23}},{"start":{"line":94,"column":27},"end":{"line":94,"column":69}}],"line":94}},"s":{"0":1,"1":1,"2":1,"3":1,"4":6,"5":6,"6":6,"7":5,"8":6,"9":6,"10":6,"11":6,"12":6,"13":6,"14":1,"15":10,"16":1,"17":9,"18":1,"19":8,"20":8,"21":8,"22":3,"23":3,"24":3,"25":4,"26":3,"27":3,"28":1,"29":6,"30":1,"31":10,"32":1,"33":1,"34":0,"35":0,"36":1,"37":1,"38":1,"39":0,"40":1,"41":0,"42":1,"43":1},"f":{"0":6,"1":10,"2":10,"3":1,"4":1},"b":{"0":[5,1],"1":[1,9],"2":[1,8],"3":[3,4,1],"4":[0,1],"5":[1,1],"6":[0,1],"7":[0,0],"8":[0,0],"9":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1b0824fe4bbb09194bce29ec7f5be68b07b22d56"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\clevertap\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\clevertap\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":20},"end":{"line":10,"column":1}},"2":{"start":{"line":4,"column":21},"end":{"line":4,"column":39}},"3":{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":58}},"5":{"start":{"line":9,"column":2},"end":{"line":9,"column":46}},"6":{"start":{"line":12,"column":26},"end":{"line":18,"column":1}},"7":{"start":{"line":22,"column":36},"end":{"line":43,"column":1}},"8":{"start":{"line":45,"column":23},"end":{"line":45,"column":69}},"9":{"start":{"line":47,"column":0},"end":{"line":52,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":20},"end":{"line":3,"column":21}},"loc":{"start":{"line":3,"column":35},"end":{"line":10,"column":1}},"line":3}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},"type":"if","locations":[{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},{"start":{"line":5,"column":2},"end":{"line":7,"column":3}}],"line":5},"1":{"loc":{"start":{"line":5,"column":6},"end":{"line":5,"column":33}},"type":"binary-expr","locations":[{"start":{"line":5,"column":6},"end":{"line":5,"column":12}},{"start":{"line":5,"column":16},"end":{"line":5,"column":33}}],"line":5}},"s":{"0":2,"1":2,"2":18,"3":18,"4":0,"5":18,"6":2,"7":2,"8":2,"9":2},"f":{"0":18},"b":{"0":[0,18],"1":[18,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"57647563c22991b121bbe79be179c816f4b1451d"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\clevertap\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\clevertap\\transform.js","statementMap":{"0":{"start":{"line":3,"column":12},"end":{"line":3,"column":32}},"1":{"start":{"line":4,"column":22},"end":{"line":4,"column":51}},"2":{"start":{"line":10,"column":4},"end":{"line":10,"column":23}},"3":{"start":{"line":24,"column":4},"end":{"line":24,"column":25}},"4":{"start":{"line":45,"column":24},"end":{"line":59,"column":1}},"5":{"start":{"line":46,"column":19},"end":{"line":46,"column":41}},"6":{"start":{"line":50,"column":2},"end":{"line":50,"column":47}},"7":{"start":{"line":51,"column":2},"end":{"line":51,"column":59}},"8":{"start":{"line":52,"column":2},"end":{"line":56,"column":4}},"9":{"start":{"line":57,"column":2},"end":{"line":57,"column":31}},"10":{"start":{"line":58,"column":2},"end":{"line":58,"column":18}},"11":{"start":{"line":62,"column":39},"end":{"line":90,"column":1}},"12":{"start":{"line":63,"column":17},"end":{"line":63,"column":64}},"13":{"start":{"line":64,"column":22},"end":{"line":64,"column":49}},"14":{"start":{"line":65,"column":18},"end":{"line":69,"column":3}},"15":{"start":{"line":72,"column":2},"end":{"line":74,"column":3}},"16":{"start":{"line":73,"column":4},"end":{"line":73,"column":45}},"17":{"start":{"line":77,"column":2},"end":{"line":86,"column":3}},"18":{"start":{"line":78,"column":4},"end":{"line":78,"column":35}},"19":{"start":{"line":80,"column":4},"end":{"line":82,"column":5}},"20":{"start":{"line":81,"column":6},"end":{"line":81,"column":44}},"21":{"start":{"line":83,"column":9},"end":{"line":86,"column":3}},"22":{"start":{"line":85,"column":4},"end":{"line":85,"column":30}},"23":{"start":{"line":87,"column":2},"end":{"line":89,"column":4}},"24":{"start":{"line":93,"column":27},"end":{"line":110,"column":1}},"25":{"start":{"line":94,"column":18},"end":{"line":103,"column":3}},"26":{"start":{"line":106,"column":2},"end":{"line":108,"column":3}},"27":{"start":{"line":107,"column":4},"end":{"line":107,"column":55}},"28":{"start":{"line":109,"column":2},"end":{"line":109,"column":17}},"29":{"start":{"line":113,"column":36},"end":{"line":127,"column":1}},"30":{"start":{"line":114,"column":17},"end":{"line":114,"column":64}},"31":{"start":{"line":115,"column":22},"end":{"line":115,"column":49}},"32":{"start":{"line":116,"column":2},"end":{"line":125,"column":3}},"33":{"start":{"line":118,"column":4},"end":{"line":118,"column":40}},"34":{"start":{"line":119,"column":9},"end":{"line":125,"column":3}},"35":{"start":{"line":121,"column":4},"end":{"line":121,"column":35}},"36":{"start":{"line":124,"column":4},"end":{"line":124,"column":78}},"37":{"start":{"line":126,"column":2},"end":{"line":126,"column":22}},"38":{"start":{"line":130,"column":24},"end":{"line":133,"column":1}},"39":{"start":{"line":131,"column":2},"end":{"line":131,"column":70}},"40":{"start":{"line":132,"column":2},"end":{"line":132,"column":22}},"41":{"start":{"line":137,"column":28},"end":{"line":158,"column":1}},"42":{"start":{"line":138,"column":16},"end":{"line":138,"column":72}},"43":{"start":{"line":140,"column":2},"end":{"line":149,"column":3}},"44":{"start":{"line":145,"column":4},"end":{"line":148,"column":57}},"45":{"start":{"line":150,"column":2},"end":{"line":155,"column":4}},"46":{"start":{"line":157,"column":2},"end":{"line":157,"column":47}},"47":{"start":{"line":160,"column":30},"end":{"line":271,"column":1}},"48":{"start":{"line":165,"column":2},"end":{"line":264,"column":3}},"49":{"start":{"line":166,"column":20},"end":{"line":166,"column":58}},"50":{"start":{"line":167,"column":4},"end":{"line":204,"column":5}},"51":{"start":{"line":168,"column":6},"end":{"line":168,"column":65}},"52":{"start":{"line":174,"column":26},"end":{"line":174,"column":62}},"53":{"start":{"line":175,"column":21},"end":{"line":175,"column":52}},"54":{"start":{"line":176,"column":6},"end":{"line":178,"column":7}},"55":{"start":{"line":177,"column":8},"end":{"line":177,"column":42}},"56":{"start":{"line":179,"column":6},"end":{"line":201,"column":7}},"57":{"start":{"line":184,"column":26},"end":{"line":184,"column":65}},"58":{"start":{"line":185,"column":38},"end":{"line":196,"column":9}},"59":{"start":{"line":197,"column":24},"end":{"line":197,"column":26}},"60":{"start":{"line":198,"column":8},"end":{"line":198,"column":60}},"61":{"start":{"line":199,"column":8},"end":{"line":199,"column":74}},"62":{"start":{"line":200,"column":8},"end":{"line":200,"column":23}},"63":{"start":{"line":203,"column":6},"end":{"line":203,"column":53}},"64":{"start":{"line":208,"column":4},"end":{"line":216,"column":5}},"65":{"start":{"line":212,"column":6},"end":{"line":215,"column":8}},"66":{"start":{"line":221,"column":4},"end":{"line":246,"column":5}},"67":{"start":{"line":225,"column":6},"end":{"line":232,"column":8}},"68":{"start":{"line":234,"column":6},"end":{"line":239,"column":8}},"69":{"start":{"line":245,"column":6},"end":{"line":245,"column":78}},"70":{"start":{"line":247,"column":4},"end":{"line":247,"column":32}},"71":{"start":{"line":250,"column":4},"end":{"line":254,"column":5}},"72":{"start":{"line":251,"column":6},"end":{"line":251,"column":72}},"73":{"start":{"line":253,"column":6},"end":{"line":253,"column":60}},"74":{"start":{"line":257,"column":4},"end":{"line":259,"column":5}},"75":{"start":{"line":258,"column":6},"end":{"line":258,"column":57}},"76":{"start":{"line":261,"column":4},"end":{"line":263,"column":6}},"77":{"start":{"line":266,"column":2},"end":{"line":268,"column":3}},"78":{"start":{"line":267,"column":4},"end":{"line":267,"column":49}},"79":{"start":{"line":270,"column":2},"end":{"line":270,"column":65}},"80":{"start":{"line":274,"column":21},"end":{"line":301,"column":1}},"81":{"start":{"line":275,"column":2},"end":{"line":280,"column":3}},"82":{"start":{"line":276,"column":4},"end":{"line":279,"column":6}},"83":{"start":{"line":281,"column":22},"end":{"line":281,"column":48}},"84":{"start":{"line":284,"column":2},"end":{"line":299,"column":3}},"85":{"start":{"line":286,"column":6},"end":{"line":286,"column":44}},"86":{"start":{"line":287,"column":6},"end":{"line":287,"column":12}},"87":{"start":{"line":289,"column":6},"end":{"line":289,"column":40}},"88":{"start":{"line":290,"column":6},"end":{"line":290,"column":12}},"89":{"start":{"line":292,"column":6},"end":{"line":292,"column":42}},"90":{"start":{"line":293,"column":6},"end":{"line":293,"column":12}},"91":{"start":{"line":295,"column":6},"end":{"line":295,"column":41}},"92":{"start":{"line":296,"column":6},"end":{"line":296,"column":12}},"93":{"start":{"line":298,"column":6},"end":{"line":298,"column":63}},"94":{"start":{"line":300,"column":2},"end":{"line":300,"column":63}},"95":{"start":{"line":303,"column":16},"end":{"line":305,"column":1}},"96":{"start":{"line":304,"column":2},"end":{"line":304,"column":56}},"97":{"start":{"line":307,"column":26},"end":{"line":344,"column":1}},"98":{"start":{"line":308,"column":2},"end":{"line":311,"column":3}},"99":{"start":{"line":309,"column":23},"end":{"line":309,"column":75}},"100":{"start":{"line":310,"column":4},"end":{"line":310,"column":24}},"101":{"start":{"line":313,"column":19},"end":{"line":342,"column":3}},"102":{"start":{"line":315,"column":6},"end":{"line":340,"column":7}},"103":{"start":{"line":316,"column":8},"end":{"line":323,"column":9}},"104":{"start":{"line":318,"column":10},"end":{"line":322,"column":12}},"105":{"start":{"line":325,"column":8},"end":{"line":329,"column":10}},"106":{"start":{"line":331,"column":8},"end":{"line":339,"column":10}},"107":{"start":{"line":343,"column":2},"end":{"line":343,"column":18}},"108":{"start":{"line":346,"column":0},"end":{"line":346,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":45,"column":24},"end":{"line":45,"column":25}},"loc":{"start":{"line":45,"column":50},"end":{"line":59,"column":1}},"line":45},"1":{"name":"(anonymous_1)","decl":{"start":{"line":62,"column":39},"end":{"line":62,"column":40}},"loc":{"start":{"line":62,"column":61},"end":{"line":90,"column":1}},"line":62},"2":{"name":"(anonymous_2)","decl":{"start":{"line":93,"column":27},"end":{"line":93,"column":28}},"loc":{"start":{"line":93,"column":49},"end":{"line":110,"column":1}},"line":93},"3":{"name":"(anonymous_3)","decl":{"start":{"line":113,"column":36},"end":{"line":113,"column":37}},"loc":{"start":{"line":113,"column":63},"end":{"line":127,"column":1}},"line":113},"4":{"name":"(anonymous_4)","decl":{"start":{"line":130,"column":24},"end":{"line":130,"column":25}},"loc":{"start":{"line":130,"column":51},"end":{"line":133,"column":1}},"line":130},"5":{"name":"(anonymous_5)","decl":{"start":{"line":137,"column":28},"end":{"line":137,"column":29}},"loc":{"start":{"line":137,"column":51},"end":{"line":158,"column":1}},"line":137},"6":{"name":"(anonymous_6)","decl":{"start":{"line":160,"column":30},"end":{"line":160,"column":31}},"loc":{"start":{"line":160,"column":66},"end":{"line":271,"column":1}},"line":160},"7":{"name":"(anonymous_7)","decl":{"start":{"line":274,"column":21},"end":{"line":274,"column":22}},"loc":{"start":{"line":274,"column":47},"end":{"line":301,"column":1}},"line":274},"8":{"name":"(anonymous_8)","decl":{"start":{"line":303,"column":16},"end":{"line":303,"column":17}},"loc":{"start":{"line":303,"column":25},"end":{"line":305,"column":1}},"line":303},"9":{"name":"(anonymous_9)","decl":{"start":{"line":307,"column":26},"end":{"line":307,"column":27}},"loc":{"start":{"line":307,"column":42},"end":{"line":344,"column":1}},"line":307},"10":{"name":"(anonymous_10)","decl":{"start":{"line":314,"column":15},"end":{"line":314,"column":16}},"loc":{"start":{"line":314,"column":30},"end":{"line":341,"column":5}},"line":314}},"branchMap":{"0":{"loc":{"start":{"line":68,"column":8},"end":{"line":68,"column":70}},"type":"binary-expr","locations":[{"start":{"line":68,"column":8},"end":{"line":68,"column":33}},{"start":{"line":68,"column":37},"end":{"line":68,"column":70}}],"line":68},"1":{"loc":{"start":{"line":72,"column":2},"end":{"line":74,"column":3}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":74,"column":3}},{"start":{"line":72,"column":2},"end":{"line":74,"column":3}}],"line":72},"2":{"loc":{"start":{"line":72,"column":6},"end":{"line":72,"column":39}},"type":"binary-expr","locations":[{"start":{"line":72,"column":6},"end":{"line":72,"column":16}},{"start":{"line":72,"column":20},"end":{"line":72,"column":39}}],"line":72},"3":{"loc":{"start":{"line":77,"column":2},"end":{"line":86,"column":3}},"type":"if","locations":[{"start":{"line":77,"column":2},"end":{"line":86,"column":3}},{"start":{"line":77,"column":2},"end":{"line":86,"column":3}}],"line":77},"4":{"loc":{"start":{"line":80,"column":4},"end":{"line":82,"column":5}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":82,"column":5}},{"start":{"line":80,"column":4},"end":{"line":82,"column":5}}],"line":80},"5":{"loc":{"start":{"line":83,"column":9},"end":{"line":86,"column":3}},"type":"if","locations":[{"start":{"line":83,"column":9},"end":{"line":86,"column":3}},{"start":{"line":83,"column":9},"end":{"line":86,"column":3}}],"line":83},"6":{"loc":{"start":{"line":99,"column":12},"end":{"line":99,"column":74}},"type":"binary-expr","locations":[{"start":{"line":99,"column":12},"end":{"line":99,"column":37}},{"start":{"line":99,"column":41},"end":{"line":99,"column":74}}],"line":99},"7":{"loc":{"start":{"line":106,"column":2},"end":{"line":108,"column":3}},"type":"if","locations":[{"start":{"line":106,"column":2},"end":{"line":108,"column":3}},{"start":{"line":106,"column":2},"end":{"line":108,"column":3}}],"line":106},"8":{"loc":{"start":{"line":106,"column":6},"end":{"line":106,"column":49}},"type":"binary-expr","locations":[{"start":{"line":106,"column":6},"end":{"line":106,"column":21}},{"start":{"line":106,"column":25},"end":{"line":106,"column":49}}],"line":106},"9":{"loc":{"start":{"line":116,"column":2},"end":{"line":125,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":125,"column":3}},{"start":{"line":116,"column":2},"end":{"line":125,"column":3}}],"line":116},"10":{"loc":{"start":{"line":119,"column":9},"end":{"line":125,"column":3}},"type":"if","locations":[{"start":{"line":119,"column":9},"end":{"line":125,"column":3}},{"start":{"line":119,"column":9},"end":{"line":125,"column":3}}],"line":119},"11":{"loc":{"start":{"line":140,"column":2},"end":{"line":149,"column":3}},"type":"if","locations":[{"start":{"line":140,"column":2},"end":{"line":149,"column":3}},{"start":{"line":140,"column":2},"end":{"line":149,"column":3}}],"line":140},"12":{"loc":{"start":{"line":141,"column":4},"end":{"line":143,"column":49}},"type":"binary-expr","locations":[{"start":{"line":141,"column":4},"end":{"line":141,"column":25}},{"start":{"line":142,"column":4},"end":{"line":142,"column":50}},{"start":{"line":143,"column":4},"end":{"line":143,"column":49}}],"line":141},"13":{"loc":{"start":{"line":165,"column":2},"end":{"line":264,"column":3}},"type":"if","locations":[{"start":{"line":165,"column":2},"end":{"line":264,"column":3}},{"start":{"line":165,"column":2},"end":{"line":264,"column":3}}],"line":165},"14":{"loc":{"start":{"line":167,"column":4},"end":{"line":204,"column":5}},"type":"if","locations":[{"start":{"line":167,"column":4},"end":{"line":204,"column":5}},{"start":{"line":167,"column":4},"end":{"line":204,"column":5}}],"line":167},"15":{"loc":{"start":{"line":176,"column":6},"end":{"line":178,"column":7}},"type":"if","locations":[{"start":{"line":176,"column":6},"end":{"line":178,"column":7}},{"start":{"line":176,"column":6},"end":{"line":178,"column":7}}],"line":176},"16":{"loc":{"start":{"line":179,"column":6},"end":{"line":201,"column":7}},"type":"if","locations":[{"start":{"line":179,"column":6},"end":{"line":201,"column":7}},{"start":{"line":179,"column":6},"end":{"line":201,"column":7}}],"line":179},"17":{"loc":{"start":{"line":180,"column":8},"end":{"line":182,"column":59}},"type":"binary-expr","locations":[{"start":{"line":180,"column":8},"end":{"line":180,"column":35}},{"start":{"line":181,"column":8},"end":{"line":181,"column":19}},{"start":{"line":182,"column":9},"end":{"line":182,"column":31}},{"start":{"line":182,"column":35},"end":{"line":182,"column":58}}],"line":180},"18":{"loc":{"start":{"line":184,"column":26},"end":{"line":184,"column":65}},"type":"cond-expr","locations":[{"start":{"line":184,"column":51},"end":{"line":184,"column":56}},{"start":{"line":184,"column":59},"end":{"line":184,"column":65}}],"line":184},"19":{"loc":{"start":{"line":208,"column":4},"end":{"line":216,"column":5}},"type":"if","locations":[{"start":{"line":208,"column":4},"end":{"line":216,"column":5}},{"start":{"line":208,"column":4},"end":{"line":216,"column":5}}],"line":208},"20":{"loc":{"start":{"line":209,"column":6},"end":{"line":210,"column":54}},"type":"binary-expr","locations":[{"start":{"line":209,"column":6},"end":{"line":209,"column":40}},{"start":{"line":210,"column":6},"end":{"line":210,"column":54}}],"line":209},"21":{"loc":{"start":{"line":221,"column":4},"end":{"line":246,"column":5}},"type":"if","locations":[{"start":{"line":221,"column":4},"end":{"line":246,"column":5}},{"start":{"line":221,"column":4},"end":{"line":246,"column":5}}],"line":221},"22":{"loc":{"start":{"line":222,"column":6},"end":{"line":223,"column":60}},"type":"binary-expr","locations":[{"start":{"line":222,"column":6},"end":{"line":222,"column":24}},{"start":{"line":223,"column":6},"end":{"line":223,"column":60}}],"line":222},"23":{"loc":{"start":{"line":250,"column":4},"end":{"line":254,"column":5}},"type":"if","locations":[{"start":{"line":250,"column":4},"end":{"line":254,"column":5}},{"start":{"line":250,"column":4},"end":{"line":254,"column":5}}],"line":250},"24":{"loc":{"start":{"line":257,"column":4},"end":{"line":259,"column":5}},"type":"if","locations":[{"start":{"line":257,"column":4},"end":{"line":259,"column":5}},{"start":{"line":257,"column":4},"end":{"line":259,"column":5}}],"line":257},"25":{"loc":{"start":{"line":257,"column":8},"end":{"line":257,"column":51}},"type":"binary-expr","locations":[{"start":{"line":257,"column":8},"end":{"line":257,"column":23}},{"start":{"line":257,"column":27},"end":{"line":257,"column":51}}],"line":257},"26":{"loc":{"start":{"line":266,"column":2},"end":{"line":268,"column":3}},"type":"if","locations":[{"start":{"line":266,"column":2},"end":{"line":268,"column":3}},{"start":{"line":266,"column":2},"end":{"line":268,"column":3}}],"line":266},"27":{"loc":{"start":{"line":275,"column":2},"end":{"line":280,"column":3}},"type":"if","locations":[{"start":{"line":275,"column":2},"end":{"line":280,"column":3}},{"start":{"line":275,"column":2},"end":{"line":280,"column":3}}],"line":275},"28":{"loc":{"start":{"line":284,"column":2},"end":{"line":299,"column":3}},"type":"switch","locations":[{"start":{"line":285,"column":4},"end":{"line":287,"column":12}},{"start":{"line":288,"column":4},"end":{"line":290,"column":12}},{"start":{"line":291,"column":4},"end":{"line":293,"column":12}},{"start":{"line":294,"column":4},"end":{"line":296,"column":12}},{"start":{"line":297,"column":4},"end":{"line":298,"column":63}}],"line":284},"29":{"loc":{"start":{"line":308,"column":2},"end":{"line":311,"column":3}},"type":"if","locations":[{"start":{"line":308,"column":2},"end":{"line":311,"column":3}},{"start":{"line":308,"column":2},"end":{"line":311,"column":3}}],"line":308},"30":{"loc":{"start":{"line":308,"column":6},"end":{"line":308,"column":50}},"type":"binary-expr","locations":[{"start":{"line":308,"column":6},"end":{"line":308,"column":28}},{"start":{"line":308,"column":32},"end":{"line":308,"column":50}}],"line":308},"31":{"loc":{"start":{"line":316,"column":8},"end":{"line":323,"column":9}},"type":"if","locations":[{"start":{"line":316,"column":8},"end":{"line":323,"column":9}},{"start":{"line":316,"column":8},"end":{"line":323,"column":9}}],"line":316},"32":{"loc":{"start":{"line":333,"column":10},"end":{"line":337,"column":17}},"type":"cond-expr","locations":[{"start":{"line":334,"column":14},"end":{"line":334,"column":35}},{"start":{"line":335,"column":14},"end":{"line":337,"column":17}}],"line":333},"33":{"loc":{"start":{"line":335,"column":14},"end":{"line":337,"column":17}},"type":"cond-expr","locations":[{"start":{"line":336,"column":14},"end":{"line":336,"column":24}},{"start":{"line":337,"column":14},"end":{"line":337,"column":17}}],"line":335},"34":{"loc":{"start":{"line":338,"column":10},"end":{"line":338,"column":69}},"type":"binary-expr","locations":[{"start":{"line":338,"column":10},"end":{"line":338,"column":23}},{"start":{"line":338,"column":27},"end":{"line":338,"column":69}}],"line":338}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":18,"6":18,"7":18,"8":18,"9":18,"10":18,"11":2,"12":3,"13":3,"14":3,"15":3,"16":0,"17":3,"18":2,"19":2,"20":2,"21":1,"22":1,"23":3,"24":2,"25":5,"26":5,"27":1,"28":5,"29":2,"30":2,"31":2,"32":2,"33":1,"34":1,"35":1,"36":0,"37":2,"38":2,"39":6,"40":6,"41":2,"42":8,"43":8,"44":2,"45":8,"46":8,"47":2,"48":17,"49":8,"50":8,"51":3,"52":3,"53":3,"54":3,"55":3,"56":3,"57":2,"58":2,"59":2,"60":2,"61":2,"62":2,"63":5,"64":9,"65":1,"66":8,"67":1,"68":1,"69":7,"70":8,"71":8,"72":2,"73":6,"74":8,"75":1,"76":8,"77":14,"78":14,"79":0,"80":2,"81":19,"82":1,"83":18,"84":18,"85":8,"86":8,"87":2,"88":2,"89":1,"90":1,"91":6,"92":6,"93":1,"94":17,"95":2,"96":19,"97":2,"98":1,"99":0,"100":0,"101":1,"102":2,"103":2,"104":0,"105":2,"106":0,"107":1,"108":2},"f":{"0":18,"1":3,"2":5,"3":2,"4":6,"5":8,"6":17,"7":19,"8":19,"9":1,"10":2},"b":{"0":[3,3],"1":[0,3],"2":[3,0],"3":[2,1],"4":[2,0],"5":[1,0],"6":[5,4],"7":[1,4],"8":[5,1],"9":[1,1],"10":[1,0],"11":[2,6],"12":[8,2,2],"13":[8,9],"14":[3,5],"15":[3,0],"16":[2,1],"17":[3,2,2,1],"18":[1,1],"19":[1,8],"20":[9,2],"21":[1,7],"22":[8,5],"23":[2,6],"24":[1,7],"25":[8,1],"26":[14,0],"27":[1,18],"28":[8,2,1,6,1],"29":[0,1],"30":[1,1],"31":[0,2],"32":[0,0],"33":[0,0],"34":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"50e3ffedb5b0b7eded87e44071d0b60357077e43"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\clickhouse\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\clickhouse\\transform.js","statementMap":{"0":{"start":{"line":1,"column":36},"end":{"line":1,"column":65}},"1":{"start":{"line":2,"column":24},"end":{"line":2,"column":59}},"2":{"start":{"line":4,"column":19},"end":{"line":4,"column":31}},"3":{"start":{"line":7,"column":2},"end":{"line":7,"column":51}},"4":{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},"5":{"start":{"line":12,"column":4},"end":{"line":12,"column":20}},"6":{"start":{"line":14,"column":2},"end":{"line":41,"column":3}},"7":{"start":{"line":16,"column":4},"end":{"line":18,"column":5}},"8":{"start":{"line":17,"column":6},"end":{"line":17,"column":22}},"9":{"start":{"line":20,"column":31},"end":{"line":20,"column":59}},"10":{"start":{"line":21,"column":24},"end":{"line":21,"column":42}},"11":{"start":{"line":22,"column":4},"end":{"line":39,"column":5}},"12":{"start":{"line":22,"column":17},"end":{"line":22,"column":18}},"13":{"start":{"line":23,"column":23},"end":{"line":23,"column":51}},"14":{"start":{"line":24,"column":6},"end":{"line":38,"column":7}},"15":{"start":{"line":25,"column":8},"end":{"line":27,"column":9}},"16":{"start":{"line":26,"column":10},"end":{"line":26,"column":16}},"17":{"start":{"line":28,"column":8},"end":{"line":32,"column":9}},"18":{"start":{"line":29,"column":10},"end":{"line":29,"column":34}},"19":{"start":{"line":31,"column":10},"end":{"line":31,"column":19}},"20":{"start":{"line":33,"column":8},"end":{"line":36,"column":9}},"21":{"start":{"line":35,"column":10},"end":{"line":35,"column":19}},"22":{"start":{"line":37,"column":8},"end":{"line":37,"column":33}},"23":{"start":{"line":40,"column":4},"end":{"line":40,"column":37}},"24":{"start":{"line":42,"column":2},"end":{"line":42,"column":18}},"25":{"start":{"line":46,"column":26},"end":{"line":46,"column":69}},"26":{"start":{"line":47,"column":23},"end":{"line":47,"column":71}},"27":{"start":{"line":48,"column":19},"end":{"line":48,"column":29}},"28":{"start":{"line":50,"column":4},"end":{"line":50,"column":55}},"29":{"start":{"line":51,"column":2},"end":{"line":59,"column":5}},"30":{"start":{"line":62,"column":0},"end":{"line":65,"column":2}}},"fnMap":{"0":{"name":"processSingleMessage","decl":{"start":{"line":6,"column":9},"end":{"line":6,"column":29}},"loc":{"start":{"line":6,"column":48},"end":{"line":8,"column":1}},"line":6},"1":{"name":"getDataTypeOverride","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":28}},"loc":{"start":{"line":10,"column":48},"end":{"line":43,"column":1}},"line":10},"2":{"name":"process","decl":{"start":{"line":45,"column":9},"end":{"line":45,"column":16}},"loc":{"start":{"line":45,"column":24},"end":{"line":60,"column":1}},"line":45}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},{"start":{"line":11,"column":2},"end":{"line":13,"column":3}}],"line":11},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":41,"column":3}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":41,"column":3}},{"start":{"line":14,"column":2},"end":{"line":41,"column":3}}],"line":14},"2":{"loc":{"start":{"line":16,"column":4},"end":{"line":18,"column":5}},"type":"if","locations":[{"start":{"line":16,"column":4},"end":{"line":18,"column":5}},{"start":{"line":16,"column":4},"end":{"line":18,"column":5}}],"line":16},"3":{"loc":{"start":{"line":24,"column":6},"end":{"line":38,"column":7}},"type":"if","locations":[{"start":{"line":24,"column":6},"end":{"line":38,"column":7}},{"start":{"line":24,"column":6},"end":{"line":38,"column":7}}],"line":24},"4":{"loc":{"start":{"line":25,"column":8},"end":{"line":27,"column":9}},"type":"if","locations":[{"start":{"line":25,"column":8},"end":{"line":27,"column":9}},{"start":{"line":25,"column":8},"end":{"line":27,"column":9}}],"line":25},"5":{"loc":{"start":{"line":28,"column":8},"end":{"line":32,"column":9}},"type":"if","locations":[{"start":{"line":28,"column":8},"end":{"line":32,"column":9}},{"start":{"line":28,"column":8},"end":{"line":32,"column":9}}],"line":28},"6":{"loc":{"start":{"line":28,"column":12},"end":{"line":28,"column":59}},"type":"binary-expr","locations":[{"start":{"line":28,"column":12},"end":{"line":28,"column":32}},{"start":{"line":28,"column":36},"end":{"line":28,"column":59}}],"line":28},"7":{"loc":{"start":{"line":33,"column":8},"end":{"line":36,"column":9}},"type":"if","locations":[{"start":{"line":33,"column":8},"end":{"line":36,"column":9}},{"start":{"line":33,"column":8},"end":{"line":36,"column":9}}],"line":33},"8":{"loc":{"start":{"line":33,"column":12},"end":{"line":33,"column":59}},"type":"binary-expr","locations":[{"start":{"line":33,"column":12},"end":{"line":33,"column":30}},{"start":{"line":33,"column":34},"end":{"line":33,"column":59}}],"line":33},"9":{"loc":{"start":{"line":46,"column":26},"end":{"line":46,"column":69}},"type":"binary-expr","locations":[{"start":{"line":46,"column":26},"end":{"line":46,"column":61}},{"start":{"line":46,"column":65},"end":{"line":46,"column":69}}],"line":46},"10":{"loc":{"start":{"line":50,"column":4},"end":{"line":50,"column":55}},"type":"binary-expr","locations":[{"start":{"line":50,"column":4},"end":{"line":50,"column":44}},{"start":{"line":50,"column":48},"end":{"line":50,"column":55}}],"line":50},"11":{"loc":{"start":{"line":58,"column":20},"end":{"line":58,"column":73}},"type":"cond-expr","locations":[{"start":{"line":58,"column":37},"end":{"line":58,"column":66}},{"start":{"line":58,"column":69},"end":{"line":58,"column":73}}],"line":58}},"s":{"0":3,"1":3,"2":3,"3":124,"4":2931,"5":2915,"6":16,"7":14,"8":0,"9":14,"10":14,"11":14,"12":14,"13":24,"14":24,"15":10,"16":0,"17":10,"18":3,"19":3,"20":7,"21":4,"22":3,"23":14,"24":2,"25":124,"26":124,"27":124,"28":124,"29":124,"30":3},"f":{"0":124,"1":2931,"2":124},"b":{"0":[2915,16],"1":[14,2],"2":[0,14],"3":[10,14],"4":[0,10],"5":[3,7],"6":[10,3],"7":[4,3],"8":[7,4],"9":[124,0],"10":[124,124],"11":[6,118]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"fc2610cfbab2fbc100e381ed577d02df4fc01553"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\confluent_cloud\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\confluent_cloud\\transform.js","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":5,"column":3}},"1":{"start":{"line":6,"column":2},"end":{"line":6,"column":16}},"2":{"start":{"line":9,"column":0},"end":{"line":9,"column":26}}},"fnMap":{"0":{"name":"process","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":16}},"loc":{"start":{"line":1,"column":24},"end":{"line":7,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":12},"end":{"line":4,"column":61}},"type":"binary-expr","locations":[{"start":{"line":4,"column":12},"end":{"line":4,"column":32}},{"start":{"line":4,"column":36},"end":{"line":4,"column":61}}],"line":4}},"s":{"0":5,"1":5,"2":1},"f":{"0":5},"b":{"0":[5,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bcf2428214456164d3e86294a1df7ccc781532eb"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\customerio\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\customerio\\config.js","statementMap":{"0":{"start":{"line":1,"column":26},"end":{"line":1,"column":74}},"1":{"start":{"line":4,"column":2},"end":{"line":4,"column":57}},"2":{"start":{"line":6,"column":28},"end":{"line":6,"column":78}},"3":{"start":{"line":8,"column":28},"end":{"line":8,"column":69}},"4":{"start":{"line":11,"column":2},"end":{"line":11,"column":58}},"5":{"start":{"line":14,"column":2},"end":{"line":14,"column":69}},"6":{"start":{"line":16,"column":0},"end":{"line":23,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c7da5cc269121daba70866b1da8bbdfd40fab0f3"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\customerio\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\customerio\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":13},"end":{"line":3,"column":28}},"3":{"start":{"line":4,"column":17},"end":{"line":4,"column":47}},"4":{"start":{"line":10,"column":4},"end":{"line":10,"column":33}},"5":{"start":{"line":22,"column":4},"end":{"line":22,"column":25}},"6":{"start":{"line":31,"column":4},"end":{"line":31,"column":23}},"7":{"start":{"line":32,"column":15},"end":{"line":32,"column":41}},"8":{"start":{"line":34,"column":32},"end":{"line":38,"column":1}},"9":{"start":{"line":40,"column":33},"end":{"line":47,"column":1}},"10":{"start":{"line":41,"column":2},"end":{"line":46,"column":4}},"11":{"start":{"line":49,"column":37},"end":{"line":49,"column":62}},"12":{"start":{"line":53,"column":29},"end":{"line":62,"column":1}},"13":{"start":{"line":54,"column":23},"end":{"line":54,"column":67}},"14":{"start":{"line":55,"column":2},"end":{"line":61,"column":5}},"15":{"start":{"line":56,"column":20},"end":{"line":56,"column":40}},"16":{"start":{"line":57,"column":17},"end":{"line":57,"column":37}},"17":{"start":{"line":58,"column":4},"end":{"line":60,"column":7}},"18":{"start":{"line":59,"column":6},"end":{"line":59,"column":78}},"19":{"start":{"line":65,"column":21},"end":{"line":65,"column":23}},"20":{"start":{"line":68,"column":22},"end":{"line":68,"column":46}},"21":{"start":{"line":70,"column":30},"end":{"line":70,"column":66}},"22":{"start":{"line":71,"column":2},"end":{"line":74,"column":3}},"23":{"start":{"line":72,"column":4},"end":{"line":72,"column":35}},"24":{"start":{"line":73,"column":4},"end":{"line":73,"column":37}},"25":{"start":{"line":76,"column":17},"end":{"line":76,"column":64}},"26":{"start":{"line":77,"column":19},"end":{"line":77,"column":41}},"27":{"start":{"line":78,"column":2},"end":{"line":78,"column":50}},"28":{"start":{"line":79,"column":2},"end":{"line":83,"column":4}},"29":{"start":{"line":85,"column":2},"end":{"line":252,"column":3}},"30":{"start":{"line":87,"column":4},"end":{"line":89,"column":5}},"31":{"start":{"line":88,"column":6},"end":{"line":88,"column":55}},"32":{"start":{"line":92,"column":28},"end":{"line":92,"column":77}},"33":{"start":{"line":93,"column":4},"end":{"line":93,"column":46}},"34":{"start":{"line":95,"column":4},"end":{"line":116,"column":5}},"35":{"start":{"line":96,"column":21},"end":{"line":96,"column":49}},"36":{"start":{"line":97,"column":27},"end":{"line":97,"column":71}},"37":{"start":{"line":98,"column":6},"end":{"line":115,"column":9}},"38":{"start":{"line":102,"column":8},"end":{"line":114,"column":9}},"39":{"start":{"line":108,"column":34},"end":{"line":108,"column":59}},"40":{"start":{"line":109,"column":10},"end":{"line":113,"column":12}},"41":{"start":{"line":119,"column":4},"end":{"line":125,"column":5}},"42":{"start":{"line":120,"column":24},"end":{"line":120,"column":60}},"43":{"start":{"line":121,"column":6},"end":{"line":124,"column":9}},"44":{"start":{"line":122,"column":20},"end":{"line":122,"column":59}},"45":{"start":{"line":123,"column":8},"end":{"line":123,"column":35}},"46":{"start":{"line":128,"column":21},"end":{"line":128,"column":71}},"47":{"start":{"line":130,"column":4},"end":{"line":136,"column":5}},"48":{"start":{"line":131,"column":6},"end":{"line":135,"column":8}},"49":{"start":{"line":139,"column":4},"end":{"line":149,"column":5}},"50":{"start":{"line":140,"column":6},"end":{"line":148,"column":8}},"51":{"start":{"line":151,"column":4},"end":{"line":153,"column":5}},"52":{"start":{"line":152,"column":6},"end":{"line":152,"column":59}},"53":{"start":{"line":154,"column":4},"end":{"line":154,"column":56}},"54":{"start":{"line":155,"column":4},"end":{"line":155,"column":44}},"55":{"start":{"line":156,"column":9},"end":{"line":252,"column":3}},"56":{"start":{"line":158,"column":4},"end":{"line":163,"column":5}},"57":{"start":{"line":159,"column":6},"end":{"line":162,"column":8}},"58":{"start":{"line":164,"column":4},"end":{"line":164,"column":35}},"59":{"start":{"line":165,"column":4},"end":{"line":165,"column":45}},"60":{"start":{"line":166,"column":4},"end":{"line":166,"column":28}},"61":{"start":{"line":167,"column":4},"end":{"line":167,"column":35}},"62":{"start":{"line":168,"column":4},"end":{"line":168,"column":30}},"63":{"start":{"line":169,"column":4},"end":{"line":169,"column":49}},"64":{"start":{"line":172,"column":18},"end":{"line":172,"column":54}},"65":{"start":{"line":176,"column":4},"end":{"line":189,"column":5}},"66":{"start":{"line":177,"column":6},"end":{"line":187,"column":7}},"67":{"start":{"line":178,"column":8},"end":{"line":181,"column":10}},"68":{"start":{"line":183,"column":8},"end":{"line":183,"column":37}},"69":{"start":{"line":184,"column":8},"end":{"line":184,"column":35}},"70":{"start":{"line":186,"column":8},"end":{"line":186,"column":24}},"71":{"start":{"line":188,"column":6},"end":{"line":188,"column":71}},"72":{"start":{"line":192,"column":4},"end":{"line":222,"column":5}},"73":{"start":{"line":193,"column":23},"end":{"line":193,"column":47}},"74":{"start":{"line":194,"column":6},"end":{"line":194,"column":64}},"75":{"start":{"line":195,"column":25},"end":{"line":195,"column":60}},"76":{"start":{"line":196,"column":6},"end":{"line":198,"column":7}},"77":{"start":{"line":197,"column":8},"end":{"line":197,"column":60}},"78":{"start":{"line":199,"column":6},"end":{"line":203,"column":8}},"79":{"start":{"line":204,"column":6},"end":{"line":204,"column":42}},"80":{"start":{"line":205,"column":6},"end":{"line":205,"column":46}},"81":{"start":{"line":207,"column":6},"end":{"line":207,"column":27}},"82":{"start":{"line":208,"column":6},"end":{"line":208,"column":50}},"83":{"start":{"line":209,"column":6},"end":{"line":209,"column":38}},"84":{"start":{"line":210,"column":6},"end":{"line":210,"column":38}},"85":{"start":{"line":211,"column":6},"end":{"line":221,"column":7}},"86":{"start":{"line":212,"column":8},"end":{"line":220,"column":10}},"87":{"start":{"line":224,"column":4},"end":{"line":251,"column":5}},"88":{"start":{"line":225,"column":6},"end":{"line":229,"column":7}},"89":{"start":{"line":226,"column":8},"end":{"line":226,"column":67}},"90":{"start":{"line":228,"column":8},"end":{"line":228,"column":62}},"91":{"start":{"line":231,"column":6},"end":{"line":231,"column":37}},"92":{"start":{"line":233,"column":6},"end":{"line":241,"column":7}},"93":{"start":{"line":235,"column":8},"end":{"line":238,"column":19}},"94":{"start":{"line":240,"column":8},"end":{"line":240,"column":46}},"95":{"start":{"line":244,"column":26},"end":{"line":244,"column":79}},"96":{"start":{"line":245,"column":6},"end":{"line":249,"column":7}},"97":{"start":{"line":246,"column":8},"end":{"line":246,"column":61}},"98":{"start":{"line":248,"column":8},"end":{"line":248,"column":46}},"99":{"start":{"line":250,"column":6},"end":{"line":250,"column":45}},"100":{"start":{"line":253,"column":18},"end":{"line":253,"column":51}},"101":{"start":{"line":254,"column":2},"end":{"line":254,"column":31}},"102":{"start":{"line":255,"column":2},"end":{"line":255,"column":48}},"103":{"start":{"line":256,"column":2},"end":{"line":256,"column":31}},"104":{"start":{"line":258,"column":2},"end":{"line":258,"column":18}},"105":{"start":{"line":262,"column":22},"end":{"line":262,"column":48}},"106":{"start":{"line":265,"column":2},"end":{"line":287,"column":3}},"107":{"start":{"line":267,"column":6},"end":{"line":267,"column":26}},"108":{"start":{"line":268,"column":6},"end":{"line":268,"column":12}},"109":{"start":{"line":270,"column":6},"end":{"line":270,"column":22}},"110":{"start":{"line":271,"column":6},"end":{"line":271,"column":54}},"111":{"start":{"line":272,"column":6},"end":{"line":272,"column":12}},"112":{"start":{"line":274,"column":6},"end":{"line":274,"column":23}},"113":{"start":{"line":275,"column":6},"end":{"line":275,"column":75}},"114":{"start":{"line":276,"column":6},"end":{"line":276,"column":12}},"115":{"start":{"line":278,"column":6},"end":{"line":278,"column":23}},"116":{"start":{"line":279,"column":6},"end":{"line":279,"column":29}},"117":{"start":{"line":280,"column":6},"end":{"line":280,"column":12}},"118":{"start":{"line":282,"column":6},"end":{"line":282,"column":23}},"119":{"start":{"line":283,"column":6},"end":{"line":283,"column":12}},"120":{"start":{"line":285,"column":6},"end":{"line":285,"column":62}},"121":{"start":{"line":286,"column":6},"end":{"line":286,"column":76}},"122":{"start":{"line":288,"column":19},"end":{"line":294,"column":3}},"123":{"start":{"line":297,"column":2},"end":{"line":302,"column":3}},"124":{"start":{"line":298,"column":4},"end":{"line":301,"column":6}},"125":{"start":{"line":304,"column":2},"end":{"line":304,"column":18}},"126":{"start":{"line":308,"column":19},"end":{"line":308,"column":21}},"127":{"start":{"line":309,"column":35},"end":{"line":309,"column":40}},"128":{"start":{"line":310,"column":17},"end":{"line":310,"column":59}},"129":{"start":{"line":311,"column":2},"end":{"line":313,"column":3}},"130":{"start":{"line":312,"column":4},"end":{"line":312,"column":28}},"131":{"start":{"line":314,"column":2},"end":{"line":314,"column":24}},"132":{"start":{"line":316,"column":2},"end":{"line":316,"column":18}},"133":{"start":{"line":319,"column":26},"end":{"line":357,"column":1}},"134":{"start":{"line":320,"column":2},"end":{"line":323,"column":3}},"135":{"start":{"line":321,"column":23},"end":{"line":321,"column":75}},"136":{"start":{"line":322,"column":4},"end":{"line":322,"column":24}},"137":{"start":{"line":325,"column":19},"end":{"line":355,"column":3}},"138":{"start":{"line":327,"column":6},"end":{"line":353,"column":7}},"139":{"start":{"line":328,"column":8},"end":{"line":335,"column":9}},"140":{"start":{"line":330,"column":10},"end":{"line":334,"column":12}},"141":{"start":{"line":337,"column":8},"end":{"line":341,"column":10}},"142":{"start":{"line":343,"column":8},"end":{"line":352,"column":10}},"143":{"start":{"line":356,"column":2},"end":{"line":356,"column":18}},"144":{"start":{"line":359,"column":0},"end":{"line":359,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":40,"column":33},"end":{"line":40,"column":34}},"loc":{"start":{"line":40,"column":61},"end":{"line":47,"column":1}},"line":40},"1":{"name":"(anonymous_1)","decl":{"start":{"line":53,"column":29},"end":{"line":53,"column":30}},"loc":{"start":{"line":53,"column":51},"end":{"line":62,"column":1}},"line":53},"2":{"name":"(anonymous_2)","decl":{"start":{"line":55,"column":23},"end":{"line":55,"column":24}},"loc":{"start":{"line":55,"column":32},"end":{"line":61,"column":3}},"line":55},"3":{"name":"(anonymous_3)","decl":{"start":{"line":58,"column":17},"end":{"line":58,"column":18}},"loc":{"start":{"line":58,"column":24},"end":{"line":60,"column":5}},"line":58},"4":{"name":"responseBuilder","decl":{"start":{"line":64,"column":9},"end":{"line":64,"column":24}},"loc":{"start":{"line":64,"column":76},"end":{"line":259,"column":1}},"line":64},"5":{"name":"(anonymous_5)","decl":{"start":{"line":98,"column":21},"end":{"line":98,"column":22}},"loc":{"start":{"line":98,"column":30},"end":{"line":115,"column":7}},"line":98},"6":{"name":"(anonymous_6)","decl":{"start":{"line":121,"column":24},"end":{"line":121,"column":25}},"loc":{"start":{"line":121,"column":32},"end":{"line":124,"column":7}},"line":121},"7":{"name":"processSingleMessage","decl":{"start":{"line":261,"column":9},"end":{"line":261,"column":29}},"loc":{"start":{"line":261,"column":52},"end":{"line":305,"column":1}},"line":261},"8":{"name":"process","decl":{"start":{"line":307,"column":9},"end":{"line":307,"column":16}},"loc":{"start":{"line":307,"column":24},"end":{"line":317,"column":1}},"line":307},"9":{"name":"(anonymous_9)","decl":{"start":{"line":319,"column":26},"end":{"line":319,"column":27}},"loc":{"start":{"line":319,"column":42},"end":{"line":357,"column":1}},"line":319},"10":{"name":"(anonymous_10)","decl":{"start":{"line":326,"column":15},"end":{"line":326,"column":16}},"loc":{"start":{"line":326,"column":30},"end":{"line":354,"column":5}},"line":326}},"branchMap":{"0":{"loc":{"start":{"line":42,"column":4},"end":{"line":45,"column":60}},"type":"binary-expr","locations":[{"start":{"line":42,"column":4},"end":{"line":42,"column":47}},{"start":{"line":43,"column":5},"end":{"line":43,"column":23}},{"start":{"line":44,"column":6},"end":{"line":44,"column":45}},{"start":{"line":45,"column":6},"end":{"line":45,"column":59}}],"line":42},"1":{"loc":{"start":{"line":54,"column":23},"end":{"line":54,"column":67}},"type":"cond-expr","locations":[{"start":{"line":54,"column":40},"end":{"line":54,"column":48}},{"start":{"line":54,"column":51},"end":{"line":54,"column":67}}],"line":54},"2":{"loc":{"start":{"line":71,"column":2},"end":{"line":74,"column":3}},"type":"if","locations":[{"start":{"line":71,"column":2},"end":{"line":74,"column":3}},{"start":{"line":71,"column":2},"end":{"line":74,"column":3}}],"line":71},"3":{"loc":{"start":{"line":78,"column":20},"end":{"line":78,"column":49}},"type":"binary-expr","locations":[{"start":{"line":78,"column":20},"end":{"line":78,"column":26}},{"start":{"line":78,"column":30},"end":{"line":78,"column":49}}],"line":78},"4":{"loc":{"start":{"line":85,"column":2},"end":{"line":252,"column":3}},"type":"if","locations":[{"start":{"line":85,"column":2},"end":{"line":252,"column":3}},{"start":{"line":85,"column":2},"end":{"line":252,"column":3}}],"line":85},"5":{"loc":{"start":{"line":87,"column":4},"end":{"line":89,"column":5}},"type":"if","locations":[{"start":{"line":87,"column":4},"end":{"line":89,"column":5}},{"start":{"line":87,"column":4},"end":{"line":89,"column":5}}],"line":87},"6":{"loc":{"start":{"line":92,"column":28},"end":{"line":92,"column":77}},"type":"binary-expr","locations":[{"start":{"line":92,"column":28},"end":{"line":92,"column":71}},{"start":{"line":92,"column":75},"end":{"line":92,"column":77}}],"line":92},"7":{"loc":{"start":{"line":95,"column":4},"end":{"line":116,"column":5}},"type":"if","locations":[{"start":{"line":95,"column":4},"end":{"line":116,"column":5}},{"start":{"line":95,"column":4},"end":{"line":116,"column":5}}],"line":95},"8":{"loc":{"start":{"line":97,"column":27},"end":{"line":97,"column":71}},"type":"cond-expr","locations":[{"start":{"line":97,"column":44},"end":{"line":97,"column":52}},{"start":{"line":97,"column":55},"end":{"line":97,"column":71}}],"line":97},"9":{"loc":{"start":{"line":102,"column":8},"end":{"line":114,"column":9}},"type":"if","locations":[{"start":{"line":102,"column":8},"end":{"line":114,"column":9}},{"start":{"line":102,"column":8},"end":{"line":114,"column":9}}],"line":102},"10":{"loc":{"start":{"line":103,"column":10},"end":{"line":106,"column":33}},"type":"binary-expr","locations":[{"start":{"line":103,"column":10},"end":{"line":103,"column":39}},{"start":{"line":104,"column":10},"end":{"line":104,"column":31}},{"start":{"line":105,"column":10},"end":{"line":105,"column":28}},{"start":{"line":106,"column":10},"end":{"line":106,"column":33}}],"line":103},"11":{"loc":{"start":{"line":119,"column":4},"end":{"line":125,"column":5}},"type":"if","locations":[{"start":{"line":119,"column":4},"end":{"line":125,"column":5}},{"start":{"line":119,"column":4},"end":{"line":125,"column":5}}],"line":119},"12":{"loc":{"start":{"line":130,"column":4},"end":{"line":136,"column":5}},"type":"if","locations":[{"start":{"line":130,"column":4},"end":{"line":136,"column":5}},{"start":{"line":130,"column":4},"end":{"line":136,"column":5}}],"line":130},"13":{"loc":{"start":{"line":139,"column":4},"end":{"line":149,"column":5}},"type":"if","locations":[{"start":{"line":139,"column":4},"end":{"line":149,"column":5}},{"start":{"line":139,"column":4},"end":{"line":149,"column":5}}],"line":139},"14":{"loc":{"start":{"line":151,"column":4},"end":{"line":153,"column":5}},"type":"if","locations":[{"start":{"line":151,"column":4},"end":{"line":153,"column":5}},{"start":{"line":151,"column":4},"end":{"line":153,"column":5}}],"line":151},"15":{"loc":{"start":{"line":151,"column":8},"end":{"line":151,"column":38}},"type":"binary-expr","locations":[{"start":{"line":151,"column":8},"end":{"line":151,"column":15}},{"start":{"line":151,"column":19},"end":{"line":151,"column":38}}],"line":151},"16":{"loc":{"start":{"line":156,"column":9},"end":{"line":252,"column":3}},"type":"if","locations":[{"start":{"line":156,"column":9},"end":{"line":252,"column":3}},{"start":{"line":156,"column":9},"end":{"line":252,"column":3}}],"line":156},"17":{"loc":{"start":{"line":158,"column":4},"end":{"line":163,"column":5}},"type":"if","locations":[{"start":{"line":158,"column":4},"end":{"line":163,"column":5}},{"start":{"line":158,"column":4},"end":{"line":163,"column":5}}],"line":158},"18":{"loc":{"start":{"line":158,"column":8},"end":{"line":158,"column":38}},"type":"binary-expr","locations":[{"start":{"line":158,"column":8},"end":{"line":158,"column":15}},{"start":{"line":158,"column":19},"end":{"line":158,"column":38}}],"line":158},"19":{"loc":{"start":{"line":176,"column":4},"end":{"line":189,"column":5}},"type":"if","locations":[{"start":{"line":176,"column":4},"end":{"line":189,"column":5}},{"start":{"line":176,"column":4},"end":{"line":189,"column":5}}],"line":176},"20":{"loc":{"start":{"line":177,"column":6},"end":{"line":187,"column":7}},"type":"if","locations":[{"start":{"line":177,"column":6},"end":{"line":187,"column":7}},{"start":{"line":177,"column":6},"end":{"line":187,"column":7}}],"line":177},"21":{"loc":{"start":{"line":177,"column":10},"end":{"line":177,"column":25}},"type":"binary-expr","locations":[{"start":{"line":177,"column":10},"end":{"line":177,"column":16}},{"start":{"line":177,"column":20},"end":{"line":177,"column":25}}],"line":177},"22":{"loc":{"start":{"line":192,"column":4},"end":{"line":222,"column":5}},"type":"if","locations":[{"start":{"line":192,"column":4},"end":{"line":222,"column":5}},{"start":{"line":192,"column":4},"end":{"line":222,"column":5}}],"line":192},"23":{"loc":{"start":{"line":192,"column":8},"end":{"line":192,"column":72}},"type":"binary-expr","locations":[{"start":{"line":192,"column":8},"end":{"line":192,"column":53}},{"start":{"line":192,"column":57},"end":{"line":192,"column":63}},{"start":{"line":192,"column":67},"end":{"line":192,"column":72}}],"line":192},"24":{"loc":{"start":{"line":193,"column":23},"end":{"line":193,"column":47}},"type":"binary-expr","locations":[{"start":{"line":193,"column":23},"end":{"line":193,"column":41}},{"start":{"line":193,"column":45},"end":{"line":193,"column":47}}],"line":193},"25":{"loc":{"start":{"line":196,"column":6},"end":{"line":198,"column":7}},"type":"if","locations":[{"start":{"line":196,"column":6},"end":{"line":198,"column":7}},{"start":{"line":196,"column":6},"end":{"line":198,"column":7}}],"line":196},"26":{"loc":{"start":{"line":211,"column":6},"end":{"line":221,"column":7}},"type":"if","locations":[{"start":{"line":211,"column":6},"end":{"line":221,"column":7}},{"start":{"line":211,"column":6},"end":{"line":221,"column":7}}],"line":211},"27":{"loc":{"start":{"line":224,"column":4},"end":{"line":251,"column":5}},"type":"if","locations":[{"start":{"line":224,"column":4},"end":{"line":251,"column":5}},{"start":{"line":224,"column":4},"end":{"line":251,"column":5}}],"line":224},"28":{"loc":{"start":{"line":225,"column":6},"end":{"line":229,"column":7}},"type":"if","locations":[{"start":{"line":225,"column":6},"end":{"line":229,"column":7}},{"start":{"line":225,"column":6},"end":{"line":229,"column":7}}],"line":225},"29":{"loc":{"start":{"line":225,"column":10},"end":{"line":225,"column":64}},"type":"binary-expr","locations":[{"start":{"line":225,"column":10},"end":{"line":225,"column":55}},{"start":{"line":225,"column":59},"end":{"line":225,"column":64}}],"line":225},"30":{"loc":{"start":{"line":233,"column":6},"end":{"line":241,"column":7}},"type":"if","locations":[{"start":{"line":233,"column":6},"end":{"line":241,"column":7}},{"start":{"line":233,"column":6},"end":{"line":241,"column":7}}],"line":233},"31":{"loc":{"start":{"line":236,"column":10},"end":{"line":236,"column":50}},"type":"binary-expr","locations":[{"start":{"line":236,"column":10},"end":{"line":236,"column":23}},{"start":{"line":236,"column":27},"end":{"line":236,"column":50}}],"line":236},"32":{"loc":{"start":{"line":244,"column":26},"end":{"line":244,"column":79}},"type":"cond-expr","locations":[{"start":{"line":244,"column":48},"end":{"line":244,"column":67}},{"start":{"line":244,"column":70},"end":{"line":244,"column":79}}],"line":244},"33":{"loc":{"start":{"line":245,"column":6},"end":{"line":249,"column":7}},"type":"if","locations":[{"start":{"line":245,"column":6},"end":{"line":249,"column":7}},{"start":{"line":245,"column":6},"end":{"line":249,"column":7}}],"line":245},"34":{"loc":{"start":{"line":265,"column":2},"end":{"line":287,"column":3}},"type":"switch","locations":[{"start":{"line":266,"column":4},"end":{"line":268,"column":12}},{"start":{"line":269,"column":4},"end":{"line":272,"column":12}},{"start":{"line":273,"column":4},"end":{"line":276,"column":12}},{"start":{"line":277,"column":4},"end":{"line":280,"column":12}},{"start":{"line":281,"column":4},"end":{"line":283,"column":12}},{"start":{"line":284,"column":4},"end":{"line":286,"column":76}}],"line":265},"35":{"loc":{"start":{"line":271,"column":15},"end":{"line":271,"column":53}},"type":"binary-expr","locations":[{"start":{"line":271,"column":15},"end":{"line":271,"column":27}},{"start":{"line":271,"column":31},"end":{"line":271,"column":53}}],"line":271},"36":{"loc":{"start":{"line":275,"column":25},"end":{"line":275,"column":65}},"type":"binary-expr","locations":[{"start":{"line":275,"column":25},"end":{"line":275,"column":38}},{"start":{"line":275,"column":42},"end":{"line":275,"column":65}}],"line":275},"37":{"loc":{"start":{"line":297,"column":2},"end":{"line":302,"column":3}},"type":"if","locations":[{"start":{"line":297,"column":2},"end":{"line":302,"column":3}},{"start":{"line":297,"column":2},"end":{"line":302,"column":3}}],"line":297},"38":{"loc":{"start":{"line":311,"column":2},"end":{"line":313,"column":3}},"type":"if","locations":[{"start":{"line":311,"column":2},"end":{"line":313,"column":3}},{"start":{"line":311,"column":2},"end":{"line":313,"column":3}}],"line":311},"39":{"loc":{"start":{"line":320,"column":2},"end":{"line":323,"column":3}},"type":"if","locations":[{"start":{"line":320,"column":2},"end":{"line":323,"column":3}},{"start":{"line":320,"column":2},"end":{"line":323,"column":3}}],"line":320},"40":{"loc":{"start":{"line":320,"column":6},"end":{"line":320,"column":50}},"type":"binary-expr","locations":[{"start":{"line":320,"column":6},"end":{"line":320,"column":28}},{"start":{"line":320,"column":32},"end":{"line":320,"column":50}}],"line":320},"41":{"loc":{"start":{"line":328,"column":8},"end":{"line":335,"column":9}},"type":"if","locations":[{"start":{"line":328,"column":8},"end":{"line":335,"column":9}},{"start":{"line":328,"column":8},"end":{"line":335,"column":9}}],"line":328},"42":{"loc":{"start":{"line":346,"column":10},"end":{"line":350,"column":17}},"type":"cond-expr","locations":[{"start":{"line":347,"column":14},"end":{"line":347,"column":35}},{"start":{"line":348,"column":14},"end":{"line":350,"column":17}}],"line":346},"43":{"loc":{"start":{"line":348,"column":14},"end":{"line":350,"column":17}},"type":"cond-expr","locations":[{"start":{"line":349,"column":14},"end":{"line":349,"column":24}},{"start":{"line":350,"column":14},"end":{"line":350,"column":17}}],"line":348},"44":{"loc":{"start":{"line":351,"column":10},"end":{"line":351,"column":69}},"type":"binary-expr","locations":[{"start":{"line":351,"column":10},"end":{"line":351,"column":23}},{"start":{"line":351,"column":27},"end":{"line":351,"column":69}}],"line":351}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":58,"11":1,"12":1,"13":6,"14":6,"15":6,"16":6,"17":6,"18":30,"19":46,"20":46,"21":46,"22":46,"23":2,"24":2,"25":46,"26":46,"27":46,"28":46,"29":46,"30":6,"31":0,"32":6,"33":6,"34":6,"35":6,"36":6,"37":6,"38":19,"39":12,"40":12,"41":6,"42":3,"43":3,"44":6,"45":6,"46":6,"47":6,"48":0,"49":6,"50":6,"51":6,"52":4,"53":6,"54":6,"55":40,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":40,"65":40,"66":8,"67":6,"68":6,"69":6,"70":6,"71":2,"72":32,"73":14,"74":14,"75":14,"76":14,"77":14,"78":14,"79":14,"80":14,"81":18,"82":18,"83":18,"84":18,"85":18,"86":18,"87":32,"88":26,"89":14,"90":12,"91":6,"92":6,"93":1,"94":5,"95":6,"96":6,"97":0,"98":6,"99":6,"100":38,"101":38,"102":38,"103":38,"104":38,"105":46,"106":46,"107":6,"108":6,"109":3,"110":3,"111":3,"112":1,"113":1,"114":1,"115":36,"116":36,"117":36,"118":0,"119":0,"120":0,"121":0,"122":46,"123":44,"124":14,"125":44,"126":46,"127":46,"128":46,"129":44,"130":44,"131":44,"132":44,"133":1,"134":1,"135":0,"136":0,"137":1,"138":2,"139":2,"140":0,"141":2,"142":0,"143":1,"144":1},"f":{"0":58,"1":6,"2":6,"3":30,"4":46,"5":19,"6":6,"7":46,"8":46,"9":1,"10":2},"b":{"0":[58,26,26,10],"1":[6,0],"2":[2,44],"3":[46,8],"4":[6,40],"5":[0,6],"6":[6,0],"7":[6,0],"8":[6,0],"9":[12,7],"10":[19,15,15,15],"11":[3,3],"12":[0,6],"13":[6,0],"14":[4,2],"15":[6,6],"16":[0,40],"17":[0,0],"18":[0,0],"19":[8,32],"20":[6,2],"21":[8,6],"22":[14,18],"23":[32,22,20],"24":[14,2],"25":[14,0],"26":[18,0],"27":[26,6],"28":[14,12],"29":[26,20],"30":[1,5],"31":[1,0],"32":[6,0],"33":[0,6],"34":[6,3,1,36,0,0],"35":[3,0],"36":[1,0],"37":[14,30],"38":[44,0],"39":[0,1],"40":[1,1],"41":[0,2],"42":[0,0],"43":[0,0],"44":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"57ab4d0ddeaf692f8152932efd17c10bfac66030"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\delighted\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\delighted\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":59}},"2":{"start":{"line":5,"column":26},"end":{"line":7,"column":1}},"3":{"start":{"line":8,"column":23},"end":{"line":8,"column":69}},"4":{"start":{"line":10,"column":34},"end":{"line":10,"column":78}},"5":{"start":{"line":12,"column":0},"end":{"line":16,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c1e87403d1970f78879c54cd81041edca54297b5"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\delighted\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\delighted\\transform.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":51}},"1":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"2":{"start":{"line":16,"column":15},"end":{"line":16,"column":41}},"3":{"start":{"line":23,"column":4},"end":{"line":23,"column":21}},"4":{"start":{"line":28,"column":4},"end":{"line":28,"column":23}},"5":{"start":{"line":30,"column":32},"end":{"line":83,"column":1}},"6":{"start":{"line":31,"column":17},"end":{"line":31,"column":64}},"7":{"start":{"line":32,"column":2},"end":{"line":34,"column":3}},"8":{"start":{"line":33,"column":4},"end":{"line":33,"column":66}},"9":{"start":{"line":36,"column":4},"end":{"line":36,"column":79}},"10":{"start":{"line":37,"column":2},"end":{"line":37,"column":34}},"11":{"start":{"line":38,"column":38},"end":{"line":38,"column":75}},"12":{"start":{"line":39,"column":18},"end":{"line":39,"column":60}},"13":{"start":{"line":41,"column":2},"end":{"line":41,"column":36}},"14":{"start":{"line":43,"column":2},"end":{"line":53,"column":3}},"15":{"start":{"line":44,"column":4},"end":{"line":47,"column":5}},"16":{"start":{"line":45,"column":6},"end":{"line":45,"column":34}},"17":{"start":{"line":46,"column":6},"end":{"line":46,"column":57}},"18":{"start":{"line":48,"column":9},"end":{"line":53,"column":3}},"19":{"start":{"line":49,"column":4},"end":{"line":52,"column":5}},"20":{"start":{"line":50,"column":6},"end":{"line":50,"column":27}},"21":{"start":{"line":51,"column":6},"end":{"line":51,"column":51}},"22":{"start":{"line":55,"column":2},"end":{"line":55,"column":23}},"23":{"start":{"line":56,"column":2},"end":{"line":56,"column":28}},"24":{"start":{"line":57,"column":2},"end":{"line":57,"column":36}},"25":{"start":{"line":58,"column":2},"end":{"line":67,"column":3}},"26":{"start":{"line":59,"column":18},"end":{"line":59,"column":64}},"27":{"start":{"line":60,"column":18},"end":{"line":60,"column":63}},"28":{"start":{"line":61,"column":17},"end":{"line":63,"column":13}},"29":{"start":{"line":64,"column":4},"end":{"line":66,"column":5}},"30":{"start":{"line":65,"column":6},"end":{"line":65,"column":26}},"31":{"start":{"line":68,"column":2},"end":{"line":71,"column":5}},"32":{"start":{"line":73,"column":20},"end":{"line":73,"column":65}},"33":{"start":{"line":74,"column":19},"end":{"line":74,"column":41}},"34":{"start":{"line":75,"column":2},"end":{"line":78,"column":4}},"35":{"start":{"line":79,"column":2},"end":{"line":79,"column":59}},"36":{"start":{"line":80,"column":2},"end":{"line":80,"column":31}},"37":{"start":{"line":81,"column":2},"end":{"line":81,"column":61}},"38":{"start":{"line":82,"column":2},"end":{"line":82,"column":18}},"39":{"start":{"line":85,"column":29},"end":{"line":146,"column":1}},"40":{"start":{"line":87,"column":23},"end":{"line":87,"column":53}},"41":{"start":{"line":88,"column":2},"end":{"line":93,"column":3}},"42":{"start":{"line":89,"column":4},"end":{"line":92,"column":6}},"43":{"start":{"line":95,"column":17},"end":{"line":95,"column":64}},"44":{"start":{"line":96,"column":2},"end":{"line":98,"column":3}},"45":{"start":{"line":97,"column":4},"end":{"line":97,"column":54}},"46":{"start":{"line":100,"column":4},"end":{"line":100,"column":79}},"47":{"start":{"line":101,"column":2},"end":{"line":101,"column":34}},"48":{"start":{"line":103,"column":38},"end":{"line":103,"column":75}},"49":{"start":{"line":106,"column":16},"end":{"line":106,"column":59}},"50":{"start":{"line":108,"column":2},"end":{"line":110,"column":3}},"51":{"start":{"line":109,"column":4},"end":{"line":109,"column":63}},"52":{"start":{"line":111,"column":16},"end":{"line":111,"column":18}},"53":{"start":{"line":112,"column":2},"end":{"line":112,"column":36}},"54":{"start":{"line":113,"column":2},"end":{"line":113,"column":22}},"55":{"start":{"line":114,"column":2},"end":{"line":114,"column":28}},"56":{"start":{"line":115,"column":2},"end":{"line":121,"column":3}},"57":{"start":{"line":116,"column":4},"end":{"line":116,"column":80}},"58":{"start":{"line":117,"column":4},"end":{"line":120,"column":6}},"59":{"start":{"line":122,"column":19},"end":{"line":122,"column":21}},"60":{"start":{"line":123,"column":2},"end":{"line":128,"column":4}},"61":{"start":{"line":129,"column":2},"end":{"line":134,"column":3}},"62":{"start":{"line":130,"column":4},"end":{"line":133,"column":6}},"63":{"start":{"line":136,"column":20},"end":{"line":136,"column":65}},"64":{"start":{"line":137,"column":19},"end":{"line":137,"column":41}},"65":{"start":{"line":138,"column":2},"end":{"line":141,"column":4}},"66":{"start":{"line":142,"column":2},"end":{"line":142,"column":59}},"67":{"start":{"line":143,"column":2},"end":{"line":143,"column":31}},"68":{"start":{"line":144,"column":2},"end":{"line":144,"column":61}},"69":{"start":{"line":145,"column":2},"end":{"line":145,"column":18}},"70":{"start":{"line":148,"column":29},"end":{"line":190,"column":1}},"71":{"start":{"line":150,"column":4},"end":{"line":150,"column":79}},"72":{"start":{"line":151,"column":2},"end":{"line":151,"column":34}},"73":{"start":{"line":153,"column":17},"end":{"line":153,"column":64}},"74":{"start":{"line":154,"column":2},"end":{"line":156,"column":3}},"75":{"start":{"line":155,"column":4},"end":{"line":155,"column":54}},"76":{"start":{"line":157,"column":18},"end":{"line":157,"column":20}},"77":{"start":{"line":158,"column":25},"end":{"line":158,"column":32}},"78":{"start":{"line":159,"column":2},"end":{"line":161,"column":3}},"79":{"start":{"line":160,"column":4},"end":{"line":160,"column":69}},"80":{"start":{"line":163,"column":4},"end":{"line":163,"column":75}},"81":{"start":{"line":164,"column":2},"end":{"line":167,"column":3}},"82":{"start":{"line":165,"column":4},"end":{"line":165,"column":31}},"83":{"start":{"line":166,"column":4},"end":{"line":166,"column":34}},"84":{"start":{"line":169,"column":4},"end":{"line":169,"column":73}},"85":{"start":{"line":170,"column":2},"end":{"line":173,"column":3}},"86":{"start":{"line":171,"column":4},"end":{"line":171,"column":38}},"87":{"start":{"line":172,"column":4},"end":{"line":172,"column":41}},"88":{"start":{"line":174,"column":2},"end":{"line":179,"column":3}},"89":{"start":{"line":175,"column":4},"end":{"line":178,"column":6}},"90":{"start":{"line":180,"column":20},"end":{"line":180,"column":65}},"91":{"start":{"line":181,"column":19},"end":{"line":181,"column":41}},"92":{"start":{"line":182,"column":2},"end":{"line":182,"column":59}},"93":{"start":{"line":183,"column":2},"end":{"line":183,"column":31}},"94":{"start":{"line":184,"column":2},"end":{"line":187,"column":4}},"95":{"start":{"line":188,"column":2},"end":{"line":188,"column":31}},"96":{"start":{"line":189,"column":2},"end":{"line":189,"column":18}},"97":{"start":{"line":192,"column":16},"end":{"line":222,"column":1}},"98":{"start":{"line":193,"column":35},"end":{"line":193,"column":40}},"99":{"start":{"line":194,"column":2},"end":{"line":199,"column":3}},"100":{"start":{"line":195,"column":4},"end":{"line":198,"column":6}},"101":{"start":{"line":201,"column":2},"end":{"line":203,"column":3}},"102":{"start":{"line":202,"column":4},"end":{"line":202,"column":70}},"103":{"start":{"line":205,"column":22},"end":{"line":205,"column":48}},"104":{"start":{"line":208,"column":2},"end":{"line":220,"column":3}},"105":{"start":{"line":210,"column":6},"end":{"line":210,"column":63}},"106":{"start":{"line":211,"column":6},"end":{"line":211,"column":12}},"107":{"start":{"line":213,"column":6},"end":{"line":213,"column":66}},"108":{"start":{"line":214,"column":6},"end":{"line":214,"column":12}},"109":{"start":{"line":216,"column":6},"end":{"line":216,"column":60}},"110":{"start":{"line":217,"column":6},"end":{"line":217,"column":12}},"111":{"start":{"line":219,"column":6},"end":{"line":219,"column":78}},"112":{"start":{"line":221,"column":2},"end":{"line":221,"column":18}},"113":{"start":{"line":224,"column":26},"end":{"line":252,"column":1}},"114":{"start":{"line":225,"column":2},"end":{"line":228,"column":3}},"115":{"start":{"line":226,"column":23},"end":{"line":226,"column":75}},"116":{"start":{"line":227,"column":4},"end":{"line":227,"column":24}},"117":{"start":{"line":230,"column":19},"end":{"line":250,"column":3}},"118":{"start":{"line":232,"column":6},"end":{"line":248,"column":7}},"119":{"start":{"line":233,"column":8},"end":{"line":237,"column":10}},"120":{"start":{"line":239,"column":8},"end":{"line":247,"column":10}},"121":{"start":{"line":251,"column":2},"end":{"line":251,"column":18}},"122":{"start":{"line":254,"column":0},"end":{"line":254,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":30,"column":32},"end":{"line":30,"column":33}},"loc":{"start":{"line":30,"column":57},"end":{"line":83,"column":1}},"line":30},"1":{"name":"(anonymous_1)","decl":{"start":{"line":85,"column":29},"end":{"line":85,"column":30}},"loc":{"start":{"line":85,"column":60},"end":{"line":146,"column":1}},"line":85},"2":{"name":"(anonymous_2)","decl":{"start":{"line":148,"column":29},"end":{"line":148,"column":30}},"loc":{"start":{"line":148,"column":54},"end":{"line":190,"column":1}},"line":148},"3":{"name":"(anonymous_3)","decl":{"start":{"line":192,"column":16},"end":{"line":192,"column":17}},"loc":{"start":{"line":192,"column":31},"end":{"line":222,"column":1}},"line":192},"4":{"name":"(anonymous_4)","decl":{"start":{"line":224,"column":26},"end":{"line":224,"column":27}},"loc":{"start":{"line":224,"column":42},"end":{"line":252,"column":1}},"line":224},"5":{"name":"(anonymous_5)","decl":{"start":{"line":231,"column":15},"end":{"line":231,"column":16}},"loc":{"start":{"line":231,"column":30},"end":{"line":249,"column":5}},"line":231}},"branchMap":{"0":{"loc":{"start":{"line":32,"column":2},"end":{"line":34,"column":3}},"type":"if","locations":[{"start":{"line":32,"column":2},"end":{"line":34,"column":3}},{"start":{"line":32,"column":2},"end":{"line":34,"column":3}}],"line":32},"1":{"loc":{"start":{"line":36,"column":4},"end":{"line":36,"column":79}},"type":"binary-expr","locations":[{"start":{"line":36,"column":4},"end":{"line":36,"column":61}},{"start":{"line":36,"column":65},"end":{"line":36,"column":79}}],"line":36},"2":{"loc":{"start":{"line":43,"column":2},"end":{"line":53,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":53,"column":3}},{"start":{"line":43,"column":2},"end":{"line":53,"column":3}}],"line":43},"3":{"loc":{"start":{"line":43,"column":6},"end":{"line":43,"column":52}},"type":"binary-expr","locations":[{"start":{"line":43,"column":6},"end":{"line":43,"column":28}},{"start":{"line":43,"column":32},"end":{"line":43,"column":52}}],"line":43},"4":{"loc":{"start":{"line":44,"column":4},"end":{"line":47,"column":5}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":47,"column":5}},{"start":{"line":44,"column":4},"end":{"line":47,"column":5}}],"line":44},"5":{"loc":{"start":{"line":48,"column":9},"end":{"line":53,"column":3}},"type":"if","locations":[{"start":{"line":48,"column":9},"end":{"line":53,"column":3}},{"start":{"line":48,"column":9},"end":{"line":53,"column":3}}],"line":48},"6":{"loc":{"start":{"line":48,"column":13},"end":{"line":48,"column":59}},"type":"binary-expr","locations":[{"start":{"line":48,"column":13},"end":{"line":48,"column":42}},{"start":{"line":48,"column":46},"end":{"line":48,"column":59}}],"line":48},"7":{"loc":{"start":{"line":49,"column":4},"end":{"line":52,"column":5}},"type":"if","locations":[{"start":{"line":49,"column":4},"end":{"line":52,"column":5}},{"start":{"line":49,"column":4},"end":{"line":52,"column":5}}],"line":49},"8":{"loc":{"start":{"line":57,"column":18},"end":{"line":57,"column":35}},"type":"binary-expr","locations":[{"start":{"line":57,"column":18},"end":{"line":57,"column":30}},{"start":{"line":57,"column":34},"end":{"line":57,"column":35}}],"line":57},"9":{"loc":{"start":{"line":58,"column":2},"end":{"line":67,"column":3}},"type":"if","locations":[{"start":{"line":58,"column":2},"end":{"line":67,"column":3}},{"start":{"line":58,"column":2},"end":{"line":67,"column":3}}],"line":58},"10":{"loc":{"start":{"line":61,"column":20},"end":{"line":61,"column":45}},"type":"cond-expr","locations":[{"start":{"line":61,"column":28},"end":{"line":61,"column":40}},{"start":{"line":61,"column":43},"end":{"line":61,"column":45}}],"line":61},"11":{"loc":{"start":{"line":62,"column":6},"end":{"line":62,"column":31}},"type":"cond-expr","locations":[{"start":{"line":62,"column":14},"end":{"line":62,"column":26}},{"start":{"line":62,"column":29},"end":{"line":62,"column":31}}],"line":62},"12":{"loc":{"start":{"line":64,"column":4},"end":{"line":66,"column":5}},"type":"if","locations":[{"start":{"line":64,"column":4},"end":{"line":66,"column":5}},{"start":{"line":64,"column":4},"end":{"line":66,"column":5}}],"line":64},"13":{"loc":{"start":{"line":88,"column":2},"end":{"line":93,"column":3}},"type":"if","locations":[{"start":{"line":88,"column":2},"end":{"line":93,"column":3}},{"start":{"line":88,"column":2},"end":{"line":93,"column":3}}],"line":88},"14":{"loc":{"start":{"line":96,"column":2},"end":{"line":98,"column":3}},"type":"if","locations":[{"start":{"line":96,"column":2},"end":{"line":98,"column":3}},{"start":{"line":96,"column":2},"end":{"line":98,"column":3}}],"line":96},"15":{"loc":{"start":{"line":100,"column":4},"end":{"line":100,"column":79}},"type":"binary-expr","locations":[{"start":{"line":100,"column":4},"end":{"line":100,"column":61}},{"start":{"line":100,"column":65},"end":{"line":100,"column":79}}],"line":100},"16":{"loc":{"start":{"line":108,"column":2},"end":{"line":110,"column":3}},"type":"if","locations":[{"start":{"line":108,"column":2},"end":{"line":110,"column":3}},{"start":{"line":108,"column":2},"end":{"line":110,"column":3}}],"line":108},"17":{"loc":{"start":{"line":115,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":115,"column":2},"end":{"line":121,"column":3}},{"start":{"line":115,"column":2},"end":{"line":121,"column":3}}],"line":115},"18":{"loc":{"start":{"line":116,"column":29},"end":{"line":116,"column":74}},"type":"binary-expr","locations":[{"start":{"line":116,"column":29},"end":{"line":116,"column":41}},{"start":{"line":116,"column":45},"end":{"line":116,"column":69}},{"start":{"line":116,"column":73},"end":{"line":116,"column":74}}],"line":116},"19":{"loc":{"start":{"line":129,"column":2},"end":{"line":134,"column":3}},"type":"if","locations":[{"start":{"line":129,"column":2},"end":{"line":134,"column":3}},{"start":{"line":129,"column":2},"end":{"line":134,"column":3}}],"line":129},"20":{"loc":{"start":{"line":150,"column":4},"end":{"line":150,"column":79}},"type":"binary-expr","locations":[{"start":{"line":150,"column":4},"end":{"line":150,"column":61}},{"start":{"line":150,"column":65},"end":{"line":150,"column":79}}],"line":150},"21":{"loc":{"start":{"line":154,"column":2},"end":{"line":156,"column":3}},"type":"if","locations":[{"start":{"line":154,"column":2},"end":{"line":156,"column":3}},{"start":{"line":154,"column":2},"end":{"line":156,"column":3}}],"line":154},"22":{"loc":{"start":{"line":159,"column":2},"end":{"line":161,"column":3}},"type":"if","locations":[{"start":{"line":159,"column":2},"end":{"line":161,"column":3}},{"start":{"line":159,"column":2},"end":{"line":161,"column":3}}],"line":159},"23":{"loc":{"start":{"line":163,"column":4},"end":{"line":163,"column":75}},"type":"binary-expr","locations":[{"start":{"line":163,"column":4},"end":{"line":163,"column":23}},{"start":{"line":163,"column":27},"end":{"line":163,"column":51}},{"start":{"line":163,"column":55},"end":{"line":163,"column":75}}],"line":163},"24":{"loc":{"start":{"line":164,"column":2},"end":{"line":167,"column":3}},"type":"if","locations":[{"start":{"line":164,"column":2},"end":{"line":167,"column":3}},{"start":{"line":164,"column":2},"end":{"line":167,"column":3}}],"line":164},"25":{"loc":{"start":{"line":169,"column":4},"end":{"line":169,"column":73}},"type":"binary-expr","locations":[{"start":{"line":169,"column":4},"end":{"line":169,"column":21}},{"start":{"line":169,"column":25},"end":{"line":169,"column":49}},{"start":{"line":169,"column":53},"end":{"line":169,"column":73}}],"line":169},"26":{"loc":{"start":{"line":170,"column":2},"end":{"line":173,"column":3}},"type":"if","locations":[{"start":{"line":170,"column":2},"end":{"line":173,"column":3}},{"start":{"line":170,"column":2},"end":{"line":173,"column":3}}],"line":170},"27":{"loc":{"start":{"line":174,"column":2},"end":{"line":179,"column":3}},"type":"if","locations":[{"start":{"line":174,"column":2},"end":{"line":179,"column":3}},{"start":{"line":174,"column":2},"end":{"line":179,"column":3}}],"line":174},"28":{"loc":{"start":{"line":174,"column":6},"end":{"line":174,"column":30}},"type":"binary-expr","locations":[{"start":{"line":174,"column":6},"end":{"line":174,"column":16}},{"start":{"line":174,"column":20},"end":{"line":174,"column":30}}],"line":174},"29":{"loc":{"start":{"line":194,"column":2},"end":{"line":199,"column":3}},"type":"if","locations":[{"start":{"line":194,"column":2},"end":{"line":199,"column":3}},{"start":{"line":194,"column":2},"end":{"line":199,"column":3}}],"line":194},"30":{"loc":{"start":{"line":201,"column":2},"end":{"line":203,"column":3}},"type":"if","locations":[{"start":{"line":201,"column":2},"end":{"line":203,"column":3}},{"start":{"line":201,"column":2},"end":{"line":203,"column":3}}],"line":201},"31":{"loc":{"start":{"line":208,"column":2},"end":{"line":220,"column":3}},"type":"switch","locations":[{"start":{"line":209,"column":4},"end":{"line":211,"column":12}},{"start":{"line":212,"column":4},"end":{"line":214,"column":12}},{"start":{"line":215,"column":4},"end":{"line":217,"column":12}},{"start":{"line":218,"column":4},"end":{"line":219,"column":78}}],"line":208},"32":{"loc":{"start":{"line":225,"column":2},"end":{"line":228,"column":3}},"type":"if","locations":[{"start":{"line":225,"column":2},"end":{"line":228,"column":3}},{"start":{"line":225,"column":2},"end":{"line":228,"column":3}}],"line":225},"33":{"loc":{"start":{"line":225,"column":6},"end":{"line":225,"column":50}},"type":"binary-expr","locations":[{"start":{"line":225,"column":6},"end":{"line":225,"column":28}},{"start":{"line":225,"column":32},"end":{"line":225,"column":50}}],"line":225},"34":{"loc":{"start":{"line":241,"column":10},"end":{"line":245,"column":17}},"type":"cond-expr","locations":[{"start":{"line":242,"column":14},"end":{"line":242,"column":35}},{"start":{"line":243,"column":14},"end":{"line":245,"column":17}}],"line":241},"35":{"loc":{"start":{"line":243,"column":14},"end":{"line":245,"column":17}},"type":"cond-expr","locations":[{"start":{"line":244,"column":14},"end":{"line":244,"column":24}},{"start":{"line":245,"column":14},"end":{"line":245,"column":17}}],"line":243},"36":{"loc":{"start":{"line":246,"column":10},"end":{"line":246,"column":69}},"type":"binary-expr","locations":[{"start":{"line":246,"column":10},"end":{"line":246,"column":23}},{"start":{"line":246,"column":27},"end":{"line":246,"column":69}}],"line":246}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":4,"7":4,"8":0,"9":4,"10":4,"11":4,"12":3,"13":3,"14":3,"15":2,"16":0,"17":0,"18":1,"19":0,"20":0,"21":0,"22":3,"23":3,"24":3,"25":3,"26":3,"27":3,"28":3,"29":3,"30":3,"31":3,"32":3,"33":3,"34":3,"35":3,"36":3,"37":3,"38":3,"39":1,"40":4,"41":4,"42":1,"43":3,"44":3,"45":1,"46":2,"47":2,"48":2,"49":2,"50":2,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":4,"72":4,"73":4,"74":4,"75":1,"76":3,"77":3,"78":3,"79":0,"80":3,"81":3,"82":2,"83":2,"84":3,"85":3,"86":0,"87":0,"88":3,"89":1,"90":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":2,"97":1,"98":12,"99":12,"100":0,"101":12,"102":0,"103":12,"104":12,"105":4,"106":3,"107":4,"108":1,"109":4,"110":2,"111":0,"112":6,"113":1,"114":1,"115":0,"116":0,"117":1,"118":2,"119":2,"120":0,"121":1,"122":1},"f":{"0":4,"1":4,"2":4,"3":12,"4":1,"5":2},"b":{"0":[0,4],"1":[4,2],"2":[2,1],"3":[3,2],"4":[0,2],"5":[0,1],"6":[1,1],"7":[0,0],"8":[3,3],"9":[3,0],"10":[3,0],"11":[3,0],"12":[3,0],"13":[1,3],"14":[1,2],"15":[2,2],"16":[1,1],"17":[1,0],"18":[1,1,1],"19":[1,0],"20":[4,3],"21":[1,3],"22":[0,3],"23":[3,2,2],"24":[2,1],"25":[3,1,0],"26":[0,3],"27":[1,2],"28":[3,1],"29":[0,12],"30":[0,12],"31":[4,4,4,0],"32":[0,1],"33":[1,1],"34":[0,0],"35":[0,0],"36":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"66fdff7a271af6ab19394fcdfc14153a5349124d"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\delighted\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\delighted\\util.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":30}},"1":{"start":{"line":2,"column":45},"end":{"line":2,"column":66}},"2":{"start":{"line":3,"column":21},"end":{"line":3,"column":40}},"3":{"start":{"line":5,"column":21},"end":{"line":8,"column":1}},"4":{"start":{"line":6,"column":13},"end":{"line":6,"column":164}},"5":{"start":{"line":7,"column":2},"end":{"line":7,"column":46}},"6":{"start":{"line":9,"column":21},"end":{"line":12,"column":1}},"7":{"start":{"line":10,"column":22},"end":{"line":10,"column":42}},"8":{"start":{"line":11,"column":2},"end":{"line":11,"column":41}},"9":{"start":{"line":14,"column":29},"end":{"line":37,"column":1}},"10":{"start":{"line":15,"column":2},"end":{"line":31,"column":3}},"11":{"start":{"line":16,"column":4},"end":{"line":21,"column":5}},"12":{"start":{"line":17,"column":6},"end":{"line":20,"column":8}},"13":{"start":{"line":22,"column":9},"end":{"line":31,"column":3}},"14":{"start":{"line":23,"column":4},"end":{"line":28,"column":5}},"15":{"start":{"line":24,"column":6},"end":{"line":27,"column":8}},"16":{"start":{"line":30,"column":4},"end":{"line":30,"column":55}},"17":{"start":{"line":33,"column":2},"end":{"line":36,"column":4}},"18":{"start":{"line":39,"column":21},"end":{"line":91,"column":1}},"19":{"start":{"line":40,"column":21},"end":{"line":40,"column":23}},"20":{"start":{"line":41,"column":2},"end":{"line":45,"column":3}},"21":{"start":{"line":42,"column":4},"end":{"line":42,"column":30}},"22":{"start":{"line":43,"column":9},"end":{"line":45,"column":3}},"23":{"start":{"line":44,"column":4},"end":{"line":44,"column":37}},"24":{"start":{"line":47,"column":20},"end":{"line":47,"column":65}},"25":{"start":{"line":49,"column":2},"end":{"line":90,"column":3}},"26":{"start":{"line":50,"column":4},"end":{"line":56,"column":7}},"27":{"start":{"line":57,"column":4},"end":{"line":64,"column":5}},"28":{"start":{"line":63,"column":6},"end":{"line":63,"column":40}},"29":{"start":{"line":65,"column":4},"end":{"line":65,"column":40}},"30":{"start":{"line":67,"column":17},"end":{"line":67,"column":19}},"31":{"start":{"line":68,"column":20},"end":{"line":68,"column":23}},"32":{"start":{"line":69,"column":4},"end":{"line":85,"column":5}},"33":{"start":{"line":70,"column":6},"end":{"line":70,"column":51}},"34":{"start":{"line":71,"column":6},"end":{"line":84,"column":7}},"35":{"start":{"line":76,"column":10},"end":{"line":76,"column":26}},"36":{"start":{"line":77,"column":10},"end":{"line":77,"column":16}},"37":{"start":{"line":80,"column":10},"end":{"line":80,"column":26}},"38":{"start":{"line":81,"column":10},"end":{"line":81,"column":16}},"39":{"start":{"line":83,"column":10},"end":{"line":83,"column":26}},"40":{"start":{"line":86,"column":4},"end":{"line":89,"column":6}},"41":{"start":{"line":92,"column":22},"end":{"line":106,"column":1}},"42":{"start":{"line":93,"column":16},"end":{"line":93,"column":53}},"43":{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},"44":{"start":{"line":95,"column":4},"end":{"line":95,"column":50}},"45":{"start":{"line":97,"column":13},"end":{"line":97,"column":18}},"46":{"start":{"line":98,"column":2},"end":{"line":104,"column":5}},"47":{"start":{"line":99,"column":4},"end":{"line":103,"column":5}},"48":{"start":{"line":100,"column":6},"end":{"line":102,"column":7}},"49":{"start":{"line":101,"column":8},"end":{"line":101,"column":20}},"50":{"start":{"line":105,"column":2},"end":{"line":105,"column":14}},"51":{"start":{"line":108,"column":0},"end":{"line":114,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":21},"end":{"line":5,"column":22}},"loc":{"start":{"line":5,"column":30},"end":{"line":8,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":21},"end":{"line":9,"column":22}},"loc":{"start":{"line":9,"column":30},"end":{"line":12,"column":1}},"line":9},"2":{"name":"(anonymous_2)","decl":{"start":{"line":14,"column":29},"end":{"line":14,"column":30}},"loc":{"start":{"line":14,"column":50},"end":{"line":37,"column":1}},"line":14},"3":{"name":"(anonymous_3)","decl":{"start":{"line":39,"column":21},"end":{"line":39,"column":22}},"loc":{"start":{"line":39,"column":56},"end":{"line":91,"column":1}},"line":39},"4":{"name":"(anonymous_4)","decl":{"start":{"line":92,"column":22},"end":{"line":92,"column":23}},"loc":{"start":{"line":92,"column":43},"end":{"line":106,"column":1}},"line":92},"5":{"name":"(anonymous_5)","decl":{"start":{"line":98,"column":36},"end":{"line":98,"column":37}},"loc":{"start":{"line":98,"column":49},"end":{"line":104,"column":3}},"line":98}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":2},"end":{"line":31,"column":3}},"type":"if","locations":[{"start":{"line":15,"column":2},"end":{"line":31,"column":3}},{"start":{"line":15,"column":2},"end":{"line":31,"column":3}}],"line":15},"1":{"loc":{"start":{"line":16,"column":4},"end":{"line":21,"column":5}},"type":"if","locations":[{"start":{"line":16,"column":4},"end":{"line":21,"column":5}},{"start":{"line":16,"column":4},"end":{"line":21,"column":5}}],"line":16},"2":{"loc":{"start":{"line":22,"column":9},"end":{"line":31,"column":3}},"type":"if","locations":[{"start":{"line":22,"column":9},"end":{"line":31,"column":3}},{"start":{"line":22,"column":9},"end":{"line":31,"column":3}}],"line":22},"3":{"loc":{"start":{"line":23,"column":4},"end":{"line":28,"column":5}},"type":"if","locations":[{"start":{"line":23,"column":4},"end":{"line":28,"column":5}},{"start":{"line":23,"column":4},"end":{"line":28,"column":5}}],"line":23},"4":{"loc":{"start":{"line":34,"column":16},"end":{"line":34,"column":60}},"type":"cond-expr","locations":[{"start":{"line":34,"column":36},"end":{"line":34,"column":50}},{"start":{"line":34,"column":53},"end":{"line":34,"column":60}}],"line":34},"5":{"loc":{"start":{"line":41,"column":2},"end":{"line":45,"column":3}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":45,"column":3}},{"start":{"line":41,"column":2},"end":{"line":45,"column":3}}],"line":41},"6":{"loc":{"start":{"line":43,"column":9},"end":{"line":45,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":9},"end":{"line":45,"column":3}},{"start":{"line":43,"column":9},"end":{"line":45,"column":3}}],"line":43},"7":{"loc":{"start":{"line":57,"column":4},"end":{"line":64,"column":5}},"type":"if","locations":[{"start":{"line":57,"column":4},"end":{"line":64,"column":5}},{"start":{"line":57,"column":4},"end":{"line":64,"column":5}}],"line":57},"8":{"loc":{"start":{"line":58,"column":6},"end":{"line":61,"column":34}},"type":"binary-expr","locations":[{"start":{"line":58,"column":6},"end":{"line":58,"column":14}},{"start":{"line":59,"column":6},"end":{"line":59,"column":19}},{"start":{"line":60,"column":6},"end":{"line":60,"column":29}},{"start":{"line":61,"column":6},"end":{"line":61,"column":34}}],"line":58},"9":{"loc":{"start":{"line":69,"column":4},"end":{"line":85,"column":5}},"type":"if","locations":[{"start":{"line":69,"column":4},"end":{"line":85,"column":5}},{"start":{"line":69,"column":4},"end":{"line":85,"column":5}}],"line":69},"10":{"loc":{"start":{"line":69,"column":8},"end":{"line":69,"column":45}},"type":"binary-expr","locations":[{"start":{"line":69,"column":8},"end":{"line":69,"column":22}},{"start":{"line":69,"column":26},"end":{"line":69,"column":45}}],"line":69},"11":{"loc":{"start":{"line":71,"column":6},"end":{"line":84,"column":7}},"type":"switch","locations":[{"start":{"line":72,"column":8},"end":{"line":72,"column":17}},{"start":{"line":73,"column":8},"end":{"line":73,"column":17}},{"start":{"line":74,"column":8},"end":{"line":74,"column":17}},{"start":{"line":75,"column":8},"end":{"line":77,"column":16}},{"start":{"line":78,"column":8},"end":{"line":78,"column":17}},{"start":{"line":79,"column":8},"end":{"line":81,"column":16}},{"start":{"line":82,"column":8},"end":{"line":83,"column":26}}],"line":71},"12":{"loc":{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},"type":"if","locations":[{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},{"start":{"line":94,"column":2},"end":{"line":96,"column":3}}],"line":94},"13":{"loc":{"start":{"line":99,"column":4},"end":{"line":103,"column":5}},"type":"if","locations":[{"start":{"line":99,"column":4},"end":{"line":103,"column":5}},{"start":{"line":99,"column":4},"end":{"line":103,"column":5}}],"line":99},"14":{"loc":{"start":{"line":99,"column":8},"end":{"line":99,"column":62}},"type":"binary-expr","locations":[{"start":{"line":99,"column":8},"end":{"line":99,"column":23}},{"start":{"line":99,"column":27},"end":{"line":99,"column":62}}],"line":99},"15":{"loc":{"start":{"line":100,"column":6},"end":{"line":102,"column":7}},"type":"if","locations":[{"start":{"line":100,"column":6},"end":{"line":102,"column":7}},{"start":{"line":100,"column":6},"end":{"line":102,"column":7}}],"line":100}},"s":{"0":1,"1":1,"2":1,"3":1,"4":8,"5":8,"6":1,"7":5,"8":5,"9":1,"10":6,"11":4,"12":0,"13":2,"14":2,"15":1,"16":0,"17":5,"18":1,"19":2,"20":2,"21":2,"22":0,"23":0,"24":2,"25":2,"26":2,"27":2,"28":2,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":1,"42":4,"43":4,"44":0,"45":4,"46":4,"47":4,"48":3,"49":3,"50":4,"51":1},"f":{"0":8,"1":5,"2":6,"3":2,"4":4,"5":4},"b":{"0":[4,2],"1":[0,4],"2":[2,0],"3":[1,1],"4":[1,4],"5":[2,0],"6":[0,0],"7":[2,0],"8":[2,2,2,2],"9":[0,0],"10":[0,0],"11":[0,0,0,0,0,0,0],"12":[0,4],"13":[3,1],"14":[4,3],"15":[3,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"49cd8da794b30f7594af3046383a25d9d8bf8ffc"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\drip\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\drip\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":42}},"2":{"start":{"line":5,"column":26},"end":{"line":11,"column":1}},"3":{"start":{"line":13,"column":34},"end":{"line":39,"column":1}},"4":{"start":{"line":41,"column":34},"end":{"line":48,"column":1}},"5":{"start":{"line":50,"column":19},"end":{"line":58,"column":1}},"6":{"start":{"line":60,"column":25},"end":{"line":68,"column":1}},"7":{"start":{"line":69,"column":23},"end":{"line":69,"column":69}},"8":{"start":{"line":71,"column":0},"end":{"line":82,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ec1ccda64bd5ee44f5c3644b897c0e6b8f7cabfc"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\drip\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\drip\\transform.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":51}},"1":{"start":{"line":16,"column":4},"end":{"line":16,"column":25}},"2":{"start":{"line":17,"column":15},"end":{"line":17,"column":41}},"3":{"start":{"line":28,"column":4},"end":{"line":28,"column":23}},"4":{"start":{"line":35,"column":4},"end":{"line":35,"column":21}},"5":{"start":{"line":37,"column":32},"end":{"line":119,"column":1}},"6":{"start":{"line":38,"column":13},"end":{"line":38,"column":56}},"7":{"start":{"line":40,"column":14},"end":{"line":40,"column":56}},"8":{"start":{"line":41,"column":2},"end":{"line":44,"column":3}},"9":{"start":{"line":42,"column":4},"end":{"line":42,"column":17}},"10":{"start":{"line":43,"column":4},"end":{"line":43,"column":46}},"11":{"start":{"line":46,"column":17},"end":{"line":46,"column":60}},"12":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"13":{"start":{"line":48,"column":4},"end":{"line":48,"column":75}},"14":{"start":{"line":51,"column":16},"end":{"line":51,"column":58}},"15":{"start":{"line":52,"column":2},"end":{"line":58,"column":3}},"16":{"start":{"line":53,"column":24},"end":{"line":53,"column":26}},"17":{"start":{"line":54,"column":4},"end":{"line":56,"column":7}},"18":{"start":{"line":55,"column":6},"end":{"line":55,"column":72}},"19":{"start":{"line":57,"column":4},"end":{"line":57,"column":44}},"20":{"start":{"line":60,"column":2},"end":{"line":60,"column":18}},"21":{"start":{"line":61,"column":2},"end":{"line":61,"column":24}},"22":{"start":{"line":62,"column":2},"end":{"line":62,"column":27}},"23":{"start":{"line":64,"column":2},"end":{"line":71,"column":3}},"24":{"start":{"line":65,"column":17},"end":{"line":65,"column":58}},"25":{"start":{"line":66,"column":4},"end":{"line":70,"column":5}},"26":{"start":{"line":67,"column":29},"end":{"line":67,"column":51}},"27":{"start":{"line":68,"column":6},"end":{"line":68,"column":33}},"28":{"start":{"line":69,"column":6},"end":{"line":69,"column":32}},"29":{"start":{"line":72,"column":2},"end":{"line":83,"column":3}},"30":{"start":{"line":73,"column":23},"end":{"line":73,"column":25}},"31":{"start":{"line":74,"column":4},"end":{"line":79,"column":6}},"32":{"start":{"line":80,"column":4},"end":{"line":82,"column":5}},"33":{"start":{"line":81,"column":6},"end":{"line":81,"column":43}},"34":{"start":{"line":85,"column":2},"end":{"line":85,"column":50}},"35":{"start":{"line":86,"column":23},"end":{"line":88,"column":3}},"36":{"start":{"line":89,"column":20},"end":{"line":89,"column":65}},"37":{"start":{"line":90,"column":19},"end":{"line":90,"column":41}},"38":{"start":{"line":91,"column":2},"end":{"line":94,"column":4}},"39":{"start":{"line":95,"column":2},"end":{"line":95,"column":59}},"40":{"start":{"line":97,"column":4},"end":{"line":97,"column":76}},"41":{"start":{"line":98,"column":2},"end":{"line":115,"column":3}},"42":{"start":{"line":99,"column":18},"end":{"line":99,"column":73}},"43":{"start":{"line":100,"column":4},"end":{"line":102,"column":5}},"44":{"start":{"line":101,"column":6},"end":{"line":101,"column":66}},"45":{"start":{"line":104,"column":26},"end":{"line":104,"column":68}},"46":{"start":{"line":105,"column":4},"end":{"line":105,"column":34}},"47":{"start":{"line":107,"column":4},"end":{"line":107,"column":68}},"48":{"start":{"line":108,"column":33},"end":{"line":110,"column":5}},"49":{"start":{"line":112,"column":4},"end":{"line":112,"column":97}},"50":{"start":{"line":113,"column":4},"end":{"line":113,"column":46}},"51":{"start":{"line":114,"column":4},"end":{"line":114,"column":20}},"52":{"start":{"line":116,"column":2},"end":{"line":116,"column":71}},"53":{"start":{"line":117,"column":2},"end":{"line":117,"column":36}},"54":{"start":{"line":118,"column":2},"end":{"line":118,"column":18}},"55":{"start":{"line":121,"column":29},"end":{"line":219,"column":1}},"56":{"start":{"line":122,"column":13},"end":{"line":122,"column":56}},"57":{"start":{"line":124,"column":14},"end":{"line":128,"column":4}},"58":{"start":{"line":129,"column":2},"end":{"line":132,"column":3}},"59":{"start":{"line":130,"column":4},"end":{"line":130,"column":17}},"60":{"start":{"line":131,"column":4},"end":{"line":131,"column":48}},"61":{"start":{"line":133,"column":2},"end":{"line":135,"column":3}},"62":{"start":{"line":134,"column":4},"end":{"line":134,"column":64}},"63":{"start":{"line":137,"column":14},"end":{"line":137,"column":51}},"64":{"start":{"line":138,"column":2},"end":{"line":140,"column":3}},"65":{"start":{"line":139,"column":4},"end":{"line":139,"column":57}},"66":{"start":{"line":141,"column":2},"end":{"line":141,"column":37}},"67":{"start":{"line":143,"column":2},"end":{"line":151,"column":3}},"68":{"start":{"line":144,"column":18},"end":{"line":144,"column":49}},"69":{"start":{"line":145,"column":4},"end":{"line":150,"column":5}},"70":{"start":{"line":146,"column":6},"end":{"line":149,"column":8}},"71":{"start":{"line":152,"column":2},"end":{"line":179,"column":3}},"72":{"start":{"line":153,"column":20},"end":{"line":153,"column":58}},"73":{"start":{"line":154,"column":4},"end":{"line":154,"column":26}},"74":{"start":{"line":155,"column":4},"end":{"line":155,"column":27}},"75":{"start":{"line":157,"column":4},"end":{"line":160,"column":5}},"76":{"start":{"line":158,"column":6},"end":{"line":158,"column":33}},"77":{"start":{"line":159,"column":6},"end":{"line":159,"column":57}},"78":{"start":{"line":161,"column":24},"end":{"line":161,"column":75}},"79":{"start":{"line":162,"column":4},"end":{"line":167,"column":5}},"80":{"start":{"line":163,"column":23},"end":{"line":163,"column":46}},"81":{"start":{"line":164,"column":6},"end":{"line":166,"column":7}},"82":{"start":{"line":165,"column":8},"end":{"line":165,"column":33}},"83":{"start":{"line":168,"column":4},"end":{"line":168,"column":45}},"84":{"start":{"line":169,"column":22},"end":{"line":169,"column":67}},"85":{"start":{"line":170,"column":21},"end":{"line":170,"column":43}},"86":{"start":{"line":171,"column":4},"end":{"line":174,"column":6}},"87":{"start":{"line":175,"column":4},"end":{"line":175,"column":61}},"88":{"start":{"line":176,"column":4},"end":{"line":176,"column":84}},"89":{"start":{"line":177,"column":4},"end":{"line":177,"column":63}},"90":{"start":{"line":178,"column":4},"end":{"line":178,"column":20}},"91":{"start":{"line":181,"column":16},"end":{"line":181,"column":55}},"92":{"start":{"line":182,"column":2},"end":{"line":182,"column":25}},"93":{"start":{"line":183,"column":2},"end":{"line":183,"column":18}},"94":{"start":{"line":184,"column":2},"end":{"line":184,"column":24}},"95":{"start":{"line":185,"column":2},"end":{"line":188,"column":3}},"96":{"start":{"line":186,"column":4},"end":{"line":186,"column":31}},"97":{"start":{"line":187,"column":4},"end":{"line":187,"column":55}},"98":{"start":{"line":190,"column":2},"end":{"line":204,"column":3}},"99":{"start":{"line":191,"column":21},"end":{"line":191,"column":23}},"100":{"start":{"line":192,"column":4},"end":{"line":197,"column":6}},"101":{"start":{"line":198,"column":4},"end":{"line":203,"column":5}},"102":{"start":{"line":199,"column":6},"end":{"line":202,"column":8}},"103":{"start":{"line":205,"column":2},"end":{"line":205,"column":50}},"104":{"start":{"line":206,"column":23},"end":{"line":208,"column":3}},"105":{"start":{"line":209,"column":20},"end":{"line":209,"column":65}},"106":{"start":{"line":210,"column":19},"end":{"line":210,"column":41}},"107":{"start":{"line":211,"column":2},"end":{"line":214,"column":4}},"108":{"start":{"line":215,"column":2},"end":{"line":215,"column":59}},"109":{"start":{"line":216,"column":2},"end":{"line":216,"column":66}},"110":{"start":{"line":217,"column":2},"end":{"line":217,"column":36}},"111":{"start":{"line":218,"column":2},"end":{"line":218,"column":18}},"112":{"start":{"line":221,"column":16},"end":{"line":250,"column":1}},"113":{"start":{"line":222,"column":35},"end":{"line":222,"column":40}},"114":{"start":{"line":223,"column":2},"end":{"line":228,"column":3}},"115":{"start":{"line":224,"column":4},"end":{"line":227,"column":6}},"116":{"start":{"line":229,"column":2},"end":{"line":231,"column":3}},"117":{"start":{"line":230,"column":4},"end":{"line":230,"column":72}},"118":{"start":{"line":232,"column":2},"end":{"line":234,"column":3}},"119":{"start":{"line":233,"column":4},"end":{"line":233,"column":70}},"120":{"start":{"line":236,"column":22},"end":{"line":236,"column":48}},"121":{"start":{"line":239,"column":2},"end":{"line":248,"column":3}},"122":{"start":{"line":241,"column":6},"end":{"line":241,"column":69}},"123":{"start":{"line":242,"column":6},"end":{"line":242,"column":12}},"124":{"start":{"line":244,"column":6},"end":{"line":244,"column":66}},"125":{"start":{"line":245,"column":6},"end":{"line":245,"column":12}},"126":{"start":{"line":247,"column":6},"end":{"line":247,"column":78}},"127":{"start":{"line":249,"column":2},"end":{"line":249,"column":18}},"128":{"start":{"line":252,"column":26},"end":{"line":280,"column":1}},"129":{"start":{"line":253,"column":2},"end":{"line":256,"column":3}},"130":{"start":{"line":254,"column":23},"end":{"line":254,"column":75}},"131":{"start":{"line":255,"column":4},"end":{"line":255,"column":24}},"132":{"start":{"line":258,"column":19},"end":{"line":278,"column":3}},"133":{"start":{"line":260,"column":6},"end":{"line":276,"column":7}},"134":{"start":{"line":261,"column":8},"end":{"line":265,"column":10}},"135":{"start":{"line":267,"column":8},"end":{"line":275,"column":10}},"136":{"start":{"line":279,"column":2},"end":{"line":279,"column":18}},"137":{"start":{"line":282,"column":0},"end":{"line":282,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":37,"column":32},"end":{"line":37,"column":33}},"loc":{"start":{"line":37,"column":63},"end":{"line":119,"column":1}},"line":37},"1":{"name":"(anonymous_1)","decl":{"start":{"line":54,"column":42},"end":{"line":54,"column":43}},"loc":{"start":{"line":54,"column":49},"end":{"line":56,"column":5}},"line":54},"2":{"name":"(anonymous_2)","decl":{"start":{"line":121,"column":29},"end":{"line":121,"column":30}},"loc":{"start":{"line":121,"column":60},"end":{"line":219,"column":1}},"line":121},"3":{"name":"(anonymous_3)","decl":{"start":{"line":221,"column":16},"end":{"line":221,"column":17}},"loc":{"start":{"line":221,"column":31},"end":{"line":250,"column":1}},"line":221},"4":{"name":"(anonymous_4)","decl":{"start":{"line":252,"column":26},"end":{"line":252,"column":27}},"loc":{"start":{"line":252,"column":42},"end":{"line":280,"column":1}},"line":252},"5":{"name":"(anonymous_5)","decl":{"start":{"line":259,"column":15},"end":{"line":259,"column":16}},"loc":{"start":{"line":259,"column":30},"end":{"line":277,"column":5}},"line":259}},"branchMap":{"0":{"loc":{"start":{"line":41,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":44,"column":3}},{"start":{"line":41,"column":2},"end":{"line":44,"column":3}}],"line":41},"1":{"loc":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},{"start":{"line":47,"column":2},"end":{"line":49,"column":3}}],"line":47},"2":{"loc":{"start":{"line":47,"column":8},"end":{"line":47,"column":19}},"type":"binary-expr","locations":[{"start":{"line":47,"column":8},"end":{"line":47,"column":10}},{"start":{"line":47,"column":14},"end":{"line":47,"column":19}}],"line":47},"3":{"loc":{"start":{"line":52,"column":2},"end":{"line":58,"column":3}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":58,"column":3}},{"start":{"line":52,"column":2},"end":{"line":58,"column":3}}],"line":52},"4":{"loc":{"start":{"line":52,"column":6},"end":{"line":52,"column":52}},"type":"binary-expr","locations":[{"start":{"line":52,"column":6},"end":{"line":52,"column":22}},{"start":{"line":52,"column":26},"end":{"line":52,"column":52}}],"line":52},"5":{"loc":{"start":{"line":64,"column":2},"end":{"line":71,"column":3}},"type":"if","locations":[{"start":{"line":64,"column":2},"end":{"line":71,"column":3}},{"start":{"line":64,"column":2},"end":{"line":71,"column":3}}],"line":64},"6":{"loc":{"start":{"line":64,"column":6},"end":{"line":64,"column":47}},"type":"binary-expr","locations":[{"start":{"line":64,"column":6},"end":{"line":64,"column":25}},{"start":{"line":64,"column":29},"end":{"line":64,"column":47}}],"line":64},"7":{"loc":{"start":{"line":66,"column":4},"end":{"line":70,"column":5}},"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":70,"column":5}},{"start":{"line":66,"column":4},"end":{"line":70,"column":5}}],"line":66},"8":{"loc":{"start":{"line":66,"column":8},"end":{"line":66,"column":40}},"type":"binary-expr","locations":[{"start":{"line":66,"column":8},"end":{"line":66,"column":12}},{"start":{"line":66,"column":16},"end":{"line":66,"column":40}}],"line":66},"9":{"loc":{"start":{"line":72,"column":2},"end":{"line":83,"column":3}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":83,"column":3}},{"start":{"line":72,"column":2},"end":{"line":83,"column":3}}],"line":72},"10":{"loc":{"start":{"line":80,"column":4},"end":{"line":82,"column":5}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":82,"column":5}},{"start":{"line":80,"column":4},"end":{"line":82,"column":5}}],"line":80},"11":{"loc":{"start":{"line":97,"column":4},"end":{"line":97,"column":76}},"type":"binary-expr","locations":[{"start":{"line":97,"column":4},"end":{"line":97,"column":55}},{"start":{"line":97,"column":59},"end":{"line":97,"column":76}}],"line":97},"12":{"loc":{"start":{"line":98,"column":2},"end":{"line":115,"column":3}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":115,"column":3}},{"start":{"line":98,"column":2},"end":{"line":115,"column":3}}],"line":98},"13":{"loc":{"start":{"line":98,"column":6},"end":{"line":98,"column":25}},"type":"binary-expr","locations":[{"start":{"line":98,"column":6},"end":{"line":98,"column":16}},{"start":{"line":98,"column":20},"end":{"line":98,"column":25}}],"line":98},"14":{"loc":{"start":{"line":100,"column":4},"end":{"line":102,"column":5}},"type":"if","locations":[{"start":{"line":100,"column":4},"end":{"line":102,"column":5}},{"start":{"line":100,"column":4},"end":{"line":102,"column":5}}],"line":100},"15":{"loc":{"start":{"line":129,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":129,"column":2},"end":{"line":132,"column":3}},{"start":{"line":129,"column":2},"end":{"line":132,"column":3}}],"line":129},"16":{"loc":{"start":{"line":133,"column":2},"end":{"line":135,"column":3}},"type":"if","locations":[{"start":{"line":133,"column":2},"end":{"line":135,"column":3}},{"start":{"line":133,"column":2},"end":{"line":135,"column":3}}],"line":133},"17":{"loc":{"start":{"line":133,"column":6},"end":{"line":133,"column":19}},"type":"binary-expr","locations":[{"start":{"line":133,"column":6},"end":{"line":133,"column":9}},{"start":{"line":133,"column":13},"end":{"line":133,"column":19}}],"line":133},"18":{"loc":{"start":{"line":138,"column":2},"end":{"line":140,"column":3}},"type":"if","locations":[{"start":{"line":138,"column":2},"end":{"line":140,"column":3}},{"start":{"line":138,"column":2},"end":{"line":140,"column":3}}],"line":138},"19":{"loc":{"start":{"line":143,"column":2},"end":{"line":151,"column":3}},"type":"if","locations":[{"start":{"line":143,"column":2},"end":{"line":151,"column":3}},{"start":{"line":143,"column":2},"end":{"line":151,"column":3}}],"line":143},"20":{"loc":{"start":{"line":143,"column":6},"end":{"line":143,"column":39}},"type":"binary-expr","locations":[{"start":{"line":143,"column":6},"end":{"line":143,"column":32}},{"start":{"line":143,"column":36},"end":{"line":143,"column":39}}],"line":143},"21":{"loc":{"start":{"line":145,"column":4},"end":{"line":150,"column":5}},"type":"if","locations":[{"start":{"line":145,"column":4},"end":{"line":150,"column":5}},{"start":{"line":145,"column":4},"end":{"line":150,"column":5}}],"line":145},"22":{"loc":{"start":{"line":152,"column":2},"end":{"line":179,"column":3}},"type":"if","locations":[{"start":{"line":152,"column":2},"end":{"line":179,"column":3}},{"start":{"line":152,"column":2},"end":{"line":179,"column":3}}],"line":152},"23":{"loc":{"start":{"line":157,"column":4},"end":{"line":160,"column":5}},"type":"if","locations":[{"start":{"line":157,"column":4},"end":{"line":160,"column":5}},{"start":{"line":157,"column":4},"end":{"line":160,"column":5}}],"line":157},"24":{"loc":{"start":{"line":157,"column":8},"end":{"line":157,"column":69}},"type":"binary-expr","locations":[{"start":{"line":157,"column":8},"end":{"line":157,"column":27}},{"start":{"line":157,"column":31},"end":{"line":157,"column":69}}],"line":157},"25":{"loc":{"start":{"line":162,"column":4},"end":{"line":167,"column":5}},"type":"if","locations":[{"start":{"line":162,"column":4},"end":{"line":167,"column":5}},{"start":{"line":162,"column":4},"end":{"line":167,"column":5}}],"line":162},"26":{"loc":{"start":{"line":164,"column":6},"end":{"line":166,"column":7}},"type":"if","locations":[{"start":{"line":164,"column":6},"end":{"line":166,"column":7}},{"start":{"line":164,"column":6},"end":{"line":166,"column":7}}],"line":164},"27":{"loc":{"start":{"line":164,"column":10},"end":{"line":164,"column":41}},"type":"binary-expr","locations":[{"start":{"line":164,"column":10},"end":{"line":164,"column":18}},{"start":{"line":164,"column":22},"end":{"line":164,"column":41}}],"line":164},"28":{"loc":{"start":{"line":185,"column":2},"end":{"line":188,"column":3}},"type":"if","locations":[{"start":{"line":185,"column":2},"end":{"line":188,"column":3}},{"start":{"line":185,"column":2},"end":{"line":188,"column":3}}],"line":185},"29":{"loc":{"start":{"line":185,"column":6},"end":{"line":185,"column":67}},"type":"binary-expr","locations":[{"start":{"line":185,"column":6},"end":{"line":185,"column":25}},{"start":{"line":185,"column":29},"end":{"line":185,"column":67}}],"line":185},"30":{"loc":{"start":{"line":190,"column":2},"end":{"line":204,"column":3}},"type":"if","locations":[{"start":{"line":190,"column":2},"end":{"line":204,"column":3}},{"start":{"line":190,"column":2},"end":{"line":204,"column":3}}],"line":190},"31":{"loc":{"start":{"line":198,"column":4},"end":{"line":203,"column":5}},"type":"if","locations":[{"start":{"line":198,"column":4},"end":{"line":203,"column":5}},{"start":{"line":198,"column":4},"end":{"line":203,"column":5}}],"line":198},"32":{"loc":{"start":{"line":223,"column":2},"end":{"line":228,"column":3}},"type":"if","locations":[{"start":{"line":223,"column":2},"end":{"line":228,"column":3}},{"start":{"line":223,"column":2},"end":{"line":228,"column":3}}],"line":223},"33":{"loc":{"start":{"line":229,"column":2},"end":{"line":231,"column":3}},"type":"if","locations":[{"start":{"line":229,"column":2},"end":{"line":231,"column":3}},{"start":{"line":229,"column":2},"end":{"line":231,"column":3}}],"line":229},"34":{"loc":{"start":{"line":232,"column":2},"end":{"line":234,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":234,"column":3}},{"start":{"line":232,"column":2},"end":{"line":234,"column":3}}],"line":232},"35":{"loc":{"start":{"line":239,"column":2},"end":{"line":248,"column":3}},"type":"switch","locations":[{"start":{"line":240,"column":4},"end":{"line":242,"column":12}},{"start":{"line":243,"column":4},"end":{"line":245,"column":12}},{"start":{"line":246,"column":4},"end":{"line":247,"column":78}}],"line":239},"36":{"loc":{"start":{"line":253,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":253,"column":2},"end":{"line":256,"column":3}},{"start":{"line":253,"column":2},"end":{"line":256,"column":3}}],"line":253},"37":{"loc":{"start":{"line":253,"column":6},"end":{"line":253,"column":50}},"type":"binary-expr","locations":[{"start":{"line":253,"column":6},"end":{"line":253,"column":28}},{"start":{"line":253,"column":32},"end":{"line":253,"column":50}}],"line":253},"38":{"loc":{"start":{"line":269,"column":10},"end":{"line":273,"column":17}},"type":"cond-expr","locations":[{"start":{"line":270,"column":14},"end":{"line":270,"column":35}},{"start":{"line":271,"column":14},"end":{"line":273,"column":17}}],"line":269},"39":{"loc":{"start":{"line":271,"column":14},"end":{"line":273,"column":17}},"type":"cond-expr","locations":[{"start":{"line":272,"column":14},"end":{"line":272,"column":24}},{"start":{"line":273,"column":14},"end":{"line":273,"column":17}}],"line":271},"40":{"loc":{"start":{"line":274,"column":10},"end":{"line":274,"column":69}},"type":"binary-expr","locations":[{"start":{"line":274,"column":10},"end":{"line":274,"column":23}},{"start":{"line":274,"column":27},"end":{"line":274,"column":69}}],"line":274}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":5,"7":5,"8":5,"9":1,"10":1,"11":5,"12":5,"13":1,"14":4,"15":4,"16":0,"17":0,"18":0,"19":0,"20":4,"21":4,"22":4,"23":4,"24":2,"25":2,"26":2,"27":2,"28":2,"29":4,"30":2,"31":2,"32":2,"33":2,"34":4,"35":4,"36":4,"37":4,"38":4,"39":4,"40":4,"41":4,"42":1,"43":1,"44":0,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":3,"53":3,"54":3,"55":1,"56":9,"57":9,"58":9,"59":0,"60":0,"61":9,"62":0,"63":9,"64":9,"65":1,"66":8,"67":8,"68":6,"69":5,"70":0,"71":7,"72":2,"73":2,"74":2,"75":2,"76":0,"77":0,"78":2,"79":2,"80":1,"81":1,"82":1,"83":2,"84":2,"85":2,"86":2,"87":2,"88":2,"89":2,"90":2,"91":5,"92":5,"93":5,"94":5,"95":5,"96":0,"97":0,"98":5,"99":1,"100":1,"101":1,"102":1,"103":5,"104":5,"105":5,"106":5,"107":5,"108":5,"109":5,"110":5,"111":5,"112":1,"113":14,"114":14,"115":0,"116":14,"117":0,"118":14,"119":0,"120":14,"121":14,"122":5,"123":4,"124":9,"125":7,"126":0,"127":11,"128":1,"129":1,"130":0,"131":0,"132":1,"133":2,"134":2,"135":0,"136":1,"137":1},"f":{"0":5,"1":0,"2":9,"3":14,"4":1,"5":2},"b":{"0":[1,4],"1":[1,4],"2":[5,5],"3":[0,4],"4":[4,0],"5":[2,2],"6":[4,2],"7":[2,0],"8":[2,2],"9":[2,2],"10":[2,0],"11":[4,4],"12":[1,3],"13":[4,1],"14":[0,1],"15":[0,9],"16":[0,9],"17":[9,9],"18":[1,8],"19":[6,2],"20":[8,6],"21":[0,5],"22":[2,5],"23":[0,2],"24":[2,2],"25":[1,1],"26":[1,0],"27":[1,1],"28":[0,5],"29":[5,5],"30":[1,4],"31":[1,0],"32":[0,14],"33":[0,14],"34":[0,14],"35":[5,9,0],"36":[0,1],"37":[1,1],"38":[0,0],"39":[0,0],"40":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"7ece613e4de25f0a2bd9dfb2701cdc70cae0a067"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\drip\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\drip\\util.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":30}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":41}},"2":{"start":{"line":7,"column":4},"end":{"line":7,"column":25}},"3":{"start":{"line":8,"column":37},"end":{"line":8,"column":56}},"4":{"start":{"line":10,"column":21},"end":{"line":13,"column":1}},"5":{"start":{"line":11,"column":13},"end":{"line":11,"column":164}},"6":{"start":{"line":12,"column":2},"end":{"line":12,"column":46}},"7":{"start":{"line":15,"column":25},"end":{"line":18,"column":1}},"8":{"start":{"line":16,"column":13},"end":{"line":16,"column":145}},"9":{"start":{"line":17,"column":2},"end":{"line":17,"column":36}},"10":{"start":{"line":20,"column":19},"end":{"line":51,"column":1}},"11":{"start":{"line":21,"column":20},"end":{"line":21,"column":65}},"12":{"start":{"line":23,"column":2},"end":{"line":50,"column":3}},"13":{"start":{"line":24,"column":4},"end":{"line":32,"column":6}},"14":{"start":{"line":33,"column":4},"end":{"line":35,"column":5}},"15":{"start":{"line":34,"column":6},"end":{"line":34,"column":37}},"16":{"start":{"line":36,"column":4},"end":{"line":36,"column":41}},"17":{"start":{"line":38,"column":17},"end":{"line":38,"column":19}},"18":{"start":{"line":39,"column":20},"end":{"line":39,"column":23}},"19":{"start":{"line":40,"column":4},"end":{"line":45,"column":5}},"20":{"start":{"line":41,"column":6},"end":{"line":41,"column":47}},"21":{"start":{"line":42,"column":6},"end":{"line":44,"column":37}},"22":{"start":{"line":46,"column":4},"end":{"line":49,"column":6}},"23":{"start":{"line":53,"column":25},"end":{"line":80,"column":1}},"24":{"start":{"line":54,"column":2},"end":{"line":79,"column":3}},"25":{"start":{"line":55,"column":21},"end":{"line":64,"column":5}},"26":{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},"27":{"start":{"line":66,"column":6},"end":{"line":66,"column":64}},"28":{"start":{"line":68,"column":4},"end":{"line":68,"column":41}},"29":{"start":{"line":70,"column":17},"end":{"line":70,"column":19}},"30":{"start":{"line":71,"column":22},"end":{"line":71,"column":25}},"31":{"start":{"line":72,"column":4},"end":{"line":74,"column":5}},"32":{"start":{"line":73,"column":6},"end":{"line":73,"column":51}},"33":{"start":{"line":75,"column":4},"end":{"line":78,"column":6}},"34":{"start":{"line":82,"column":19},"end":{"line":97,"column":1}},"35":{"start":{"line":83,"column":19},"end":{"line":83,"column":21}},"36":{"start":{"line":84,"column":2},"end":{"line":95,"column":3}},"37":{"start":{"line":85,"column":4},"end":{"line":94,"column":7}},"38":{"start":{"line":86,"column":26},"end":{"line":86,"column":67}},"39":{"start":{"line":87,"column":6},"end":{"line":93,"column":7}},"40":{"start":{"line":88,"column":8},"end":{"line":88,"column":35}},"41":{"start":{"line":90,"column":8},"end":{"line":92,"column":10}},"42":{"start":{"line":96,"column":2},"end":{"line":96,"column":18}},"43":{"start":{"line":99,"column":0},"end":{"line":105,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":21},"end":{"line":10,"column":22}},"loc":{"start":{"line":10,"column":30},"end":{"line":13,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":15,"column":25},"end":{"line":15,"column":26}},"loc":{"start":{"line":15,"column":38},"end":{"line":18,"column":1}},"line":15},"2":{"name":"(anonymous_2)","decl":{"start":{"line":20,"column":19},"end":{"line":20,"column":20}},"loc":{"start":{"line":20,"column":41},"end":{"line":51,"column":1}},"line":20},"3":{"name":"(anonymous_3)","decl":{"start":{"line":53,"column":25},"end":{"line":53,"column":26}},"loc":{"start":{"line":53,"column":68},"end":{"line":80,"column":1}},"line":53},"4":{"name":"(anonymous_4)","decl":{"start":{"line":82,"column":19},"end":{"line":82,"column":20}},"loc":{"start":{"line":82,"column":34},"end":{"line":97,"column":1}},"line":82},"5":{"name":"(anonymous_5)","decl":{"start":{"line":85,"column":24},"end":{"line":85,"column":25}},"loc":{"start":{"line":85,"column":44},"end":{"line":94,"column":5}},"line":85}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":4},"end":{"line":35,"column":5}},"type":"if","locations":[{"start":{"line":33,"column":4},"end":{"line":35,"column":5}},{"start":{"line":33,"column":4},"end":{"line":35,"column":5}}],"line":33},"1":{"loc":{"start":{"line":33,"column":8},"end":{"line":33,"column":35}},"type":"binary-expr","locations":[{"start":{"line":33,"column":8},"end":{"line":33,"column":16}},{"start":{"line":33,"column":20},"end":{"line":33,"column":35}}],"line":33},"2":{"loc":{"start":{"line":40,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":40,"column":4},"end":{"line":45,"column":5}},{"start":{"line":40,"column":4},"end":{"line":45,"column":5}}],"line":40},"3":{"loc":{"start":{"line":41,"column":18},"end":{"line":41,"column":46}},"type":"binary-expr","locations":[{"start":{"line":41,"column":18},"end":{"line":41,"column":39}},{"start":{"line":41,"column":43},"end":{"line":41,"column":46}}],"line":41},"4":{"loc":{"start":{"line":42,"column":15},"end":{"line":44,"column":36}},"type":"cond-expr","locations":[{"start":{"line":43,"column":10},"end":{"line":43,"column":45}},{"start":{"line":44,"column":10},"end":{"line":44,"column":36}}],"line":42},"5":{"loc":{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},"type":"if","locations":[{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},{"start":{"line":65,"column":4},"end":{"line":67,"column":5}}],"line":65},"6":{"loc":{"start":{"line":66,"column":13},"end":{"line":66,"column":63}},"type":"binary-expr","locations":[{"start":{"line":66,"column":13},"end":{"line":66,"column":36}},{"start":{"line":66,"column":40},"end":{"line":66,"column":63}}],"line":66},"7":{"loc":{"start":{"line":72,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":72,"column":4},"end":{"line":74,"column":5}},{"start":{"line":72,"column":4},"end":{"line":74,"column":5}}],"line":72},"8":{"loc":{"start":{"line":72,"column":8},"end":{"line":72,"column":45}},"type":"binary-expr","locations":[{"start":{"line":72,"column":8},"end":{"line":72,"column":22}},{"start":{"line":72,"column":26},"end":{"line":72,"column":45}}],"line":72},"9":{"loc":{"start":{"line":84,"column":2},"end":{"line":95,"column":3}},"type":"if","locations":[{"start":{"line":84,"column":2},"end":{"line":95,"column":3}},{"start":{"line":84,"column":2},"end":{"line":95,"column":3}}],"line":84},"10":{"loc":{"start":{"line":87,"column":6},"end":{"line":93,"column":7}},"type":"if","locations":[{"start":{"line":87,"column":6},"end":{"line":93,"column":7}},{"start":{"line":87,"column":6},"end":{"line":93,"column":7}}],"line":87},"11":{"loc":{"start":{"line":87,"column":10},"end":{"line":87,"column":68}},"type":"binary-expr","locations":[{"start":{"line":87,"column":10},"end":{"line":87,"column":26}},{"start":{"line":87,"column":30},"end":{"line":87,"column":68}}],"line":87}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":14,"6":14,"7":1,"8":7,"9":7,"10":1,"11":6,"12":6,"13":6,"14":5,"15":5,"16":0,"17":1,"18":1,"19":1,"20":0,"21":0,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":0,"42":1,"43":1},"f":{"0":14,"1":7,"2":6,"3":1,"4":1,"5":1},"b":{"0":[5,0],"1":[5,5],"2":[0,1],"3":[0,0],"4":[0,0],"5":[1,0],"6":[1,0],"7":[0,0],"8":[0,0],"9":[1,0],"10":[1,0],"11":[1,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"9c4df3e967583eb703af818d5246e41dbde8e78a"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\eventbridge\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\eventbridge\\transform.js","statementMap":{"0":{"start":{"line":6,"column":4},"end":{"line":6,"column":25}},"1":{"start":{"line":10,"column":23},"end":{"line":10,"column":25}},"2":{"start":{"line":11,"column":14},"end":{"line":11,"column":19}},"3":{"start":{"line":12,"column":2},"end":{"line":19,"column":3}},"4":{"start":{"line":13,"column":4},"end":{"line":18,"column":7}},"5":{"start":{"line":14,"column":6},"end":{"line":14,"column":26}},"6":{"start":{"line":15,"column":6},"end":{"line":17,"column":7}},"7":{"start":{"line":16,"column":8},"end":{"line":16,"column":36}},"8":{"start":{"line":20,"column":2},"end":{"line":20,"column":22}},"9":{"start":{"line":26,"column":2},"end":{"line":48,"column":3}},"10":{"start":{"line":27,"column":4},"end":{"line":42,"column":5}},"11":{"start":{"line":28,"column":6},"end":{"line":35,"column":8}},"12":{"start":{"line":38,"column":6},"end":{"line":41,"column":8}},"13":{"start":{"line":44,"column":4},"end":{"line":47,"column":6}},"14":{"start":{"line":49,"column":2},"end":{"line":49,"column":48}},"15":{"start":{"line":52,"column":26},"end":{"line":89,"column":1}},"16":{"start":{"line":53,"column":2},"end":{"line":56,"column":3}},"17":{"start":{"line":54,"column":23},"end":{"line":54,"column":75}},"18":{"start":{"line":55,"column":4},"end":{"line":55,"column":24}},"19":{"start":{"line":58,"column":19},"end":{"line":87,"column":3}},"20":{"start":{"line":60,"column":6},"end":{"line":85,"column":7}},"21":{"start":{"line":61,"column":8},"end":{"line":68,"column":9}},"22":{"start":{"line":63,"column":10},"end":{"line":67,"column":12}},"23":{"start":{"line":70,"column":8},"end":{"line":74,"column":10}},"24":{"start":{"line":76,"column":8},"end":{"line":84,"column":10}},"25":{"start":{"line":88,"column":2},"end":{"line":88,"column":18}},"26":{"start":{"line":91,"column":0},"end":{"line":91,"column":48}}},"fnMap":{"0":{"name":"getResouceList","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":23}},"loc":{"start":{"line":8,"column":32},"end":{"line":21,"column":1}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":19},"end":{"line":13,"column":20}},"loc":{"start":{"line":13,"column":26},"end":{"line":18,"column":5}},"line":13},"2":{"name":"process","decl":{"start":{"line":23,"column":9},"end":{"line":23,"column":16}},"loc":{"start":{"line":23,"column":24},"end":{"line":50,"column":1}},"line":23},"3":{"name":"(anonymous_3)","decl":{"start":{"line":52,"column":26},"end":{"line":52,"column":27}},"loc":{"start":{"line":52,"column":42},"end":{"line":89,"column":1}},"line":52},"4":{"name":"(anonymous_4)","decl":{"start":{"line":59,"column":15},"end":{"line":59,"column":16}},"loc":{"start":{"line":59,"column":30},"end":{"line":86,"column":5}},"line":59}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":19,"column":3}},{"start":{"line":12,"column":2},"end":{"line":19,"column":3}}],"line":12},"1":{"loc":{"start":{"line":15,"column":6},"end":{"line":17,"column":7}},"type":"if","locations":[{"start":{"line":15,"column":6},"end":{"line":17,"column":7}},{"start":{"line":15,"column":6},"end":{"line":17,"column":7}}],"line":15},"2":{"loc":{"start":{"line":27,"column":4},"end":{"line":42,"column":5}},"type":"if","locations":[{"start":{"line":27,"column":4},"end":{"line":42,"column":5}},{"start":{"line":27,"column":4},"end":{"line":42,"column":5}}],"line":27},"3":{"loc":{"start":{"line":27,"column":8},"end":{"line":27,"column":53}},"type":"binary-expr","locations":[{"start":{"line":27,"column":8},"end":{"line":27,"column":25}},{"start":{"line":27,"column":29},"end":{"line":27,"column":53}}],"line":27},"4":{"loc":{"start":{"line":34,"column":16},"end":{"line":34,"column":65}},"type":"binary-expr","locations":[{"start":{"line":34,"column":16},"end":{"line":34,"column":36}},{"start":{"line":34,"column":40},"end":{"line":34,"column":65}}],"line":34},"5":{"loc":{"start":{"line":45,"column":6},"end":{"line":45,"column":51}},"type":"binary-expr","locations":[{"start":{"line":45,"column":6},"end":{"line":45,"column":19}},{"start":{"line":45,"column":23},"end":{"line":45,"column":51}}],"line":45},"6":{"loc":{"start":{"line":46,"column":6},"end":{"line":46,"column":25}},"type":"binary-expr","locations":[{"start":{"line":46,"column":6},"end":{"line":46,"column":18}},{"start":{"line":46,"column":22},"end":{"line":46,"column":25}}],"line":46},"7":{"loc":{"start":{"line":53,"column":2},"end":{"line":56,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":56,"column":3}},{"start":{"line":53,"column":2},"end":{"line":56,"column":3}}],"line":53},"8":{"loc":{"start":{"line":53,"column":6},"end":{"line":53,"column":50}},"type":"binary-expr","locations":[{"start":{"line":53,"column":6},"end":{"line":53,"column":28}},{"start":{"line":53,"column":32},"end":{"line":53,"column":50}}],"line":53},"9":{"loc":{"start":{"line":61,"column":8},"end":{"line":68,"column":9}},"type":"if","locations":[{"start":{"line":61,"column":8},"end":{"line":68,"column":9}},{"start":{"line":61,"column":8},"end":{"line":68,"column":9}}],"line":61},"10":{"loc":{"start":{"line":78,"column":10},"end":{"line":82,"column":17}},"type":"cond-expr","locations":[{"start":{"line":79,"column":14},"end":{"line":79,"column":35}},{"start":{"line":80,"column":14},"end":{"line":82,"column":17}}],"line":78},"11":{"loc":{"start":{"line":80,"column":14},"end":{"line":82,"column":17}},"type":"cond-expr","locations":[{"start":{"line":81,"column":14},"end":{"line":81,"column":24}},{"start":{"line":82,"column":14},"end":{"line":82,"column":17}}],"line":80},"12":{"loc":{"start":{"line":83,"column":10},"end":{"line":83,"column":69}},"type":"binary-expr","locations":[{"start":{"line":83,"column":10},"end":{"line":83,"column":23}},{"start":{"line":83,"column":27},"end":{"line":83,"column":69}}],"line":83}},"s":{"0":1,"1":2,"2":2,"3":2,"4":2,"5":4,"6":4,"7":4,"8":2,"9":3,"10":3,"11":2,"12":1,"13":1,"14":2,"15":1,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":1},"f":{"0":2,"1":4,"2":3,"3":0,"4":0},"b":{"0":[2,0],"1":[4,0],"2":[2,1],"3":[3,3],"4":[2,1],"5":[1,0],"6":[1,1],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"84883bfc53e571aaafb3287d9f75000b21c8860c"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\facebook_pixel\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\facebook_pixel\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":26},"end":{"line":56,"column":1}},"2":{"start":{"line":58,"column":23},"end":{"line":58,"column":69}},"3":{"start":{"line":59,"column":30},"end":{"line":67,"column":1}},"4":{"start":{"line":69,"column":35},"end":{"line":69,"column":75}},"5":{"start":{"line":70,"column":35},"end":{"line":77,"column":1}},"6":{"start":{"line":79,"column":0},"end":{"line":85,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"cbe12c4fb54e9557035a894402a4e1e6e1327afa"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\facebook_pixel\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\facebook_pixel\\transform.js","statementMap":{"0":{"start":{"line":2,"column":15},"end":{"line":2,"column":32}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":15},"end":{"line":4,"column":32}},"3":{"start":{"line":5,"column":14},"end":{"line":5,"column":44}},"4":{"start":{"line":12,"column":4},"end":{"line":12,"column":23}},"5":{"start":{"line":13,"column":22},"end":{"line":13,"column":51}},"6":{"start":{"line":27,"column":4},"end":{"line":27,"column":25}},"7":{"start":{"line":34,"column":22},"end":{"line":40,"column":1}},"8":{"start":{"line":35,"column":27},"end":{"line":35,"column":74}},"9":{"start":{"line":36,"column":2},"end":{"line":38,"column":3}},"10":{"start":{"line":37,"column":4},"end":{"line":37,"column":28}},"11":{"start":{"line":39,"column":2},"end":{"line":39,"column":73}},"12":{"start":{"line":52,"column":23},"end":{"line":87,"column":1}},"13":{"start":{"line":53,"column":27},"end":{"line":53,"column":34}},"14":{"start":{"line":54,"column":2},"end":{"line":61,"column":3}},"15":{"start":{"line":60,"column":4},"end":{"line":60,"column":50}},"16":{"start":{"line":63,"column":21},"end":{"line":63,"column":39}},"17":{"start":{"line":64,"column":2},"end":{"line":85,"column":3}},"18":{"start":{"line":65,"column":25},"end":{"line":65,"column":43}},"19":{"start":{"line":66,"column":4},"end":{"line":70,"column":5}},"20":{"start":{"line":67,"column":6},"end":{"line":69,"column":7}},"21":{"start":{"line":68,"column":8},"end":{"line":68,"column":40}},"22":{"start":{"line":72,"column":4},"end":{"line":74,"column":5}},"23":{"start":{"line":73,"column":6},"end":{"line":73,"column":29}},"24":{"start":{"line":75,"column":19},"end":{"line":75,"column":36}},"25":{"start":{"line":76,"column":21},"end":{"line":81,"column":10}},"26":{"start":{"line":77,"column":6},"end":{"line":79,"column":7}},"27":{"start":{"line":78,"column":8},"end":{"line":78,"column":26}},"28":{"start":{"line":80,"column":6},"end":{"line":80,"column":22}},"29":{"start":{"line":82,"column":4},"end":{"line":84,"column":5}},"30":{"start":{"line":83,"column":6},"end":{"line":83,"column":22}},"31":{"start":{"line":86,"column":2},"end":{"line":86,"column":22}},"32":{"start":{"line":96,"column":20},"end":{"line":137,"column":1}},"33":{"start":{"line":97,"column":23},"end":{"line":97,"column":41}},"34":{"start":{"line":98,"column":16},"end":{"line":98,"column":57}},"35":{"start":{"line":99,"column":22},"end":{"line":99,"column":75}},"36":{"start":{"line":100,"column":21},"end":{"line":100,"column":23}},"37":{"start":{"line":101,"column":19},"end":{"line":101,"column":21}},"38":{"start":{"line":102,"column":23},"end":{"line":102,"column":41}},"39":{"start":{"line":103,"column":2},"end":{"line":127,"column":3}},"40":{"start":{"line":104,"column":4},"end":{"line":116,"column":5}},"41":{"start":{"line":104,"column":17},"end":{"line":104,"column":18}},"42":{"start":{"line":106,"column":8},"end":{"line":106,"column":73}},"43":{"start":{"line":107,"column":6},"end":{"line":107,"column":27}},"44":{"start":{"line":110,"column":22},"end":{"line":114,"column":7}},"45":{"start":{"line":115,"column":6},"end":{"line":115,"column":29}},"46":{"start":{"line":117,"column":4},"end":{"line":124,"column":7}},"47":{"start":{"line":118,"column":6},"end":{"line":123,"column":7}},"48":{"start":{"line":119,"column":8},"end":{"line":122,"column":10}},"49":{"start":{"line":126,"column":4},"end":{"line":126,"column":75}},"50":{"start":{"line":128,"column":2},"end":{"line":136,"column":4}},"51":{"start":{"line":146,"column":32},"end":{"line":192,"column":1}},"52":{"start":{"line":148,"column":21},"end":{"line":148,"column":23}},"53":{"start":{"line":149,"column":19},"end":{"line":149,"column":21}},"54":{"start":{"line":150,"column":23},"end":{"line":150,"column":41}},"55":{"start":{"line":151,"column":2},"end":{"line":167,"column":3}},"56":{"start":{"line":152,"column":4},"end":{"line":166,"column":7}},"57":{"start":{"line":153,"column":6},"end":{"line":165,"column":7}},"58":{"start":{"line":154,"column":26},"end":{"line":154,"column":79}},"59":{"start":{"line":155,"column":8},"end":{"line":162,"column":9}},"60":{"start":{"line":156,"column":10},"end":{"line":156,"column":37}},"61":{"start":{"line":157,"column":10},"end":{"line":161,"column":13}},"62":{"start":{"line":164,"column":8},"end":{"line":164,"column":79}},"63":{"start":{"line":169,"column":2},"end":{"line":178,"column":3}},"64":{"start":{"line":170,"column":4},"end":{"line":170,"column":28}},"65":{"start":{"line":172,"column":4},"end":{"line":172,"column":55}},"66":{"start":{"line":173,"column":4},"end":{"line":176,"column":7}},"67":{"start":{"line":177,"column":4},"end":{"line":177,"column":34}},"68":{"start":{"line":179,"column":2},"end":{"line":186,"column":5}},"69":{"start":{"line":180,"column":4},"end":{"line":185,"column":5}},"70":{"start":{"line":181,"column":6},"end":{"line":184,"column":8}},"71":{"start":{"line":187,"column":2},"end":{"line":191,"column":4}},"72":{"start":{"line":200,"column":22},"end":{"line":244,"column":1}},"73":{"start":{"line":201,"column":19},"end":{"line":201,"column":62}},"74":{"start":{"line":202,"column":21},"end":{"line":207,"column":3}},"75":{"start":{"line":208,"column":22},"end":{"line":208,"column":75}},"76":{"start":{"line":210,"column":4},"end":{"line":210,"column":68}},"77":{"start":{"line":211,"column":26},"end":{"line":211,"column":59}},"78":{"start":{"line":212,"column":19},"end":{"line":212,"column":55}},"79":{"start":{"line":213,"column":16},"end":{"line":215,"column":45}},"80":{"start":{"line":216,"column":19},"end":{"line":226,"column":3}},"81":{"start":{"line":227,"column":2},"end":{"line":234,"column":5}},"82":{"start":{"line":228,"column":4},"end":{"line":233,"column":5}},"83":{"start":{"line":229,"column":6},"end":{"line":232,"column":8}},"84":{"start":{"line":235,"column":2},"end":{"line":243,"column":4}},"85":{"start":{"line":302,"column":31},"end":{"line":379,"column":1}},"86":{"start":{"line":311,"column":31},"end":{"line":326,"column":3}},"87":{"start":{"line":327,"column":2},"end":{"line":327,"column":56}},"88":{"start":{"line":328,"column":2},"end":{"line":328,"column":56}},"89":{"start":{"line":329,"column":2},"end":{"line":329,"column":54}},"90":{"start":{"line":330,"column":41},"end":{"line":330,"column":43}},"91":{"start":{"line":331,"column":38},"end":{"line":331,"column":40}},"92":{"start":{"line":332,"column":32},"end":{"line":332,"column":34}},"93":{"start":{"line":333,"column":2},"end":{"line":338,"column":3}},"94":{"start":{"line":333,"column":15},"end":{"line":333,"column":16}},"95":{"start":{"line":334,"column":35},"end":{"line":334,"column":60}},"96":{"start":{"line":335,"column":4},"end":{"line":337,"column":48}},"97":{"start":{"line":339,"column":2},"end":{"line":344,"column":3}},"98":{"start":{"line":339,"column":15},"end":{"line":339,"column":16}},"99":{"start":{"line":340,"column":35},"end":{"line":340,"column":60}},"100":{"start":{"line":341,"column":4},"end":{"line":343,"column":13}},"101":{"start":{"line":345,"column":2},"end":{"line":348,"column":3}},"102":{"start":{"line":345,"column":15},"end":{"line":345,"column":16}},"103":{"start":{"line":346,"column":35},"end":{"line":346,"column":59}},"104":{"start":{"line":347,"column":4},"end":{"line":347,"column":79}},"105":{"start":{"line":349,"column":2},"end":{"line":376,"column":5}},"106":{"start":{"line":350,"column":33},"end":{"line":350,"column":77}},"107":{"start":{"line":352,"column":6},"end":{"line":352,"column":53}},"108":{"start":{"line":353,"column":4},"end":{"line":355,"column":5}},"109":{"start":{"line":354,"column":6},"end":{"line":354,"column":35}},"110":{"start":{"line":357,"column":4},"end":{"line":371,"column":5}},"111":{"start":{"line":363,"column":6},"end":{"line":370,"column":7}},"112":{"start":{"line":364,"column":8},"end":{"line":367,"column":60}},"113":{"start":{"line":369,"column":8},"end":{"line":369,"column":37}},"114":{"start":{"line":372,"column":29},"end":{"line":372,"column":70}},"115":{"start":{"line":373,"column":4},"end":{"line":375,"column":5}},"116":{"start":{"line":374,"column":6},"end":{"line":374,"column":35}},"117":{"start":{"line":378,"column":2},"end":{"line":378,"column":20}},"118":{"start":{"line":381,"column":30},"end":{"line":592,"column":1}},"119":{"start":{"line":387,"column":21},"end":{"line":387,"column":32}},"120":{"start":{"line":388,"column":35},"end":{"line":388,"column":41}},"121":{"start":{"line":398,"column":6},"end":{"line":398,"column":12}},"122":{"start":{"line":399,"column":26},"end":{"line":399,"column":65}},"123":{"start":{"line":401,"column":19},"end":{"line":401,"column":99}},"124":{"start":{"line":403,"column":19},"end":{"line":407,"column":3}},"125":{"start":{"line":408,"column":2},"end":{"line":417,"column":3}},"126":{"start":{"line":409,"column":18},"end":{"line":409,"column":65}},"127":{"start":{"line":410,"column":4},"end":{"line":415,"column":5}},"128":{"start":{"line":411,"column":6},"end":{"line":412,"column":80}},"129":{"start":{"line":413,"column":6},"end":{"line":414,"column":80}},"130":{"start":{"line":416,"column":4},"end":{"line":416,"column":25}},"131":{"start":{"line":419,"column":19},"end":{"line":419,"column":21}},"132":{"start":{"line":420,"column":19},"end":{"line":420,"column":21}},"133":{"start":{"line":422,"column":2},"end":{"line":426,"column":4}},"134":{"start":{"line":428,"column":2},"end":{"line":434,"column":3}},"135":{"start":{"line":430,"column":6},"end":{"line":430,"column":66}},"136":{"start":{"line":431,"column":4},"end":{"line":433,"column":5}},"137":{"start":{"line":432,"column":6},"end":{"line":432,"column":63}},"138":{"start":{"line":435,"column":2},"end":{"line":538,"column":3}},"139":{"start":{"line":436,"column":4},"end":{"line":443,"column":6}},"140":{"start":{"line":444,"column":4},"end":{"line":446,"column":5}},"141":{"start":{"line":445,"column":6},"end":{"line":445,"column":31}},"142":{"start":{"line":447,"column":4},"end":{"line":452,"column":5}},"143":{"start":{"line":448,"column":6},"end":{"line":451,"column":8}},"144":{"start":{"line":453,"column":4},"end":{"line":461,"column":6}},"145":{"start":{"line":462,"column":4},"end":{"line":462,"column":50}},"146":{"start":{"line":463,"column":4},"end":{"line":535,"column":5}},"147":{"start":{"line":464,"column":6},"end":{"line":518,"column":7}},"148":{"start":{"line":466,"column":10},"end":{"line":469,"column":12}},"149":{"start":{"line":470,"column":10},"end":{"line":470,"column":48}},"150":{"start":{"line":471,"column":10},"end":{"line":471,"column":16}},"151":{"start":{"line":473,"column":10},"end":{"line":476,"column":12}},"152":{"start":{"line":477,"column":10},"end":{"line":477,"column":48}},"153":{"start":{"line":478,"column":10},"end":{"line":478,"column":16}},"154":{"start":{"line":480,"column":10},"end":{"line":483,"column":12}},"155":{"start":{"line":484,"column":10},"end":{"line":484,"column":46}},"156":{"start":{"line":485,"column":10},"end":{"line":485,"column":16}},"157":{"start":{"line":487,"column":10},"end":{"line":490,"column":12}},"158":{"start":{"line":491,"column":10},"end":{"line":491,"column":45}},"159":{"start":{"line":492,"column":10},"end":{"line":492,"column":16}},"160":{"start":{"line":494,"column":10},"end":{"line":497,"column":12}},"161":{"start":{"line":498,"column":10},"end":{"line":498,"column":43}},"162":{"start":{"line":499,"column":10},"end":{"line":499,"column":16}},"163":{"start":{"line":501,"column":10},"end":{"line":504,"column":12}},"164":{"start":{"line":505,"column":10},"end":{"line":505,"column":53}},"165":{"start":{"line":506,"column":10},"end":{"line":506,"column":16}},"166":{"start":{"line":509,"column":10},"end":{"line":509,"column":41}},"167":{"start":{"line":510,"column":10},"end":{"line":510,"column":45}},"168":{"start":{"line":511,"column":10},"end":{"line":511,"column":16}},"169":{"start":{"line":513,"column":10},"end":{"line":513,"column":41}},"170":{"start":{"line":514,"column":10},"end":{"line":514,"column":49}},"171":{"start":{"line":515,"column":10},"end":{"line":515,"column":16}},"172":{"start":{"line":517,"column":10},"end":{"line":517,"column":75}},"173":{"start":{"line":519,"column":6},"end":{"line":521,"column":20}},"174":{"start":{"line":523,"column":23},"end":{"line":523,"column":31}},"175":{"start":{"line":524,"column":6},"end":{"line":528,"column":7}},"176":{"start":{"line":525,"column":8},"end":{"line":527,"column":31}},"177":{"start":{"line":529,"column":6},"end":{"line":534,"column":7}},"178":{"start":{"line":530,"column":8},"end":{"line":532,"column":22}},"179":{"start":{"line":533,"column":8},"end":{"line":533,"column":34}},"180":{"start":{"line":537,"column":4},"end":{"line":537,"column":27}},"181":{"start":{"line":539,"column":2},"end":{"line":548,"column":3}},"182":{"start":{"line":540,"column":34},"end":{"line":540,"column":79}},"183":{"start":{"line":541,"column":4},"end":{"line":547,"column":5}},"184":{"start":{"line":542,"column":6},"end":{"line":546,"column":32}},"185":{"start":{"line":552,"column":2},"end":{"line":567,"column":3}},"186":{"start":{"line":557,"column":4},"end":{"line":565,"column":5}},"187":{"start":{"line":558,"column":6},"end":{"line":560,"column":19}},"188":{"start":{"line":561,"column":11},"end":{"line":565,"column":5}},"189":{"start":{"line":562,"column":6},"end":{"line":562,"column":65}},"190":{"start":{"line":564,"column":6},"end":{"line":564,"column":72}},"191":{"start":{"line":569,"column":2},"end":{"line":589,"column":3}},"192":{"start":{"line":570,"column":21},"end":{"line":570,"column":43}},"193":{"start":{"line":571,"column":4},"end":{"line":571,"column":33}},"194":{"start":{"line":572,"column":4},"end":{"line":572,"column":61}},"195":{"start":{"line":573,"column":26},"end":{"line":577,"column":6}},"196":{"start":{"line":578,"column":20},"end":{"line":580,"column":5}},"197":{"start":{"line":584,"column":4},"end":{"line":586,"column":5}},"198":{"start":{"line":585,"column":6},"end":{"line":585,"column":46}},"199":{"start":{"line":587,"column":4},"end":{"line":587,"column":33}},"200":{"start":{"line":588,"column":4},"end":{"line":588,"column":20}},"201":{"start":{"line":591,"column":2},"end":{"line":591,"column":65}},"202":{"start":{"line":594,"column":21},"end":{"line":735,"column":1}},"203":{"start":{"line":595,"column":2},"end":{"line":600,"column":3}},"204":{"start":{"line":596,"column":4},"end":{"line":599,"column":6}},"205":{"start":{"line":602,"column":20},"end":{"line":602,"column":66}},"206":{"start":{"line":603,"column":2},"end":{"line":622,"column":3}},"207":{"start":{"line":604,"column":18},"end":{"line":604,"column":60}},"208":{"start":{"line":605,"column":20},"end":{"line":605,"column":53}},"209":{"start":{"line":607,"column":21},"end":{"line":607,"column":77}},"210":{"start":{"line":609,"column":21},"end":{"line":611,"column":5}},"211":{"start":{"line":612,"column":4},"end":{"line":621,"column":5}},"212":{"start":{"line":614,"column":6},"end":{"line":616,"column":9}},"213":{"start":{"line":617,"column":6},"end":{"line":620,"column":8}},"214":{"start":{"line":625,"column":2},"end":{"line":632,"column":6}},"215":{"start":{"line":626,"column":4},"end":{"line":632,"column":6}},"216":{"start":{"line":634,"column":2},"end":{"line":641,"column":6}},"217":{"start":{"line":635,"column":4},"end":{"line":641,"column":6}},"218":{"start":{"line":642,"column":30},"end":{"line":642,"column":48}},"219":{"start":{"line":644,"column":19},"end":{"line":644,"column":21}},"220":{"start":{"line":646,"column":22},"end":{"line":646,"column":48}},"221":{"start":{"line":648,"column":2},"end":{"line":727,"column":3}},"222":{"start":{"line":650,"column":6},"end":{"line":658,"column":7}},"223":{"start":{"line":651,"column":8},"end":{"line":651,"column":46}},"224":{"start":{"line":652,"column":8},"end":{"line":652,"column":14}},"225":{"start":{"line":654,"column":8},"end":{"line":657,"column":10}},"226":{"start":{"line":661,"column":6},"end":{"line":661,"column":40}},"227":{"start":{"line":662,"column":6},"end":{"line":662,"column":12}},"228":{"start":{"line":664,"column":6},"end":{"line":666,"column":7}},"229":{"start":{"line":665,"column":8},"end":{"line":665,"column":61}},"230":{"start":{"line":667,"column":6},"end":{"line":667,"column":32}},"231":{"start":{"line":668,"column":6},"end":{"line":675,"column":7}},"232":{"start":{"line":669,"column":8},"end":{"line":674,"column":15}},"233":{"start":{"line":670,"column":10},"end":{"line":672,"column":11}},"234":{"start":{"line":671,"column":12},"end":{"line":671,"column":36}},"235":{"start":{"line":673,"column":10},"end":{"line":673,"column":26}},"236":{"start":{"line":676,"column":6},"end":{"line":676,"column":80}},"237":{"start":{"line":678,"column":6},"end":{"line":723,"column":7}},"238":{"start":{"line":681,"column":10},"end":{"line":681,"column":59}},"239":{"start":{"line":682,"column":10},"end":{"line":682,"column":16}},"240":{"start":{"line":684,"column":10},"end":{"line":684,"column":54}},"241":{"start":{"line":685,"column":10},"end":{"line":685,"column":16}},"242":{"start":{"line":688,"column":10},"end":{"line":688,"column":53}},"243":{"start":{"line":689,"column":10},"end":{"line":689,"column":16}},"244":{"start":{"line":692,"column":10},"end":{"line":692,"column":55}},"245":{"start":{"line":693,"column":10},"end":{"line":693,"column":16}},"246":{"start":{"line":696,"column":10},"end":{"line":696,"column":57}},"247":{"start":{"line":697,"column":10},"end":{"line":697,"column":16}},"248":{"start":{"line":700,"column":10},"end":{"line":700,"column":56}},"249":{"start":{"line":701,"column":10},"end":{"line":701,"column":16}},"250":{"start":{"line":714,"column":10},"end":{"line":714,"column":54}},"251":{"start":{"line":715,"column":10},"end":{"line":715,"column":38}},"252":{"start":{"line":716,"column":10},"end":{"line":716,"column":16}},"253":{"start":{"line":718,"column":10},"end":{"line":718,"column":49}},"254":{"start":{"line":719,"column":10},"end":{"line":719,"column":16}},"255":{"start":{"line":721,"column":10},"end":{"line":721,"column":52}},"256":{"start":{"line":722,"column":10},"end":{"line":722,"column":16}},"257":{"start":{"line":724,"column":6},"end":{"line":724,"column":12}},"258":{"start":{"line":726,"column":6},"end":{"line":726,"column":63}},"259":{"start":{"line":729,"column":2},"end":{"line":734,"column":4}},"260":{"start":{"line":737,"column":16},"end":{"line":739,"column":1}},"261":{"start":{"line":738,"column":2},"end":{"line":738,"column":56}},"262":{"start":{"line":741,"column":26},"end":{"line":778,"column":1}},"263":{"start":{"line":742,"column":2},"end":{"line":745,"column":3}},"264":{"start":{"line":743,"column":23},"end":{"line":743,"column":75}},"265":{"start":{"line":744,"column":4},"end":{"line":744,"column":24}},"266":{"start":{"line":747,"column":19},"end":{"line":776,"column":3}},"267":{"start":{"line":749,"column":6},"end":{"line":774,"column":7}},"268":{"start":{"line":750,"column":8},"end":{"line":757,"column":9}},"269":{"start":{"line":752,"column":10},"end":{"line":756,"column":12}},"270":{"start":{"line":759,"column":8},"end":{"line":763,"column":10}},"271":{"start":{"line":765,"column":8},"end":{"line":773,"column":10}},"272":{"start":{"line":777,"column":2},"end":{"line":777,"column":18}},"273":{"start":{"line":780,"column":0},"end":{"line":780,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":34,"column":22},"end":{"line":34,"column":23}},"loc":{"start":{"line":34,"column":33},"end":{"line":40,"column":1}},"line":34},"1":{"name":"(anonymous_1)","decl":{"start":{"line":52,"column":23},"end":{"line":52,"column":24}},"loc":{"start":{"line":52,"column":69},"end":{"line":87,"column":1}},"line":52},"2":{"name":"(anonymous_2)","decl":{"start":{"line":76,"column":35},"end":{"line":76,"column":36}},"loc":{"start":{"line":76,"column":54},"end":{"line":81,"column":5}},"line":76},"3":{"name":"(anonymous_3)","decl":{"start":{"line":96,"column":20},"end":{"line":96,"column":21}},"loc":{"start":{"line":96,"column":52},"end":{"line":137,"column":1}},"line":96},"4":{"name":"(anonymous_4)","decl":{"start":{"line":117,"column":21},"end":{"line":117,"column":22}},"loc":{"start":{"line":117,"column":41},"end":{"line":124,"column":5}},"line":117},"5":{"name":"(anonymous_5)","decl":{"start":{"line":146,"column":32},"end":{"line":146,"column":33}},"loc":{"start":{"line":146,"column":64},"end":{"line":192,"column":1}},"line":146},"6":{"name":"(anonymous_6)","decl":{"start":{"line":152,"column":21},"end":{"line":152,"column":22}},"loc":{"start":{"line":152,"column":32},"end":{"line":166,"column":5}},"line":152},"7":{"name":"(anonymous_7)","decl":{"start":{"line":179,"column":19},"end":{"line":179,"column":20}},"loc":{"start":{"line":179,"column":39},"end":{"line":186,"column":3}},"line":179},"8":{"name":"(anonymous_8)","decl":{"start":{"line":200,"column":22},"end":{"line":200,"column":23}},"loc":{"start":{"line":200,"column":76},"end":{"line":244,"column":1}},"line":200},"9":{"name":"(anonymous_9)","decl":{"start":{"line":227,"column":19},"end":{"line":227,"column":20}},"loc":{"start":{"line":227,"column":39},"end":{"line":234,"column":3}},"line":227},"10":{"name":"(anonymous_10)","decl":{"start":{"line":302,"column":31},"end":{"line":302,"column":32}},"loc":{"start":{"line":310,"column":5},"end":{"line":379,"column":1}},"line":310},"11":{"name":"(anonymous_11)","decl":{"start":{"line":349,"column":34},"end":{"line":349,"column":35}},"loc":{"start":{"line":349,"column":47},"end":{"line":376,"column":3}},"line":349},"12":{"name":"(anonymous_12)","decl":{"start":{"line":381,"column":30},"end":{"line":381,"column":31}},"loc":{"start":{"line":386,"column":5},"end":{"line":592,"column":1}},"line":386},"13":{"name":"(anonymous_13)","decl":{"start":{"line":594,"column":21},"end":{"line":594,"column":22}},"loc":{"start":{"line":594,"column":47},"end":{"line":735,"column":1}},"line":594},"14":{"name":"(anonymous_14)","decl":{"start":{"line":669,"column":37},"end":{"line":669,"column":38}},"loc":{"start":{"line":669,"column":62},"end":{"line":674,"column":9}},"line":669},"15":{"name":"(anonymous_15)","decl":{"start":{"line":737,"column":16},"end":{"line":737,"column":17}},"loc":{"start":{"line":737,"column":25},"end":{"line":739,"column":1}},"line":737},"16":{"name":"(anonymous_16)","decl":{"start":{"line":741,"column":26},"end":{"line":741,"column":27}},"loc":{"start":{"line":741,"column":42},"end":{"line":778,"column":1}},"line":741},"17":{"name":"(anonymous_17)","decl":{"start":{"line":748,"column":15},"end":{"line":748,"column":16}},"loc":{"start":{"line":748,"column":30},"end":{"line":775,"column":5}},"line":748}},"branchMap":{"0":{"loc":{"start":{"line":35,"column":49},"end":{"line":35,"column":61}},"type":"binary-expr","locations":[{"start":{"line":35,"column":49},"end":{"line":35,"column":56}},{"start":{"line":35,"column":60},"end":{"line":35,"column":61}}],"line":35},"1":{"loc":{"start":{"line":36,"column":2},"end":{"line":38,"column":3}},"type":"if","locations":[{"start":{"line":36,"column":2},"end":{"line":38,"column":3}},{"start":{"line":36,"column":2},"end":{"line":38,"column":3}}],"line":36},"2":{"loc":{"start":{"line":54,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":54,"column":2},"end":{"line":61,"column":3}},{"start":{"line":54,"column":2},"end":{"line":61,"column":3}}],"line":54},"3":{"loc":{"start":{"line":55,"column":4},"end":{"line":58,"column":42}},"type":"binary-expr","locations":[{"start":{"line":55,"column":4},"end":{"line":55,"column":16}},{"start":{"line":56,"column":4},"end":{"line":56,"column":30}},{"start":{"line":57,"column":4},"end":{"line":57,"column":40}},{"start":{"line":58,"column":4},"end":{"line":58,"column":42}}],"line":55},"4":{"loc":{"start":{"line":64,"column":2},"end":{"line":85,"column":3}},"type":"if","locations":[{"start":{"line":64,"column":2},"end":{"line":85,"column":3}},{"start":{"line":64,"column":2},"end":{"line":85,"column":3}}],"line":64},"5":{"loc":{"start":{"line":66,"column":4},"end":{"line":70,"column":5}},"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":70,"column":5}},{"start":{"line":66,"column":4},"end":{"line":70,"column":5}}],"line":66},"6":{"loc":{"start":{"line":66,"column":8},"end":{"line":66,"column":66}},"type":"binary-expr","locations":[{"start":{"line":66,"column":8},"end":{"line":66,"column":16}},{"start":{"line":66,"column":20},"end":{"line":66,"column":39}},{"start":{"line":66,"column":43},"end":{"line":66,"column":66}}],"line":66},"7":{"loc":{"start":{"line":67,"column":6},"end":{"line":69,"column":7}},"type":"if","locations":[{"start":{"line":67,"column":6},"end":{"line":69,"column":7}},{"start":{"line":67,"column":6},"end":{"line":69,"column":7}}],"line":67},"8":{"loc":{"start":{"line":72,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":72,"column":4},"end":{"line":74,"column":5}},{"start":{"line":72,"column":4},"end":{"line":74,"column":5}}],"line":72},"9":{"loc":{"start":{"line":77,"column":6},"end":{"line":79,"column":7}},"type":"if","locations":[{"start":{"line":77,"column":6},"end":{"line":79,"column":7}},{"start":{"line":77,"column":6},"end":{"line":79,"column":7}}],"line":77},"10":{"loc":{"start":{"line":82,"column":4},"end":{"line":84,"column":5}},"type":"if","locations":[{"start":{"line":82,"column":4},"end":{"line":84,"column":5}},{"start":{"line":82,"column":4},"end":{"line":84,"column":5}}],"line":82},"11":{"loc":{"start":{"line":103,"column":2},"end":{"line":127,"column":3}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":127,"column":3}},{"start":{"line":103,"column":2},"end":{"line":127,"column":3}}],"line":103},"12":{"loc":{"start":{"line":103,"column":6},"end":{"line":103,"column":64}},"type":"binary-expr","locations":[{"start":{"line":103,"column":6},"end":{"line":103,"column":14}},{"start":{"line":103,"column":18},"end":{"line":103,"column":37}},{"start":{"line":103,"column":41},"end":{"line":103,"column":64}}],"line":103},"13":{"loc":{"start":{"line":106,"column":8},"end":{"line":106,"column":73}},"type":"binary-expr","locations":[{"start":{"line":106,"column":8},"end":{"line":106,"column":30}},{"start":{"line":106,"column":34},"end":{"line":106,"column":49}},{"start":{"line":106,"column":53},"end":{"line":106,"column":67}},{"start":{"line":106,"column":71},"end":{"line":106,"column":73}}],"line":106},"14":{"loc":{"start":{"line":112,"column":18},"end":{"line":112,"column":74}},"type":"binary-expr","locations":[{"start":{"line":112,"column":18},"end":{"line":112,"column":38}},{"start":{"line":112,"column":42},"end":{"line":112,"column":69}},{"start":{"line":112,"column":73},"end":{"line":112,"column":74}}],"line":112},"15":{"loc":{"start":{"line":113,"column":20},"end":{"line":113,"column":65}},"type":"binary-expr","locations":[{"start":{"line":113,"column":20},"end":{"line":113,"column":37}},{"start":{"line":113,"column":41},"end":{"line":113,"column":65}}],"line":113},"16":{"loc":{"start":{"line":118,"column":6},"end":{"line":123,"column":7}},"type":"if","locations":[{"start":{"line":118,"column":6},"end":{"line":123,"column":7}},{"start":{"line":118,"column":6},"end":{"line":123,"column":7}}],"line":118},"17":{"loc":{"start":{"line":132,"column":14},"end":{"line":132,"column":50}},"type":"binary-expr","locations":[{"start":{"line":132,"column":14},"end":{"line":132,"column":41}},{"start":{"line":132,"column":45},"end":{"line":132,"column":50}}],"line":132},"18":{"loc":{"start":{"line":151,"column":2},"end":{"line":167,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":167,"column":3}},{"start":{"line":151,"column":2},"end":{"line":167,"column":3}}],"line":151},"19":{"loc":{"start":{"line":151,"column":6},"end":{"line":151,"column":64}},"type":"binary-expr","locations":[{"start":{"line":151,"column":6},"end":{"line":151,"column":14}},{"start":{"line":151,"column":18},"end":{"line":151,"column":37}},{"start":{"line":151,"column":41},"end":{"line":151,"column":64}}],"line":151},"20":{"loc":{"start":{"line":153,"column":6},"end":{"line":165,"column":7}},"type":"if","locations":[{"start":{"line":153,"column":6},"end":{"line":165,"column":7}},{"start":{"line":153,"column":6},"end":{"line":165,"column":7}}],"line":153},"21":{"loc":{"start":{"line":154,"column":26},"end":{"line":154,"column":79}},"type":"binary-expr","locations":[{"start":{"line":154,"column":26},"end":{"line":154,"column":44}},{"start":{"line":154,"column":48},"end":{"line":154,"column":59}},{"start":{"line":154,"column":63},"end":{"line":154,"column":73}},{"start":{"line":154,"column":77},"end":{"line":154,"column":79}}],"line":154},"22":{"loc":{"start":{"line":155,"column":8},"end":{"line":162,"column":9}},"type":"if","locations":[{"start":{"line":155,"column":8},"end":{"line":162,"column":9}},{"start":{"line":155,"column":8},"end":{"line":162,"column":9}}],"line":155},"23":{"loc":{"start":{"line":159,"column":22},"end":{"line":159,"column":74}},"type":"binary-expr","locations":[{"start":{"line":159,"column":22},"end":{"line":159,"column":38}},{"start":{"line":159,"column":42},"end":{"line":159,"column":69}},{"start":{"line":159,"column":73},"end":{"line":159,"column":74}}],"line":159},"24":{"loc":{"start":{"line":169,"column":2},"end":{"line":178,"column":3}},"type":"if","locations":[{"start":{"line":169,"column":2},"end":{"line":178,"column":3}},{"start":{"line":169,"column":2},"end":{"line":178,"column":3}}],"line":169},"25":{"loc":{"start":{"line":172,"column":20},"end":{"line":172,"column":53}},"type":"binary-expr","locations":[{"start":{"line":172,"column":20},"end":{"line":172,"column":47}},{"start":{"line":172,"column":51},"end":{"line":172,"column":53}}],"line":172},"26":{"loc":{"start":{"line":174,"column":10},"end":{"line":174,"column":43}},"type":"binary-expr","locations":[{"start":{"line":174,"column":10},"end":{"line":174,"column":37}},{"start":{"line":174,"column":41},"end":{"line":174,"column":43}}],"line":174},"27":{"loc":{"start":{"line":180,"column":4},"end":{"line":185,"column":5}},"type":"if","locations":[{"start":{"line":180,"column":4},"end":{"line":185,"column":5}},{"start":{"line":180,"column":4},"end":{"line":185,"column":5}}],"line":180},"28":{"loc":{"start":{"line":203,"column":4},"end":{"line":206,"column":8}},"type":"binary-expr","locations":[{"start":{"line":203,"column":4},"end":{"line":203,"column":33}},{"start":{"line":204,"column":6},"end":{"line":204,"column":27}},{"start":{"line":205,"column":6},"end":{"line":205,"column":28}},{"start":{"line":206,"column":6},"end":{"line":206,"column":8}}],"line":203},"29":{"loc":{"start":{"line":210,"column":4},"end":{"line":210,"column":68}},"type":"binary-expr","locations":[{"start":{"line":210,"column":4},"end":{"line":210,"column":35}},{"start":{"line":210,"column":39},"end":{"line":210,"column":62}},{"start":{"line":210,"column":66},"end":{"line":210,"column":68}}],"line":210},"30":{"loc":{"start":{"line":211,"column":26},"end":{"line":211,"column":59}},"type":"binary-expr","locations":[{"start":{"line":211,"column":26},"end":{"line":211,"column":53}},{"start":{"line":211,"column":57},"end":{"line":211,"column":59}}],"line":211},"31":{"loc":{"start":{"line":212,"column":19},"end":{"line":212,"column":55}},"type":"binary-expr","locations":[{"start":{"line":212,"column":19},"end":{"line":212,"column":46}},{"start":{"line":212,"column":50},"end":{"line":212,"column":55}}],"line":212},"32":{"loc":{"start":{"line":213,"column":16},"end":{"line":215,"column":45}},"type":"cond-expr","locations":[{"start":{"line":214,"column":6},"end":{"line":214,"column":45}},{"start":{"line":215,"column":6},"end":{"line":215,"column":45}}],"line":213},"33":{"loc":{"start":{"line":219,"column":8},"end":{"line":222,"column":10}},"type":"binary-expr","locations":[{"start":{"line":219,"column":8},"end":{"line":219,"column":37}},{"start":{"line":220,"column":8},"end":{"line":220,"column":29}},{"start":{"line":221,"column":8},"end":{"line":221,"column":30}},{"start":{"line":222,"column":8},"end":{"line":222,"column":10}}],"line":219},"34":{"loc":{"start":{"line":223,"column":16},"end":{"line":223,"column":48}},"type":"binary-expr","locations":[{"start":{"line":223,"column":16},"end":{"line":223,"column":43}},{"start":{"line":223,"column":47},"end":{"line":223,"column":48}}],"line":223},"35":{"loc":{"start":{"line":228,"column":4},"end":{"line":233,"column":5}},"type":"if","locations":[{"start":{"line":228,"column":4},"end":{"line":233,"column":5}},{"start":{"line":228,"column":4},"end":{"line":233,"column":5}}],"line":228},"36":{"loc":{"start":{"line":327,"column":27},"end":{"line":327,"column":55}},"type":"binary-expr","locations":[{"start":{"line":327,"column":27},"end":{"line":327,"column":49}},{"start":{"line":327,"column":53},"end":{"line":327,"column":55}}],"line":327},"37":{"loc":{"start":{"line":328,"column":27},"end":{"line":328,"column":55}},"type":"binary-expr","locations":[{"start":{"line":328,"column":27},"end":{"line":328,"column":49}},{"start":{"line":328,"column":53},"end":{"line":328,"column":55}}],"line":328},"38":{"loc":{"start":{"line":329,"column":26},"end":{"line":329,"column":53}},"type":"binary-expr","locations":[{"start":{"line":329,"column":26},"end":{"line":329,"column":47}},{"start":{"line":329,"column":51},"end":{"line":329,"column":53}}],"line":329},"39":{"loc":{"start":{"line":352,"column":6},"end":{"line":352,"column":53}},"type":"binary-expr","locations":[{"start":{"line":352,"column":6},"end":{"line":352,"column":44}},{"start":{"line":352,"column":48},"end":{"line":352,"column":53}}],"line":352},"40":{"loc":{"start":{"line":353,"column":4},"end":{"line":355,"column":5}},"type":"if","locations":[{"start":{"line":353,"column":4},"end":{"line":355,"column":5}},{"start":{"line":353,"column":4},"end":{"line":355,"column":5}}],"line":353},"41":{"loc":{"start":{"line":353,"column":8},"end":{"line":353,"column":53}},"type":"binary-expr","locations":[{"start":{"line":353,"column":8},"end":{"line":353,"column":28}},{"start":{"line":353,"column":32},"end":{"line":353,"column":53}}],"line":353},"42":{"loc":{"start":{"line":357,"column":4},"end":{"line":371,"column":5}},"type":"if","locations":[{"start":{"line":357,"column":4},"end":{"line":371,"column":5}},{"start":{"line":357,"column":4},"end":{"line":371,"column":5}}],"line":357},"43":{"loc":{"start":{"line":363,"column":6},"end":{"line":370,"column":7}},"type":"if","locations":[{"start":{"line":363,"column":6},"end":{"line":370,"column":7}},{"start":{"line":363,"column":6},"end":{"line":370,"column":7}}],"line":363},"44":{"loc":{"start":{"line":365,"column":10},"end":{"line":367,"column":59}},"type":"cond-expr","locations":[{"start":{"line":366,"column":14},"end":{"line":366,"column":51}},{"start":{"line":367,"column":14},"end":{"line":367,"column":59}}],"line":365},"45":{"loc":{"start":{"line":365,"column":10},"end":{"line":365,"column":51}},"type":"binary-expr","locations":[{"start":{"line":365,"column":10},"end":{"line":365,"column":25}},{"start":{"line":365,"column":29},"end":{"line":365,"column":51}}],"line":365},"46":{"loc":{"start":{"line":372,"column":29},"end":{"line":372,"column":70}},"type":"binary-expr","locations":[{"start":{"line":372,"column":29},"end":{"line":372,"column":61}},{"start":{"line":372,"column":65},"end":{"line":372,"column":70}}],"line":372},"47":{"loc":{"start":{"line":373,"column":4},"end":{"line":375,"column":5}},"type":"if","locations":[{"start":{"line":373,"column":4},"end":{"line":375,"column":5}},{"start":{"line":373,"column":4},"end":{"line":375,"column":5}}],"line":373},"48":{"loc":{"start":{"line":373,"column":8},"end":{"line":373,"column":64}},"type":"binary-expr","locations":[{"start":{"line":373,"column":8},"end":{"line":373,"column":18}},{"start":{"line":373,"column":22},"end":{"line":373,"column":39}},{"start":{"line":373,"column":43},"end":{"line":373,"column":64}}],"line":373},"49":{"loc":{"start":{"line":408,"column":2},"end":{"line":417,"column":3}},"type":"if","locations":[{"start":{"line":408,"column":2},"end":{"line":417,"column":3}},{"start":{"line":408,"column":2},"end":{"line":417,"column":3}}],"line":408},"50":{"loc":{"start":{"line":409,"column":18},"end":{"line":409,"column":65}},"type":"cond-expr","locations":[{"start":{"line":409,"column":34},"end":{"line":409,"column":58}},{"start":{"line":409,"column":61},"end":{"line":409,"column":65}}],"line":409},"51":{"loc":{"start":{"line":410,"column":4},"end":{"line":415,"column":5}},"type":"if","locations":[{"start":{"line":410,"column":4},"end":{"line":415,"column":5}},{"start":{"line":410,"column":4},"end":{"line":415,"column":5}}],"line":410},"52":{"loc":{"start":{"line":410,"column":8},"end":{"line":410,"column":68}},"type":"binary-expr","locations":[{"start":{"line":410,"column":8},"end":{"line":410,"column":22}},{"start":{"line":410,"column":26},"end":{"line":410,"column":46}},{"start":{"line":410,"column":50},"end":{"line":410,"column":68}}],"line":410},"53":{"loc":{"start":{"line":412,"column":8},"end":{"line":412,"column":79}},"type":"cond-expr","locations":[{"start":{"line":412,"column":52},"end":{"line":412,"column":60}},{"start":{"line":412,"column":63},"end":{"line":412,"column":79}}],"line":412},"54":{"loc":{"start":{"line":412,"column":8},"end":{"line":412,"column":49}},"type":"binary-expr","locations":[{"start":{"line":412,"column":8},"end":{"line":412,"column":23}},{"start":{"line":412,"column":27},"end":{"line":412,"column":49}}],"line":412},"55":{"loc":{"start":{"line":414,"column":8},"end":{"line":414,"column":79}},"type":"cond-expr","locations":[{"start":{"line":414,"column":52},"end":{"line":414,"column":60}},{"start":{"line":414,"column":63},"end":{"line":414,"column":79}}],"line":414},"56":{"loc":{"start":{"line":414,"column":8},"end":{"line":414,"column":49}},"type":"binary-expr","locations":[{"start":{"line":414,"column":8},"end":{"line":414,"column":23}},{"start":{"line":414,"column":27},"end":{"line":414,"column":49}}],"line":414},"57":{"loc":{"start":{"line":428,"column":2},"end":{"line":434,"column":3}},"type":"if","locations":[{"start":{"line":428,"column":2},"end":{"line":434,"column":3}},{"start":{"line":428,"column":2},"end":{"line":434,"column":3}}],"line":428},"58":{"loc":{"start":{"line":431,"column":4},"end":{"line":433,"column":5}},"type":"if","locations":[{"start":{"line":431,"column":4},"end":{"line":433,"column":5}},{"start":{"line":431,"column":4},"end":{"line":433,"column":5}}],"line":431},"59":{"loc":{"start":{"line":435,"column":2},"end":{"line":538,"column":3}},"type":"if","locations":[{"start":{"line":435,"column":2},"end":{"line":538,"column":3}},{"start":{"line":435,"column":2},"end":{"line":538,"column":3}}],"line":435},"60":{"loc":{"start":{"line":444,"column":4},"end":{"line":446,"column":5}},"type":"if","locations":[{"start":{"line":444,"column":4},"end":{"line":446,"column":5}},{"start":{"line":444,"column":4},"end":{"line":446,"column":5}}],"line":444},"61":{"loc":{"start":{"line":444,"column":8},"end":{"line":444,"column":52}},"type":"binary-expr","locations":[{"start":{"line":444,"column":8},"end":{"line":444,"column":24}},{"start":{"line":444,"column":28},"end":{"line":444,"column":52}}],"line":444},"62":{"loc":{"start":{"line":447,"column":4},"end":{"line":452,"column":5}},"type":"if","locations":[{"start":{"line":447,"column":4},"end":{"line":452,"column":5}},{"start":{"line":447,"column":4},"end":{"line":452,"column":5}}],"line":447},"63":{"loc":{"start":{"line":447,"column":8},"end":{"line":447,"column":65}},"type":"binary-expr","locations":[{"start":{"line":447,"column":8},"end":{"line":447,"column":44}},{"start":{"line":447,"column":48},"end":{"line":447,"column":65}}],"line":447},"64":{"loc":{"start":{"line":462,"column":25},"end":{"line":462,"column":49}},"type":"binary-expr","locations":[{"start":{"line":462,"column":25},"end":{"line":462,"column":43}},{"start":{"line":462,"column":47},"end":{"line":462,"column":49}}],"line":462},"65":{"loc":{"start":{"line":463,"column":4},"end":{"line":535,"column":5}},"type":"if","locations":[{"start":{"line":463,"column":4},"end":{"line":535,"column":5}},{"start":{"line":463,"column":4},"end":{"line":535,"column":5}}],"line":463},"66":{"loc":{"start":{"line":464,"column":6},"end":{"line":518,"column":7}},"type":"switch","locations":[{"start":{"line":465,"column":8},"end":{"line":471,"column":16}},{"start":{"line":472,"column":8},"end":{"line":478,"column":16}},{"start":{"line":479,"column":8},"end":{"line":485,"column":16}},{"start":{"line":486,"column":8},"end":{"line":492,"column":16}},{"start":{"line":493,"column":8},"end":{"line":499,"column":16}},{"start":{"line":500,"column":8},"end":{"line":506,"column":16}},{"start":{"line":507,"column":8},"end":{"line":507,"column":25}},{"start":{"line":508,"column":8},"end":{"line":511,"column":16}},{"start":{"line":512,"column":8},"end":{"line":515,"column":16}},{"start":{"line":516,"column":8},"end":{"line":517,"column":75}}],"line":464},"67":{"loc":{"start":{"line":519,"column":28},"end":{"line":521,"column":19}},"type":"cond-expr","locations":[{"start":{"line":520,"column":10},"end":{"line":520,"column":46}},{"start":{"line":521,"column":10},"end":{"line":521,"column":19}}],"line":519},"68":{"loc":{"start":{"line":520,"column":10},"end":{"line":520,"column":46}},"type":"binary-expr","locations":[{"start":{"line":520,"column":10},"end":{"line":520,"column":37}},{"start":{"line":520,"column":41},"end":{"line":520,"column":46}}],"line":520},"69":{"loc":{"start":{"line":524,"column":6},"end":{"line":528,"column":7}},"type":"if","locations":[{"start":{"line":524,"column":6},"end":{"line":528,"column":7}},{"start":{"line":524,"column":6},"end":{"line":528,"column":7}}],"line":524},"70":{"loc":{"start":{"line":524,"column":10},"end":{"line":524,"column":46}},"type":"binary-expr","locations":[{"start":{"line":524,"column":10},"end":{"line":524,"column":25}},{"start":{"line":524,"column":29},"end":{"line":524,"column":46}}],"line":524},"71":{"loc":{"start":{"line":525,"column":32},"end":{"line":527,"column":30}},"type":"cond-expr","locations":[{"start":{"line":526,"column":12},"end":{"line":526,"column":44}},{"start":{"line":527,"column":12},"end":{"line":527,"column":30}}],"line":525},"72":{"loc":{"start":{"line":529,"column":6},"end":{"line":534,"column":7}},"type":"if","locations":[{"start":{"line":529,"column":6},"end":{"line":534,"column":7}},{"start":{"line":529,"column":6},"end":{"line":534,"column":7}}],"line":529},"73":{"loc":{"start":{"line":530,"column":27},"end":{"line":532,"column":21}},"type":"cond-expr","locations":[{"start":{"line":531,"column":12},"end":{"line":531,"column":38}},{"start":{"line":532,"column":12},"end":{"line":532,"column":21}}],"line":530},"74":{"loc":{"start":{"line":539,"column":2},"end":{"line":548,"column":3}},"type":"if","locations":[{"start":{"line":539,"column":2},"end":{"line":548,"column":3}},{"start":{"line":539,"column":2},"end":{"line":548,"column":3}}],"line":539},"75":{"loc":{"start":{"line":541,"column":4},"end":{"line":547,"column":5}},"type":"if","locations":[{"start":{"line":541,"column":4},"end":{"line":547,"column":5}},{"start":{"line":541,"column":4},"end":{"line":547,"column":5}}],"line":541},"76":{"loc":{"start":{"line":541,"column":8},"end":{"line":541,"column":69}},"type":"binary-expr","locations":[{"start":{"line":541,"column":8},"end":{"line":541,"column":29}},{"start":{"line":541,"column":33},"end":{"line":541,"column":69}}],"line":541},"77":{"loc":{"start":{"line":552,"column":2},"end":{"line":567,"column":3}},"type":"if","locations":[{"start":{"line":552,"column":2},"end":{"line":567,"column":3}},{"start":{"line":552,"column":2},"end":{"line":567,"column":3}}],"line":552},"78":{"loc":{"start":{"line":553,"column":4},"end":{"line":555,"column":51}},"type":"binary-expr","locations":[{"start":{"line":553,"column":4},"end":{"line":553,"column":14}},{"start":{"line":554,"column":4},"end":{"line":554,"column":31}},{"start":{"line":555,"column":4},"end":{"line":555,"column":51}}],"line":553},"79":{"loc":{"start":{"line":557,"column":4},"end":{"line":565,"column":5}},"type":"if","locations":[{"start":{"line":557,"column":4},"end":{"line":565,"column":5}},{"start":{"line":557,"column":4},"end":{"line":565,"column":5}}],"line":557},"80":{"loc":{"start":{"line":561,"column":11},"end":{"line":565,"column":5}},"type":"if","locations":[{"start":{"line":561,"column":11},"end":{"line":565,"column":5}},{"start":{"line":561,"column":11},"end":{"line":565,"column":5}}],"line":561},"81":{"loc":{"start":{"line":569,"column":2},"end":{"line":589,"column":3}},"type":"if","locations":[{"start":{"line":569,"column":2},"end":{"line":589,"column":3}},{"start":{"line":569,"column":2},"end":{"line":589,"column":3}}],"line":569},"82":{"loc":{"start":{"line":569,"column":6},"end":{"line":569,"column":28}},"type":"binary-expr","locations":[{"start":{"line":569,"column":6},"end":{"line":569,"column":14}},{"start":{"line":569,"column":18},"end":{"line":569,"column":28}}],"line":569},"83":{"loc":{"start":{"line":584,"column":4},"end":{"line":586,"column":5}},"type":"if","locations":[{"start":{"line":584,"column":4},"end":{"line":586,"column":5}},{"start":{"line":584,"column":4},"end":{"line":586,"column":5}}],"line":584},"84":{"loc":{"start":{"line":595,"column":2},"end":{"line":600,"column":3}},"type":"if","locations":[{"start":{"line":595,"column":2},"end":{"line":600,"column":3}},{"start":{"line":595,"column":2},"end":{"line":600,"column":3}}],"line":595},"85":{"loc":{"start":{"line":602,"column":20},"end":{"line":602,"column":66}},"type":"binary-expr","locations":[{"start":{"line":602,"column":20},"end":{"line":602,"column":45}},{"start":{"line":602,"column":49},"end":{"line":602,"column":66}}],"line":602},"86":{"loc":{"start":{"line":603,"column":2},"end":{"line":622,"column":3}},"type":"if","locations":[{"start":{"line":603,"column":2},"end":{"line":622,"column":3}},{"start":{"line":603,"column":2},"end":{"line":622,"column":3}}],"line":603},"87":{"loc":{"start":{"line":612,"column":4},"end":{"line":621,"column":5}},"type":"if","locations":[{"start":{"line":612,"column":4},"end":{"line":621,"column":5}},{"start":{"line":612,"column":4},"end":{"line":621,"column":5}}],"line":612},"88":{"loc":{"start":{"line":612,"column":8},"end":{"line":612,"column":36}},"type":"binary-expr","locations":[{"start":{"line":612,"column":8},"end":{"line":612,"column":20}},{"start":{"line":612,"column":24},"end":{"line":612,"column":36}}],"line":612},"89":{"loc":{"start":{"line":625,"column":2},"end":{"line":632,"column":6}},"type":"if","locations":[{"start":{"line":625,"column":2},"end":{"line":632,"column":6}},{"start":{"line":625,"column":2},"end":{"line":632,"column":6}}],"line":625},"90":{"loc":{"start":{"line":634,"column":2},"end":{"line":641,"column":6}},"type":"if","locations":[{"start":{"line":634,"column":2},"end":{"line":641,"column":6}},{"start":{"line":634,"column":2},"end":{"line":641,"column":6}}],"line":634},"91":{"loc":{"start":{"line":648,"column":2},"end":{"line":727,"column":3}},"type":"switch","locations":[{"start":{"line":649,"column":4},"end":{"line":658,"column":7}},{"start":{"line":659,"column":4},"end":{"line":659,"column":24}},{"start":{"line":660,"column":4},"end":{"line":662,"column":12}},{"start":{"line":663,"column":4},"end":{"line":724,"column":12}},{"start":{"line":725,"column":4},"end":{"line":726,"column":63}}],"line":648},"92":{"loc":{"start":{"line":650,"column":6},"end":{"line":658,"column":7}},"type":"if","locations":[{"start":{"line":650,"column":6},"end":{"line":658,"column":7}},{"start":{"line":650,"column":6},"end":{"line":658,"column":7}}],"line":650},"93":{"loc":{"start":{"line":664,"column":6},"end":{"line":666,"column":7}},"type":"if","locations":[{"start":{"line":664,"column":6},"end":{"line":666,"column":7}},{"start":{"line":664,"column":6},"end":{"line":666,"column":7}}],"line":664},"94":{"loc":{"start":{"line":668,"column":6},"end":{"line":675,"column":7}},"type":"if","locations":[{"start":{"line":668,"column":6},"end":{"line":675,"column":7}},{"start":{"line":668,"column":6},"end":{"line":675,"column":7}}],"line":668},"95":{"loc":{"start":{"line":670,"column":10},"end":{"line":672,"column":11}},"type":"if","locations":[{"start":{"line":670,"column":10},"end":{"line":672,"column":11}},{"start":{"line":670,"column":10},"end":{"line":672,"column":11}}],"line":670},"96":{"loc":{"start":{"line":676,"column":19},"end":{"line":676,"column":79}},"type":"cond-expr","locations":[{"start":{"line":676,"column":39},"end":{"line":676,"column":49}},{"start":{"line":676,"column":52},"end":{"line":676,"column":79}}],"line":676},"97":{"loc":{"start":{"line":678,"column":6},"end":{"line":723,"column":7}},"type":"switch","locations":[{"start":{"line":679,"column":8},"end":{"line":679,"column":56}},{"start":{"line":680,"column":8},"end":{"line":682,"column":16}},{"start":{"line":683,"column":8},"end":{"line":685,"column":16}},{"start":{"line":686,"column":8},"end":{"line":686,"column":50}},{"start":{"line":687,"column":8},"end":{"line":689,"column":16}},{"start":{"line":690,"column":8},"end":{"line":690,"column":52}},{"start":{"line":691,"column":8},"end":{"line":693,"column":16}},{"start":{"line":694,"column":8},"end":{"line":694,"column":54}},{"start":{"line":695,"column":8},"end":{"line":697,"column":16}},{"start":{"line":698,"column":8},"end":{"line":698,"column":53}},{"start":{"line":699,"column":8},"end":{"line":701,"column":16}},{"start":{"line":702,"column":8},"end":{"line":702,"column":29}},{"start":{"line":703,"column":8},"end":{"line":703,"column":30}},{"start":{"line":704,"column":8},"end":{"line":704,"column":20}},{"start":{"line":705,"column":8},"end":{"line":705,"column":36}},{"start":{"line":706,"column":8},"end":{"line":706,"column":23}},{"start":{"line":707,"column":8},"end":{"line":707,"column":32}},{"start":{"line":708,"column":8},"end":{"line":708,"column":22}},{"start":{"line":709,"column":8},"end":{"line":709,"column":28}},{"start":{"line":710,"column":8},"end":{"line":710,"column":24}},{"start":{"line":711,"column":8},"end":{"line":711,"column":26}},{"start":{"line":712,"column":8},"end":{"line":712,"column":33}},{"start":{"line":713,"column":8},"end":{"line":716,"column":16}},{"start":{"line":717,"column":8},"end":{"line":719,"column":16}},{"start":{"line":720,"column":8},"end":{"line":722,"column":16}}],"line":678},"98":{"loc":{"start":{"line":742,"column":2},"end":{"line":745,"column":3}},"type":"if","locations":[{"start":{"line":742,"column":2},"end":{"line":745,"column":3}},{"start":{"line":742,"column":2},"end":{"line":745,"column":3}}],"line":742},"99":{"loc":{"start":{"line":742,"column":6},"end":{"line":742,"column":50}},"type":"binary-expr","locations":[{"start":{"line":742,"column":6},"end":{"line":742,"column":28}},{"start":{"line":742,"column":32},"end":{"line":742,"column":50}}],"line":742},"100":{"loc":{"start":{"line":750,"column":8},"end":{"line":757,"column":9}},"type":"if","locations":[{"start":{"line":750,"column":8},"end":{"line":757,"column":9}},{"start":{"line":750,"column":8},"end":{"line":757,"column":9}}],"line":750},"101":{"loc":{"start":{"line":767,"column":10},"end":{"line":771,"column":17}},"type":"cond-expr","locations":[{"start":{"line":768,"column":14},"end":{"line":768,"column":35}},{"start":{"line":769,"column":14},"end":{"line":771,"column":17}}],"line":767},"102":{"loc":{"start":{"line":769,"column":14},"end":{"line":771,"column":17}},"type":"cond-expr","locations":[{"start":{"line":770,"column":14},"end":{"line":770,"column":24}},{"start":{"line":771,"column":14},"end":{"line":771,"column":17}}],"line":769},"103":{"loc":{"start":{"line":772,"column":10},"end":{"line":772,"column":69}},"type":"binary-expr","locations":[{"start":{"line":772,"column":10},"end":{"line":772,"column":23}},{"start":{"line":772,"column":27},"end":{"line":772,"column":69}}],"line":772}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":11,"9":11,"10":10,"11":1,"12":1,"13":15,"14":15,"15":0,"16":15,"17":15,"18":2,"19":2,"20":2,"21":2,"22":13,"23":8,"24":13,"25":13,"26":5,"27":2,"28":5,"29":13,"30":2,"31":13,"32":1,"33":6,"34":6,"35":6,"36":6,"37":6,"38":6,"39":6,"40":6,"41":6,"42":12,"43":12,"44":12,"45":12,"46":6,"47":11,"48":1,"49":0,"50":5,"51":1,"52":4,"53":4,"54":4,"55":4,"56":2,"57":4,"58":4,"59":4,"60":4,"61":4,"62":0,"63":4,"64":2,"65":2,"66":2,"67":2,"68":4,"69":6,"70":0,"71":4,"72":1,"73":5,"74":5,"75":5,"76":5,"77":5,"78":5,"79":5,"80":4,"81":4,"82":4,"83":0,"84":4,"85":1,"86":31,"87":31,"88":31,"89":31,"90":31,"91":31,"92":31,"93":31,"94":31,"95":31,"96":31,"97":31,"98":31,"99":31,"100":31,"101":31,"102":31,"103":31,"104":31,"105":31,"106":255,"107":255,"108":255,"109":9,"110":255,"111":3,"112":2,"113":1,"114":255,"115":255,"116":212,"117":31,"118":1,"119":34,"120":34,"121":34,"122":34,"123":34,"124":34,"125":34,"126":34,"127":34,"128":3,"129":3,"130":34,"131":34,"132":34,"133":34,"134":34,"135":0,"136":0,"137":0,"138":34,"139":31,"140":31,"141":1,"142":31,"143":0,"144":31,"145":31,"146":31,"147":21,"148":4,"149":4,"150":4,"151":1,"152":1,"153":1,"154":4,"155":3,"156":3,"157":5,"158":4,"159":4,"160":2,"161":2,"162":2,"163":1,"164":1,"165":1,"166":2,"167":2,"168":2,"169":2,"170":2,"171":2,"172":0,"173":19,"174":10,"175":10,"176":2,"177":10,"178":8,"179":8,"180":3,"181":32,"182":1,"183":1,"184":1,"185":32,"186":3,"187":1,"188":2,"189":1,"190":1,"191":31,"192":31,"193":31,"194":31,"195":31,"196":31,"197":31,"198":1,"199":31,"200":31,"201":0,"202":1,"203":38,"204":0,"205":38,"206":38,"207":38,"208":38,"209":38,"210":38,"211":38,"212":2,"213":2,"214":36,"215":36,"216":36,"217":10,"218":36,"219":36,"220":36,"221":36,"222":4,"223":3,"224":3,"225":1,"226":3,"227":3,"228":29,"229":1,"230":28,"231":28,"232":28,"233":28,"234":4,"235":28,"236":28,"237":28,"238":4,"239":4,"240":1,"241":1,"242":4,"243":4,"244":5,"245":5,"246":2,"247":2,"248":1,"249":1,"250":2,"251":2,"252":2,"253":1,"254":1,"255":8,"256":8,"257":28,"258":0,"259":34,"260":1,"261":38,"262":1,"263":1,"264":0,"265":0,"266":1,"267":2,"268":2,"269":0,"270":2,"271":0,"272":1,"273":1},"f":{"0":11,"1":15,"2":5,"3":6,"4":11,"5":4,"6":4,"7":6,"8":5,"9":4,"10":31,"11":255,"12":34,"13":38,"14":28,"15":38,"16":1,"17":2},"b":{"0":[11,1],"1":[10,1],"2":[0,15],"3":[15,15,0,0],"4":[2,13],"5":[2,0],"6":[2,2,2],"7":[2,0],"8":[8,5],"9":[2,3],"10":[2,11],"11":[6,0],"12":[6,6,6],"13":[12,12,1,1],"14":[12,0,0],"15":[12,0],"16":[1,10],"17":[5,0],"18":[2,2],"19":[4,2,2],"20":[4,0],"21":[4,0,0,0],"22":[4,0],"23":[4,4,0],"24":[2,2],"25":[2,0],"26":[2,0],"27":[0,6],"28":[5,5,1,0],"29":[5,5,4],"30":[5,0],"31":[5,0],"32":[4,1],"33":[4,4,1,0],"34":[4,0],"35":[0,4],"36":[31,0],"37":[31,0],"38":[31,0],"39":[255,251],"40":[9,246],"41":[255,13],"42":[3,252],"43":[2,1],"44":[0,2],"45":[2,0],"46":[255,251],"47":[212,43],"48":[255,223,219],"49":[34,0],"50":[3,31],"51":[3,31],"52":[34,3,3],"53":[0,3],"54":[3,0],"55":[0,3],"56":[3,0],"57":[0,34],"58":[0,0],"59":[31,3],"60":[1,30],"61":[31,1],"62":[0,31],"63":[31,0],"64":[31,0],"65":[21,10],"66":[4,1,4,5,2,1,1,2,2,0],"67":[15,4],"68":[15,6],"69":[2,8],"70":[10,8],"71":[1,1],"72":[8,2],"73":[8,0],"74":[1,31],"75":[1,0],"76":[1,1],"77":[3,29],"78":[32,29,8],"79":[1,2],"80":[1,1],"81":[31,0],"82":[31,31],"83":[1,30],"84":[0,38],"85":[38,13],"86":[38,0],"87":[2,36],"88":[38,36],"89":[36,0],"90":[10,26],"91":[4,3,3,29,0],"92":[3,1],"93":[1,28],"94":[28,0],"95":[4,24],"96":[4,24],"97":[3,4,1,4,4,5,5,2,2,1,1,0,0,0,0,0,0,0,0,2,2,2,2,1,8],"98":[0,1],"99":[1,1],"100":[0,2],"101":[0,0],"102":[0,0],"103":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"39840c0205f410be0f0a0026c5939662d1982edf"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\fb\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\fb\\config.js","statementMap":{"0":{"start":{"line":1,"column":11},"end":{"line":1,"column":24}},"1":{"start":{"line":2,"column":13},"end":{"line":2,"column":28}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":53}},"3":{"start":{"line":4,"column":24},"end":{"line":4,"column":53}},"4":{"start":{"line":6,"column":20},"end":{"line":8,"column":1}},"5":{"start":{"line":10,"column":25},"end":{"line":12,"column":1}},"6":{"start":{"line":14,"column":26},"end":{"line":16,"column":1}},"7":{"start":{"line":18,"column":32},"end":{"line":20,"column":1}},"8":{"start":{"line":22,"column":31},"end":{"line":24,"column":1}},"9":{"start":{"line":26,"column":0},"end":{"line":32,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":16},"end":{"line":4,"column":17}},"loc":{"start":{"line":4,"column":24},"end":{"line":4,"column":53}},"line":4}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":5,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1},"f":{"0":5},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f1d0175dabf0e52bb57b65cc0e5eb81f9b1cde7f"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\fb\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\fb\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":15},"end":{"line":3,"column":32}},"3":{"start":{"line":4,"column":22},"end":{"line":4,"column":51}},"4":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"5":{"start":{"line":23,"column":4},"end":{"line":23,"column":23}},"6":{"start":{"line":24,"column":15},"end":{"line":24,"column":41}},"7":{"start":{"line":31,"column":21},"end":{"line":31,"column":75}},"8":{"start":{"line":32,"column":18},"end":{"line":42,"column":1}},"9":{"start":{"line":43,"column":33},"end":{"line":43,"column":69}},"10":{"start":{"line":44,"column":26},"end":{"line":44,"column":62}},"11":{"start":{"line":48,"column":19},"end":{"line":48,"column":75}},"12":{"start":{"line":49,"column":2},"end":{"line":49,"column":69}},"13":{"start":{"line":51,"column":12},"end":{"line":51,"column":60}},"14":{"start":{"line":52,"column":2},"end":{"line":52,"column":73}},"15":{"start":{"line":53,"column":2},"end":{"line":53,"column":58}},"16":{"start":{"line":54,"column":2},"end":{"line":54,"column":74}},"17":{"start":{"line":56,"column":16},"end":{"line":56,"column":21}},"18":{"start":{"line":57,"column":2},"end":{"line":107,"column":5}},"19":{"start":{"line":58,"column":4},"end":{"line":106,"column":5}},"20":{"start":{"line":64,"column":8},"end":{"line":67,"column":9}},"21":{"start":{"line":65,"column":10},"end":{"line":65,"column":25}},"22":{"start":{"line":66,"column":10},"end":{"line":66,"column":72}},"23":{"start":{"line":68,"column":8},"end":{"line":68,"column":14}},"24":{"start":{"line":71,"column":8},"end":{"line":80,"column":9}},"25":{"start":{"line":72,"column":10},"end":{"line":72,"column":25}},"26":{"start":{"line":74,"column":29},"end":{"line":74,"column":70}},"27":{"start":{"line":76,"column":10},"end":{"line":76,"column":58}},"28":{"start":{"line":77,"column":10},"end":{"line":79,"column":11}},"29":{"start":{"line":78,"column":12},"end":{"line":78,"column":54}},"30":{"start":{"line":81,"column":8},"end":{"line":81,"column":14}},"31":{"start":{"line":83,"column":8},"end":{"line":88,"column":9}},"32":{"start":{"line":84,"column":10},"end":{"line":84,"column":25}},"33":{"start":{"line":85,"column":10},"end":{"line":87,"column":12}},"34":{"start":{"line":89,"column":8},"end":{"line":89,"column":14}},"35":{"start":{"line":91,"column":8},"end":{"line":94,"column":9}},"36":{"start":{"line":92,"column":10},"end":{"line":92,"column":25}},"37":{"start":{"line":93,"column":10},"end":{"line":93,"column":75}},"38":{"start":{"line":95,"column":8},"end":{"line":95,"column":14}},"39":{"start":{"line":97,"column":8},"end":{"line":102,"column":9}},"40":{"start":{"line":98,"column":10},"end":{"line":98,"column":25}},"41":{"start":{"line":99,"column":10},"end":{"line":101,"column":12}},"42":{"start":{"line":103,"column":8},"end":{"line":103,"column":14}},"43":{"start":{"line":105,"column":8},"end":{"line":105,"column":14}},"44":{"start":{"line":110,"column":2},"end":{"line":112,"column":3}},"45":{"start":{"line":111,"column":4},"end":{"line":111,"column":32}},"46":{"start":{"line":114,"column":2},"end":{"line":119,"column":3}},"47":{"start":{"line":115,"column":4},"end":{"line":118,"column":6}},"48":{"start":{"line":121,"column":2},"end":{"line":123,"column":3}},"49":{"start":{"line":122,"column":4},"end":{"line":122,"column":76}},"50":{"start":{"line":125,"column":2},"end":{"line":127,"column":3}},"51":{"start":{"line":126,"column":4},"end":{"line":126,"column":64}},"52":{"start":{"line":130,"column":2},"end":{"line":130,"column":43}},"53":{"start":{"line":134,"column":15},"end":{"line":134,"column":48}},"54":{"start":{"line":136,"column":2},"end":{"line":138,"column":3}},"55":{"start":{"line":137,"column":4},"end":{"line":137,"column":17}},"56":{"start":{"line":140,"column":2},"end":{"line":147,"column":4}},"57":{"start":{"line":151,"column":23},"end":{"line":153,"column":3}},"58":{"start":{"line":154,"column":2},"end":{"line":154,"column":64}},"59":{"start":{"line":156,"column":25},"end":{"line":156,"column":32}},"60":{"start":{"line":157,"column":2},"end":{"line":218,"column":3}},"61":{"start":{"line":158,"column":4},"end":{"line":162,"column":5}},"62":{"start":{"line":159,"column":6},"end":{"line":161,"column":8}},"63":{"start":{"line":164,"column":4},"end":{"line":217,"column":7}},"64":{"start":{"line":165,"column":6},"end":{"line":165,"column":23}},"65":{"start":{"line":166,"column":6},"end":{"line":179,"column":7}},"66":{"start":{"line":168,"column":8},"end":{"line":168,"column":66}},"67":{"start":{"line":169,"column":8},"end":{"line":172,"column":9}},"68":{"start":{"line":171,"column":10},"end":{"line":171,"column":44}},"69":{"start":{"line":173,"column":8},"end":{"line":178,"column":9}},"70":{"start":{"line":174,"column":10},"end":{"line":177,"column":12}},"71":{"start":{"line":180,"column":6},"end":{"line":216,"column":7}},"72":{"start":{"line":181,"column":30},"end":{"line":181,"column":56}},"73":{"start":{"line":182,"column":26},"end":{"line":182,"column":60}},"74":{"start":{"line":184,"column":8},"end":{"line":213,"column":9}},"75":{"start":{"line":185,"column":45},"end":{"line":185,"column":75}},"76":{"start":{"line":186,"column":30},"end":{"line":186,"column":55}},"77":{"start":{"line":187,"column":10},"end":{"line":187,"column":58}},"78":{"start":{"line":189,"column":23},"end":{"line":189,"column":24}},"79":{"start":{"line":190,"column":22},"end":{"line":190,"column":40}},"80":{"start":{"line":191,"column":10},"end":{"line":202,"column":11}},"81":{"start":{"line":192,"column":32},"end":{"line":192,"column":69}},"82":{"start":{"line":193,"column":12},"end":{"line":198,"column":22}},"83":{"start":{"line":200,"column":12},"end":{"line":200,"column":24}},"84":{"start":{"line":201,"column":12},"end":{"line":201,"column":23}},"85":{"start":{"line":204,"column":10},"end":{"line":204,"column":55}},"86":{"start":{"line":205,"column":10},"end":{"line":205,"column":59}},"87":{"start":{"line":206,"column":30},"end":{"line":206,"column":59}},"88":{"start":{"line":207,"column":10},"end":{"line":212,"column":12}},"89":{"start":{"line":215,"column":8},"end":{"line":215,"column":72}},"90":{"start":{"line":219,"column":2},"end":{"line":219,"column":22}},"91":{"start":{"line":223,"column":20},"end":{"line":223,"column":38}},"92":{"start":{"line":227,"column":19},"end":{"line":227,"column":73}},"93":{"start":{"line":229,"column":19},"end":{"line":229,"column":41}},"94":{"start":{"line":230,"column":2},"end":{"line":230,"column":31}},"95":{"start":{"line":231,"column":2},"end":{"line":231,"column":59}},"96":{"start":{"line":232,"column":2},"end":{"line":232,"column":74}},"97":{"start":{"line":233,"column":2},"end":{"line":233,"column":54}},"98":{"start":{"line":234,"column":2},"end":{"line":234,"column":28}},"99":{"start":{"line":236,"column":2},"end":{"line":236,"column":18}},"100":{"start":{"line":240,"column":20},"end":{"line":240,"column":22}},"101":{"start":{"line":241,"column":2},"end":{"line":241,"column":35}},"102":{"start":{"line":242,"column":2},"end":{"line":242,"column":33}},"103":{"start":{"line":244,"column":18},"end":{"line":244,"column":59}},"104":{"start":{"line":245,"column":2},"end":{"line":245,"column":38}},"105":{"start":{"line":246,"column":2},"end":{"line":256,"column":3}},"106":{"start":{"line":247,"column":4},"end":{"line":247,"column":21}},"107":{"start":{"line":248,"column":9},"end":{"line":256,"column":3}},"108":{"start":{"line":249,"column":4},"end":{"line":249,"column":21}},"109":{"start":{"line":252,"column":4},"end":{"line":255,"column":6}},"110":{"start":{"line":258,"column":2},"end":{"line":258,"column":35}},"111":{"start":{"line":260,"column":2},"end":{"line":293,"column":5}},"112":{"start":{"line":261,"column":36},"end":{"line":261,"column":38}},"113":{"start":{"line":262,"column":21},"end":{"line":262,"column":61}},"114":{"start":{"line":263,"column":4},"end":{"line":292,"column":5}},"115":{"start":{"line":264,"column":21},"end":{"line":264,"column":39}},"116":{"start":{"line":265,"column":6},"end":{"line":291,"column":7}},"117":{"start":{"line":266,"column":8},"end":{"line":266,"column":31}},"118":{"start":{"line":268,"column":8},"end":{"line":283,"column":9}},"119":{"start":{"line":270,"column":12},"end":{"line":277,"column":13}},"120":{"start":{"line":272,"column":14},"end":{"line":272,"column":47}},"121":{"start":{"line":273,"column":14},"end":{"line":273,"column":78}},"122":{"start":{"line":275,"column":14},"end":{"line":275,"column":49}},"123":{"start":{"line":276,"column":14},"end":{"line":276,"column":67}},"124":{"start":{"line":278,"column":12},"end":{"line":278,"column":18}},"125":{"start":{"line":281,"column":12},"end":{"line":281,"column":33}},"126":{"start":{"line":282,"column":12},"end":{"line":282,"column":18}},"127":{"start":{"line":284,"column":8},"end":{"line":285,"column":53}},"128":{"start":{"line":286,"column":13},"end":{"line":291,"column":7}},"129":{"start":{"line":288,"column":8},"end":{"line":288,"column":67}},"130":{"start":{"line":290,"column":8},"end":{"line":290,"column":48}},"131":{"start":{"line":294,"column":2},"end":{"line":294,"column":19}},"132":{"start":{"line":299,"column":20},"end":{"line":299,"column":43}},"133":{"start":{"line":300,"column":20},"end":{"line":300,"column":33}},"134":{"start":{"line":301,"column":21},"end":{"line":301,"column":23}},"135":{"start":{"line":303,"column":2},"end":{"line":338,"column":3}},"136":{"start":{"line":305,"column":6},"end":{"line":305,"column":61}},"137":{"start":{"line":306,"column":6},"end":{"line":311,"column":7}},"138":{"start":{"line":307,"column":8},"end":{"line":310,"column":10}},"139":{"start":{"line":312,"column":6},"end":{"line":312,"column":78}},"140":{"start":{"line":313,"column":6},"end":{"line":313,"column":12}},"141":{"start":{"line":315,"column":23},"end":{"line":315,"column":41}},"142":{"start":{"line":316,"column":6},"end":{"line":327,"column":7}},"143":{"start":{"line":318,"column":8},"end":{"line":318,"column":38}},"144":{"start":{"line":320,"column":8},"end":{"line":320,"column":46}},"145":{"start":{"line":321,"column":8},"end":{"line":326,"column":9}},"146":{"start":{"line":322,"column":10},"end":{"line":325,"column":12}},"147":{"start":{"line":328,"column":6},"end":{"line":328,"column":78}},"148":{"start":{"line":329,"column":6},"end":{"line":329,"column":12}},"149":{"start":{"line":332,"column":6},"end":{"line":332,"column":34}},"150":{"start":{"line":333,"column":6},"end":{"line":333,"column":78}},"151":{"start":{"line":334,"column":6},"end":{"line":334,"column":12}},"152":{"start":{"line":336,"column":6},"end":{"line":336,"column":47}},"153":{"start":{"line":337,"column":6},"end":{"line":337,"column":63}},"154":{"start":{"line":340,"column":2},"end":{"line":340,"column":59}},"155":{"start":{"line":341,"column":2},"end":{"line":341,"column":67}},"156":{"start":{"line":345,"column":15},"end":{"line":345,"column":69}},"157":{"start":{"line":346,"column":2},"end":{"line":348,"column":3}},"158":{"start":{"line":347,"column":4},"end":{"line":347,"column":26}},"159":{"start":{"line":349,"column":2},"end":{"line":349,"column":14}},"160":{"start":{"line":352,"column":26},"end":{"line":389,"column":1}},"161":{"start":{"line":353,"column":2},"end":{"line":356,"column":3}},"162":{"start":{"line":354,"column":23},"end":{"line":354,"column":75}},"163":{"start":{"line":355,"column":4},"end":{"line":355,"column":24}},"164":{"start":{"line":358,"column":19},"end":{"line":387,"column":3}},"165":{"start":{"line":360,"column":6},"end":{"line":385,"column":7}},"166":{"start":{"line":361,"column":8},"end":{"line":368,"column":9}},"167":{"start":{"line":363,"column":10},"end":{"line":367,"column":12}},"168":{"start":{"line":370,"column":8},"end":{"line":374,"column":10}},"169":{"start":{"line":376,"column":8},"end":{"line":384,"column":10}},"170":{"start":{"line":388,"column":2},"end":{"line":388,"column":18}},"171":{"start":{"line":391,"column":0},"end":{"line":391,"column":48}}},"fnMap":{"0":{"name":"sanityCheckPayloadForTypesAndModifications","decl":{"start":{"line":46,"column":9},"end":{"line":46,"column":51}},"loc":{"start":{"line":46,"column":66},"end":{"line":131,"column":1}},"line":46},"1":{"name":"(anonymous_1)","decl":{"start":{"line":57,"column":20},"end":{"line":57,"column":21}},"loc":{"start":{"line":57,"column":28},"end":{"line":107,"column":3}},"line":57},"2":{"name":"getCorrectedTypedValue","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":31}},"loc":{"start":{"line":133,"column":64},"end":{"line":148,"column":1}},"line":133},"3":{"name":"processEventTypeGeneric","decl":{"start":{"line":150,"column":9},"end":{"line":150,"column":32}},"loc":{"start":{"line":150,"column":66},"end":{"line":220,"column":1}},"line":150},"4":{"name":"(anonymous_4)","decl":{"start":{"line":164,"column":36},"end":{"line":164,"column":37}},"loc":{"start":{"line":164,"column":41},"end":{"line":217,"column":5}},"line":164},"5":{"name":"responseBuilderSimple","decl":{"start":{"line":222,"column":9},"end":{"line":222,"column":30}},"loc":{"start":{"line":222,"column":62},"end":{"line":237,"column":1}},"line":222},"6":{"name":"buildBaseEvent","decl":{"start":{"line":239,"column":9},"end":{"line":239,"column":23}},"loc":{"start":{"line":239,"column":33},"end":{"line":295,"column":1}},"line":239},"7":{"name":"(anonymous_7)","decl":{"start":{"line":260,"column":22},"end":{"line":260,"column":23}},"loc":{"start":{"line":260,"column":28},"end":{"line":293,"column":3}},"line":260},"8":{"name":"processSingleMessage","decl":{"start":{"line":297,"column":9},"end":{"line":297,"column":29}},"loc":{"start":{"line":297,"column":52},"end":{"line":342,"column":1}},"line":297},"9":{"name":"process","decl":{"start":{"line":344,"column":9},"end":{"line":344,"column":16}},"loc":{"start":{"line":344,"column":24},"end":{"line":350,"column":1}},"line":344},"10":{"name":"(anonymous_10)","decl":{"start":{"line":352,"column":26},"end":{"line":352,"column":27}},"loc":{"start":{"line":352,"column":42},"end":{"line":389,"column":1}},"line":352},"11":{"name":"(anonymous_11)","decl":{"start":{"line":359,"column":15},"end":{"line":359,"column":16}},"loc":{"start":{"line":359,"column":30},"end":{"line":386,"column":5}},"line":359}},"branchMap":{"0":{"loc":{"start":{"line":52,"column":45},"end":{"line":52,"column":72}},"type":"cond-expr","locations":[{"start":{"line":52,"column":58},"end":{"line":52,"column":61}},{"start":{"line":52,"column":64},"end":{"line":52,"column":72}}],"line":52},"1":{"loc":{"start":{"line":54,"column":46},"end":{"line":54,"column":73}},"type":"cond-expr","locations":[{"start":{"line":54,"column":59},"end":{"line":54,"column":62}},{"start":{"line":54,"column":65},"end":{"line":54,"column":73}}],"line":54},"2":{"loc":{"start":{"line":58,"column":4},"end":{"line":106,"column":5}},"type":"switch","locations":[{"start":{"line":59,"column":6},"end":{"line":59,"column":20}},{"start":{"line":60,"column":6},"end":{"line":60,"column":20}},{"start":{"line":61,"column":6},"end":{"line":61,"column":20}},{"start":{"line":62,"column":6},"end":{"line":62,"column":20}},{"start":{"line":63,"column":6},"end":{"line":68,"column":14}},{"start":{"line":69,"column":6},"end":{"line":69,"column":20}},{"start":{"line":70,"column":6},"end":{"line":81,"column":14}},{"start":{"line":82,"column":6},"end":{"line":89,"column":14}},{"start":{"line":90,"column":6},"end":{"line":95,"column":14}},{"start":{"line":96,"column":6},"end":{"line":103,"column":14}},{"start":{"line":104,"column":6},"end":{"line":105,"column":14}}],"line":58},"3":{"loc":{"start":{"line":64,"column":8},"end":{"line":67,"column":9}},"type":"if","locations":[{"start":{"line":64,"column":8},"end":{"line":67,"column":9}},{"start":{"line":64,"column":8},"end":{"line":67,"column":9}}],"line":64},"4":{"loc":{"start":{"line":64,"column":12},"end":{"line":64,"column":59}},"type":"binary-expr","locations":[{"start":{"line":64,"column":12},"end":{"line":64,"column":30}},{"start":{"line":64,"column":34},"end":{"line":64,"column":59}}],"line":64},"5":{"loc":{"start":{"line":71,"column":8},"end":{"line":80,"column":9}},"type":"if","locations":[{"start":{"line":71,"column":8},"end":{"line":80,"column":9}},{"start":{"line":71,"column":8},"end":{"line":80,"column":9}}],"line":71},"6":{"loc":{"start":{"line":71,"column":12},"end":{"line":71,"column":59}},"type":"binary-expr","locations":[{"start":{"line":71,"column":12},"end":{"line":71,"column":30}},{"start":{"line":71,"column":34},"end":{"line":71,"column":59}}],"line":71},"7":{"loc":{"start":{"line":77,"column":10},"end":{"line":79,"column":11}},"type":"if","locations":[{"start":{"line":77,"column":10},"end":{"line":79,"column":11}},{"start":{"line":77,"column":10},"end":{"line":79,"column":11}}],"line":77},"8":{"loc":{"start":{"line":83,"column":8},"end":{"line":88,"column":9}},"type":"if","locations":[{"start":{"line":83,"column":8},"end":{"line":88,"column":9}},{"start":{"line":83,"column":8},"end":{"line":88,"column":9}}],"line":83},"9":{"loc":{"start":{"line":83,"column":12},"end":{"line":83,"column":59}},"type":"binary-expr","locations":[{"start":{"line":83,"column":12},"end":{"line":83,"column":30}},{"start":{"line":83,"column":34},"end":{"line":83,"column":59}}],"line":83},"10":{"loc":{"start":{"line":86,"column":12},"end":{"line":86,"column":69}},"type":"cond-expr","locations":[{"start":{"line":86,"column":60},"end":{"line":86,"column":63}},{"start":{"line":86,"column":66},"end":{"line":86,"column":69}}],"line":86},"11":{"loc":{"start":{"line":91,"column":8},"end":{"line":94,"column":9}},"type":"if","locations":[{"start":{"line":91,"column":8},"end":{"line":94,"column":9}},{"start":{"line":91,"column":8},"end":{"line":94,"column":9}}],"line":91},"12":{"loc":{"start":{"line":91,"column":12},"end":{"line":91,"column":59}},"type":"binary-expr","locations":[{"start":{"line":91,"column":12},"end":{"line":91,"column":30}},{"start":{"line":91,"column":34},"end":{"line":91,"column":59}}],"line":91},"13":{"loc":{"start":{"line":97,"column":8},"end":{"line":102,"column":9}},"type":"if","locations":[{"start":{"line":97,"column":8},"end":{"line":102,"column":9}},{"start":{"line":97,"column":8},"end":{"line":102,"column":9}}],"line":97},"14":{"loc":{"start":{"line":97,"column":12},"end":{"line":97,"column":59}},"type":"binary-expr","locations":[{"start":{"line":97,"column":12},"end":{"line":97,"column":30}},{"start":{"line":97,"column":34},"end":{"line":97,"column":59}}],"line":97},"15":{"loc":{"start":{"line":110,"column":2},"end":{"line":112,"column":3}},"type":"if","locations":[{"start":{"line":110,"column":2},"end":{"line":112,"column":3}},{"start":{"line":110,"column":2},"end":{"line":112,"column":3}}],"line":110},"16":{"loc":{"start":{"line":110,"column":6},"end":{"line":110,"column":43}},"type":"binary-expr","locations":[{"start":{"line":110,"column":6},"end":{"line":110,"column":13}},{"start":{"line":110,"column":17},"end":{"line":110,"column":43}}],"line":110},"17":{"loc":{"start":{"line":114,"column":2},"end":{"line":119,"column":3}},"type":"if","locations":[{"start":{"line":114,"column":2},"end":{"line":119,"column":3}},{"start":{"line":114,"column":2},"end":{"line":119,"column":3}}],"line":114},"18":{"loc":{"start":{"line":114,"column":6},"end":{"line":114,"column":70}},"type":"binary-expr","locations":[{"start":{"line":114,"column":6},"end":{"line":114,"column":14}},{"start":{"line":114,"column":18},"end":{"line":114,"column":45}},{"start":{"line":114,"column":49},"end":{"line":114,"column":70}}],"line":114},"19":{"loc":{"start":{"line":121,"column":2},"end":{"line":123,"column":3}},"type":"if","locations":[{"start":{"line":121,"column":2},"end":{"line":123,"column":3}},{"start":{"line":121,"column":2},"end":{"line":123,"column":3}}],"line":121},"20":{"loc":{"start":{"line":125,"column":2},"end":{"line":127,"column":3}},"type":"if","locations":[{"start":{"line":125,"column":2},"end":{"line":127,"column":3}},{"start":{"line":125,"column":2},"end":{"line":127,"column":3}}],"line":125},"21":{"loc":{"start":{"line":136,"column":2},"end":{"line":138,"column":3}},"type":"if","locations":[{"start":{"line":136,"column":2},"end":{"line":138,"column":3}},{"start":{"line":136,"column":2},"end":{"line":138,"column":3}}],"line":136},"22":{"loc":{"start":{"line":142,"column":6},"end":{"line":144,"column":22}},"type":"cond-expr","locations":[{"start":{"line":143,"column":10},"end":{"line":143,"column":38}},{"start":{"line":144,"column":10},"end":{"line":144,"column":22}}],"line":142},"23":{"loc":{"start":{"line":157,"column":2},"end":{"line":218,"column":3}},"type":"if","locations":[{"start":{"line":157,"column":2},"end":{"line":218,"column":3}},{"start":{"line":157,"column":2},"end":{"line":218,"column":3}}],"line":157},"24":{"loc":{"start":{"line":158,"column":4},"end":{"line":162,"column":5}},"type":"if","locations":[{"start":{"line":158,"column":4},"end":{"line":162,"column":5}},{"start":{"line":158,"column":4},"end":{"line":162,"column":5}}],"line":158},"25":{"loc":{"start":{"line":158,"column":8},"end":{"line":158,"column":50}},"type":"binary-expr","locations":[{"start":{"line":158,"column":8},"end":{"line":158,"column":26}},{"start":{"line":158,"column":30},"end":{"line":158,"column":50}}],"line":158},"26":{"loc":{"start":{"line":166,"column":6},"end":{"line":179,"column":7}},"type":"if","locations":[{"start":{"line":166,"column":6},"end":{"line":179,"column":7}},{"start":{"line":166,"column":6},"end":{"line":179,"column":7}}],"line":166},"27":{"loc":{"start":{"line":169,"column":8},"end":{"line":172,"column":9}},"type":"if","locations":[{"start":{"line":169,"column":8},"end":{"line":172,"column":9}},{"start":{"line":169,"column":8},"end":{"line":172,"column":9}}],"line":169},"28":{"loc":{"start":{"line":173,"column":8},"end":{"line":178,"column":9}},"type":"if","locations":[{"start":{"line":173,"column":8},"end":{"line":178,"column":9}},{"start":{"line":173,"column":8},"end":{"line":178,"column":9}}],"line":173},"29":{"loc":{"start":{"line":180,"column":6},"end":{"line":216,"column":7}},"type":"if","locations":[{"start":{"line":180,"column":6},"end":{"line":216,"column":7}},{"start":{"line":180,"column":6},"end":{"line":216,"column":7}}],"line":180},"30":{"loc":{"start":{"line":184,"column":8},"end":{"line":213,"column":9}},"type":"if","locations":[{"start":{"line":184,"column":8},"end":{"line":213,"column":9}},{"start":{"line":184,"column":8},"end":{"line":213,"column":9}}],"line":184},"31":{"loc":{"start":{"line":194,"column":14},"end":{"line":198,"column":21}},"type":"binary-expr","locations":[{"start":{"line":194,"column":14},"end":{"line":198,"column":15}},{"start":{"line":198,"column":19},"end":{"line":198,"column":21}}],"line":194},"32":{"loc":{"start":{"line":210,"column":12},"end":{"line":211,"column":16}},"type":"binary-expr","locations":[{"start":{"line":210,"column":12},"end":{"line":210,"column":77}},{"start":{"line":211,"column":14},"end":{"line":211,"column":16}}],"line":210},"33":{"loc":{"start":{"line":232,"column":20},"end":{"line":232,"column":73}},"type":"cond-expr","locations":[{"start":{"line":232,"column":37},"end":{"line":232,"column":51}},{"start":{"line":232,"column":54},"end":{"line":232,"column":73}}],"line":232},"34":{"loc":{"start":{"line":244,"column":18},"end":{"line":244,"column":59}},"type":"binary-expr","locations":[{"start":{"line":244,"column":18},"end":{"line":244,"column":53}},{"start":{"line":244,"column":57},"end":{"line":244,"column":59}}],"line":244},"35":{"loc":{"start":{"line":246,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":256,"column":3}},{"start":{"line":246,"column":2},"end":{"line":256,"column":3}}],"line":246},"36":{"loc":{"start":{"line":248,"column":9},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":248,"column":9},"end":{"line":256,"column":3}},{"start":{"line":248,"column":9},"end":{"line":256,"column":3}}],"line":248},"37":{"loc":{"start":{"line":263,"column":4},"end":{"line":292,"column":5}},"type":"if","locations":[{"start":{"line":263,"column":4},"end":{"line":292,"column":5}},{"start":{"line":263,"column":4},"end":{"line":292,"column":5}}],"line":263},"38":{"loc":{"start":{"line":265,"column":6},"end":{"line":291,"column":7}},"type":"if","locations":[{"start":{"line":265,"column":6},"end":{"line":291,"column":7}},{"start":{"line":265,"column":6},"end":{"line":291,"column":7}}],"line":265},"39":{"loc":{"start":{"line":265,"column":10},"end":{"line":265,"column":54}},"type":"binary-expr","locations":[{"start":{"line":265,"column":10},"end":{"line":265,"column":27}},{"start":{"line":265,"column":31},"end":{"line":265,"column":54}}],"line":265},"40":{"loc":{"start":{"line":268,"column":8},"end":{"line":283,"column":9}},"type":"switch","locations":[{"start":{"line":269,"column":10},"end":{"line":278,"column":18}},{"start":{"line":280,"column":10},"end":{"line":282,"column":18}}],"line":268},"41":{"loc":{"start":{"line":270,"column":12},"end":{"line":277,"column":13}},"type":"if","locations":[{"start":{"line":270,"column":12},"end":{"line":277,"column":13}},{"start":{"line":270,"column":12},"end":{"line":277,"column":13}}],"line":270},"42":{"loc":{"start":{"line":273,"column":26},"end":{"line":273,"column":77}},"type":"cond-expr","locations":[{"start":{"line":273,"column":45},"end":{"line":273,"column":54}},{"start":{"line":273,"column":57},"end":{"line":273,"column":77}}],"line":273},"43":{"loc":{"start":{"line":276,"column":26},"end":{"line":276,"column":66}},"type":"cond-expr","locations":[{"start":{"line":276,"column":45},"end":{"line":276,"column":54}},{"start":{"line":276,"column":57},"end":{"line":276,"column":66}}],"line":276},"44":{"loc":{"start":{"line":285,"column":10},"end":{"line":285,"column":52}},"type":"binary-expr","locations":[{"start":{"line":285,"column":10},"end":{"line":285,"column":19}},{"start":{"line":285,"column":23},"end":{"line":285,"column":52}}],"line":285},"45":{"loc":{"start":{"line":286,"column":13},"end":{"line":291,"column":7}},"type":"if","locations":[{"start":{"line":286,"column":13},"end":{"line":291,"column":7}},{"start":{"line":286,"column":13},"end":{"line":291,"column":7}}],"line":286},"46":{"loc":{"start":{"line":288,"column":51},"end":{"line":288,"column":65}},"type":"binary-expr","locations":[{"start":{"line":288,"column":51},"end":{"line":288,"column":59}},{"start":{"line":288,"column":63},"end":{"line":288,"column":65}}],"line":288},"47":{"loc":{"start":{"line":290,"column":32},"end":{"line":290,"column":46}},"type":"binary-expr","locations":[{"start":{"line":290,"column":32},"end":{"line":290,"column":40}},{"start":{"line":290,"column":44},"end":{"line":290,"column":46}}],"line":290},"48":{"loc":{"start":{"line":303,"column":2},"end":{"line":338,"column":3}},"type":"switch","locations":[{"start":{"line":304,"column":4},"end":{"line":313,"column":12}},{"start":{"line":314,"column":4},"end":{"line":330,"column":5}},{"start":{"line":331,"column":4},"end":{"line":334,"column":12}},{"start":{"line":335,"column":4},"end":{"line":337,"column":63}}],"line":303},"49":{"loc":{"start":{"line":305,"column":20},"end":{"line":305,"column":60}},"type":"binary-expr","locations":[{"start":{"line":305,"column":20},"end":{"line":305,"column":47}},{"start":{"line":305,"column":51},"end":{"line":305,"column":60}}],"line":305},"50":{"loc":{"start":{"line":306,"column":6},"end":{"line":311,"column":7}},"type":"if","locations":[{"start":{"line":306,"column":6},"end":{"line":311,"column":7}},{"start":{"line":306,"column":6},"end":{"line":311,"column":7}}],"line":306},"51":{"loc":{"start":{"line":316,"column":6},"end":{"line":327,"column":7}},"type":"if","locations":[{"start":{"line":316,"column":6},"end":{"line":327,"column":7}},{"start":{"line":316,"column":6},"end":{"line":327,"column":7}}],"line":316},"52":{"loc":{"start":{"line":316,"column":10},"end":{"line":316,"column":48}},"type":"binary-expr","locations":[{"start":{"line":316,"column":10},"end":{"line":316,"column":15}},{"start":{"line":316,"column":19},"end":{"line":316,"column":48}}],"line":316},"53":{"loc":{"start":{"line":321,"column":8},"end":{"line":326,"column":9}},"type":"if","locations":[{"start":{"line":321,"column":8},"end":{"line":326,"column":9}},{"start":{"line":321,"column":8},"end":{"line":326,"column":9}}],"line":321},"54":{"loc":{"start":{"line":346,"column":2},"end":{"line":348,"column":3}},"type":"if","locations":[{"start":{"line":346,"column":2},"end":{"line":348,"column":3}},{"start":{"line":346,"column":2},"end":{"line":348,"column":3}}],"line":346},"55":{"loc":{"start":{"line":353,"column":2},"end":{"line":356,"column":3}},"type":"if","locations":[{"start":{"line":353,"column":2},"end":{"line":356,"column":3}},{"start":{"line":353,"column":2},"end":{"line":356,"column":3}}],"line":353},"56":{"loc":{"start":{"line":353,"column":6},"end":{"line":353,"column":50}},"type":"binary-expr","locations":[{"start":{"line":353,"column":6},"end":{"line":353,"column":28}},{"start":{"line":353,"column":32},"end":{"line":353,"column":50}}],"line":353},"57":{"loc":{"start":{"line":361,"column":8},"end":{"line":368,"column":9}},"type":"if","locations":[{"start":{"line":361,"column":8},"end":{"line":368,"column":9}},{"start":{"line":361,"column":8},"end":{"line":368,"column":9}}],"line":361},"58":{"loc":{"start":{"line":378,"column":10},"end":{"line":382,"column":17}},"type":"cond-expr","locations":[{"start":{"line":379,"column":14},"end":{"line":379,"column":35}},{"start":{"line":380,"column":14},"end":{"line":382,"column":17}}],"line":378},"59":{"loc":{"start":{"line":380,"column":14},"end":{"line":382,"column":17}},"type":"cond-expr","locations":[{"start":{"line":381,"column":14},"end":{"line":381,"column":24}},{"start":{"line":382,"column":14},"end":{"line":382,"column":17}}],"line":380},"60":{"loc":{"start":{"line":383,"column":10},"end":{"line":383,"column":69}},"type":"binary-expr","locations":[{"start":{"line":383,"column":10},"end":{"line":383,"column":23}},{"start":{"line":383,"column":27},"end":{"line":383,"column":69}}],"line":383}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":9,"12":9,"13":9,"14":9,"15":9,"16":9,"17":9,"18":9,"19":81,"20":36,"21":15,"22":15,"23":36,"24":18,"25":3,"26":3,"27":3,"28":3,"29":3,"30":18,"31":9,"32":3,"33":3,"34":9,"35":9,"36":0,"37":0,"38":9,"39":9,"40":0,"41":0,"42":9,"43":0,"44":9,"45":9,"46":9,"47":0,"48":9,"49":9,"50":9,"51":9,"52":9,"53":28,"54":28,"55":25,"56":3,"57":14,"58":14,"59":14,"60":14,"61":14,"62":2,"63":12,"64":202,"65":202,"66":0,"67":0,"68":0,"69":0,"70":0,"71":202,"72":22,"73":22,"74":22,"75":5,"76":5,"77":5,"78":5,"79":5,"80":5,"81":11,"82":11,"83":9,"84":9,"85":17,"86":17,"87":17,"88":17,"89":180,"90":9,"91":9,"92":9,"93":9,"94":9,"95":9,"96":9,"97":9,"98":9,"99":9,"100":16,"101":16,"102":16,"103":16,"104":16,"105":16,"106":13,"107":3,"108":2,"109":1,"110":15,"111":15,"112":450,"113":450,"114":450,"115":151,"116":151,"117":73,"118":73,"119":30,"120":0,"121":0,"122":30,"123":30,"124":30,"125":43,"126":43,"127":73,"128":78,"129":30,"130":48,"131":15,"132":16,"133":15,"134":15,"135":15,"136":9,"137":9,"138":1,"139":8,"140":3,"141":6,"142":6,"143":5,"144":1,"145":1,"146":0,"147":6,"148":6,"149":0,"150":0,"151":0,"152":0,"153":0,"154":9,"155":9,"156":16,"157":9,"158":0,"159":9,"160":1,"161":1,"162":0,"163":0,"164":1,"165":2,"166":2,"167":0,"168":2,"169":2,"170":1,"171":1},"f":{"0":9,"1":81,"2":28,"3":14,"4":202,"5":9,"6":16,"7":450,"8":16,"9":16,"10":1,"11":2},"b":{"0":[9,0],"1":[9,0],"2":[9,18,27,36,36,9,18,9,9,9,0],"3":[15,21],"4":[36,15],"5":[3,15],"6":[18,3],"7":[3,0],"8":[3,6],"9":[9,3],"10":[0,3],"11":[0,9],"12":[9,0],"13":[0,9],"14":[9,0],"15":[9,0],"16":[9,0],"17":[0,9],"18":[9,0,0],"19":[9,0],"20":[9,0],"21":[25,3],"22":[2,1],"23":[14,0],"24":[2,12],"25":[14,8],"26":[0,202],"27":[0,0],"28":[0,0],"29":[22,180],"30":[5,17],"31":[11,0],"32":[17,0],"33":[3,6],"34":[16,1],"35":[13,3],"36":[2,1],"37":[151,299],"38":[73,78],"39":[151,103],"40":[30,43],"41":[0,30],"42":[0,0],"43":[0,30],"44":[73,0],"45":[30,48],"46":[30,0],"47":[48,0],"48":[9,6,0,0],"49":[9,9],"50":[1,8],"51":[5,1],"52":[6,6],"53":[0,1],"54":[0,9],"55":[0,1],"56":[1,1],"57":[0,2],"58":[1,1],"59":[0,1],"60":[2,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"cf81803ee309d71d6cef96da707437905cbe16c8"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\fb_custom_audience\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\fb_custom_audience\\config.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":51}},"1":{"start":{"line":4,"column":2},"end":{"line":4,"column":43}},"2":{"start":{"line":7,"column":21},"end":{"line":23,"column":1}},"3":{"start":{"line":25,"column":19},"end":{"line":34,"column":1}},"4":{"start":{"line":36,"column":22},"end":{"line":91,"column":1}},"5":{"start":{"line":94,"column":17},"end":{"line":94,"column":22}},"6":{"start":{"line":95,"column":20},"end":{"line":95,"column":28}},"7":{"start":{"line":97,"column":0},"end":{"line":104,"column":2}}},"fnMap":{"0":{"name":"getEndPoint","decl":{"start":{"line":3,"column":9},"end":{"line":3,"column":20}},"loc":{"start":{"line":3,"column":33},"end":{"line":5,"column":1}},"line":3}},"branchMap":{},"s":{"0":1,"1":17,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{"0":17},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"9e27e59b52c778e9a88ddba8cb0dac491c0689e8"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\fb_custom_audience\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\fb_custom_audience\\transform.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":16,"column":4},"end":{"line":16,"column":25}},"3":{"start":{"line":25,"column":4},"end":{"line":25,"column":23}},"4":{"start":{"line":27,"column":35},"end":{"line":27,"column":64}},"5":{"start":{"line":29,"column":38},"end":{"line":43,"column":1}},"6":{"start":{"line":30,"column":23},"end":{"line":30,"column":64}},"7":{"start":{"line":31,"column":2},"end":{"line":36,"column":3}},"8":{"start":{"line":32,"column":4},"end":{"line":35,"column":6}},"9":{"start":{"line":38,"column":19},"end":{"line":40,"column":29}},"10":{"start":{"line":41,"column":2},"end":{"line":41,"column":53}},"11":{"start":{"line":41,"column":39},"end":{"line":41,"column":51}},"12":{"start":{"line":42,"column":2},"end":{"line":42,"column":20}},"13":{"start":{"line":45,"column":30},"end":{"line":63,"column":1}},"14":{"start":{"line":46,"column":2},"end":{"line":60,"column":3}},"15":{"start":{"line":47,"column":27},"end":{"line":47,"column":48}},"16":{"start":{"line":48,"column":21},"end":{"line":48,"column":43}},"17":{"start":{"line":49,"column":4},"end":{"line":49,"column":48}},"18":{"start":{"line":51,"column":4},"end":{"line":53,"column":5}},"19":{"start":{"line":52,"column":6},"end":{"line":52,"column":63}},"20":{"start":{"line":54,"column":4},"end":{"line":56,"column":5}},"21":{"start":{"line":55,"column":6},"end":{"line":55,"column":65}},"22":{"start":{"line":58,"column":4},"end":{"line":58,"column":37}},"23":{"start":{"line":59,"column":4},"end":{"line":59,"column":20}},"24":{"start":{"line":62,"column":2},"end":{"line":62,"column":65}},"25":{"start":{"line":67,"column":31},"end":{"line":147,"column":1}},"26":{"start":{"line":70,"column":2},"end":{"line":70,"column":47}},"27":{"start":{"line":71,"column":2},"end":{"line":145,"column":3}},"28":{"start":{"line":73,"column":6},"end":{"line":73,"column":61}},"29":{"start":{"line":74,"column":6},"end":{"line":74,"column":12}},"30":{"start":{"line":77,"column":6},"end":{"line":77,"column":63}},"31":{"start":{"line":79,"column":6},"end":{"line":79,"column":60}},"32":{"start":{"line":80,"column":6},"end":{"line":80,"column":12}},"33":{"start":{"line":82,"column":6},"end":{"line":86,"column":16}},"34":{"start":{"line":87,"column":6},"end":{"line":87,"column":12}},"35":{"start":{"line":89,"column":6},"end":{"line":89,"column":66}},"36":{"start":{"line":90,"column":6},"end":{"line":90,"column":12}},"37":{"start":{"line":92,"column":6},"end":{"line":92,"column":66}},"38":{"start":{"line":93,"column":6},"end":{"line":97,"column":7}},"39":{"start":{"line":94,"column":8},"end":{"line":94,"column":55}},"40":{"start":{"line":96,"column":8},"end":{"line":96,"column":49}},"41":{"start":{"line":98,"column":6},"end":{"line":98,"column":12}},"42":{"start":{"line":100,"column":6},"end":{"line":100,"column":66}},"43":{"start":{"line":101,"column":6},"end":{"line":105,"column":7}},"44":{"start":{"line":102,"column":8},"end":{"line":102,"column":55}},"45":{"start":{"line":104,"column":8},"end":{"line":104,"column":49}},"46":{"start":{"line":106,"column":6},"end":{"line":106,"column":12}},"47":{"start":{"line":110,"column":6},"end":{"line":118,"column":7}},"48":{"start":{"line":111,"column":8},"end":{"line":113,"column":43}},"49":{"start":{"line":115,"column":8},"end":{"line":117,"column":46}},"50":{"start":{"line":119,"column":6},"end":{"line":119,"column":12}},"51":{"start":{"line":121,"column":6},"end":{"line":121,"column":54}},"52":{"start":{"line":122,"column":6},"end":{"line":122,"column":12}},"53":{"start":{"line":124,"column":6},"end":{"line":124,"column":54}},"54":{"start":{"line":125,"column":6},"end":{"line":125,"column":12}},"55":{"start":{"line":127,"column":6},"end":{"line":127,"column":66}},"56":{"start":{"line":128,"column":6},"end":{"line":128,"column":61}},"57":{"start":{"line":129,"column":6},"end":{"line":129,"column":12}},"58":{"start":{"line":132,"column":6},"end":{"line":135,"column":23}},"59":{"start":{"line":136,"column":6},"end":{"line":136,"column":12}},"60":{"start":{"line":138,"column":6},"end":{"line":138,"column":40}},"61":{"start":{"line":139,"column":6},"end":{"line":139,"column":12}},"62":{"start":{"line":141,"column":6},"end":{"line":144,"column":8}},"63":{"start":{"line":146,"column":2},"end":{"line":146,"column":25}},"64":{"start":{"line":152,"column":25},"end":{"line":208,"column":1}},"65":{"start":{"line":159,"column":15},"end":{"line":159,"column":17}},"66":{"start":{"line":162,"column":2},"end":{"line":205,"column":5}},"67":{"start":{"line":163,"column":4},"end":{"line":163,"column":21}},"68":{"start":{"line":164,"column":4},"end":{"line":203,"column":7}},"69":{"start":{"line":166,"column":25},"end":{"line":166,"column":47}},"70":{"start":{"line":167,"column":6},"end":{"line":169,"column":7}},"71":{"start":{"line":168,"column":8},"end":{"line":168,"column":26}},"72":{"start":{"line":170,"column":6},"end":{"line":202,"column":7}},"73":{"start":{"line":171,"column":8},"end":{"line":185,"column":9}},"74":{"start":{"line":172,"column":10},"end":{"line":181,"column":11}},"75":{"start":{"line":174,"column":12},"end":{"line":177,"column":14}},"76":{"start":{"line":180,"column":12},"end":{"line":180,"column":43}},"77":{"start":{"line":184,"column":10},"end":{"line":184,"column":41}},"78":{"start":{"line":186,"column":8},"end":{"line":196,"column":9}},"79":{"start":{"line":192,"column":10},"end":{"line":192,"column":49}},"80":{"start":{"line":193,"column":10},"end":{"line":193,"column":52}},"81":{"start":{"line":195,"column":10},"end":{"line":195,"column":44}},"82":{"start":{"line":198,"column":8},"end":{"line":201,"column":10}},"83":{"start":{"line":204,"column":4},"end":{"line":204,"column":27}},"84":{"start":{"line":207,"column":2},"end":{"line":207,"column":14}},"85":{"start":{"line":212,"column":23},"end":{"line":235,"column":1}},"86":{"start":{"line":220,"column":30},"end":{"line":220,"column":43}},"87":{"start":{"line":221,"column":2},"end":{"line":225,"column":3}},"88":{"start":{"line":222,"column":4},"end":{"line":222,"column":44}},"89":{"start":{"line":224,"column":4},"end":{"line":224,"column":46}},"90":{"start":{"line":227,"column":2},"end":{"line":233,"column":4}},"91":{"start":{"line":234,"column":2},"end":{"line":234,"column":29}},"92":{"start":{"line":239,"column":24},"end":{"line":296,"column":1}},"93":{"start":{"line":253,"column":6},"end":{"line":253,"column":24}},"94":{"start":{"line":255,"column":30},"end":{"line":255,"column":66}},"95":{"start":{"line":258,"column":2},"end":{"line":261,"column":3}},"96":{"start":{"line":260,"column":4},"end":{"line":260,"column":56}},"97":{"start":{"line":263,"column":24},"end":{"line":263,"column":26}},"98":{"start":{"line":265,"column":24},"end":{"line":265,"column":26}},"99":{"start":{"line":266,"column":21},"end":{"line":266,"column":23}},"100":{"start":{"line":268,"column":2},"end":{"line":268,"column":43}},"101":{"start":{"line":271,"column":2},"end":{"line":273,"column":3}},"102":{"start":{"line":272,"column":4},"end":{"line":272,"column":33}},"103":{"start":{"line":276,"column":2},"end":{"line":278,"column":3}},"104":{"start":{"line":277,"column":4},"end":{"line":277,"column":27}},"105":{"start":{"line":280,"column":2},"end":{"line":282,"column":3}},"106":{"start":{"line":281,"column":4},"end":{"line":281,"column":34}},"107":{"start":{"line":283,"column":2},"end":{"line":285,"column":3}},"108":{"start":{"line":284,"column":4},"end":{"line":284,"column":43}},"109":{"start":{"line":286,"column":2},"end":{"line":293,"column":4}},"110":{"start":{"line":295,"column":2},"end":{"line":295,"column":23}},"111":{"start":{"line":298,"column":21},"end":{"line":399,"column":1}},"112":{"start":{"line":300,"column":19},"end":{"line":300,"column":21}},"113":{"start":{"line":301,"column":23},"end":{"line":301,"column":25}},"114":{"start":{"line":302,"column":24},"end":{"line":302,"column":26}},"115":{"start":{"line":303,"column":23},"end":{"line":303,"column":41}},"116":{"start":{"line":304,"column":55},"end":{"line":304,"column":73}},"117":{"start":{"line":305,"column":2},"end":{"line":310,"column":3}},"118":{"start":{"line":306,"column":4},"end":{"line":309,"column":6}},"119":{"start":{"line":311,"column":29},"end":{"line":311,"column":55}},"120":{"start":{"line":313,"column":2},"end":{"line":315,"column":3}},"121":{"start":{"line":314,"column":4},"end":{"line":314,"column":65}},"122":{"start":{"line":316,"column":2},"end":{"line":318,"column":3}},"123":{"start":{"line":317,"column":4},"end":{"line":317,"column":74}},"124":{"start":{"line":319,"column":30},"end":{"line":319,"column":40}},"125":{"start":{"line":321,"column":2},"end":{"line":323,"column":3}},"126":{"start":{"line":322,"column":4},"end":{"line":322,"column":67}},"127":{"start":{"line":325,"column":30},"end":{"line":325,"column":66}},"128":{"start":{"line":327,"column":2},"end":{"line":329,"column":3}},"129":{"start":{"line":328,"column":4},"end":{"line":328,"column":56}},"130":{"start":{"line":332,"column":2},"end":{"line":334,"column":3}},"131":{"start":{"line":333,"column":4},"end":{"line":333,"column":30}},"132":{"start":{"line":337,"column":2},"end":{"line":342,"column":3}},"133":{"start":{"line":338,"column":4},"end":{"line":341,"column":6}},"134":{"start":{"line":343,"column":23},"end":{"line":343,"column":41}},"135":{"start":{"line":346,"column":2},"end":{"line":365,"column":3}},"136":{"start":{"line":347,"column":32},"end":{"line":350,"column":5}},"137":{"start":{"line":351,"column":4},"end":{"line":364,"column":7}},"138":{"start":{"line":352,"column":6},"end":{"line":358,"column":8}},"139":{"start":{"line":359,"column":6},"end":{"line":362,"column":8}},"140":{"start":{"line":363,"column":6},"end":{"line":363,"column":41}},"141":{"start":{"line":368,"column":2},"end":{"line":387,"column":3}},"142":{"start":{"line":369,"column":32},"end":{"line":372,"column":5}},"143":{"start":{"line":373,"column":4},"end":{"line":386,"column":7}},"144":{"start":{"line":374,"column":6},"end":{"line":380,"column":8}},"145":{"start":{"line":381,"column":6},"end":{"line":384,"column":8}},"146":{"start":{"line":385,"column":6},"end":{"line":385,"column":41}},"147":{"start":{"line":388,"column":2},"end":{"line":390,"column":5}},"148":{"start":{"line":389,"column":4},"end":{"line":389,"column":73}},"149":{"start":{"line":392,"column":2},"end":{"line":397,"column":3}},"150":{"start":{"line":393,"column":4},"end":{"line":396,"column":6}},"151":{"start":{"line":398,"column":2},"end":{"line":398,"column":18}},"152":{"start":{"line":401,"column":16},"end":{"line":403,"column":1}},"153":{"start":{"line":402,"column":2},"end":{"line":402,"column":56}},"154":{"start":{"line":405,"column":26},"end":{"line":439,"column":1}},"155":{"start":{"line":406,"column":2},"end":{"line":409,"column":3}},"156":{"start":{"line":407,"column":23},"end":{"line":407,"column":75}},"157":{"start":{"line":408,"column":4},"end":{"line":408,"column":24}},"158":{"start":{"line":410,"column":19},"end":{"line":437,"column":4}},"159":{"start":{"line":411,"column":4},"end":{"line":436,"column":5}},"160":{"start":{"line":412,"column":6},"end":{"line":419,"column":7}},"161":{"start":{"line":414,"column":8},"end":{"line":418,"column":10}},"162":{"start":{"line":420,"column":30},"end":{"line":420,"column":44}},"163":{"start":{"line":421,"column":27},"end":{"line":427,"column":8}},"164":{"start":{"line":422,"column":8},"end":{"line":426,"column":10}},"165":{"start":{"line":428,"column":6},"end":{"line":428,"column":26}},"166":{"start":{"line":430,"column":6},"end":{"line":435,"column":8}},"167":{"start":{"line":438,"column":2},"end":{"line":438,"column":30}},"168":{"start":{"line":441,"column":0},"end":{"line":441,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":29,"column":38},"end":{"line":29,"column":39}},"loc":{"start":{"line":29,"column":49},"end":{"line":43,"column":1}},"line":29},"1":{"name":"(anonymous_1)","decl":{"start":{"line":41,"column":30},"end":{"line":41,"column":31}},"loc":{"start":{"line":41,"column":39},"end":{"line":41,"column":51}},"line":41},"2":{"name":"(anonymous_2)","decl":{"start":{"line":45,"column":30},"end":{"line":45,"column":31}},"loc":{"start":{"line":45,"column":55},"end":{"line":63,"column":1}},"line":45},"3":{"name":"(anonymous_3)","decl":{"start":{"line":67,"column":31},"end":{"line":67,"column":32}},"loc":{"start":{"line":67,"column":66},"end":{"line":147,"column":1}},"line":67},"4":{"name":"(anonymous_4)","decl":{"start":{"line":152,"column":25},"end":{"line":152,"column":26}},"loc":{"start":{"line":158,"column":5},"end":{"line":208,"column":1}},"line":158},"5":{"name":"(anonymous_5)","decl":{"start":{"line":162,"column":25},"end":{"line":162,"column":26}},"loc":{"start":{"line":162,"column":37},"end":{"line":205,"column":3}},"line":162},"6":{"name":"(anonymous_6)","decl":{"start":{"line":164,"column":23},"end":{"line":164,"column":24}},"loc":{"start":{"line":164,"column":39},"end":{"line":203,"column":5}},"line":164},"7":{"name":"(anonymous_7)","decl":{"start":{"line":212,"column":23},"end":{"line":212,"column":24}},"loc":{"start":{"line":219,"column":5},"end":{"line":235,"column":1}},"line":219},"8":{"name":"(anonymous_8)","decl":{"start":{"line":239,"column":24},"end":{"line":239,"column":25}},"loc":{"start":{"line":245,"column":5},"end":{"line":296,"column":1}},"line":245},"9":{"name":"(anonymous_9)","decl":{"start":{"line":298,"column":21},"end":{"line":298,"column":22}},"loc":{"start":{"line":298,"column":47},"end":{"line":399,"column":1}},"line":298},"10":{"name":"(anonymous_10)","decl":{"start":{"line":351,"column":32},"end":{"line":351,"column":33}},"loc":{"start":{"line":351,"column":56},"end":{"line":364,"column":5}},"line":351},"11":{"name":"(anonymous_11)","decl":{"start":{"line":373,"column":32},"end":{"line":373,"column":33}},"loc":{"start":{"line":373,"column":56},"end":{"line":386,"column":5}},"line":373},"12":{"name":"(anonymous_12)","decl":{"start":{"line":388,"column":23},"end":{"line":388,"column":24}},"loc":{"start":{"line":388,"column":36},"end":{"line":390,"column":3}},"line":388},"13":{"name":"(anonymous_13)","decl":{"start":{"line":401,"column":16},"end":{"line":401,"column":17}},"loc":{"start":{"line":401,"column":25},"end":{"line":403,"column":1}},"line":401},"14":{"name":"(anonymous_14)","decl":{"start":{"line":405,"column":26},"end":{"line":405,"column":27}},"loc":{"start":{"line":405,"column":36},"end":{"line":439,"column":1}},"line":405},"15":{"name":"(anonymous_15)","decl":{"start":{"line":410,"column":30},"end":{"line":410,"column":31}},"loc":{"start":{"line":410,"column":39},"end":{"line":437,"column":3}},"line":410},"16":{"name":"(anonymous_16)","decl":{"start":{"line":421,"column":47},"end":{"line":421,"column":48}},"loc":{"start":{"line":421,"column":69},"end":{"line":427,"column":7}},"line":421}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":2},"end":{"line":36,"column":3}},"type":"if","locations":[{"start":{"line":31,"column":2},"end":{"line":36,"column":3}},{"start":{"line":31,"column":2},"end":{"line":36,"column":3}}],"line":31},"1":{"loc":{"start":{"line":38,"column":19},"end":{"line":40,"column":29}},"type":"cond-expr","locations":[{"start":{"line":39,"column":6},"end":{"line":39,"column":18}},{"start":{"line":40,"column":6},"end":{"line":40,"column":29}}],"line":38},"2":{"loc":{"start":{"line":46,"column":2},"end":{"line":60,"column":3}},"type":"if","locations":[{"start":{"line":46,"column":2},"end":{"line":60,"column":3}},{"start":{"line":46,"column":2},"end":{"line":60,"column":3}}],"line":46},"3":{"loc":{"start":{"line":51,"column":4},"end":{"line":53,"column":5}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":53,"column":5}},{"start":{"line":51,"column":4},"end":{"line":53,"column":5}}],"line":51},"4":{"loc":{"start":{"line":54,"column":4},"end":{"line":56,"column":5}},"type":"if","locations":[{"start":{"line":54,"column":4},"end":{"line":56,"column":5}},{"start":{"line":54,"column":4},"end":{"line":56,"column":5}}],"line":54},"5":{"loc":{"start":{"line":71,"column":2},"end":{"line":145,"column":3}},"type":"switch","locations":[{"start":{"line":72,"column":4},"end":{"line":74,"column":12}},{"start":{"line":75,"column":4},"end":{"line":80,"column":12}},{"start":{"line":81,"column":4},"end":{"line":87,"column":12}},{"start":{"line":88,"column":4},"end":{"line":90,"column":12}},{"start":{"line":91,"column":4},"end":{"line":98,"column":12}},{"start":{"line":99,"column":4},"end":{"line":106,"column":12}},{"start":{"line":107,"column":4},"end":{"line":107,"column":14}},{"start":{"line":108,"column":4},"end":{"line":108,"column":14}},{"start":{"line":109,"column":4},"end":{"line":119,"column":12}},{"start":{"line":120,"column":4},"end":{"line":122,"column":12}},{"start":{"line":123,"column":4},"end":{"line":125,"column":12}},{"start":{"line":126,"column":4},"end":{"line":129,"column":12}},{"start":{"line":130,"column":4},"end":{"line":130,"column":14}},{"start":{"line":131,"column":4},"end":{"line":136,"column":12}},{"start":{"line":137,"column":4},"end":{"line":139,"column":12}},{"start":{"line":140,"column":4},"end":{"line":144,"column":8}}],"line":71},"6":{"loc":{"start":{"line":83,"column":8},"end":{"line":86,"column":15}},"type":"cond-expr","locations":[{"start":{"line":85,"column":12},"end":{"line":85,"column":15}},{"start":{"line":86,"column":12},"end":{"line":86,"column":15}}],"line":83},"7":{"loc":{"start":{"line":83,"column":8},"end":{"line":84,"column":50}},"type":"binary-expr","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":45}},{"start":{"line":84,"column":8},"end":{"line":84,"column":50}}],"line":83},"8":{"loc":{"start":{"line":93,"column":6},"end":{"line":97,"column":7}},"type":"if","locations":[{"start":{"line":93,"column":6},"end":{"line":97,"column":7}},{"start":{"line":93,"column":6},"end":{"line":97,"column":7}}],"line":93},"9":{"loc":{"start":{"line":101,"column":6},"end":{"line":105,"column":7}},"type":"if","locations":[{"start":{"line":101,"column":6},"end":{"line":105,"column":7}},{"start":{"line":101,"column":6},"end":{"line":105,"column":7}}],"line":101},"10":{"loc":{"start":{"line":110,"column":6},"end":{"line":118,"column":7}},"type":"if","locations":[{"start":{"line":110,"column":6},"end":{"line":118,"column":7}},{"start":{"line":110,"column":6},"end":{"line":118,"column":7}}],"line":110},"11":{"loc":{"start":{"line":167,"column":6},"end":{"line":169,"column":7}},"type":"if","locations":[{"start":{"line":167,"column":6},"end":{"line":169,"column":7}},{"start":{"line":167,"column":6},"end":{"line":169,"column":7}}],"line":167},"12":{"loc":{"start":{"line":167,"column":10},"end":{"line":167,"column":58}},"type":"binary-expr","locations":[{"start":{"line":167,"column":10},"end":{"line":167,"column":20}},{"start":{"line":167,"column":24},"end":{"line":167,"column":58}}],"line":167},"13":{"loc":{"start":{"line":170,"column":6},"end":{"line":202,"column":7}},"type":"if","locations":[{"start":{"line":170,"column":6},"end":{"line":202,"column":7}},{"start":{"line":170,"column":6},"end":{"line":202,"column":7}}],"line":170},"14":{"loc":{"start":{"line":171,"column":8},"end":{"line":185,"column":9}},"type":"if","locations":[{"start":{"line":171,"column":8},"end":{"line":185,"column":9}},{"start":{"line":171,"column":8},"end":{"line":185,"column":9}}],"line":171},"15":{"loc":{"start":{"line":172,"column":10},"end":{"line":181,"column":11}},"type":"if","locations":[{"start":{"line":172,"column":10},"end":{"line":181,"column":11}},{"start":{"line":172,"column":10},"end":{"line":181,"column":11}}],"line":172},"16":{"loc":{"start":{"line":186,"column":8},"end":{"line":196,"column":9}},"type":"if","locations":[{"start":{"line":186,"column":8},"end":{"line":196,"column":9}},{"start":{"line":186,"column":8},"end":{"line":196,"column":9}}],"line":186},"17":{"loc":{"start":{"line":187,"column":10},"end":{"line":189,"column":38}},"type":"binary-expr","locations":[{"start":{"line":187,"column":10},"end":{"line":187,"column":24}},{"start":{"line":188,"column":10},"end":{"line":188,"column":34}},{"start":{"line":189,"column":10},"end":{"line":189,"column":38}}],"line":187},"18":{"loc":{"start":{"line":221,"column":2},"end":{"line":225,"column":3}},"type":"if","locations":[{"start":{"line":221,"column":2},"end":{"line":225,"column":3}},{"start":{"line":221,"column":2},"end":{"line":225,"column":3}}],"line":221},"19":{"loc":{"start":{"line":242,"column":2},"end":{"line":242,"column":23}},"type":"default-arg","locations":[{"start":{"line":242,"column":19},"end":{"line":242,"column":23}}],"line":242},"20":{"loc":{"start":{"line":258,"column":2},"end":{"line":261,"column":3}},"type":"if","locations":[{"start":{"line":258,"column":2},"end":{"line":261,"column":3}},{"start":{"line":258,"column":2},"end":{"line":261,"column":3}}],"line":258},"21":{"loc":{"start":{"line":271,"column":2},"end":{"line":273,"column":3}},"type":"if","locations":[{"start":{"line":271,"column":2},"end":{"line":273,"column":3}},{"start":{"line":271,"column":2},"end":{"line":273,"column":3}}],"line":271},"22":{"loc":{"start":{"line":276,"column":2},"end":{"line":278,"column":3}},"type":"if","locations":[{"start":{"line":276,"column":2},"end":{"line":278,"column":3}},{"start":{"line":276,"column":2},"end":{"line":278,"column":3}}],"line":276},"23":{"loc":{"start":{"line":276,"column":6},"end":{"line":276,"column":56}},"type":"binary-expr","locations":[{"start":{"line":276,"column":6},"end":{"line":276,"column":10}},{"start":{"line":276,"column":14},"end":{"line":276,"column":27}},{"start":{"line":276,"column":31},"end":{"line":276,"column":56}}],"line":276},"24":{"loc":{"start":{"line":280,"column":2},"end":{"line":282,"column":3}},"type":"if","locations":[{"start":{"line":280,"column":2},"end":{"line":282,"column":3}},{"start":{"line":280,"column":2},"end":{"line":282,"column":3}}],"line":280},"25":{"loc":{"start":{"line":280,"column":6},"end":{"line":280,"column":68}},"type":"binary-expr","locations":[{"start":{"line":280,"column":6},"end":{"line":280,"column":13}},{"start":{"line":280,"column":17},"end":{"line":280,"column":33}},{"start":{"line":280,"column":37},"end":{"line":280,"column":68}}],"line":280},"26":{"loc":{"start":{"line":283,"column":2},"end":{"line":285,"column":3}},"type":"if","locations":[{"start":{"line":283,"column":2},"end":{"line":285,"column":3}},{"start":{"line":283,"column":2},"end":{"line":285,"column":3}}],"line":283},"27":{"loc":{"start":{"line":305,"column":2},"end":{"line":310,"column":3}},"type":"if","locations":[{"start":{"line":305,"column":2},"end":{"line":310,"column":3}},{"start":{"line":305,"column":2},"end":{"line":310,"column":3}}],"line":305},"28":{"loc":{"start":{"line":313,"column":2},"end":{"line":315,"column":3}},"type":"if","locations":[{"start":{"line":313,"column":2},"end":{"line":315,"column":3}},{"start":{"line":313,"column":2},"end":{"line":315,"column":3}}],"line":313},"29":{"loc":{"start":{"line":316,"column":2},"end":{"line":318,"column":3}},"type":"if","locations":[{"start":{"line":316,"column":2},"end":{"line":318,"column":3}},{"start":{"line":316,"column":2},"end":{"line":318,"column":3}}],"line":316},"30":{"loc":{"start":{"line":321,"column":2},"end":{"line":323,"column":3}},"type":"if","locations":[{"start":{"line":321,"column":2},"end":{"line":323,"column":3}},{"start":{"line":321,"column":2},"end":{"line":323,"column":3}}],"line":321},"31":{"loc":{"start":{"line":327,"column":2},"end":{"line":329,"column":3}},"type":"if","locations":[{"start":{"line":327,"column":2},"end":{"line":329,"column":3}},{"start":{"line":327,"column":2},"end":{"line":329,"column":3}}],"line":327},"32":{"loc":{"start":{"line":332,"column":2},"end":{"line":334,"column":3}},"type":"if","locations":[{"start":{"line":332,"column":2},"end":{"line":334,"column":3}},{"start":{"line":332,"column":2},"end":{"line":334,"column":3}}],"line":332},"33":{"loc":{"start":{"line":337,"column":2},"end":{"line":342,"column":3}},"type":"if","locations":[{"start":{"line":337,"column":2},"end":{"line":342,"column":3}},{"start":{"line":337,"column":2},"end":{"line":342,"column":3}}],"line":337},"34":{"loc":{"start":{"line":346,"column":2},"end":{"line":365,"column":3}},"type":"if","locations":[{"start":{"line":346,"column":2},"end":{"line":365,"column":3}},{"start":{"line":346,"column":2},"end":{"line":365,"column":3}}],"line":346},"35":{"loc":{"start":{"line":368,"column":2},"end":{"line":387,"column":3}},"type":"if","locations":[{"start":{"line":368,"column":2},"end":{"line":387,"column":3}},{"start":{"line":368,"column":2},"end":{"line":387,"column":3}}],"line":368},"36":{"loc":{"start":{"line":392,"column":2},"end":{"line":397,"column":3}},"type":"if","locations":[{"start":{"line":392,"column":2},"end":{"line":397,"column":3}},{"start":{"line":392,"column":2},"end":{"line":397,"column":3}}],"line":392},"37":{"loc":{"start":{"line":406,"column":2},"end":{"line":409,"column":3}},"type":"if","locations":[{"start":{"line":406,"column":2},"end":{"line":409,"column":3}},{"start":{"line":406,"column":2},"end":{"line":409,"column":3}}],"line":406},"38":{"loc":{"start":{"line":406,"column":6},"end":{"line":406,"column":50}},"type":"binary-expr","locations":[{"start":{"line":406,"column":6},"end":{"line":406,"column":28}},{"start":{"line":406,"column":32},"end":{"line":406,"column":50}}],"line":406},"39":{"loc":{"start":{"line":412,"column":6},"end":{"line":419,"column":7}},"type":"if","locations":[{"start":{"line":412,"column":6},"end":{"line":419,"column":7}},{"start":{"line":412,"column":6},"end":{"line":419,"column":7}}],"line":412},"40":{"loc":{"start":{"line":434,"column":8},"end":{"line":434,"column":67}},"type":"binary-expr","locations":[{"start":{"line":434,"column":8},"end":{"line":434,"column":21}},{"start":{"line":434,"column":25},"end":{"line":434,"column":67}}],"line":434}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":1,"14":17,"15":17,"16":17,"17":17,"18":17,"19":9,"20":17,"21":8,"22":17,"23":17,"24":0,"25":1,"26":37,"27":37,"28":4,"29":4,"30":3,"31":3,"32":3,"33":3,"34":3,"35":4,"36":4,"37":4,"38":4,"39":4,"40":0,"41":4,"42":4,"43":4,"44":0,"45":4,"46":4,"47":3,"48":0,"49":3,"50":3,"51":3,"52":3,"53":3,"54":3,"55":3,"56":3,"57":3,"58":3,"59":3,"60":0,"61":0,"62":0,"63":37,"64":1,"65":18,"66":18,"67":18,"68":18,"69":172,"70":172,"71":1,"72":172,"73":171,"74":59,"75":37,"76":22,"77":112,"78":171,"79":54,"80":54,"81":117,"82":1,"83":17,"84":17,"85":1,"86":18,"87":18,"88":18,"89":0,"90":18,"91":17,"92":1,"93":18,"94":18,"95":18,"96":0,"97":18,"98":18,"99":18,"100":18,"101":18,"102":18,"103":18,"104":8,"105":18,"106":18,"107":18,"108":18,"109":18,"110":17,"111":1,"112":10,"113":10,"114":10,"115":10,"116":10,"117":10,"118":0,"119":10,"120":10,"121":0,"122":10,"123":0,"124":10,"125":10,"126":0,"127":10,"128":10,"129":0,"130":10,"131":1,"132":10,"133":0,"134":10,"135":10,"136":8,"137":8,"138":8,"139":8,"140":8,"141":10,"142":10,"143":10,"144":10,"145":9,"146":9,"147":9,"148":17,"149":9,"150":0,"151":9,"152":1,"153":10,"154":1,"155":1,"156":0,"157":0,"158":1,"159":2,"160":2,"161":0,"162":2,"163":2,"164":4,"165":2,"166":0,"167":1,"168":1},"f":{"0":0,"1":0,"2":17,"3":37,"4":18,"5":18,"6":172,"7":18,"8":18,"9":10,"10":8,"11":10,"12":17,"13":10,"14":1,"15":2,"16":4},"b":{"0":[0,0],"1":[0,0],"2":[17,0],"3":[9,8],"4":[8,9],"5":[4,3,3,4,4,4,0,0,3,3,3,3,3,3,0,0],"6":[3,0],"7":[3,0],"8":[4,0],"9":[0,4],"10":[0,3],"11":[1,171],"12":[172,11],"13":[171,1],"14":[59,112],"15":[37,22],"16":[54,117],"17":[171,59,54],"18":[18,0],"19":[0],"20":[0,18],"21":[18,0],"22":[8,10],"23":[18,18,8],"24":[18,0],"25":[18,18,18],"26":[18,0],"27":[0,10],"28":[0,10],"29":[0,10],"30":[0,10],"31":[0,10],"32":[1,9],"33":[0,10],"34":[8,2],"35":[10,0],"36":[0,9],"37":[0,1],"38":[1,1],"39":[0,2],"40":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"099e49461538b56db2bf13dafc2ed29aa249aef6"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\firehose\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\firehose\\transform.js","statementMap":{"0":{"start":{"line":6,"column":4},"end":{"line":6,"column":25}},"1":{"start":{"line":9,"column":22},"end":{"line":9,"column":27}},"2":{"start":{"line":10,"column":24},"end":{"line":10,"column":48}},"3":{"start":{"line":11,"column":18},"end":{"line":11,"column":59}},"4":{"start":{"line":12,"column":2},"end":{"line":16,"column":4}},"5":{"start":{"line":20,"column":30},"end":{"line":20,"column":59}},"6":{"start":{"line":21,"column":2},"end":{"line":27,"column":3}},"7":{"start":{"line":22,"column":4},"end":{"line":26,"column":6}},"8":{"start":{"line":28,"column":2},"end":{"line":28,"column":70}},"9":{"start":{"line":30,"column":26},"end":{"line":67,"column":1}},"10":{"start":{"line":31,"column":2},"end":{"line":34,"column":3}},"11":{"start":{"line":32,"column":23},"end":{"line":32,"column":75}},"12":{"start":{"line":33,"column":4},"end":{"line":33,"column":24}},"13":{"start":{"line":36,"column":19},"end":{"line":65,"column":3}},"14":{"start":{"line":38,"column":6},"end":{"line":63,"column":7}},"15":{"start":{"line":39,"column":8},"end":{"line":46,"column":9}},"16":{"start":{"line":41,"column":10},"end":{"line":45,"column":12}},"17":{"start":{"line":48,"column":8},"end":{"line":52,"column":10}},"18":{"start":{"line":54,"column":8},"end":{"line":62,"column":10}},"19":{"start":{"line":66,"column":2},"end":{"line":66,"column":18}},"20":{"start":{"line":69,"column":0},"end":{"line":69,"column":48}}},"fnMap":{"0":{"name":"getDeliveryStreamMapTo","decl":{"start":{"line":8,"column":9},"end":{"line":8,"column":31}},"loc":{"start":{"line":8,"column":39},"end":{"line":17,"column":1}},"line":8},"1":{"name":"process","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":16}},"loc":{"start":{"line":19,"column":24},"end":{"line":29,"column":1}},"line":19},"2":{"name":"(anonymous_2)","decl":{"start":{"line":30,"column":26},"end":{"line":30,"column":27}},"loc":{"start":{"line":30,"column":42},"end":{"line":67,"column":1}},"line":30},"3":{"name":"(anonymous_3)","decl":{"start":{"line":37,"column":15},"end":{"line":37,"column":16}},"loc":{"start":{"line":37,"column":30},"end":{"line":64,"column":5}},"line":37}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":4},"end":{"line":15,"column":16}},"type":"binary-expr","locations":[{"start":{"line":13,"column":5},"end":{"line":13,"column":64}},{"start":{"line":14,"column":4},"end":{"line":14,"column":39}},{"start":{"line":15,"column":4},"end":{"line":15,"column":16}}],"line":13},"1":{"loc":{"start":{"line":13,"column":5},"end":{"line":13,"column":64}},"type":"cond-expr","locations":[{"start":{"line":13,"column":21},"end":{"line":13,"column":57}},{"start":{"line":13,"column":60},"end":{"line":13,"column":64}}],"line":13},"2":{"loc":{"start":{"line":21,"column":2},"end":{"line":27,"column":3}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":27,"column":3}},{"start":{"line":21,"column":2},"end":{"line":27,"column":3}}],"line":21},"3":{"loc":{"start":{"line":31,"column":2},"end":{"line":34,"column":3}},"type":"if","locations":[{"start":{"line":31,"column":2},"end":{"line":34,"column":3}},{"start":{"line":31,"column":2},"end":{"line":34,"column":3}}],"line":31},"4":{"loc":{"start":{"line":31,"column":6},"end":{"line":31,"column":50}},"type":"binary-expr","locations":[{"start":{"line":31,"column":6},"end":{"line":31,"column":28}},{"start":{"line":31,"column":32},"end":{"line":31,"column":50}}],"line":31},"5":{"loc":{"start":{"line":39,"column":8},"end":{"line":46,"column":9}},"type":"if","locations":[{"start":{"line":39,"column":8},"end":{"line":46,"column":9}},{"start":{"line":39,"column":8},"end":{"line":46,"column":9}}],"line":39},"6":{"loc":{"start":{"line":56,"column":10},"end":{"line":60,"column":17}},"type":"cond-expr","locations":[{"start":{"line":57,"column":14},"end":{"line":57,"column":35}},{"start":{"line":58,"column":14},"end":{"line":60,"column":17}}],"line":56},"7":{"loc":{"start":{"line":58,"column":14},"end":{"line":60,"column":17}},"type":"cond-expr","locations":[{"start":{"line":59,"column":14},"end":{"line":59,"column":24}},{"start":{"line":60,"column":14},"end":{"line":60,"column":17}}],"line":58},"8":{"loc":{"start":{"line":61,"column":10},"end":{"line":61,"column":69}},"type":"binary-expr","locations":[{"start":{"line":61,"column":10},"end":{"line":61,"column":23}},{"start":{"line":61,"column":27},"end":{"line":61,"column":69}}],"line":61}},"s":{"0":1,"1":6,"2":6,"3":6,"4":6,"5":6,"6":6,"7":5,"8":1,"9":1,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":1},"f":{"0":6,"1":6,"2":0,"3":0},"b":{"0":[6,4,2],"1":[6,0],"2":[5,1],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e2a47152aeddd38496b6ae51c1dd818c30129a8e"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":23},"end":{"line":52,"column":1}},"2":{"start":{"line":54,"column":14},"end":{"line":171,"column":1}},"3":{"start":{"line":173,"column":20},"end":{"line":173,"column":62}},"4":{"start":{"line":175,"column":22},"end":{"line":175,"column":65}},"5":{"start":{"line":177,"column":23},"end":{"line":177,"column":25}},"6":{"start":{"line":178,"column":15},"end":{"line":178,"column":33}},"7":{"start":{"line":179,"column":0},"end":{"line":181,"column":3}},"8":{"start":{"line":180,"column":2},"end":{"line":180,"column":51}},"9":{"start":{"line":182,"column":20},"end":{"line":182,"column":37}},"10":{"start":{"line":184,"column":0},"end":{"line":191,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":179,"column":15},"end":{"line":179,"column":16}},"loc":{"start":{"line":179,"column":24},"end":{"line":181,"column":1}},"line":179}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":29,"9":1,"10":1},"f":{"0":29},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"edd955fe1357cd3cdc3fe3278cd7358282483d95"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga\\transform.js","statementMap":{"0":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":26}},"2":{"start":{"line":4,"column":46},"end":{"line":4,"column":75}},"3":{"start":{"line":12,"column":4},"end":{"line":12,"column":23}},"4":{"start":{"line":13,"column":31},"end":{"line":13,"column":61}},"5":{"start":{"line":14,"column":21},"end":{"line":14,"column":48}},"6":{"start":{"line":28,"column":4},"end":{"line":28,"column":25}},"7":{"start":{"line":30,"column":22},"end":{"line":30,"column":40}},"8":{"start":{"line":33,"column":17},"end":{"line":33,"column":19}},"9":{"start":{"line":34,"column":14},"end":{"line":34,"column":16}},"10":{"start":{"line":35,"column":22},"end":{"line":35,"column":34}},"11":{"start":{"line":36,"column":17},"end":{"line":36,"column":60}},"12":{"start":{"line":37,"column":2},"end":{"line":41,"column":3}},"13":{"start":{"line":38,"column":4},"end":{"line":40,"column":7}},"14":{"start":{"line":39,"column":6},"end":{"line":39,"column":37}},"15":{"start":{"line":42,"column":15},"end":{"line":42,"column":31}},"16":{"start":{"line":43,"column":2},"end":{"line":51,"column":5}},"17":{"start":{"line":44,"column":4},"end":{"line":44,"column":52}},"18":{"start":{"line":45,"column":4},"end":{"line":45,"column":49}},"19":{"start":{"line":46,"column":4},"end":{"line":46,"column":55}},"20":{"start":{"line":47,"column":4},"end":{"line":50,"column":27}},"21":{"start":{"line":52,"column":2},"end":{"line":52,"column":16}},"22":{"start":{"line":56,"column":23},"end":{"line":56,"column":25}},"23":{"start":{"line":59,"column":2},"end":{"line":65,"column":3}},"24":{"start":{"line":60,"column":23},"end":{"line":60,"column":35}},"25":{"start":{"line":61,"column":4},"end":{"line":64,"column":7}},"26":{"start":{"line":62,"column":6},"end":{"line":63,"column":49}},"27":{"start":{"line":67,"column":2},"end":{"line":67,"column":52}},"28":{"start":{"line":71,"column":2},"end":{"line":98,"column":3}},"29":{"start":{"line":72,"column":25},"end":{"line":72,"column":27}},"30":{"start":{"line":73,"column":27},"end":{"line":73,"column":33}},"31":{"start":{"line":74,"column":24},"end":{"line":74,"column":30}},"32":{"start":{"line":80,"column":4},"end":{"line":86,"column":5}},"33":{"start":{"line":81,"column":6},"end":{"line":85,"column":9}},"34":{"start":{"line":82,"column":8},"end":{"line":82,"column":34}},"35":{"start":{"line":83,"column":8},"end":{"line":83,"column":64}},"36":{"start":{"line":84,"column":8},"end":{"line":84,"column":46}},"37":{"start":{"line":89,"column":4},"end":{"line":95,"column":5}},"38":{"start":{"line":90,"column":6},"end":{"line":94,"column":9}},"39":{"start":{"line":91,"column":8},"end":{"line":91,"column":31}},"40":{"start":{"line":92,"column":8},"end":{"line":92,"column":55}},"41":{"start":{"line":93,"column":8},"end":{"line":93,"column":43}},"42":{"start":{"line":97,"column":4},"end":{"line":97,"column":54}},"43":{"start":{"line":100,"column":2},"end":{"line":100,"column":12}},"44":{"start":{"line":104,"column":21},"end":{"line":104,"column":23}},"45":{"start":{"line":105,"column":18},"end":{"line":105,"column":20}},"46":{"start":{"line":106,"column":2},"end":{"line":115,"column":3}},"47":{"start":{"line":107,"column":4},"end":{"line":114,"column":7}},"48":{"start":{"line":108,"column":6},"end":{"line":110,"column":7}},"49":{"start":{"line":109,"column":8},"end":{"line":109,"column":33}},"50":{"start":{"line":111,"column":6},"end":{"line":113,"column":7}},"51":{"start":{"line":112,"column":8},"end":{"line":112,"column":30}},"52":{"start":{"line":116,"column":2},"end":{"line":116,"column":31}},"53":{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},"54":{"start":{"line":121,"column":4},"end":{"line":121,"column":31}},"55":{"start":{"line":123,"column":2},"end":{"line":123,"column":19}},"56":{"start":{"line":131,"column":26},"end":{"line":131,"column":44}},"57":{"start":{"line":132,"column":2},"end":{"line":132,"column":41}},"58":{"start":{"line":133,"column":2},"end":{"line":161,"column":3}},"59":{"start":{"line":134,"column":4},"end":{"line":134,"column":65}},"60":{"start":{"line":136,"column":4},"end":{"line":160,"column":5}},"61":{"start":{"line":137,"column":6},"end":{"line":159,"column":7}},"62":{"start":{"line":138,"column":8},"end":{"line":138,"column":35}},"63":{"start":{"line":139,"column":8},"end":{"line":139,"column":32}},"64":{"start":{"line":140,"column":8},"end":{"line":140,"column":36}},"65":{"start":{"line":141,"column":23},"end":{"line":141,"column":72}},"66":{"start":{"line":142,"column":8},"end":{"line":144,"column":9}},"67":{"start":{"line":143,"column":10},"end":{"line":143,"column":33}},"68":{"start":{"line":146,"column":8},"end":{"line":146,"column":56}},"69":{"start":{"line":148,"column":8},"end":{"line":158,"column":19}},"70":{"start":{"line":162,"column":21},"end":{"line":168,"column":3}},"71":{"start":{"line":169,"column":2},"end":{"line":169,"column":50}},"72":{"start":{"line":178,"column":17},"end":{"line":178,"column":27}},"73":{"start":{"line":179,"column":2},"end":{"line":206,"column":3}},"74":{"start":{"line":179,"column":15},"end":{"line":179,"column":16}},"75":{"start":{"line":180,"column":20},"end":{"line":180,"column":31}},"76":{"start":{"line":181,"column":22},"end":{"line":181,"column":27}},"77":{"start":{"line":183,"column":4},"end":{"line":187,"column":5}},"78":{"start":{"line":184,"column":6},"end":{"line":184,"column":47}},"79":{"start":{"line":186,"column":6},"end":{"line":186,"column":54}},"80":{"start":{"line":190,"column":4},"end":{"line":196,"column":5}},"81":{"start":{"line":191,"column":30},"end":{"line":191,"column":68}},"82":{"start":{"line":192,"column":6},"end":{"line":195,"column":8}},"83":{"start":{"line":198,"column":4},"end":{"line":198,"column":46}},"84":{"start":{"line":199,"column":4},"end":{"line":199,"column":50}},"85":{"start":{"line":200,"column":4},"end":{"line":200,"column":47}},"86":{"start":{"line":201,"column":4},"end":{"line":201,"column":49}},"87":{"start":{"line":202,"column":4},"end":{"line":202,"column":48}},"88":{"start":{"line":203,"column":4},"end":{"line":203,"column":50}},"89":{"start":{"line":204,"column":4},"end":{"line":204,"column":47}},"90":{"start":{"line":205,"column":4},"end":{"line":205,"column":55}},"91":{"start":{"line":207,"column":2},"end":{"line":207,"column":16}},"92":{"start":{"line":228,"column":6},"end":{"line":228,"column":24}},"93":{"start":{"line":229,"column":25},"end":{"line":229,"column":43}},"94":{"start":{"line":230,"column":17},"end":{"line":230,"column":66}},"95":{"start":{"line":231,"column":2},"end":{"line":231,"column":37}},"96":{"start":{"line":232,"column":2},"end":{"line":232,"column":37}},"97":{"start":{"line":233,"column":2},"end":{"line":233,"column":61}},"98":{"start":{"line":234,"column":2},"end":{"line":234,"column":44}},"99":{"start":{"line":237,"column":2},"end":{"line":239,"column":3}},"100":{"start":{"line":238,"column":4},"end":{"line":238,"column":77}},"101":{"start":{"line":241,"column":21},"end":{"line":246,"column":3}},"102":{"start":{"line":248,"column":2},"end":{"line":250,"column":3}},"103":{"start":{"line":249,"column":4},"end":{"line":249,"column":23}},"104":{"start":{"line":251,"column":2},"end":{"line":253,"column":3}},"105":{"start":{"line":252,"column":4},"end":{"line":252,"column":23}},"106":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"107":{"start":{"line":255,"column":4},"end":{"line":255,"column":50}},"108":{"start":{"line":258,"column":17},"end":{"line":258,"column":57}},"109":{"start":{"line":260,"column":2},"end":{"line":290,"column":3}},"110":{"start":{"line":261,"column":57},"end":{"line":261,"column":72}},"111":{"start":{"line":262,"column":4},"end":{"line":262,"column":43}},"112":{"start":{"line":263,"column":4},"end":{"line":263,"column":40}},"113":{"start":{"line":264,"column":4},"end":{"line":268,"column":5}},"114":{"start":{"line":265,"column":6},"end":{"line":265,"column":44}},"115":{"start":{"line":266,"column":6},"end":{"line":266,"column":47}},"116":{"start":{"line":267,"column":6},"end":{"line":267,"column":53}},"117":{"start":{"line":269,"column":4},"end":{"line":277,"column":5}},"118":{"start":{"line":270,"column":66},"end":{"line":270,"column":74}},"119":{"start":{"line":271,"column":6},"end":{"line":271,"column":40}},"120":{"start":{"line":272,"column":6},"end":{"line":272,"column":42}},"121":{"start":{"line":273,"column":6},"end":{"line":273,"column":42}},"122":{"start":{"line":274,"column":6},"end":{"line":274,"column":43}},"123":{"start":{"line":275,"column":6},"end":{"line":275,"column":40}},"124":{"start":{"line":276,"column":6},"end":{"line":276,"column":33}},"125":{"start":{"line":279,"column":4},"end":{"line":289,"column":5}},"126":{"start":{"line":280,"column":32},"end":{"line":280,"column":38}},"127":{"start":{"line":281,"column":6},"end":{"line":283,"column":7}},"128":{"start":{"line":282,"column":8},"end":{"line":282,"column":45}},"129":{"start":{"line":285,"column":42},"end":{"line":285,"column":48}},"130":{"start":{"line":286,"column":6},"end":{"line":288,"column":7}},"131":{"start":{"line":287,"column":8},"end":{"line":287,"column":55}},"132":{"start":{"line":292,"column":2},"end":{"line":292,"column":70}},"133":{"start":{"line":293,"column":2},"end":{"line":293,"column":77}},"134":{"start":{"line":295,"column":21},"end":{"line":295,"column":45}},"135":{"start":{"line":296,"column":2},"end":{"line":298,"column":5}},"136":{"start":{"line":297,"column":4},"end":{"line":297,"column":65}},"137":{"start":{"line":300,"column":2},"end":{"line":303,"column":3}},"138":{"start":{"line":301,"column":4},"end":{"line":301,"column":56}},"139":{"start":{"line":302,"column":4},"end":{"line":302,"column":25}},"140":{"start":{"line":306,"column":18},"end":{"line":306,"column":58}},"141":{"start":{"line":309,"column":24},"end":{"line":309,"column":78}},"142":{"start":{"line":311,"column":2},"end":{"line":311,"column":66}},"143":{"start":{"line":314,"column":21},"end":{"line":314,"column":69}},"144":{"start":{"line":315,"column":2},"end":{"line":315,"column":60}},"145":{"start":{"line":318,"column":30},"end":{"line":322,"column":3}},"146":{"start":{"line":323,"column":2},"end":{"line":323,"column":78}},"147":{"start":{"line":325,"column":23},"end":{"line":329,"column":3}},"148":{"start":{"line":331,"column":23},"end":{"line":336,"column":3}},"149":{"start":{"line":337,"column":23},"end":{"line":337,"column":41}},"150":{"start":{"line":338,"column":2},"end":{"line":338,"column":35}},"151":{"start":{"line":340,"column":2},"end":{"line":342,"column":3}},"152":{"start":{"line":341,"column":4},"end":{"line":341,"column":38}},"153":{"start":{"line":343,"column":31},"end":{"line":347,"column":15}},"154":{"start":{"line":349,"column":2},"end":{"line":363,"column":3}},"155":{"start":{"line":350,"column":4},"end":{"line":355,"column":16}},"156":{"start":{"line":357,"column":4},"end":{"line":362,"column":24}},"157":{"start":{"line":364,"column":2},"end":{"line":364,"column":56}},"158":{"start":{"line":366,"column":20},"end":{"line":368,"column":33}},"159":{"start":{"line":369,"column":2},"end":{"line":369,"column":53}},"160":{"start":{"line":371,"column":19},"end":{"line":371,"column":41}},"161":{"start":{"line":372,"column":2},"end":{"line":372,"column":59}},"162":{"start":{"line":373,"column":2},"end":{"line":373,"column":34}},"163":{"start":{"line":374,"column":2},"end":{"line":374,"column":58}},"164":{"start":{"line":375,"column":2},"end":{"line":375,"column":33}},"165":{"start":{"line":377,"column":2},"end":{"line":377,"column":18}},"166":{"start":{"line":382,"column":2},"end":{"line":389,"column":3}},"167":{"start":{"line":383,"column":4},"end":{"line":383,"column":35}},"168":{"start":{"line":384,"column":27},"end":{"line":384,"column":78}},"169":{"start":{"line":385,"column":4},"end":{"line":388,"column":5}},"170":{"start":{"line":387,"column":6},"end":{"line":387,"column":39}},"171":{"start":{"line":393,"column":6},"end":{"line":393,"column":24}},"172":{"start":{"line":394,"column":2},"end":{"line":394,"column":70}},"173":{"start":{"line":395,"column":2},"end":{"line":395,"column":74}},"174":{"start":{"line":397,"column":2},"end":{"line":401,"column":3}},"175":{"start":{"line":398,"column":4},"end":{"line":398,"column":39}},"176":{"start":{"line":400,"column":4},"end":{"line":400,"column":25}},"177":{"start":{"line":403,"column":25},"end":{"line":403,"column":74}},"178":{"start":{"line":405,"column":55},"end":{"line":405,"column":69}},"179":{"start":{"line":407,"column":2},"end":{"line":414,"column":3}},"180":{"start":{"line":411,"column":4},"end":{"line":411,"column":57}},"181":{"start":{"line":413,"column":4},"end":{"line":413,"column":15}},"182":{"start":{"line":416,"column":2},"end":{"line":430,"column":4}},"183":{"start":{"line":435,"column":27},"end":{"line":435,"column":45}},"184":{"start":{"line":436,"column":2},"end":{"line":436,"column":43}},"185":{"start":{"line":438,"column":4},"end":{"line":441,"column":24}},"186":{"start":{"line":442,"column":21},"end":{"line":450,"column":3}},"187":{"start":{"line":452,"column":2},"end":{"line":452,"column":20}},"188":{"start":{"line":457,"column":22},"end":{"line":457,"column":35}},"189":{"start":{"line":461,"column":21},"end":{"line":463,"column":3}},"190":{"start":{"line":465,"column":2},"end":{"line":474,"column":3}},"191":{"start":{"line":467,"column":6},"end":{"line":467,"column":33}},"192":{"start":{"line":468,"column":6},"end":{"line":468,"column":12}},"193":{"start":{"line":470,"column":6},"end":{"line":470,"column":40}},"194":{"start":{"line":471,"column":6},"end":{"line":471,"column":12}},"195":{"start":{"line":473,"column":6},"end":{"line":473,"column":12}},"196":{"start":{"line":475,"column":30},"end":{"line":475,"column":48}},"197":{"start":{"line":476,"column":2},"end":{"line":476,"column":49}},"198":{"start":{"line":477,"column":2},"end":{"line":488,"column":3}},"199":{"start":{"line":478,"column":4},"end":{"line":487,"column":5}},"200":{"start":{"line":480,"column":8},"end":{"line":480,"column":31}},"201":{"start":{"line":481,"column":8},"end":{"line":481,"column":14}},"202":{"start":{"line":483,"column":8},"end":{"line":483,"column":38}},"203":{"start":{"line":484,"column":8},"end":{"line":484,"column":14}},"204":{"start":{"line":486,"column":8},"end":{"line":486,"column":14}},"205":{"start":{"line":490,"column":2},"end":{"line":490,"column":20}},"206":{"start":{"line":495,"column":30},"end":{"line":495,"column":48}},"207":{"start":{"line":496,"column":2},"end":{"line":496,"column":49}},"208":{"start":{"line":498,"column":2},"end":{"line":505,"column":3}},"209":{"start":{"line":500,"column":6},"end":{"line":500,"column":29}},"210":{"start":{"line":501,"column":6},"end":{"line":501,"column":12}},"211":{"start":{"line":503,"column":6},"end":{"line":503,"column":22}},"212":{"start":{"line":504,"column":6},"end":{"line":504,"column":12}},"213":{"start":{"line":506,"column":2},"end":{"line":510,"column":3}},"214":{"start":{"line":507,"column":4},"end":{"line":509,"column":6}},"215":{"start":{"line":511,"column":2},"end":{"line":513,"column":4}},"216":{"start":{"line":518,"column":21},"end":{"line":520,"column":3}},"217":{"start":{"line":521,"column":30},"end":{"line":521,"column":48}},"218":{"start":{"line":522,"column":2},"end":{"line":522,"column":49}},"219":{"start":{"line":524,"column":23},"end":{"line":524,"column":41}},"220":{"start":{"line":525,"column":2},"end":{"line":536,"column":3}},"221":{"start":{"line":526,"column":26},"end":{"line":531,"column":5}},"222":{"start":{"line":532,"column":4},"end":{"line":532,"column":45}},"223":{"start":{"line":535,"column":4},"end":{"line":535,"column":48}},"224":{"start":{"line":538,"column":2},"end":{"line":538,"column":20}},"225":{"start":{"line":544,"column":21},"end":{"line":544,"column":23}},"226":{"start":{"line":547,"column":26},"end":{"line":547,"column":39}},"227":{"start":{"line":548,"column":2},"end":{"line":548,"column":55}},"228":{"start":{"line":549,"column":2},"end":{"line":564,"column":3}},"229":{"start":{"line":551,"column":6},"end":{"line":551,"column":45}},"230":{"start":{"line":552,"column":6},"end":{"line":552,"column":12}},"231":{"start":{"line":554,"column":27},"end":{"line":554,"column":45}},"232":{"start":{"line":555,"column":30},"end":{"line":555,"column":32}},"233":{"start":{"line":556,"column":6},"end":{"line":558,"column":9}},"234":{"start":{"line":557,"column":8},"end":{"line":557,"column":54}},"235":{"start":{"line":559,"column":6},"end":{"line":559,"column":40}},"236":{"start":{"line":560,"column":6},"end":{"line":560,"column":12}},"237":{"start":{"line":563,"column":6},"end":{"line":563,"column":30}},"238":{"start":{"line":565,"column":2},"end":{"line":565,"column":20}},"239":{"start":{"line":570,"column":22},"end":{"line":570,"column":35}},"240":{"start":{"line":571,"column":30},"end":{"line":571,"column":48}},"241":{"start":{"line":572,"column":2},"end":{"line":572,"column":49}},"242":{"start":{"line":573,"column":21},"end":{"line":573,"column":23}},"243":{"start":{"line":577,"column":2},"end":{"line":652,"column":3}},"244":{"start":{"line":578,"column":4},"end":{"line":598,"column":5}},"245":{"start":{"line":581,"column":8},"end":{"line":581,"column":33}},"246":{"start":{"line":582,"column":8},"end":{"line":582,"column":14}},"247":{"start":{"line":584,"column":8},"end":{"line":584,"column":32}},"248":{"start":{"line":585,"column":8},"end":{"line":585,"column":14}},"249":{"start":{"line":587,"column":8},"end":{"line":597,"column":19}},"250":{"start":{"line":599,"column":25},"end":{"line":599,"column":43}},"251":{"start":{"line":600,"column":29},"end":{"line":600,"column":47}},"252":{"start":{"line":601,"column":4},"end":{"line":601,"column":52}},"253":{"start":{"line":602,"column":4},"end":{"line":602,"column":46}},"254":{"start":{"line":603,"column":4},"end":{"line":612,"column":14}},"255":{"start":{"line":606,"column":10},"end":{"line":607,"column":60}},"256":{"start":{"line":610,"column":8},"end":{"line":610,"column":42}},"257":{"start":{"line":613,"column":4},"end":{"line":622,"column":14}},"258":{"start":{"line":616,"column":10},"end":{"line":617,"column":60}},"259":{"start":{"line":620,"column":8},"end":{"line":620,"column":42}},"260":{"start":{"line":623,"column":4},"end":{"line":651,"column":5}},"261":{"start":{"line":624,"column":30},"end":{"line":624,"column":68}},"262":{"start":{"line":625,"column":6},"end":{"line":650,"column":7}},"263":{"start":{"line":625,"column":19},"end":{"line":625,"column":20}},"264":{"start":{"line":626,"column":22},"end":{"line":626,"column":33}},"265":{"start":{"line":627,"column":26},"end":{"line":627,"column":31}},"266":{"start":{"line":629,"column":8},"end":{"line":633,"column":9}},"267":{"start":{"line":630,"column":10},"end":{"line":630,"column":56}},"268":{"start":{"line":632,"column":10},"end":{"line":632,"column":63}},"269":{"start":{"line":636,"column":8},"end":{"line":639,"column":10}},"270":{"start":{"line":641,"column":8},"end":{"line":641,"column":55}},"271":{"start":{"line":642,"column":8},"end":{"line":642,"column":59}},"272":{"start":{"line":643,"column":8},"end":{"line":643,"column":56}},"273":{"start":{"line":644,"column":8},"end":{"line":645,"column":64}},"274":{"start":{"line":646,"column":8},"end":{"line":646,"column":57}},"275":{"start":{"line":647,"column":8},"end":{"line":647,"column":59}},"276":{"start":{"line":648,"column":8},"end":{"line":648,"column":56}},"277":{"start":{"line":649,"column":8},"end":{"line":649,"column":64}},"278":{"start":{"line":653,"column":2},"end":{"line":653,"column":20}},"279":{"start":{"line":658,"column":22},"end":{"line":658,"column":35}},"280":{"start":{"line":659,"column":30},"end":{"line":659,"column":48}},"281":{"start":{"line":660,"column":2},"end":{"line":660,"column":49}},"282":{"start":{"line":665,"column":21},"end":{"line":665,"column":23}},"283":{"start":{"line":669,"column":2},"end":{"line":708,"column":3}},"284":{"start":{"line":670,"column":4},"end":{"line":698,"column":5}},"285":{"start":{"line":672,"column":8},"end":{"line":672,"column":32}},"286":{"start":{"line":673,"column":8},"end":{"line":673,"column":14}},"287":{"start":{"line":675,"column":8},"end":{"line":675,"column":33}},"288":{"start":{"line":676,"column":8},"end":{"line":676,"column":14}},"289":{"start":{"line":680,"column":8},"end":{"line":680,"column":30}},"290":{"start":{"line":681,"column":8},"end":{"line":681,"column":14}},"291":{"start":{"line":684,"column":8},"end":{"line":684,"column":33}},"292":{"start":{"line":685,"column":8},"end":{"line":685,"column":14}},"293":{"start":{"line":687,"column":8},"end":{"line":697,"column":19}},"294":{"start":{"line":703,"column":28},"end":{"line":703,"column":66}},"295":{"start":{"line":704,"column":4},"end":{"line":707,"column":6}},"296":{"start":{"line":709,"column":18},"end":{"line":709,"column":36}},"297":{"start":{"line":710,"column":20},"end":{"line":710,"column":49}},"298":{"start":{"line":712,"column":2},"end":{"line":716,"column":3}},"299":{"start":{"line":713,"column":4},"end":{"line":713,"column":27}},"300":{"start":{"line":715,"column":4},"end":{"line":715,"column":33}},"301":{"start":{"line":718,"column":2},"end":{"line":718,"column":20}},"302":{"start":{"line":723,"column":22},"end":{"line":723,"column":35}},"303":{"start":{"line":724,"column":21},"end":{"line":724,"column":23}},"304":{"start":{"line":725,"column":30},"end":{"line":725,"column":48}},"305":{"start":{"line":726,"column":2},"end":{"line":726,"column":49}},"306":{"start":{"line":729,"column":2},"end":{"line":755,"column":3}},"307":{"start":{"line":731,"column":6},"end":{"line":731,"column":33}},"308":{"start":{"line":732,"column":6},"end":{"line":732,"column":12}},"309":{"start":{"line":734,"column":6},"end":{"line":734,"column":33}},"310":{"start":{"line":735,"column":6},"end":{"line":735,"column":12}},"311":{"start":{"line":737,"column":6},"end":{"line":737,"column":33}},"312":{"start":{"line":738,"column":6},"end":{"line":738,"column":12}},"313":{"start":{"line":740,"column":6},"end":{"line":740,"column":31}},"314":{"start":{"line":741,"column":6},"end":{"line":741,"column":12}},"315":{"start":{"line":743,"column":6},"end":{"line":754,"column":17}},"316":{"start":{"line":758,"column":36},"end":{"line":758,"column":54}},"317":{"start":{"line":760,"column":2},"end":{"line":773,"column":3}},"318":{"start":{"line":762,"column":4},"end":{"line":770,"column":5}},"319":{"start":{"line":764,"column":6},"end":{"line":767,"column":7}},"320":{"start":{"line":766,"column":8},"end":{"line":766,"column":30}},"321":{"start":{"line":769,"column":6},"end":{"line":769,"column":28}},"322":{"start":{"line":772,"column":4},"end":{"line":772,"column":28}},"323":{"start":{"line":775,"column":23},"end":{"line":775,"column":41}},"324":{"start":{"line":777,"column":2},"end":{"line":797,"column":3}},"325":{"start":{"line":778,"column":26},"end":{"line":783,"column":5}},"326":{"start":{"line":784,"column":4},"end":{"line":784,"column":45}},"327":{"start":{"line":787,"column":4},"end":{"line":796,"column":15}},"328":{"start":{"line":800,"column":2},"end":{"line":800,"column":20}},"329":{"start":{"line":805,"column":22},"end":{"line":805,"column":35}},"330":{"start":{"line":806,"column":21},"end":{"line":806,"column":23}},"331":{"start":{"line":807,"column":30},"end":{"line":807,"column":48}},"332":{"start":{"line":808,"column":2},"end":{"line":808,"column":49}},"333":{"start":{"line":809,"column":2},"end":{"line":846,"column":3}},"334":{"start":{"line":811,"column":4},"end":{"line":845,"column":5}},"335":{"start":{"line":813,"column":8},"end":{"line":813,"column":33}},"336":{"start":{"line":814,"column":8},"end":{"line":814,"column":14}},"337":{"start":{"line":816,"column":8},"end":{"line":816,"column":30}},"338":{"start":{"line":817,"column":8},"end":{"line":817,"column":14}},"339":{"start":{"line":819,"column":8},"end":{"line":819,"column":30}},"340":{"start":{"line":820,"column":8},"end":{"line":820,"column":14}},"341":{"start":{"line":822,"column":8},"end":{"line":822,"column":33}},"342":{"start":{"line":823,"column":8},"end":{"line":823,"column":14}},"343":{"start":{"line":825,"column":8},"end":{"line":825,"column":33}},"344":{"start":{"line":826,"column":8},"end":{"line":826,"column":14}},"345":{"start":{"line":828,"column":8},"end":{"line":828,"column":33}},"346":{"start":{"line":829,"column":8},"end":{"line":829,"column":14}},"347":{"start":{"line":831,"column":8},"end":{"line":831,"column":32}},"348":{"start":{"line":832,"column":8},"end":{"line":832,"column":14}},"349":{"start":{"line":834,"column":8},"end":{"line":844,"column":19}},"350":{"start":{"line":847,"column":23},"end":{"line":847,"column":41}},"351":{"start":{"line":849,"column":2},"end":{"line":857,"column":3}},"352":{"start":{"line":850,"column":26},"end":{"line":855,"column":5}},"353":{"start":{"line":856,"column":4},"end":{"line":856,"column":45}},"354":{"start":{"line":858,"column":2},"end":{"line":858,"column":20}},"355":{"start":{"line":865,"column":22},"end":{"line":865,"column":75}},"356":{"start":{"line":866,"column":2},"end":{"line":877,"column":3}},"357":{"start":{"line":867,"column":4},"end":{"line":876,"column":15}},"358":{"start":{"line":878,"column":21},"end":{"line":878,"column":23}},"359":{"start":{"line":880,"column":56},"end":{"line":880,"column":74}},"360":{"start":{"line":881,"column":2},"end":{"line":881,"column":63}},"361":{"start":{"line":882,"column":2},"end":{"line":882,"column":49}},"362":{"start":{"line":883,"column":2},"end":{"line":1018,"column":3}},"363":{"start":{"line":885,"column":6},"end":{"line":901,"column":7}},"364":{"start":{"line":886,"column":8},"end":{"line":886,"column":61}},"365":{"start":{"line":887,"column":8},"end":{"line":887,"column":43}},"366":{"start":{"line":889,"column":8},"end":{"line":900,"column":19}},"367":{"start":{"line":902,"column":6},"end":{"line":902,"column":12}},"368":{"start":{"line":904,"column":6},"end":{"line":904,"column":60}},"369":{"start":{"line":905,"column":6},"end":{"line":905,"column":37}},"370":{"start":{"line":906,"column":6},"end":{"line":906,"column":12}},"371":{"start":{"line":908,"column":6},"end":{"line":908,"column":24}},"372":{"start":{"line":909,"column":6},"end":{"line":909,"column":39}},"373":{"start":{"line":910,"column":6},"end":{"line":910,"column":12}},"374":{"start":{"line":912,"column":22},"end":{"line":912,"column":35}},"375":{"start":{"line":913,"column":6},"end":{"line":925,"column":7}},"376":{"start":{"line":914,"column":8},"end":{"line":924,"column":19}},"377":{"start":{"line":926,"column":6},"end":{"line":1000,"column":7}},"378":{"start":{"line":927,"column":8},"end":{"line":927,"column":44}},"379":{"start":{"line":928,"column":8},"end":{"line":930,"column":36}},"380":{"start":{"line":931,"column":8},"end":{"line":931,"column":35}},"381":{"start":{"line":932,"column":8},"end":{"line":932,"column":28}},"382":{"start":{"line":933,"column":8},"end":{"line":933,"column":40}},"383":{"start":{"line":936,"column":8},"end":{"line":941,"column":9}},"384":{"start":{"line":937,"column":44},"end":{"line":937,"column":62}},"385":{"start":{"line":938,"column":10},"end":{"line":938,"column":49}},"386":{"start":{"line":940,"column":10},"end":{"line":940,"column":52}},"387":{"start":{"line":942,"column":8},"end":{"line":942,"column":61}},"388":{"start":{"line":943,"column":8},"end":{"line":943,"column":50}},"389":{"start":{"line":944,"column":8},"end":{"line":996,"column":9}},"390":{"start":{"line":946,"column":12},"end":{"line":949,"column":14}},"391":{"start":{"line":950,"column":12},"end":{"line":950,"column":18}},"392":{"start":{"line":952,"column":12},"end":{"line":955,"column":14}},"393":{"start":{"line":956,"column":12},"end":{"line":956,"column":18}},"394":{"start":{"line":958,"column":12},"end":{"line":961,"column":14}},"395":{"start":{"line":962,"column":12},"end":{"line":962,"column":18}},"396":{"start":{"line":964,"column":12},"end":{"line":967,"column":14}},"397":{"start":{"line":968,"column":12},"end":{"line":968,"column":18}},"398":{"start":{"line":970,"column":12},"end":{"line":973,"column":14}},"399":{"start":{"line":974,"column":12},"end":{"line":974,"column":18}},"400":{"start":{"line":976,"column":12},"end":{"line":979,"column":14}},"401":{"start":{"line":980,"column":12},"end":{"line":980,"column":18}},"402":{"start":{"line":982,"column":12},"end":{"line":985,"column":14}},"403":{"start":{"line":986,"column":12},"end":{"line":986,"column":18}},"404":{"start":{"line":988,"column":12},"end":{"line":988,"column":70}},"405":{"start":{"line":989,"column":12},"end":{"line":989,"column":18}},"406":{"start":{"line":991,"column":12},"end":{"line":994,"column":14}},"407":{"start":{"line":995,"column":12},"end":{"line":995,"column":18}},"408":{"start":{"line":998,"column":8},"end":{"line":998,"column":43}},"409":{"start":{"line":999,"column":8},"end":{"line":999,"column":72}},"410":{"start":{"line":1001,"column":20},"end":{"line":1001,"column":77}},"411":{"start":{"line":1002,"column":6},"end":{"line":1002,"column":41}},"412":{"start":{"line":1003,"column":6},"end":{"line":1003,"column":12}},"413":{"start":{"line":1007,"column":6},"end":{"line":1017,"column":17}},"414":{"start":{"line":1020,"column":2},"end":{"line":1026,"column":4}},"415":{"start":{"line":1031,"column":2},"end":{"line":1031,"column":64}},"416":{"start":{"line":1033,"column":26},"end":{"line":1070,"column":1}},"417":{"start":{"line":1034,"column":2},"end":{"line":1037,"column":3}},"418":{"start":{"line":1035,"column":23},"end":{"line":1035,"column":75}},"419":{"start":{"line":1036,"column":4},"end":{"line":1036,"column":24}},"420":{"start":{"line":1039,"column":19},"end":{"line":1068,"column":4}},"421":{"start":{"line":1040,"column":4},"end":{"line":1067,"column":5}},"422":{"start":{"line":1041,"column":6},"end":{"line":1048,"column":7}},"423":{"start":{"line":1043,"column":8},"end":{"line":1047,"column":10}},"424":{"start":{"line":1050,"column":6},"end":{"line":1054,"column":8}},"425":{"start":{"line":1056,"column":21},"end":{"line":1060,"column":7}},"426":{"start":{"line":1061,"column":6},"end":{"line":1066,"column":8}},"427":{"start":{"line":1069,"column":2},"end":{"line":1069,"column":18}},"428":{"start":{"line":1071,"column":0},"end":{"line":1071,"column":48}}},"fnMap":{"0":{"name":"getParamsFromConfig","decl":{"start":{"line":32,"column":9},"end":{"line":32,"column":28}},"loc":{"start":{"line":32,"column":51},"end":{"line":53,"column":1}},"line":32},"1":{"name":"(anonymous_1)","decl":{"start":{"line":38,"column":24},"end":{"line":38,"column":25}},"loc":{"start":{"line":38,"column":35},"end":{"line":40,"column":5}},"line":38},"2":{"name":"(anonymous_2)","decl":{"start":{"line":43,"column":15},"end":{"line":43,"column":16}},"loc":{"start":{"line":43,"column":22},"end":{"line":51,"column":3}},"line":43},"3":{"name":"getProductLevelCustomParams","decl":{"start":{"line":55,"column":9},"end":{"line":55,"column":36}},"loc":{"start":{"line":55,"column":70},"end":{"line":68,"column":1}},"line":55},"4":{"name":"(anonymous_4)","decl":{"start":{"line":61,"column":41},"end":{"line":61,"column":42}},"loc":{"start":{"line":61,"column":59},"end":{"line":64,"column":5}},"line":61},"5":{"name":"getCustomParamKeys","decl":{"start":{"line":70,"column":9},"end":{"line":70,"column":27}},"loc":{"start":{"line":70,"column":36},"end":{"line":101,"column":1}},"line":70},"6":{"name":"(anonymous_6)","decl":{"start":{"line":81,"column":25},"end":{"line":81,"column":26}},"loc":{"start":{"line":81,"column":38},"end":{"line":85,"column":7}},"line":81},"7":{"name":"(anonymous_7)","decl":{"start":{"line":90,"column":22},"end":{"line":90,"column":23}},"loc":{"start":{"line":90,"column":32},"end":{"line":94,"column":7}},"line":90},"8":{"name":"getCustomParamsFromOldConfig","decl":{"start":{"line":103,"column":9},"end":{"line":103,"column":37}},"loc":{"start":{"line":103,"column":46},"end":{"line":117,"column":1}},"line":103},"9":{"name":"(anonymous_9)","decl":{"start":{"line":107,"column":34},"end":{"line":107,"column":35}},"loc":{"start":{"line":107,"column":45},"end":{"line":114,"column":5}},"line":107},"10":{"name":"checkmd5","decl":{"start":{"line":119,"column":9},"end":{"line":119,"column":17}},"loc":{"start":{"line":119,"column":27},"end":{"line":124,"column":1}},"line":119},"11":{"name":"processPageViews","decl":{"start":{"line":127,"column":9},"end":{"line":127,"column":25}},"loc":{"start":{"line":127,"column":48},"end":{"line":170,"column":1}},"line":127},"12":{"name":"setProductLevelProperties","decl":{"start":{"line":172,"column":9},"end":{"line":172,"column":34}},"loc":{"start":{"line":177,"column":2},"end":{"line":208,"column":1}},"line":177},"13":{"name":"responseBuilderSimple","decl":{"start":{"line":214,"column":9},"end":{"line":214,"column":30}},"loc":{"start":{"line":220,"column":2},"end":{"line":378,"column":1}},"line":220},"14":{"name":"(anonymous_14)","decl":{"start":{"line":296,"column":21},"end":{"line":296,"column":22}},"loc":{"start":{"line":296,"column":34},"end":{"line":298,"column":3}},"line":296},"15":{"name":"processIdentify","decl":{"start":{"line":380,"column":9},"end":{"line":380,"column":24}},"loc":{"start":{"line":380,"column":47},"end":{"line":431,"column":1}},"line":380},"16":{"name":"processNonEComGenericEvent","decl":{"start":{"line":434,"column":9},"end":{"line":434,"column":35}},"loc":{"start":{"line":434,"column":58},"end":{"line":453,"column":1}},"line":434},"17":{"name":"processPromotionEvent","decl":{"start":{"line":456,"column":9},"end":{"line":456,"column":30}},"loc":{"start":{"line":456,"column":53},"end":{"line":491,"column":1}},"line":456},"18":{"name":"processPaymentRelatedEvent","decl":{"start":{"line":494,"column":9},"end":{"line":494,"column":35}},"loc":{"start":{"line":494,"column":58},"end":{"line":514,"column":1}},"line":494},"19":{"name":"processRefundEvent","decl":{"start":{"line":517,"column":9},"end":{"line":517,"column":27}},"loc":{"start":{"line":517,"column":50},"end":{"line":539,"column":1}},"line":517},"20":{"name":"processSharingEvent","decl":{"start":{"line":543,"column":9},"end":{"line":543,"column":28}},"loc":{"start":{"line":543,"column":38},"end":{"line":566,"column":1}},"line":543},"21":{"name":"(anonymous_21)","decl":{"start":{"line":556,"column":23},"end":{"line":556,"column":24}},"loc":{"start":{"line":556,"column":34},"end":{"line":558,"column":7}},"line":556},"22":{"name":"processProductListEvent","decl":{"start":{"line":569,"column":9},"end":{"line":569,"column":32}},"loc":{"start":{"line":569,"column":55},"end":{"line":654,"column":1}},"line":569},"23":{"name":"(anonymous_23)","decl":{"start":{"line":605,"column":8},"end":{"line":605,"column":9}},"loc":{"start":{"line":606,"column":10},"end":{"line":607,"column":60}},"line":606},"24":{"name":"(anonymous_24)","decl":{"start":{"line":609,"column":11},"end":{"line":609,"column":12}},"loc":{"start":{"line":609,"column":18},"end":{"line":611,"column":7}},"line":609},"25":{"name":"(anonymous_25)","decl":{"start":{"line":615,"column":8},"end":{"line":615,"column":9}},"loc":{"start":{"line":616,"column":10},"end":{"line":617,"column":60}},"line":616},"26":{"name":"(anonymous_26)","decl":{"start":{"line":619,"column":11},"end":{"line":619,"column":12}},"loc":{"start":{"line":619,"column":18},"end":{"line":621,"column":7}},"line":619},"27":{"name":"processProductEvent","decl":{"start":{"line":657,"column":9},"end":{"line":657,"column":28}},"loc":{"start":{"line":657,"column":51},"end":{"line":719,"column":1}},"line":657},"28":{"name":"processTransactionEvent","decl":{"start":{"line":722,"column":9},"end":{"line":722,"column":32}},"loc":{"start":{"line":722,"column":55},"end":{"line":801,"column":1}},"line":722},"29":{"name":"processEComGenericEvent","decl":{"start":{"line":804,"column":9},"end":{"line":804,"column":32}},"loc":{"start":{"line":804,"column":55},"end":{"line":859,"column":1}},"line":804},"30":{"name":"processSingleMessage","decl":{"start":{"line":863,"column":9},"end":{"line":863,"column":29}},"loc":{"start":{"line":863,"column":52},"end":{"line":1027,"column":1}},"line":863},"31":{"name":"process","decl":{"start":{"line":1030,"column":9},"end":{"line":1030,"column":16}},"loc":{"start":{"line":1030,"column":24},"end":{"line":1032,"column":1}},"line":1030},"32":{"name":"(anonymous_32)","decl":{"start":{"line":1033,"column":26},"end":{"line":1033,"column":27}},"loc":{"start":{"line":1033,"column":36},"end":{"line":1070,"column":1}},"line":1033},"33":{"name":"(anonymous_33)","decl":{"start":{"line":1039,"column":30},"end":{"line":1039,"column":31}},"loc":{"start":{"line":1039,"column":39},"end":{"line":1068,"column":3}},"line":1039}},"branchMap":{"0":{"loc":{"start":{"line":37,"column":2},"end":{"line":41,"column":3}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":41,"column":3}},{"start":{"line":37,"column":2},"end":{"line":41,"column":3}}],"line":37},"1":{"loc":{"start":{"line":48,"column":6},"end":{"line":50,"column":26}},"type":"cond-expr","locations":[{"start":{"line":49,"column":10},"end":{"line":49,"column":38}},{"start":{"line":50,"column":10},"end":{"line":50,"column":26}}],"line":48},"2":{"loc":{"start":{"line":59,"column":2},"end":{"line":65,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":65,"column":3}},{"start":{"line":59,"column":2},"end":{"line":65,"column":3}}],"line":59},"3":{"loc":{"start":{"line":59,"column":6},"end":{"line":59,"column":56}},"type":"binary-expr","locations":[{"start":{"line":59,"column":6},"end":{"line":59,"column":13}},{"start":{"line":59,"column":17},"end":{"line":59,"column":56}}],"line":59},"4":{"loc":{"start":{"line":71,"column":2},"end":{"line":98,"column":3}},"type":"if","locations":[{"start":{"line":71,"column":2},"end":{"line":98,"column":3}},{"start":{"line":71,"column":2},"end":{"line":98,"column":3}}],"line":71},"5":{"loc":{"start":{"line":80,"column":4},"end":{"line":86,"column":5}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":86,"column":5}},{"start":{"line":80,"column":4},"end":{"line":86,"column":5}}],"line":80},"6":{"loc":{"start":{"line":80,"column":8},"end":{"line":80,"column":43}},"type":"binary-expr","locations":[{"start":{"line":80,"column":8},"end":{"line":80,"column":18}},{"start":{"line":80,"column":22},"end":{"line":80,"column":43}}],"line":80},"7":{"loc":{"start":{"line":89,"column":4},"end":{"line":95,"column":5}},"type":"if","locations":[{"start":{"line":89,"column":4},"end":{"line":95,"column":5}},{"start":{"line":89,"column":4},"end":{"line":95,"column":5}}],"line":89},"8":{"loc":{"start":{"line":89,"column":8},"end":{"line":89,"column":37}},"type":"binary-expr","locations":[{"start":{"line":89,"column":8},"end":{"line":89,"column":15}},{"start":{"line":89,"column":19},"end":{"line":89,"column":37}}],"line":89},"9":{"loc":{"start":{"line":106,"column":2},"end":{"line":115,"column":3}},"type":"if","locations":[{"start":{"line":106,"column":2},"end":{"line":115,"column":3}},{"start":{"line":106,"column":2},"end":{"line":115,"column":3}}],"line":106},"10":{"loc":{"start":{"line":106,"column":6},"end":{"line":106,"column":73}},"type":"binary-expr","locations":[{"start":{"line":106,"column":6},"end":{"line":106,"column":12}},{"start":{"line":106,"column":16},"end":{"line":106,"column":37}},{"start":{"line":106,"column":41},"end":{"line":106,"column":73}}],"line":106},"11":{"loc":{"start":{"line":108,"column":6},"end":{"line":110,"column":7}},"type":"if","locations":[{"start":{"line":108,"column":6},"end":{"line":110,"column":7}},{"start":{"line":108,"column":6},"end":{"line":110,"column":7}}],"line":108},"12":{"loc":{"start":{"line":108,"column":10},"end":{"line":108,"column":51}},"type":"binary-expr","locations":[{"start":{"line":108,"column":10},"end":{"line":108,"column":20}},{"start":{"line":108,"column":24},"end":{"line":108,"column":51}}],"line":108},"13":{"loc":{"start":{"line":111,"column":6},"end":{"line":113,"column":7}},"type":"if","locations":[{"start":{"line":111,"column":6},"end":{"line":113,"column":7}},{"start":{"line":111,"column":6},"end":{"line":113,"column":7}}],"line":111},"14":{"loc":{"start":{"line":111,"column":10},"end":{"line":111,"column":51}},"type":"binary-expr","locations":[{"start":{"line":111,"column":10},"end":{"line":111,"column":20}},{"start":{"line":111,"column":24},"end":{"line":111,"column":51}}],"line":111},"15":{"loc":{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},"type":"if","locations":[{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},{"start":{"line":120,"column":2},"end":{"line":122,"column":3}}],"line":120},"16":{"loc":{"start":{"line":120,"column":6},"end":{"line":120,"column":49}},"type":"binary-expr","locations":[{"start":{"line":120,"column":6},"end":{"line":120,"column":20}},{"start":{"line":120,"column":24},"end":{"line":120,"column":49}}],"line":120},"17":{"loc":{"start":{"line":132,"column":18},"end":{"line":132,"column":40}},"type":"binary-expr","locations":[{"start":{"line":132,"column":18},"end":{"line":132,"column":31}},{"start":{"line":132,"column":35},"end":{"line":132,"column":40}}],"line":132},"18":{"loc":{"start":{"line":133,"column":2},"end":{"line":161,"column":3}},"type":"if","locations":[{"start":{"line":133,"column":2},"end":{"line":161,"column":3}},{"start":{"line":133,"column":2},"end":{"line":161,"column":3}}],"line":133},"19":{"loc":{"start":{"line":136,"column":4},"end":{"line":160,"column":5}},"type":"if","locations":[{"start":{"line":136,"column":4},"end":{"line":160,"column":5}},{"start":{"line":136,"column":4},"end":{"line":160,"column":5}}],"line":136},"20":{"loc":{"start":{"line":142,"column":8},"end":{"line":144,"column":9}},"type":"if","locations":[{"start":{"line":142,"column":8},"end":{"line":144,"column":9}},{"start":{"line":142,"column":8},"end":{"line":144,"column":9}}],"line":142},"21":{"loc":{"start":{"line":142,"column":12},"end":{"line":142,"column":35}},"type":"binary-expr","locations":[{"start":{"line":142,"column":12},"end":{"line":142,"column":18}},{"start":{"line":142,"column":22},"end":{"line":142,"column":35}}],"line":142},"22":{"loc":{"start":{"line":183,"column":4},"end":{"line":187,"column":5}},"type":"if","locations":[{"start":{"line":183,"column":4},"end":{"line":187,"column":5}},{"start":{"line":183,"column":4},"end":{"line":187,"column":5}}],"line":183},"23":{"loc":{"start":{"line":183,"column":8},"end":{"line":183,"column":62}},"type":"binary-expr","locations":[{"start":{"line":183,"column":8},"end":{"line":183,"column":27}},{"start":{"line":183,"column":31},"end":{"line":183,"column":62}}],"line":183},"24":{"loc":{"start":{"line":190,"column":4},"end":{"line":196,"column":5}},"type":"if","locations":[{"start":{"line":190,"column":4},"end":{"line":196,"column":5}},{"start":{"line":190,"column":4},"end":{"line":196,"column":5}}],"line":190},"25":{"loc":{"start":{"line":205,"column":33},"end":{"line":205,"column":54}},"type":"binary-expr","locations":[{"start":{"line":205,"column":33},"end":{"line":205,"column":49}},{"start":{"line":205,"column":53},"end":{"line":205,"column":54}}],"line":205},"26":{"loc":{"start":{"line":230,"column":17},"end":{"line":230,"column":66}},"type":"binary-expr","locations":[{"start":{"line":230,"column":17},"end":{"line":230,"column":60}},{"start":{"line":230,"column":64},"end":{"line":230,"column":66}}],"line":230},"27":{"loc":{"start":{"line":231,"column":16},"end":{"line":231,"column":36}},"type":"binary-expr","locations":[{"start":{"line":231,"column":16},"end":{"line":231,"column":27}},{"start":{"line":231,"column":31},"end":{"line":231,"column":36}}],"line":231},"28":{"loc":{"start":{"line":232,"column":16},"end":{"line":232,"column":36}},"type":"binary-expr","locations":[{"start":{"line":232,"column":16},"end":{"line":232,"column":27}},{"start":{"line":232,"column":31},"end":{"line":232,"column":36}}],"line":232},"29":{"loc":{"start":{"line":233,"column":28},"end":{"line":233,"column":60}},"type":"binary-expr","locations":[{"start":{"line":233,"column":28},"end":{"line":233,"column":51}},{"start":{"line":233,"column":55},"end":{"line":233,"column":60}}],"line":233},"30":{"loc":{"start":{"line":234,"column":21},"end":{"line":234,"column":43}},"type":"binary-expr","locations":[{"start":{"line":234,"column":21},"end":{"line":234,"column":37}},{"start":{"line":234,"column":41},"end":{"line":234,"column":43}}],"line":234},"31":{"loc":{"start":{"line":237,"column":2},"end":{"line":239,"column":3}},"type":"if","locations":[{"start":{"line":237,"column":2},"end":{"line":239,"column":3}},{"start":{"line":237,"column":2},"end":{"line":239,"column":3}}],"line":237},"32":{"loc":{"start":{"line":237,"column":6},"end":{"line":237,"column":29}},"type":"binary-expr","locations":[{"start":{"line":237,"column":6},"end":{"line":237,"column":17}},{"start":{"line":237,"column":21},"end":{"line":237,"column":29}}],"line":237},"33":{"loc":{"start":{"line":245,"column":8},"end":{"line":245,"column":36}},"type":"binary-expr","locations":[{"start":{"line":245,"column":8},"end":{"line":245,"column":17}},{"start":{"line":245,"column":21},"end":{"line":245,"column":36}}],"line":245},"34":{"loc":{"start":{"line":248,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":248,"column":2},"end":{"line":250,"column":3}},{"start":{"line":248,"column":2},"end":{"line":250,"column":3}}],"line":248},"35":{"loc":{"start":{"line":251,"column":2},"end":{"line":253,"column":3}},"type":"if","locations":[{"start":{"line":251,"column":2},"end":{"line":253,"column":3}},{"start":{"line":251,"column":2},"end":{"line":253,"column":3}}],"line":251},"36":{"loc":{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":254,"column":2},"end":{"line":256,"column":3}},{"start":{"line":254,"column":2},"end":{"line":256,"column":3}}],"line":254},"37":{"loc":{"start":{"line":254,"column":6},"end":{"line":254,"column":51}},"type":"binary-expr","locations":[{"start":{"line":254,"column":6},"end":{"line":254,"column":29}},{"start":{"line":254,"column":33},"end":{"line":254,"column":51}}],"line":254},"38":{"loc":{"start":{"line":260,"column":2},"end":{"line":290,"column":3}},"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":290,"column":3}},{"start":{"line":260,"column":2},"end":{"line":290,"column":3}}],"line":260},"39":{"loc":{"start":{"line":262,"column":20},"end":{"line":262,"column":42}},"type":"binary-expr","locations":[{"start":{"line":262,"column":20},"end":{"line":262,"column":29}},{"start":{"line":262,"column":33},"end":{"line":262,"column":42}}],"line":262},"40":{"loc":{"start":{"line":263,"column":20},"end":{"line":263,"column":39}},"type":"binary-expr","locations":[{"start":{"line":263,"column":20},"end":{"line":263,"column":29}},{"start":{"line":263,"column":33},"end":{"line":263,"column":39}}],"line":263},"41":{"loc":{"start":{"line":264,"column":4},"end":{"line":268,"column":5}},"type":"if","locations":[{"start":{"line":264,"column":4},"end":{"line":268,"column":5}},{"start":{"line":264,"column":4},"end":{"line":268,"column":5}}],"line":264},"42":{"loc":{"start":{"line":265,"column":22},"end":{"line":265,"column":43}},"type":"binary-expr","locations":[{"start":{"line":265,"column":22},"end":{"line":265,"column":31}},{"start":{"line":265,"column":35},"end":{"line":265,"column":43}}],"line":265},"43":{"loc":{"start":{"line":266,"column":22},"end":{"line":266,"column":46}},"type":"binary-expr","locations":[{"start":{"line":266,"column":22},"end":{"line":266,"column":31}},{"start":{"line":266,"column":35},"end":{"line":266,"column":46}}],"line":266},"44":{"loc":{"start":{"line":267,"column":24},"end":{"line":267,"column":52}},"type":"binary-expr","locations":[{"start":{"line":267,"column":24},"end":{"line":267,"column":35}},{"start":{"line":267,"column":39},"end":{"line":267,"column":52}}],"line":267},"45":{"loc":{"start":{"line":269,"column":4},"end":{"line":277,"column":5}},"type":"if","locations":[{"start":{"line":269,"column":4},"end":{"line":277,"column":5}},{"start":{"line":269,"column":4},"end":{"line":277,"column":5}}],"line":269},"46":{"loc":{"start":{"line":271,"column":22},"end":{"line":271,"column":39}},"type":"binary-expr","locations":[{"start":{"line":271,"column":22},"end":{"line":271,"column":31}},{"start":{"line":271,"column":35},"end":{"line":271,"column":39}}],"line":271},"47":{"loc":{"start":{"line":272,"column":22},"end":{"line":272,"column":41}},"type":"binary-expr","locations":[{"start":{"line":272,"column":22},"end":{"line":272,"column":31}},{"start":{"line":272,"column":35},"end":{"line":272,"column":41}}],"line":272},"48":{"loc":{"start":{"line":273,"column":22},"end":{"line":273,"column":41}},"type":"binary-expr","locations":[{"start":{"line":273,"column":22},"end":{"line":273,"column":31}},{"start":{"line":273,"column":35},"end":{"line":273,"column":41}}],"line":273},"49":{"loc":{"start":{"line":274,"column":22},"end":{"line":274,"column":42}},"type":"binary-expr","locations":[{"start":{"line":274,"column":22},"end":{"line":274,"column":31}},{"start":{"line":274,"column":35},"end":{"line":274,"column":42}}],"line":274},"50":{"loc":{"start":{"line":275,"column":22},"end":{"line":275,"column":39}},"type":"binary-expr","locations":[{"start":{"line":275,"column":22},"end":{"line":275,"column":31}},{"start":{"line":275,"column":35},"end":{"line":275,"column":39}}],"line":275},"51":{"loc":{"start":{"line":279,"column":4},"end":{"line":289,"column":5}},"type":"if","locations":[{"start":{"line":279,"column":4},"end":{"line":289,"column":5}},{"start":{"line":279,"column":4},"end":{"line":289,"column":5}}],"line":279},"52":{"loc":{"start":{"line":281,"column":6},"end":{"line":283,"column":7}},"type":"if","locations":[{"start":{"line":281,"column":6},"end":{"line":283,"column":7}},{"start":{"line":281,"column":6},"end":{"line":283,"column":7}}],"line":281},"53":{"loc":{"start":{"line":281,"column":10},"end":{"line":281,"column":25}},"type":"binary-expr","locations":[{"start":{"line":281,"column":10},"end":{"line":281,"column":15}},{"start":{"line":281,"column":19},"end":{"line":281,"column":25}}],"line":281},"54":{"loc":{"start":{"line":286,"column":6},"end":{"line":288,"column":7}},"type":"if","locations":[{"start":{"line":286,"column":6},"end":{"line":288,"column":7}},{"start":{"line":286,"column":6},"end":{"line":288,"column":7}}],"line":286},"55":{"loc":{"start":{"line":286,"column":10},"end":{"line":286,"column":35}},"type":"binary-expr","locations":[{"start":{"line":286,"column":10},"end":{"line":286,"column":20}},{"start":{"line":286,"column":24},"end":{"line":286,"column":35}}],"line":286},"56":{"loc":{"start":{"line":300,"column":2},"end":{"line":303,"column":3}},"type":"if","locations":[{"start":{"line":300,"column":2},"end":{"line":303,"column":3}},{"start":{"line":300,"column":2},"end":{"line":303,"column":3}}],"line":300},"57":{"loc":{"start":{"line":338,"column":15},"end":{"line":338,"column":34}},"type":"binary-expr","locations":[{"start":{"line":338,"column":15},"end":{"line":338,"column":25}},{"start":{"line":338,"column":29},"end":{"line":338,"column":34}}],"line":338},"58":{"loc":{"start":{"line":340,"column":2},"end":{"line":342,"column":3}},"type":"if","locations":[{"start":{"line":340,"column":2},"end":{"line":342,"column":3}},{"start":{"line":340,"column":2},"end":{"line":342,"column":3}}],"line":340},"59":{"loc":{"start":{"line":340,"column":6},"end":{"line":340,"column":63}},"type":"binary-expr","locations":[{"start":{"line":340,"column":6},"end":{"line":340,"column":20}},{"start":{"line":340,"column":24},"end":{"line":340,"column":49}},{"start":{"line":340,"column":53},"end":{"line":340,"column":63}}],"line":340},"60":{"loc":{"start":{"line":343,"column":31},"end":{"line":347,"column":15}},"type":"cond-expr","locations":[{"start":{"line":344,"column":6},"end":{"line":346,"column":17}},{"start":{"line":347,"column":6},"end":{"line":347,"column":15}}],"line":343},"61":{"loc":{"start":{"line":344,"column":6},"end":{"line":346,"column":17}},"type":"cond-expr","locations":[{"start":{"line":345,"column":8},"end":{"line":345,"column":52}},{"start":{"line":346,"column":8},"end":{"line":346,"column":17}}],"line":344},"62":{"loc":{"start":{"line":349,"column":2},"end":{"line":363,"column":3}},"type":"if","locations":[{"start":{"line":349,"column":2},"end":{"line":363,"column":3}},{"start":{"line":349,"column":2},"end":{"line":363,"column":3}}],"line":349},"63":{"loc":{"start":{"line":351,"column":6},"end":{"line":355,"column":15}},"type":"binary-expr","locations":[{"start":{"line":351,"column":6},"end":{"line":351,"column":26}},{"start":{"line":352,"column":6},"end":{"line":352,"column":55}},{"start":{"line":353,"column":6},"end":{"line":353,"column":16}},{"start":{"line":354,"column":6},"end":{"line":354,"column":25}},{"start":{"line":355,"column":6},"end":{"line":355,"column":15}}],"line":351},"64":{"loc":{"start":{"line":358,"column":6},"end":{"line":362,"column":23}},"type":"binary-expr","locations":[{"start":{"line":358,"column":6},"end":{"line":358,"column":26}},{"start":{"line":359,"column":6},"end":{"line":359,"column":55}},{"start":{"line":360,"column":6},"end":{"line":360,"column":16}},{"start":{"line":361,"column":6},"end":{"line":361,"column":25}},{"start":{"line":362,"column":6},"end":{"line":362,"column":23}}],"line":358},"65":{"loc":{"start":{"line":364,"column":21},"end":{"line":364,"column":55}},"type":"binary-expr","locations":[{"start":{"line":364,"column":21},"end":{"line":364,"column":31}},{"start":{"line":364,"column":35},"end":{"line":364,"column":55}}],"line":364},"66":{"loc":{"start":{"line":366,"column":20},"end":{"line":368,"column":33}},"type":"cond-expr","locations":[{"start":{"line":367,"column":6},"end":{"line":367,"column":41}},{"start":{"line":368,"column":6},"end":{"line":368,"column":33}}],"line":366},"67":{"loc":{"start":{"line":374,"column":20},"end":{"line":374,"column":57}},"type":"binary-expr","locations":[{"start":{"line":374,"column":20},"end":{"line":374,"column":39}},{"start":{"line":374,"column":43},"end":{"line":374,"column":57}}],"line":374},"68":{"loc":{"start":{"line":382,"column":2},"end":{"line":389,"column":3}},"type":"if","locations":[{"start":{"line":382,"column":2},"end":{"line":389,"column":3}},{"start":{"line":382,"column":2},"end":{"line":389,"column":3}}],"line":382},"69":{"loc":{"start":{"line":385,"column":4},"end":{"line":388,"column":5}},"type":"if","locations":[{"start":{"line":385,"column":4},"end":{"line":388,"column":5}},{"start":{"line":385,"column":4},"end":{"line":388,"column":5}}],"line":385},"70":{"loc":{"start":{"line":394,"column":34},"end":{"line":394,"column":69}},"type":"binary-expr","locations":[{"start":{"line":394,"column":34},"end":{"line":394,"column":63}},{"start":{"line":394,"column":67},"end":{"line":394,"column":69}}],"line":394},"71":{"loc":{"start":{"line":395,"column":36},"end":{"line":395,"column":73}},"type":"binary-expr","locations":[{"start":{"line":395,"column":36},"end":{"line":395,"column":67}},{"start":{"line":395,"column":71},"end":{"line":395,"column":73}}],"line":395},"72":{"loc":{"start":{"line":397,"column":2},"end":{"line":401,"column":3}},"type":"if","locations":[{"start":{"line":397,"column":2},"end":{"line":401,"column":3}},{"start":{"line":397,"column":2},"end":{"line":401,"column":3}}],"line":397},"73":{"loc":{"start":{"line":403,"column":25},"end":{"line":403,"column":74}},"type":"binary-expr","locations":[{"start":{"line":403,"column":25},"end":{"line":403,"column":68}},{"start":{"line":403,"column":72},"end":{"line":403,"column":74}}],"line":403},"74":{"loc":{"start":{"line":407,"column":2},"end":{"line":414,"column":3}},"type":"if","locations":[{"start":{"line":407,"column":2},"end":{"line":414,"column":3}},{"start":{"line":407,"column":2},"end":{"line":414,"column":3}}],"line":407},"75":{"loc":{"start":{"line":408,"column":4},"end":{"line":409,"column":51}},"type":"binary-expr","locations":[{"start":{"line":408,"column":4},"end":{"line":408,"column":33}},{"start":{"line":409,"column":4},"end":{"line":409,"column":51}}],"line":408},"76":{"loc":{"start":{"line":436,"column":19},"end":{"line":436,"column":42}},"type":"binary-expr","locations":[{"start":{"line":436,"column":19},"end":{"line":436,"column":33}},{"start":{"line":436,"column":37},"end":{"line":436,"column":42}}],"line":436},"77":{"loc":{"start":{"line":438,"column":4},"end":{"line":441,"column":24}},"type":"cond-expr","locations":[{"start":{"line":440,"column":8},"end":{"line":440,"column":43}},{"start":{"line":441,"column":8},"end":{"line":441,"column":24}}],"line":438},"78":{"loc":{"start":{"line":438,"column":4},"end":{"line":439,"column":51}},"type":"binary-expr","locations":[{"start":{"line":438,"column":4},"end":{"line":438,"column":36}},{"start":{"line":439,"column":4},"end":{"line":439,"column":51}}],"line":438},"79":{"loc":{"start":{"line":445,"column":6},"end":{"line":448,"column":15}},"type":"cond-expr","locations":[{"start":{"line":447,"column":10},"end":{"line":447,"column":37}},{"start":{"line":448,"column":10},"end":{"line":448,"column":15}}],"line":445},"80":{"loc":{"start":{"line":445,"column":6},"end":{"line":446,"column":47}},"type":"binary-expr","locations":[{"start":{"line":445,"column":6},"end":{"line":445,"column":38}},{"start":{"line":446,"column":6},"end":{"line":446,"column":47}}],"line":445},"81":{"loc":{"start":{"line":449,"column":8},"end":{"line":449,"column":44}},"type":"cond-expr","locations":[{"start":{"line":449,"column":39},"end":{"line":449,"column":40}},{"start":{"line":449,"column":43},"end":{"line":449,"column":44}}],"line":449},"82":{"loc":{"start":{"line":465,"column":2},"end":{"line":474,"column":3}},"type":"switch","locations":[{"start":{"line":466,"column":4},"end":{"line":468,"column":12}},{"start":{"line":469,"column":4},"end":{"line":471,"column":12}},{"start":{"line":472,"column":4},"end":{"line":473,"column":12}}],"line":465},"83":{"loc":{"start":{"line":476,"column":22},"end":{"line":476,"column":48}},"type":"binary-expr","locations":[{"start":{"line":476,"column":22},"end":{"line":476,"column":39}},{"start":{"line":476,"column":43},"end":{"line":476,"column":48}}],"line":476},"84":{"loc":{"start":{"line":477,"column":2},"end":{"line":488,"column":3}},"type":"if","locations":[{"start":{"line":477,"column":2},"end":{"line":488,"column":3}},{"start":{"line":477,"column":2},"end":{"line":488,"column":3}}],"line":477},"85":{"loc":{"start":{"line":478,"column":4},"end":{"line":487,"column":5}},"type":"switch","locations":[{"start":{"line":479,"column":6},"end":{"line":481,"column":14}},{"start":{"line":482,"column":6},"end":{"line":484,"column":14}},{"start":{"line":485,"column":6},"end":{"line":486,"column":14}}],"line":478},"86":{"loc":{"start":{"line":496,"column":22},"end":{"line":496,"column":48}},"type":"binary-expr","locations":[{"start":{"line":496,"column":22},"end":{"line":496,"column":39}},{"start":{"line":496,"column":43},"end":{"line":496,"column":48}}],"line":496},"87":{"loc":{"start":{"line":498,"column":2},"end":{"line":505,"column":3}},"type":"switch","locations":[{"start":{"line":499,"column":4},"end":{"line":501,"column":12}},{"start":{"line":502,"column":4},"end":{"line":504,"column":12}}],"line":498},"88":{"loc":{"start":{"line":506,"column":2},"end":{"line":510,"column":3}},"type":"if","locations":[{"start":{"line":506,"column":2},"end":{"line":510,"column":3}},{"start":{"line":506,"column":2},"end":{"line":510,"column":3}}],"line":506},"89":{"loc":{"start":{"line":522,"column":22},"end":{"line":522,"column":48}},"type":"binary-expr","locations":[{"start":{"line":522,"column":22},"end":{"line":522,"column":39}},{"start":{"line":522,"column":43},"end":{"line":522,"column":48}}],"line":522},"90":{"loc":{"start":{"line":525,"column":2},"end":{"line":536,"column":3}},"type":"if","locations":[{"start":{"line":525,"column":2},"end":{"line":536,"column":3}},{"start":{"line":525,"column":2},"end":{"line":536,"column":3}}],"line":525},"91":{"loc":{"start":{"line":525,"column":6},"end":{"line":525,"column":37}},"type":"binary-expr","locations":[{"start":{"line":525,"column":6},"end":{"line":525,"column":14}},{"start":{"line":525,"column":18},"end":{"line":525,"column":37}}],"line":525},"92":{"loc":{"start":{"line":548,"column":18},"end":{"line":548,"column":54}},"type":"binary-expr","locations":[{"start":{"line":548,"column":18},"end":{"line":548,"column":45}},{"start":{"line":548,"column":49},"end":{"line":548,"column":54}}],"line":548},"93":{"loc":{"start":{"line":549,"column":2},"end":{"line":564,"column":3}},"type":"switch","locations":[{"start":{"line":550,"column":4},"end":{"line":552,"column":12}},{"start":{"line":553,"column":4},"end":{"line":561,"column":5}},{"start":{"line":562,"column":4},"end":{"line":563,"column":30}}],"line":549},"94":{"loc":{"start":{"line":572,"column":22},"end":{"line":572,"column":48}},"type":"binary-expr","locations":[{"start":{"line":572,"column":22},"end":{"line":572,"column":39}},{"start":{"line":572,"column":43},"end":{"line":572,"column":48}}],"line":572},"95":{"loc":{"start":{"line":577,"column":2},"end":{"line":652,"column":3}},"type":"if","locations":[{"start":{"line":577,"column":2},"end":{"line":652,"column":3}},{"start":{"line":577,"column":2},"end":{"line":652,"column":3}}],"line":577},"96":{"loc":{"start":{"line":578,"column":4},"end":{"line":598,"column":5}},"type":"switch","locations":[{"start":{"line":579,"column":6},"end":{"line":579,"column":42}},{"start":{"line":580,"column":6},"end":{"line":582,"column":14}},{"start":{"line":583,"column":6},"end":{"line":585,"column":14}},{"start":{"line":586,"column":6},"end":{"line":597,"column":19}}],"line":578},"97":{"loc":{"start":{"line":601,"column":14},"end":{"line":601,"column":51}},"type":"cond-expr","locations":[{"start":{"line":601,"column":39},"end":{"line":601,"column":46}},{"start":{"line":601,"column":49},"end":{"line":601,"column":51}}],"line":601},"98":{"loc":{"start":{"line":602,"column":12},"end":{"line":602,"column":45}},"type":"cond-expr","locations":[{"start":{"line":602,"column":35},"end":{"line":602,"column":40}},{"start":{"line":602,"column":43},"end":{"line":602,"column":45}}],"line":602},"99":{"loc":{"start":{"line":606,"column":10},"end":{"line":607,"column":60}},"type":"binary-expr","locations":[{"start":{"line":606,"column":10},"end":{"line":606,"column":59}},{"start":{"line":607,"column":10},"end":{"line":607,"column":60}}],"line":606},"100":{"loc":{"start":{"line":616,"column":10},"end":{"line":617,"column":60}},"type":"binary-expr","locations":[{"start":{"line":616,"column":10},"end":{"line":616,"column":59}},{"start":{"line":617,"column":10},"end":{"line":617,"column":60}}],"line":616},"101":{"loc":{"start":{"line":623,"column":4},"end":{"line":651,"column":5}},"type":"if","locations":[{"start":{"line":623,"column":4},"end":{"line":651,"column":5}},{"start":{"line":623,"column":4},"end":{"line":651,"column":5}}],"line":623},"102":{"loc":{"start":{"line":623,"column":8},"end":{"line":623,"column":39}},"type":"binary-expr","locations":[{"start":{"line":623,"column":8},"end":{"line":623,"column":16}},{"start":{"line":623,"column":20},"end":{"line":623,"column":39}}],"line":623},"103":{"loc":{"start":{"line":629,"column":8},"end":{"line":633,"column":9}},"type":"if","locations":[{"start":{"line":629,"column":8},"end":{"line":633,"column":9}},{"start":{"line":629,"column":8},"end":{"line":633,"column":9}}],"line":629},"104":{"loc":{"start":{"line":629,"column":12},"end":{"line":629,"column":62}},"type":"binary-expr","locations":[{"start":{"line":629,"column":12},"end":{"line":629,"column":29}},{"start":{"line":629,"column":33},"end":{"line":629,"column":62}}],"line":629},"105":{"loc":{"start":{"line":645,"column":10},"end":{"line":645,"column":63}},"type":"cond-expr","locations":[{"start":{"line":645,"column":29},"end":{"line":645,"column":51}},{"start":{"line":645,"column":54},"end":{"line":645,"column":63}}],"line":645},"106":{"loc":{"start":{"line":645,"column":10},"end":{"line":645,"column":26}},"type":"binary-expr","locations":[{"start":{"line":645,"column":10},"end":{"line":645,"column":17}},{"start":{"line":645,"column":21},"end":{"line":645,"column":26}}],"line":645},"107":{"loc":{"start":{"line":649,"column":44},"end":{"line":649,"column":63}},"type":"binary-expr","locations":[{"start":{"line":649,"column":44},"end":{"line":649,"column":58}},{"start":{"line":649,"column":62},"end":{"line":649,"column":63}}],"line":649},"108":{"loc":{"start":{"line":660,"column":22},"end":{"line":660,"column":48}},"type":"binary-expr","locations":[{"start":{"line":660,"column":22},"end":{"line":660,"column":39}},{"start":{"line":660,"column":43},"end":{"line":660,"column":48}}],"line":660},"109":{"loc":{"start":{"line":669,"column":2},"end":{"line":708,"column":3}},"type":"if","locations":[{"start":{"line":669,"column":2},"end":{"line":708,"column":3}},{"start":{"line":669,"column":2},"end":{"line":708,"column":3}}],"line":669},"110":{"loc":{"start":{"line":670,"column":4},"end":{"line":698,"column":5}},"type":"switch","locations":[{"start":{"line":671,"column":6},"end":{"line":673,"column":14}},{"start":{"line":674,"column":6},"end":{"line":676,"column":14}},{"start":{"line":677,"column":6},"end":{"line":677,"column":36}},{"start":{"line":678,"column":6},"end":{"line":678,"column":53}},{"start":{"line":679,"column":6},"end":{"line":681,"column":14}},{"start":{"line":682,"column":6},"end":{"line":682,"column":38}},{"start":{"line":683,"column":6},"end":{"line":685,"column":14}},{"start":{"line":686,"column":6},"end":{"line":697,"column":19}}],"line":670},"111":{"loc":{"start":{"line":712,"column":2},"end":{"line":716,"column":3}},"type":"if","locations":[{"start":{"line":712,"column":2},"end":{"line":716,"column":3}},{"start":{"line":712,"column":2},"end":{"line":716,"column":3}}],"line":712},"112":{"loc":{"start":{"line":712,"column":6},"end":{"line":712,"column":42}},"type":"binary-expr","locations":[{"start":{"line":712,"column":6},"end":{"line":712,"column":16}},{"start":{"line":712,"column":20},"end":{"line":712,"column":42}}],"line":712},"113":{"loc":{"start":{"line":726,"column":22},"end":{"line":726,"column":48}},"type":"binary-expr","locations":[{"start":{"line":726,"column":22},"end":{"line":726,"column":39}},{"start":{"line":726,"column":43},"end":{"line":726,"column":48}}],"line":726},"114":{"loc":{"start":{"line":729,"column":2},"end":{"line":755,"column":3}},"type":"switch","locations":[{"start":{"line":730,"column":4},"end":{"line":732,"column":12}},{"start":{"line":733,"column":4},"end":{"line":735,"column":12}},{"start":{"line":736,"column":4},"end":{"line":738,"column":12}},{"start":{"line":739,"column":4},"end":{"line":741,"column":12}},{"start":{"line":742,"column":4},"end":{"line":754,"column":17}}],"line":729},"115":{"loc":{"start":{"line":760,"column":2},"end":{"line":773,"column":3}},"type":"if","locations":[{"start":{"line":760,"column":2},"end":{"line":773,"column":3}},{"start":{"line":760,"column":2},"end":{"line":773,"column":3}}],"line":760},"116":{"loc":{"start":{"line":760,"column":6},"end":{"line":760,"column":38}},"type":"binary-expr","locations":[{"start":{"line":760,"column":6},"end":{"line":760,"column":14}},{"start":{"line":760,"column":18},"end":{"line":760,"column":38}}],"line":760},"117":{"loc":{"start":{"line":762,"column":4},"end":{"line":770,"column":5}},"type":"if","locations":[{"start":{"line":762,"column":4},"end":{"line":770,"column":5}},{"start":{"line":762,"column":4},"end":{"line":770,"column":5}}],"line":762},"118":{"loc":{"start":{"line":762,"column":8},"end":{"line":762,"column":36}},"type":"binary-expr","locations":[{"start":{"line":762,"column":8},"end":{"line":762,"column":14}},{"start":{"line":762,"column":18},"end":{"line":762,"column":36}}],"line":762},"119":{"loc":{"start":{"line":764,"column":6},"end":{"line":767,"column":7}},"type":"if","locations":[{"start":{"line":764,"column":6},"end":{"line":767,"column":7}},{"start":{"line":764,"column":6},"end":{"line":767,"column":7}}],"line":764},"120":{"loc":{"start":{"line":764,"column":12},"end":{"line":764,"column":40}},"type":"binary-expr","locations":[{"start":{"line":764,"column":12},"end":{"line":764,"column":18}},{"start":{"line":764,"column":22},"end":{"line":764,"column":40}}],"line":764},"121":{"loc":{"start":{"line":777,"column":2},"end":{"line":797,"column":3}},"type":"if","locations":[{"start":{"line":777,"column":2},"end":{"line":797,"column":3}},{"start":{"line":777,"column":2},"end":{"line":797,"column":3}}],"line":777},"122":{"loc":{"start":{"line":777,"column":6},"end":{"line":777,"column":37}},"type":"binary-expr","locations":[{"start":{"line":777,"column":6},"end":{"line":777,"column":14}},{"start":{"line":777,"column":18},"end":{"line":777,"column":37}}],"line":777},"123":{"loc":{"start":{"line":808,"column":22},"end":{"line":808,"column":48}},"type":"binary-expr","locations":[{"start":{"line":808,"column":22},"end":{"line":808,"column":39}},{"start":{"line":808,"column":43},"end":{"line":808,"column":48}}],"line":808},"124":{"loc":{"start":{"line":809,"column":2},"end":{"line":846,"column":3}},"type":"if","locations":[{"start":{"line":809,"column":2},"end":{"line":846,"column":3}},{"start":{"line":809,"column":2},"end":{"line":846,"column":3}}],"line":809},"125":{"loc":{"start":{"line":811,"column":4},"end":{"line":845,"column":5}},"type":"switch","locations":[{"start":{"line":812,"column":6},"end":{"line":814,"column":14}},{"start":{"line":815,"column":6},"end":{"line":817,"column":14}},{"start":{"line":818,"column":6},"end":{"line":820,"column":14}},{"start":{"line":821,"column":6},"end":{"line":823,"column":14}},{"start":{"line":824,"column":6},"end":{"line":826,"column":14}},{"start":{"line":827,"column":6},"end":{"line":829,"column":14}},{"start":{"line":830,"column":6},"end":{"line":832,"column":14}},{"start":{"line":833,"column":6},"end":{"line":844,"column":19}}],"line":811},"126":{"loc":{"start":{"line":849,"column":2},"end":{"line":857,"column":3}},"type":"if","locations":[{"start":{"line":849,"column":2},"end":{"line":857,"column":3}},{"start":{"line":849,"column":2},"end":{"line":857,"column":3}}],"line":849},"127":{"loc":{"start":{"line":849,"column":6},"end":{"line":849,"column":37}},"type":"binary-expr","locations":[{"start":{"line":849,"column":6},"end":{"line":849,"column":14}},{"start":{"line":849,"column":18},"end":{"line":849,"column":37}}],"line":849},"128":{"loc":{"start":{"line":865,"column":22},"end":{"line":865,"column":75}},"type":"cond-expr","locations":[{"start":{"line":865,"column":37},"end":{"line":865,"column":63}},{"start":{"line":865,"column":66},"end":{"line":865,"column":75}}],"line":865},"129":{"loc":{"start":{"line":866,"column":2},"end":{"line":877,"column":3}},"type":"if","locations":[{"start":{"line":866,"column":2},"end":{"line":877,"column":3}},{"start":{"line":866,"column":2},"end":{"line":877,"column":3}}],"line":866},"130":{"loc":{"start":{"line":881,"column":29},"end":{"line":881,"column":62}},"type":"binary-expr","locations":[{"start":{"line":881,"column":29},"end":{"line":881,"column":53}},{"start":{"line":881,"column":57},"end":{"line":881,"column":62}}],"line":881},"131":{"loc":{"start":{"line":882,"column":22},"end":{"line":882,"column":48}},"type":"binary-expr","locations":[{"start":{"line":882,"column":22},"end":{"line":882,"column":39}},{"start":{"line":882,"column":43},"end":{"line":882,"column":48}}],"line":882},"132":{"loc":{"start":{"line":883,"column":2},"end":{"line":1018,"column":3}},"type":"switch","locations":[{"start":{"line":884,"column":4},"end":{"line":902,"column":12}},{"start":{"line":903,"column":4},"end":{"line":906,"column":12}},{"start":{"line":907,"column":4},"end":{"line":910,"column":12}},{"start":{"line":911,"column":4},"end":{"line":1004,"column":5}},{"start":{"line":1005,"column":4},"end":{"line":1017,"column":17}}],"line":883},"133":{"loc":{"start":{"line":885,"column":6},"end":{"line":901,"column":7}},"type":"if","locations":[{"start":{"line":885,"column":6},"end":{"line":901,"column":7}},{"start":{"line":885,"column":6},"end":{"line":901,"column":7}}],"line":885},"134":{"loc":{"start":{"line":913,"column":6},"end":{"line":925,"column":7}},"type":"if","locations":[{"start":{"line":913,"column":6},"end":{"line":925,"column":7}},{"start":{"line":913,"column":6},"end":{"line":925,"column":7}}],"line":913},"135":{"loc":{"start":{"line":913,"column":12},"end":{"line":913,"column":72}},"type":"binary-expr","locations":[{"start":{"line":913,"column":12},"end":{"line":913,"column":41}},{"start":{"line":913,"column":45},"end":{"line":913,"column":72}}],"line":913},"136":{"loc":{"start":{"line":926,"column":6},"end":{"line":1000,"column":7}},"type":"if","locations":[{"start":{"line":926,"column":6},"end":{"line":1000,"column":7}},{"start":{"line":926,"column":6},"end":{"line":1000,"column":7}}],"line":926},"137":{"loc":{"start":{"line":928,"column":19},"end":{"line":930,"column":35}},"type":"cond-expr","locations":[{"start":{"line":929,"column":12},"end":{"line":929,"column":46}},{"start":{"line":930,"column":12},"end":{"line":930,"column":35}}],"line":928},"138":{"loc":{"start":{"line":936,"column":8},"end":{"line":941,"column":9}},"type":"if","locations":[{"start":{"line":936,"column":8},"end":{"line":941,"column":9}},{"start":{"line":936,"column":8},"end":{"line":941,"column":9}}],"line":936},"139":{"loc":{"start":{"line":938,"column":23},"end":{"line":938,"column":48}},"type":"binary-expr","locations":[{"start":{"line":938,"column":23},"end":{"line":938,"column":28}},{"start":{"line":938,"column":32},"end":{"line":938,"column":39}},{"start":{"line":938,"column":43},"end":{"line":938,"column":48}}],"line":938},"140":{"loc":{"start":{"line":942,"column":26},"end":{"line":942,"column":60}},"type":"binary-expr","locations":[{"start":{"line":942,"column":26},"end":{"line":942,"column":37}},{"start":{"line":942,"column":41},"end":{"line":942,"column":60}}],"line":942},"141":{"loc":{"start":{"line":944,"column":8},"end":{"line":996,"column":9}},"type":"switch","locations":[{"start":{"line":945,"column":10},"end":{"line":950,"column":18}},{"start":{"line":951,"column":10},"end":{"line":956,"column":18}},{"start":{"line":957,"column":10},"end":{"line":962,"column":18}},{"start":{"line":963,"column":10},"end":{"line":968,"column":18}},{"start":{"line":969,"column":10},"end":{"line":974,"column":18}},{"start":{"line":975,"column":10},"end":{"line":980,"column":18}},{"start":{"line":981,"column":10},"end":{"line":986,"column":18}},{"start":{"line":987,"column":10},"end":{"line":989,"column":18}},{"start":{"line":990,"column":10},"end":{"line":995,"column":18}}],"line":944},"142":{"loc":{"start":{"line":1001,"column":20},"end":{"line":1001,"column":77}},"type":"cond-expr","locations":[{"start":{"line":1001,"column":41},"end":{"line":1001,"column":65}},{"start":{"line":1001,"column":68},"end":{"line":1001,"column":77}}],"line":1001},"143":{"loc":{"start":{"line":1002,"column":24},"end":{"line":1002,"column":40}},"type":"binary-expr","locations":[{"start":{"line":1002,"column":24},"end":{"line":1002,"column":29}},{"start":{"line":1002,"column":33},"end":{"line":1002,"column":40}}],"line":1002},"144":{"loc":{"start":{"line":1034,"column":2},"end":{"line":1037,"column":3}},"type":"if","locations":[{"start":{"line":1034,"column":2},"end":{"line":1037,"column":3}},{"start":{"line":1034,"column":2},"end":{"line":1037,"column":3}}],"line":1034},"145":{"loc":{"start":{"line":1034,"column":6},"end":{"line":1034,"column":50}},"type":"binary-expr","locations":[{"start":{"line":1034,"column":6},"end":{"line":1034,"column":28}},{"start":{"line":1034,"column":32},"end":{"line":1034,"column":50}}],"line":1034},"146":{"loc":{"start":{"line":1041,"column":6},"end":{"line":1048,"column":7}},"type":"if","locations":[{"start":{"line":1041,"column":6},"end":{"line":1048,"column":7}},{"start":{"line":1041,"column":6},"end":{"line":1048,"column":7}}],"line":1041},"147":{"loc":{"start":{"line":1063,"column":8},"end":{"line":1063,"column":27}},"type":"binary-expr","locations":[{"start":{"line":1063,"column":8},"end":{"line":1063,"column":20}},{"start":{"line":1063,"column":24},"end":{"line":1063,"column":27}}],"line":1063},"148":{"loc":{"start":{"line":1064,"column":8},"end":{"line":1064,"column":67}},"type":"binary-expr","locations":[{"start":{"line":1064,"column":8},"end":{"line":1064,"column":21}},{"start":{"line":1064,"column":25},"end":{"line":1064,"column":67}}],"line":1064}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":162,"9":162,"10":162,"11":162,"12":162,"13":160,"14":320,"15":162,"16":162,"17":320,"18":320,"19":320,"20":320,"21":162,"22":35,"23":35,"24":35,"25":35,"26":140,"27":35,"28":31,"29":31,"30":31,"31":31,"32":31,"33":31,"34":62,"35":62,"36":62,"37":31,"38":31,"39":62,"40":62,"41":62,"42":31,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":1,"54":1,"55":0,"56":54,"57":54,"58":54,"59":50,"60":50,"61":4,"62":4,"63":4,"64":4,"65":4,"66":4,"67":1,"68":4,"69":0,"70":54,"71":54,"72":10,"73":10,"74":10,"75":20,"76":20,"77":20,"78":10,"79":10,"80":20,"81":20,"82":20,"83":20,"84":20,"85":20,"86":20,"87":20,"88":20,"89":20,"90":20,"91":10,"92":54,"93":54,"94":54,"95":54,"96":54,"97":54,"98":54,"99":54,"100":0,"101":54,"102":54,"103":53,"104":54,"105":48,"106":54,"107":49,"108":54,"109":54,"110":54,"111":54,"112":54,"113":54,"114":53,"115":53,"116":53,"117":54,"118":3,"119":3,"120":3,"121":3,"122":3,"123":3,"124":3,"125":54,"126":54,"127":54,"128":0,"129":54,"130":54,"131":0,"132":54,"133":54,"134":54,"135":54,"136":208,"137":54,"138":50,"139":50,"140":54,"141":54,"142":54,"143":54,"144":54,"145":54,"146":54,"147":54,"148":54,"149":54,"150":54,"151":54,"152":52,"153":54,"154":54,"155":1,"156":53,"157":54,"158":54,"159":54,"160":54,"161":54,"162":54,"163":54,"164":54,"165":54,"166":8,"167":1,"168":1,"169":1,"170":0,"171":8,"172":8,"173":8,"174":8,"175":7,"176":1,"177":8,"178":8,"179":8,"180":6,"181":2,"182":8,"183":11,"184":11,"185":11,"186":11,"187":11,"188":2,"189":2,"190":2,"191":1,"192":1,"193":1,"194":1,"195":0,"196":2,"197":2,"198":2,"199":2,"200":1,"201":1,"202":1,"203":1,"204":0,"205":2,"206":2,"207":2,"208":2,"209":1,"210":1,"211":1,"212":1,"213":2,"214":2,"215":0,"216":5,"217":5,"218":5,"219":5,"220":5,"221":3,"222":3,"223":2,"224":5,"225":2,"226":2,"227":2,"228":2,"229":1,"230":1,"231":1,"232":1,"233":1,"234":2,"235":1,"236":1,"237":0,"238":2,"239":6,"240":6,"241":6,"242":6,"243":6,"244":6,"245":3,"246":3,"247":3,"248":3,"249":0,"250":6,"251":6,"252":6,"253":6,"254":6,"255":4,"256":4,"257":6,"258":3,"259":3,"260":6,"261":5,"262":5,"263":5,"264":9,"265":9,"266":9,"267":2,"268":7,"269":9,"270":9,"271":9,"272":9,"273":9,"274":9,"275":9,"276":9,"277":9,"278":6,"279":6,"280":6,"281":6,"282":6,"283":6,"284":6,"285":1,"286":1,"287":2,"288":2,"289":1,"290":1,"291":2,"292":2,"293":0,"294":6,"295":6,"296":6,"297":6,"298":6,"299":6,"300":0,"301":6,"302":7,"303":7,"304":7,"305":7,"306":7,"307":1,"308":1,"309":1,"310":1,"311":1,"312":1,"313":4,"314":4,"315":0,"316":7,"317":7,"318":5,"319":4,"320":2,"321":1,"322":2,"323":7,"324":7,"325":6,"326":6,"327":1,"328":6,"329":1,"330":1,"331":1,"332":1,"333":1,"334":1,"335":1,"336":1,"337":0,"338":0,"339":0,"340":0,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":1,"351":1,"352":1,"353":1,"354":1,"355":57,"356":57,"357":0,"358":57,"359":57,"360":57,"361":57,"362":57,"363":9,"364":8,"365":8,"366":1,"367":8,"368":4,"369":4,"370":4,"371":1,"372":1,"373":1,"374":42,"375":42,"376":0,"377":42,"378":41,"379":41,"380":41,"381":41,"382":41,"383":41,"384":41,"385":41,"386":41,"387":41,"388":41,"389":41,"390":6,"391":6,"392":2,"393":2,"394":6,"395":6,"396":7,"397":6,"398":2,"399":2,"400":5,"401":5,"402":1,"403":1,"404":2,"405":2,"406":10,"407":10,"408":1,"409":1,"410":41,"411":41,"412":41,"413":1,"414":54,"415":57,"416":1,"417":1,"418":0,"419":0,"420":1,"421":2,"422":2,"423":0,"424":2,"425":0,"426":0,"427":1,"428":1},"f":{"0":162,"1":320,"2":320,"3":35,"4":140,"5":31,"6":62,"7":62,"8":0,"9":0,"10":1,"11":54,"12":10,"13":54,"14":208,"15":8,"16":11,"17":2,"18":2,"19":5,"20":2,"21":2,"22":6,"23":4,"24":4,"25":3,"26":3,"27":6,"28":7,"29":1,"30":57,"31":57,"32":1,"33":2},"b":{"0":[160,2],"1":[272,48],"2":[35,0],"3":[35,35],"4":[31,0],"5":[31,0],"6":[31,31],"7":[31,0],"8":[31,31],"9":[0,0],"10":[0,0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[1,0],"16":[1,1],"17":[54,0],"18":[50,4],"19":[4,46],"20":[1,3],"21":[4,1],"22":[10,10],"23":[20,10],"24":[20,0],"25":[20,0],"26":[54,0],"27":[54,1],"28":[54,6],"29":[54,1],"30":[54,0],"31":[0,54],"32":[54,2],"33":[54,54],"34":[53,1],"35":[48,6],"36":[49,5],"37":[54,53],"38":[54,0],"39":[54,54],"40":[54,53],"41":[53,1],"42":[53,52],"43":[53,53],"44":[53,53],"45":[3,51],"46":[3,3],"47":[3,3],"48":[3,3],"49":[3,3],"50":[3,3],"51":[54,0],"52":[0,54],"53":[54,0],"54":[0,54],"55":[54,0],"56":[50,4],"57":[54,0],"58":[52,2],"59":[54,52,52],"60":[54,0],"61":[1,53],"62":[1,53],"63":[1,1,1,1,1],"64":[53,52,51,51,1],"65":[54,54],"66":[54,0],"67":[54,4],"68":[1,7],"69":[0,1],"70":[8,1],"71":[8,0],"72":[7,1],"73":[8,0],"74":[6,2],"75":[8,7],"76":[11,0],"77":[0,11],"78":[11,10],"79":[1,10],"80":[11,10],"81":[0,11],"82":[1,1,0],"83":[2,0],"84":[2,0],"85":[1,1,0],"86":[2,0],"87":[1,1],"88":[2,0],"89":[5,0],"90":[3,2],"91":[5,4],"92":[2,2],"93":[1,1,0],"94":[6,0],"95":[6,0],"96":[2,3,3,0],"97":[2,4],"98":[3,3],"99":[4,4],"100":[3,3],"101":[5,1],"102":[6,6],"103":[2,7],"104":[9,7],"105":[5,4],"106":[9,6],"107":[9,5],"108":[6,0],"109":[6,0],"110":[1,2,1,1,1,2,2,0],"111":[6,0],"112":[6,0],"113":[7,0],"114":[1,1,1,4,0],"115":[5,2],"116":[7,2],"117":[4,1],"118":[5,1],"119":[2,2],"120":[4,2],"121":[6,1],"122":[7,7],"123":[1,0],"124":[1,0],"125":[1,0,0,0,0,0,0,0],"126":[1,0],"127":[1,1],"128":[57,0],"129":[0,57],"130":[57,1],"131":[57,1],"132":[9,4,1,42,1],"133":[8,1],"134":[0,42],"135":[42,0],"136":[41,1],"137":[31,10],"138":[41,0],"139":[41,40,37],"140":[41,28],"141":[6,2,6,7,2,5,1,2,10],"142":[40,1],"143":[41,41],"144":[0,1],"145":[1,1],"146":[0,2],"147":[0,0],"148":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"7dfd7254e5eb156d11d16a394078cf6a954e8077"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga360\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga360\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":23},"end":{"line":52,"column":1}},"2":{"start":{"line":54,"column":14},"end":{"line":171,"column":1}},"3":{"start":{"line":173,"column":20},"end":{"line":173,"column":62}},"4":{"start":{"line":175,"column":22},"end":{"line":175,"column":65}},"5":{"start":{"line":177,"column":23},"end":{"line":177,"column":25}},"6":{"start":{"line":178,"column":15},"end":{"line":178,"column":33}},"7":{"start":{"line":179,"column":0},"end":{"line":181,"column":3}},"8":{"start":{"line":180,"column":2},"end":{"line":180,"column":51}},"9":{"start":{"line":183,"column":0},"end":{"line":189,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":179,"column":15},"end":{"line":179,"column":16}},"loc":{"start":{"line":179,"column":24},"end":{"line":181,"column":1}},"line":179}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":29,"9":1},"f":{"0":29},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"399f1810d47ea9350bed5a894f27a1c9227519c8"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga360\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga360\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":26}},"2":{"start":{"line":3,"column":22},"end":{"line":3,"column":51}},"3":{"start":{"line":10,"column":4},"end":{"line":10,"column":23}},"4":{"start":{"line":22,"column":4},"end":{"line":22,"column":25}},"5":{"start":{"line":24,"column":22},"end":{"line":24,"column":40}},"6":{"start":{"line":27,"column":17},"end":{"line":27,"column":19}},"7":{"start":{"line":28,"column":14},"end":{"line":28,"column":16}},"8":{"start":{"line":29,"column":22},"end":{"line":29,"column":34}},"9":{"start":{"line":30,"column":17},"end":{"line":30,"column":60}},"10":{"start":{"line":31,"column":2},"end":{"line":35,"column":3}},"11":{"start":{"line":32,"column":4},"end":{"line":34,"column":7}},"12":{"start":{"line":33,"column":6},"end":{"line":33,"column":37}},"13":{"start":{"line":36,"column":15},"end":{"line":36,"column":31}},"14":{"start":{"line":37,"column":2},"end":{"line":45,"column":5}},"15":{"start":{"line":38,"column":4},"end":{"line":38,"column":52}},"16":{"start":{"line":39,"column":4},"end":{"line":39,"column":49}},"17":{"start":{"line":40,"column":4},"end":{"line":40,"column":55}},"18":{"start":{"line":41,"column":4},"end":{"line":44,"column":27}},"19":{"start":{"line":46,"column":2},"end":{"line":46,"column":16}},"20":{"start":{"line":50,"column":23},"end":{"line":50,"column":25}},"21":{"start":{"line":53,"column":2},"end":{"line":59,"column":3}},"22":{"start":{"line":54,"column":23},"end":{"line":54,"column":35}},"23":{"start":{"line":55,"column":4},"end":{"line":58,"column":7}},"24":{"start":{"line":56,"column":6},"end":{"line":57,"column":49}},"25":{"start":{"line":61,"column":2},"end":{"line":61,"column":52}},"26":{"start":{"line":65,"column":2},"end":{"line":92,"column":3}},"27":{"start":{"line":66,"column":25},"end":{"line":66,"column":27}},"28":{"start":{"line":67,"column":27},"end":{"line":67,"column":33}},"29":{"start":{"line":68,"column":24},"end":{"line":68,"column":30}},"30":{"start":{"line":74,"column":4},"end":{"line":80,"column":5}},"31":{"start":{"line":75,"column":6},"end":{"line":79,"column":9}},"32":{"start":{"line":76,"column":8},"end":{"line":76,"column":34}},"33":{"start":{"line":77,"column":8},"end":{"line":77,"column":64}},"34":{"start":{"line":78,"column":8},"end":{"line":78,"column":46}},"35":{"start":{"line":83,"column":4},"end":{"line":89,"column":5}},"36":{"start":{"line":84,"column":6},"end":{"line":88,"column":9}},"37":{"start":{"line":85,"column":8},"end":{"line":85,"column":31}},"38":{"start":{"line":86,"column":8},"end":{"line":86,"column":55}},"39":{"start":{"line":87,"column":8},"end":{"line":87,"column":43}},"40":{"start":{"line":91,"column":4},"end":{"line":91,"column":54}},"41":{"start":{"line":94,"column":2},"end":{"line":94,"column":12}},"42":{"start":{"line":98,"column":21},"end":{"line":98,"column":23}},"43":{"start":{"line":99,"column":18},"end":{"line":99,"column":20}},"44":{"start":{"line":100,"column":2},"end":{"line":109,"column":3}},"45":{"start":{"line":101,"column":4},"end":{"line":108,"column":7}},"46":{"start":{"line":102,"column":6},"end":{"line":104,"column":7}},"47":{"start":{"line":103,"column":8},"end":{"line":103,"column":33}},"48":{"start":{"line":105,"column":6},"end":{"line":107,"column":7}},"49":{"start":{"line":106,"column":8},"end":{"line":106,"column":30}},"50":{"start":{"line":110,"column":2},"end":{"line":110,"column":31}},"51":{"start":{"line":118,"column":26},"end":{"line":118,"column":44}},"52":{"start":{"line":119,"column":2},"end":{"line":119,"column":41}},"53":{"start":{"line":120,"column":2},"end":{"line":136,"column":3}},"54":{"start":{"line":121,"column":4},"end":{"line":121,"column":65}},"55":{"start":{"line":123,"column":4},"end":{"line":135,"column":5}},"56":{"start":{"line":124,"column":6},"end":{"line":134,"column":7}},"57":{"start":{"line":125,"column":8},"end":{"line":125,"column":35}},"58":{"start":{"line":126,"column":8},"end":{"line":126,"column":32}},"59":{"start":{"line":127,"column":8},"end":{"line":127,"column":36}},"60":{"start":{"line":128,"column":23},"end":{"line":128,"column":72}},"61":{"start":{"line":129,"column":8},"end":{"line":131,"column":9}},"62":{"start":{"line":130,"column":10},"end":{"line":130,"column":33}},"63":{"start":{"line":133,"column":8},"end":{"line":133,"column":66}},"64":{"start":{"line":137,"column":21},"end":{"line":143,"column":3}},"65":{"start":{"line":144,"column":2},"end":{"line":144,"column":50}},"66":{"start":{"line":153,"column":17},"end":{"line":153,"column":27}},"67":{"start":{"line":154,"column":2},"end":{"line":181,"column":3}},"68":{"start":{"line":154,"column":15},"end":{"line":154,"column":16}},"69":{"start":{"line":155,"column":20},"end":{"line":155,"column":31}},"70":{"start":{"line":156,"column":22},"end":{"line":156,"column":27}},"71":{"start":{"line":158,"column":4},"end":{"line":162,"column":5}},"72":{"start":{"line":159,"column":6},"end":{"line":159,"column":47}},"73":{"start":{"line":161,"column":6},"end":{"line":161,"column":54}},"74":{"start":{"line":165,"column":4},"end":{"line":171,"column":5}},"75":{"start":{"line":166,"column":30},"end":{"line":166,"column":68}},"76":{"start":{"line":167,"column":6},"end":{"line":170,"column":8}},"77":{"start":{"line":173,"column":4},"end":{"line":173,"column":46}},"78":{"start":{"line":174,"column":4},"end":{"line":174,"column":50}},"79":{"start":{"line":175,"column":4},"end":{"line":175,"column":47}},"80":{"start":{"line":176,"column":4},"end":{"line":176,"column":49}},"81":{"start":{"line":177,"column":4},"end":{"line":177,"column":48}},"82":{"start":{"line":178,"column":4},"end":{"line":178,"column":50}},"83":{"start":{"line":179,"column":4},"end":{"line":179,"column":47}},"84":{"start":{"line":180,"column":4},"end":{"line":180,"column":55}},"85":{"start":{"line":182,"column":2},"end":{"line":182,"column":16}},"86":{"start":{"line":203,"column":6},"end":{"line":203,"column":24}},"87":{"start":{"line":204,"column":25},"end":{"line":204,"column":43}},"88":{"start":{"line":205,"column":2},"end":{"line":205,"column":37}},"89":{"start":{"line":206,"column":2},"end":{"line":206,"column":37}},"90":{"start":{"line":207,"column":2},"end":{"line":207,"column":61}},"91":{"start":{"line":208,"column":2},"end":{"line":208,"column":44}},"92":{"start":{"line":211,"column":2},"end":{"line":213,"column":3}},"93":{"start":{"line":212,"column":4},"end":{"line":212,"column":77}},"94":{"start":{"line":215,"column":21},"end":{"line":220,"column":3}},"95":{"start":{"line":222,"column":2},"end":{"line":224,"column":3}},"96":{"start":{"line":223,"column":4},"end":{"line":223,"column":23}},"97":{"start":{"line":225,"column":2},"end":{"line":227,"column":3}},"98":{"start":{"line":226,"column":4},"end":{"line":226,"column":23}},"99":{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},"100":{"start":{"line":229,"column":4},"end":{"line":229,"column":50}},"101":{"start":{"line":232,"column":2},"end":{"line":249,"column":3}},"102":{"start":{"line":233,"column":49},"end":{"line":233,"column":64}},"103":{"start":{"line":234,"column":4},"end":{"line":234,"column":30}},"104":{"start":{"line":235,"column":4},"end":{"line":235,"column":27}},"105":{"start":{"line":236,"column":4},"end":{"line":240,"column":5}},"106":{"start":{"line":237,"column":6},"end":{"line":237,"column":31}},"107":{"start":{"line":238,"column":6},"end":{"line":238,"column":34}},"108":{"start":{"line":239,"column":6},"end":{"line":239,"column":38}},"109":{"start":{"line":241,"column":4},"end":{"line":248,"column":5}},"110":{"start":{"line":242,"column":54},"end":{"line":242,"column":62}},"111":{"start":{"line":243,"column":6},"end":{"line":243,"column":27}},"112":{"start":{"line":244,"column":6},"end":{"line":244,"column":29}},"113":{"start":{"line":245,"column":6},"end":{"line":245,"column":29}},"114":{"start":{"line":246,"column":6},"end":{"line":246,"column":30}},"115":{"start":{"line":247,"column":6},"end":{"line":247,"column":27}},"116":{"start":{"line":251,"column":21},"end":{"line":251,"column":45}},"117":{"start":{"line":252,"column":2},"end":{"line":254,"column":5}},"118":{"start":{"line":253,"column":4},"end":{"line":253,"column":65}},"119":{"start":{"line":256,"column":2},"end":{"line":258,"column":3}},"120":{"start":{"line":257,"column":4},"end":{"line":257,"column":56}},"121":{"start":{"line":261,"column":18},"end":{"line":261,"column":58}},"122":{"start":{"line":263,"column":17},"end":{"line":263,"column":57}},"123":{"start":{"line":266,"column":24},"end":{"line":266,"column":78}},"124":{"start":{"line":268,"column":2},"end":{"line":268,"column":66}},"125":{"start":{"line":271,"column":21},"end":{"line":271,"column":69}},"126":{"start":{"line":272,"column":2},"end":{"line":272,"column":60}},"127":{"start":{"line":275,"column":30},"end":{"line":279,"column":3}},"128":{"start":{"line":280,"column":2},"end":{"line":280,"column":78}},"129":{"start":{"line":282,"column":23},"end":{"line":286,"column":3}},"130":{"start":{"line":288,"column":23},"end":{"line":293,"column":3}},"131":{"start":{"line":294,"column":23},"end":{"line":294,"column":41}},"132":{"start":{"line":295,"column":2},"end":{"line":295,"column":35}},"133":{"start":{"line":297,"column":2},"end":{"line":299,"column":3}},"134":{"start":{"line":298,"column":4},"end":{"line":298,"column":38}},"135":{"start":{"line":300,"column":31},"end":{"line":304,"column":15}},"136":{"start":{"line":306,"column":2},"end":{"line":318,"column":3}},"137":{"start":{"line":307,"column":4},"end":{"line":311,"column":21}},"138":{"start":{"line":313,"column":4},"end":{"line":317,"column":26}},"139":{"start":{"line":320,"column":2},"end":{"line":320,"column":42}},"140":{"start":{"line":322,"column":19},"end":{"line":322,"column":41}},"141":{"start":{"line":323,"column":2},"end":{"line":323,"column":59}},"142":{"start":{"line":324,"column":2},"end":{"line":324,"column":34}},"143":{"start":{"line":325,"column":2},"end":{"line":325,"column":58}},"144":{"start":{"line":326,"column":2},"end":{"line":326,"column":33}},"145":{"start":{"line":328,"column":2},"end":{"line":328,"column":18}},"146":{"start":{"line":335,"column":6},"end":{"line":335,"column":24}},"147":{"start":{"line":336,"column":2},"end":{"line":336,"column":70}},"148":{"start":{"line":337,"column":2},"end":{"line":337,"column":74}},"149":{"start":{"line":339,"column":2},"end":{"line":343,"column":3}},"150":{"start":{"line":340,"column":4},"end":{"line":340,"column":39}},"151":{"start":{"line":342,"column":4},"end":{"line":342,"column":25}},"152":{"start":{"line":345,"column":25},"end":{"line":345,"column":74}},"153":{"start":{"line":346,"column":2},"end":{"line":353,"column":3}},"154":{"start":{"line":350,"column":4},"end":{"line":350,"column":57}},"155":{"start":{"line":352,"column":4},"end":{"line":352,"column":15}},"156":{"start":{"line":355,"column":2},"end":{"line":359,"column":4}},"157":{"start":{"line":364,"column":27},"end":{"line":364,"column":45}},"158":{"start":{"line":365,"column":2},"end":{"line":365,"column":43}},"159":{"start":{"line":367,"column":4},"end":{"line":370,"column":24}},"160":{"start":{"line":371,"column":21},"end":{"line":379,"column":3}},"161":{"start":{"line":381,"column":2},"end":{"line":381,"column":20}},"162":{"start":{"line":386,"column":22},"end":{"line":386,"column":35}},"163":{"start":{"line":390,"column":21},"end":{"line":392,"column":3}},"164":{"start":{"line":394,"column":2},"end":{"line":403,"column":3}},"165":{"start":{"line":396,"column":6},"end":{"line":396,"column":33}},"166":{"start":{"line":397,"column":6},"end":{"line":397,"column":12}},"167":{"start":{"line":399,"column":6},"end":{"line":399,"column":40}},"168":{"start":{"line":400,"column":6},"end":{"line":400,"column":12}},"169":{"start":{"line":402,"column":6},"end":{"line":402,"column":12}},"170":{"start":{"line":404,"column":30},"end":{"line":404,"column":48}},"171":{"start":{"line":405,"column":2},"end":{"line":405,"column":49}},"172":{"start":{"line":406,"column":2},"end":{"line":417,"column":3}},"173":{"start":{"line":407,"column":4},"end":{"line":416,"column":5}},"174":{"start":{"line":409,"column":8},"end":{"line":409,"column":31}},"175":{"start":{"line":410,"column":8},"end":{"line":410,"column":14}},"176":{"start":{"line":412,"column":8},"end":{"line":412,"column":38}},"177":{"start":{"line":413,"column":8},"end":{"line":413,"column":14}},"178":{"start":{"line":415,"column":8},"end":{"line":415,"column":14}},"179":{"start":{"line":419,"column":2},"end":{"line":419,"column":20}},"180":{"start":{"line":424,"column":30},"end":{"line":424,"column":48}},"181":{"start":{"line":425,"column":2},"end":{"line":425,"column":49}},"182":{"start":{"line":427,"column":2},"end":{"line":434,"column":3}},"183":{"start":{"line":429,"column":6},"end":{"line":429,"column":29}},"184":{"start":{"line":430,"column":6},"end":{"line":430,"column":12}},"185":{"start":{"line":432,"column":6},"end":{"line":432,"column":22}},"186":{"start":{"line":433,"column":6},"end":{"line":433,"column":12}},"187":{"start":{"line":435,"column":2},"end":{"line":439,"column":3}},"188":{"start":{"line":436,"column":4},"end":{"line":438,"column":6}},"189":{"start":{"line":440,"column":2},"end":{"line":442,"column":4}},"190":{"start":{"line":447,"column":21},"end":{"line":449,"column":3}},"191":{"start":{"line":450,"column":30},"end":{"line":450,"column":48}},"192":{"start":{"line":451,"column":2},"end":{"line":451,"column":49}},"193":{"start":{"line":453,"column":23},"end":{"line":453,"column":41}},"194":{"start":{"line":454,"column":2},"end":{"line":465,"column":3}},"195":{"start":{"line":455,"column":26},"end":{"line":460,"column":5}},"196":{"start":{"line":461,"column":4},"end":{"line":461,"column":45}},"197":{"start":{"line":464,"column":4},"end":{"line":464,"column":48}},"198":{"start":{"line":467,"column":2},"end":{"line":467,"column":20}},"199":{"start":{"line":473,"column":21},"end":{"line":473,"column":23}},"200":{"start":{"line":476,"column":26},"end":{"line":476,"column":39}},"201":{"start":{"line":477,"column":2},"end":{"line":477,"column":55}},"202":{"start":{"line":478,"column":2},"end":{"line":493,"column":3}},"203":{"start":{"line":480,"column":6},"end":{"line":480,"column":45}},"204":{"start":{"line":481,"column":6},"end":{"line":481,"column":12}},"205":{"start":{"line":483,"column":27},"end":{"line":483,"column":45}},"206":{"start":{"line":484,"column":30},"end":{"line":484,"column":32}},"207":{"start":{"line":485,"column":6},"end":{"line":487,"column":9}},"208":{"start":{"line":486,"column":8},"end":{"line":486,"column":54}},"209":{"start":{"line":488,"column":6},"end":{"line":488,"column":40}},"210":{"start":{"line":489,"column":6},"end":{"line":489,"column":12}},"211":{"start":{"line":492,"column":6},"end":{"line":492,"column":30}},"212":{"start":{"line":494,"column":2},"end":{"line":494,"column":20}},"213":{"start":{"line":499,"column":22},"end":{"line":499,"column":35}},"214":{"start":{"line":500,"column":30},"end":{"line":500,"column":48}},"215":{"start":{"line":501,"column":2},"end":{"line":501,"column":49}},"216":{"start":{"line":502,"column":21},"end":{"line":502,"column":23}},"217":{"start":{"line":506,"column":2},"end":{"line":567,"column":3}},"218":{"start":{"line":507,"column":4},"end":{"line":517,"column":5}},"219":{"start":{"line":510,"column":8},"end":{"line":510,"column":33}},"220":{"start":{"line":511,"column":8},"end":{"line":511,"column":14}},"221":{"start":{"line":513,"column":8},"end":{"line":513,"column":32}},"222":{"start":{"line":514,"column":8},"end":{"line":514,"column":14}},"223":{"start":{"line":516,"column":8},"end":{"line":516,"column":68}},"224":{"start":{"line":518,"column":25},"end":{"line":518,"column":43}},"225":{"start":{"line":519,"column":29},"end":{"line":519,"column":47}},"226":{"start":{"line":520,"column":4},"end":{"line":520,"column":28}},"227":{"start":{"line":521,"column":4},"end":{"line":521,"column":24}},"228":{"start":{"line":522,"column":4},"end":{"line":526,"column":14}},"229":{"start":{"line":524,"column":8},"end":{"line":524,"column":42}},"230":{"start":{"line":527,"column":4},"end":{"line":531,"column":14}},"231":{"start":{"line":529,"column":8},"end":{"line":529,"column":42}},"232":{"start":{"line":532,"column":4},"end":{"line":566,"column":5}},"233":{"start":{"line":533,"column":30},"end":{"line":533,"column":68}},"234":{"start":{"line":534,"column":6},"end":{"line":559,"column":7}},"235":{"start":{"line":534,"column":19},"end":{"line":534,"column":20}},"236":{"start":{"line":535,"column":22},"end":{"line":535,"column":33}},"237":{"start":{"line":536,"column":26},"end":{"line":536,"column":31}},"238":{"start":{"line":538,"column":8},"end":{"line":542,"column":9}},"239":{"start":{"line":539,"column":10},"end":{"line":539,"column":56}},"240":{"start":{"line":541,"column":10},"end":{"line":541,"column":63}},"241":{"start":{"line":545,"column":8},"end":{"line":548,"column":10}},"242":{"start":{"line":550,"column":8},"end":{"line":550,"column":55}},"243":{"start":{"line":551,"column":8},"end":{"line":551,"column":59}},"244":{"start":{"line":552,"column":8},"end":{"line":552,"column":56}},"245":{"start":{"line":553,"column":8},"end":{"line":554,"column":64}},"246":{"start":{"line":555,"column":8},"end":{"line":555,"column":57}},"247":{"start":{"line":556,"column":8},"end":{"line":556,"column":59}},"248":{"start":{"line":557,"column":8},"end":{"line":557,"column":56}},"249":{"start":{"line":558,"column":8},"end":{"line":558,"column":64}},"250":{"start":{"line":562,"column":6},"end":{"line":565,"column":8}},"251":{"start":{"line":568,"column":2},"end":{"line":568,"column":20}},"252":{"start":{"line":573,"column":22},"end":{"line":573,"column":35}},"253":{"start":{"line":574,"column":30},"end":{"line":574,"column":48}},"254":{"start":{"line":575,"column":2},"end":{"line":575,"column":49}},"255":{"start":{"line":580,"column":21},"end":{"line":580,"column":23}},"256":{"start":{"line":584,"column":2},"end":{"line":613,"column":3}},"257":{"start":{"line":585,"column":4},"end":{"line":603,"column":5}},"258":{"start":{"line":587,"column":8},"end":{"line":587,"column":32}},"259":{"start":{"line":588,"column":8},"end":{"line":588,"column":14}},"260":{"start":{"line":590,"column":8},"end":{"line":590,"column":33}},"261":{"start":{"line":591,"column":8},"end":{"line":591,"column":14}},"262":{"start":{"line":595,"column":8},"end":{"line":595,"column":30}},"263":{"start":{"line":596,"column":8},"end":{"line":596,"column":14}},"264":{"start":{"line":599,"column":8},"end":{"line":599,"column":33}},"265":{"start":{"line":600,"column":8},"end":{"line":600,"column":14}},"266":{"start":{"line":602,"column":8},"end":{"line":602,"column":64}},"267":{"start":{"line":608,"column":28},"end":{"line":608,"column":66}},"268":{"start":{"line":609,"column":4},"end":{"line":612,"column":6}},"269":{"start":{"line":614,"column":18},"end":{"line":614,"column":36}},"270":{"start":{"line":615,"column":20},"end":{"line":615,"column":49}},"271":{"start":{"line":617,"column":2},"end":{"line":621,"column":3}},"272":{"start":{"line":618,"column":4},"end":{"line":618,"column":27}},"273":{"start":{"line":620,"column":4},"end":{"line":620,"column":33}},"274":{"start":{"line":623,"column":2},"end":{"line":623,"column":20}},"275":{"start":{"line":628,"column":22},"end":{"line":628,"column":35}},"276":{"start":{"line":629,"column":21},"end":{"line":629,"column":23}},"277":{"start":{"line":630,"column":30},"end":{"line":630,"column":48}},"278":{"start":{"line":631,"column":2},"end":{"line":631,"column":49}},"279":{"start":{"line":634,"column":2},"end":{"line":649,"column":3}},"280":{"start":{"line":636,"column":6},"end":{"line":636,"column":33}},"281":{"start":{"line":637,"column":6},"end":{"line":637,"column":12}},"282":{"start":{"line":639,"column":6},"end":{"line":639,"column":33}},"283":{"start":{"line":640,"column":6},"end":{"line":640,"column":12}},"284":{"start":{"line":642,"column":6},"end":{"line":642,"column":33}},"285":{"start":{"line":643,"column":6},"end":{"line":643,"column":12}},"286":{"start":{"line":645,"column":6},"end":{"line":645,"column":31}},"287":{"start":{"line":646,"column":6},"end":{"line":646,"column":12}},"288":{"start":{"line":648,"column":6},"end":{"line":648,"column":66}},"289":{"start":{"line":652,"column":36},"end":{"line":652,"column":54}},"290":{"start":{"line":654,"column":2},"end":{"line":667,"column":3}},"291":{"start":{"line":656,"column":4},"end":{"line":664,"column":5}},"292":{"start":{"line":658,"column":6},"end":{"line":661,"column":7}},"293":{"start":{"line":660,"column":8},"end":{"line":660,"column":30}},"294":{"start":{"line":663,"column":6},"end":{"line":663,"column":28}},"295":{"start":{"line":666,"column":4},"end":{"line":666,"column":28}},"296":{"start":{"line":669,"column":23},"end":{"line":669,"column":41}},"297":{"start":{"line":671,"column":2},"end":{"line":685,"column":3}},"298":{"start":{"line":672,"column":26},"end":{"line":677,"column":5}},"299":{"start":{"line":678,"column":4},"end":{"line":678,"column":45}},"300":{"start":{"line":681,"column":4},"end":{"line":684,"column":6}},"301":{"start":{"line":688,"column":2},"end":{"line":688,"column":20}},"302":{"start":{"line":693,"column":22},"end":{"line":693,"column":35}},"303":{"start":{"line":694,"column":21},"end":{"line":694,"column":23}},"304":{"start":{"line":695,"column":30},"end":{"line":695,"column":48}},"305":{"start":{"line":696,"column":2},"end":{"line":696,"column":49}},"306":{"start":{"line":697,"column":2},"end":{"line":724,"column":3}},"307":{"start":{"line":699,"column":4},"end":{"line":723,"column":5}},"308":{"start":{"line":701,"column":8},"end":{"line":701,"column":33}},"309":{"start":{"line":702,"column":8},"end":{"line":702,"column":14}},"310":{"start":{"line":704,"column":8},"end":{"line":704,"column":30}},"311":{"start":{"line":705,"column":8},"end":{"line":705,"column":14}},"312":{"start":{"line":707,"column":8},"end":{"line":707,"column":30}},"313":{"start":{"line":708,"column":8},"end":{"line":708,"column":14}},"314":{"start":{"line":710,"column":8},"end":{"line":710,"column":33}},"315":{"start":{"line":711,"column":8},"end":{"line":711,"column":14}},"316":{"start":{"line":713,"column":8},"end":{"line":713,"column":33}},"317":{"start":{"line":714,"column":8},"end":{"line":714,"column":14}},"318":{"start":{"line":716,"column":8},"end":{"line":716,"column":33}},"319":{"start":{"line":717,"column":8},"end":{"line":717,"column":14}},"320":{"start":{"line":719,"column":8},"end":{"line":719,"column":32}},"321":{"start":{"line":720,"column":8},"end":{"line":720,"column":14}},"322":{"start":{"line":722,"column":8},"end":{"line":722,"column":68}},"323":{"start":{"line":725,"column":23},"end":{"line":725,"column":41}},"324":{"start":{"line":727,"column":2},"end":{"line":735,"column":3}},"325":{"start":{"line":728,"column":26},"end":{"line":733,"column":5}},"326":{"start":{"line":734,"column":4},"end":{"line":734,"column":45}},"327":{"start":{"line":736,"column":2},"end":{"line":736,"column":20}},"328":{"start":{"line":743,"column":22},"end":{"line":743,"column":75}},"329":{"start":{"line":744,"column":2},"end":{"line":746,"column":3}},"330":{"start":{"line":745,"column":4},"end":{"line":745,"column":62}},"331":{"start":{"line":747,"column":21},"end":{"line":747,"column":23}},"332":{"start":{"line":749,"column":56},"end":{"line":749,"column":74}},"333":{"start":{"line":750,"column":2},"end":{"line":750,"column":63}},"334":{"start":{"line":751,"column":2},"end":{"line":751,"column":49}},"335":{"start":{"line":752,"column":2},"end":{"line":856,"column":3}},"336":{"start":{"line":754,"column":6},"end":{"line":759,"column":7}},"337":{"start":{"line":755,"column":8},"end":{"line":755,"column":61}},"338":{"start":{"line":756,"column":8},"end":{"line":756,"column":43}},"339":{"start":{"line":758,"column":8},"end":{"line":758,"column":69}},"340":{"start":{"line":760,"column":6},"end":{"line":760,"column":12}},"341":{"start":{"line":762,"column":6},"end":{"line":762,"column":60}},"342":{"start":{"line":763,"column":6},"end":{"line":763,"column":37}},"343":{"start":{"line":764,"column":6},"end":{"line":764,"column":12}},"344":{"start":{"line":766,"column":6},"end":{"line":766,"column":24}},"345":{"start":{"line":767,"column":6},"end":{"line":767,"column":39}},"346":{"start":{"line":768,"column":6},"end":{"line":768,"column":12}},"347":{"start":{"line":770,"column":22},"end":{"line":770,"column":35}},"348":{"start":{"line":771,"column":6},"end":{"line":773,"column":7}},"349":{"start":{"line":772,"column":8},"end":{"line":772,"column":80}},"350":{"start":{"line":774,"column":6},"end":{"line":848,"column":7}},"351":{"start":{"line":775,"column":8},"end":{"line":775,"column":44}},"352":{"start":{"line":776,"column":8},"end":{"line":778,"column":36}},"353":{"start":{"line":779,"column":8},"end":{"line":779,"column":35}},"354":{"start":{"line":780,"column":8},"end":{"line":780,"column":28}},"355":{"start":{"line":781,"column":8},"end":{"line":781,"column":40}},"356":{"start":{"line":784,"column":8},"end":{"line":789,"column":9}},"357":{"start":{"line":785,"column":44},"end":{"line":785,"column":62}},"358":{"start":{"line":786,"column":10},"end":{"line":786,"column":49}},"359":{"start":{"line":788,"column":10},"end":{"line":788,"column":52}},"360":{"start":{"line":790,"column":8},"end":{"line":790,"column":61}},"361":{"start":{"line":791,"column":8},"end":{"line":791,"column":50}},"362":{"start":{"line":792,"column":8},"end":{"line":844,"column":9}},"363":{"start":{"line":794,"column":12},"end":{"line":797,"column":14}},"364":{"start":{"line":798,"column":12},"end":{"line":798,"column":18}},"365":{"start":{"line":800,"column":12},"end":{"line":803,"column":14}},"366":{"start":{"line":804,"column":12},"end":{"line":804,"column":18}},"367":{"start":{"line":806,"column":12},"end":{"line":809,"column":14}},"368":{"start":{"line":810,"column":12},"end":{"line":810,"column":18}},"369":{"start":{"line":812,"column":12},"end":{"line":815,"column":14}},"370":{"start":{"line":816,"column":12},"end":{"line":816,"column":18}},"371":{"start":{"line":818,"column":12},"end":{"line":821,"column":14}},"372":{"start":{"line":822,"column":12},"end":{"line":822,"column":18}},"373":{"start":{"line":824,"column":12},"end":{"line":827,"column":14}},"374":{"start":{"line":828,"column":12},"end":{"line":828,"column":18}},"375":{"start":{"line":830,"column":12},"end":{"line":833,"column":14}},"376":{"start":{"line":834,"column":12},"end":{"line":834,"column":18}},"377":{"start":{"line":836,"column":12},"end":{"line":836,"column":70}},"378":{"start":{"line":837,"column":12},"end":{"line":837,"column":18}},"379":{"start":{"line":839,"column":12},"end":{"line":842,"column":14}},"380":{"start":{"line":843,"column":12},"end":{"line":843,"column":18}},"381":{"start":{"line":846,"column":8},"end":{"line":846,"column":43}},"382":{"start":{"line":847,"column":8},"end":{"line":847,"column":72}},"383":{"start":{"line":849,"column":20},"end":{"line":849,"column":77}},"384":{"start":{"line":850,"column":6},"end":{"line":850,"column":41}},"385":{"start":{"line":851,"column":6},"end":{"line":851,"column":12}},"386":{"start":{"line":855,"column":6},"end":{"line":855,"column":63}},"387":{"start":{"line":858,"column":2},"end":{"line":864,"column":4}},"388":{"start":{"line":870,"column":2},"end":{"line":877,"column":3}},"389":{"start":{"line":871,"column":4},"end":{"line":871,"column":70}},"390":{"start":{"line":873,"column":4},"end":{"line":876,"column":6}},"391":{"start":{"line":879,"column":2},"end":{"line":879,"column":18}},"392":{"start":{"line":882,"column":26},"end":{"line":919,"column":1}},"393":{"start":{"line":883,"column":2},"end":{"line":886,"column":3}},"394":{"start":{"line":884,"column":23},"end":{"line":884,"column":75}},"395":{"start":{"line":885,"column":4},"end":{"line":885,"column":24}},"396":{"start":{"line":888,"column":19},"end":{"line":917,"column":3}},"397":{"start":{"line":890,"column":6},"end":{"line":915,"column":7}},"398":{"start":{"line":891,"column":8},"end":{"line":898,"column":9}},"399":{"start":{"line":893,"column":10},"end":{"line":897,"column":12}},"400":{"start":{"line":900,"column":8},"end":{"line":904,"column":10}},"401":{"start":{"line":906,"column":8},"end":{"line":914,"column":10}},"402":{"start":{"line":918,"column":2},"end":{"line":918,"column":18}},"403":{"start":{"line":921,"column":0},"end":{"line":921,"column":48}}},"fnMap":{"0":{"name":"getParamsFromConfig","decl":{"start":{"line":26,"column":9},"end":{"line":26,"column":28}},"loc":{"start":{"line":26,"column":51},"end":{"line":47,"column":1}},"line":26},"1":{"name":"(anonymous_1)","decl":{"start":{"line":32,"column":24},"end":{"line":32,"column":25}},"loc":{"start":{"line":32,"column":35},"end":{"line":34,"column":5}},"line":32},"2":{"name":"(anonymous_2)","decl":{"start":{"line":37,"column":15},"end":{"line":37,"column":16}},"loc":{"start":{"line":37,"column":22},"end":{"line":45,"column":3}},"line":37},"3":{"name":"getProductLevelCustomParams","decl":{"start":{"line":49,"column":9},"end":{"line":49,"column":36}},"loc":{"start":{"line":49,"column":70},"end":{"line":62,"column":1}},"line":49},"4":{"name":"(anonymous_4)","decl":{"start":{"line":55,"column":41},"end":{"line":55,"column":42}},"loc":{"start":{"line":55,"column":59},"end":{"line":58,"column":5}},"line":55},"5":{"name":"getCustomParamKeys","decl":{"start":{"line":64,"column":9},"end":{"line":64,"column":27}},"loc":{"start":{"line":64,"column":36},"end":{"line":95,"column":1}},"line":64},"6":{"name":"(anonymous_6)","decl":{"start":{"line":75,"column":25},"end":{"line":75,"column":26}},"loc":{"start":{"line":75,"column":38},"end":{"line":79,"column":7}},"line":75},"7":{"name":"(anonymous_7)","decl":{"start":{"line":84,"column":22},"end":{"line":84,"column":23}},"loc":{"start":{"line":84,"column":32},"end":{"line":88,"column":7}},"line":84},"8":{"name":"getCustomParamsFromOldConfig","decl":{"start":{"line":97,"column":9},"end":{"line":97,"column":37}},"loc":{"start":{"line":97,"column":46},"end":{"line":111,"column":1}},"line":97},"9":{"name":"(anonymous_9)","decl":{"start":{"line":101,"column":34},"end":{"line":101,"column":35}},"loc":{"start":{"line":101,"column":45},"end":{"line":108,"column":5}},"line":101},"10":{"name":"processPageViews","decl":{"start":{"line":114,"column":9},"end":{"line":114,"column":25}},"loc":{"start":{"line":114,"column":48},"end":{"line":145,"column":1}},"line":114},"11":{"name":"setProductLevelProperties","decl":{"start":{"line":147,"column":9},"end":{"line":147,"column":34}},"loc":{"start":{"line":152,"column":2},"end":{"line":183,"column":1}},"line":152},"12":{"name":"responseBuilderSimple","decl":{"start":{"line":189,"column":9},"end":{"line":189,"column":30}},"loc":{"start":{"line":195,"column":2},"end":{"line":329,"column":1}},"line":195},"13":{"name":"(anonymous_13)","decl":{"start":{"line":252,"column":21},"end":{"line":252,"column":22}},"loc":{"start":{"line":252,"column":34},"end":{"line":254,"column":3}},"line":252},"14":{"name":"processIdentify","decl":{"start":{"line":331,"column":9},"end":{"line":331,"column":24}},"loc":{"start":{"line":331,"column":47},"end":{"line":360,"column":1}},"line":331},"15":{"name":"processNonEComGenericEvent","decl":{"start":{"line":363,"column":9},"end":{"line":363,"column":35}},"loc":{"start":{"line":363,"column":58},"end":{"line":382,"column":1}},"line":363},"16":{"name":"processPromotionEvent","decl":{"start":{"line":385,"column":9},"end":{"line":385,"column":30}},"loc":{"start":{"line":385,"column":53},"end":{"line":420,"column":1}},"line":385},"17":{"name":"processPaymentRelatedEvent","decl":{"start":{"line":423,"column":9},"end":{"line":423,"column":35}},"loc":{"start":{"line":423,"column":58},"end":{"line":443,"column":1}},"line":423},"18":{"name":"processRefundEvent","decl":{"start":{"line":446,"column":9},"end":{"line":446,"column":27}},"loc":{"start":{"line":446,"column":50},"end":{"line":468,"column":1}},"line":446},"19":{"name":"processSharingEvent","decl":{"start":{"line":472,"column":9},"end":{"line":472,"column":28}},"loc":{"start":{"line":472,"column":38},"end":{"line":495,"column":1}},"line":472},"20":{"name":"(anonymous_20)","decl":{"start":{"line":485,"column":23},"end":{"line":485,"column":24}},"loc":{"start":{"line":485,"column":34},"end":{"line":487,"column":7}},"line":485},"21":{"name":"processProductListEvent","decl":{"start":{"line":498,"column":9},"end":{"line":498,"column":32}},"loc":{"start":{"line":498,"column":55},"end":{"line":569,"column":1}},"line":498},"22":{"name":"(anonymous_22)","decl":{"start":{"line":523,"column":11},"end":{"line":523,"column":12}},"loc":{"start":{"line":523,"column":18},"end":{"line":525,"column":7}},"line":523},"23":{"name":"(anonymous_23)","decl":{"start":{"line":528,"column":11},"end":{"line":528,"column":12}},"loc":{"start":{"line":528,"column":18},"end":{"line":530,"column":7}},"line":528},"24":{"name":"processProductEvent","decl":{"start":{"line":572,"column":9},"end":{"line":572,"column":28}},"loc":{"start":{"line":572,"column":51},"end":{"line":624,"column":1}},"line":572},"25":{"name":"processTransactionEvent","decl":{"start":{"line":627,"column":9},"end":{"line":627,"column":32}},"loc":{"start":{"line":627,"column":55},"end":{"line":689,"column":1}},"line":627},"26":{"name":"processEComGenericEvent","decl":{"start":{"line":692,"column":9},"end":{"line":692,"column":32}},"loc":{"start":{"line":692,"column":55},"end":{"line":737,"column":1}},"line":692},"27":{"name":"processSingleMessage","decl":{"start":{"line":741,"column":9},"end":{"line":741,"column":29}},"loc":{"start":{"line":741,"column":52},"end":{"line":865,"column":1}},"line":741},"28":{"name":"process","decl":{"start":{"line":868,"column":9},"end":{"line":868,"column":16}},"loc":{"start":{"line":868,"column":24},"end":{"line":880,"column":1}},"line":868},"29":{"name":"(anonymous_29)","decl":{"start":{"line":882,"column":26},"end":{"line":882,"column":27}},"loc":{"start":{"line":882,"column":42},"end":{"line":919,"column":1}},"line":882},"30":{"name":"(anonymous_30)","decl":{"start":{"line":889,"column":15},"end":{"line":889,"column":16}},"loc":{"start":{"line":889,"column":30},"end":{"line":916,"column":5}},"line":889}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":2},"end":{"line":35,"column":3}},"type":"if","locations":[{"start":{"line":31,"column":2},"end":{"line":35,"column":3}},{"start":{"line":31,"column":2},"end":{"line":35,"column":3}}],"line":31},"1":{"loc":{"start":{"line":42,"column":6},"end":{"line":44,"column":26}},"type":"cond-expr","locations":[{"start":{"line":43,"column":10},"end":{"line":43,"column":38}},{"start":{"line":44,"column":10},"end":{"line":44,"column":26}}],"line":42},"2":{"loc":{"start":{"line":53,"column":2},"end":{"line":59,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":59,"column":3}},{"start":{"line":53,"column":2},"end":{"line":59,"column":3}}],"line":53},"3":{"loc":{"start":{"line":53,"column":6},"end":{"line":53,"column":56}},"type":"binary-expr","locations":[{"start":{"line":53,"column":6},"end":{"line":53,"column":13}},{"start":{"line":53,"column":17},"end":{"line":53,"column":56}}],"line":53},"4":{"loc":{"start":{"line":65,"column":2},"end":{"line":92,"column":3}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":92,"column":3}},{"start":{"line":65,"column":2},"end":{"line":92,"column":3}}],"line":65},"5":{"loc":{"start":{"line":74,"column":4},"end":{"line":80,"column":5}},"type":"if","locations":[{"start":{"line":74,"column":4},"end":{"line":80,"column":5}},{"start":{"line":74,"column":4},"end":{"line":80,"column":5}}],"line":74},"6":{"loc":{"start":{"line":74,"column":8},"end":{"line":74,"column":43}},"type":"binary-expr","locations":[{"start":{"line":74,"column":8},"end":{"line":74,"column":18}},{"start":{"line":74,"column":22},"end":{"line":74,"column":43}}],"line":74},"7":{"loc":{"start":{"line":83,"column":4},"end":{"line":89,"column":5}},"type":"if","locations":[{"start":{"line":83,"column":4},"end":{"line":89,"column":5}},{"start":{"line":83,"column":4},"end":{"line":89,"column":5}}],"line":83},"8":{"loc":{"start":{"line":83,"column":8},"end":{"line":83,"column":37}},"type":"binary-expr","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":15}},{"start":{"line":83,"column":19},"end":{"line":83,"column":37}}],"line":83},"9":{"loc":{"start":{"line":100,"column":2},"end":{"line":109,"column":3}},"type":"if","locations":[{"start":{"line":100,"column":2},"end":{"line":109,"column":3}},{"start":{"line":100,"column":2},"end":{"line":109,"column":3}}],"line":100},"10":{"loc":{"start":{"line":100,"column":6},"end":{"line":100,"column":73}},"type":"binary-expr","locations":[{"start":{"line":100,"column":6},"end":{"line":100,"column":12}},{"start":{"line":100,"column":16},"end":{"line":100,"column":37}},{"start":{"line":100,"column":41},"end":{"line":100,"column":73}}],"line":100},"11":{"loc":{"start":{"line":102,"column":6},"end":{"line":104,"column":7}},"type":"if","locations":[{"start":{"line":102,"column":6},"end":{"line":104,"column":7}},{"start":{"line":102,"column":6},"end":{"line":104,"column":7}}],"line":102},"12":{"loc":{"start":{"line":102,"column":10},"end":{"line":102,"column":51}},"type":"binary-expr","locations":[{"start":{"line":102,"column":10},"end":{"line":102,"column":20}},{"start":{"line":102,"column":24},"end":{"line":102,"column":51}}],"line":102},"13":{"loc":{"start":{"line":105,"column":6},"end":{"line":107,"column":7}},"type":"if","locations":[{"start":{"line":105,"column":6},"end":{"line":107,"column":7}},{"start":{"line":105,"column":6},"end":{"line":107,"column":7}}],"line":105},"14":{"loc":{"start":{"line":105,"column":10},"end":{"line":105,"column":51}},"type":"binary-expr","locations":[{"start":{"line":105,"column":10},"end":{"line":105,"column":20}},{"start":{"line":105,"column":24},"end":{"line":105,"column":51}}],"line":105},"15":{"loc":{"start":{"line":119,"column":18},"end":{"line":119,"column":40}},"type":"binary-expr","locations":[{"start":{"line":119,"column":18},"end":{"line":119,"column":31}},{"start":{"line":119,"column":35},"end":{"line":119,"column":40}}],"line":119},"16":{"loc":{"start":{"line":120,"column":2},"end":{"line":136,"column":3}},"type":"if","locations":[{"start":{"line":120,"column":2},"end":{"line":136,"column":3}},{"start":{"line":120,"column":2},"end":{"line":136,"column":3}}],"line":120},"17":{"loc":{"start":{"line":123,"column":4},"end":{"line":135,"column":5}},"type":"if","locations":[{"start":{"line":123,"column":4},"end":{"line":135,"column":5}},{"start":{"line":123,"column":4},"end":{"line":135,"column":5}}],"line":123},"18":{"loc":{"start":{"line":129,"column":8},"end":{"line":131,"column":9}},"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":131,"column":9}},{"start":{"line":129,"column":8},"end":{"line":131,"column":9}}],"line":129},"19":{"loc":{"start":{"line":129,"column":12},"end":{"line":129,"column":35}},"type":"binary-expr","locations":[{"start":{"line":129,"column":12},"end":{"line":129,"column":18}},{"start":{"line":129,"column":22},"end":{"line":129,"column":35}}],"line":129},"20":{"loc":{"start":{"line":158,"column":4},"end":{"line":162,"column":5}},"type":"if","locations":[{"start":{"line":158,"column":4},"end":{"line":162,"column":5}},{"start":{"line":158,"column":4},"end":{"line":162,"column":5}}],"line":158},"21":{"loc":{"start":{"line":158,"column":8},"end":{"line":158,"column":62}},"type":"binary-expr","locations":[{"start":{"line":158,"column":8},"end":{"line":158,"column":27}},{"start":{"line":158,"column":31},"end":{"line":158,"column":62}}],"line":158},"22":{"loc":{"start":{"line":165,"column":4},"end":{"line":171,"column":5}},"type":"if","locations":[{"start":{"line":165,"column":4},"end":{"line":171,"column":5}},{"start":{"line":165,"column":4},"end":{"line":171,"column":5}}],"line":165},"23":{"loc":{"start":{"line":180,"column":33},"end":{"line":180,"column":54}},"type":"binary-expr","locations":[{"start":{"line":180,"column":33},"end":{"line":180,"column":49}},{"start":{"line":180,"column":53},"end":{"line":180,"column":54}}],"line":180},"24":{"loc":{"start":{"line":205,"column":16},"end":{"line":205,"column":36}},"type":"binary-expr","locations":[{"start":{"line":205,"column":16},"end":{"line":205,"column":27}},{"start":{"line":205,"column":31},"end":{"line":205,"column":36}}],"line":205},"25":{"loc":{"start":{"line":206,"column":16},"end":{"line":206,"column":36}},"type":"binary-expr","locations":[{"start":{"line":206,"column":16},"end":{"line":206,"column":27}},{"start":{"line":206,"column":31},"end":{"line":206,"column":36}}],"line":206},"26":{"loc":{"start":{"line":207,"column":28},"end":{"line":207,"column":60}},"type":"binary-expr","locations":[{"start":{"line":207,"column":28},"end":{"line":207,"column":51}},{"start":{"line":207,"column":55},"end":{"line":207,"column":60}}],"line":207},"27":{"loc":{"start":{"line":208,"column":21},"end":{"line":208,"column":43}},"type":"binary-expr","locations":[{"start":{"line":208,"column":21},"end":{"line":208,"column":37}},{"start":{"line":208,"column":41},"end":{"line":208,"column":43}}],"line":208},"28":{"loc":{"start":{"line":211,"column":2},"end":{"line":213,"column":3}},"type":"if","locations":[{"start":{"line":211,"column":2},"end":{"line":213,"column":3}},{"start":{"line":211,"column":2},"end":{"line":213,"column":3}}],"line":211},"29":{"loc":{"start":{"line":211,"column":6},"end":{"line":211,"column":29}},"type":"binary-expr","locations":[{"start":{"line":211,"column":6},"end":{"line":211,"column":17}},{"start":{"line":211,"column":21},"end":{"line":211,"column":29}}],"line":211},"30":{"loc":{"start":{"line":222,"column":2},"end":{"line":224,"column":3}},"type":"if","locations":[{"start":{"line":222,"column":2},"end":{"line":224,"column":3}},{"start":{"line":222,"column":2},"end":{"line":224,"column":3}}],"line":222},"31":{"loc":{"start":{"line":225,"column":2},"end":{"line":227,"column":3}},"type":"if","locations":[{"start":{"line":225,"column":2},"end":{"line":227,"column":3}},{"start":{"line":225,"column":2},"end":{"line":227,"column":3}}],"line":225},"32":{"loc":{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},{"start":{"line":228,"column":2},"end":{"line":230,"column":3}}],"line":228},"33":{"loc":{"start":{"line":228,"column":6},"end":{"line":228,"column":51}},"type":"binary-expr","locations":[{"start":{"line":228,"column":6},"end":{"line":228,"column":29}},{"start":{"line":228,"column":33},"end":{"line":228,"column":51}}],"line":228},"34":{"loc":{"start":{"line":232,"column":2},"end":{"line":249,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":249,"column":3}},{"start":{"line":232,"column":2},"end":{"line":249,"column":3}}],"line":232},"35":{"loc":{"start":{"line":236,"column":4},"end":{"line":240,"column":5}},"type":"if","locations":[{"start":{"line":236,"column":4},"end":{"line":240,"column":5}},{"start":{"line":236,"column":4},"end":{"line":240,"column":5}}],"line":236},"36":{"loc":{"start":{"line":241,"column":4},"end":{"line":248,"column":5}},"type":"if","locations":[{"start":{"line":241,"column":4},"end":{"line":248,"column":5}},{"start":{"line":241,"column":4},"end":{"line":248,"column":5}}],"line":241},"37":{"loc":{"start":{"line":256,"column":2},"end":{"line":258,"column":3}},"type":"if","locations":[{"start":{"line":256,"column":2},"end":{"line":258,"column":3}},{"start":{"line":256,"column":2},"end":{"line":258,"column":3}}],"line":256},"38":{"loc":{"start":{"line":295,"column":15},"end":{"line":295,"column":34}},"type":"binary-expr","locations":[{"start":{"line":295,"column":15},"end":{"line":295,"column":25}},{"start":{"line":295,"column":29},"end":{"line":295,"column":34}}],"line":295},"39":{"loc":{"start":{"line":297,"column":2},"end":{"line":299,"column":3}},"type":"if","locations":[{"start":{"line":297,"column":2},"end":{"line":299,"column":3}},{"start":{"line":297,"column":2},"end":{"line":299,"column":3}}],"line":297},"40":{"loc":{"start":{"line":297,"column":6},"end":{"line":297,"column":63}},"type":"binary-expr","locations":[{"start":{"line":297,"column":6},"end":{"line":297,"column":20}},{"start":{"line":297,"column":24},"end":{"line":297,"column":49}},{"start":{"line":297,"column":53},"end":{"line":297,"column":63}}],"line":297},"41":{"loc":{"start":{"line":300,"column":31},"end":{"line":304,"column":15}},"type":"cond-expr","locations":[{"start":{"line":301,"column":6},"end":{"line":303,"column":17}},{"start":{"line":304,"column":6},"end":{"line":304,"column":15}}],"line":300},"42":{"loc":{"start":{"line":301,"column":6},"end":{"line":303,"column":17}},"type":"cond-expr","locations":[{"start":{"line":302,"column":8},"end":{"line":302,"column":52}},{"start":{"line":303,"column":8},"end":{"line":303,"column":17}}],"line":301},"43":{"loc":{"start":{"line":306,"column":2},"end":{"line":318,"column":3}},"type":"if","locations":[{"start":{"line":306,"column":2},"end":{"line":318,"column":3}},{"start":{"line":306,"column":2},"end":{"line":318,"column":3}}],"line":306},"44":{"loc":{"start":{"line":308,"column":6},"end":{"line":311,"column":20}},"type":"binary-expr","locations":[{"start":{"line":308,"column":6},"end":{"line":308,"column":26}},{"start":{"line":309,"column":6},"end":{"line":309,"column":55}},{"start":{"line":310,"column":6},"end":{"line":310,"column":25}},{"start":{"line":311,"column":6},"end":{"line":311,"column":20}}],"line":308},"45":{"loc":{"start":{"line":314,"column":6},"end":{"line":317,"column":25}},"type":"binary-expr","locations":[{"start":{"line":314,"column":6},"end":{"line":314,"column":26}},{"start":{"line":315,"column":6},"end":{"line":315,"column":55}},{"start":{"line":316,"column":6},"end":{"line":316,"column":25}},{"start":{"line":317,"column":6},"end":{"line":317,"column":25}}],"line":314},"46":{"loc":{"start":{"line":325,"column":20},"end":{"line":325,"column":57}},"type":"binary-expr","locations":[{"start":{"line":325,"column":20},"end":{"line":325,"column":39}},{"start":{"line":325,"column":43},"end":{"line":325,"column":57}}],"line":325},"47":{"loc":{"start":{"line":336,"column":34},"end":{"line":336,"column":69}},"type":"binary-expr","locations":[{"start":{"line":336,"column":34},"end":{"line":336,"column":63}},{"start":{"line":336,"column":67},"end":{"line":336,"column":69}}],"line":336},"48":{"loc":{"start":{"line":337,"column":36},"end":{"line":337,"column":73}},"type":"binary-expr","locations":[{"start":{"line":337,"column":36},"end":{"line":337,"column":67}},{"start":{"line":337,"column":71},"end":{"line":337,"column":73}}],"line":337},"49":{"loc":{"start":{"line":339,"column":2},"end":{"line":343,"column":3}},"type":"if","locations":[{"start":{"line":339,"column":2},"end":{"line":343,"column":3}},{"start":{"line":339,"column":2},"end":{"line":343,"column":3}}],"line":339},"50":{"loc":{"start":{"line":345,"column":25},"end":{"line":345,"column":74}},"type":"binary-expr","locations":[{"start":{"line":345,"column":25},"end":{"line":345,"column":68}},{"start":{"line":345,"column":72},"end":{"line":345,"column":74}}],"line":345},"51":{"loc":{"start":{"line":346,"column":2},"end":{"line":353,"column":3}},"type":"if","locations":[{"start":{"line":346,"column":2},"end":{"line":353,"column":3}},{"start":{"line":346,"column":2},"end":{"line":353,"column":3}}],"line":346},"52":{"loc":{"start":{"line":347,"column":4},"end":{"line":348,"column":51}},"type":"binary-expr","locations":[{"start":{"line":347,"column":4},"end":{"line":347,"column":33}},{"start":{"line":348,"column":4},"end":{"line":348,"column":51}}],"line":347},"53":{"loc":{"start":{"line":365,"column":19},"end":{"line":365,"column":42}},"type":"binary-expr","locations":[{"start":{"line":365,"column":19},"end":{"line":365,"column":33}},{"start":{"line":365,"column":37},"end":{"line":365,"column":42}}],"line":365},"54":{"loc":{"start":{"line":367,"column":4},"end":{"line":370,"column":24}},"type":"cond-expr","locations":[{"start":{"line":369,"column":8},"end":{"line":369,"column":43}},{"start":{"line":370,"column":8},"end":{"line":370,"column":24}}],"line":367},"55":{"loc":{"start":{"line":367,"column":4},"end":{"line":368,"column":51}},"type":"binary-expr","locations":[{"start":{"line":367,"column":4},"end":{"line":367,"column":36}},{"start":{"line":368,"column":4},"end":{"line":368,"column":51}}],"line":367},"56":{"loc":{"start":{"line":374,"column":6},"end":{"line":377,"column":15}},"type":"cond-expr","locations":[{"start":{"line":376,"column":10},"end":{"line":376,"column":37}},{"start":{"line":377,"column":10},"end":{"line":377,"column":15}}],"line":374},"57":{"loc":{"start":{"line":374,"column":6},"end":{"line":375,"column":47}},"type":"binary-expr","locations":[{"start":{"line":374,"column":6},"end":{"line":374,"column":38}},{"start":{"line":375,"column":6},"end":{"line":375,"column":47}}],"line":374},"58":{"loc":{"start":{"line":378,"column":8},"end":{"line":378,"column":44}},"type":"cond-expr","locations":[{"start":{"line":378,"column":39},"end":{"line":378,"column":40}},{"start":{"line":378,"column":43},"end":{"line":378,"column":44}}],"line":378},"59":{"loc":{"start":{"line":394,"column":2},"end":{"line":403,"column":3}},"type":"switch","locations":[{"start":{"line":395,"column":4},"end":{"line":397,"column":12}},{"start":{"line":398,"column":4},"end":{"line":400,"column":12}},{"start":{"line":401,"column":4},"end":{"line":402,"column":12}}],"line":394},"60":{"loc":{"start":{"line":405,"column":22},"end":{"line":405,"column":48}},"type":"binary-expr","locations":[{"start":{"line":405,"column":22},"end":{"line":405,"column":39}},{"start":{"line":405,"column":43},"end":{"line":405,"column":48}}],"line":405},"61":{"loc":{"start":{"line":406,"column":2},"end":{"line":417,"column":3}},"type":"if","locations":[{"start":{"line":406,"column":2},"end":{"line":417,"column":3}},{"start":{"line":406,"column":2},"end":{"line":417,"column":3}}],"line":406},"62":{"loc":{"start":{"line":407,"column":4},"end":{"line":416,"column":5}},"type":"switch","locations":[{"start":{"line":408,"column":6},"end":{"line":410,"column":14}},{"start":{"line":411,"column":6},"end":{"line":413,"column":14}},{"start":{"line":414,"column":6},"end":{"line":415,"column":14}}],"line":407},"63":{"loc":{"start":{"line":425,"column":22},"end":{"line":425,"column":48}},"type":"binary-expr","locations":[{"start":{"line":425,"column":22},"end":{"line":425,"column":39}},{"start":{"line":425,"column":43},"end":{"line":425,"column":48}}],"line":425},"64":{"loc":{"start":{"line":427,"column":2},"end":{"line":434,"column":3}},"type":"switch","locations":[{"start":{"line":428,"column":4},"end":{"line":430,"column":12}},{"start":{"line":431,"column":4},"end":{"line":433,"column":12}}],"line":427},"65":{"loc":{"start":{"line":435,"column":2},"end":{"line":439,"column":3}},"type":"if","locations":[{"start":{"line":435,"column":2},"end":{"line":439,"column":3}},{"start":{"line":435,"column":2},"end":{"line":439,"column":3}}],"line":435},"66":{"loc":{"start":{"line":451,"column":22},"end":{"line":451,"column":48}},"type":"binary-expr","locations":[{"start":{"line":451,"column":22},"end":{"line":451,"column":39}},{"start":{"line":451,"column":43},"end":{"line":451,"column":48}}],"line":451},"67":{"loc":{"start":{"line":454,"column":2},"end":{"line":465,"column":3}},"type":"if","locations":[{"start":{"line":454,"column":2},"end":{"line":465,"column":3}},{"start":{"line":454,"column":2},"end":{"line":465,"column":3}}],"line":454},"68":{"loc":{"start":{"line":454,"column":6},"end":{"line":454,"column":37}},"type":"binary-expr","locations":[{"start":{"line":454,"column":6},"end":{"line":454,"column":14}},{"start":{"line":454,"column":18},"end":{"line":454,"column":37}}],"line":454},"69":{"loc":{"start":{"line":477,"column":18},"end":{"line":477,"column":54}},"type":"binary-expr","locations":[{"start":{"line":477,"column":18},"end":{"line":477,"column":45}},{"start":{"line":477,"column":49},"end":{"line":477,"column":54}}],"line":477},"70":{"loc":{"start":{"line":478,"column":2},"end":{"line":493,"column":3}},"type":"switch","locations":[{"start":{"line":479,"column":4},"end":{"line":481,"column":12}},{"start":{"line":482,"column":4},"end":{"line":490,"column":5}},{"start":{"line":491,"column":4},"end":{"line":492,"column":30}}],"line":478},"71":{"loc":{"start":{"line":501,"column":22},"end":{"line":501,"column":48}},"type":"binary-expr","locations":[{"start":{"line":501,"column":22},"end":{"line":501,"column":39}},{"start":{"line":501,"column":43},"end":{"line":501,"column":48}}],"line":501},"72":{"loc":{"start":{"line":506,"column":2},"end":{"line":567,"column":3}},"type":"if","locations":[{"start":{"line":506,"column":2},"end":{"line":567,"column":3}},{"start":{"line":506,"column":2},"end":{"line":567,"column":3}}],"line":506},"73":{"loc":{"start":{"line":507,"column":4},"end":{"line":517,"column":5}},"type":"switch","locations":[{"start":{"line":508,"column":6},"end":{"line":508,"column":42}},{"start":{"line":509,"column":6},"end":{"line":511,"column":14}},{"start":{"line":512,"column":6},"end":{"line":514,"column":14}},{"start":{"line":515,"column":6},"end":{"line":516,"column":68}}],"line":507},"74":{"loc":{"start":{"line":520,"column":14},"end":{"line":520,"column":27}},"type":"binary-expr","locations":[{"start":{"line":520,"column":14},"end":{"line":520,"column":21}},{"start":{"line":520,"column":25},"end":{"line":520,"column":27}}],"line":520},"75":{"loc":{"start":{"line":521,"column":12},"end":{"line":521,"column":23}},"type":"binary-expr","locations":[{"start":{"line":521,"column":12},"end":{"line":521,"column":17}},{"start":{"line":521,"column":21},"end":{"line":521,"column":23}}],"line":521},"76":{"loc":{"start":{"line":532,"column":4},"end":{"line":566,"column":5}},"type":"if","locations":[{"start":{"line":532,"column":4},"end":{"line":566,"column":5}},{"start":{"line":532,"column":4},"end":{"line":566,"column":5}}],"line":532},"77":{"loc":{"start":{"line":532,"column":8},"end":{"line":532,"column":39}},"type":"binary-expr","locations":[{"start":{"line":532,"column":8},"end":{"line":532,"column":16}},{"start":{"line":532,"column":20},"end":{"line":532,"column":39}}],"line":532},"78":{"loc":{"start":{"line":538,"column":8},"end":{"line":542,"column":9}},"type":"if","locations":[{"start":{"line":538,"column":8},"end":{"line":542,"column":9}},{"start":{"line":538,"column":8},"end":{"line":542,"column":9}}],"line":538},"79":{"loc":{"start":{"line":538,"column":12},"end":{"line":538,"column":62}},"type":"binary-expr","locations":[{"start":{"line":538,"column":12},"end":{"line":538,"column":29}},{"start":{"line":538,"column":33},"end":{"line":538,"column":62}}],"line":538},"80":{"loc":{"start":{"line":554,"column":10},"end":{"line":554,"column":63}},"type":"cond-expr","locations":[{"start":{"line":554,"column":29},"end":{"line":554,"column":51}},{"start":{"line":554,"column":54},"end":{"line":554,"column":63}}],"line":554},"81":{"loc":{"start":{"line":554,"column":10},"end":{"line":554,"column":26}},"type":"binary-expr","locations":[{"start":{"line":554,"column":10},"end":{"line":554,"column":17}},{"start":{"line":554,"column":21},"end":{"line":554,"column":26}}],"line":554},"82":{"loc":{"start":{"line":558,"column":44},"end":{"line":558,"column":63}},"type":"binary-expr","locations":[{"start":{"line":558,"column":44},"end":{"line":558,"column":58}},{"start":{"line":558,"column":62},"end":{"line":558,"column":63}}],"line":558},"83":{"loc":{"start":{"line":575,"column":22},"end":{"line":575,"column":48}},"type":"binary-expr","locations":[{"start":{"line":575,"column":22},"end":{"line":575,"column":39}},{"start":{"line":575,"column":43},"end":{"line":575,"column":48}}],"line":575},"84":{"loc":{"start":{"line":584,"column":2},"end":{"line":613,"column":3}},"type":"if","locations":[{"start":{"line":584,"column":2},"end":{"line":613,"column":3}},{"start":{"line":584,"column":2},"end":{"line":613,"column":3}}],"line":584},"85":{"loc":{"start":{"line":585,"column":4},"end":{"line":603,"column":5}},"type":"switch","locations":[{"start":{"line":586,"column":6},"end":{"line":588,"column":14}},{"start":{"line":589,"column":6},"end":{"line":591,"column":14}},{"start":{"line":592,"column":6},"end":{"line":592,"column":36}},{"start":{"line":593,"column":6},"end":{"line":593,"column":53}},{"start":{"line":594,"column":6},"end":{"line":596,"column":14}},{"start":{"line":597,"column":6},"end":{"line":597,"column":38}},{"start":{"line":598,"column":6},"end":{"line":600,"column":14}},{"start":{"line":601,"column":6},"end":{"line":602,"column":64}}],"line":585},"86":{"loc":{"start":{"line":617,"column":2},"end":{"line":621,"column":3}},"type":"if","locations":[{"start":{"line":617,"column":2},"end":{"line":621,"column":3}},{"start":{"line":617,"column":2},"end":{"line":621,"column":3}}],"line":617},"87":{"loc":{"start":{"line":617,"column":6},"end":{"line":617,"column":42}},"type":"binary-expr","locations":[{"start":{"line":617,"column":6},"end":{"line":617,"column":16}},{"start":{"line":617,"column":20},"end":{"line":617,"column":42}}],"line":617},"88":{"loc":{"start":{"line":631,"column":22},"end":{"line":631,"column":48}},"type":"binary-expr","locations":[{"start":{"line":631,"column":22},"end":{"line":631,"column":39}},{"start":{"line":631,"column":43},"end":{"line":631,"column":48}}],"line":631},"89":{"loc":{"start":{"line":634,"column":2},"end":{"line":649,"column":3}},"type":"switch","locations":[{"start":{"line":635,"column":4},"end":{"line":637,"column":12}},{"start":{"line":638,"column":4},"end":{"line":640,"column":12}},{"start":{"line":641,"column":4},"end":{"line":643,"column":12}},{"start":{"line":644,"column":4},"end":{"line":646,"column":12}},{"start":{"line":647,"column":4},"end":{"line":648,"column":66}}],"line":634},"90":{"loc":{"start":{"line":654,"column":2},"end":{"line":667,"column":3}},"type":"if","locations":[{"start":{"line":654,"column":2},"end":{"line":667,"column":3}},{"start":{"line":654,"column":2},"end":{"line":667,"column":3}}],"line":654},"91":{"loc":{"start":{"line":654,"column":6},"end":{"line":654,"column":38}},"type":"binary-expr","locations":[{"start":{"line":654,"column":6},"end":{"line":654,"column":14}},{"start":{"line":654,"column":18},"end":{"line":654,"column":38}}],"line":654},"92":{"loc":{"start":{"line":656,"column":4},"end":{"line":664,"column":5}},"type":"if","locations":[{"start":{"line":656,"column":4},"end":{"line":664,"column":5}},{"start":{"line":656,"column":4},"end":{"line":664,"column":5}}],"line":656},"93":{"loc":{"start":{"line":656,"column":8},"end":{"line":656,"column":36}},"type":"binary-expr","locations":[{"start":{"line":656,"column":8},"end":{"line":656,"column":14}},{"start":{"line":656,"column":18},"end":{"line":656,"column":36}}],"line":656},"94":{"loc":{"start":{"line":658,"column":6},"end":{"line":661,"column":7}},"type":"if","locations":[{"start":{"line":658,"column":6},"end":{"line":661,"column":7}},{"start":{"line":658,"column":6},"end":{"line":661,"column":7}}],"line":658},"95":{"loc":{"start":{"line":658,"column":12},"end":{"line":658,"column":40}},"type":"binary-expr","locations":[{"start":{"line":658,"column":12},"end":{"line":658,"column":18}},{"start":{"line":658,"column":22},"end":{"line":658,"column":40}}],"line":658},"96":{"loc":{"start":{"line":671,"column":2},"end":{"line":685,"column":3}},"type":"if","locations":[{"start":{"line":671,"column":2},"end":{"line":685,"column":3}},{"start":{"line":671,"column":2},"end":{"line":685,"column":3}}],"line":671},"97":{"loc":{"start":{"line":671,"column":6},"end":{"line":671,"column":37}},"type":"binary-expr","locations":[{"start":{"line":671,"column":6},"end":{"line":671,"column":14}},{"start":{"line":671,"column":18},"end":{"line":671,"column":37}}],"line":671},"98":{"loc":{"start":{"line":696,"column":22},"end":{"line":696,"column":48}},"type":"binary-expr","locations":[{"start":{"line":696,"column":22},"end":{"line":696,"column":39}},{"start":{"line":696,"column":43},"end":{"line":696,"column":48}}],"line":696},"99":{"loc":{"start":{"line":697,"column":2},"end":{"line":724,"column":3}},"type":"if","locations":[{"start":{"line":697,"column":2},"end":{"line":724,"column":3}},{"start":{"line":697,"column":2},"end":{"line":724,"column":3}}],"line":697},"100":{"loc":{"start":{"line":699,"column":4},"end":{"line":723,"column":5}},"type":"switch","locations":[{"start":{"line":700,"column":6},"end":{"line":702,"column":14}},{"start":{"line":703,"column":6},"end":{"line":705,"column":14}},{"start":{"line":706,"column":6},"end":{"line":708,"column":14}},{"start":{"line":709,"column":6},"end":{"line":711,"column":14}},{"start":{"line":712,"column":6},"end":{"line":714,"column":14}},{"start":{"line":715,"column":6},"end":{"line":717,"column":14}},{"start":{"line":718,"column":6},"end":{"line":720,"column":14}},{"start":{"line":721,"column":6},"end":{"line":722,"column":68}}],"line":699},"101":{"loc":{"start":{"line":727,"column":2},"end":{"line":735,"column":3}},"type":"if","locations":[{"start":{"line":727,"column":2},"end":{"line":735,"column":3}},{"start":{"line":727,"column":2},"end":{"line":735,"column":3}}],"line":727},"102":{"loc":{"start":{"line":727,"column":6},"end":{"line":727,"column":37}},"type":"binary-expr","locations":[{"start":{"line":727,"column":6},"end":{"line":727,"column":14}},{"start":{"line":727,"column":18},"end":{"line":727,"column":37}}],"line":727},"103":{"loc":{"start":{"line":743,"column":22},"end":{"line":743,"column":75}},"type":"cond-expr","locations":[{"start":{"line":743,"column":37},"end":{"line":743,"column":63}},{"start":{"line":743,"column":66},"end":{"line":743,"column":75}}],"line":743},"104":{"loc":{"start":{"line":744,"column":2},"end":{"line":746,"column":3}},"type":"if","locations":[{"start":{"line":744,"column":2},"end":{"line":746,"column":3}},{"start":{"line":744,"column":2},"end":{"line":746,"column":3}}],"line":744},"105":{"loc":{"start":{"line":750,"column":29},"end":{"line":750,"column":62}},"type":"binary-expr","locations":[{"start":{"line":750,"column":29},"end":{"line":750,"column":53}},{"start":{"line":750,"column":57},"end":{"line":750,"column":62}}],"line":750},"106":{"loc":{"start":{"line":751,"column":22},"end":{"line":751,"column":48}},"type":"binary-expr","locations":[{"start":{"line":751,"column":22},"end":{"line":751,"column":39}},{"start":{"line":751,"column":43},"end":{"line":751,"column":48}}],"line":751},"107":{"loc":{"start":{"line":752,"column":2},"end":{"line":856,"column":3}},"type":"switch","locations":[{"start":{"line":753,"column":4},"end":{"line":760,"column":12}},{"start":{"line":761,"column":4},"end":{"line":764,"column":12}},{"start":{"line":765,"column":4},"end":{"line":768,"column":12}},{"start":{"line":769,"column":4},"end":{"line":852,"column":5}},{"start":{"line":853,"column":4},"end":{"line":855,"column":63}}],"line":752},"108":{"loc":{"start":{"line":754,"column":6},"end":{"line":759,"column":7}},"type":"if","locations":[{"start":{"line":754,"column":6},"end":{"line":759,"column":7}},{"start":{"line":754,"column":6},"end":{"line":759,"column":7}}],"line":754},"109":{"loc":{"start":{"line":771,"column":6},"end":{"line":773,"column":7}},"type":"if","locations":[{"start":{"line":771,"column":6},"end":{"line":773,"column":7}},{"start":{"line":771,"column":6},"end":{"line":773,"column":7}}],"line":771},"110":{"loc":{"start":{"line":771,"column":12},"end":{"line":771,"column":72}},"type":"binary-expr","locations":[{"start":{"line":771,"column":12},"end":{"line":771,"column":41}},{"start":{"line":771,"column":45},"end":{"line":771,"column":72}}],"line":771},"111":{"loc":{"start":{"line":774,"column":6},"end":{"line":848,"column":7}},"type":"if","locations":[{"start":{"line":774,"column":6},"end":{"line":848,"column":7}},{"start":{"line":774,"column":6},"end":{"line":848,"column":7}}],"line":774},"112":{"loc":{"start":{"line":776,"column":19},"end":{"line":778,"column":35}},"type":"cond-expr","locations":[{"start":{"line":777,"column":12},"end":{"line":777,"column":46}},{"start":{"line":778,"column":12},"end":{"line":778,"column":35}}],"line":776},"113":{"loc":{"start":{"line":784,"column":8},"end":{"line":789,"column":9}},"type":"if","locations":[{"start":{"line":784,"column":8},"end":{"line":789,"column":9}},{"start":{"line":784,"column":8},"end":{"line":789,"column":9}}],"line":784},"114":{"loc":{"start":{"line":786,"column":23},"end":{"line":786,"column":48}},"type":"binary-expr","locations":[{"start":{"line":786,"column":23},"end":{"line":786,"column":28}},{"start":{"line":786,"column":32},"end":{"line":786,"column":39}},{"start":{"line":786,"column":43},"end":{"line":786,"column":48}}],"line":786},"115":{"loc":{"start":{"line":790,"column":26},"end":{"line":790,"column":60}},"type":"binary-expr","locations":[{"start":{"line":790,"column":26},"end":{"line":790,"column":37}},{"start":{"line":790,"column":41},"end":{"line":790,"column":60}}],"line":790},"116":{"loc":{"start":{"line":792,"column":8},"end":{"line":844,"column":9}},"type":"switch","locations":[{"start":{"line":793,"column":10},"end":{"line":798,"column":18}},{"start":{"line":799,"column":10},"end":{"line":804,"column":18}},{"start":{"line":805,"column":10},"end":{"line":810,"column":18}},{"start":{"line":811,"column":10},"end":{"line":816,"column":18}},{"start":{"line":817,"column":10},"end":{"line":822,"column":18}},{"start":{"line":823,"column":10},"end":{"line":828,"column":18}},{"start":{"line":829,"column":10},"end":{"line":834,"column":18}},{"start":{"line":835,"column":10},"end":{"line":837,"column":18}},{"start":{"line":838,"column":10},"end":{"line":843,"column":18}}],"line":792},"117":{"loc":{"start":{"line":849,"column":20},"end":{"line":849,"column":77}},"type":"cond-expr","locations":[{"start":{"line":849,"column":41},"end":{"line":849,"column":65}},{"start":{"line":849,"column":68},"end":{"line":849,"column":77}}],"line":849},"118":{"loc":{"start":{"line":850,"column":24},"end":{"line":850,"column":40}},"type":"binary-expr","locations":[{"start":{"line":850,"column":24},"end":{"line":850,"column":29}},{"start":{"line":850,"column":33},"end":{"line":850,"column":40}}],"line":850},"119":{"loc":{"start":{"line":874,"column":6},"end":{"line":874,"column":38}},"type":"binary-expr","locations":[{"start":{"line":874,"column":6},"end":{"line":874,"column":19}},{"start":{"line":874,"column":23},"end":{"line":874,"column":38}}],"line":874},"120":{"loc":{"start":{"line":875,"column":6},"end":{"line":875,"column":25}},"type":"binary-expr","locations":[{"start":{"line":875,"column":6},"end":{"line":875,"column":18}},{"start":{"line":875,"column":22},"end":{"line":875,"column":25}}],"line":875},"121":{"loc":{"start":{"line":883,"column":2},"end":{"line":886,"column":3}},"type":"if","locations":[{"start":{"line":883,"column":2},"end":{"line":886,"column":3}},{"start":{"line":883,"column":2},"end":{"line":886,"column":3}}],"line":883},"122":{"loc":{"start":{"line":883,"column":6},"end":{"line":883,"column":50}},"type":"binary-expr","locations":[{"start":{"line":883,"column":6},"end":{"line":883,"column":28}},{"start":{"line":883,"column":32},"end":{"line":883,"column":50}}],"line":883},"123":{"loc":{"start":{"line":891,"column":8},"end":{"line":898,"column":9}},"type":"if","locations":[{"start":{"line":891,"column":8},"end":{"line":898,"column":9}},{"start":{"line":891,"column":8},"end":{"line":898,"column":9}}],"line":891},"124":{"loc":{"start":{"line":908,"column":10},"end":{"line":912,"column":17}},"type":"cond-expr","locations":[{"start":{"line":909,"column":14},"end":{"line":909,"column":35}},{"start":{"line":910,"column":14},"end":{"line":912,"column":17}}],"line":908},"125":{"loc":{"start":{"line":910,"column":14},"end":{"line":912,"column":17}},"type":"cond-expr","locations":[{"start":{"line":911,"column":14},"end":{"line":911,"column":24}},{"start":{"line":912,"column":14},"end":{"line":912,"column":17}}],"line":910},"126":{"loc":{"start":{"line":913,"column":10},"end":{"line":913,"column":69}},"type":"binary-expr","locations":[{"start":{"line":913,"column":10},"end":{"line":913,"column":23}},{"start":{"line":913,"column":27},"end":{"line":913,"column":69}}],"line":913}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":153,"7":153,"8":153,"9":153,"10":153,"11":151,"12":302,"13":153,"14":153,"15":302,"16":302,"17":302,"18":302,"19":153,"20":33,"21":33,"22":33,"23":33,"24":132,"25":33,"26":30,"27":30,"28":30,"29":30,"30":30,"31":30,"32":60,"33":60,"34":60,"35":30,"36":30,"37":60,"38":60,"39":60,"40":30,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":51,"52":51,"53":51,"54":48,"55":48,"56":4,"57":4,"58":4,"59":4,"60":4,"61":4,"62":1,"63":0,"64":51,"65":51,"66":10,"67":10,"68":10,"69":20,"70":20,"71":20,"72":10,"73":10,"74":20,"75":20,"76":20,"77":20,"78":20,"79":20,"80":20,"81":20,"82":20,"83":20,"84":20,"85":10,"86":51,"87":51,"88":51,"89":51,"90":51,"91":51,"92":51,"93":0,"94":51,"95":51,"96":50,"97":51,"98":45,"99":51,"100":47,"101":51,"102":51,"103":51,"104":51,"105":51,"106":50,"107":50,"108":50,"109":51,"110":3,"111":3,"112":3,"113":3,"114":3,"115":3,"116":51,"117":51,"118":204,"119":51,"120":47,"121":51,"122":51,"123":51,"124":51,"125":51,"126":51,"127":51,"128":51,"129":51,"130":51,"131":51,"132":51,"133":51,"134":49,"135":51,"136":51,"137":1,"138":50,"139":51,"140":51,"141":51,"142":51,"143":51,"144":51,"145":51,"146":7,"147":7,"148":7,"149":7,"150":6,"151":1,"152":7,"153":7,"154":6,"155":1,"156":7,"157":11,"158":11,"159":11,"160":11,"161":11,"162":2,"163":2,"164":2,"165":1,"166":1,"167":1,"168":1,"169":0,"170":2,"171":2,"172":2,"173":2,"174":1,"175":1,"176":1,"177":1,"178":0,"179":2,"180":2,"181":2,"182":2,"183":1,"184":1,"185":1,"186":1,"187":2,"188":2,"189":0,"190":5,"191":5,"192":5,"193":5,"194":5,"195":3,"196":3,"197":2,"198":5,"199":2,"200":2,"201":2,"202":2,"203":1,"204":1,"205":1,"206":1,"207":1,"208":2,"209":1,"210":1,"211":0,"212":2,"213":5,"214":5,"215":5,"216":5,"217":5,"218":5,"219":2,"220":2,"221":3,"222":3,"223":0,"224":5,"225":5,"226":5,"227":5,"228":5,"229":4,"230":5,"231":2,"232":5,"233":4,"234":4,"235":4,"236":7,"237":7,"238":7,"239":2,"240":5,"241":7,"242":7,"243":7,"244":7,"245":7,"246":7,"247":7,"248":7,"249":7,"250":1,"251":4,"252":6,"253":6,"254":6,"255":6,"256":6,"257":6,"258":1,"259":1,"260":2,"261":2,"262":1,"263":1,"264":2,"265":2,"266":0,"267":6,"268":6,"269":6,"270":6,"271":6,"272":6,"273":0,"274":6,"275":7,"276":7,"277":7,"278":7,"279":7,"280":1,"281":1,"282":1,"283":1,"284":1,"285":1,"286":4,"287":4,"288":0,"289":7,"290":7,"291":5,"292":4,"293":2,"294":1,"295":2,"296":7,"297":7,"298":6,"299":6,"300":1,"301":6,"302":1,"303":1,"304":1,"305":1,"306":1,"307":1,"308":1,"309":1,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":1,"324":1,"325":1,"326":1,"327":1,"328":55,"329":55,"330":0,"331":55,"332":55,"333":55,"334":55,"335":55,"336":8,"337":7,"338":7,"339":1,"340":7,"341":4,"342":4,"343":4,"344":1,"345":1,"346":1,"347":41,"348":41,"349":0,"350":41,"351":40,"352":40,"353":40,"354":40,"355":40,"356":40,"357":40,"358":40,"359":40,"360":40,"361":40,"362":40,"363":5,"364":4,"365":2,"366":2,"367":6,"368":6,"369":7,"370":6,"371":2,"372":2,"373":5,"374":5,"375":1,"376":1,"377":2,"378":2,"379":10,"380":10,"381":1,"382":1,"383":39,"384":39,"385":39,"386":1,"387":51,"388":55,"389":55,"390":4,"391":51,"392":1,"393":1,"394":0,"395":0,"396":1,"397":2,"398":2,"399":0,"400":2,"401":0,"402":1,"403":1},"f":{"0":153,"1":302,"2":302,"3":33,"4":132,"5":30,"6":60,"7":60,"8":0,"9":0,"10":51,"11":10,"12":51,"13":204,"14":7,"15":11,"16":2,"17":2,"18":5,"19":2,"20":2,"21":5,"22":4,"23":2,"24":6,"25":7,"26":1,"27":55,"28":55,"29":1,"30":2},"b":{"0":[151,2],"1":[260,42],"2":[33,0],"3":[33,33],"4":[30,0],"5":[30,0],"6":[30,30],"7":[30,0],"8":[30,30],"9":[0,0],"10":[0,0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[51,0],"16":[48,3],"17":[4,44],"18":[1,3],"19":[4,1],"20":[10,10],"21":[20,10],"22":[20,0],"23":[20,0],"24":[51,1],"25":[51,6],"26":[51,1],"27":[51,0],"28":[0,51],"29":[51,2],"30":[50,1],"31":[45,6],"32":[47,4],"33":[51,50],"34":[51,0],"35":[50,1],"36":[3,48],"37":[47,4],"38":[51,0],"39":[49,2],"40":[51,49,49],"41":[51,0],"42":[1,50],"43":[1,50],"44":[1,1,1,1],"45":[50,49,48,1],"46":[51,4],"47":[7,1],"48":[7,0],"49":[6,1],"50":[7,0],"51":[6,1],"52":[7,6],"53":[11,0],"54":[0,11],"55":[11,10],"56":[1,10],"57":[11,10],"58":[0,11],"59":[1,1,0],"60":[2,0],"61":[2,0],"62":[1,1,0],"63":[2,0],"64":[1,1],"65":[2,0],"66":[5,0],"67":[3,2],"68":[5,4],"69":[2,2],"70":[1,1,0],"71":[5,0],"72":[5,0],"73":[1,2,3,0],"74":[5,3],"75":[5,3],"76":[4,1],"77":[5,5],"78":[2,5],"79":[7,5],"80":[3,4],"81":[7,4],"82":[7,3],"83":[6,0],"84":[6,0],"85":[1,2,1,1,1,2,2,0],"86":[6,0],"87":[6,0],"88":[7,0],"89":[1,1,1,4,0],"90":[5,2],"91":[7,2],"92":[4,1],"93":[5,1],"94":[2,2],"95":[4,2],"96":[6,1],"97":[7,7],"98":[1,0],"99":[1,0],"100":[1,0,0,0,0,0,0,0],"101":[1,0],"102":[1,1],"103":[55,0],"104":[0,55],"105":[55,1],"106":[55,1],"107":[8,4,1,41,1],"108":[7,1],"109":[0,41],"110":[41,0],"111":[40,1],"112":[30,10],"113":[40,0],"114":[40,39,36],"115":[40,28],"116":[5,2,6,7,2,5,1,2,10],"117":[38,1],"118":[39,39],"119":[4,0],"120":[4,4],"121":[0,1],"122":[1,1],"123":[0,2],"124":[0,0],"125":[0,0],"126":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1c37f053e13a571e10e64593304f7bf1a2000c79"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga4\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga4\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":62}},"2":{"start":{"line":5,"column":23},"end":{"line":52,"column":1}},"3":{"start":{"line":58,"column":25},"end":{"line":106,"column":1}},"4":{"start":{"line":108,"column":22},"end":{"line":108,"column":65}},"5":{"start":{"line":110,"column":0},"end":{"line":116,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"784cc9d3469bc91f958db20837418883135815fd"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga4\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga4\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":22},"end":{"line":2,"column":51}},"2":{"start":{"line":14,"column":4},"end":{"line":14,"column":25}},"3":{"start":{"line":21,"column":4},"end":{"line":21,"column":23}},"4":{"start":{"line":32,"column":4},"end":{"line":32,"column":22}},"5":{"start":{"line":35,"column":14},"end":{"line":35,"column":35}},"6":{"start":{"line":36,"column":2},"end":{"line":38,"column":3}},"7":{"start":{"line":37,"column":4},"end":{"line":37,"column":57}},"8":{"start":{"line":41,"column":2},"end":{"line":41,"column":44}},"9":{"start":{"line":44,"column":2},"end":{"line":49,"column":3}},"10":{"start":{"line":45,"column":4},"end":{"line":48,"column":6}},"11":{"start":{"line":52,"column":19},"end":{"line":52,"column":63}},"12":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"13":{"start":{"line":54,"column":4},"end":{"line":54,"column":79}},"14":{"start":{"line":57,"column":2},"end":{"line":83,"column":3}},"15":{"start":{"line":60,"column":6},"end":{"line":61,"column":71}},"16":{"start":{"line":62,"column":6},"end":{"line":67,"column":7}},"17":{"start":{"line":63,"column":8},"end":{"line":66,"column":10}},"18":{"start":{"line":68,"column":6},"end":{"line":68,"column":12}},"19":{"start":{"line":70,"column":6},"end":{"line":73,"column":8}},"20":{"start":{"line":74,"column":6},"end":{"line":79,"column":7}},"21":{"start":{"line":75,"column":8},"end":{"line":78,"column":10}},"22":{"start":{"line":80,"column":6},"end":{"line":80,"column":12}},"23":{"start":{"line":82,"column":6},"end":{"line":82,"column":60}},"24":{"start":{"line":85,"column":16},"end":{"line":85,"column":18}},"25":{"start":{"line":86,"column":2},"end":{"line":347,"column":3}},"26":{"start":{"line":89,"column":4},"end":{"line":312,"column":5}},"27":{"start":{"line":92,"column":8},"end":{"line":92,"column":61}},"28":{"start":{"line":93,"column":8},"end":{"line":96,"column":10}},"29":{"start":{"line":97,"column":8},"end":{"line":97,"column":14}},"30":{"start":{"line":99,"column":8},"end":{"line":99,"column":61}},"31":{"start":{"line":100,"column":8},"end":{"line":103,"column":10}},"32":{"start":{"line":104,"column":8},"end":{"line":104,"column":75}},"33":{"start":{"line":105,"column":8},"end":{"line":105,"column":14}},"34":{"start":{"line":108,"column":8},"end":{"line":108,"column":61}},"35":{"start":{"line":109,"column":8},"end":{"line":112,"column":10}},"36":{"start":{"line":113,"column":8},"end":{"line":113,"column":75}},"37":{"start":{"line":114,"column":8},"end":{"line":114,"column":14}},"38":{"start":{"line":116,"column":8},"end":{"line":116,"column":61}},"39":{"start":{"line":117,"column":8},"end":{"line":120,"column":10}},"40":{"start":{"line":121,"column":8},"end":{"line":121,"column":76}},"41":{"start":{"line":122,"column":8},"end":{"line":122,"column":14}},"42":{"start":{"line":125,"column":8},"end":{"line":125,"column":61}},"43":{"start":{"line":126,"column":8},"end":{"line":129,"column":10}},"44":{"start":{"line":130,"column":8},"end":{"line":130,"column":75}},"45":{"start":{"line":131,"column":8},"end":{"line":131,"column":14}},"46":{"start":{"line":133,"column":8},"end":{"line":133,"column":61}},"47":{"start":{"line":134,"column":8},"end":{"line":137,"column":10}},"48":{"start":{"line":138,"column":8},"end":{"line":138,"column":75}},"49":{"start":{"line":139,"column":8},"end":{"line":139,"column":14}},"50":{"start":{"line":141,"column":8},"end":{"line":141,"column":61}},"51":{"start":{"line":142,"column":8},"end":{"line":145,"column":10}},"52":{"start":{"line":146,"column":8},"end":{"line":146,"column":75}},"53":{"start":{"line":147,"column":8},"end":{"line":147,"column":14}},"54":{"start":{"line":149,"column":8},"end":{"line":149,"column":61}},"55":{"start":{"line":150,"column":8},"end":{"line":153,"column":10}},"56":{"start":{"line":154,"column":8},"end":{"line":154,"column":75}},"57":{"start":{"line":155,"column":8},"end":{"line":155,"column":14}},"58":{"start":{"line":157,"column":8},"end":{"line":157,"column":61}},"59":{"start":{"line":158,"column":8},"end":{"line":161,"column":10}},"60":{"start":{"line":162,"column":8},"end":{"line":162,"column":75}},"61":{"start":{"line":163,"column":8},"end":{"line":163,"column":14}},"62":{"start":{"line":165,"column":8},"end":{"line":165,"column":61}},"63":{"start":{"line":166,"column":8},"end":{"line":169,"column":10}},"64":{"start":{"line":170,"column":8},"end":{"line":170,"column":75}},"65":{"start":{"line":171,"column":8},"end":{"line":171,"column":14}},"66":{"start":{"line":173,"column":8},"end":{"line":176,"column":10}},"67":{"start":{"line":177,"column":8},"end":{"line":181,"column":9}},"68":{"start":{"line":178,"column":10},"end":{"line":178,"column":45}},"69":{"start":{"line":180,"column":10},"end":{"line":180,"column":44}},"70":{"start":{"line":182,"column":8},"end":{"line":182,"column":75}},"71":{"start":{"line":183,"column":8},"end":{"line":183,"column":14}},"72":{"start":{"line":185,"column":8},"end":{"line":185,"column":61}},"73":{"start":{"line":186,"column":8},"end":{"line":189,"column":10}},"74":{"start":{"line":190,"column":8},"end":{"line":190,"column":75}},"75":{"start":{"line":191,"column":8},"end":{"line":191,"column":14}},"76":{"start":{"line":193,"column":8},"end":{"line":193,"column":61}},"77":{"start":{"line":194,"column":8},"end":{"line":197,"column":10}},"78":{"start":{"line":198,"column":8},"end":{"line":198,"column":76}},"79":{"start":{"line":199,"column":8},"end":{"line":199,"column":14}},"80":{"start":{"line":202,"column":8},"end":{"line":202,"column":61}},"81":{"start":{"line":203,"column":8},"end":{"line":206,"column":10}},"82":{"start":{"line":207,"column":8},"end":{"line":207,"column":75}},"83":{"start":{"line":208,"column":8},"end":{"line":208,"column":14}},"84":{"start":{"line":211,"column":8},"end":{"line":211,"column":61}},"85":{"start":{"line":212,"column":8},"end":{"line":215,"column":10}},"86":{"start":{"line":216,"column":8},"end":{"line":216,"column":14}},"87":{"start":{"line":218,"column":8},"end":{"line":218,"column":61}},"88":{"start":{"line":219,"column":8},"end":{"line":222,"column":10}},"89":{"start":{"line":223,"column":8},"end":{"line":223,"column":14}},"90":{"start":{"line":226,"column":8},"end":{"line":226,"column":61}},"91":{"start":{"line":227,"column":8},"end":{"line":230,"column":10}},"92":{"start":{"line":231,"column":8},"end":{"line":231,"column":14}},"93":{"start":{"line":234,"column":8},"end":{"line":234,"column":61}},"94":{"start":{"line":235,"column":8},"end":{"line":238,"column":10}},"95":{"start":{"line":239,"column":8},"end":{"line":239,"column":14}},"96":{"start":{"line":241,"column":8},"end":{"line":241,"column":61}},"97":{"start":{"line":242,"column":8},"end":{"line":245,"column":10}},"98":{"start":{"line":246,"column":8},"end":{"line":246,"column":14}},"99":{"start":{"line":248,"column":8},"end":{"line":248,"column":61}},"100":{"start":{"line":249,"column":8},"end":{"line":252,"column":10}},"101":{"start":{"line":253,"column":8},"end":{"line":253,"column":14}},"102":{"start":{"line":255,"column":8},"end":{"line":255,"column":61}},"103":{"start":{"line":256,"column":8},"end":{"line":259,"column":10}},"104":{"start":{"line":260,"column":8},"end":{"line":260,"column":14}},"105":{"start":{"line":262,"column":8},"end":{"line":262,"column":61}},"106":{"start":{"line":263,"column":8},"end":{"line":266,"column":10}},"107":{"start":{"line":267,"column":8},"end":{"line":267,"column":14}},"108":{"start":{"line":269,"column":8},"end":{"line":269,"column":61}},"109":{"start":{"line":270,"column":8},"end":{"line":273,"column":10}},"110":{"start":{"line":274,"column":8},"end":{"line":274,"column":14}},"111":{"start":{"line":276,"column":8},"end":{"line":276,"column":61}},"112":{"start":{"line":277,"column":8},"end":{"line":280,"column":10}},"113":{"start":{"line":281,"column":8},"end":{"line":281,"column":14}},"114":{"start":{"line":283,"column":8},"end":{"line":283,"column":61}},"115":{"start":{"line":284,"column":8},"end":{"line":287,"column":10}},"116":{"start":{"line":288,"column":8},"end":{"line":288,"column":14}},"117":{"start":{"line":290,"column":8},"end":{"line":290,"column":61}},"118":{"start":{"line":291,"column":8},"end":{"line":291,"column":14}},"119":{"start":{"line":293,"column":8},"end":{"line":293,"column":61}},"120":{"start":{"line":294,"column":8},"end":{"line":294,"column":14}},"121":{"start":{"line":296,"column":8},"end":{"line":296,"column":61}},"122":{"start":{"line":297,"column":8},"end":{"line":300,"column":10}},"123":{"start":{"line":301,"column":8},"end":{"line":301,"column":14}},"124":{"start":{"line":303,"column":8},"end":{"line":303,"column":61}},"125":{"start":{"line":304,"column":8},"end":{"line":307,"column":10}},"126":{"start":{"line":308,"column":8},"end":{"line":308,"column":76}},"127":{"start":{"line":309,"column":8},"end":{"line":309,"column":14}},"128":{"start":{"line":311,"column":8},"end":{"line":311,"column":14}},"129":{"start":{"line":316,"column":4},"end":{"line":321,"column":5}},"130":{"start":{"line":317,"column":6},"end":{"line":320,"column":8}},"131":{"start":{"line":323,"column":4},"end":{"line":328,"column":5}},"132":{"start":{"line":324,"column":6},"end":{"line":327,"column":8}},"133":{"start":{"line":330,"column":4},"end":{"line":330,"column":25}},"134":{"start":{"line":333,"column":27},"end":{"line":333,"column":29}},"135":{"start":{"line":334,"column":4},"end":{"line":339,"column":6}},"136":{"start":{"line":340,"column":4},"end":{"line":346,"column":5}},"137":{"start":{"line":341,"column":6},"end":{"line":341,"column":55}},"138":{"start":{"line":342,"column":6},"end":{"line":345,"column":8}},"139":{"start":{"line":349,"column":2},"end":{"line":349,"column":53}},"140":{"start":{"line":351,"column":2},"end":{"line":353,"column":3}},"141":{"start":{"line":352,"column":4},"end":{"line":352,"column":66}},"142":{"start":{"line":355,"column":2},"end":{"line":357,"column":3}},"143":{"start":{"line":356,"column":4},"end":{"line":356,"column":26}},"144":{"start":{"line":360,"column":23},"end":{"line":360,"column":25}},"145":{"start":{"line":361,"column":2},"end":{"line":366,"column":4}},"146":{"start":{"line":367,"column":2},"end":{"line":370,"column":3}},"147":{"start":{"line":368,"column":4},"end":{"line":368,"column":49}},"148":{"start":{"line":369,"column":4},"end":{"line":369,"column":48}},"149":{"start":{"line":372,"column":2},"end":{"line":372,"column":68}},"150":{"start":{"line":374,"column":2},"end":{"line":374,"column":50}},"151":{"start":{"line":375,"column":2},"end":{"line":375,"column":52}},"152":{"start":{"line":378,"column":19},"end":{"line":378,"column":41}},"153":{"start":{"line":379,"column":2},"end":{"line":379,"column":59}},"154":{"start":{"line":380,"column":2},"end":{"line":380,"column":31}},"155":{"start":{"line":381,"column":2},"end":{"line":384,"column":4}},"156":{"start":{"line":385,"column":2},"end":{"line":387,"column":4}},"157":{"start":{"line":390,"column":2},"end":{"line":399,"column":3}},"158":{"start":{"line":392,"column":6},"end":{"line":392,"column":60}},"159":{"start":{"line":393,"column":6},"end":{"line":393,"column":12}},"160":{"start":{"line":395,"column":6},"end":{"line":395,"column":61}},"161":{"start":{"line":396,"column":6},"end":{"line":396,"column":12}},"162":{"start":{"line":398,"column":6},"end":{"line":398,"column":12}},"163":{"start":{"line":401,"column":2},"end":{"line":401,"column":34}},"164":{"start":{"line":402,"column":2},"end":{"line":402,"column":18}},"165":{"start":{"line":406,"column":35},"end":{"line":406,"column":40}},"166":{"start":{"line":407,"column":21},"end":{"line":407,"column":32}},"167":{"start":{"line":409,"column":2},"end":{"line":411,"column":3}},"168":{"start":{"line":410,"column":4},"end":{"line":410,"column":67}},"169":{"start":{"line":412,"column":2},"end":{"line":414,"column":3}},"170":{"start":{"line":413,"column":4},"end":{"line":413,"column":66}},"171":{"start":{"line":415,"column":2},"end":{"line":417,"column":3}},"172":{"start":{"line":416,"column":4},"end":{"line":416,"column":75}},"173":{"start":{"line":418,"column":2},"end":{"line":420,"column":3}},"174":{"start":{"line":419,"column":4},"end":{"line":419,"column":75}},"175":{"start":{"line":422,"column":2},"end":{"line":427,"column":3}},"176":{"start":{"line":423,"column":4},"end":{"line":426,"column":6}},"177":{"start":{"line":429,"column":22},"end":{"line":429,"column":48}},"178":{"start":{"line":431,"column":2},"end":{"line":442,"column":3}},"179":{"start":{"line":433,"column":6},"end":{"line":433,"column":60}},"180":{"start":{"line":434,"column":6},"end":{"line":434,"column":12}},"181":{"start":{"line":437,"column":6},"end":{"line":437,"column":34}},"182":{"start":{"line":438,"column":6},"end":{"line":438,"column":60}},"183":{"start":{"line":439,"column":6},"end":{"line":439,"column":12}},"184":{"start":{"line":441,"column":6},"end":{"line":441,"column":78}},"185":{"start":{"line":443,"column":2},"end":{"line":443,"column":18}},"186":{"start":{"line":446,"column":0},"end":{"line":446,"column":29}}},"fnMap":{"0":{"name":"trackResponseBuilder","decl":{"start":{"line":34,"column":9},"end":{"line":34,"column":29}},"loc":{"start":{"line":34,"column":51},"end":{"line":403,"column":1}},"line":34},"1":{"name":"process","decl":{"start":{"line":405,"column":9},"end":{"line":405,"column":16}},"loc":{"start":{"line":405,"column":24},"end":{"line":444,"column":1}},"line":405}},"branchMap":{"0":{"loc":{"start":{"line":36,"column":2},"end":{"line":38,"column":3}},"type":"if","locations":[{"start":{"line":36,"column":2},"end":{"line":38,"column":3}},{"start":{"line":36,"column":2},"end":{"line":38,"column":3}}],"line":36},"1":{"loc":{"start":{"line":44,"column":2},"end":{"line":49,"column":3}},"type":"if","locations":[{"start":{"line":44,"column":2},"end":{"line":49,"column":3}},{"start":{"line":44,"column":2},"end":{"line":49,"column":3}}],"line":44},"2":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},{"start":{"line":53,"column":2},"end":{"line":55,"column":3}}],"line":53},"3":{"loc":{"start":{"line":57,"column":2},"end":{"line":83,"column":3}},"type":"switch","locations":[{"start":{"line":58,"column":4},"end":{"line":68,"column":12}},{"start":{"line":69,"column":4},"end":{"line":80,"column":12}},{"start":{"line":81,"column":4},"end":{"line":82,"column":60}}],"line":57},"4":{"loc":{"start":{"line":61,"column":8},"end":{"line":61,"column":70}},"type":"binary-expr","locations":[{"start":{"line":61,"column":8},"end":{"line":61,"column":41}},{"start":{"line":61,"column":45},"end":{"line":61,"column":70}}],"line":61},"5":{"loc":{"start":{"line":62,"column":6},"end":{"line":67,"column":7}},"type":"if","locations":[{"start":{"line":62,"column":6},"end":{"line":67,"column":7}},{"start":{"line":62,"column":6},"end":{"line":67,"column":7}}],"line":62},"6":{"loc":{"start":{"line":74,"column":6},"end":{"line":79,"column":7}},"type":"if","locations":[{"start":{"line":74,"column":6},"end":{"line":79,"column":7}},{"start":{"line":74,"column":6},"end":{"line":79,"column":7}}],"line":74},"7":{"loc":{"start":{"line":86,"column":2},"end":{"line":347,"column":3}},"type":"if","locations":[{"start":{"line":86,"column":2},"end":{"line":347,"column":3}},{"start":{"line":86,"column":2},"end":{"line":347,"column":3}}],"line":86},"8":{"loc":{"start":{"line":89,"column":4},"end":{"line":312,"column":5}},"type":"switch","locations":[{"start":{"line":91,"column":6},"end":{"line":97,"column":14}},{"start":{"line":98,"column":6},"end":{"line":105,"column":14}},{"start":{"line":107,"column":6},"end":{"line":114,"column":14}},{"start":{"line":115,"column":6},"end":{"line":122,"column":14}},{"start":{"line":124,"column":6},"end":{"line":131,"column":14}},{"start":{"line":132,"column":6},"end":{"line":139,"column":14}},{"start":{"line":140,"column":6},"end":{"line":147,"column":14}},{"start":{"line":148,"column":6},"end":{"line":155,"column":14}},{"start":{"line":156,"column":6},"end":{"line":163,"column":14}},{"start":{"line":164,"column":6},"end":{"line":171,"column":14}},{"start":{"line":172,"column":6},"end":{"line":183,"column":14}},{"start":{"line":184,"column":6},"end":{"line":191,"column":14}},{"start":{"line":192,"column":6},"end":{"line":199,"column":14}},{"start":{"line":201,"column":6},"end":{"line":208,"column":14}},{"start":{"line":210,"column":6},"end":{"line":216,"column":14}},{"start":{"line":217,"column":6},"end":{"line":223,"column":14}},{"start":{"line":225,"column":6},"end":{"line":231,"column":14}},{"start":{"line":233,"column":6},"end":{"line":239,"column":14}},{"start":{"line":240,"column":6},"end":{"line":246,"column":14}},{"start":{"line":247,"column":6},"end":{"line":253,"column":14}},{"start":{"line":254,"column":6},"end":{"line":260,"column":14}},{"start":{"line":261,"column":6},"end":{"line":267,"column":14}},{"start":{"line":268,"column":6},"end":{"line":274,"column":14}},{"start":{"line":275,"column":6},"end":{"line":281,"column":14}},{"start":{"line":282,"column":6},"end":{"line":288,"column":14}},{"start":{"line":289,"column":6},"end":{"line":291,"column":14}},{"start":{"line":292,"column":6},"end":{"line":294,"column":14}},{"start":{"line":295,"column":6},"end":{"line":301,"column":14}},{"start":{"line":302,"column":6},"end":{"line":309,"column":14}},{"start":{"line":310,"column":6},"end":{"line":311,"column":14}}],"line":89},"9":{"loc":{"start":{"line":177,"column":8},"end":{"line":181,"column":9}},"type":"if","locations":[{"start":{"line":177,"column":8},"end":{"line":181,"column":9}},{"start":{"line":177,"column":8},"end":{"line":181,"column":9}}],"line":177},"10":{"loc":{"start":{"line":316,"column":4},"end":{"line":321,"column":5}},"type":"if","locations":[{"start":{"line":316,"column":4},"end":{"line":321,"column":5}},{"start":{"line":316,"column":4},"end":{"line":321,"column":5}}],"line":316},"11":{"loc":{"start":{"line":323,"column":4},"end":{"line":328,"column":5}},"type":"if","locations":[{"start":{"line":323,"column":4},"end":{"line":328,"column":5}},{"start":{"line":323,"column":4},"end":{"line":328,"column":5}}],"line":323},"12":{"loc":{"start":{"line":340,"column":4},"end":{"line":346,"column":5}},"type":"if","locations":[{"start":{"line":340,"column":4},"end":{"line":346,"column":5}},{"start":{"line":340,"column":4},"end":{"line":346,"column":5}}],"line":340},"13":{"loc":{"start":{"line":351,"column":2},"end":{"line":353,"column":3}},"type":"if","locations":[{"start":{"line":351,"column":2},"end":{"line":353,"column":3}},{"start":{"line":351,"column":2},"end":{"line":353,"column":3}}],"line":351},"14":{"loc":{"start":{"line":355,"column":2},"end":{"line":357,"column":3}},"type":"if","locations":[{"start":{"line":355,"column":2},"end":{"line":357,"column":3}},{"start":{"line":355,"column":2},"end":{"line":357,"column":3}}],"line":355},"15":{"loc":{"start":{"line":367,"column":2},"end":{"line":370,"column":3}},"type":"if","locations":[{"start":{"line":367,"column":2},"end":{"line":370,"column":3}},{"start":{"line":367,"column":2},"end":{"line":370,"column":3}}],"line":367},"16":{"loc":{"start":{"line":390,"column":2},"end":{"line":399,"column":3}},"type":"switch","locations":[{"start":{"line":391,"column":4},"end":{"line":393,"column":12}},{"start":{"line":394,"column":4},"end":{"line":396,"column":12}},{"start":{"line":397,"column":4},"end":{"line":398,"column":12}}],"line":390},"17":{"loc":{"start":{"line":409,"column":2},"end":{"line":411,"column":3}},"type":"if","locations":[{"start":{"line":409,"column":2},"end":{"line":411,"column":3}},{"start":{"line":409,"column":2},"end":{"line":411,"column":3}}],"line":409},"18":{"loc":{"start":{"line":412,"column":2},"end":{"line":414,"column":3}},"type":"if","locations":[{"start":{"line":412,"column":2},"end":{"line":414,"column":3}},{"start":{"line":412,"column":2},"end":{"line":414,"column":3}}],"line":412},"19":{"loc":{"start":{"line":415,"column":2},"end":{"line":417,"column":3}},"type":"if","locations":[{"start":{"line":415,"column":2},"end":{"line":417,"column":3}},{"start":{"line":415,"column":2},"end":{"line":417,"column":3}}],"line":415},"20":{"loc":{"start":{"line":415,"column":6},"end":{"line":415,"column":62}},"type":"binary-expr","locations":[{"start":{"line":415,"column":6},"end":{"line":415,"column":37}},{"start":{"line":415,"column":41},"end":{"line":415,"column":62}}],"line":415},"21":{"loc":{"start":{"line":418,"column":2},"end":{"line":420,"column":3}},"type":"if","locations":[{"start":{"line":418,"column":2},"end":{"line":420,"column":3}},{"start":{"line":418,"column":2},"end":{"line":420,"column":3}}],"line":418},"22":{"loc":{"start":{"line":418,"column":6},"end":{"line":418,"column":66}},"type":"binary-expr","locations":[{"start":{"line":418,"column":6},"end":{"line":418,"column":41}},{"start":{"line":418,"column":45},"end":{"line":418,"column":66}}],"line":418},"23":{"loc":{"start":{"line":422,"column":2},"end":{"line":427,"column":3}},"type":"if","locations":[{"start":{"line":422,"column":2},"end":{"line":427,"column":3}},{"start":{"line":422,"column":2},"end":{"line":427,"column":3}}],"line":422},"24":{"loc":{"start":{"line":431,"column":2},"end":{"line":442,"column":3}},"type":"switch","locations":[{"start":{"line":432,"column":4},"end":{"line":434,"column":12}},{"start":{"line":435,"column":4},"end":{"line":439,"column":12}},{"start":{"line":440,"column":4},"end":{"line":441,"column":78}}],"line":431}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":67,"6":67,"7":1,"8":66,"9":66,"10":2,"11":64,"12":64,"13":63,"14":62,"15":59,"16":59,"17":1,"18":58,"19":3,"20":3,"21":1,"22":2,"23":0,"24":60,"25":60,"26":50,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":4,"39":4,"40":4,"41":4,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":5,"51":5,"52":5,"53":2,"54":1,"55":1,"56":1,"57":1,"58":2,"59":2,"60":2,"61":2,"62":1,"63":1,"64":1,"65":1,"66":2,"67":2,"68":1,"69":1,"70":2,"71":2,"72":1,"73":1,"74":1,"75":1,"76":2,"77":2,"78":2,"79":2,"80":1,"81":1,"82":1,"83":1,"84":2,"85":2,"86":2,"87":2,"88":2,"89":2,"90":2,"91":2,"92":2,"93":2,"94":2,"95":2,"96":1,"97":1,"98":1,"99":2,"100":2,"101":2,"102":2,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":2,"125":2,"126":2,"127":2,"128":0,"129":10,"130":1,"131":9,"132":1,"133":8,"134":8,"135":8,"136":8,"137":5,"138":5,"139":55,"140":55,"141":50,"142":55,"143":13,"144":55,"145":55,"146":55,"147":2,"148":2,"149":55,"150":55,"151":55,"152":55,"153":55,"154":55,"155":55,"156":55,"157":55,"158":54,"159":54,"160":1,"161":1,"162":0,"163":55,"164":55,"165":72,"166":72,"167":72,"168":0,"169":72,"170":1,"171":71,"172":1,"173":70,"174":1,"175":69,"176":1,"177":68,"178":68,"179":65,"180":53,"181":2,"182":2,"183":2,"184":1,"185":55,"186":1},"f":{"0":67,"1":72},"b":{"0":[1,66],"1":[2,64],"2":[63,1],"3":[59,3,0],"4":[59,5],"5":[1,58],"6":[1,2],"7":[50,10],"8":[1,1,1,4,1,1,5,1,2,1,2,1,2,1,2,2,2,2,1,2,2,2,2,2,2,1,1,1,2,0],"9":[1,1],"10":[1,9],"11":[1,8],"12":[5,3],"13":[50,5],"14":[13,42],"15":[2,53],"16":[54,1,0],"17":[0,72],"18":[1,71],"19":[1,70],"20":[71,67],"21":[1,69],"22":[70,4],"23":[1,68],"24":[65,2,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ce6a583fc15a1101365c4fc646fb8ebf79c95898"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga4\\utils.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\ga4\\utils.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":25},"end":{"line":3,"column":61}},"3":{"start":{"line":7,"column":4},"end":{"line":7,"column":51}},"4":{"start":{"line":16,"column":4},"end":{"line":16,"column":25}},"5":{"start":{"line":17,"column":31},"end":{"line":17,"column":61}},"6":{"start":{"line":18,"column":21},"end":{"line":18,"column":48}},"7":{"start":{"line":19,"column":42},"end":{"line":19,"column":61}},"8":{"start":{"line":27,"column":22},"end":{"line":27,"column":55}},"9":{"start":{"line":28,"column":15},"end":{"line":28,"column":57}},"10":{"start":{"line":30,"column":32},"end":{"line":32,"column":3}},"11":{"start":{"line":33,"column":2},"end":{"line":38,"column":3}},"12":{"start":{"line":34,"column":4},"end":{"line":37,"column":6}},"13":{"start":{"line":40,"column":2},"end":{"line":47,"column":3}},"14":{"start":{"line":41,"column":4},"end":{"line":46,"column":5}},"15":{"start":{"line":42,"column":6},"end":{"line":45,"column":8}},"16":{"start":{"line":49,"column":2},"end":{"line":49,"column":74}},"17":{"start":{"line":59,"column":29},"end":{"line":82,"column":3}},"18":{"start":{"line":84,"column":2},"end":{"line":84,"column":58}},"19":{"start":{"line":93,"column":41},"end":{"line":96,"column":1}},"20":{"start":{"line":104,"column":32},"end":{"line":104,"column":63}},"21":{"start":{"line":106,"column":2},"end":{"line":108,"column":3}},"22":{"start":{"line":107,"column":4},"end":{"line":107,"column":11}},"23":{"start":{"line":110,"column":2},"end":{"line":123,"column":5}},"24":{"start":{"line":111,"column":21},"end":{"line":116,"column":6}},"25":{"start":{"line":112,"column":6},"end":{"line":114,"column":7}},"26":{"start":{"line":113,"column":8},"end":{"line":113,"column":20}},"27":{"start":{"line":115,"column":6},"end":{"line":115,"column":19}},"28":{"start":{"line":119,"column":4},"end":{"line":122,"column":5}},"29":{"start":{"line":121,"column":6},"end":{"line":121,"column":28}},"30":{"start":{"line":131,"column":45},"end":{"line":137,"column":1}},"31":{"start":{"line":145,"column":32},"end":{"line":145,"column":63}},"32":{"start":{"line":147,"column":2},"end":{"line":149,"column":3}},"33":{"start":{"line":148,"column":4},"end":{"line":148,"column":11}},"34":{"start":{"line":151,"column":2},"end":{"line":164,"column":5}},"35":{"start":{"line":152,"column":21},"end":{"line":157,"column":6}},"36":{"start":{"line":153,"column":6},"end":{"line":155,"column":7}},"37":{"start":{"line":154,"column":8},"end":{"line":154,"column":20}},"38":{"start":{"line":156,"column":6},"end":{"line":156,"column":19}},"39":{"start":{"line":160,"column":4},"end":{"line":163,"column":5}},"40":{"start":{"line":162,"column":6},"end":{"line":162,"column":33}},"41":{"start":{"line":175,"column":29},"end":{"line":186,"column":3}},"42":{"start":{"line":188,"column":2},"end":{"line":188,"column":58}},"43":{"start":{"line":198,"column":32},"end":{"line":198,"column":77}},"44":{"start":{"line":201,"column":2},"end":{"line":206,"column":5}},"45":{"start":{"line":202,"column":4},"end":{"line":204,"column":5}},"46":{"start":{"line":203,"column":6},"end":{"line":203,"column":18}},"47":{"start":{"line":205,"column":4},"end":{"line":205,"column":17}},"48":{"start":{"line":209,"column":27},"end":{"line":237,"column":1}},"49":{"start":{"line":246,"column":19},"end":{"line":246,"column":54}},"50":{"start":{"line":247,"column":2},"end":{"line":252,"column":3}},"51":{"start":{"line":248,"column":4},"end":{"line":251,"column":6}},"52":{"start":{"line":253,"column":2},"end":{"line":283,"column":3}},"53":{"start":{"line":254,"column":4},"end":{"line":254,"column":15}},"54":{"start":{"line":255,"column":4},"end":{"line":280,"column":7}},"55":{"start":{"line":256,"column":20},"end":{"line":259,"column":7}},"56":{"start":{"line":260,"column":6},"end":{"line":265,"column":7}},"57":{"start":{"line":264,"column":8},"end":{"line":264,"column":76}},"58":{"start":{"line":267,"column":27},"end":{"line":267,"column":29}},"59":{"start":{"line":268,"column":6},"end":{"line":273,"column":8}},"60":{"start":{"line":274,"column":6},"end":{"line":277,"column":7}},"61":{"start":{"line":275,"column":8},"end":{"line":275,"column":53}},"62":{"start":{"line":276,"column":8},"end":{"line":276,"column":52}},"63":{"start":{"line":279,"column":6},"end":{"line":279,"column":26}},"64":{"start":{"line":281,"column":9},"end":{"line":283,"column":3}},"65":{"start":{"line":282,"column":4},"end":{"line":282,"column":75}},"66":{"start":{"line":284,"column":2},"end":{"line":284,"column":15}},"67":{"start":{"line":287,"column":24},"end":{"line":317,"column":1}},"68":{"start":{"line":288,"column":18},"end":{"line":288,"column":75}},"69":{"start":{"line":289,"column":19},"end":{"line":289,"column":38}},"70":{"start":{"line":290,"column":2},"end":{"line":292,"column":3}},"71":{"start":{"line":291,"column":4},"end":{"line":291,"column":17}},"72":{"start":{"line":295,"column":2},"end":{"line":310,"column":3}},"73":{"start":{"line":296,"column":4},"end":{"line":309,"column":15}},"74":{"start":{"line":312,"column":2},"end":{"line":316,"column":4}},"75":{"start":{"line":319,"column":23},"end":{"line":323,"column":1}},"76":{"start":{"line":320,"column":2},"end":{"line":320,"column":41}},"77":{"start":{"line":321,"column":2},"end":{"line":321,"column":28}},"78":{"start":{"line":322,"column":2},"end":{"line":322,"column":51}},"79":{"start":{"line":325,"column":0},"end":{"line":336,"column":2}}},"fnMap":{"0":{"name":"msUnixTimestamp","decl":{"start":{"line":26,"column":9},"end":{"line":26,"column":24}},"loc":{"start":{"line":26,"column":36},"end":{"line":50,"column":1}},"line":26},"1":{"name":"isReservedEventName","decl":{"start":{"line":58,"column":9},"end":{"line":58,"column":28}},"loc":{"start":{"line":58,"column":36},"end":{"line":85,"column":1}},"line":58},"2":{"name":"removeReservedParameterPrefixNames","decl":{"start":{"line":103,"column":9},"end":{"line":103,"column":43}},"loc":{"start":{"line":103,"column":55},"end":{"line":124,"column":1}},"line":103},"3":{"name":"(anonymous_3)","decl":{"start":{"line":110,"column":33},"end":{"line":110,"column":34}},"loc":{"start":{"line":110,"column":40},"end":{"line":123,"column":3}},"line":110},"4":{"name":"(anonymous_4)","decl":{"start":{"line":111,"column":48},"end":{"line":111,"column":49}},"loc":{"start":{"line":111,"column":58},"end":{"line":116,"column":5}},"line":111},"5":{"name":"removeReservedUserPropertyPrefixNames","decl":{"start":{"line":144,"column":9},"end":{"line":144,"column":46}},"loc":{"start":{"line":144,"column":63},"end":{"line":165,"column":1}},"line":144},"6":{"name":"(anonymous_6)","decl":{"start":{"line":151,"column":38},"end":{"line":151,"column":39}},"loc":{"start":{"line":151,"column":45},"end":{"line":164,"column":3}},"line":151},"7":{"name":"(anonymous_7)","decl":{"start":{"line":152,"column":48},"end":{"line":152,"column":49}},"loc":{"start":{"line":152,"column":58},"end":{"line":157,"column":5}},"line":152},"8":{"name":"isReservedWebCustomEventName","decl":{"start":{"line":174,"column":9},"end":{"line":174,"column":37}},"loc":{"start":{"line":174,"column":45},"end":{"line":189,"column":1}},"line":174},"9":{"name":"isReservedWebCustomPrefixName","decl":{"start":{"line":197,"column":9},"end":{"line":197,"column":38}},"loc":{"start":{"line":197,"column":46},"end":{"line":207,"column":1}},"line":197},"10":{"name":"(anonymous_10)","decl":{"start":{"line":201,"column":36},"end":{"line":201,"column":37}},"loc":{"start":{"line":201,"column":46},"end":{"line":206,"column":3}},"line":201},"11":{"name":"getDestinationItemProperties","decl":{"start":{"line":244,"column":9},"end":{"line":244,"column":37}},"loc":{"start":{"line":244,"column":64},"end":{"line":285,"column":1}},"line":244},"12":{"name":"(anonymous_12)","decl":{"start":{"line":255,"column":21},"end":{"line":255,"column":22}},"loc":{"start":{"line":255,"column":38},"end":{"line":280,"column":5}},"line":255},"13":{"name":"(anonymous_13)","decl":{"start":{"line":287,"column":24},"end":{"line":287,"column":25}},"loc":{"start":{"line":287,"column":55},"end":{"line":317,"column":1}},"line":287},"14":{"name":"(anonymous_14)","decl":{"start":{"line":319,"column":23},"end":{"line":319,"column":24}},"loc":{"start":{"line":319,"column":34},"end":{"line":323,"column":1}},"line":319}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":2},"end":{"line":38,"column":3}},"type":"if","locations":[{"start":{"line":33,"column":2},"end":{"line":38,"column":3}},{"start":{"line":33,"column":2},"end":{"line":38,"column":3}}],"line":33},"1":{"loc":{"start":{"line":40,"column":2},"end":{"line":47,"column":3}},"type":"if","locations":[{"start":{"line":40,"column":2},"end":{"line":47,"column":3}},{"start":{"line":40,"column":2},"end":{"line":47,"column":3}}],"line":40},"2":{"loc":{"start":{"line":41,"column":4},"end":{"line":46,"column":5}},"type":"if","locations":[{"start":{"line":41,"column":4},"end":{"line":46,"column":5}},{"start":{"line":41,"column":4},"end":{"line":46,"column":5}}],"line":41},"3":{"loc":{"start":{"line":106,"column":2},"end":{"line":108,"column":3}},"type":"if","locations":[{"start":{"line":106,"column":2},"end":{"line":108,"column":3}},{"start":{"line":106,"column":2},"end":{"line":108,"column":3}}],"line":106},"4":{"loc":{"start":{"line":112,"column":6},"end":{"line":114,"column":7}},"type":"if","locations":[{"start":{"line":112,"column":6},"end":{"line":114,"column":7}},{"start":{"line":112,"column":6},"end":{"line":114,"column":7}}],"line":112},"5":{"loc":{"start":{"line":119,"column":4},"end":{"line":122,"column":5}},"type":"if","locations":[{"start":{"line":119,"column":4},"end":{"line":122,"column":5}},{"start":{"line":119,"column":4},"end":{"line":122,"column":5}}],"line":119},"6":{"loc":{"start":{"line":147,"column":2},"end":{"line":149,"column":3}},"type":"if","locations":[{"start":{"line":147,"column":2},"end":{"line":149,"column":3}},{"start":{"line":147,"column":2},"end":{"line":149,"column":3}}],"line":147},"7":{"loc":{"start":{"line":153,"column":6},"end":{"line":155,"column":7}},"type":"if","locations":[{"start":{"line":153,"column":6},"end":{"line":155,"column":7}},{"start":{"line":153,"column":6},"end":{"line":155,"column":7}}],"line":153},"8":{"loc":{"start":{"line":160,"column":4},"end":{"line":163,"column":5}},"type":"if","locations":[{"start":{"line":160,"column":4},"end":{"line":163,"column":5}},{"start":{"line":160,"column":4},"end":{"line":163,"column":5}}],"line":160},"9":{"loc":{"start":{"line":202,"column":4},"end":{"line":204,"column":5}},"type":"if","locations":[{"start":{"line":202,"column":4},"end":{"line":204,"column":5}},{"start":{"line":202,"column":4},"end":{"line":204,"column":5}}],"line":202},"10":{"loc":{"start":{"line":247,"column":2},"end":{"line":252,"column":3}},"type":"if","locations":[{"start":{"line":247,"column":2},"end":{"line":252,"column":3}},{"start":{"line":247,"column":2},"end":{"line":252,"column":3}}],"line":247},"11":{"loc":{"start":{"line":247,"column":6},"end":{"line":247,"column":75}},"type":"binary-expr","locations":[{"start":{"line":247,"column":7},"end":{"line":247,"column":16}},{"start":{"line":247,"column":20},"end":{"line":247,"column":35}},{"start":{"line":247,"column":41},"end":{"line":247,"column":49}},{"start":{"line":247,"column":53},"end":{"line":247,"column":74}}],"line":247},"12":{"loc":{"start":{"line":253,"column":2},"end":{"line":283,"column":3}},"type":"if","locations":[{"start":{"line":253,"column":2},"end":{"line":283,"column":3}},{"start":{"line":253,"column":2},"end":{"line":283,"column":3}}],"line":253},"13":{"loc":{"start":{"line":253,"column":6},"end":{"line":253,"column":41}},"type":"binary-expr","locations":[{"start":{"line":253,"column":6},"end":{"line":253,"column":14}},{"start":{"line":253,"column":18},"end":{"line":253,"column":41}}],"line":253},"14":{"loc":{"start":{"line":260,"column":6},"end":{"line":265,"column":7}},"type":"if","locations":[{"start":{"line":260,"column":6},"end":{"line":265,"column":7}},{"start":{"line":260,"column":6},"end":{"line":265,"column":7}}],"line":260},"15":{"loc":{"start":{"line":261,"column":8},"end":{"line":262,"column":47}},"type":"binary-expr","locations":[{"start":{"line":261,"column":8},"end":{"line":261,"column":45}},{"start":{"line":262,"column":8},"end":{"line":262,"column":47}}],"line":261},"16":{"loc":{"start":{"line":274,"column":6},"end":{"line":277,"column":7}},"type":"if","locations":[{"start":{"line":274,"column":6},"end":{"line":277,"column":7}},{"start":{"line":274,"column":6},"end":{"line":277,"column":7}}],"line":274},"17":{"loc":{"start":{"line":281,"column":9},"end":{"line":283,"column":3}},"type":"if","locations":[{"start":{"line":281,"column":9},"end":{"line":283,"column":3}},{"start":{"line":281,"column":9},"end":{"line":283,"column":3}}],"line":281},"18":{"loc":{"start":{"line":281,"column":13},"end":{"line":281,"column":49}},"type":"binary-expr","locations":[{"start":{"line":281,"column":13},"end":{"line":281,"column":21}},{"start":{"line":281,"column":25},"end":{"line":281,"column":49}}],"line":281},"19":{"loc":{"start":{"line":290,"column":2},"end":{"line":292,"column":3}},"type":"if","locations":[{"start":{"line":290,"column":2},"end":{"line":292,"column":3}},{"start":{"line":290,"column":2},"end":{"line":292,"column":3}}],"line":290},"20":{"loc":{"start":{"line":295,"column":2},"end":{"line":310,"column":3}},"type":"if","locations":[{"start":{"line":295,"column":2},"end":{"line":310,"column":3}},{"start":{"line":295,"column":2},"end":{"line":310,"column":3}}],"line":295}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":63,"9":63,"10":63,"11":63,"12":1,"13":62,"14":1,"15":1,"16":61,"17":66,"18":66,"19":1,"20":55,"21":55,"22":5,"23":50,"24":135,"25":399,"26":4,"27":395,"28":135,"29":4,"30":1,"31":55,"32":55,"33":53,"34":2,"35":3,"36":9,"37":1,"38":8,"39":3,"40":1,"41":10,"42":10,"43":9,"44":9,"45":42,"46":1,"47":41,"48":1,"49":25,"50":25,"51":1,"52":24,"53":21,"54":21,"55":21,"56":21,"57":1,"58":20,"59":20,"60":20,"61":20,"62":20,"63":20,"64":3,"65":1,"66":22,"67":1,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":1,"76":0,"77":0,"78":0,"79":1},"f":{"0":63,"1":66,"2":55,"3":135,"4":399,"5":55,"6":3,"7":9,"8":10,"9":9,"10":42,"11":25,"12":21,"13":0,"14":0},"b":{"0":[1,62],"1":[1,61],"2":[1,0],"3":[5,50],"4":[4,395],"5":[4,131],"6":[53,2],"7":[1,8],"8":[1,2],"9":[1,41],"10":[1,24],"11":[25,2,25,23],"12":[21,3],"13":[24,22],"14":[1,20],"15":[21,1],"16":[20,0],"17":[1,2],"18":[3,1],"19":[0,0],"20":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f741d29b9deb621def48e85b461ef2face956075"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":24},"end":{"line":3,"column":62}},"2":{"start":{"line":3,"column":34},"end":{"line":3,"column":62}},"3":{"start":{"line":4,"column":31},"end":{"line":4,"column":76}},"4":{"start":{"line":4,"column":41},"end":{"line":4,"column":76}},"5":{"start":{"line":6,"column":18},"end":{"line":17,"column":1}},"6":{"start":{"line":7,"column":30},"end":{"line":7,"column":65}},"7":{"start":{"line":9,"column":27},"end":{"line":9,"column":74}},"8":{"start":{"line":12,"column":4},"end":{"line":12,"column":53}},"9":{"start":{"line":14,"column":33},"end":{"line":14,"column":76}},"10":{"start":{"line":16,"column":33},"end":{"line":16,"column":76}},"11":{"start":{"line":19,"column":26},"end":{"line":22,"column":1}},"12":{"start":{"line":24,"column":25},"end":{"line":39,"column":1}},"13":{"start":{"line":25,"column":2},"end":{"line":38,"column":4}},"14":{"start":{"line":41,"column":23},"end":{"line":41,"column":69}},"15":{"start":{"line":43,"column":32},"end":{"line":70,"column":1}},"16":{"start":{"line":72,"column":29},"end":{"line":105,"column":1}},"17":{"start":{"line":107,"column":0},"end":{"line":114,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":24},"end":{"line":3,"column":25}},"loc":{"start":{"line":3,"column":34},"end":{"line":3,"column":62}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":4,"column":31},"end":{"line":4,"column":32}},"loc":{"start":{"line":4,"column":41},"end":{"line":4,"column":76}},"line":4},"2":{"name":"(anonymous_2)","decl":{"start":{"line":7,"column":20},"end":{"line":7,"column":21}},"loc":{"start":{"line":7,"column":30},"end":{"line":7,"column":65}},"line":7},"3":{"name":"(anonymous_3)","decl":{"start":{"line":9,"column":17},"end":{"line":9,"column":18}},"loc":{"start":{"line":9,"column":27},"end":{"line":9,"column":74}},"line":9},"4":{"name":"(anonymous_4)","decl":{"start":{"line":11,"column":23},"end":{"line":11,"column":24}},"loc":{"start":{"line":12,"column":4},"end":{"line":12,"column":53}},"line":12},"5":{"name":"(anonymous_5)","decl":{"start":{"line":14,"column":23},"end":{"line":14,"column":24}},"loc":{"start":{"line":14,"column":33},"end":{"line":14,"column":76}},"line":14},"6":{"name":"(anonymous_6)","decl":{"start":{"line":16,"column":23},"end":{"line":16,"column":24}},"loc":{"start":{"line":16,"column":33},"end":{"line":16,"column":76}},"line":16},"7":{"name":"(anonymous_7)","decl":{"start":{"line":24,"column":25},"end":{"line":24,"column":26}},"loc":{"start":{"line":24,"column":33},"end":{"line":39,"column":1}},"line":24}},"branchMap":{},"s":{"0":1,"1":1,"2":10,"3":1,"4":4,"5":1,"6":7,"7":3,"8":2,"9":1,"10":1,"11":1,"12":1,"13":2,"14":1,"15":1,"16":1,"17":1},"f":{"0":10,"1":4,"2":7,"3":3,"4":2,"5":1,"6":1,"7":2},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"b176ca69908af741c3d7f58ef82abfcb9a4cda32"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight\\transform.js","statementMap":{"0":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":22},"end":{"line":4,"column":51}},"3":{"start":{"line":11,"column":4},"end":{"line":11,"column":23}},"4":{"start":{"line":24,"column":4},"end":{"line":24,"column":31}},"5":{"start":{"line":32,"column":4},"end":{"line":32,"column":21}},"6":{"start":{"line":38,"column":32},"end":{"line":81,"column":1}},"7":{"start":{"line":39,"column":24},"end":{"line":43,"column":3}},"8":{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},"9":{"start":{"line":45,"column":4},"end":{"line":45,"column":65}},"10":{"start":{"line":48,"column":16},"end":{"line":48,"column":58}},"11":{"start":{"line":49,"column":22},"end":{"line":49,"column":42}},"12":{"start":{"line":51,"column":2},"end":{"line":56,"column":4}},"13":{"start":{"line":58,"column":20},"end":{"line":58,"column":75}},"14":{"start":{"line":59,"column":2},"end":{"line":59,"column":71}},"15":{"start":{"line":61,"column":2},"end":{"line":70,"column":3}},"16":{"start":{"line":62,"column":18},"end":{"line":62,"column":35}},"17":{"start":{"line":63,"column":18},"end":{"line":63,"column":34}},"18":{"start":{"line":64,"column":18},"end":{"line":64,"column":36}},"19":{"start":{"line":65,"column":17},"end":{"line":67,"column":39}},"20":{"start":{"line":69,"column":4},"end":{"line":69,"column":38}},"21":{"start":{"line":72,"column":19},"end":{"line":72,"column":41}},"22":{"start":{"line":73,"column":2},"end":{"line":73,"column":58}},"23":{"start":{"line":74,"column":2},"end":{"line":74,"column":61}},"24":{"start":{"line":75,"column":2},"end":{"line":78,"column":4}},"25":{"start":{"line":79,"column":2},"end":{"line":79,"column":64}},"26":{"start":{"line":80,"column":2},"end":{"line":80,"column":18}},"27":{"start":{"line":88,"column":29},"end":{"line":138,"column":1}},"28":{"start":{"line":89,"column":24},"end":{"line":89,"column":77}},"29":{"start":{"line":90,"column":20},"end":{"line":90,"column":63}},"30":{"start":{"line":91,"column":2},"end":{"line":93,"column":3}},"31":{"start":{"line":92,"column":4},"end":{"line":92,"column":69}},"32":{"start":{"line":95,"column":16},"end":{"line":95,"column":68}},"33":{"start":{"line":96,"column":2},"end":{"line":98,"column":3}},"34":{"start":{"line":97,"column":4},"end":{"line":97,"column":67}},"35":{"start":{"line":100,"column":15},"end":{"line":100,"column":51}},"36":{"start":{"line":102,"column":16},"end":{"line":102,"column":55}},"37":{"start":{"line":103,"column":22},"end":{"line":103,"column":42}},"38":{"start":{"line":105,"column":2},"end":{"line":110,"column":4}},"39":{"start":{"line":112,"column":21},"end":{"line":112,"column":77}},"40":{"start":{"line":113,"column":2},"end":{"line":113,"column":72}},"41":{"start":{"line":114,"column":2},"end":{"line":114,"column":50}},"42":{"start":{"line":117,"column":2},"end":{"line":121,"column":3}},"43":{"start":{"line":118,"column":4},"end":{"line":118,"column":51}},"44":{"start":{"line":120,"column":4},"end":{"line":120,"column":51}},"45":{"start":{"line":123,"column":26},"end":{"line":126,"column":3}},"46":{"start":{"line":129,"column":19},"end":{"line":129,"column":41}},"47":{"start":{"line":130,"column":2},"end":{"line":130,"column":58}},"48":{"start":{"line":131,"column":2},"end":{"line":131,"column":64}},"49":{"start":{"line":132,"column":2},"end":{"line":135,"column":4}},"50":{"start":{"line":136,"column":2},"end":{"line":136,"column":39}},"51":{"start":{"line":137,"column":2},"end":{"line":137,"column":18}},"52":{"start":{"line":146,"column":29},"end":{"line":212,"column":1}},"53":{"start":{"line":149,"column":16},"end":{"line":149,"column":53}},"54":{"start":{"line":150,"column":2},"end":{"line":152,"column":3}},"55":{"start":{"line":151,"column":4},"end":{"line":151,"column":67}},"56":{"start":{"line":154,"column":17},"end":{"line":158,"column":3}},"57":{"start":{"line":160,"column":23},"end":{"line":165,"column":3}},"58":{"start":{"line":166,"column":2},"end":{"line":168,"column":3}},"59":{"start":{"line":167,"column":4},"end":{"line":167,"column":79}},"60":{"start":{"line":169,"column":26},"end":{"line":174,"column":3}},"61":{"start":{"line":175,"column":2},"end":{"line":180,"column":3}},"62":{"start":{"line":176,"column":4},"end":{"line":179,"column":6}},"63":{"start":{"line":182,"column":19},"end":{"line":185,"column":3}},"64":{"start":{"line":186,"column":2},"end":{"line":188,"column":3}},"65":{"start":{"line":187,"column":4},"end":{"line":187,"column":35}},"66":{"start":{"line":190,"column":16},"end":{"line":190,"column":18}},"67":{"start":{"line":191,"column":2},"end":{"line":191,"column":70}},"68":{"start":{"line":193,"column":19},"end":{"line":193,"column":41}},"69":{"start":{"line":194,"column":2},"end":{"line":194,"column":31}},"70":{"start":{"line":195,"column":2},"end":{"line":195,"column":59}},"71":{"start":{"line":196,"column":2},"end":{"line":196,"column":61}},"72":{"start":{"line":197,"column":2},"end":{"line":202,"column":4}},"73":{"start":{"line":204,"column":2},"end":{"line":206,"column":3}},"74":{"start":{"line":205,"column":4},"end":{"line":205,"column":52}},"75":{"start":{"line":208,"column":2},"end":{"line":210,"column":3}},"76":{"start":{"line":209,"column":4},"end":{"line":209,"column":57}},"77":{"start":{"line":211,"column":2},"end":{"line":211,"column":18}},"78":{"start":{"line":217,"column":16},"end":{"line":242,"column":1}},"79":{"start":{"line":218,"column":35},"end":{"line":218,"column":40}},"80":{"start":{"line":219,"column":2},"end":{"line":224,"column":3}},"81":{"start":{"line":220,"column":4},"end":{"line":223,"column":6}},"82":{"start":{"line":225,"column":22},"end":{"line":225,"column":48}},"83":{"start":{"line":228,"column":2},"end":{"line":240,"column":3}},"84":{"start":{"line":230,"column":6},"end":{"line":230,"column":63}},"85":{"start":{"line":231,"column":6},"end":{"line":231,"column":12}},"86":{"start":{"line":233,"column":6},"end":{"line":233,"column":66}},"87":{"start":{"line":234,"column":6},"end":{"line":234,"column":12}},"88":{"start":{"line":236,"column":6},"end":{"line":236,"column":60}},"89":{"start":{"line":237,"column":6},"end":{"line":237,"column":12}},"90":{"start":{"line":239,"column":6},"end":{"line":239,"column":78}},"91":{"start":{"line":241,"column":2},"end":{"line":241,"column":18}},"92":{"start":{"line":244,"column":26},"end":{"line":272,"column":1}},"93":{"start":{"line":245,"column":2},"end":{"line":248,"column":3}},"94":{"start":{"line":246,"column":23},"end":{"line":246,"column":75}},"95":{"start":{"line":247,"column":4},"end":{"line":247,"column":24}},"96":{"start":{"line":250,"column":19},"end":{"line":270,"column":3}},"97":{"start":{"line":252,"column":6},"end":{"line":268,"column":7}},"98":{"start":{"line":253,"column":8},"end":{"line":257,"column":10}},"99":{"start":{"line":259,"column":8},"end":{"line":267,"column":10}},"100":{"start":{"line":271,"column":2},"end":{"line":271,"column":18}},"101":{"start":{"line":274,"column":0},"end":{"line":274,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":38,"column":32},"end":{"line":38,"column":33}},"loc":{"start":{"line":38,"column":57},"end":{"line":81,"column":1}},"line":38},"1":{"name":"(anonymous_1)","decl":{"start":{"line":88,"column":29},"end":{"line":88,"column":30}},"loc":{"start":{"line":88,"column":60},"end":{"line":138,"column":1}},"line":88},"2":{"name":"(anonymous_2)","decl":{"start":{"line":146,"column":29},"end":{"line":146,"column":30}},"loc":{"start":{"line":146,"column":54},"end":{"line":212,"column":1}},"line":146},"3":{"name":"(anonymous_3)","decl":{"start":{"line":217,"column":16},"end":{"line":217,"column":17}},"loc":{"start":{"line":217,"column":31},"end":{"line":242,"column":1}},"line":217},"4":{"name":"(anonymous_4)","decl":{"start":{"line":244,"column":26},"end":{"line":244,"column":27}},"loc":{"start":{"line":244,"column":42},"end":{"line":272,"column":1}},"line":244},"5":{"name":"(anonymous_5)","decl":{"start":{"line":251,"column":15},"end":{"line":251,"column":16}},"loc":{"start":{"line":251,"column":30},"end":{"line":269,"column":5}},"line":251}},"branchMap":{"0":{"loc":{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},"type":"if","locations":[{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},{"start":{"line":44,"column":2},"end":{"line":46,"column":3}}],"line":44},"1":{"loc":{"start":{"line":61,"column":2},"end":{"line":70,"column":3}},"type":"if","locations":[{"start":{"line":61,"column":2},"end":{"line":70,"column":3}},{"start":{"line":61,"column":2},"end":{"line":70,"column":3}}],"line":61},"2":{"loc":{"start":{"line":65,"column":17},"end":{"line":67,"column":39}},"type":"cond-expr","locations":[{"start":{"line":66,"column":8},"end":{"line":66,"column":48}},{"start":{"line":67,"column":8},"end":{"line":67,"column":39}}],"line":65},"3":{"loc":{"start":{"line":66,"column":11},"end":{"line":66,"column":22}},"type":"binary-expr","locations":[{"start":{"line":66,"column":11},"end":{"line":66,"column":16}},{"start":{"line":66,"column":20},"end":{"line":66,"column":22}}],"line":66},"4":{"loc":{"start":{"line":66,"column":35},"end":{"line":66,"column":46}},"type":"binary-expr","locations":[{"start":{"line":66,"column":35},"end":{"line":66,"column":40}},{"start":{"line":66,"column":44},"end":{"line":66,"column":46}}],"line":66},"5":{"loc":{"start":{"line":67,"column":11},"end":{"line":67,"column":22}},"type":"binary-expr","locations":[{"start":{"line":67,"column":11},"end":{"line":67,"column":16}},{"start":{"line":67,"column":20},"end":{"line":67,"column":22}}],"line":67},"6":{"loc":{"start":{"line":67,"column":26},"end":{"line":67,"column":37}},"type":"binary-expr","locations":[{"start":{"line":67,"column":26},"end":{"line":67,"column":31}},{"start":{"line":67,"column":35},"end":{"line":67,"column":37}}],"line":67},"7":{"loc":{"start":{"line":91,"column":2},"end":{"line":93,"column":3}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":93,"column":3}},{"start":{"line":91,"column":2},"end":{"line":93,"column":3}}],"line":91},"8":{"loc":{"start":{"line":96,"column":2},"end":{"line":98,"column":3}},"type":"if","locations":[{"start":{"line":96,"column":2},"end":{"line":98,"column":3}},{"start":{"line":96,"column":2},"end":{"line":98,"column":3}}],"line":96},"9":{"loc":{"start":{"line":117,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":121,"column":3}},{"start":{"line":117,"column":2},"end":{"line":121,"column":3}}],"line":117},"10":{"loc":{"start":{"line":150,"column":2},"end":{"line":152,"column":3}},"type":"if","locations":[{"start":{"line":150,"column":2},"end":{"line":152,"column":3}},{"start":{"line":150,"column":2},"end":{"line":152,"column":3}}],"line":150},"11":{"loc":{"start":{"line":166,"column":2},"end":{"line":168,"column":3}},"type":"if","locations":[{"start":{"line":166,"column":2},"end":{"line":168,"column":3}},{"start":{"line":166,"column":2},"end":{"line":168,"column":3}}],"line":166},"12":{"loc":{"start":{"line":166,"column":6},"end":{"line":166,"column":48}},"type":"binary-expr","locations":[{"start":{"line":166,"column":6},"end":{"line":166,"column":19}},{"start":{"line":166,"column":23},"end":{"line":166,"column":48}}],"line":166},"13":{"loc":{"start":{"line":175,"column":2},"end":{"line":180,"column":3}},"type":"if","locations":[{"start":{"line":175,"column":2},"end":{"line":180,"column":3}},{"start":{"line":175,"column":2},"end":{"line":180,"column":3}}],"line":175},"14":{"loc":{"start":{"line":175,"column":6},"end":{"line":175,"column":54}},"type":"binary-expr","locations":[{"start":{"line":175,"column":6},"end":{"line":175,"column":22}},{"start":{"line":175,"column":26},"end":{"line":175,"column":54}}],"line":175},"15":{"loc":{"start":{"line":186,"column":2},"end":{"line":188,"column":3}},"type":"if","locations":[{"start":{"line":186,"column":2},"end":{"line":188,"column":3}},{"start":{"line":186,"column":2},"end":{"line":188,"column":3}}],"line":186},"16":{"loc":{"start":{"line":204,"column":2},"end":{"line":206,"column":3}},"type":"if","locations":[{"start":{"line":204,"column":2},"end":{"line":206,"column":3}},{"start":{"line":204,"column":2},"end":{"line":206,"column":3}}],"line":204},"17":{"loc":{"start":{"line":208,"column":2},"end":{"line":210,"column":3}},"type":"if","locations":[{"start":{"line":208,"column":2},"end":{"line":210,"column":3}},{"start":{"line":208,"column":2},"end":{"line":210,"column":3}}],"line":208},"18":{"loc":{"start":{"line":219,"column":2},"end":{"line":224,"column":3}},"type":"if","locations":[{"start":{"line":219,"column":2},"end":{"line":224,"column":3}},{"start":{"line":219,"column":2},"end":{"line":224,"column":3}}],"line":219},"19":{"loc":{"start":{"line":228,"column":2},"end":{"line":240,"column":3}},"type":"switch","locations":[{"start":{"line":229,"column":4},"end":{"line":231,"column":12}},{"start":{"line":232,"column":4},"end":{"line":234,"column":12}},{"start":{"line":235,"column":4},"end":{"line":237,"column":12}},{"start":{"line":238,"column":4},"end":{"line":239,"column":78}}],"line":228},"20":{"loc":{"start":{"line":245,"column":2},"end":{"line":248,"column":3}},"type":"if","locations":[{"start":{"line":245,"column":2},"end":{"line":248,"column":3}},{"start":{"line":245,"column":2},"end":{"line":248,"column":3}}],"line":245},"21":{"loc":{"start":{"line":245,"column":6},"end":{"line":245,"column":50}},"type":"binary-expr","locations":[{"start":{"line":245,"column":6},"end":{"line":245,"column":28}},{"start":{"line":245,"column":32},"end":{"line":245,"column":50}}],"line":245},"22":{"loc":{"start":{"line":261,"column":10},"end":{"line":265,"column":17}},"type":"cond-expr","locations":[{"start":{"line":262,"column":14},"end":{"line":262,"column":35}},{"start":{"line":263,"column":14},"end":{"line":265,"column":17}}],"line":261},"23":{"loc":{"start":{"line":263,"column":14},"end":{"line":265,"column":17}},"type":"cond-expr","locations":[{"start":{"line":264,"column":14},"end":{"line":264,"column":24}},{"start":{"line":265,"column":14},"end":{"line":265,"column":17}}],"line":263},"24":{"loc":{"start":{"line":266,"column":10},"end":{"line":266,"column":69}},"type":"binary-expr","locations":[{"start":{"line":266,"column":10},"end":{"line":266,"column":23}},{"start":{"line":266,"column":27},"end":{"line":266,"column":69}}],"line":266}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":6,"8":6,"9":1,"10":5,"11":5,"12":5,"13":5,"14":5,"15":5,"16":1,"17":1,"18":1,"19":1,"20":1,"21":5,"22":5,"23":5,"24":5,"25":5,"26":5,"27":1,"28":2,"29":2,"30":2,"31":0,"32":2,"33":2,"34":0,"35":2,"36":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":2,"43":1,"44":1,"45":2,"46":2,"47":2,"48":2,"49":2,"50":2,"51":2,"52":1,"53":3,"54":3,"55":0,"56":3,"57":3,"58":3,"59":0,"60":3,"61":3,"62":0,"63":3,"64":3,"65":2,"66":3,"67":3,"68":3,"69":3,"70":3,"71":3,"72":3,"73":3,"74":2,"75":3,"76":3,"77":3,"78":1,"79":11,"80":11,"81":0,"82":11,"83":11,"84":6,"85":5,"86":2,"87":2,"88":3,"89":3,"90":0,"91":10,"92":1,"93":1,"94":0,"95":0,"96":1,"97":2,"98":2,"99":0,"100":1,"101":1},"f":{"0":6,"1":2,"2":3,"3":11,"4":1,"5":2},"b":{"0":[1,5],"1":[1,4],"2":[0,1],"3":[0,0],"4":[0,0],"5":[1,0],"6":[1,0],"7":[0,2],"8":[0,2],"9":[1,1],"10":[0,3],"11":[0,3],"12":[3,3],"13":[0,3],"14":[3,3],"15":[2,1],"16":[2,1],"17":[3,0],"18":[0,11],"19":[6,2,3,0],"20":[0,1],"21":[1,1],"22":[0,0],"23":[0,0],"24":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"22c2139d7b02c449fc5b1754b47a83b6eb1bcfcc"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight\\util.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":30}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":40},"end":{"line":3,"column":59}},"3":{"start":{"line":7,"column":4},"end":{"line":7,"column":19}},"4":{"start":{"line":8,"column":4},"end":{"line":8,"column":43}},"5":{"start":{"line":12,"column":20},"end":{"line":39,"column":1}},"6":{"start":{"line":14,"column":2},"end":{"line":33,"column":3}},"7":{"start":{"line":15,"column":4},"end":{"line":24,"column":6}},"8":{"start":{"line":26,"column":21},"end":{"line":26,"column":23}},"9":{"start":{"line":27,"column":22},"end":{"line":27,"column":25}},"10":{"start":{"line":28,"column":4},"end":{"line":31,"column":5}},"11":{"start":{"line":29,"column":6},"end":{"line":29,"column":49}},"12":{"start":{"line":30,"column":6},"end":{"line":30,"column":42}},"13":{"start":{"line":32,"column":4},"end":{"line":32,"column":79}},"14":{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},"15":{"start":{"line":36,"column":4},"end":{"line":36,"column":57}},"16":{"start":{"line":38,"column":2},"end":{"line":38,"column":14}},"17":{"start":{"line":41,"column":20},"end":{"line":70,"column":1}},"18":{"start":{"line":43,"column":2},"end":{"line":64,"column":3}},"19":{"start":{"line":44,"column":4},"end":{"line":55,"column":6}},"20":{"start":{"line":57,"column":21},"end":{"line":57,"column":23}},"21":{"start":{"line":58,"column":22},"end":{"line":58,"column":25}},"22":{"start":{"line":59,"column":4},"end":{"line":62,"column":5}},"23":{"start":{"line":60,"column":6},"end":{"line":60,"column":49}},"24":{"start":{"line":61,"column":6},"end":{"line":61,"column":42}},"25":{"start":{"line":63,"column":4},"end":{"line":63,"column":79}},"26":{"start":{"line":66,"column":2},"end":{"line":68,"column":3}},"27":{"start":{"line":67,"column":4},"end":{"line":67,"column":57}},"28":{"start":{"line":69,"column":2},"end":{"line":69,"column":40}},"29":{"start":{"line":72,"column":20},"end":{"line":104,"column":1}},"30":{"start":{"line":74,"column":2},"end":{"line":98,"column":3}},"31":{"start":{"line":75,"column":4},"end":{"line":89,"column":6}},"32":{"start":{"line":91,"column":21},"end":{"line":91,"column":23}},"33":{"start":{"line":92,"column":22},"end":{"line":92,"column":25}},"34":{"start":{"line":93,"column":4},"end":{"line":96,"column":5}},"35":{"start":{"line":94,"column":6},"end":{"line":94,"column":49}},"36":{"start":{"line":95,"column":6},"end":{"line":95,"column":42}},"37":{"start":{"line":97,"column":4},"end":{"line":97,"column":79}},"38":{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},"39":{"start":{"line":101,"column":4},"end":{"line":101,"column":57}},"40":{"start":{"line":103,"column":2},"end":{"line":103,"column":40}},"41":{"start":{"line":114,"column":34},"end":{"line":137,"column":1}},"42":{"start":{"line":115,"column":24},"end":{"line":115,"column":26}},"43":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"44":{"start":{"line":118,"column":4},"end":{"line":122,"column":7}},"45":{"start":{"line":119,"column":6},"end":{"line":121,"column":7}},"46":{"start":{"line":120,"column":8},"end":{"line":120,"column":42}},"47":{"start":{"line":123,"column":4},"end":{"line":123,"column":25}},"48":{"start":{"line":126,"column":23},"end":{"line":126,"column":45}},"49":{"start":{"line":127,"column":2},"end":{"line":135,"column":5}},"50":{"start":{"line":128,"column":4},"end":{"line":134,"column":5}},"51":{"start":{"line":129,"column":6},"end":{"line":129,"column":40}},"52":{"start":{"line":130,"column":11},"end":{"line":134,"column":5}},"53":{"start":{"line":131,"column":6},"end":{"line":131,"column":51}},"54":{"start":{"line":133,"column":6},"end":{"line":133,"column":41}},"55":{"start":{"line":136,"column":2},"end":{"line":136,"column":23}},"56":{"start":{"line":139,"column":30},"end":{"line":148,"column":1}},"57":{"start":{"line":140,"column":17},"end":{"line":140,"column":19}},"58":{"start":{"line":141,"column":2},"end":{"line":146,"column":5}},"59":{"start":{"line":142,"column":4},"end":{"line":144,"column":5}},"60":{"start":{"line":143,"column":6},"end":{"line":143,"column":73}},"61":{"start":{"line":145,"column":4},"end":{"line":145,"column":30}},"62":{"start":{"line":147,"column":2},"end":{"line":147,"column":16}},"63":{"start":{"line":150,"column":0},"end":{"line":157,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":2},"end":{"line":6,"column":3}},"loc":{"start":{"line":6,"column":35},"end":{"line":9,"column":3}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":20},"end":{"line":12,"column":21}},"loc":{"start":{"line":12,"column":49},"end":{"line":39,"column":1}},"line":12},"2":{"name":"(anonymous_2)","decl":{"start":{"line":41,"column":20},"end":{"line":41,"column":21}},"loc":{"start":{"line":41,"column":47},"end":{"line":70,"column":1}},"line":41},"3":{"name":"(anonymous_3)","decl":{"start":{"line":72,"column":20},"end":{"line":72,"column":21}},"loc":{"start":{"line":72,"column":47},"end":{"line":104,"column":1}},"line":72},"4":{"name":"(anonymous_4)","decl":{"start":{"line":114,"column":34},"end":{"line":114,"column":35}},"loc":{"start":{"line":114,"column":72},"end":{"line":137,"column":1}},"line":114},"5":{"name":"(anonymous_5)","decl":{"start":{"line":118,"column":33},"end":{"line":118,"column":34}},"loc":{"start":{"line":118,"column":40},"end":{"line":122,"column":5}},"line":118},"6":{"name":"(anonymous_6)","decl":{"start":{"line":127,"column":31},"end":{"line":127,"column":32}},"loc":{"start":{"line":127,"column":38},"end":{"line":135,"column":3}},"line":127},"7":{"name":"(anonymous_7)","decl":{"start":{"line":139,"column":30},"end":{"line":139,"column":31}},"loc":{"start":{"line":139,"column":68},"end":{"line":148,"column":1}},"line":139},"8":{"name":"(anonymous_8)","decl":{"start":{"line":141,"column":23},"end":{"line":141,"column":24}},"loc":{"start":{"line":141,"column":30},"end":{"line":146,"column":3}},"line":141}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":4},"end":{"line":31,"column":5}},"type":"if","locations":[{"start":{"line":28,"column":4},"end":{"line":31,"column":5}},{"start":{"line":28,"column":4},"end":{"line":31,"column":5}}],"line":28},"1":{"loc":{"start":{"line":28,"column":8},"end":{"line":28,"column":45}},"type":"binary-expr","locations":[{"start":{"line":28,"column":8},"end":{"line":28,"column":22}},{"start":{"line":28,"column":26},"end":{"line":28,"column":45}}],"line":28},"2":{"loc":{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},{"start":{"line":35,"column":2},"end":{"line":37,"column":3}}],"line":35},"3":{"loc":{"start":{"line":35,"column":6},"end":{"line":35,"column":48}},"type":"binary-expr","locations":[{"start":{"line":35,"column":6},"end":{"line":35,"column":11}},{"start":{"line":35,"column":15},"end":{"line":35,"column":25}},{"start":{"line":35,"column":29},"end":{"line":35,"column":48}}],"line":35},"4":{"loc":{"start":{"line":59,"column":4},"end":{"line":62,"column":5}},"type":"if","locations":[{"start":{"line":59,"column":4},"end":{"line":62,"column":5}},{"start":{"line":59,"column":4},"end":{"line":62,"column":5}}],"line":59},"5":{"loc":{"start":{"line":59,"column":8},"end":{"line":59,"column":45}},"type":"binary-expr","locations":[{"start":{"line":59,"column":8},"end":{"line":59,"column":22}},{"start":{"line":59,"column":26},"end":{"line":59,"column":45}}],"line":59},"6":{"loc":{"start":{"line":66,"column":2},"end":{"line":68,"column":3}},"type":"if","locations":[{"start":{"line":66,"column":2},"end":{"line":68,"column":3}},{"start":{"line":66,"column":2},"end":{"line":68,"column":3}}],"line":66},"7":{"loc":{"start":{"line":66,"column":6},"end":{"line":66,"column":48}},"type":"binary-expr","locations":[{"start":{"line":66,"column":6},"end":{"line":66,"column":11}},{"start":{"line":66,"column":15},"end":{"line":66,"column":25}},{"start":{"line":66,"column":29},"end":{"line":66,"column":48}}],"line":66},"8":{"loc":{"start":{"line":93,"column":4},"end":{"line":96,"column":5}},"type":"if","locations":[{"start":{"line":93,"column":4},"end":{"line":96,"column":5}},{"start":{"line":93,"column":4},"end":{"line":96,"column":5}}],"line":93},"9":{"loc":{"start":{"line":93,"column":8},"end":{"line":93,"column":45}},"type":"binary-expr","locations":[{"start":{"line":93,"column":8},"end":{"line":93,"column":22}},{"start":{"line":93,"column":26},"end":{"line":93,"column":45}}],"line":93},"10":{"loc":{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},"type":"if","locations":[{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},{"start":{"line":100,"column":2},"end":{"line":102,"column":3}}],"line":100},"11":{"loc":{"start":{"line":100,"column":6},"end":{"line":100,"column":48}},"type":"binary-expr","locations":[{"start":{"line":100,"column":6},"end":{"line":100,"column":11}},{"start":{"line":100,"column":15},"end":{"line":100,"column":25}},{"start":{"line":100,"column":29},"end":{"line":100,"column":48}}],"line":100},"12":{"loc":{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":124,"column":3}},{"start":{"line":117,"column":2},"end":{"line":124,"column":3}}],"line":117},"13":{"loc":{"start":{"line":117,"column":6},"end":{"line":117,"column":55}},"type":"binary-expr","locations":[{"start":{"line":117,"column":6},"end":{"line":117,"column":16}},{"start":{"line":117,"column":20},"end":{"line":117,"column":55}}],"line":117},"14":{"loc":{"start":{"line":119,"column":6},"end":{"line":121,"column":7}},"type":"if","locations":[{"start":{"line":119,"column":6},"end":{"line":121,"column":7}},{"start":{"line":119,"column":6},"end":{"line":121,"column":7}}],"line":119},"15":{"loc":{"start":{"line":128,"column":4},"end":{"line":134,"column":5}},"type":"if","locations":[{"start":{"line":128,"column":4},"end":{"line":134,"column":5}},{"start":{"line":128,"column":4},"end":{"line":134,"column":5}}],"line":128},"16":{"loc":{"start":{"line":130,"column":11},"end":{"line":134,"column":5}},"type":"if","locations":[{"start":{"line":130,"column":11},"end":{"line":134,"column":5}},{"start":{"line":130,"column":11},"end":{"line":134,"column":5}}],"line":130},"17":{"loc":{"start":{"line":142,"column":4},"end":{"line":144,"column":5}},"type":"if","locations":[{"start":{"line":142,"column":4},"end":{"line":144,"column":5}},{"start":{"line":142,"column":4},"end":{"line":144,"column":5}}],"line":142}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":2,"7":2,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":2,"15":0,"16":2,"17":1,"18":1,"19":1,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":1,"27":0,"28":1,"29":1,"30":1,"31":1,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":1,"39":0,"40":1,"41":1,"42":7,"43":7,"44":5,"45":28,"46":28,"47":5,"48":2,"49":2,"50":16,"51":13,"52":3,"53":2,"54":1,"55":2,"56":1,"57":11,"58":11,"59":17,"60":0,"61":17,"62":11,"63":1},"f":{"0":1,"1":2,"2":1,"3":1,"4":7,"5":28,"6":16,"7":11,"8":17},"b":{"0":[0,0],"1":[0,0],"2":[0,2],"3":[2,2,2],"4":[0,0],"5":[0,0],"6":[0,1],"7":[1,1,1],"8":[0,0],"9":[0,0],"10":[0,1],"11":[1,1,1],"12":[5,2],"13":[7,7],"14":[28,0],"15":[13,3],"16":[2,1],"17":[0,17]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d6d84f8e4d871ff22703a43609e159efb7d16078"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight_px\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight_px\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":22},"end":{"line":3,"column":52}},"2":{"start":{"line":4,"column":18},"end":{"line":8,"column":1}},"3":{"start":{"line":10,"column":26},"end":{"line":14,"column":1}},"4":{"start":{"line":16,"column":23},"end":{"line":16,"column":69}},"5":{"start":{"line":18,"column":30},"end":{"line":48,"column":1}},"6":{"start":{"line":50,"column":33},"end":{"line":79,"column":1}},"7":{"start":{"line":81,"column":0},"end":{"line":88,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"eabc04a59a688b1f579dd9b5b1e726640e71e24f"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight_px\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight_px\\transform.js","statementMap":{"0":{"start":{"line":2,"column":22},"end":{"line":2,"column":51}},"1":{"start":{"line":17,"column":4},"end":{"line":17,"column":25}},"2":{"start":{"line":24,"column":4},"end":{"line":24,"column":21}},"3":{"start":{"line":32,"column":4},"end":{"line":32,"column":23}},"4":{"start":{"line":37,"column":32},"end":{"line":100,"column":1}},"5":{"start":{"line":38,"column":17},"end":{"line":38,"column":60}},"6":{"start":{"line":39,"column":2},"end":{"line":44,"column":3}},"7":{"start":{"line":40,"column":4},"end":{"line":43,"column":6}},"8":{"start":{"line":46,"column":19},"end":{"line":46,"column":41}},"9":{"start":{"line":47,"column":2},"end":{"line":50,"column":4}},"10":{"start":{"line":52,"column":33},"end":{"line":52,"column":75}},"11":{"start":{"line":54,"column":16},"end":{"line":54,"column":58}},"12":{"start":{"line":55,"column":15},"end":{"line":58,"column":4}},"13":{"start":{"line":59,"column":2},"end":{"line":63,"column":3}},"14":{"start":{"line":60,"column":27},"end":{"line":60,"column":42}},"15":{"start":{"line":61,"column":4},"end":{"line":61,"column":30}},"16":{"start":{"line":62,"column":4},"end":{"line":62,"column":29}},"17":{"start":{"line":64,"column":25},"end":{"line":64,"column":27}},"18":{"start":{"line":65,"column":2},"end":{"line":70,"column":4}},"19":{"start":{"line":72,"column":30},"end":{"line":77,"column":3}},"20":{"start":{"line":78,"column":2},"end":{"line":78,"column":79}},"21":{"start":{"line":79,"column":2},"end":{"line":84,"column":4}},"22":{"start":{"line":86,"column":2},"end":{"line":92,"column":3}},"23":{"start":{"line":88,"column":4},"end":{"line":88,"column":60}},"24":{"start":{"line":89,"column":4},"end":{"line":89,"column":64}},"25":{"start":{"line":90,"column":4},"end":{"line":90,"column":63}},"26":{"start":{"line":91,"column":4},"end":{"line":91,"column":20}},"27":{"start":{"line":95,"column":2},"end":{"line":95,"column":30}},"28":{"start":{"line":96,"column":2},"end":{"line":96,"column":59}},"29":{"start":{"line":97,"column":2},"end":{"line":97,"column":47}},"30":{"start":{"line":98,"column":2},"end":{"line":98,"column":61}},"31":{"start":{"line":99,"column":2},"end":{"line":99,"column":18}},"32":{"start":{"line":105,"column":29},"end":{"line":190,"column":1}},"33":{"start":{"line":106,"column":17},"end":{"line":106,"column":60}},"34":{"start":{"line":107,"column":2},"end":{"line":109,"column":3}},"35":{"start":{"line":108,"column":4},"end":{"line":108,"column":78}},"36":{"start":{"line":111,"column":41},"end":{"line":115,"column":3}},"37":{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},"38":{"start":{"line":117,"column":4},"end":{"line":117,"column":60}},"39":{"start":{"line":120,"column":18},"end":{"line":120,"column":62}},"40":{"start":{"line":121,"column":2},"end":{"line":123,"column":3}},"41":{"start":{"line":122,"column":4},"end":{"line":122,"column":64}},"42":{"start":{"line":125,"column":40},"end":{"line":129,"column":3}},"43":{"start":{"line":131,"column":16},"end":{"line":131,"column":55}},"44":{"start":{"line":132,"column":25},"end":{"line":132,"column":27}},"45":{"start":{"line":133,"column":2},"end":{"line":138,"column":4}},"46":{"start":{"line":140,"column":27},"end":{"line":145,"column":3}},"47":{"start":{"line":146,"column":2},"end":{"line":146,"column":76}},"48":{"start":{"line":147,"column":2},"end":{"line":153,"column":4}},"49":{"start":{"line":154,"column":2},"end":{"line":154,"column":50}},"50":{"start":{"line":156,"column":2},"end":{"line":176,"column":3}},"51":{"start":{"line":158,"column":44},"end":{"line":162,"column":5}},"52":{"start":{"line":163,"column":4},"end":{"line":165,"column":5}},"53":{"start":{"line":164,"column":6},"end":{"line":164,"column":79}},"54":{"start":{"line":168,"column":4},"end":{"line":168,"column":25}},"55":{"start":{"line":169,"column":44},"end":{"line":172,"column":5}},"56":{"start":{"line":173,"column":4},"end":{"line":175,"column":5}},"57":{"start":{"line":174,"column":6},"end":{"line":174,"column":79}},"58":{"start":{"line":179,"column":19},"end":{"line":179,"column":41}},"59":{"start":{"line":180,"column":2},"end":{"line":180,"column":58}},"60":{"start":{"line":181,"column":2},"end":{"line":184,"column":4}},"61":{"start":{"line":185,"column":2},"end":{"line":185,"column":62}},"62":{"start":{"line":186,"column":2},"end":{"line":188,"column":4}},"63":{"start":{"line":189,"column":2},"end":{"line":189,"column":18}},"64":{"start":{"line":197,"column":29},"end":{"line":233,"column":1}},"65":{"start":{"line":198,"column":16},"end":{"line":198,"column":55}},"66":{"start":{"line":201,"column":22},"end":{"line":201,"column":78}},"67":{"start":{"line":203,"column":2},"end":{"line":210,"column":3}},"68":{"start":{"line":204,"column":4},"end":{"line":209,"column":6}},"69":{"start":{"line":212,"column":2},"end":{"line":214,"column":3}},"70":{"start":{"line":213,"column":4},"end":{"line":213,"column":44}},"71":{"start":{"line":216,"column":2},"end":{"line":222,"column":4}},"72":{"start":{"line":224,"column":19},"end":{"line":224,"column":41}},"73":{"start":{"line":225,"column":2},"end":{"line":225,"column":59}},"74":{"start":{"line":226,"column":2},"end":{"line":226,"column":61}},"75":{"start":{"line":227,"column":2},"end":{"line":230,"column":4}},"76":{"start":{"line":231,"column":2},"end":{"line":231,"column":55}},"77":{"start":{"line":232,"column":2},"end":{"line":232,"column":18}},"78":{"start":{"line":238,"column":16},"end":{"line":273,"column":1}},"79":{"start":{"line":239,"column":35},"end":{"line":239,"column":40}},"80":{"start":{"line":240,"column":2},"end":{"line":245,"column":3}},"81":{"start":{"line":241,"column":4},"end":{"line":244,"column":6}},"82":{"start":{"line":247,"column":36},"end":{"line":247,"column":54}},"83":{"start":{"line":248,"column":2},"end":{"line":250,"column":3}},"84":{"start":{"line":249,"column":4},"end":{"line":249,"column":69}},"85":{"start":{"line":252,"column":2},"end":{"line":254,"column":3}},"86":{"start":{"line":253,"column":4},"end":{"line":253,"column":62}},"87":{"start":{"line":256,"column":22},"end":{"line":256,"column":48}},"88":{"start":{"line":259,"column":2},"end":{"line":271,"column":3}},"89":{"start":{"line":261,"column":6},"end":{"line":261,"column":69}},"90":{"start":{"line":262,"column":6},"end":{"line":262,"column":12}},"91":{"start":{"line":264,"column":6},"end":{"line":264,"column":60}},"92":{"start":{"line":265,"column":6},"end":{"line":265,"column":12}},"93":{"start":{"line":267,"column":6},"end":{"line":267,"column":66}},"94":{"start":{"line":268,"column":6},"end":{"line":268,"column":12}},"95":{"start":{"line":270,"column":6},"end":{"line":270,"column":78}},"96":{"start":{"line":272,"column":2},"end":{"line":272,"column":18}},"97":{"start":{"line":275,"column":26},"end":{"line":303,"column":1}},"98":{"start":{"line":276,"column":2},"end":{"line":279,"column":3}},"99":{"start":{"line":277,"column":23},"end":{"line":277,"column":75}},"100":{"start":{"line":278,"column":4},"end":{"line":278,"column":24}},"101":{"start":{"line":281,"column":19},"end":{"line":301,"column":3}},"102":{"start":{"line":283,"column":6},"end":{"line":299,"column":7}},"103":{"start":{"line":284,"column":8},"end":{"line":288,"column":10}},"104":{"start":{"line":290,"column":8},"end":{"line":298,"column":10}},"105":{"start":{"line":302,"column":2},"end":{"line":302,"column":18}},"106":{"start":{"line":305,"column":0},"end":{"line":305,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":37,"column":32},"end":{"line":37,"column":33}},"loc":{"start":{"line":37,"column":63},"end":{"line":100,"column":1}},"line":37},"1":{"name":"(anonymous_1)","decl":{"start":{"line":105,"column":29},"end":{"line":105,"column":30}},"loc":{"start":{"line":105,"column":60},"end":{"line":190,"column":1}},"line":105},"2":{"name":"(anonymous_2)","decl":{"start":{"line":197,"column":29},"end":{"line":197,"column":30}},"loc":{"start":{"line":197,"column":54},"end":{"line":233,"column":1}},"line":197},"3":{"name":"(anonymous_3)","decl":{"start":{"line":238,"column":16},"end":{"line":238,"column":17}},"loc":{"start":{"line":238,"column":31},"end":{"line":273,"column":1}},"line":238},"4":{"name":"(anonymous_4)","decl":{"start":{"line":275,"column":26},"end":{"line":275,"column":27}},"loc":{"start":{"line":275,"column":42},"end":{"line":303,"column":1}},"line":275},"5":{"name":"(anonymous_5)","decl":{"start":{"line":282,"column":15},"end":{"line":282,"column":16}},"loc":{"start":{"line":282,"column":30},"end":{"line":300,"column":5}},"line":282}},"branchMap":{"0":{"loc":{"start":{"line":39,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":39,"column":2},"end":{"line":44,"column":3}},{"start":{"line":39,"column":2},"end":{"line":44,"column":3}}],"line":39},"1":{"loc":{"start":{"line":59,"column":2},"end":{"line":63,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":63,"column":3}},{"start":{"line":59,"column":2},"end":{"line":63,"column":3}}],"line":59},"2":{"loc":{"start":{"line":59,"column":6},"end":{"line":59,"column":38}},"type":"binary-expr","locations":[{"start":{"line":59,"column":6},"end":{"line":59,"column":10}},{"start":{"line":59,"column":14},"end":{"line":59,"column":38}}],"line":59},"3":{"loc":{"start":{"line":86,"column":2},"end":{"line":92,"column":3}},"type":"if","locations":[{"start":{"line":86,"column":2},"end":{"line":92,"column":3}},{"start":{"line":86,"column":2},"end":{"line":92,"column":3}}],"line":86},"4":{"loc":{"start":{"line":107,"column":2},"end":{"line":109,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":109,"column":3}},{"start":{"line":107,"column":2},"end":{"line":109,"column":3}}],"line":107},"5":{"loc":{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},{"start":{"line":116,"column":2},"end":{"line":118,"column":3}}],"line":116},"6":{"loc":{"start":{"line":121,"column":2},"end":{"line":123,"column":3}},"type":"if","locations":[{"start":{"line":121,"column":2},"end":{"line":123,"column":3}},{"start":{"line":121,"column":2},"end":{"line":123,"column":3}}],"line":121},"7":{"loc":{"start":{"line":149,"column":22},"end":{"line":151,"column":12}},"type":"cond-expr","locations":[{"start":{"line":150,"column":8},"end":{"line":150,"column":24}},{"start":{"line":151,"column":8},"end":{"line":151,"column":12}}],"line":149},"8":{"loc":{"start":{"line":156,"column":2},"end":{"line":176,"column":3}},"type":"if","locations":[{"start":{"line":156,"column":2},"end":{"line":176,"column":3}},{"start":{"line":156,"column":2},"end":{"line":176,"column":3}}],"line":156},"9":{"loc":{"start":{"line":163,"column":4},"end":{"line":165,"column":5}},"type":"if","locations":[{"start":{"line":163,"column":4},"end":{"line":165,"column":5}},{"start":{"line":163,"column":4},"end":{"line":165,"column":5}}],"line":163},"10":{"loc":{"start":{"line":173,"column":4},"end":{"line":175,"column":5}},"type":"if","locations":[{"start":{"line":173,"column":4},"end":{"line":175,"column":5}},{"start":{"line":173,"column":4},"end":{"line":175,"column":5}}],"line":173},"11":{"loc":{"start":{"line":203,"column":2},"end":{"line":210,"column":3}},"type":"if","locations":[{"start":{"line":203,"column":2},"end":{"line":210,"column":3}},{"start":{"line":203,"column":2},"end":{"line":210,"column":3}}],"line":203},"12":{"loc":{"start":{"line":203,"column":6},"end":{"line":203,"column":52}},"type":"binary-expr","locations":[{"start":{"line":203,"column":6},"end":{"line":203,"column":20}},{"start":{"line":203,"column":24},"end":{"line":203,"column":52}}],"line":203},"13":{"loc":{"start":{"line":212,"column":2},"end":{"line":214,"column":3}},"type":"if","locations":[{"start":{"line":212,"column":2},"end":{"line":214,"column":3}},{"start":{"line":212,"column":2},"end":{"line":214,"column":3}}],"line":212},"14":{"loc":{"start":{"line":212,"column":6},"end":{"line":212,"column":60}},"type":"binary-expr","locations":[{"start":{"line":212,"column":6},"end":{"line":212,"column":24}},{"start":{"line":212,"column":28},"end":{"line":212,"column":60}}],"line":212},"15":{"loc":{"start":{"line":221,"column":19},"end":{"line":221,"column":71}},"type":"cond-expr","locations":[{"start":{"line":221,"column":51},"end":{"line":221,"column":64}},{"start":{"line":221,"column":67},"end":{"line":221,"column":71}}],"line":221},"16":{"loc":{"start":{"line":240,"column":2},"end":{"line":245,"column":3}},"type":"if","locations":[{"start":{"line":240,"column":2},"end":{"line":245,"column":3}},{"start":{"line":240,"column":2},"end":{"line":245,"column":3}}],"line":240},"17":{"loc":{"start":{"line":248,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":248,"column":2},"end":{"line":250,"column":3}},{"start":{"line":248,"column":2},"end":{"line":250,"column":3}}],"line":248},"18":{"loc":{"start":{"line":252,"column":2},"end":{"line":254,"column":3}},"type":"if","locations":[{"start":{"line":252,"column":2},"end":{"line":254,"column":3}},{"start":{"line":252,"column":2},"end":{"line":254,"column":3}}],"line":252},"19":{"loc":{"start":{"line":259,"column":2},"end":{"line":271,"column":3}},"type":"switch","locations":[{"start":{"line":260,"column":4},"end":{"line":262,"column":12}},{"start":{"line":263,"column":4},"end":{"line":265,"column":12}},{"start":{"line":266,"column":4},"end":{"line":268,"column":12}},{"start":{"line":269,"column":4},"end":{"line":270,"column":78}}],"line":259},"20":{"loc":{"start":{"line":276,"column":2},"end":{"line":279,"column":3}},"type":"if","locations":[{"start":{"line":276,"column":2},"end":{"line":279,"column":3}},{"start":{"line":276,"column":2},"end":{"line":279,"column":3}}],"line":276},"21":{"loc":{"start":{"line":276,"column":6},"end":{"line":276,"column":50}},"type":"binary-expr","locations":[{"start":{"line":276,"column":6},"end":{"line":276,"column":28}},{"start":{"line":276,"column":32},"end":{"line":276,"column":50}}],"line":276},"22":{"loc":{"start":{"line":292,"column":10},"end":{"line":296,"column":17}},"type":"cond-expr","locations":[{"start":{"line":293,"column":14},"end":{"line":293,"column":35}},{"start":{"line":294,"column":14},"end":{"line":296,"column":17}}],"line":292},"23":{"loc":{"start":{"line":294,"column":14},"end":{"line":296,"column":17}},"type":"cond-expr","locations":[{"start":{"line":295,"column":14},"end":{"line":295,"column":24}},{"start":{"line":296,"column":14},"end":{"line":296,"column":17}}],"line":294},"24":{"loc":{"start":{"line":297,"column":10},"end":{"line":297,"column":69}},"type":"binary-expr","locations":[{"start":{"line":297,"column":10},"end":{"line":297,"column":23}},{"start":{"line":297,"column":27},"end":{"line":297,"column":69}}],"line":297}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":4,"6":4,"7":1,"8":3,"9":3,"10":3,"11":3,"12":3,"13":3,"14":1,"15":1,"16":1,"17":3,"18":3,"19":3,"20":3,"21":3,"22":3,"23":2,"24":2,"25":2,"26":2,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":3,"34":3,"35":0,"36":3,"37":3,"38":1,"39":2,"40":2,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":0,"54":0,"55":0,"56":0,"57":0,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":6,"66":5,"67":5,"68":3,"69":5,"70":2,"71":5,"72":5,"73":5,"74":5,"75":5,"76":5,"77":5,"78":1,"79":13,"80":13,"81":0,"82":13,"83":13,"84":0,"85":13,"86":0,"87":13,"88":13,"89":4,"90":3,"91":6,"92":5,"93":3,"94":1,"95":0,"96":9,"97":1,"98":1,"99":0,"100":0,"101":1,"102":2,"103":2,"104":0,"105":1,"106":1},"f":{"0":4,"1":3,"2":6,"3":13,"4":1,"5":2},"b":{"0":[1,3],"1":[1,2],"2":[3,1],"3":[2,1],"4":[0,3],"5":[1,2],"6":[1,1],"7":[0,1],"8":[1,0],"9":[0,1],"10":[0,0],"11":[3,2],"12":[5,2],"13":[2,3],"14":[5,5],"15":[5,0],"16":[0,13],"17":[0,13],"18":[0,13],"19":[4,6,3,0],"20":[0,1],"21":[1,1],"22":[0,0],"23":[0,0],"24":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a350e9a06ecbb76530e91bf1cf83cf42639993e3"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight_px\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\gainsight_px\\util.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":30}},"1":{"start":{"line":2,"column":22},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":24},"end":{"line":3,"column":45}},"3":{"start":{"line":5,"column":28},"end":{"line":26,"column":1}},"4":{"start":{"line":11,"column":19},"end":{"line":11,"column":21}},"5":{"start":{"line":12,"column":20},"end":{"line":12,"column":33}},"6":{"start":{"line":14,"column":2},"end":{"line":24,"column":3}},"7":{"start":{"line":15,"column":4},"end":{"line":17,"column":44}},"8":{"start":{"line":19,"column":4},"end":{"line":19,"column":40}},"9":{"start":{"line":21,"column":4},"end":{"line":23,"column":5}},"10":{"start":{"line":22,"column":6},"end":{"line":22,"column":49}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":75}},"12":{"start":{"line":35,"column":21},"end":{"line":63,"column":1}},"13":{"start":{"line":36,"column":12},"end":{"line":36,"column":47}},"14":{"start":{"line":37,"column":12},"end":{"line":37,"column":51}},"15":{"start":{"line":39,"column":2},"end":{"line":42,"column":3}},"16":{"start":{"line":40,"column":4},"end":{"line":40,"column":49}},"17":{"start":{"line":41,"column":4},"end":{"line":41,"column":53}},"18":{"start":{"line":45,"column":2},"end":{"line":62,"column":3}},"19":{"start":{"line":46,"column":4},"end":{"line":51,"column":7}},"20":{"start":{"line":52,"column":4},"end":{"line":54,"column":5}},"21":{"start":{"line":53,"column":6},"end":{"line":53,"column":42}},"22":{"start":{"line":55,"column":4},"end":{"line":55,"column":25}},"23":{"start":{"line":57,"column":4},"end":{"line":61,"column":6}},"24":{"start":{"line":65,"column":22},"end":{"line":81,"column":1}},"25":{"start":{"line":67,"column":2},"end":{"line":80,"column":3}},"26":{"start":{"line":68,"column":4},"end":{"line":73,"column":7}},"27":{"start":{"line":74,"column":4},"end":{"line":76,"column":5}},"28":{"start":{"line":75,"column":6},"end":{"line":75,"column":42}},"29":{"start":{"line":77,"column":4},"end":{"line":77,"column":63}},"30":{"start":{"line":79,"column":4},"end":{"line":79,"column":75}},"31":{"start":{"line":83,"column":22},"end":{"line":103,"column":1}},"32":{"start":{"line":85,"column":2},"end":{"line":102,"column":3}},"33":{"start":{"line":86,"column":4},"end":{"line":95,"column":6}},"34":{"start":{"line":96,"column":4},"end":{"line":98,"column":5}},"35":{"start":{"line":97,"column":6},"end":{"line":97,"column":42}},"36":{"start":{"line":99,"column":4},"end":{"line":99,"column":63}},"37":{"start":{"line":101,"column":4},"end":{"line":101,"column":75}},"38":{"start":{"line":112,"column":27},"end":{"line":121,"column":1}},"39":{"start":{"line":113,"column":25},"end":{"line":113,"column":27}},"40":{"start":{"line":114,"column":18},"end":{"line":114,"column":50}},"41":{"start":{"line":115,"column":2},"end":{"line":119,"column":5}},"42":{"start":{"line":116,"column":4},"end":{"line":118,"column":5}},"43":{"start":{"line":117,"column":6},"end":{"line":117,"column":62}},"44":{"start":{"line":120,"column":2},"end":{"line":120,"column":24}},"45":{"start":{"line":129,"column":25},"end":{"line":139,"column":1}},"46":{"start":{"line":130,"column":23},"end":{"line":130,"column":25}},"47":{"start":{"line":131,"column":2},"end":{"line":137,"column":5}},"48":{"start":{"line":132,"column":4},"end":{"line":136,"column":5}},"49":{"start":{"line":133,"column":6},"end":{"line":133,"column":53}},"50":{"start":{"line":135,"column":6},"end":{"line":135,"column":37}},"51":{"start":{"line":138,"column":2},"end":{"line":138,"column":22}},"52":{"start":{"line":141,"column":0},"end":{"line":148,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":28},"end":{"line":5,"column":29}},"loc":{"start":{"line":10,"column":5},"end":{"line":26,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":21},"end":{"line":35,"column":22}},"loc":{"start":{"line":35,"column":55},"end":{"line":63,"column":1}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":65,"column":22},"end":{"line":65,"column":23}},"loc":{"start":{"line":65,"column":49},"end":{"line":81,"column":1}},"line":65},"3":{"name":"(anonymous_3)","decl":{"start":{"line":83,"column":22},"end":{"line":83,"column":23}},"loc":{"start":{"line":83,"column":60},"end":{"line":103,"column":1}},"line":83},"4":{"name":"(anonymous_4)","decl":{"start":{"line":112,"column":27},"end":{"line":112,"column":28}},"loc":{"start":{"line":112,"column":61},"end":{"line":121,"column":1}},"line":112},"5":{"name":"(anonymous_5)","decl":{"start":{"line":115,"column":31},"end":{"line":115,"column":32}},"loc":{"start":{"line":115,"column":38},"end":{"line":119,"column":3}},"line":115},"6":{"name":"(anonymous_6)","decl":{"start":{"line":129,"column":25},"end":{"line":129,"column":26}},"loc":{"start":{"line":129,"column":34},"end":{"line":139,"column":1}},"line":129},"7":{"name":"(anonymous_7)","decl":{"start":{"line":131,"column":29},"end":{"line":131,"column":30}},"loc":{"start":{"line":131,"column":36},"end":{"line":137,"column":3}},"line":131}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":21}},"type":"default-arg","locations":[{"start":{"line":9,"column":18},"end":{"line":9,"column":21}}],"line":9},"1":{"loc":{"start":{"line":14,"column":2},"end":{"line":24,"column":3}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":24,"column":3}},{"start":{"line":14,"column":2},"end":{"line":24,"column":3}}],"line":14},"2":{"loc":{"start":{"line":14,"column":6},"end":{"line":14,"column":43}},"type":"binary-expr","locations":[{"start":{"line":14,"column":6},"end":{"line":14,"column":20}},{"start":{"line":14,"column":24},"end":{"line":14,"column":43}}],"line":14},"3":{"loc":{"start":{"line":15,"column":17},"end":{"line":17,"column":43}},"type":"cond-expr","locations":[{"start":{"line":16,"column":8},"end":{"line":16,"column":60}},{"start":{"line":17,"column":8},"end":{"line":17,"column":43}}],"line":15},"4":{"loc":{"start":{"line":21,"column":4},"end":{"line":23,"column":5}},"type":"if","locations":[{"start":{"line":21,"column":4},"end":{"line":23,"column":5}},{"start":{"line":21,"column":4},"end":{"line":23,"column":5}}],"line":21},"5":{"loc":{"start":{"line":39,"column":2},"end":{"line":42,"column":3}},"type":"if","locations":[{"start":{"line":39,"column":2},"end":{"line":42,"column":3}},{"start":{"line":39,"column":2},"end":{"line":42,"column":3}}],"line":39},"6":{"loc":{"start":{"line":52,"column":4},"end":{"line":54,"column":5}},"type":"if","locations":[{"start":{"line":52,"column":4},"end":{"line":54,"column":5}},{"start":{"line":52,"column":4},"end":{"line":54,"column":5}}],"line":52},"7":{"loc":{"start":{"line":52,"column":8},"end":{"line":52,"column":43}},"type":"binary-expr","locations":[{"start":{"line":52,"column":8},"end":{"line":52,"column":16}},{"start":{"line":52,"column":20},"end":{"line":52,"column":43}}],"line":52},"8":{"loc":{"start":{"line":74,"column":4},"end":{"line":76,"column":5}},"type":"if","locations":[{"start":{"line":74,"column":4},"end":{"line":76,"column":5}},{"start":{"line":74,"column":4},"end":{"line":76,"column":5}}],"line":74},"9":{"loc":{"start":{"line":74,"column":8},"end":{"line":74,"column":43}},"type":"binary-expr","locations":[{"start":{"line":74,"column":8},"end":{"line":74,"column":16}},{"start":{"line":74,"column":20},"end":{"line":74,"column":43}}],"line":74},"10":{"loc":{"start":{"line":96,"column":4},"end":{"line":98,"column":5}},"type":"if","locations":[{"start":{"line":96,"column":4},"end":{"line":98,"column":5}},{"start":{"line":96,"column":4},"end":{"line":98,"column":5}}],"line":96},"11":{"loc":{"start":{"line":96,"column":8},"end":{"line":96,"column":43}},"type":"binary-expr","locations":[{"start":{"line":96,"column":8},"end":{"line":96,"column":16}},{"start":{"line":96,"column":20},"end":{"line":96,"column":43}}],"line":96},"12":{"loc":{"start":{"line":116,"column":4},"end":{"line":118,"column":5}},"type":"if","locations":[{"start":{"line":116,"column":4},"end":{"line":118,"column":5}},{"start":{"line":116,"column":4},"end":{"line":118,"column":5}}],"line":116},"13":{"loc":{"start":{"line":132,"column":4},"end":{"line":136,"column":5}},"type":"if","locations":[{"start":{"line":132,"column":4},"end":{"line":136,"column":5}},{"start":{"line":132,"column":4},"end":{"line":136,"column":5}}],"line":132}},"s":{"0":1,"1":1,"2":1,"3":1,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":0,"12":1,"13":7,"14":7,"15":7,"16":1,"17":1,"18":7,"19":7,"20":5,"21":5,"22":0,"23":2,"24":1,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":1,"32":1,"33":1,"34":1,"35":1,"36":0,"37":0,"38":1,"39":4,"40":4,"41":4,"42":6,"43":3,"44":4,"45":1,"46":5,"47":5,"48":24,"49":7,"50":17,"51":5,"52":1},"f":{"0":2,"1":7,"2":0,"3":1,"4":4,"5":6,"6":5,"7":24},"b":{"0":[2],"1":[2,0],"2":[2,2],"3":[2,0],"4":[2,0],"5":[1,6],"6":[5,0],"7":[5,5],"8":[0,0],"9":[0,0],"10":[1,0],"11":[1,1],"12":[3,3],"13":[7,17]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3014e432b68976b549640b3c5ad97403709fbb1b"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\google_adwords_enhanced_conversions\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\google_adwords_enhanced_conversions\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":22},"end":{"line":3,"column":70}},"2":{"start":{"line":5,"column":26},"end":{"line":7,"column":1}},"3":{"start":{"line":9,"column":39},"end":{"line":12,"column":16}},"4":{"start":{"line":13,"column":23},"end":{"line":19,"column":1}},"5":{"start":{"line":20,"column":23},"end":{"line":20,"column":69}},"6":{"start":{"line":21,"column":0},"end":{"line":26,"column":2}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":9,"column":39},"end":{"line":12,"column":16}},"type":"cond-expr","locations":[{"start":{"line":11,"column":4},"end":{"line":11,"column":60}},{"start":{"line":12,"column":4},"end":{"line":12,"column":16}}],"line":9}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{"0":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"aef433a3dbfde6935bdffe324b83c90dde78eb99"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\google_adwords_enhanced_conversions\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\google_adwords_enhanced_conversions\\transform.js","statementMap":{"0":{"start":{"line":3,"column":12},"end":{"line":3,"column":32}},"1":{"start":{"line":4,"column":22},"end":{"line":4,"column":39}},"2":{"start":{"line":12,"column":4},"end":{"line":12,"column":25}},"3":{"start":{"line":13,"column":21},"end":{"line":13,"column":48}},"4":{"start":{"line":15,"column":40},"end":{"line":15,"column":59}},"5":{"start":{"line":23,"column":26},"end":{"line":34,"column":1}},"6":{"start":{"line":24,"column":21},"end":{"line":24,"column":23}},"7":{"start":{"line":25,"column":2},"end":{"line":32,"column":5}},"8":{"start":{"line":26,"column":4},"end":{"line":30,"column":5}},"9":{"start":{"line":27,"column":6},"end":{"line":29,"column":7}},"10":{"start":{"line":28,"column":8},"end":{"line":28,"column":43}},"11":{"start":{"line":31,"column":4},"end":{"line":31,"column":29}},"12":{"start":{"line":33,"column":2},"end":{"line":33,"column":20}},"13":{"start":{"line":47,"column":23},"end":{"line":57,"column":1}},"14":{"start":{"line":49,"column":21},"end":{"line":49,"column":29}},"15":{"start":{"line":50,"column":2},"end":{"line":55,"column":3}},"16":{"start":{"line":51,"column":4},"end":{"line":54,"column":15}},"17":{"start":{"line":56,"column":2},"end":{"line":56,"column":29}},"18":{"start":{"line":59,"column":24},"end":{"line":84,"column":1}},"19":{"start":{"line":60,"column":19},"end":{"line":60,"column":41}},"20":{"start":{"line":61,"column":20},"end":{"line":61,"column":27}},"21":{"start":{"line":62,"column":29},"end":{"line":62,"column":61}},"22":{"start":{"line":63,"column":2},"end":{"line":63,"column":91}},"23":{"start":{"line":64,"column":2},"end":{"line":64,"column":31}},"24":{"start":{"line":65,"column":22},"end":{"line":65,"column":46}},"25":{"start":{"line":66,"column":2},"end":{"line":70,"column":4}},"26":{"start":{"line":71,"column":2},"end":{"line":71,"column":62}},"27":{"start":{"line":72,"column":2},"end":{"line":82,"column":17}},"28":{"start":{"line":73,"column":4},"end":{"line":82,"column":17}},"29":{"start":{"line":74,"column":38},"end":{"line":74,"column":75}},"30":{"start":{"line":75,"column":6},"end":{"line":75,"column":70}},"31":{"start":{"line":77,"column":6},"end":{"line":82,"column":17}},"32":{"start":{"line":83,"column":2},"end":{"line":83,"column":18}},"33":{"start":{"line":86,"column":26},"end":{"line":138,"column":1}},"34":{"start":{"line":87,"column":13},"end":{"line":87,"column":14}},"35":{"start":{"line":88,"column":21},"end":{"line":88,"column":32}},"36":{"start":{"line":89,"column":20},"end":{"line":89,"column":27}},"37":{"start":{"line":90,"column":32},"end":{"line":90,"column":38}},"38":{"start":{"line":91,"column":2},"end":{"line":93,"column":3}},"39":{"start":{"line":91,"column":34},"end":{"line":91,"column":57}},"40":{"start":{"line":92,"column":4},"end":{"line":92,"column":13}},"41":{"start":{"line":94,"column":2},"end":{"line":101,"column":3}},"42":{"start":{"line":95,"column":4},"end":{"line":100,"column":15}},"43":{"start":{"line":102,"column":26},"end":{"line":102,"column":44}},"44":{"start":{"line":103,"column":23},"end":{"line":103,"column":46}},"45":{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},"46":{"start":{"line":106,"column":4},"end":{"line":106,"column":55}},"47":{"start":{"line":110,"column":2},"end":{"line":119,"column":3}},"48":{"start":{"line":111,"column":4},"end":{"line":111,"column":56}},"49":{"start":{"line":113,"column":4},"end":{"line":118,"column":15}},"50":{"start":{"line":121,"column":2},"end":{"line":121,"column":32}},"51":{"start":{"line":122,"column":2},"end":{"line":129,"column":3}},"52":{"start":{"line":123,"column":4},"end":{"line":128,"column":15}},"53":{"start":{"line":130,"column":2},"end":{"line":130,"column":66}},"54":{"start":{"line":132,"column":14},"end":{"line":132,"column":62}},"55":{"start":{"line":133,"column":2},"end":{"line":136,"column":5}},"56":{"start":{"line":134,"column":4},"end":{"line":134,"column":26}},"57":{"start":{"line":134,"column":14},"end":{"line":134,"column":26}},"58":{"start":{"line":135,"column":4},"end":{"line":135,"column":17}},"59":{"start":{"line":137,"column":2},"end":{"line":137,"column":66}},"60":{"start":{"line":140,"column":21},"end":{"line":160,"column":1}},"61":{"start":{"line":141,"column":19},"end":{"line":141,"column":26}},"62":{"start":{"line":142,"column":2},"end":{"line":149,"column":3}},"63":{"start":{"line":143,"column":4},"end":{"line":148,"column":15}},"64":{"start":{"line":150,"column":2},"end":{"line":159,"column":3}},"65":{"start":{"line":151,"column":4},"end":{"line":156,"column":15}},"66":{"start":{"line":158,"column":4},"end":{"line":158,"column":61}},"67":{"start":{"line":162,"column":16},"end":{"line":164,"column":1}},"68":{"start":{"line":163,"column":2},"end":{"line":163,"column":72}},"69":{"start":{"line":165,"column":26},"end":{"line":194,"column":1}},"70":{"start":{"line":166,"column":2},"end":{"line":169,"column":3}},"71":{"start":{"line":167,"column":23},"end":{"line":167,"column":75}},"72":{"start":{"line":168,"column":4},"end":{"line":168,"column":24}},"73":{"start":{"line":171,"column":19},"end":{"line":192,"column":3}},"74":{"start":{"line":173,"column":6},"end":{"line":190,"column":7}},"75":{"start":{"line":174,"column":8},"end":{"line":178,"column":10}},"76":{"start":{"line":180,"column":8},"end":{"line":189,"column":10}},"77":{"start":{"line":193,"column":2},"end":{"line":193,"column":18}},"78":{"start":{"line":196,"column":0},"end":{"line":196,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":23,"column":26},"end":{"line":23,"column":27}},"loc":{"start":{"line":23,"column":37},"end":{"line":34,"column":1}},"line":23},"1":{"name":"(anonymous_1)","decl":{"start":{"line":25,"column":18},"end":{"line":25,"column":19}},"loc":{"start":{"line":25,"column":29},"end":{"line":32,"column":3}},"line":25},"2":{"name":"(anonymous_2)","decl":{"start":{"line":47,"column":23},"end":{"line":47,"column":24}},"loc":{"start":{"line":47,"column":35},"end":{"line":57,"column":1}},"line":47},"3":{"name":"(anonymous_3)","decl":{"start":{"line":59,"column":24},"end":{"line":59,"column":25}},"loc":{"start":{"line":59,"column":74},"end":{"line":84,"column":1}},"line":59},"4":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":26},"end":{"line":86,"column":27}},"loc":{"start":{"line":86,"column":68},"end":{"line":138,"column":1}},"line":86},"5":{"name":"(anonymous_5)","decl":{"start":{"line":91,"column":29},"end":{"line":91,"column":30}},"loc":{"start":{"line":91,"column":34},"end":{"line":91,"column":57}},"line":91},"6":{"name":"(anonymous_6)","decl":{"start":{"line":133,"column":64},"end":{"line":133,"column":65}},"loc":{"start":{"line":133,"column":72},"end":{"line":136,"column":3}},"line":133},"7":{"name":"(anonymous_7)","decl":{"start":{"line":140,"column":21},"end":{"line":140,"column":22}},"loc":{"start":{"line":140,"column":63},"end":{"line":160,"column":1}},"line":140},"8":{"name":"(anonymous_8)","decl":{"start":{"line":162,"column":16},"end":{"line":162,"column":17}},"loc":{"start":{"line":162,"column":31},"end":{"line":164,"column":1}},"line":162},"9":{"name":"(anonymous_9)","decl":{"start":{"line":165,"column":26},"end":{"line":165,"column":27}},"loc":{"start":{"line":165,"column":42},"end":{"line":194,"column":1}},"line":165},"10":{"name":"(anonymous_10)","decl":{"start":{"line":172,"column":15},"end":{"line":172,"column":16}},"loc":{"start":{"line":172,"column":30},"end":{"line":191,"column":5}},"line":172}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":4},"end":{"line":30,"column":5}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":30,"column":5}},{"start":{"line":26,"column":4},"end":{"line":30,"column":5}}],"line":26},"1":{"loc":{"start":{"line":27,"column":6},"end":{"line":29,"column":7}},"type":"if","locations":[{"start":{"line":27,"column":6},"end":{"line":29,"column":7}},{"start":{"line":27,"column":6},"end":{"line":29,"column":7}}],"line":27},"2":{"loc":{"start":{"line":50,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":55,"column":3}},{"start":{"line":50,"column":2},"end":{"line":55,"column":3}}],"line":50},"3":{"loc":{"start":{"line":72,"column":2},"end":{"line":82,"column":17}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":82,"column":17}},{"start":{"line":72,"column":2},"end":{"line":82,"column":17}}],"line":72},"4":{"loc":{"start":{"line":73,"column":4},"end":{"line":82,"column":17}},"type":"if","locations":[{"start":{"line":73,"column":4},"end":{"line":82,"column":17}},{"start":{"line":73,"column":4},"end":{"line":82,"column":17}}],"line":73},"5":{"loc":{"start":{"line":91,"column":2},"end":{"line":93,"column":3}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":93,"column":3}},{"start":{"line":91,"column":2},"end":{"line":93,"column":3}}],"line":91},"6":{"loc":{"start":{"line":94,"column":2},"end":{"line":101,"column":3}},"type":"if","locations":[{"start":{"line":94,"column":2},"end":{"line":101,"column":3}},{"start":{"line":94,"column":2},"end":{"line":101,"column":3}}],"line":94},"7":{"loc":{"start":{"line":94,"column":6},"end":{"line":94,"column":55}},"type":"binary-expr","locations":[{"start":{"line":94,"column":6},"end":{"line":94,"column":25}},{"start":{"line":94,"column":29},"end":{"line":94,"column":41}},{"start":{"line":94,"column":45},"end":{"line":94,"column":55}}],"line":94},"8":{"loc":{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},{"start":{"line":105,"column":2},"end":{"line":107,"column":3}}],"line":105},"9":{"loc":{"start":{"line":122,"column":2},"end":{"line":129,"column":3}},"type":"if","locations":[{"start":{"line":122,"column":2},"end":{"line":129,"column":3}},{"start":{"line":122,"column":2},"end":{"line":129,"column":3}}],"line":122},"10":{"loc":{"start":{"line":134,"column":4},"end":{"line":134,"column":26}},"type":"if","locations":[{"start":{"line":134,"column":4},"end":{"line":134,"column":26}},{"start":{"line":134,"column":4},"end":{"line":134,"column":26}}],"line":134},"11":{"loc":{"start":{"line":142,"column":2},"end":{"line":149,"column":3}},"type":"if","locations":[{"start":{"line":142,"column":2},"end":{"line":149,"column":3}},{"start":{"line":142,"column":2},"end":{"line":149,"column":3}}],"line":142},"12":{"loc":{"start":{"line":150,"column":2},"end":{"line":159,"column":3}},"type":"if","locations":[{"start":{"line":150,"column":2},"end":{"line":159,"column":3}},{"start":{"line":150,"column":2},"end":{"line":159,"column":3}}],"line":150},"13":{"loc":{"start":{"line":166,"column":2},"end":{"line":169,"column":3}},"type":"if","locations":[{"start":{"line":166,"column":2},"end":{"line":169,"column":3}},{"start":{"line":166,"column":2},"end":{"line":169,"column":3}}],"line":166},"14":{"loc":{"start":{"line":166,"column":6},"end":{"line":166,"column":50}},"type":"binary-expr","locations":[{"start":{"line":166,"column":6},"end":{"line":166,"column":28}},{"start":{"line":166,"column":32},"end":{"line":166,"column":50}}],"line":166},"15":{"loc":{"start":{"line":183,"column":10},"end":{"line":187,"column":33}},"type":"cond-expr","locations":[{"start":{"line":184,"column":14},"end":{"line":184,"column":35}},{"start":{"line":185,"column":14},"end":{"line":187,"column":33}}],"line":183},"16":{"loc":{"start":{"line":185,"column":14},"end":{"line":187,"column":33}},"type":"cond-expr","locations":[{"start":{"line":186,"column":14},"end":{"line":186,"column":24}},{"start":{"line":187,"column":14},"end":{"line":187,"column":33}}],"line":185},"17":{"loc":{"start":{"line":187,"column":14},"end":{"line":187,"column":33}},"type":"binary-expr","locations":[{"start":{"line":187,"column":14},"end":{"line":187,"column":26}},{"start":{"line":187,"column":30},"end":{"line":187,"column":33}}],"line":187},"18":{"loc":{"start":{"line":188,"column":10},"end":{"line":188,"column":69}},"type":"binary-expr","locations":[{"start":{"line":188,"column":10},"end":{"line":188,"column":23}},{"start":{"line":188,"column":27},"end":{"line":188,"column":69}}],"line":188}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":2,"7":2,"8":32,"9":28,"10":10,"11":32,"12":2,"13":1,"14":7,"15":7,"16":1,"17":6,"18":1,"19":7,"20":7,"21":7,"22":7,"23":7,"24":7,"25":6,"26":6,"27":6,"28":6,"29":5,"30":5,"31":1,"32":5,"33":1,"34":11,"35":11,"36":11,"37":11,"38":11,"39":16,"40":9,"41":11,"42":2,"43":9,"44":9,"45":9,"46":2,"47":9,"48":9,"49":1,"50":8,"51":8,"52":1,"53":7,"54":7,"55":7,"56":12,"57":12,"58":0,"59":7,"60":1,"61":13,"62":13,"63":0,"64":13,"65":2,"66":11,"67":1,"68":13,"69":1,"70":1,"71":0,"72":0,"73":1,"74":2,"75":2,"76":1,"77":1,"78":1},"f":{"0":2,"1":32,"2":7,"3":7,"4":11,"5":16,"6":12,"7":13,"8":13,"9":1,"10":2},"b":{"0":[28,4],"1":[10,18],"2":[1,6],"3":[6,0],"4":[5,1],"5":[9,2],"6":[2,9],"7":[11,11,11],"8":[2,7],"9":[1,7],"10":[12,0],"11":[0,13],"12":[2,11],"13":[0,1],"14":[1,1],"15":[0,1],"16":[0,1],"17":[1,0],"18":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f26dabd4d5f257c4cdab42c5c0adb769d66ced7c"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\google_adwords_remarketing_lists\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\google_adwords_remarketing_lists\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":22},"end":{"line":3,"column":70}},"2":{"start":{"line":4,"column":26},"end":{"line":7,"column":1}},"3":{"start":{"line":8,"column":25},"end":{"line":11,"column":1}},"4":{"start":{"line":12,"column":23},"end":{"line":12,"column":66}},"5":{"start":{"line":13,"column":23},"end":{"line":13,"column":69}},"6":{"start":{"line":14,"column":19},"end":{"line":17,"column":2}},"7":{"start":{"line":19,"column":0},"end":{"line":26,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"df55f35f816b5faa7d7b7b61075c2b175da9322a"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\google_adwords_remarketing_lists\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\google_adwords_remarketing_lists\\transform.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":41}},"2":{"start":{"line":13,"column":4},"end":{"line":13,"column":25}},"3":{"start":{"line":14,"column":21},"end":{"line":14,"column":48}},"4":{"start":{"line":22,"column":4},"end":{"line":22,"column":23}},"5":{"start":{"line":24,"column":20},"end":{"line":31,"column":1}},"6":{"start":{"line":25,"column":2},"end":{"line":30,"column":5}},"7":{"start":{"line":26,"column":4},"end":{"line":29,"column":5}},"8":{"start":{"line":28,"column":6},"end":{"line":28,"column":40}},"9":{"start":{"line":44,"column":23},"end":{"line":54,"column":1}},"10":{"start":{"line":46,"column":21},"end":{"line":46,"column":29}},"11":{"start":{"line":47,"column":2},"end":{"line":52,"column":3}},"12":{"start":{"line":48,"column":4},"end":{"line":51,"column":15}},"13":{"start":{"line":53,"column":2},"end":{"line":53,"column":29}},"14":{"start":{"line":64,"column":24},"end":{"line":89,"column":1}},"15":{"start":{"line":65,"column":18},"end":{"line":65,"column":22}},"16":{"start":{"line":66,"column":19},"end":{"line":66,"column":41}},"17":{"start":{"line":67,"column":29},"end":{"line":67,"column":61}},"18":{"start":{"line":68,"column":2},"end":{"line":68,"column":83}},"19":{"start":{"line":69,"column":2},"end":{"line":69,"column":61}},"20":{"start":{"line":70,"column":22},"end":{"line":70,"column":46}},"21":{"start":{"line":71,"column":2},"end":{"line":71,"column":78}},"22":{"start":{"line":72,"column":2},"end":{"line":76,"column":4}},"23":{"start":{"line":77,"column":2},"end":{"line":87,"column":17}},"24":{"start":{"line":78,"column":4},"end":{"line":87,"column":17}},"25":{"start":{"line":79,"column":38},"end":{"line":79,"column":75}},"26":{"start":{"line":80,"column":6},"end":{"line":80,"column":70}},"27":{"start":{"line":82,"column":6},"end":{"line":87,"column":17}},"28":{"start":{"line":88,"column":2},"end":{"line":88,"column":18}},"29":{"start":{"line":99,"column":28},"end":{"line":146,"column":1}},"30":{"start":{"line":100,"column":25},"end":{"line":100,"column":27}},"31":{"start":{"line":101,"column":25},"end":{"line":101,"column":31}},"32":{"start":{"line":102,"column":29},"end":{"line":102,"column":35}},"33":{"start":{"line":104,"column":2},"end":{"line":108,"column":3}},"34":{"start":{"line":105,"column":4},"end":{"line":105,"column":39}},"35":{"start":{"line":107,"column":4},"end":{"line":107,"column":34}},"36":{"start":{"line":109,"column":2},"end":{"line":144,"column":3}},"37":{"start":{"line":111,"column":4},"end":{"line":143,"column":7}},"38":{"start":{"line":112,"column":6},"end":{"line":114,"column":7}},"39":{"start":{"line":113,"column":8},"end":{"line":113,"column":29}},"40":{"start":{"line":116,"column":6},"end":{"line":142,"column":7}},"41":{"start":{"line":117,"column":8},"end":{"line":121,"column":9}},"42":{"start":{"line":118,"column":10},"end":{"line":118,"column":67}},"43":{"start":{"line":120,"column":10},"end":{"line":120,"column":71}},"44":{"start":{"line":123,"column":8},"end":{"line":141,"column":11}},"45":{"start":{"line":124,"column":10},"end":{"line":140,"column":11}},"46":{"start":{"line":125,"column":32},"end":{"line":125,"column":77}},"47":{"start":{"line":127,"column":12},"end":{"line":128,"column":51}},"48":{"start":{"line":128,"column":14},"end":{"line":128,"column":51}},"49":{"start":{"line":129,"column":17},"end":{"line":140,"column":11}},"50":{"start":{"line":130,"column":12},"end":{"line":134,"column":15}},"51":{"start":{"line":136,"column":12},"end":{"line":139,"column":14}},"52":{"start":{"line":145,"column":2},"end":{"line":145,"column":24}},"53":{"start":{"line":158,"column":22},"end":{"line":218,"column":1}},"54":{"start":{"line":159,"column":23},"end":{"line":159,"column":41}},"55":{"start":{"line":160,"column":21},"end":{"line":160,"column":38}},"56":{"start":{"line":162,"column":23},"end":{"line":162,"column":25}},"57":{"start":{"line":163,"column":26},"end":{"line":163,"column":47}},"58":{"start":{"line":164,"column":2},"end":{"line":215,"column":5}},"59":{"start":{"line":165,"column":4},"end":{"line":214,"column":5}},"60":{"start":{"line":166,"column":34},"end":{"line":169,"column":7}},"61":{"start":{"line":170,"column":6},"end":{"line":175,"column":7}},"62":{"start":{"line":171,"column":8},"end":{"line":173,"column":10}},"63":{"start":{"line":174,"column":8},"end":{"line":174,"column":15}},"64":{"start":{"line":177,"column":28},"end":{"line":177,"column":77}},"65":{"start":{"line":178,"column":6},"end":{"line":178,"column":36}},"66":{"start":{"line":180,"column":35},"end":{"line":183,"column":7}},"67":{"start":{"line":185,"column":6},"end":{"line":209,"column":7}},"68":{"start":{"line":188,"column":10},"end":{"line":194,"column":13}},"69":{"start":{"line":189,"column":31},"end":{"line":191,"column":13}},"70":{"start":{"line":192,"column":12},"end":{"line":192,"column":56}},"71":{"start":{"line":193,"column":12},"end":{"line":193,"column":54}},"72":{"start":{"line":195,"column":10},"end":{"line":195,"column":72}},"73":{"start":{"line":196,"column":10},"end":{"line":196,"column":16}},"74":{"start":{"line":199,"column":10},"end":{"line":205,"column":13}},"75":{"start":{"line":200,"column":31},"end":{"line":202,"column":13}},"76":{"start":{"line":203,"column":12},"end":{"line":203,"column":56}},"77":{"start":{"line":204,"column":12},"end":{"line":204,"column":54}},"78":{"start":{"line":206,"column":10},"end":{"line":206,"column":72}},"79":{"start":{"line":207,"column":10},"end":{"line":207,"column":16}},"80":{"start":{"line":211,"column":6},"end":{"line":213,"column":8}},"81":{"start":{"line":217,"column":2},"end":{"line":217,"column":24}},"82":{"start":{"line":220,"column":21},"end":{"line":270,"column":1}},"83":{"start":{"line":221,"column":19},"end":{"line":221,"column":21}},"84":{"start":{"line":222,"column":2},"end":{"line":229,"column":3}},"85":{"start":{"line":223,"column":4},"end":{"line":228,"column":15}},"86":{"start":{"line":230,"column":2},"end":{"line":237,"column":3}},"87":{"start":{"line":231,"column":4},"end":{"line":236,"column":15}},"88":{"start":{"line":238,"column":2},"end":{"line":245,"column":3}},"89":{"start":{"line":239,"column":4},"end":{"line":244,"column":15}},"90":{"start":{"line":246,"column":2},"end":{"line":262,"column":3}},"91":{"start":{"line":247,"column":27},"end":{"line":247,"column":62}},"92":{"start":{"line":249,"column":4},"end":{"line":256,"column":5}},"93":{"start":{"line":250,"column":6},"end":{"line":255,"column":17}},"94":{"start":{"line":258,"column":4},"end":{"line":260,"column":7}},"95":{"start":{"line":259,"column":6},"end":{"line":259,"column":66}},"96":{"start":{"line":261,"column":4},"end":{"line":261,"column":20}},"97":{"start":{"line":264,"column":2},"end":{"line":269,"column":13}},"98":{"start":{"line":272,"column":16},"end":{"line":274,"column":1}},"99":{"start":{"line":273,"column":2},"end":{"line":273,"column":72}},"100":{"start":{"line":275,"column":26},"end":{"line":304,"column":1}},"101":{"start":{"line":276,"column":2},"end":{"line":279,"column":3}},"102":{"start":{"line":277,"column":23},"end":{"line":277,"column":75}},"103":{"start":{"line":278,"column":4},"end":{"line":278,"column":24}},"104":{"start":{"line":281,"column":19},"end":{"line":302,"column":3}},"105":{"start":{"line":283,"column":6},"end":{"line":300,"column":7}},"106":{"start":{"line":284,"column":8},"end":{"line":288,"column":10}},"107":{"start":{"line":290,"column":8},"end":{"line":299,"column":10}},"108":{"start":{"line":303,"column":2},"end":{"line":303,"column":18}},"109":{"start":{"line":306,"column":0},"end":{"line":306,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":24,"column":20},"end":{"line":24,"column":21}},"loc":{"start":{"line":24,"column":30},"end":{"line":31,"column":1}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":25,"column":30},"end":{"line":25,"column":31}},"loc":{"start":{"line":25,"column":37},"end":{"line":30,"column":3}},"line":25},"2":{"name":"(anonymous_2)","decl":{"start":{"line":44,"column":23},"end":{"line":44,"column":24}},"loc":{"start":{"line":44,"column":35},"end":{"line":54,"column":1}},"line":44},"3":{"name":"(anonymous_3)","decl":{"start":{"line":64,"column":24},"end":{"line":64,"column":25}},"loc":{"start":{"line":64,"column":56},"end":{"line":89,"column":1}},"line":64},"4":{"name":"(anonymous_4)","decl":{"start":{"line":99,"column":28},"end":{"line":99,"column":29}},"loc":{"start":{"line":99,"column":60},"end":{"line":146,"column":1}},"line":99},"5":{"name":"(anonymous_5)","decl":{"start":{"line":111,"column":27},"end":{"line":111,"column":28}},"loc":{"start":{"line":111,"column":47},"end":{"line":143,"column":5}},"line":111},"6":{"name":"(anonymous_6)","decl":{"start":{"line":123,"column":26},"end":{"line":123,"column":27}},"loc":{"start":{"line":123,"column":56},"end":{"line":141,"column":9}},"line":123},"7":{"name":"(anonymous_7)","decl":{"start":{"line":158,"column":22},"end":{"line":158,"column":23}},"loc":{"start":{"line":158,"column":48},"end":{"line":218,"column":1}},"line":158},"8":{"name":"(anonymous_8)","decl":{"start":{"line":164,"column":26},"end":{"line":164,"column":27}},"loc":{"start":{"line":164,"column":33},"end":{"line":215,"column":3}},"line":164},"9":{"name":"(anonymous_9)","decl":{"start":{"line":188,"column":39},"end":{"line":188,"column":40}},"loc":{"start":{"line":188,"column":50},"end":{"line":194,"column":11}},"line":188},"10":{"name":"(anonymous_10)","decl":{"start":{"line":199,"column":39},"end":{"line":199,"column":40}},"loc":{"start":{"line":199,"column":50},"end":{"line":205,"column":11}},"line":199},"11":{"name":"(anonymous_11)","decl":{"start":{"line":220,"column":21},"end":{"line":220,"column":22}},"loc":{"start":{"line":220,"column":63},"end":{"line":270,"column":1}},"line":220},"12":{"name":"(anonymous_12)","decl":{"start":{"line":258,"column":42},"end":{"line":258,"column":43}},"loc":{"start":{"line":258,"column":50},"end":{"line":260,"column":5}},"line":258},"13":{"name":"(anonymous_13)","decl":{"start":{"line":272,"column":16},"end":{"line":272,"column":17}},"loc":{"start":{"line":272,"column":31},"end":{"line":274,"column":1}},"line":272},"14":{"name":"(anonymous_14)","decl":{"start":{"line":275,"column":26},"end":{"line":275,"column":27}},"loc":{"start":{"line":275,"column":42},"end":{"line":304,"column":1}},"line":275},"15":{"name":"(anonymous_15)","decl":{"start":{"line":282,"column":15},"end":{"line":282,"column":16}},"loc":{"start":{"line":282,"column":30},"end":{"line":301,"column":5}},"line":282}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":4},"end":{"line":29,"column":5}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":29,"column":5}},{"start":{"line":26,"column":4},"end":{"line":29,"column":5}}],"line":26},"1":{"loc":{"start":{"line":26,"column":8},"end":{"line":26,"column":51}},"type":"binary-expr","locations":[{"start":{"line":26,"column":8},"end":{"line":26,"column":36}},{"start":{"line":26,"column":40},"end":{"line":26,"column":51}}],"line":26},"2":{"loc":{"start":{"line":47,"column":2},"end":{"line":52,"column":3}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":52,"column":3}},{"start":{"line":47,"column":2},"end":{"line":52,"column":3}}],"line":47},"3":{"loc":{"start":{"line":77,"column":2},"end":{"line":87,"column":17}},"type":"if","locations":[{"start":{"line":77,"column":2},"end":{"line":87,"column":17}},{"start":{"line":77,"column":2},"end":{"line":87,"column":17}}],"line":77},"4":{"loc":{"start":{"line":78,"column":4},"end":{"line":87,"column":17}},"type":"if","locations":[{"start":{"line":78,"column":4},"end":{"line":87,"column":17}},{"start":{"line":78,"column":4},"end":{"line":87,"column":17}}],"line":78},"5":{"loc":{"start":{"line":104,"column":2},"end":{"line":108,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":108,"column":3}},{"start":{"line":104,"column":2},"end":{"line":108,"column":3}}],"line":104},"6":{"loc":{"start":{"line":109,"column":2},"end":{"line":144,"column":3}},"type":"if","locations":[{"start":{"line":109,"column":2},"end":{"line":144,"column":3}},{"start":{"line":109,"column":2},"end":{"line":144,"column":3}}],"line":109},"7":{"loc":{"start":{"line":112,"column":6},"end":{"line":114,"column":7}},"type":"if","locations":[{"start":{"line":112,"column":6},"end":{"line":114,"column":7}},{"start":{"line":112,"column":6},"end":{"line":114,"column":7}}],"line":112},"8":{"loc":{"start":{"line":116,"column":6},"end":{"line":142,"column":7}},"type":"if","locations":[{"start":{"line":116,"column":6},"end":{"line":142,"column":7}},{"start":{"line":116,"column":6},"end":{"line":142,"column":7}}],"line":116},"9":{"loc":{"start":{"line":117,"column":8},"end":{"line":121,"column":9}},"type":"if","locations":[{"start":{"line":117,"column":8},"end":{"line":121,"column":9}},{"start":{"line":117,"column":8},"end":{"line":121,"column":9}}],"line":117},"10":{"loc":{"start":{"line":124,"column":10},"end":{"line":140,"column":11}},"type":"if","locations":[{"start":{"line":124,"column":10},"end":{"line":140,"column":11}},{"start":{"line":124,"column":10},"end":{"line":140,"column":11}}],"line":124},"11":{"loc":{"start":{"line":127,"column":12},"end":{"line":128,"column":51}},"type":"if","locations":[{"start":{"line":127,"column":12},"end":{"line":128,"column":51}},{"start":{"line":127,"column":12},"end":{"line":128,"column":51}}],"line":127},"12":{"loc":{"start":{"line":129,"column":17},"end":{"line":140,"column":11}},"type":"if","locations":[{"start":{"line":129,"column":17},"end":{"line":140,"column":11}},{"start":{"line":129,"column":17},"end":{"line":140,"column":11}}],"line":129},"13":{"loc":{"start":{"line":165,"column":4},"end":{"line":214,"column":5}},"type":"if","locations":[{"start":{"line":165,"column":4},"end":{"line":214,"column":5}},{"start":{"line":165,"column":4},"end":{"line":214,"column":5}}],"line":165},"14":{"loc":{"start":{"line":170,"column":6},"end":{"line":175,"column":7}},"type":"if","locations":[{"start":{"line":170,"column":6},"end":{"line":175,"column":7}},{"start":{"line":170,"column":6},"end":{"line":175,"column":7}}],"line":170},"15":{"loc":{"start":{"line":185,"column":6},"end":{"line":209,"column":7}},"type":"switch","locations":[{"start":{"line":186,"column":8},"end":{"line":196,"column":16}},{"start":{"line":197,"column":8},"end":{"line":207,"column":16}},{"start":{"line":208,"column":8},"end":{"line":208,"column":16}}],"line":185},"16":{"loc":{"start":{"line":222,"column":2},"end":{"line":229,"column":3}},"type":"if","locations":[{"start":{"line":222,"column":2},"end":{"line":229,"column":3}},{"start":{"line":222,"column":2},"end":{"line":229,"column":3}}],"line":222},"17":{"loc":{"start":{"line":230,"column":2},"end":{"line":237,"column":3}},"type":"if","locations":[{"start":{"line":230,"column":2},"end":{"line":237,"column":3}},{"start":{"line":230,"column":2},"end":{"line":237,"column":3}}],"line":230},"18":{"loc":{"start":{"line":238,"column":2},"end":{"line":245,"column":3}},"type":"if","locations":[{"start":{"line":238,"column":2},"end":{"line":245,"column":3}},{"start":{"line":238,"column":2},"end":{"line":245,"column":3}}],"line":238},"19":{"loc":{"start":{"line":246,"column":2},"end":{"line":262,"column":3}},"type":"if","locations":[{"start":{"line":246,"column":2},"end":{"line":262,"column":3}},{"start":{"line":246,"column":2},"end":{"line":262,"column":3}}],"line":246},"20":{"loc":{"start":{"line":249,"column":4},"end":{"line":256,"column":5}},"type":"if","locations":[{"start":{"line":249,"column":4},"end":{"line":256,"column":5}},{"start":{"line":249,"column":4},"end":{"line":256,"column":5}}],"line":249},"21":{"loc":{"start":{"line":276,"column":2},"end":{"line":279,"column":3}},"type":"if","locations":[{"start":{"line":276,"column":2},"end":{"line":279,"column":3}},{"start":{"line":276,"column":2},"end":{"line":279,"column":3}}],"line":276},"22":{"loc":{"start":{"line":276,"column":6},"end":{"line":276,"column":50}},"type":"binary-expr","locations":[{"start":{"line":276,"column":6},"end":{"line":276,"column":28}},{"start":{"line":276,"column":32},"end":{"line":276,"column":50}}],"line":276},"23":{"loc":{"start":{"line":293,"column":10},"end":{"line":297,"column":33}},"type":"cond-expr","locations":[{"start":{"line":294,"column":14},"end":{"line":294,"column":35}},{"start":{"line":295,"column":14},"end":{"line":297,"column":33}}],"line":293},"24":{"loc":{"start":{"line":295,"column":14},"end":{"line":297,"column":33}},"type":"cond-expr","locations":[{"start":{"line":296,"column":14},"end":{"line":296,"column":24}},{"start":{"line":297,"column":14},"end":{"line":297,"column":33}}],"line":295},"25":{"loc":{"start":{"line":297,"column":14},"end":{"line":297,"column":33}},"type":"binary-expr","locations":[{"start":{"line":297,"column":14},"end":{"line":297,"column":26}},{"start":{"line":297,"column":30},"end":{"line":297,"column":33}}],"line":297},"26":{"loc":{"start":{"line":298,"column":10},"end":{"line":298,"column":69}},"type":"binary-expr","locations":[{"start":{"line":298,"column":10},"end":{"line":298,"column":23}},{"start":{"line":298,"column":27},"end":{"line":298,"column":69}}],"line":298}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":365,"7":2193,"8":1451,"9":1,"10":23,"11":23,"12":1,"13":22,"14":1,"15":23,"16":23,"17":23,"18":23,"19":23,"20":23,"21":22,"22":22,"23":22,"24":2,"25":1,"26":1,"27":1,"28":21,"29":1,"30":25,"31":25,"32":25,"33":25,"34":6,"35":19,"36":25,"37":25,"38":365,"39":365,"40":365,"41":9,"42":4,"43":5,"44":356,"45":1068,"46":356,"47":356,"48":356,"49":712,"50":705,"51":7,"52":25,"53":1,"54":20,"55":20,"56":20,"57":20,"58":20,"59":26,"60":25,"61":25,"62":2,"63":2,"64":23,"65":23,"66":23,"67":23,"68":15,"69":42,"70":42,"71":42,"72":15,"73":15,"74":8,"75":26,"76":26,"77":26,"78":8,"79":8,"80":1,"81":20,"82":1,"83":22,"84":22,"85":1,"86":21,"87":0,"88":21,"89":1,"90":20,"91":20,"92":20,"93":3,"94":17,"95":23,"96":15,"97":0,"98":1,"99":22,"100":1,"101":1,"102":0,"103":0,"104":1,"105":4,"106":4,"107":0,"108":1,"109":1},"f":{"0":365,"1":2193,"2":23,"3":23,"4":25,"5":365,"6":1068,"7":20,"8":26,"9":42,"10":26,"11":22,"12":23,"13":22,"14":1,"15":4},"b":{"0":[1451,742],"1":[2193,1455],"2":[1,22],"3":[2,20],"4":[1,1],"5":[6,19],"6":[25,0],"7":[365,0],"8":[9,356],"9":[4,5],"10":[356,712],"11":[356,0],"12":[705,7],"13":[25,1],"14":[2,23],"15":[15,8,0],"16":[1,21],"17":[0,21],"18":[1,20],"19":[20,0],"20":[3,17],"21":[0,1],"22":[1,1],"23":[0,0],"24":[0,0],"25":[0,0],"26":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0eab15099d620dc3b0c393ba7d76f6b3fa5a72ea"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\googlepubsub\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\googlepubsub\\transform.js","statementMap":{"0":{"start":{"line":1,"column":53},"end":{"line":1,"column":74}},"1":{"start":{"line":3,"column":47},"end":{"line":3,"column":64}},"2":{"start":{"line":6,"column":35},"end":{"line":6,"column":40}},"3":{"start":{"line":7,"column":18},"end":{"line":7,"column":33}},"4":{"start":{"line":8,"column":2},"end":{"line":17,"column":3}},"5":{"start":{"line":9,"column":23},"end":{"line":9,"column":69}},"6":{"start":{"line":11,"column":4},"end":{"line":16,"column":6}},"7":{"start":{"line":18,"column":2},"end":{"line":18,"column":49}},"8":{"start":{"line":21,"column":26},"end":{"line":49,"column":1}},"9":{"start":{"line":22,"column":2},"end":{"line":25,"column":3}},"10":{"start":{"line":23,"column":23},"end":{"line":23,"column":75}},"11":{"start":{"line":24,"column":4},"end":{"line":24,"column":24}},"12":{"start":{"line":27,"column":19},"end":{"line":47,"column":3}},"13":{"start":{"line":29,"column":6},"end":{"line":45,"column":7}},"14":{"start":{"line":30,"column":8},"end":{"line":34,"column":10}},"15":{"start":{"line":36,"column":8},"end":{"line":44,"column":10}},"16":{"start":{"line":48,"column":2},"end":{"line":48,"column":18}},"17":{"start":{"line":51,"column":0},"end":{"line":51,"column":48}}},"fnMap":{"0":{"name":"process","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":16}},"loc":{"start":{"line":5,"column":24},"end":{"line":19,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":26},"end":{"line":21,"column":27}},"loc":{"start":{"line":21,"column":42},"end":{"line":49,"column":1}},"line":21},"2":{"name":"(anonymous_2)","decl":{"start":{"line":28,"column":15},"end":{"line":28,"column":16}},"loc":{"start":{"line":28,"column":30},"end":{"line":46,"column":5}},"line":28}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":2},"end":{"line":17,"column":3}},"type":"if","locations":[{"start":{"line":8,"column":2},"end":{"line":17,"column":3}},{"start":{"line":8,"column":2},"end":{"line":17,"column":3}}],"line":8},"1":{"loc":{"start":{"line":12,"column":14},"end":{"line":12,"column":51}},"type":"binary-expr","locations":[{"start":{"line":12,"column":14},"end":{"line":12,"column":28}},{"start":{"line":12,"column":32},"end":{"line":12,"column":51}}],"line":12},"2":{"loc":{"start":{"line":22,"column":2},"end":{"line":25,"column":3}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":25,"column":3}},{"start":{"line":22,"column":2},"end":{"line":25,"column":3}}],"line":22},"3":{"loc":{"start":{"line":22,"column":6},"end":{"line":22,"column":50}},"type":"binary-expr","locations":[{"start":{"line":22,"column":6},"end":{"line":22,"column":28}},{"start":{"line":22,"column":32},"end":{"line":22,"column":50}}],"line":22},"4":{"loc":{"start":{"line":38,"column":10},"end":{"line":42,"column":17}},"type":"cond-expr","locations":[{"start":{"line":39,"column":14},"end":{"line":39,"column":35}},{"start":{"line":40,"column":14},"end":{"line":42,"column":17}}],"line":38},"5":{"loc":{"start":{"line":40,"column":14},"end":{"line":42,"column":17}},"type":"cond-expr","locations":[{"start":{"line":41,"column":14},"end":{"line":41,"column":24}},{"start":{"line":42,"column":14},"end":{"line":42,"column":17}}],"line":40},"6":{"loc":{"start":{"line":43,"column":10},"end":{"line":43,"column":69}},"type":"binary-expr","locations":[{"start":{"line":43,"column":10},"end":{"line":43,"column":23}},{"start":{"line":43,"column":27},"end":{"line":43,"column":69}}],"line":43}},"s":{"0":1,"1":1,"2":13,"3":13,"4":13,"5":10,"6":10,"7":3,"8":1,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":1},"f":{"0":13,"1":0,"2":0},"b":{"0":[10,3],"1":[10,7],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"53ab34bfd891369a81d13a88263b53b9fc9928d0"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\googlepubsub\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\googlepubsub\\util.js","statementMap":{"0":{"start":{"line":7,"column":4},"end":{"line":7,"column":25}},"1":{"start":{"line":9,"column":20},"end":{"line":9,"column":62}},"2":{"start":{"line":10,"column":23},"end":{"line":12,"column":1}},"3":{"start":{"line":11,"column":2},"end":{"line":11,"column":61}},"4":{"start":{"line":19,"column":17},"end":{"line":29,"column":1}},"5":{"start":{"line":20,"column":22},"end":{"line":20,"column":27}},"6":{"start":{"line":21,"column":30},"end":{"line":21,"column":54}},"7":{"start":{"line":22,"column":18},"end":{"line":22,"column":65}},"8":{"start":{"line":24,"column":2},"end":{"line":28,"column":4}},"9":{"start":{"line":37,"column":33},"end":{"line":116,"column":1}},"10":{"start":{"line":44,"column":4},"end":{"line":46,"column":5}},"11":{"start":{"line":45,"column":6},"end":{"line":45,"column":18}},"12":{"start":{"line":48,"column":26},"end":{"line":48,"column":28}},"13":{"start":{"line":49,"column":4},"end":{"line":58,"column":7}},"14":{"start":{"line":50,"column":18},"end":{"line":50,"column":41}},"15":{"start":{"line":51,"column":6},"end":{"line":57,"column":7}},"16":{"start":{"line":52,"column":8},"end":{"line":56,"column":9}},"17":{"start":{"line":53,"column":10},"end":{"line":53,"column":43}},"18":{"start":{"line":55,"column":10},"end":{"line":55,"column":41}},"19":{"start":{"line":59,"column":4},"end":{"line":59,"column":25}},"20":{"start":{"line":65,"column":24},"end":{"line":65,"column":57}},"21":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"22":{"start":{"line":67,"column":6},"end":{"line":67,"column":41}},"23":{"start":{"line":71,"column":16},"end":{"line":71,"column":21}},"24":{"start":{"line":72,"column":4},"end":{"line":82,"column":7}},"25":{"start":{"line":73,"column":24},"end":{"line":73,"column":63}},"26":{"start":{"line":74,"column":6},"end":{"line":80,"column":7}},"27":{"start":{"line":75,"column":8},"end":{"line":75,"column":68}},"28":{"start":{"line":76,"column":8},"end":{"line":79,"column":9}},"29":{"start":{"line":77,"column":10},"end":{"line":77,"column":23}},"30":{"start":{"line":78,"column":10},"end":{"line":78,"column":22}},"31":{"start":{"line":81,"column":6},"end":{"line":81,"column":19}},"32":{"start":{"line":84,"column":4},"end":{"line":86,"column":5}},"33":{"start":{"line":85,"column":6},"end":{"line":85,"column":33}},"34":{"start":{"line":87,"column":4},"end":{"line":87,"column":16}},"35":{"start":{"line":91,"column":23},"end":{"line":91,"column":25}},"36":{"start":{"line":93,"column":24},"end":{"line":93,"column":74}},"37":{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},"38":{"start":{"line":95,"column":4},"end":{"line":95,"column":24}},"39":{"start":{"line":99,"column":4},"end":{"line":101,"column":22}},"40":{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},"41":{"start":{"line":104,"column":4},"end":{"line":104,"column":24}},"42":{"start":{"line":107,"column":2},"end":{"line":114,"column":5}},"43":{"start":{"line":108,"column":16},"end":{"line":108,"column":44}},"44":{"start":{"line":109,"column":4},"end":{"line":113,"column":5}},"45":{"start":{"line":110,"column":29},"end":{"line":110,"column":43}},"46":{"start":{"line":111,"column":25},"end":{"line":111,"column":66}},"47":{"start":{"line":112,"column":6},"end":{"line":112,"column":37}},"48":{"start":{"line":115,"column":2},"end":{"line":115,"column":22}},"49":{"start":{"line":118,"column":0},"end":{"line":121,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":23},"end":{"line":10,"column":24}},"loc":{"start":{"line":10,"column":30},"end":{"line":12,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":17},"end":{"line":19,"column":18}},"loc":{"start":{"line":19,"column":26},"end":{"line":29,"column":1}},"line":19},"2":{"name":"(anonymous_2)","decl":{"start":{"line":37,"column":33},"end":{"line":37,"column":34}},"loc":{"start":{"line":37,"column":58},"end":{"line":116,"column":1}},"line":37},"3":{"name":"generateAttributesMap","decl":{"start":{"line":43,"column":11},"end":{"line":43,"column":32}},"loc":{"start":{"line":43,"column":55},"end":{"line":60,"column":3}},"line":43},"4":{"name":"(anonymous_4)","decl":{"start":{"line":49,"column":33},"end":{"line":49,"column":34}},"loc":{"start":{"line":49,"column":41},"end":{"line":58,"column":5}},"line":49},"5":{"name":"getAttributeValueOrNull","decl":{"start":{"line":63,"column":11},"end":{"line":63,"column":34}},"loc":{"start":{"line":63,"column":40},"end":{"line":88,"column":3}},"line":63},"6":{"name":"(anonymous_6)","decl":{"start":{"line":72,"column":21},"end":{"line":72,"column":22}},"loc":{"start":{"line":72,"column":34},"end":{"line":82,"column":5}},"line":72},"7":{"name":"(anonymous_7)","decl":{"start":{"line":107,"column":24},"end":{"line":107,"column":25}},"loc":{"start":{"line":107,"column":31},"end":{"line":114,"column":3}},"line":107}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":9},"end":{"line":11,"column":60}},"type":"cond-expr","locations":[{"start":{"line":11,"column":35},"end":{"line":11,"column":38}},{"start":{"line":11,"column":41},"end":{"line":11,"column":60}}],"line":11},"1":{"loc":{"start":{"line":25,"column":4},"end":{"line":27,"column":16}},"type":"binary-expr","locations":[{"start":{"line":25,"column":5},"end":{"line":25,"column":64}},{"start":{"line":26,"column":4},"end":{"line":26,"column":39}},{"start":{"line":27,"column":4},"end":{"line":27,"column":16}}],"line":25},"2":{"loc":{"start":{"line":25,"column":5},"end":{"line":25,"column":64}},"type":"cond-expr","locations":[{"start":{"line":25,"column":21},"end":{"line":25,"column":57}},{"start":{"line":25,"column":60},"end":{"line":25,"column":64}}],"line":25},"3":{"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":5}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":46,"column":5}},{"start":{"line":44,"column":4},"end":{"line":46,"column":5}}],"line":44},"4":{"loc":{"start":{"line":44,"column":8},"end":{"line":44,"column":66}},"type":"binary-expr","locations":[{"start":{"line":44,"column":8},"end":{"line":44,"column":29}},{"start":{"line":44,"column":33},"end":{"line":44,"column":66}}],"line":44},"5":{"loc":{"start":{"line":51,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":51,"column":6},"end":{"line":57,"column":7}},{"start":{"line":51,"column":6},"end":{"line":57,"column":7}}],"line":51},"6":{"loc":{"start":{"line":52,"column":8},"end":{"line":56,"column":9}},"type":"if","locations":[{"start":{"line":52,"column":8},"end":{"line":56,"column":9}},{"start":{"line":52,"column":8},"end":{"line":56,"column":9}}],"line":52},"7":{"loc":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},{"start":{"line":66,"column":4},"end":{"line":68,"column":5}}],"line":66},"8":{"loc":{"start":{"line":74,"column":6},"end":{"line":80,"column":7}},"type":"if","locations":[{"start":{"line":74,"column":6},"end":{"line":80,"column":7}},{"start":{"line":74,"column":6},"end":{"line":80,"column":7}}],"line":74},"9":{"loc":{"start":{"line":75,"column":14},"end":{"line":75,"column":67}},"type":"binary-expr","locations":[{"start":{"line":75,"column":14},"end":{"line":75,"column":28}},{"start":{"line":75,"column":32},"end":{"line":75,"column":67}}],"line":75},"10":{"loc":{"start":{"line":76,"column":8},"end":{"line":79,"column":9}},"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":79,"column":9}},{"start":{"line":76,"column":8},"end":{"line":79,"column":9}}],"line":76},"11":{"loc":{"start":{"line":84,"column":4},"end":{"line":86,"column":5}},"type":"if","locations":[{"start":{"line":84,"column":4},"end":{"line":86,"column":5}},{"start":{"line":84,"column":4},"end":{"line":86,"column":5}}],"line":84},"12":{"loc":{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},"type":"if","locations":[{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},{"start":{"line":94,"column":2},"end":{"line":96,"column":3}}],"line":94},"13":{"loc":{"start":{"line":94,"column":6},"end":{"line":94,"column":63}},"type":"binary-expr","locations":[{"start":{"line":94,"column":6},"end":{"line":94,"column":20}},{"start":{"line":94,"column":24},"end":{"line":94,"column":63}}],"line":94},"14":{"loc":{"start":{"line":99,"column":4},"end":{"line":101,"column":22}},"type":"binary-expr","locations":[{"start":{"line":99,"column":5},"end":{"line":99,"column":70}},{"start":{"line":100,"column":4},"end":{"line":100,"column":45}},{"start":{"line":101,"column":4},"end":{"line":101,"column":22}}],"line":99},"15":{"loc":{"start":{"line":99,"column":5},"end":{"line":99,"column":70}},"type":"cond-expr","locations":[{"start":{"line":99,"column":21},"end":{"line":99,"column":63}},{"start":{"line":99,"column":66},"end":{"line":99,"column":70}}],"line":99},"16":{"loc":{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},{"start":{"line":103,"column":2},"end":{"line":105,"column":3}}],"line":103},"17":{"loc":{"start":{"line":103,"column":6},"end":{"line":103,"column":50}},"type":"binary-expr","locations":[{"start":{"line":103,"column":6},"end":{"line":103,"column":20}},{"start":{"line":103,"column":24},"end":{"line":103,"column":50}}],"line":103},"18":{"loc":{"start":{"line":109,"column":4},"end":{"line":113,"column":5}},"type":"if","locations":[{"start":{"line":109,"column":4},"end":{"line":113,"column":5}},{"start":{"line":109,"column":4},"end":{"line":113,"column":5}}],"line":109}},"s":{"0":1,"1":1,"2":1,"3":6,"4":1,"5":13,"6":13,"7":13,"8":13,"9":1,"10":10,"11":5,"12":5,"13":5,"14":8,"15":8,"16":8,"17":2,"18":6,"19":5,"20":6,"21":6,"22":2,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"30":4,"31":0,"32":4,"33":4,"34":0,"35":10,"36":10,"37":10,"38":5,"39":5,"40":5,"41":0,"42":5,"43":6,"44":6,"45":6,"46":6,"47":6,"48":5,"49":1},"f":{"0":6,"1":13,"2":10,"3":10,"4":8,"5":6,"6":4,"7":6},"b":{"0":[6,0],"1":[13,11,4],"2":[8,5],"3":[5,5],"4":[10,5],"5":[8,0],"6":[2,6],"7":[2,4],"8":[4,0],"9":[4,1],"10":[4,0],"11":[4,0],"12":[5,5],"13":[10,5],"14":[5,4,0],"15":[3,2],"16":[0,5],"17":[5,5],"18":[6,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"829a1a43e8ffc5697f52130a7ba3382a263ad4df"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\googlesheets\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\googlesheets\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":7,"column":4},"end":{"line":7,"column":25}},"2":{"start":{"line":9,"column":20},"end":{"line":9,"column":62}},"3":{"start":{"line":21,"column":40},"end":{"line":28,"column":1}},"4":{"start":{"line":23,"column":20},"end":{"line":23,"column":59}},"5":{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},"6":{"start":{"line":25,"column":4},"end":{"line":25,"column":64}},"7":{"start":{"line":27,"column":2},"end":{"line":27,"column":15}},"8":{"start":{"line":43,"column":33},"end":{"line":88,"column":1}},"9":{"start":{"line":44,"column":26},"end":{"line":44,"column":28}},"10":{"start":{"line":45,"column":18},"end":{"line":45,"column":24}},"11":{"start":{"line":46,"column":16},"end":{"line":46,"column":20}},"12":{"start":{"line":47,"column":14},"end":{"line":47,"column":15}},"13":{"start":{"line":54,"column":2},"end":{"line":57,"column":4}},"14":{"start":{"line":58,"column":2},"end":{"line":58,"column":13}},"15":{"start":{"line":60,"column":2},"end":{"line":86,"column":3}},"16":{"start":{"line":61,"column":4},"end":{"line":85,"column":7}},"17":{"start":{"line":64,"column":6},"end":{"line":64,"column":61}},"18":{"start":{"line":65,"column":6},"end":{"line":78,"column":7}},"19":{"start":{"line":67,"column":8},"end":{"line":77,"column":11}},"20":{"start":{"line":68,"column":10},"end":{"line":72,"column":12}},"21":{"start":{"line":73,"column":10},"end":{"line":75,"column":11}},"22":{"start":{"line":74,"column":12},"end":{"line":74,"column":24}},"23":{"start":{"line":76,"column":10},"end":{"line":76,"column":23}},"24":{"start":{"line":80,"column":6},"end":{"line":83,"column":8}},"25":{"start":{"line":84,"column":6},"end":{"line":84,"column":17}},"26":{"start":{"line":87,"column":2},"end":{"line":87,"column":25}},"27":{"start":{"line":91,"column":16},"end":{"line":105,"column":1}},"28":{"start":{"line":92,"column":35},"end":{"line":92,"column":40}},"29":{"start":{"line":93,"column":2},"end":{"line":103,"column":3}},"30":{"start":{"line":94,"column":20},"end":{"line":101,"column":5}},"31":{"start":{"line":102,"column":4},"end":{"line":102,"column":19}},"32":{"start":{"line":104,"column":2},"end":{"line":104,"column":67}},"33":{"start":{"line":107,"column":26},"end":{"line":144,"column":1}},"34":{"start":{"line":108,"column":2},"end":{"line":111,"column":3}},"35":{"start":{"line":109,"column":23},"end":{"line":109,"column":75}},"36":{"start":{"line":110,"column":4},"end":{"line":110,"column":24}},"37":{"start":{"line":113,"column":19},"end":{"line":142,"column":3}},"38":{"start":{"line":115,"column":6},"end":{"line":140,"column":7}},"39":{"start":{"line":116,"column":8},"end":{"line":123,"column":9}},"40":{"start":{"line":118,"column":10},"end":{"line":122,"column":12}},"41":{"start":{"line":125,"column":8},"end":{"line":129,"column":10}},"42":{"start":{"line":131,"column":8},"end":{"line":139,"column":10}},"43":{"start":{"line":143,"column":2},"end":{"line":143,"column":18}},"44":{"start":{"line":146,"column":0},"end":{"line":146,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":21,"column":40},"end":{"line":21,"column":41}},"loc":{"start":{"line":21,"column":76},"end":{"line":28,"column":1}},"line":21},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":33},"end":{"line":43,"column":34}},"loc":{"start":{"line":43,"column":67},"end":{"line":88,"column":1}},"line":43},"2":{"name":"(anonymous_2)","decl":{"start":{"line":61,"column":32},"end":{"line":61,"column":33}},"loc":{"start":{"line":61,"column":43},"end":{"line":85,"column":5}},"line":61},"3":{"name":"(anonymous_3)","decl":{"start":{"line":67,"column":25},"end":{"line":67,"column":26}},"loc":{"start":{"line":67,"column":38},"end":{"line":77,"column":9}},"line":67},"4":{"name":"(anonymous_4)","decl":{"start":{"line":91,"column":16},"end":{"line":91,"column":17}},"loc":{"start":{"line":91,"column":25},"end":{"line":105,"column":1}},"line":91},"5":{"name":"(anonymous_5)","decl":{"start":{"line":107,"column":26},"end":{"line":107,"column":27}},"loc":{"start":{"line":107,"column":42},"end":{"line":144,"column":1}},"line":107},"6":{"name":"(anonymous_6)","decl":{"start":{"line":114,"column":15},"end":{"line":114,"column":16}},"loc":{"start":{"line":114,"column":30},"end":{"line":141,"column":5}},"line":114}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},{"start":{"line":24,"column":2},"end":{"line":26,"column":3}}],"line":24},"1":{"loc":{"start":{"line":25,"column":12},"end":{"line":25,"column":63}},"type":"binary-expr","locations":[{"start":{"line":25,"column":12},"end":{"line":25,"column":33}},{"start":{"line":25,"column":37},"end":{"line":25,"column":63}}],"line":25},"2":{"loc":{"start":{"line":56,"column":20},"end":{"line":56,"column":43}},"type":"binary-expr","locations":[{"start":{"line":56,"column":20},"end":{"line":56,"column":37}},{"start":{"line":56,"column":41},"end":{"line":56,"column":43}}],"line":56},"3":{"loc":{"start":{"line":60,"column":2},"end":{"line":86,"column":3}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":86,"column":3}},{"start":{"line":60,"column":2},"end":{"line":86,"column":3}}],"line":60},"4":{"loc":{"start":{"line":65,"column":6},"end":{"line":78,"column":7}},"type":"if","locations":[{"start":{"line":65,"column":6},"end":{"line":78,"column":7}},{"start":{"line":65,"column":6},"end":{"line":78,"column":7}}],"line":65},"5":{"loc":{"start":{"line":73,"column":10},"end":{"line":75,"column":11}},"type":"if","locations":[{"start":{"line":73,"column":10},"end":{"line":75,"column":11}},{"start":{"line":73,"column":10},"end":{"line":75,"column":11}}],"line":73},"6":{"loc":{"start":{"line":82,"column":24},"end":{"line":82,"column":35}},"type":"binary-expr","locations":[{"start":{"line":82,"column":24},"end":{"line":82,"column":29}},{"start":{"line":82,"column":33},"end":{"line":82,"column":35}}],"line":82},"7":{"loc":{"start":{"line":93,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":93,"column":2},"end":{"line":103,"column":3}},{"start":{"line":93,"column":2},"end":{"line":103,"column":3}}],"line":93},"8":{"loc":{"start":{"line":108,"column":2},"end":{"line":111,"column":3}},"type":"if","locations":[{"start":{"line":108,"column":2},"end":{"line":111,"column":3}},{"start":{"line":108,"column":2},"end":{"line":111,"column":3}}],"line":108},"9":{"loc":{"start":{"line":108,"column":6},"end":{"line":108,"column":50}},"type":"binary-expr","locations":[{"start":{"line":108,"column":6},"end":{"line":108,"column":28}},{"start":{"line":108,"column":32},"end":{"line":108,"column":50}}],"line":108},"10":{"loc":{"start":{"line":116,"column":8},"end":{"line":123,"column":9}},"type":"if","locations":[{"start":{"line":116,"column":8},"end":{"line":123,"column":9}},{"start":{"line":116,"column":8},"end":{"line":123,"column":9}}],"line":116},"11":{"loc":{"start":{"line":133,"column":10},"end":{"line":137,"column":17}},"type":"cond-expr","locations":[{"start":{"line":134,"column":14},"end":{"line":134,"column":35}},{"start":{"line":135,"column":14},"end":{"line":137,"column":17}}],"line":133},"12":{"loc":{"start":{"line":135,"column":14},"end":{"line":137,"column":17}},"type":"cond-expr","locations":[{"start":{"line":136,"column":14},"end":{"line":136,"column":24}},{"start":{"line":137,"column":14},"end":{"line":137,"column":17}}],"line":135},"13":{"loc":{"start":{"line":138,"column":10},"end":{"line":138,"column":69}},"type":"binary-expr","locations":[{"start":{"line":138,"column":10},"end":{"line":138,"column":23}},{"start":{"line":138,"column":27},"end":{"line":138,"column":69}}],"line":138}},"s":{"0":1,"1":1,"2":1,"3":1,"4":149,"5":149,"6":51,"7":149,"8":1,"9":5,"10":5,"11":5,"12":5,"13":5,"14":5,"15":5,"16":5,"17":70,"18":70,"19":56,"20":149,"21":149,"22":13,"23":136,"24":70,"25":70,"26":5,"27":1,"28":6,"29":6,"30":5,"31":5,"32":1,"33":1,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":1},"f":{"0":149,"1":5,"2":70,"3":149,"4":6,"5":0,"6":0},"b":{"0":[51,98],"1":[51,40],"2":[5,4],"3":[5,0],"4":[56,14],"5":[13,136],"6":[70,43],"7":[5,1],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c8b7d458ccce3de47f6311e8aa28772bc0a8bfa8"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\hs\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\hs\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":23},"end":{"line":7,"column":1}},"2":{"start":{"line":9,"column":22},"end":{"line":9,"column":65}},"3":{"start":{"line":10,"column":31},"end":{"line":10,"column":82}},"4":{"start":{"line":11,"column":23},"end":{"line":11,"column":27}},"5":{"start":{"line":13,"column":0},"end":{"line":18,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"45158674fcad6a229e57f0097fe98d3a5ab6166c"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\hs\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\hs\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":14},"end":{"line":3,"column":30}},"3":{"start":{"line":4,"column":46},"end":{"line":4,"column":75}},"4":{"start":{"line":16,"column":4},"end":{"line":16,"column":25}},"5":{"start":{"line":22,"column":4},"end":{"line":22,"column":23}},"6":{"start":{"line":23,"column":36},"end":{"line":23,"column":53}},"7":{"start":{"line":25,"column":29},"end":{"line":25,"column":72}},"8":{"start":{"line":27,"column":25},"end":{"line":27,"column":27}},"9":{"start":{"line":30,"column":20},"end":{"line":30,"column":37}},"10":{"start":{"line":31,"column":2},"end":{"line":31,"column":48}},"11":{"start":{"line":32,"column":2},"end":{"line":32,"column":48}},"12":{"start":{"line":33,"column":2},"end":{"line":33,"column":21}},"13":{"start":{"line":37,"column":15},"end":{"line":37,"column":58}},"14":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"15":{"start":{"line":39,"column":4},"end":{"line":39,"column":32}},"16":{"start":{"line":42,"column":2},"end":{"line":42,"column":16}},"17":{"start":{"line":46,"column":2},"end":{"line":74,"column":3}},"18":{"start":{"line":48,"column":23},"end":{"line":48,"column":41}},"19":{"start":{"line":49,"column":16},"end":{"line":49,"column":92}},"20":{"start":{"line":50,"column":4},"end":{"line":67,"column":5}},"21":{"start":{"line":51,"column":6},"end":{"line":51,"column":38}},"22":{"start":{"line":55,"column":6},"end":{"line":62,"column":7}},"23":{"start":{"line":56,"column":8},"end":{"line":61,"column":10}},"24":{"start":{"line":63,"column":6},"end":{"line":66,"column":8}},"25":{"start":{"line":69,"column":24},"end":{"line":69,"column":26}},"26":{"start":{"line":70,"column":4},"end":{"line":72,"column":7}},"27":{"start":{"line":71,"column":6},"end":{"line":71,"column":47}},"28":{"start":{"line":73,"column":4},"end":{"line":73,"column":37}},"29":{"start":{"line":75,"column":2},"end":{"line":75,"column":28}},"30":{"start":{"line":84,"column":21},"end":{"line":84,"column":23}},"31":{"start":{"line":85,"column":21},"end":{"line":85,"column":45}},"32":{"start":{"line":86,"column":17},"end":{"line":86,"column":35}},"33":{"start":{"line":88,"column":2},"end":{"line":111,"column":3}},"34":{"start":{"line":89,"column":23},"end":{"line":89,"column":42}},"35":{"start":{"line":90,"column":4},"end":{"line":92,"column":5}},"36":{"start":{"line":91,"column":6},"end":{"line":91,"column":53}},"37":{"start":{"line":93,"column":4},"end":{"line":97,"column":7}},"38":{"start":{"line":94,"column":6},"end":{"line":96,"column":7}},"39":{"start":{"line":95,"column":8},"end":{"line":95,"column":72}},"40":{"start":{"line":98,"column":4},"end":{"line":110,"column":7}},"41":{"start":{"line":99,"column":29},"end":{"line":99,"column":46}},"42":{"start":{"line":100,"column":6},"end":{"line":109,"column":7}},"43":{"start":{"line":101,"column":24},"end":{"line":101,"column":41}},"44":{"start":{"line":102,"column":8},"end":{"line":107,"column":9}},"45":{"start":{"line":103,"column":23},"end":{"line":103,"column":32}},"46":{"start":{"line":104,"column":23},"end":{"line":104,"column":37}},"47":{"start":{"line":105,"column":10},"end":{"line":105,"column":39}},"48":{"start":{"line":106,"column":10},"end":{"line":106,"column":37}},"49":{"start":{"line":108,"column":8},"end":{"line":108,"column":47}},"50":{"start":{"line":112,"column":2},"end":{"line":112,"column":27}},"51":{"start":{"line":116,"column":2},"end":{"line":118,"column":5}},"52":{"start":{"line":117,"column":4},"end":{"line":117,"column":50}},"53":{"start":{"line":122,"column":17},"end":{"line":122,"column":53}},"54":{"start":{"line":123,"column":15},"end":{"line":123,"column":17}},"55":{"start":{"line":125,"column":19},"end":{"line":125,"column":41}},"56":{"start":{"line":126,"column":2},"end":{"line":126,"column":58}},"57":{"start":{"line":128,"column":2},"end":{"line":142,"column":3}},"58":{"start":{"line":129,"column":19},"end":{"line":129,"column":62}},"59":{"start":{"line":130,"column":22},"end":{"line":130,"column":28}},"60":{"start":{"line":131,"column":23},"end":{"line":131,"column":41}},"61":{"start":{"line":132,"column":4},"end":{"line":132,"column":33}},"62":{"start":{"line":133,"column":4},"end":{"line":137,"column":5}},"63":{"start":{"line":134,"column":6},"end":{"line":134,"column":92}},"64":{"start":{"line":136,"column":6},"end":{"line":136,"column":62}},"65":{"start":{"line":138,"column":4},"end":{"line":138,"column":61}},"66":{"start":{"line":139,"column":4},"end":{"line":139,"column":56}},"67":{"start":{"line":141,"column":4},"end":{"line":141,"column":44}},"68":{"start":{"line":143,"column":2},"end":{"line":145,"column":4}},"69":{"start":{"line":146,"column":2},"end":{"line":146,"column":31}},"70":{"start":{"line":147,"column":2},"end":{"line":147,"column":40}},"71":{"start":{"line":148,"column":2},"end":{"line":148,"column":27}},"72":{"start":{"line":149,"column":2},"end":{"line":149,"column":28}},"73":{"start":{"line":151,"column":2},"end":{"line":151,"column":18}},"74":{"start":{"line":155,"column":21},"end":{"line":158,"column":3}},"75":{"start":{"line":160,"column":2},"end":{"line":166,"column":3}},"76":{"start":{"line":165,"column":4},"end":{"line":165,"column":78}},"77":{"start":{"line":167,"column":25},"end":{"line":172,"column":3}},"78":{"start":{"line":174,"column":2},"end":{"line":179,"column":4}},"79":{"start":{"line":187,"column":17},"end":{"line":187,"column":60}},"80":{"start":{"line":188,"column":30},"end":{"line":188,"column":66}},"81":{"start":{"line":190,"column":2},"end":{"line":192,"column":3}},"82":{"start":{"line":191,"column":4},"end":{"line":191,"column":35}},"83":{"start":{"line":194,"column":2},"end":{"line":196,"column":3}},"84":{"start":{"line":195,"column":4},"end":{"line":195,"column":75}},"85":{"start":{"line":197,"column":25},"end":{"line":202,"column":3}},"86":{"start":{"line":203,"column":21},"end":{"line":203,"column":64}},"87":{"start":{"line":204,"column":2},"end":{"line":209,"column":4}},"88":{"start":{"line":215,"column":2},"end":{"line":217,"column":3}},"89":{"start":{"line":216,"column":4},"end":{"line":216,"column":59}},"90":{"start":{"line":219,"column":2},"end":{"line":231,"column":3}},"91":{"start":{"line":221,"column":6},"end":{"line":221,"column":71}},"92":{"start":{"line":222,"column":6},"end":{"line":222,"column":12}},"93":{"start":{"line":224,"column":6},"end":{"line":224,"column":74}},"94":{"start":{"line":225,"column":6},"end":{"line":225,"column":12}},"95":{"start":{"line":227,"column":6},"end":{"line":230,"column":8}},"96":{"start":{"line":233,"column":2},"end":{"line":233,"column":18}},"97":{"start":{"line":238,"column":2},"end":{"line":238,"column":64}},"98":{"start":{"line":242,"column":30},"end":{"line":242,"column":32}},"99":{"start":{"line":243,"column":28},"end":{"line":243,"column":30}},"100":{"start":{"line":244,"column":20},"end":{"line":244,"column":22}},"101":{"start":{"line":245,"column":30},"end":{"line":245,"column":32}},"102":{"start":{"line":246,"column":2},"end":{"line":279,"column":5}},"103":{"start":{"line":248,"column":4},"end":{"line":271,"column":5}},"104":{"start":{"line":249,"column":49},"end":{"line":249,"column":54}},"105":{"start":{"line":250,"column":23},"end":{"line":250,"column":47}},"106":{"start":{"line":252,"column":30},"end":{"line":252,"column":57}},"107":{"start":{"line":253,"column":6},"end":{"line":253,"column":63}},"108":{"start":{"line":254,"column":6},"end":{"line":254,"column":57}},"109":{"start":{"line":255,"column":6},"end":{"line":255,"column":57}},"110":{"start":{"line":256,"column":6},"end":{"line":256,"column":61}},"111":{"start":{"line":257,"column":6},"end":{"line":258,"column":46}},"112":{"start":{"line":259,"column":6},"end":{"line":259,"column":44}},"113":{"start":{"line":260,"column":6},"end":{"line":260,"column":48}},"114":{"start":{"line":262,"column":6},"end":{"line":268,"column":8}},"115":{"start":{"line":270,"column":6},"end":{"line":270,"column":30}},"116":{"start":{"line":272,"column":4},"end":{"line":278,"column":5}},"117":{"start":{"line":276,"column":6},"end":{"line":276,"column":44}},"118":{"start":{"line":277,"column":6},"end":{"line":277,"column":23}},"119":{"start":{"line":282,"column":2},"end":{"line":328,"column":5}},"120":{"start":{"line":283,"column":33},"end":{"line":283,"column":35}},"121":{"start":{"line":284,"column":21},"end":{"line":284,"column":23}},"122":{"start":{"line":288,"column":28},"end":{"line":288,"column":36}},"123":{"start":{"line":289,"column":23},"end":{"line":289,"column":41}},"124":{"start":{"line":290,"column":19},"end":{"line":290,"column":38}},"125":{"start":{"line":292,"column":29},"end":{"line":292,"column":56}},"126":{"start":{"line":294,"column":4},"end":{"line":304,"column":7}},"127":{"start":{"line":295,"column":43},"end":{"line":297,"column":7}},"128":{"start":{"line":298,"column":6},"end":{"line":298,"column":58}},"129":{"start":{"line":299,"column":6},"end":{"line":302,"column":9}},"130":{"start":{"line":303,"column":6},"end":{"line":303,"column":33}},"131":{"start":{"line":306,"column":4},"end":{"line":308,"column":6}},"132":{"start":{"line":310,"column":4},"end":{"line":310,"column":72}},"133":{"start":{"line":311,"column":4},"end":{"line":313,"column":6}},"134":{"start":{"line":314,"column":4},"end":{"line":314,"column":54}},"135":{"start":{"line":315,"column":4},"end":{"line":319,"column":6}},"136":{"start":{"line":320,"column":4},"end":{"line":327,"column":6}},"137":{"start":{"line":330,"column":2},"end":{"line":330,"column":55}},"138":{"start":{"line":333,"column":26},"end":{"line":390,"column":1}},"139":{"start":{"line":334,"column":2},"end":{"line":337,"column":3}},"140":{"start":{"line":335,"column":23},"end":{"line":335,"column":75}},"141":{"start":{"line":336,"column":4},"end":{"line":336,"column":24}},"142":{"start":{"line":339,"column":26},"end":{"line":339,"column":28}},"143":{"start":{"line":340,"column":24},"end":{"line":340,"column":26}},"144":{"start":{"line":342,"column":26},"end":{"line":342,"column":35}},"145":{"start":{"line":345,"column":22},"end":{"line":347,"column":4}},"146":{"start":{"line":346,"column":4},"end":{"line":346,"column":50}},"147":{"start":{"line":348,"column":2},"end":{"line":350,"column":3}},"148":{"start":{"line":349,"column":4},"end":{"line":349,"column":51}},"149":{"start":{"line":351,"column":2},"end":{"line":383,"column":4}},"150":{"start":{"line":353,"column":6},"end":{"line":381,"column":7}},"151":{"start":{"line":354,"column":8},"end":{"line":372,"column":9}},"152":{"start":{"line":356,"column":10},"end":{"line":360,"column":13}},"153":{"start":{"line":363,"column":10},"end":{"line":371,"column":13}},"154":{"start":{"line":374,"column":8},"end":{"line":380,"column":10}},"155":{"start":{"line":385,"column":28},"end":{"line":385,"column":30}},"156":{"start":{"line":386,"column":2},"end":{"line":388,"column":3}},"157":{"start":{"line":387,"column":4},"end":{"line":387,"column":61}},"158":{"start":{"line":389,"column":2},"end":{"line":389,"column":52}},"159":{"start":{"line":392,"column":0},"end":{"line":392,"column":48}}},"fnMap":{"0":{"name":"getKey","decl":{"start":{"line":29,"column":9},"end":{"line":29,"column":15}},"loc":{"start":{"line":29,"column":21},"end":{"line":34,"column":1}},"line":29},"1":{"name":"getTraits","decl":{"start":{"line":36,"column":9},"end":{"line":36,"column":18}},"loc":{"start":{"line":36,"column":28},"end":{"line":43,"column":1}},"line":36},"2":{"name":"getProperties","decl":{"start":{"line":45,"column":15},"end":{"line":45,"column":28}},"loc":{"start":{"line":45,"column":42},"end":{"line":76,"column":1}},"line":45},"3":{"name":"(anonymous_3)","decl":{"start":{"line":70,"column":26},"end":{"line":70,"column":27}},"loc":{"start":{"line":70,"column":37},"end":{"line":72,"column":5}},"line":70},"4":{"name":"getTransformedJSON","decl":{"start":{"line":78,"column":15},"end":{"line":78,"column":33}},"loc":{"start":{"line":83,"column":2},"end":{"line":113,"column":1}},"line":83},"5":{"name":"(anonymous_5)","decl":{"start":{"line":93,"column":23},"end":{"line":93,"column":24}},"loc":{"start":{"line":93,"column":36},"end":{"line":97,"column":5}},"line":93},"6":{"name":"(anonymous_6)","decl":{"start":{"line":98,"column":23},"end":{"line":98,"column":24}},"loc":{"start":{"line":98,"column":36},"end":{"line":110,"column":5}},"line":98},"7":{"name":"getPropertyValueForIdentify","decl":{"start":{"line":115,"column":9},"end":{"line":115,"column":36}},"loc":{"start":{"line":115,"column":46},"end":{"line":119,"column":1}},"line":115},"8":{"name":"(anonymous_8)","decl":{"start":{"line":116,"column":34},"end":{"line":116,"column":35}},"loc":{"start":{"line":116,"column":41},"end":{"line":118,"column":3}},"line":116},"9":{"name":"responseBuilderSimple","decl":{"start":{"line":121,"column":9},"end":{"line":121,"column":30}},"loc":{"start":{"line":121,"column":73},"end":{"line":152,"column":1}},"line":121},"10":{"name":"processTrack","decl":{"start":{"line":154,"column":15},"end":{"line":154,"column":27}},"loc":{"start":{"line":154,"column":63},"end":{"line":180,"column":1}},"line":154},"11":{"name":"processIdentify","decl":{"start":{"line":186,"column":15},"end":{"line":186,"column":30}},"loc":{"start":{"line":186,"column":66},"end":{"line":210,"column":1}},"line":186},"12":{"name":"processSingleMessage","decl":{"start":{"line":212,"column":15},"end":{"line":212,"column":35}},"loc":{"start":{"line":212,"column":71},"end":{"line":234,"column":1}},"line":212},"13":{"name":"process","decl":{"start":{"line":237,"column":9},"end":{"line":237,"column":16}},"loc":{"start":{"line":237,"column":24},"end":{"line":239,"column":1}},"line":237},"14":{"name":"batchEvents","decl":{"start":{"line":241,"column":9},"end":{"line":241,"column":20}},"loc":{"start":{"line":241,"column":33},"end":{"line":331,"column":1}},"line":241},"15":{"name":"(anonymous_15)","decl":{"start":{"line":246,"column":21},"end":{"line":246,"column":22}},"loc":{"start":{"line":246,"column":39},"end":{"line":279,"column":3}},"line":246},"16":{"name":"(anonymous_16)","decl":{"start":{"line":282,"column":30},"end":{"line":282,"column":31}},"loc":{"start":{"line":282,"column":39},"end":{"line":328,"column":3}},"line":282},"17":{"name":"(anonymous_17)","decl":{"start":{"line":294,"column":18},"end":{"line":294,"column":19}},"loc":{"start":{"line":294,"column":24},"end":{"line":304,"column":5}},"line":294},"18":{"name":"(anonymous_18)","decl":{"start":{"line":333,"column":26},"end":{"line":333,"column":27}},"loc":{"start":{"line":333,"column":42},"end":{"line":390,"column":1}},"line":333},"19":{"name":"(anonymous_19)","decl":{"start":{"line":345,"column":34},"end":{"line":345,"column":35}},"loc":{"start":{"line":345,"column":43},"end":{"line":347,"column":3}},"line":345},"20":{"name":"(anonymous_20)","decl":{"start":{"line":352,"column":15},"end":{"line":352,"column":16}},"loc":{"start":{"line":352,"column":30},"end":{"line":382,"column":5}},"line":352}},"branchMap":{"0":{"loc":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},{"start":{"line":38,"column":2},"end":{"line":40,"column":3}}],"line":38},"1":{"loc":{"start":{"line":38,"column":6},"end":{"line":38,"column":44}},"type":"binary-expr","locations":[{"start":{"line":38,"column":6},"end":{"line":38,"column":13}},{"start":{"line":38,"column":17},"end":{"line":38,"column":44}}],"line":38},"2":{"loc":{"start":{"line":46,"column":2},"end":{"line":74,"column":3}},"type":"if","locations":[{"start":{"line":46,"column":2},"end":{"line":74,"column":3}},{"start":{"line":46,"column":2},"end":{"line":74,"column":3}}],"line":46},"3":{"loc":{"start":{"line":55,"column":6},"end":{"line":62,"column":7}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":62,"column":7}},{"start":{"line":55,"column":6},"end":{"line":62,"column":7}}],"line":55},"4":{"loc":{"start":{"line":57,"column":10},"end":{"line":59,"column":46}},"type":"binary-expr","locations":[{"start":{"line":57,"column":10},"end":{"line":57,"column":43}},{"start":{"line":58,"column":12},"end":{"line":58,"column":51}},{"start":{"line":59,"column":12},"end":{"line":59,"column":46}}],"line":57},"5":{"loc":{"start":{"line":60,"column":10},"end":{"line":60,"column":36}},"type":"binary-expr","locations":[{"start":{"line":60,"column":10},"end":{"line":60,"column":29}},{"start":{"line":60,"column":33},"end":{"line":60,"column":36}}],"line":60},"6":{"loc":{"start":{"line":88,"column":2},"end":{"line":111,"column":3}},"type":"if","locations":[{"start":{"line":88,"column":2},"end":{"line":111,"column":3}},{"start":{"line":88,"column":2},"end":{"line":111,"column":3}}],"line":88},"7":{"loc":{"start":{"line":90,"column":4},"end":{"line":92,"column":5}},"type":"if","locations":[{"start":{"line":90,"column":4},"end":{"line":92,"column":5}},{"start":{"line":90,"column":4},"end":{"line":92,"column":5}}],"line":90},"8":{"loc":{"start":{"line":94,"column":6},"end":{"line":96,"column":7}},"type":"if","locations":[{"start":{"line":94,"column":6},"end":{"line":96,"column":7}},{"start":{"line":94,"column":6},"end":{"line":96,"column":7}}],"line":94},"9":{"loc":{"start":{"line":100,"column":6},"end":{"line":109,"column":7}},"type":"if","locations":[{"start":{"line":100,"column":6},"end":{"line":109,"column":7}},{"start":{"line":100,"column":6},"end":{"line":109,"column":7}}],"line":100},"10":{"loc":{"start":{"line":100,"column":10},"end":{"line":100,"column":63}},"type":"binary-expr","locations":[{"start":{"line":100,"column":10},"end":{"line":100,"column":32}},{"start":{"line":100,"column":36},"end":{"line":100,"column":63}}],"line":100},"11":{"loc":{"start":{"line":102,"column":8},"end":{"line":107,"column":9}},"type":"if","locations":[{"start":{"line":102,"column":8},"end":{"line":107,"column":9}},{"start":{"line":102,"column":8},"end":{"line":107,"column":9}}],"line":102},"12":{"loc":{"start":{"line":128,"column":2},"end":{"line":142,"column":3}},"type":"if","locations":[{"start":{"line":128,"column":2},"end":{"line":142,"column":3}},{"start":{"line":128,"column":2},"end":{"line":142,"column":3}}],"line":128},"13":{"loc":{"start":{"line":133,"column":4},"end":{"line":137,"column":5}},"type":"if","locations":[{"start":{"line":133,"column":4},"end":{"line":137,"column":5}},{"start":{"line":133,"column":4},"end":{"line":137,"column":5}}],"line":133},"14":{"loc":{"start":{"line":160,"column":2},"end":{"line":166,"column":3}},"type":"if","locations":[{"start":{"line":160,"column":2},"end":{"line":166,"column":3}},{"start":{"line":160,"column":2},"end":{"line":166,"column":3}}],"line":160},"15":{"loc":{"start":{"line":161,"column":4},"end":{"line":162,"column":60}},"type":"binary-expr","locations":[{"start":{"line":161,"column":4},"end":{"line":161,"column":22}},{"start":{"line":162,"column":5},"end":{"line":162,"column":31}},{"start":{"line":162,"column":35},"end":{"line":162,"column":59}}],"line":161},"16":{"loc":{"start":{"line":165,"column":23},"end":{"line":165,"column":77}},"type":"binary-expr","locations":[{"start":{"line":165,"column":23},"end":{"line":165,"column":49}},{"start":{"line":165,"column":53},"end":{"line":165,"column":77}}],"line":165},"17":{"loc":{"start":{"line":190,"column":2},"end":{"line":192,"column":3}},"type":"if","locations":[{"start":{"line":190,"column":2},"end":{"line":192,"column":3}},{"start":{"line":190,"column":2},"end":{"line":192,"column":3}}],"line":190},"18":{"loc":{"start":{"line":194,"column":2},"end":{"line":196,"column":3}},"type":"if","locations":[{"start":{"line":194,"column":2},"end":{"line":196,"column":3}},{"start":{"line":194,"column":2},"end":{"line":196,"column":3}}],"line":194},"19":{"loc":{"start":{"line":194,"column":6},"end":{"line":194,"column":30}},"type":"binary-expr","locations":[{"start":{"line":194,"column":6},"end":{"line":194,"column":13}},{"start":{"line":194,"column":17},"end":{"line":194,"column":30}}],"line":194},"20":{"loc":{"start":{"line":215,"column":2},"end":{"line":217,"column":3}},"type":"if","locations":[{"start":{"line":215,"column":2},"end":{"line":217,"column":3}},{"start":{"line":215,"column":2},"end":{"line":217,"column":3}}],"line":215},"21":{"loc":{"start":{"line":219,"column":2},"end":{"line":231,"column":3}},"type":"switch","locations":[{"start":{"line":220,"column":4},"end":{"line":222,"column":12}},{"start":{"line":223,"column":4},"end":{"line":225,"column":12}},{"start":{"line":226,"column":4},"end":{"line":230,"column":8}}],"line":219},"22":{"loc":{"start":{"line":248,"column":4},"end":{"line":271,"column":5}},"type":"if","locations":[{"start":{"line":248,"column":4},"end":{"line":271,"column":5}},{"start":{"line":248,"column":4},"end":{"line":271,"column":5}}],"line":248},"23":{"loc":{"start":{"line":272,"column":4},"end":{"line":278,"column":5}},"type":"if","locations":[{"start":{"line":272,"column":4},"end":{"line":278,"column":5}},{"start":{"line":272,"column":4},"end":{"line":278,"column":5}}],"line":272},"24":{"loc":{"start":{"line":273,"column":6},"end":{"line":274,"column":80}},"type":"binary-expr","locations":[{"start":{"line":273,"column":6},"end":{"line":273,"column":24}},{"start":{"line":274,"column":7},"end":{"line":274,"column":44}},{"start":{"line":274,"column":48},"end":{"line":274,"column":79}}],"line":273},"25":{"loc":{"start":{"line":334,"column":2},"end":{"line":337,"column":3}},"type":"if","locations":[{"start":{"line":334,"column":2},"end":{"line":337,"column":3}},{"start":{"line":334,"column":2},"end":{"line":337,"column":3}}],"line":334},"26":{"loc":{"start":{"line":334,"column":6},"end":{"line":334,"column":50}},"type":"binary-expr","locations":[{"start":{"line":334,"column":6},"end":{"line":334,"column":28}},{"start":{"line":334,"column":32},"end":{"line":334,"column":50}}],"line":334},"27":{"loc":{"start":{"line":348,"column":2},"end":{"line":350,"column":3}},"type":"if","locations":[{"start":{"line":348,"column":2},"end":{"line":350,"column":3}},{"start":{"line":348,"column":2},"end":{"line":350,"column":3}}],"line":348},"28":{"loc":{"start":{"line":354,"column":8},"end":{"line":372,"column":9}},"type":"if","locations":[{"start":{"line":354,"column":8},"end":{"line":372,"column":9}},{"start":{"line":354,"column":8},"end":{"line":372,"column":9}}],"line":354},"29":{"loc":{"start":{"line":377,"column":12},"end":{"line":377,"column":56}},"type":"cond-expr","locations":[{"start":{"line":377,"column":29},"end":{"line":377,"column":50}},{"start":{"line":377,"column":53},"end":{"line":377,"column":56}}],"line":377},"30":{"loc":{"start":{"line":378,"column":12},"end":{"line":378,"column":71}},"type":"binary-expr","locations":[{"start":{"line":378,"column":12},"end":{"line":378,"column":25}},{"start":{"line":378,"column":29},"end":{"line":378,"column":71}}],"line":378},"31":{"loc":{"start":{"line":386,"column":2},"end":{"line":388,"column":3}},"type":"if","locations":[{"start":{"line":386,"column":2},"end":{"line":388,"column":3}},{"start":{"line":386,"column":2},"end":{"line":388,"column":3}}],"line":386}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":28,"10":28,"11":28,"12":28,"13":14,"14":14,"15":1,"16":14,"17":11,"18":11,"19":11,"20":11,"21":11,"22":2,"23":2,"24":0,"25":9,"26":9,"27":1494,"28":9,"29":9,"30":13,"31":13,"32":13,"33":13,"34":13,"35":13,"36":10,"37":11,"38":110,"39":22,"40":11,"41":28,"42":28,"43":1,"44":1,"45":0,"46":0,"47":0,"48":0,"49":1,"50":11,"51":5,"52":11,"53":11,"54":11,"55":11,"56":11,"57":11,"58":5,"59":5,"60":5,"61":5,"62":5,"63":5,"64":0,"65":5,"66":5,"67":6,"68":11,"69":11,"70":11,"71":11,"72":11,"73":11,"74":6,"75":6,"76":2,"77":6,"78":6,"79":8,"80":8,"81":8,"82":1,"83":8,"84":1,"85":7,"86":5,"87":5,"88":15,"89":0,"90":15,"91":6,"92":6,"93":8,"94":5,"95":1,"96":11,"97":12,"98":1,"99":1,"100":1,"101":1,"102":1,"103":4,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":3,"116":4,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":3,"128":3,"129":3,"130":3,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":0,"141":0,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":4,"151":4,"152":1,"153":3,"154":0,"155":1,"156":1,"157":1,"158":1,"159":1},"f":{"0":28,"1":14,"2":11,"3":1494,"4":13,"5":110,"6":28,"7":5,"8":11,"9":11,"10":6,"11":8,"12":15,"13":12,"14":1,"15":4,"16":1,"17":3,"18":1,"19":1,"20":4},"b":{"0":[1,13],"1":[14,14],"2":[11,0],"3":[2,0],"4":[2,0,0],"5":[2,0],"6":[13,0],"7":[10,3],"8":[22,88],"9":[1,27],"10":[28,6],"11":[0,1],"12":[5,6],"13":[5,0],"14":[2,4],"15":[6,5,4],"16":[2,1],"17":[1,7],"18":[1,7],"19":[8,8],"20":[0,15],"21":[6,8,1],"22":[1,3],"23":[1,3],"24":[4,4,4],"25":[0,1],"26":[1,1],"27":[1,0],"28":[1,3],"29":[0,0],"30":[0,0],"31":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"7a0fea06885841c72e5b02ac5f365fc824844046"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\hs\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\hs\\util.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":53}},"1":{"start":{"line":3,"column":32},"end":{"line":10,"column":1}},"2":{"start":{"line":4,"column":25},"end":{"line":7,"column":3}},"3":{"start":{"line":8,"column":14},"end":{"line":8,"column":40}},"4":{"start":{"line":9,"column":2},"end":{"line":9,"column":13}},"5":{"start":{"line":12,"column":32},"end":{"line":18,"column":1}},"6":{"start":{"line":13,"column":16},"end":{"line":13,"column":71}},"7":{"start":{"line":13,"column":45},"end":{"line":13,"column":70}},"8":{"start":{"line":14,"column":2},"end":{"line":17,"column":4}},"9":{"start":{"line":16,"column":54},"end":{"line":16,"column":65}},"10":{"start":{"line":20,"column":0},"end":{"line":23,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":32},"end":{"line":3,"column":33}},"loc":{"start":{"line":3,"column":50},"end":{"line":10,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":32},"end":{"line":12,"column":33}},"loc":{"start":{"line":12,"column":46},"end":{"line":18,"column":1}},"line":12},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":37},"end":{"line":13,"column":38}},"loc":{"start":{"line":13,"column":45},"end":{"line":13,"column":70}},"line":13},"3":{"name":"(anonymous_3)","decl":{"start":{"line":16,"column":41},"end":{"line":16,"column":42}},"loc":{"start":{"line":16,"column":54},"end":{"line":16,"column":65}},"line":16}},"branchMap":{},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":1,"6":3,"7":3,"8":3,"9":6,"10":1},"f":{"0":0,"1":3,"2":3,"3":6},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"6ff7f3402651eb435a2c752d262219672d84d1d2"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\indicative\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\indicative\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":22},"end":{"line":3,"column":58}},"2":{"start":{"line":4,"column":23},"end":{"line":4,"column":47}},"3":{"start":{"line":5,"column":26},"end":{"line":5,"column":53}},"4":{"start":{"line":6,"column":23},"end":{"line":6,"column":47}},"5":{"start":{"line":8,"column":26},"end":{"line":14,"column":1}},"6":{"start":{"line":16,"column":23},"end":{"line":16,"column":69}},"7":{"start":{"line":18,"column":0},"end":{"line":21,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ba66206f099ac5a52469e6639996487e6ae7c9cf"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\indicative\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\indicative\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":22},"end":{"line":2,"column":51}},"2":{"start":{"line":3,"column":46},"end":{"line":3,"column":65}},"3":{"start":{"line":12,"column":4},"end":{"line":12,"column":25}},"4":{"start":{"line":14,"column":25},"end":{"line":101,"column":1}},"5":{"start":{"line":15,"column":17},"end":{"line":15,"column":19}},"6":{"start":{"line":18,"column":18},"end":{"line":97,"column":3}},"7":{"start":{"line":20,"column":4},"end":{"line":96,"column":5}},"8":{"start":{"line":22,"column":6},"end":{"line":22,"column":25}},"9":{"start":{"line":23,"column":11},"end":{"line":96,"column":5}},"10":{"start":{"line":24,"column":6},"end":{"line":82,"column":7}},"11":{"start":{"line":26,"column":21},"end":{"line":26,"column":23}},"12":{"start":{"line":28,"column":21},"end":{"line":28,"column":23}},"13":{"start":{"line":29,"column":8},"end":{"line":39,"column":11}},"14":{"start":{"line":30,"column":10},"end":{"line":38,"column":11}},"15":{"start":{"line":32,"column":12},"end":{"line":32,"column":28}},"16":{"start":{"line":33,"column":17},"end":{"line":38,"column":11}},"17":{"start":{"line":37,"column":12},"end":{"line":37,"column":28}},"18":{"start":{"line":42,"column":8},"end":{"line":44,"column":9}},"19":{"start":{"line":43,"column":10},"end":{"line":43,"column":41}},"20":{"start":{"line":47,"column":8},"end":{"line":81,"column":9}},"21":{"start":{"line":49,"column":22},"end":{"line":49,"column":29}},"22":{"start":{"line":50,"column":28},"end":{"line":50,"column":30}},"23":{"start":{"line":55,"column":10},"end":{"line":63,"column":13}},"24":{"start":{"line":58,"column":12},"end":{"line":62,"column":13}},"25":{"start":{"line":61,"column":14},"end":{"line":61,"column":34}},"26":{"start":{"line":66,"column":10},"end":{"line":75,"column":11}},"27":{"start":{"line":67,"column":23},"end":{"line":67,"column":30}},"28":{"start":{"line":68,"column":12},"end":{"line":74,"column":15}},"29":{"start":{"line":69,"column":14},"end":{"line":73,"column":15}},"30":{"start":{"line":72,"column":16},"end":{"line":72,"column":41}},"31":{"start":{"line":78,"column":10},"end":{"line":80,"column":13}},"32":{"start":{"line":79,"column":12},"end":{"line":79,"column":78}},"33":{"start":{"line":88,"column":6},"end":{"line":91,"column":9}},"34":{"start":{"line":90,"column":8},"end":{"line":90,"column":57}},"35":{"start":{"line":99,"column":2},"end":{"line":99,"column":26}},"36":{"start":{"line":100,"column":2},"end":{"line":100,"column":16}},"37":{"start":{"line":103,"column":30},"end":{"line":125,"column":1}},"38":{"start":{"line":104,"column":18},"end":{"line":104,"column":74}},"39":{"start":{"line":105,"column":2},"end":{"line":122,"column":3}},"40":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"41":{"start":{"line":109,"column":6},"end":{"line":109,"column":64}},"42":{"start":{"line":111,"column":25},"end":{"line":111,"column":74}},"43":{"start":{"line":112,"column":21},"end":{"line":112,"column":43}},"44":{"start":{"line":113,"column":4},"end":{"line":113,"column":42}},"45":{"start":{"line":114,"column":4},"end":{"line":114,"column":61}},"46":{"start":{"line":115,"column":4},"end":{"line":118,"column":6}},"47":{"start":{"line":119,"column":4},"end":{"line":119,"column":66}},"48":{"start":{"line":120,"column":4},"end":{"line":120,"column":38}},"49":{"start":{"line":121,"column":4},"end":{"line":121,"column":20}},"50":{"start":{"line":124,"column":2},"end":{"line":124,"column":65}},"51":{"start":{"line":127,"column":21},"end":{"line":191,"column":1}},"52":{"start":{"line":128,"column":2},"end":{"line":133,"column":3}},"53":{"start":{"line":129,"column":4},"end":{"line":132,"column":6}},"54":{"start":{"line":134,"column":22},"end":{"line":134,"column":48}},"55":{"start":{"line":135,"column":27},"end":{"line":135,"column":34}},"56":{"start":{"line":138,"column":19},"end":{"line":138,"column":21}},"57":{"start":{"line":139,"column":2},"end":{"line":157,"column":3}},"58":{"start":{"line":141,"column":6},"end":{"line":141,"column":41}},"59":{"start":{"line":142,"column":6},"end":{"line":142,"column":12}},"60":{"start":{"line":144,"column":6},"end":{"line":144,"column":44}},"61":{"start":{"line":145,"column":6},"end":{"line":145,"column":12}},"62":{"start":{"line":147,"column":6},"end":{"line":147,"column":40}},"63":{"start":{"line":148,"column":6},"end":{"line":148,"column":12}},"64":{"start":{"line":150,"column":6},"end":{"line":150,"column":42}},"65":{"start":{"line":151,"column":6},"end":{"line":151,"column":12}},"66":{"start":{"line":153,"column":6},"end":{"line":153,"column":41}},"67":{"start":{"line":154,"column":6},"end":{"line":154,"column":12}},"68":{"start":{"line":156,"column":6},"end":{"line":156,"column":63}},"69":{"start":{"line":160,"column":2},"end":{"line":169,"column":3}},"70":{"start":{"line":161,"column":4},"end":{"line":163,"column":5}},"71":{"start":{"line":162,"column":6},"end":{"line":162,"column":39}},"72":{"start":{"line":164,"column":4},"end":{"line":168,"column":6}},"73":{"start":{"line":172,"column":2},"end":{"line":172,"column":80}},"74":{"start":{"line":174,"column":2},"end":{"line":188,"column":3}},"75":{"start":{"line":175,"column":19},"end":{"line":175,"column":75}},"76":{"start":{"line":178,"column":4},"end":{"line":187,"column":5}},"77":{"start":{"line":180,"column":6},"end":{"line":186,"column":8}},"78":{"start":{"line":190,"column":2},"end":{"line":190,"column":18}},"79":{"start":{"line":193,"column":16},"end":{"line":195,"column":1}},"80":{"start":{"line":194,"column":2},"end":{"line":194,"column":56}},"81":{"start":{"line":197,"column":26},"end":{"line":234,"column":1}},"82":{"start":{"line":198,"column":2},"end":{"line":201,"column":3}},"83":{"start":{"line":199,"column":23},"end":{"line":199,"column":75}},"84":{"start":{"line":200,"column":4},"end":{"line":200,"column":24}},"85":{"start":{"line":203,"column":19},"end":{"line":232,"column":3}},"86":{"start":{"line":205,"column":6},"end":{"line":230,"column":7}},"87":{"start":{"line":206,"column":8},"end":{"line":213,"column":9}},"88":{"start":{"line":208,"column":10},"end":{"line":212,"column":12}},"89":{"start":{"line":215,"column":8},"end":{"line":219,"column":10}},"90":{"start":{"line":221,"column":8},"end":{"line":229,"column":10}},"91":{"start":{"line":233,"column":2},"end":{"line":233,"column":18}},"92":{"start":{"line":236,"column":0},"end":{"line":236,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":25},"end":{"line":14,"column":26}},"loc":{"start":{"line":14,"column":39},"end":{"line":101,"column":1}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":18,"column":18},"end":{"line":18,"column":19}},"loc":{"start":{"line":18,"column":33},"end":{"line":97,"column":3}},"line":18},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":20},"end":{"line":29,"column":21}},"loc":{"start":{"line":29,"column":28},"end":{"line":39,"column":9}},"line":29},"3":{"name":"(anonymous_3)","decl":{"start":{"line":55,"column":35},"end":{"line":55,"column":36}},"loc":{"start":{"line":55,"column":42},"end":{"line":63,"column":11}},"line":55},"4":{"name":"(anonymous_4)","decl":{"start":{"line":68,"column":36},"end":{"line":68,"column":37}},"loc":{"start":{"line":68,"column":41},"end":{"line":74,"column":13}},"line":68},"5":{"name":"(anonymous_5)","decl":{"start":{"line":78,"column":41},"end":{"line":78,"column":42}},"loc":{"start":{"line":78,"column":48},"end":{"line":80,"column":11}},"line":78},"6":{"name":"(anonymous_6)","decl":{"start":{"line":88,"column":31},"end":{"line":88,"column":32}},"loc":{"start":{"line":88,"column":38},"end":{"line":91,"column":7}},"line":88},"7":{"name":"(anonymous_7)","decl":{"start":{"line":103,"column":30},"end":{"line":103,"column":31}},"loc":{"start":{"line":103,"column":66},"end":{"line":125,"column":1}},"line":103},"8":{"name":"(anonymous_8)","decl":{"start":{"line":127,"column":21},"end":{"line":127,"column":22}},"loc":{"start":{"line":127,"column":47},"end":{"line":191,"column":1}},"line":127},"9":{"name":"(anonymous_9)","decl":{"start":{"line":193,"column":16},"end":{"line":193,"column":17}},"loc":{"start":{"line":193,"column":25},"end":{"line":195,"column":1}},"line":193},"10":{"name":"(anonymous_10)","decl":{"start":{"line":197,"column":26},"end":{"line":197,"column":27}},"loc":{"start":{"line":197,"column":42},"end":{"line":234,"column":1}},"line":197},"11":{"name":"(anonymous_11)","decl":{"start":{"line":204,"column":15},"end":{"line":204,"column":16}},"loc":{"start":{"line":204,"column":30},"end":{"line":231,"column":5}},"line":204}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":4},"end":{"line":96,"column":5}},"type":"if","locations":[{"start":{"line":20,"column":4},"end":{"line":96,"column":5}},{"start":{"line":20,"column":4},"end":{"line":96,"column":5}}],"line":20},"1":{"loc":{"start":{"line":23,"column":11},"end":{"line":96,"column":5}},"type":"if","locations":[{"start":{"line":23,"column":11},"end":{"line":96,"column":5}},{"start":{"line":23,"column":11},"end":{"line":96,"column":5}}],"line":23},"2":{"loc":{"start":{"line":24,"column":6},"end":{"line":82,"column":7}},"type":"if","locations":[{"start":{"line":24,"column":6},"end":{"line":82,"column":7}},{"start":{"line":24,"column":6},"end":{"line":82,"column":7}}],"line":24},"3":{"loc":{"start":{"line":30,"column":10},"end":{"line":38,"column":11}},"type":"if","locations":[{"start":{"line":30,"column":10},"end":{"line":38,"column":11}},{"start":{"line":30,"column":10},"end":{"line":38,"column":11}}],"line":30},"4":{"loc":{"start":{"line":33,"column":17},"end":{"line":38,"column":11}},"type":"if","locations":[{"start":{"line":33,"column":17},"end":{"line":38,"column":11}},{"start":{"line":33,"column":17},"end":{"line":38,"column":11}}],"line":33},"5":{"loc":{"start":{"line":42,"column":8},"end":{"line":44,"column":9}},"type":"if","locations":[{"start":{"line":42,"column":8},"end":{"line":44,"column":9}},{"start":{"line":42,"column":8},"end":{"line":44,"column":9}}],"line":42},"6":{"loc":{"start":{"line":47,"column":8},"end":{"line":81,"column":9}},"type":"if","locations":[{"start":{"line":47,"column":8},"end":{"line":81,"column":9}},{"start":{"line":47,"column":8},"end":{"line":81,"column":9}}],"line":47},"7":{"loc":{"start":{"line":58,"column":12},"end":{"line":62,"column":13}},"type":"if","locations":[{"start":{"line":58,"column":12},"end":{"line":62,"column":13}},{"start":{"line":58,"column":12},"end":{"line":62,"column":13}}],"line":58},"8":{"loc":{"start":{"line":69,"column":14},"end":{"line":73,"column":15}},"type":"if","locations":[{"start":{"line":69,"column":14},"end":{"line":73,"column":15}},{"start":{"line":69,"column":14},"end":{"line":73,"column":15}}],"line":69},"9":{"loc":{"start":{"line":79,"column":19},"end":{"line":79,"column":48}},"type":"cond-expr","locations":[{"start":{"line":79,"column":26},"end":{"line":79,"column":42}},{"start":{"line":79,"column":45},"end":{"line":79,"column":48}}],"line":79},"10":{"loc":{"start":{"line":90,"column":26},"end":{"line":90,"column":55}},"type":"cond-expr","locations":[{"start":{"line":90,"column":33},"end":{"line":90,"column":49}},{"start":{"line":90,"column":52},"end":{"line":90,"column":55}}],"line":90},"11":{"loc":{"start":{"line":105,"column":2},"end":{"line":122,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":122,"column":3}},{"start":{"line":105,"column":2},"end":{"line":122,"column":3}}],"line":105},"12":{"loc":{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},"type":"if","locations":[{"start":{"line":106,"column":4},"end":{"line":110,"column":5}},{"start":{"line":106,"column":4},"end":{"line":110,"column":5}}],"line":106},"13":{"loc":{"start":{"line":128,"column":2},"end":{"line":133,"column":3}},"type":"if","locations":[{"start":{"line":128,"column":2},"end":{"line":133,"column":3}},{"start":{"line":128,"column":2},"end":{"line":133,"column":3}}],"line":128},"14":{"loc":{"start":{"line":139,"column":2},"end":{"line":157,"column":3}},"type":"switch","locations":[{"start":{"line":140,"column":4},"end":{"line":142,"column":12}},{"start":{"line":143,"column":4},"end":{"line":145,"column":12}},{"start":{"line":146,"column":4},"end":{"line":148,"column":12}},{"start":{"line":149,"column":4},"end":{"line":151,"column":12}},{"start":{"line":152,"column":4},"end":{"line":154,"column":12}},{"start":{"line":155,"column":4},"end":{"line":156,"column":63}}],"line":139},"15":{"loc":{"start":{"line":160,"column":2},"end":{"line":169,"column":3}},"type":"if","locations":[{"start":{"line":160,"column":2},"end":{"line":169,"column":3}},{"start":{"line":160,"column":2},"end":{"line":169,"column":3}}],"line":160},"16":{"loc":{"start":{"line":160,"column":6},"end":{"line":160,"column":71}},"type":"binary-expr","locations":[{"start":{"line":160,"column":6},"end":{"line":160,"column":36}},{"start":{"line":160,"column":40},"end":{"line":160,"column":71}}],"line":160},"17":{"loc":{"start":{"line":161,"column":4},"end":{"line":163,"column":5}},"type":"if","locations":[{"start":{"line":161,"column":4},"end":{"line":163,"column":5}},{"start":{"line":161,"column":4},"end":{"line":163,"column":5}}],"line":161},"18":{"loc":{"start":{"line":174,"column":2},"end":{"line":188,"column":3}},"type":"if","locations":[{"start":{"line":174,"column":2},"end":{"line":188,"column":3}},{"start":{"line":174,"column":2},"end":{"line":188,"column":3}}],"line":174},"19":{"loc":{"start":{"line":178,"column":4},"end":{"line":187,"column":5}},"type":"if","locations":[{"start":{"line":178,"column":4},"end":{"line":187,"column":5}},{"start":{"line":178,"column":4},"end":{"line":187,"column":5}}],"line":178},"20":{"loc":{"start":{"line":198,"column":2},"end":{"line":201,"column":3}},"type":"if","locations":[{"start":{"line":198,"column":2},"end":{"line":201,"column":3}},{"start":{"line":198,"column":2},"end":{"line":201,"column":3}}],"line":198},"21":{"loc":{"start":{"line":198,"column":6},"end":{"line":198,"column":50}},"type":"binary-expr","locations":[{"start":{"line":198,"column":6},"end":{"line":198,"column":28}},{"start":{"line":198,"column":32},"end":{"line":198,"column":50}}],"line":198},"22":{"loc":{"start":{"line":206,"column":8},"end":{"line":213,"column":9}},"type":"if","locations":[{"start":{"line":206,"column":8},"end":{"line":213,"column":9}},{"start":{"line":206,"column":8},"end":{"line":213,"column":9}}],"line":206},"23":{"loc":{"start":{"line":223,"column":10},"end":{"line":227,"column":17}},"type":"cond-expr","locations":[{"start":{"line":224,"column":14},"end":{"line":224,"column":35}},{"start":{"line":225,"column":14},"end":{"line":227,"column":17}}],"line":223},"24":{"loc":{"start":{"line":225,"column":14},"end":{"line":227,"column":17}},"type":"cond-expr","locations":[{"start":{"line":226,"column":14},"end":{"line":226,"column":24}},{"start":{"line":227,"column":14},"end":{"line":227,"column":17}}],"line":225},"25":{"loc":{"start":{"line":228,"column":10},"end":{"line":228,"column":69}},"type":"binary-expr","locations":[{"start":{"line":228,"column":10},"end":{"line":228,"column":23}},{"start":{"line":228,"column":27},"end":{"line":228,"column":69}}],"line":228}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":19,"6":19,"7":439,"8":376,"9":63,"10":11,"11":10,"12":10,"13":10,"14":44,"15":5,"16":39,"17":37,"18":10,"19":2,"20":10,"21":7,"22":7,"23":7,"24":31,"25":30,"26":7,"27":37,"28":37,"29":277,"30":276,"31":7,"32":30,"33":52,"34":420,"35":19,"36":19,"37":1,"38":24,"39":24,"40":24,"41":19,"42":24,"43":24,"44":24,"45":24,"46":24,"47":24,"48":24,"49":24,"50":0,"51":1,"52":22,"53":1,"54":21,"55":21,"56":21,"57":21,"58":1,"59":1,"60":5,"61":5,"62":5,"63":5,"64":1,"65":1,"66":8,"67":8,"68":1,"69":20,"70":13,"71":1,"72":13,"73":20,"74":20,"75":5,"76":5,"77":4,"78":20,"79":1,"80":22,"81":1,"82":1,"83":0,"84":0,"85":1,"86":2,"87":2,"88":0,"89":2,"90":0,"91":1,"92":1},"f":{"0":19,"1":439,"2":44,"3":31,"4":277,"5":30,"6":420,"7":24,"8":22,"9":22,"10":1,"11":2},"b":{"0":[376,63],"1":[11,52],"2":[10,1],"3":[5,39],"4":[2,37],"5":[2,8],"6":[7,3],"7":[30,1],"8":[276,1],"9":[30,0],"10":[172,248],"11":[24,0],"12":[19,5],"13":[1,21],"14":[1,5,5,1,8,1],"15":[13,7],"16":[20,15],"17":[1,12],"18":[5,15],"19":[4,1],"20":[0,1],"21":[1,1],"22":[0,2],"23":[0,0],"24":[0,0],"25":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"66d92e4dd1b85b4eb151874c05ea541ec8d5ee72"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\intercom\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\intercom\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":22},"end":{"line":3,"column":47}},"2":{"start":{"line":6,"column":23},"end":{"line":6,"column":48}},"3":{"start":{"line":8,"column":26},"end":{"line":8,"column":50}},"4":{"start":{"line":12,"column":23},"end":{"line":26,"column":1}},"5":{"start":{"line":28,"column":22},"end":{"line":28,"column":65}},"6":{"start":{"line":30,"column":33},"end":{"line":41,"column":1}},"7":{"start":{"line":43,"column":34},"end":{"line":43,"column":60}},"8":{"start":{"line":45,"column":0},"end":{"line":50,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c3c76ec89e510c165b722638a9246e055535b8ac"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\intercom\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\intercom\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":26}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":46},"end":{"line":3,"column":75}},"3":{"start":{"line":9,"column":4},"end":{"line":9,"column":23}},"4":{"start":{"line":20,"column":4},"end":{"line":20,"column":25}},"5":{"start":{"line":23,"column":24},"end":{"line":23,"column":26}},"6":{"start":{"line":24,"column":2},"end":{"line":42,"column":3}},"7":{"start":{"line":25,"column":29},"end":{"line":25,"column":31}},"8":{"start":{"line":26,"column":4},"end":{"line":34,"column":7}},"9":{"start":{"line":28,"column":6},"end":{"line":33,"column":7}},"10":{"start":{"line":29,"column":20},"end":{"line":29,"column":32}},"11":{"start":{"line":30,"column":8},"end":{"line":32,"column":9}},"12":{"start":{"line":31,"column":10},"end":{"line":31,"column":38}},"13":{"start":{"line":36,"column":4},"end":{"line":41,"column":7}},"14":{"start":{"line":43,"column":2},"end":{"line":43,"column":23}},"15":{"start":{"line":47,"column":23},"end":{"line":47,"column":30}},"16":{"start":{"line":49,"column":2},"end":{"line":49,"column":45}},"17":{"start":{"line":50,"column":2},"end":{"line":74,"column":3}},"18":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"19":{"start":{"line":52,"column":24},"end":{"line":52,"column":70}},"20":{"start":{"line":53,"column":23},"end":{"line":53,"column":68}},"21":{"start":{"line":54,"column":6},"end":{"line":58,"column":7}},"22":{"start":{"line":55,"column":8},"end":{"line":55,"column":55}},"23":{"start":{"line":57,"column":8},"end":{"line":57,"column":50}},"24":{"start":{"line":61,"column":4},"end":{"line":65,"column":5}},"25":{"start":{"line":62,"column":6},"end":{"line":64,"column":8}},"26":{"start":{"line":67,"column":4},"end":{"line":71,"column":5}},"27":{"start":{"line":68,"column":6},"end":{"line":70,"column":9}},"28":{"start":{"line":69,"column":8},"end":{"line":69,"column":53}},"29":{"start":{"line":73,"column":4},"end":{"line":73,"column":24}},"30":{"start":{"line":75,"column":2},"end":{"line":75,"column":61}},"31":{"start":{"line":80,"column":2},"end":{"line":91,"column":3}},"32":{"start":{"line":81,"column":21},"end":{"line":81,"column":23}},"33":{"start":{"line":82,"column":4},"end":{"line":89,"column":5}},"34":{"start":{"line":83,"column":6},"end":{"line":88,"column":9}},"35":{"start":{"line":84,"column":20},"end":{"line":84,"column":43}},"36":{"start":{"line":85,"column":8},"end":{"line":87,"column":9}},"37":{"start":{"line":86,"column":10},"end":{"line":86,"column":30}},"38":{"start":{"line":90,"column":4},"end":{"line":90,"column":36}},"39":{"start":{"line":92,"column":2},"end":{"line":92,"column":61}},"40":{"start":{"line":96,"column":22},"end":{"line":96,"column":48}},"41":{"start":{"line":97,"column":19},"end":{"line":97,"column":41}},"42":{"start":{"line":98,"column":2},"end":{"line":111,"column":3}},"43":{"start":{"line":100,"column":6},"end":{"line":102,"column":8}},"44":{"start":{"line":103,"column":6},"end":{"line":103,"column":12}},"45":{"start":{"line":105,"column":6},"end":{"line":107,"column":8}},"46":{"start":{"line":108,"column":6},"end":{"line":108,"column":12}},"47":{"start":{"line":110,"column":6},"end":{"line":110,"column":63}},"48":{"start":{"line":113,"column":2},"end":{"line":113,"column":59}},"49":{"start":{"line":114,"column":2},"end":{"line":114,"column":40}},"50":{"start":{"line":115,"column":2},"end":{"line":120,"column":4}},"51":{"start":{"line":121,"column":2},"end":{"line":121,"column":40}},"52":{"start":{"line":122,"column":2},"end":{"line":122,"column":18}},"53":{"start":{"line":126,"column":2},"end":{"line":131,"column":3}},"54":{"start":{"line":127,"column":4},"end":{"line":130,"column":6}},"55":{"start":{"line":132,"column":30},"end":{"line":132,"column":48}},"56":{"start":{"line":133,"column":22},"end":{"line":133,"column":48}},"57":{"start":{"line":136,"column":2},"end":{"line":148,"column":3}},"58":{"start":{"line":138,"column":6},"end":{"line":138,"column":41}},"59":{"start":{"line":139,"column":6},"end":{"line":139,"column":12}},"60":{"start":{"line":141,"column":6},"end":{"line":141,"column":38}},"61":{"start":{"line":142,"column":6},"end":{"line":142,"column":12}},"62":{"start":{"line":147,"column":6},"end":{"line":147,"column":63}},"63":{"start":{"line":152,"column":2},"end":{"line":157,"column":3}},"64":{"start":{"line":153,"column":4},"end":{"line":153,"column":35}},"65":{"start":{"line":154,"column":4},"end":{"line":154,"column":58}},"66":{"start":{"line":156,"column":4},"end":{"line":156,"column":70}},"67":{"start":{"line":158,"column":2},"end":{"line":160,"column":3}},"68":{"start":{"line":159,"column":4},"end":{"line":159,"column":42}},"69":{"start":{"line":161,"column":2},"end":{"line":161,"column":75}},"70":{"start":{"line":166,"column":2},"end":{"line":173,"column":3}},"71":{"start":{"line":167,"column":4},"end":{"line":167,"column":70}},"72":{"start":{"line":169,"column":4},"end":{"line":172,"column":6}},"73":{"start":{"line":174,"column":2},"end":{"line":174,"column":18}},"74":{"start":{"line":177,"column":26},"end":{"line":214,"column":1}},"75":{"start":{"line":178,"column":2},"end":{"line":181,"column":3}},"76":{"start":{"line":179,"column":23},"end":{"line":179,"column":75}},"77":{"start":{"line":180,"column":4},"end":{"line":180,"column":24}},"78":{"start":{"line":183,"column":19},"end":{"line":212,"column":3}},"79":{"start":{"line":185,"column":6},"end":{"line":210,"column":7}},"80":{"start":{"line":186,"column":8},"end":{"line":193,"column":9}},"81":{"start":{"line":188,"column":10},"end":{"line":192,"column":12}},"82":{"start":{"line":195,"column":8},"end":{"line":199,"column":10}},"83":{"start":{"line":201,"column":8},"end":{"line":209,"column":10}},"84":{"start":{"line":213,"column":2},"end":{"line":213,"column":18}},"85":{"start":{"line":216,"column":0},"end":{"line":216,"column":48}}},"fnMap":{"0":{"name":"getCompanyAttribute","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":28}},"loc":{"start":{"line":22,"column":38},"end":{"line":44,"column":1}},"line":22},"1":{"name":"(anonymous_1)","decl":{"start":{"line":26,"column":33},"end":{"line":26,"column":34}},"loc":{"start":{"line":26,"column":40},"end":{"line":34,"column":5}},"line":26},"2":{"name":"validateIdentify","decl":{"start":{"line":46,"column":9},"end":{"line":46,"column":25}},"loc":{"start":{"line":46,"column":44},"end":{"line":76,"column":1}},"line":46},"3":{"name":"(anonymous_3)","decl":{"start":{"line":68,"column":39},"end":{"line":68,"column":40}},"loc":{"start":{"line":68,"column":48},"end":{"line":70,"column":7}},"line":68},"4":{"name":"validateTrack","decl":{"start":{"line":78,"column":9},"end":{"line":78,"column":22}},"loc":{"start":{"line":78,"column":41},"end":{"line":93,"column":1}},"line":78},"5":{"name":"(anonymous_5)","decl":{"start":{"line":83,"column":46},"end":{"line":83,"column":47}},"loc":{"start":{"line":83,"column":53},"end":{"line":88,"column":7}},"line":83},"6":{"name":"validateAndBuildResponse","decl":{"start":{"line":95,"column":9},"end":{"line":95,"column":33}},"loc":{"start":{"line":95,"column":75},"end":{"line":123,"column":1}},"line":95},"7":{"name":"processSingleMessage","decl":{"start":{"line":125,"column":9},"end":{"line":125,"column":29}},"loc":{"start":{"line":125,"column":52},"end":{"line":162,"column":1}},"line":125},"8":{"name":"process","decl":{"start":{"line":164,"column":9},"end":{"line":164,"column":16}},"loc":{"start":{"line":164,"column":24},"end":{"line":175,"column":1}},"line":164},"9":{"name":"(anonymous_9)","decl":{"start":{"line":177,"column":26},"end":{"line":177,"column":27}},"loc":{"start":{"line":177,"column":42},"end":{"line":214,"column":1}},"line":177},"10":{"name":"(anonymous_10)","decl":{"start":{"line":184,"column":15},"end":{"line":184,"column":16}},"loc":{"start":{"line":184,"column":30},"end":{"line":211,"column":5}},"line":184}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":2},"end":{"line":42,"column":3}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":42,"column":3}},{"start":{"line":24,"column":2},"end":{"line":42,"column":3}}],"line":24},"1":{"loc":{"start":{"line":24,"column":6},"end":{"line":24,"column":32}},"type":"binary-expr","locations":[{"start":{"line":24,"column":6},"end":{"line":24,"column":18}},{"start":{"line":24,"column":22},"end":{"line":24,"column":32}}],"line":24},"2":{"loc":{"start":{"line":28,"column":6},"end":{"line":33,"column":7}},"type":"if","locations":[{"start":{"line":28,"column":6},"end":{"line":33,"column":7}},{"start":{"line":28,"column":6},"end":{"line":33,"column":7}}],"line":28},"3":{"loc":{"start":{"line":30,"column":8},"end":{"line":32,"column":9}},"type":"if","locations":[{"start":{"line":30,"column":8},"end":{"line":32,"column":9}},{"start":{"line":30,"column":8},"end":{"line":32,"column":9}}],"line":30},"4":{"loc":{"start":{"line":37,"column":18},"end":{"line":37,"column":49}},"type":"binary-expr","locations":[{"start":{"line":37,"column":18},"end":{"line":37,"column":28}},{"start":{"line":37,"column":32},"end":{"line":37,"column":49}}],"line":37},"5":{"loc":{"start":{"line":50,"column":2},"end":{"line":74,"column":3}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":74,"column":3}},{"start":{"line":50,"column":2},"end":{"line":74,"column":3}}],"line":50},"6":{"loc":{"start":{"line":50,"column":6},"end":{"line":50,"column":38}},"type":"binary-expr","locations":[{"start":{"line":50,"column":6},"end":{"line":50,"column":21}},{"start":{"line":50,"column":25},"end":{"line":50,"column":38}}],"line":50},"7":{"loc":{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":59,"column":5}},{"start":{"line":51,"column":4},"end":{"line":59,"column":5}}],"line":51},"8":{"loc":{"start":{"line":51,"column":8},"end":{"line":51,"column":57}},"type":"binary-expr","locations":[{"start":{"line":51,"column":8},"end":{"line":51,"column":34}},{"start":{"line":51,"column":38},"end":{"line":51,"column":57}}],"line":51},"9":{"loc":{"start":{"line":54,"column":6},"end":{"line":58,"column":7}},"type":"if","locations":[{"start":{"line":54,"column":6},"end":{"line":58,"column":7}},{"start":{"line":54,"column":6},"end":{"line":58,"column":7}}],"line":54},"10":{"loc":{"start":{"line":54,"column":10},"end":{"line":54,"column":31}},"type":"binary-expr","locations":[{"start":{"line":54,"column":10},"end":{"line":54,"column":19}},{"start":{"line":54,"column":23},"end":{"line":54,"column":31}}],"line":54},"11":{"loc":{"start":{"line":57,"column":28},"end":{"line":57,"column":49}},"type":"binary-expr","locations":[{"start":{"line":57,"column":28},"end":{"line":57,"column":37}},{"start":{"line":57,"column":41},"end":{"line":57,"column":49}}],"line":57},"12":{"loc":{"start":{"line":61,"column":4},"end":{"line":65,"column":5}},"type":"if","locations":[{"start":{"line":61,"column":4},"end":{"line":65,"column":5}},{"start":{"line":61,"column":4},"end":{"line":65,"column":5}}],"line":61},"13":{"loc":{"start":{"line":67,"column":4},"end":{"line":71,"column":5}},"type":"if","locations":[{"start":{"line":67,"column":4},"end":{"line":71,"column":5}},{"start":{"line":67,"column":4},"end":{"line":71,"column":5}}],"line":67},"14":{"loc":{"start":{"line":80,"column":2},"end":{"line":91,"column":3}},"type":"if","locations":[{"start":{"line":80,"column":2},"end":{"line":91,"column":3}},{"start":{"line":80,"column":2},"end":{"line":91,"column":3}}],"line":80},"15":{"loc":{"start":{"line":80,"column":6},"end":{"line":80,"column":38}},"type":"binary-expr","locations":[{"start":{"line":80,"column":6},"end":{"line":80,"column":21}},{"start":{"line":80,"column":25},"end":{"line":80,"column":38}}],"line":80},"16":{"loc":{"start":{"line":82,"column":4},"end":{"line":89,"column":5}},"type":"if","locations":[{"start":{"line":82,"column":4},"end":{"line":89,"column":5}},{"start":{"line":82,"column":4},"end":{"line":89,"column":5}}],"line":82},"17":{"loc":{"start":{"line":85,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":85,"column":8},"end":{"line":87,"column":9}},{"start":{"line":85,"column":8},"end":{"line":87,"column":9}}],"line":85},"18":{"loc":{"start":{"line":85,"column":12},"end":{"line":85,"column":65}},"type":"binary-expr","locations":[{"start":{"line":85,"column":12},"end":{"line":85,"column":15}},{"start":{"line":85,"column":19},"end":{"line":85,"column":42}},{"start":{"line":85,"column":46},"end":{"line":85,"column":65}}],"line":85},"19":{"loc":{"start":{"line":98,"column":2},"end":{"line":111,"column":3}},"type":"switch","locations":[{"start":{"line":99,"column":4},"end":{"line":103,"column":12}},{"start":{"line":104,"column":4},"end":{"line":108,"column":12}},{"start":{"line":109,"column":4},"end":{"line":110,"column":63}}],"line":98},"20":{"loc":{"start":{"line":126,"column":2},"end":{"line":131,"column":3}},"type":"if","locations":[{"start":{"line":126,"column":2},"end":{"line":131,"column":3}},{"start":{"line":126,"column":2},"end":{"line":131,"column":3}}],"line":126},"21":{"loc":{"start":{"line":136,"column":2},"end":{"line":148,"column":3}},"type":"switch","locations":[{"start":{"line":137,"column":4},"end":{"line":139,"column":12}},{"start":{"line":140,"column":4},"end":{"line":142,"column":12}},{"start":{"line":146,"column":4},"end":{"line":147,"column":63}}],"line":136},"22":{"loc":{"start":{"line":152,"column":2},"end":{"line":157,"column":3}},"type":"if","locations":[{"start":{"line":152,"column":2},"end":{"line":157,"column":3}},{"start":{"line":152,"column":2},"end":{"line":157,"column":3}}],"line":152},"23":{"loc":{"start":{"line":158,"column":2},"end":{"line":160,"column":3}},"type":"if","locations":[{"start":{"line":158,"column":2},"end":{"line":160,"column":3}},{"start":{"line":158,"column":2},"end":{"line":160,"column":3}}],"line":158},"24":{"loc":{"start":{"line":158,"column":6},"end":{"line":158,"column":41}},"type":"binary-expr","locations":[{"start":{"line":158,"column":6},"end":{"line":158,"column":21}},{"start":{"line":158,"column":25},"end":{"line":158,"column":41}}],"line":158},"25":{"loc":{"start":{"line":170,"column":6},"end":{"line":170,"column":38}},"type":"binary-expr","locations":[{"start":{"line":170,"column":6},"end":{"line":170,"column":19}},{"start":{"line":170,"column":23},"end":{"line":170,"column":38}}],"line":170},"26":{"loc":{"start":{"line":171,"column":6},"end":{"line":171,"column":25}},"type":"binary-expr","locations":[{"start":{"line":171,"column":6},"end":{"line":171,"column":18}},{"start":{"line":171,"column":22},"end":{"line":171,"column":25}}],"line":171},"27":{"loc":{"start":{"line":178,"column":2},"end":{"line":181,"column":3}},"type":"if","locations":[{"start":{"line":178,"column":2},"end":{"line":181,"column":3}},{"start":{"line":178,"column":2},"end":{"line":181,"column":3}}],"line":178},"28":{"loc":{"start":{"line":178,"column":6},"end":{"line":178,"column":50}},"type":"binary-expr","locations":[{"start":{"line":178,"column":6},"end":{"line":178,"column":28}},{"start":{"line":178,"column":32},"end":{"line":178,"column":50}}],"line":178},"29":{"loc":{"start":{"line":186,"column":8},"end":{"line":193,"column":9}},"type":"if","locations":[{"start":{"line":186,"column":8},"end":{"line":193,"column":9}},{"start":{"line":186,"column":8},"end":{"line":193,"column":9}}],"line":186},"30":{"loc":{"start":{"line":203,"column":10},"end":{"line":207,"column":17}},"type":"cond-expr","locations":[{"start":{"line":204,"column":14},"end":{"line":204,"column":35}},{"start":{"line":205,"column":14},"end":{"line":207,"column":17}}],"line":203},"31":{"loc":{"start":{"line":205,"column":14},"end":{"line":207,"column":17}},"type":"cond-expr","locations":[{"start":{"line":206,"column":14},"end":{"line":206,"column":24}},{"start":{"line":207,"column":14},"end":{"line":207,"column":17}}],"line":205},"32":{"loc":{"start":{"line":208,"column":10},"end":{"line":208,"column":69}},"type":"binary-expr","locations":[{"start":{"line":208,"column":10},"end":{"line":208,"column":23}},{"start":{"line":208,"column":27},"end":{"line":208,"column":69}}],"line":208}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":3,"6":3,"7":2,"8":2,"9":8,"10":3,"11":3,"12":2,"13":2,"14":3,"15":13,"16":13,"17":13,"18":11,"19":7,"20":7,"21":7,"22":2,"23":5,"24":11,"25":3,"26":11,"27":10,"28":100,"29":11,"30":2,"31":3,"32":2,"33":2,"34":1,"35":6,"36":6,"37":4,"38":2,"39":1,"40":16,"41":16,"42":16,"43":13,"44":11,"45":3,"46":2,"47":0,"48":13,"49":13,"50":13,"51":13,"52":13,"53":16,"54":0,"55":16,"56":16,"57":16,"58":13,"59":13,"60":3,"61":3,"62":0,"63":16,"64":1,"65":1,"66":15,"67":16,"68":1,"69":16,"70":16,"71":16,"72":3,"73":13,"74":1,"75":1,"76":0,"77":0,"78":1,"79":2,"80":2,"81":0,"82":2,"83":0,"84":1,"85":1},"f":{"0":3,"1":8,"2":13,"3":100,"4":3,"5":6,"6":16,"7":16,"8":16,"9":1,"10":2},"b":{"0":[2,1],"1":[3,1],"2":[3,5],"3":[2,1],"4":[2,1],"5":[11,2],"6":[13,10],"7":[7,4],"8":[11,4],"9":[2,5],"10":[7,3],"11":[5,4],"12":[3,8],"13":[10,1],"14":[2,1],"15":[3,2],"16":[1,1],"17":[4,2],"18":[6,5,4],"19":[13,3,0],"20":[0,16],"21":[13,3,0],"22":[1,15],"23":[1,15],"24":[16,1],"25":[3,0],"26":[3,3],"27":[0,1],"28":[1,1],"29":[0,2],"30":[0,0],"31":[0,0],"32":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"590681c4a4575a98861f13b3c236535c69422d3d"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\iterable\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\iterable\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":48}},"2":{"start":{"line":5,"column":23},"end":{"line":61,"column":1}},"3":{"start":{"line":62,"column":22},"end":{"line":62,"column":65}},"4":{"start":{"line":63,"column":32},"end":{"line":63,"column":36}},"5":{"start":{"line":64,"column":29},"end":{"line":64,"column":33}},"6":{"start":{"line":65,"column":32},"end":{"line":65,"column":79}},"7":{"start":{"line":66,"column":29},"end":{"line":66,"column":76}},"8":{"start":{"line":68,"column":0},"end":{"line":75,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"5c2a5cbfa0641070e5b900cd71afb601062fd4a9"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\iterable\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\iterable\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":46},"end":{"line":2,"column":75}},"2":{"start":{"line":10,"column":4},"end":{"line":10,"column":23}},"3":{"start":{"line":22,"column":4},"end":{"line":22,"column":25}},"4":{"start":{"line":23,"column":15},"end":{"line":23,"column":41}},"5":{"start":{"line":26,"column":2},"end":{"line":28,"column":3}},"6":{"start":{"line":27,"column":4},"end":{"line":27,"column":80}},"7":{"start":{"line":32,"column":28},"end":{"line":32,"column":30}},"8":{"start":{"line":33,"column":19},"end":{"line":33,"column":21}},"9":{"start":{"line":35,"column":2},"end":{"line":237,"column":3}},"10":{"start":{"line":37,"column":6},"end":{"line":40,"column":8}},"11":{"start":{"line":41,"column":6},"end":{"line":44,"column":8}},"12":{"start":{"line":45,"column":6},"end":{"line":45,"column":37}},"13":{"start":{"line":46,"column":6},"end":{"line":50,"column":7}},"14":{"start":{"line":47,"column":8},"end":{"line":47,"column":44}},"15":{"start":{"line":49,"column":8},"end":{"line":49,"column":43}},"16":{"start":{"line":51,"column":6},"end":{"line":51,"column":12}},"17":{"start":{"line":53,"column":6},"end":{"line":56,"column":8}},"18":{"start":{"line":57,"column":6},"end":{"line":57,"column":41}},"19":{"start":{"line":58,"column":6},"end":{"line":58,"column":12}},"20":{"start":{"line":61,"column":6},"end":{"line":63,"column":7}},"21":{"start":{"line":62,"column":8},"end":{"line":62,"column":39}},"22":{"start":{"line":64,"column":6},"end":{"line":64,"column":75}},"23":{"start":{"line":65,"column":6},"end":{"line":65,"column":37}},"24":{"start":{"line":66,"column":6},"end":{"line":66,"column":43}},"25":{"start":{"line":67,"column":6},"end":{"line":67,"column":41}},"26":{"start":{"line":68,"column":6},"end":{"line":68,"column":12}},"27":{"start":{"line":70,"column":6},"end":{"line":85,"column":7}},"28":{"start":{"line":71,"column":8},"end":{"line":71,"column":77}},"29":{"start":{"line":72,"column":13},"end":{"line":85,"column":7}},"30":{"start":{"line":77,"column":8},"end":{"line":77,"column":77}},"31":{"start":{"line":78,"column":13},"end":{"line":85,"column":7}},"32":{"start":{"line":82,"column":8},"end":{"line":82,"column":77}},"33":{"start":{"line":84,"column":8},"end":{"line":84,"column":56}},"34":{"start":{"line":86,"column":6},"end":{"line":86,"column":41}},"35":{"start":{"line":87,"column":6},"end":{"line":91,"column":7}},"36":{"start":{"line":88,"column":8},"end":{"line":88,"column":47}},"37":{"start":{"line":90,"column":8},"end":{"line":90,"column":40}},"38":{"start":{"line":92,"column":6},"end":{"line":92,"column":70}},"39":{"start":{"line":93,"column":6},"end":{"line":95,"column":7}},"40":{"start":{"line":94,"column":8},"end":{"line":94,"column":68}},"41":{"start":{"line":96,"column":6},"end":{"line":98,"column":7}},"42":{"start":{"line":97,"column":8},"end":{"line":97,"column":68}},"43":{"start":{"line":99,"column":6},"end":{"line":99,"column":12}},"44":{"start":{"line":101,"column":6},"end":{"line":116,"column":7}},"45":{"start":{"line":102,"column":8},"end":{"line":102,"column":77}},"46":{"start":{"line":103,"column":13},"end":{"line":116,"column":7}},"47":{"start":{"line":108,"column":8},"end":{"line":108,"column":77}},"48":{"start":{"line":109,"column":13},"end":{"line":116,"column":7}},"49":{"start":{"line":113,"column":8},"end":{"line":113,"column":77}},"50":{"start":{"line":115,"column":8},"end":{"line":115,"column":58}},"51":{"start":{"line":117,"column":6},"end":{"line":117,"column":41}},"52":{"start":{"line":118,"column":6},"end":{"line":122,"column":7}},"53":{"start":{"line":119,"column":8},"end":{"line":119,"column":49}},"54":{"start":{"line":121,"column":8},"end":{"line":121,"column":42}},"55":{"start":{"line":123,"column":6},"end":{"line":123,"column":70}},"56":{"start":{"line":124,"column":6},"end":{"line":126,"column":7}},"57":{"start":{"line":125,"column":8},"end":{"line":125,"column":68}},"58":{"start":{"line":127,"column":6},"end":{"line":129,"column":7}},"59":{"start":{"line":128,"column":8},"end":{"line":128,"column":68}},"60":{"start":{"line":130,"column":6},"end":{"line":130,"column":12}},"61":{"start":{"line":132,"column":6},"end":{"line":132,"column":75}},"62":{"start":{"line":133,"column":6},"end":{"line":133,"column":41}},"63":{"start":{"line":134,"column":6},"end":{"line":134,"column":70}},"64":{"start":{"line":135,"column":6},"end":{"line":137,"column":7}},"65":{"start":{"line":136,"column":8},"end":{"line":136,"column":68}},"66":{"start":{"line":138,"column":6},"end":{"line":140,"column":7}},"67":{"start":{"line":139,"column":8},"end":{"line":139,"column":68}},"68":{"start":{"line":141,"column":6},"end":{"line":141,"column":12}},"69":{"start":{"line":143,"column":6},"end":{"line":143,"column":75}},"70":{"start":{"line":144,"column":6},"end":{"line":147,"column":8}},"71":{"start":{"line":148,"column":6},"end":{"line":148,"column":46}},"72":{"start":{"line":149,"column":6},"end":{"line":149,"column":42}},"73":{"start":{"line":150,"column":6},"end":{"line":150,"column":48}},"74":{"start":{"line":151,"column":6},"end":{"line":151,"column":53}},"75":{"start":{"line":152,"column":6},"end":{"line":178,"column":7}},"76":{"start":{"line":153,"column":8},"end":{"line":165,"column":11}},"77":{"start":{"line":154,"column":26},"end":{"line":157,"column":11}},"78":{"start":{"line":158,"column":10},"end":{"line":160,"column":11}},"79":{"start":{"line":159,"column":12},"end":{"line":159,"column":63}},"80":{"start":{"line":161,"column":10},"end":{"line":161,"column":52}},"81":{"start":{"line":162,"column":10},"end":{"line":162,"column":60}},"82":{"start":{"line":163,"column":24},"end":{"line":163,"column":38}},"83":{"start":{"line":164,"column":10},"end":{"line":164,"column":40}},"84":{"start":{"line":167,"column":24},"end":{"line":170,"column":9}},"85":{"start":{"line":171,"column":8},"end":{"line":173,"column":9}},"86":{"start":{"line":172,"column":10},"end":{"line":172,"column":61}},"87":{"start":{"line":174,"column":8},"end":{"line":174,"column":50}},"88":{"start":{"line":175,"column":8},"end":{"line":175,"column":58}},"89":{"start":{"line":176,"column":22},"end":{"line":176,"column":36}},"90":{"start":{"line":177,"column":8},"end":{"line":177,"column":38}},"91":{"start":{"line":180,"column":6},"end":{"line":180,"column":43}},"92":{"start":{"line":181,"column":6},"end":{"line":181,"column":70}},"93":{"start":{"line":182,"column":6},"end":{"line":182,"column":54}},"94":{"start":{"line":183,"column":6},"end":{"line":185,"column":7}},"95":{"start":{"line":184,"column":8},"end":{"line":184,"column":49}},"96":{"start":{"line":186,"column":6},"end":{"line":188,"column":7}},"97":{"start":{"line":187,"column":8},"end":{"line":187,"column":68}},"98":{"start":{"line":189,"column":6},"end":{"line":191,"column":7}},"99":{"start":{"line":190,"column":8},"end":{"line":190,"column":68}},"100":{"start":{"line":192,"column":6},"end":{"line":192,"column":12}},"101":{"start":{"line":194,"column":6},"end":{"line":197,"column":8}},"102":{"start":{"line":198,"column":6},"end":{"line":198,"column":46}},"103":{"start":{"line":199,"column":6},"end":{"line":199,"column":42}},"104":{"start":{"line":200,"column":6},"end":{"line":200,"column":48}},"105":{"start":{"line":201,"column":6},"end":{"line":201,"column":53}},"106":{"start":{"line":202,"column":6},"end":{"line":228,"column":7}},"107":{"start":{"line":203,"column":8},"end":{"line":215,"column":11}},"108":{"start":{"line":204,"column":26},"end":{"line":207,"column":11}},"109":{"start":{"line":208,"column":10},"end":{"line":210,"column":11}},"110":{"start":{"line":209,"column":12},"end":{"line":209,"column":63}},"111":{"start":{"line":211,"column":10},"end":{"line":211,"column":52}},"112":{"start":{"line":212,"column":10},"end":{"line":212,"column":60}},"113":{"start":{"line":213,"column":24},"end":{"line":213,"column":38}},"114":{"start":{"line":214,"column":10},"end":{"line":214,"column":40}},"115":{"start":{"line":217,"column":24},"end":{"line":220,"column":9}},"116":{"start":{"line":221,"column":8},"end":{"line":223,"column":9}},"117":{"start":{"line":222,"column":10},"end":{"line":222,"column":61}},"118":{"start":{"line":224,"column":8},"end":{"line":224,"column":50}},"119":{"start":{"line":225,"column":8},"end":{"line":225,"column":58}},"120":{"start":{"line":226,"column":22},"end":{"line":226,"column":36}},"121":{"start":{"line":227,"column":8},"end":{"line":227,"column":38}},"122":{"start":{"line":230,"column":6},"end":{"line":230,"column":43}},"123":{"start":{"line":231,"column":6},"end":{"line":231,"column":12}},"124":{"start":{"line":233,"column":6},"end":{"line":233,"column":75}},"125":{"start":{"line":234,"column":6},"end":{"line":234,"column":12}},"126":{"start":{"line":236,"column":6},"end":{"line":236,"column":41}},"127":{"start":{"line":239,"column":2},"end":{"line":239,"column":43}},"128":{"start":{"line":243,"column":19},"end":{"line":243,"column":41}},"129":{"start":{"line":244,"column":2},"end":{"line":244,"column":40}},"130":{"start":{"line":245,"column":2},"end":{"line":245,"column":59}},"131":{"start":{"line":246,"column":2},"end":{"line":246,"column":76}},"132":{"start":{"line":247,"column":2},"end":{"line":250,"column":4}},"133":{"start":{"line":251,"column":2},"end":{"line":251,"column":18}},"134":{"start":{"line":255,"column":19},"end":{"line":255,"column":41}},"135":{"start":{"line":256,"column":25},"end":{"line":256,"column":40}},"136":{"start":{"line":258,"column":2},"end":{"line":272,"column":3}},"137":{"start":{"line":259,"column":4},"end":{"line":259,"column":48}},"138":{"start":{"line":260,"column":4},"end":{"line":264,"column":6}},"139":{"start":{"line":265,"column":9},"end":{"line":272,"column":3}},"140":{"start":{"line":266,"column":4},"end":{"line":266,"column":49}},"141":{"start":{"line":267,"column":4},"end":{"line":271,"column":6}},"142":{"start":{"line":274,"column":2},"end":{"line":277,"column":4}},"143":{"start":{"line":278,"column":2},"end":{"line":278,"column":18}},"144":{"start":{"line":282,"column":22},"end":{"line":282,"column":48}},"145":{"start":{"line":283,"column":17},"end":{"line":283,"column":19}},"146":{"start":{"line":285,"column":2},"end":{"line":314,"column":3}},"147":{"start":{"line":287,"column":6},"end":{"line":287,"column":41}},"148":{"start":{"line":288,"column":6},"end":{"line":288,"column":12}},"149":{"start":{"line":290,"column":6},"end":{"line":290,"column":37}},"150":{"start":{"line":291,"column":6},"end":{"line":291,"column":12}},"151":{"start":{"line":293,"column":6},"end":{"line":293,"column":39}},"152":{"start":{"line":294,"column":6},"end":{"line":294,"column":12}},"153":{"start":{"line":296,"column":6},"end":{"line":296,"column":42}},"154":{"start":{"line":297,"column":6},"end":{"line":307,"column":7}},"155":{"start":{"line":299,"column":10},"end":{"line":299,"column":51}},"156":{"start":{"line":300,"column":10},"end":{"line":300,"column":16}},"157":{"start":{"line":303,"column":10},"end":{"line":303,"column":48}},"158":{"start":{"line":304,"column":10},"end":{"line":304,"column":16}},"159":{"start":{"line":306,"column":10},"end":{"line":306,"column":42}},"160":{"start":{"line":308,"column":6},"end":{"line":308,"column":12}},"161":{"start":{"line":310,"column":6},"end":{"line":310,"column":38}},"162":{"start":{"line":311,"column":6},"end":{"line":311,"column":12}},"163":{"start":{"line":313,"column":6},"end":{"line":313,"column":63}},"164":{"start":{"line":315,"column":19},"end":{"line":315,"column":72}},"165":{"start":{"line":317,"column":2},"end":{"line":327,"column":3}},"166":{"start":{"line":323,"column":4},"end":{"line":326,"column":6}},"167":{"start":{"line":329,"column":2},"end":{"line":329,"column":18}},"168":{"start":{"line":333,"column":2},"end":{"line":333,"column":64}},"169":{"start":{"line":337,"column":30},"end":{"line":337,"column":32}},"170":{"start":{"line":340,"column":2},"end":{"line":388,"column":5}},"171":{"start":{"line":341,"column":30},"end":{"line":341,"column":32}},"172":{"start":{"line":342,"column":22},"end":{"line":342,"column":24}},"173":{"start":{"line":346,"column":28},"end":{"line":346,"column":36}},"174":{"start":{"line":347,"column":23},"end":{"line":347,"column":41}},"175":{"start":{"line":349,"column":29},"end":{"line":349,"column":56}},"176":{"start":{"line":352,"column":4},"end":{"line":355,"column":7}},"177":{"start":{"line":353,"column":6},"end":{"line":353,"column":59}},"178":{"start":{"line":354,"column":6},"end":{"line":354,"column":34}},"179":{"start":{"line":357,"column":4},"end":{"line":368,"column":5}},"180":{"start":{"line":358,"column":6},"end":{"line":360,"column":8}},"181":{"start":{"line":361,"column":6},"end":{"line":361,"column":75}},"182":{"start":{"line":364,"column":6},"end":{"line":366,"column":8}},"183":{"start":{"line":367,"column":6},"end":{"line":367,"column":72}},"184":{"start":{"line":370,"column":4},"end":{"line":373,"column":6}},"185":{"start":{"line":375,"column":4},"end":{"line":379,"column":6}},"186":{"start":{"line":380,"column":4},"end":{"line":387,"column":6}},"187":{"start":{"line":390,"column":2},"end":{"line":390,"column":29}},"188":{"start":{"line":401,"column":2},"end":{"line":428,"column":3}},"189":{"start":{"line":402,"column":4},"end":{"line":402,"column":36}},"190":{"start":{"line":403,"column":9},"end":{"line":428,"column":3}},"191":{"start":{"line":405,"column":4},"end":{"line":405,"column":33}},"192":{"start":{"line":408,"column":47},"end":{"line":408,"column":52}},"193":{"start":{"line":409,"column":21},"end":{"line":409,"column":45}},"194":{"start":{"line":411,"column":28},"end":{"line":411,"column":55}},"195":{"start":{"line":412,"column":4},"end":{"line":412,"column":61}},"196":{"start":{"line":413,"column":4},"end":{"line":413,"column":55}},"197":{"start":{"line":414,"column":4},"end":{"line":414,"column":55}},"198":{"start":{"line":415,"column":4},"end":{"line":415,"column":59}},"199":{"start":{"line":416,"column":4},"end":{"line":417,"column":45}},"200":{"start":{"line":418,"column":4},"end":{"line":418,"column":42}},"201":{"start":{"line":419,"column":4},"end":{"line":419,"column":46}},"202":{"start":{"line":421,"column":4},"end":{"line":427,"column":6}},"203":{"start":{"line":431,"column":26},"end":{"line":532,"column":1}},"204":{"start":{"line":432,"column":2},"end":{"line":435,"column":3}},"205":{"start":{"line":433,"column":23},"end":{"line":433,"column":75}},"206":{"start":{"line":434,"column":4},"end":{"line":434,"column":24}},"207":{"start":{"line":437,"column":28},"end":{"line":437,"column":30}},"208":{"start":{"line":438,"column":25},"end":{"line":438,"column":27}},"209":{"start":{"line":439,"column":28},"end":{"line":439,"column":30}},"210":{"start":{"line":440,"column":30},"end":{"line":440,"column":32}},"211":{"start":{"line":441,"column":27},"end":{"line":441,"column":29}},"212":{"start":{"line":442,"column":24},"end":{"line":442,"column":26}},"213":{"start":{"line":443,"column":2},"end":{"line":512,"column":4}},"214":{"start":{"line":445,"column":6},"end":{"line":510,"column":7}},"215":{"start":{"line":446,"column":8},"end":{"line":501,"column":9}},"216":{"start":{"line":448,"column":10},"end":{"line":453,"column":12}},"217":{"start":{"line":455,"column":10},"end":{"line":462,"column":11}},"218":{"start":{"line":460,"column":12},"end":{"line":460,"column":58}},"219":{"start":{"line":461,"column":12},"end":{"line":461,"column":37}},"220":{"start":{"line":463,"column":10},"end":{"line":470,"column":11}},"221":{"start":{"line":468,"column":12},"end":{"line":468,"column":52}},"222":{"start":{"line":469,"column":12},"end":{"line":469,"column":34}},"223":{"start":{"line":473,"column":10},"end":{"line":482,"column":12}},"224":{"start":{"line":485,"column":10},"end":{"line":492,"column":11}},"225":{"start":{"line":490,"column":12},"end":{"line":490,"column":58}},"226":{"start":{"line":491,"column":12},"end":{"line":491,"column":37}},"227":{"start":{"line":493,"column":10},"end":{"line":500,"column":11}},"228":{"start":{"line":498,"column":12},"end":{"line":498,"column":52}},"229":{"start":{"line":499,"column":12},"end":{"line":499,"column":34}},"230":{"start":{"line":503,"column":8},"end":{"line":509,"column":10}},"231":{"start":{"line":515,"column":36},"end":{"line":515,"column":38}},"232":{"start":{"line":516,"column":2},"end":{"line":518,"column":3}},"233":{"start":{"line":517,"column":4},"end":{"line":517,"column":73}},"234":{"start":{"line":520,"column":33},"end":{"line":520,"column":35}},"235":{"start":{"line":521,"column":2},"end":{"line":523,"column":3}},"236":{"start":{"line":522,"column":4},"end":{"line":522,"column":67}},"237":{"start":{"line":524,"column":28},"end":{"line":524,"column":30}},"238":{"start":{"line":526,"column":2},"end":{"line":529,"column":31}},"239":{"start":{"line":531,"column":2},"end":{"line":531,"column":52}},"240":{"start":{"line":534,"column":0},"end":{"line":534,"column":48}}},"fnMap":{"0":{"name":"validateMandatoryField","decl":{"start":{"line":25,"column":9},"end":{"line":25,"column":31}},"loc":{"start":{"line":25,"column":41},"end":{"line":29,"column":1}},"line":25},"1":{"name":"constructPayloadItem","decl":{"start":{"line":31,"column":9},"end":{"line":31,"column":29}},"loc":{"start":{"line":31,"column":62},"end":{"line":240,"column":1}},"line":31},"2":{"name":"(anonymous_2)","decl":{"start":{"line":153,"column":33},"end":{"line":153,"column":34}},"loc":{"start":{"line":153,"column":39},"end":{"line":165,"column":9}},"line":153},"3":{"name":"(anonymous_3)","decl":{"start":{"line":203,"column":33},"end":{"line":203,"column":34}},"loc":{"start":{"line":203,"column":39},"end":{"line":215,"column":9}},"line":203},"4":{"name":"responseBuilderSimple","decl":{"start":{"line":242,"column":9},"end":{"line":242,"column":30}},"loc":{"start":{"line":242,"column":63},"end":{"line":252,"column":1}},"line":242},"5":{"name":"responseBuilderSimpleForIdentify","decl":{"start":{"line":254,"column":9},"end":{"line":254,"column":41}},"loc":{"start":{"line":254,"column":74},"end":{"line":279,"column":1}},"line":254},"6":{"name":"processSingleMessage","decl":{"start":{"line":281,"column":9},"end":{"line":281,"column":29}},"loc":{"start":{"line":281,"column":52},"end":{"line":330,"column":1}},"line":281},"7":{"name":"process","decl":{"start":{"line":332,"column":9},"end":{"line":332,"column":16}},"loc":{"start":{"line":332,"column":24},"end":{"line":334,"column":1}},"line":332},"8":{"name":"batchEvents","decl":{"start":{"line":336,"column":9},"end":{"line":336,"column":20}},"loc":{"start":{"line":336,"column":34},"end":{"line":391,"column":1}},"line":336},"9":{"name":"(anonymous_9)","decl":{"start":{"line":340,"column":22},"end":{"line":340,"column":23}},"loc":{"start":{"line":340,"column":31},"end":{"line":388,"column":3}},"line":340},"10":{"name":"(anonymous_10)","decl":{"start":{"line":352,"column":18},"end":{"line":352,"column":19}},"loc":{"start":{"line":352,"column":24},"end":{"line":355,"column":5}},"line":352},"11":{"name":"getEventChunks","decl":{"start":{"line":393,"column":9},"end":{"line":393,"column":23}},"loc":{"start":{"line":398,"column":2},"end":{"line":429,"column":1}},"line":398},"12":{"name":"(anonymous_12)","decl":{"start":{"line":431,"column":26},"end":{"line":431,"column":27}},"loc":{"start":{"line":431,"column":42},"end":{"line":532,"column":1}},"line":431},"13":{"name":"(anonymous_13)","decl":{"start":{"line":444,"column":15},"end":{"line":444,"column":16}},"loc":{"start":{"line":444,"column":39},"end":{"line":511,"column":5}},"line":444}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":2},"end":{"line":28,"column":3}},"type":"if","locations":[{"start":{"line":26,"column":2},"end":{"line":28,"column":3}},{"start":{"line":26,"column":2},"end":{"line":28,"column":3}}],"line":26},"1":{"loc":{"start":{"line":26,"column":6},"end":{"line":26,"column":65}},"type":"binary-expr","locations":[{"start":{"line":26,"column":6},"end":{"line":26,"column":33}},{"start":{"line":26,"column":37},"end":{"line":26,"column":65}}],"line":26},"2":{"loc":{"start":{"line":35,"column":2},"end":{"line":237,"column":3}},"type":"switch","locations":[{"start":{"line":36,"column":4},"end":{"line":51,"column":12}},{"start":{"line":52,"column":4},"end":{"line":58,"column":12}},{"start":{"line":59,"column":4},"end":{"line":68,"column":12}},{"start":{"line":69,"column":4},"end":{"line":99,"column":12}},{"start":{"line":100,"column":4},"end":{"line":130,"column":12}},{"start":{"line":131,"column":4},"end":{"line":141,"column":12}},{"start":{"line":142,"column":4},"end":{"line":192,"column":12}},{"start":{"line":193,"column":4},"end":{"line":231,"column":12}},{"start":{"line":232,"column":4},"end":{"line":234,"column":12}},{"start":{"line":235,"column":4},"end":{"line":236,"column":41}}],"line":35},"3":{"loc":{"start":{"line":46,"column":6},"end":{"line":50,"column":7}},"type":"if","locations":[{"start":{"line":46,"column":6},"end":{"line":50,"column":7}},{"start":{"line":46,"column":6},"end":{"line":50,"column":7}}],"line":46},"4":{"loc":{"start":{"line":61,"column":6},"end":{"line":63,"column":7}},"type":"if","locations":[{"start":{"line":61,"column":6},"end":{"line":63,"column":7}},{"start":{"line":61,"column":6},"end":{"line":63,"column":7}}],"line":61},"5":{"loc":{"start":{"line":70,"column":6},"end":{"line":85,"column":7}},"type":"if","locations":[{"start":{"line":70,"column":6},"end":{"line":85,"column":7}},{"start":{"line":70,"column":6},"end":{"line":85,"column":7}}],"line":70},"6":{"loc":{"start":{"line":72,"column":13},"end":{"line":85,"column":7}},"type":"if","locations":[{"start":{"line":72,"column":13},"end":{"line":85,"column":7}},{"start":{"line":72,"column":13},"end":{"line":85,"column":7}}],"line":72},"7":{"loc":{"start":{"line":73,"column":8},"end":{"line":75,"column":27}},"type":"binary-expr","locations":[{"start":{"line":73,"column":8},"end":{"line":73,"column":48}},{"start":{"line":74,"column":10},"end":{"line":74,"column":28}},{"start":{"line":74,"column":32},"end":{"line":74,"column":59}},{"start":{"line":75,"column":10},"end":{"line":75,"column":26}}],"line":73},"8":{"loc":{"start":{"line":78,"column":13},"end":{"line":85,"column":7}},"type":"if","locations":[{"start":{"line":78,"column":13},"end":{"line":85,"column":7}},{"start":{"line":78,"column":13},"end":{"line":85,"column":7}}],"line":78},"9":{"loc":{"start":{"line":79,"column":8},"end":{"line":80,"column":73}},"type":"binary-expr","locations":[{"start":{"line":79,"column":8},"end":{"line":79,"column":42}},{"start":{"line":80,"column":10},"end":{"line":80,"column":28}},{"start":{"line":80,"column":32},"end":{"line":80,"column":55}},{"start":{"line":80,"column":60},"end":{"line":80,"column":72}}],"line":79},"10":{"loc":{"start":{"line":87,"column":6},"end":{"line":91,"column":7}},"type":"if","locations":[{"start":{"line":87,"column":6},"end":{"line":91,"column":7}},{"start":{"line":87,"column":6},"end":{"line":91,"column":7}}],"line":87},"11":{"loc":{"start":{"line":93,"column":6},"end":{"line":95,"column":7}},"type":"if","locations":[{"start":{"line":93,"column":6},"end":{"line":95,"column":7}},{"start":{"line":93,"column":6},"end":{"line":95,"column":7}}],"line":93},"12":{"loc":{"start":{"line":96,"column":6},"end":{"line":98,"column":7}},"type":"if","locations":[{"start":{"line":96,"column":6},"end":{"line":98,"column":7}},{"start":{"line":96,"column":6},"end":{"line":98,"column":7}}],"line":96},"13":{"loc":{"start":{"line":101,"column":6},"end":{"line":116,"column":7}},"type":"if","locations":[{"start":{"line":101,"column":6},"end":{"line":116,"column":7}},{"start":{"line":101,"column":6},"end":{"line":116,"column":7}}],"line":101},"14":{"loc":{"start":{"line":103,"column":13},"end":{"line":116,"column":7}},"type":"if","locations":[{"start":{"line":103,"column":13},"end":{"line":116,"column":7}},{"start":{"line":103,"column":13},"end":{"line":116,"column":7}}],"line":103},"15":{"loc":{"start":{"line":104,"column":8},"end":{"line":106,"column":27}},"type":"binary-expr","locations":[{"start":{"line":104,"column":8},"end":{"line":104,"column":48}},{"start":{"line":105,"column":10},"end":{"line":105,"column":28}},{"start":{"line":105,"column":32},"end":{"line":105,"column":59}},{"start":{"line":106,"column":10},"end":{"line":106,"column":26}}],"line":104},"16":{"loc":{"start":{"line":109,"column":13},"end":{"line":116,"column":7}},"type":"if","locations":[{"start":{"line":109,"column":13},"end":{"line":116,"column":7}},{"start":{"line":109,"column":13},"end":{"line":116,"column":7}}],"line":109},"17":{"loc":{"start":{"line":110,"column":8},"end":{"line":111,"column":73}},"type":"binary-expr","locations":[{"start":{"line":110,"column":8},"end":{"line":110,"column":42}},{"start":{"line":111,"column":10},"end":{"line":111,"column":28}},{"start":{"line":111,"column":32},"end":{"line":111,"column":55}},{"start":{"line":111,"column":60},"end":{"line":111,"column":72}}],"line":110},"18":{"loc":{"start":{"line":118,"column":6},"end":{"line":122,"column":7}},"type":"if","locations":[{"start":{"line":118,"column":6},"end":{"line":122,"column":7}},{"start":{"line":118,"column":6},"end":{"line":122,"column":7}}],"line":118},"19":{"loc":{"start":{"line":124,"column":6},"end":{"line":126,"column":7}},"type":"if","locations":[{"start":{"line":124,"column":6},"end":{"line":126,"column":7}},{"start":{"line":124,"column":6},"end":{"line":126,"column":7}}],"line":124},"20":{"loc":{"start":{"line":127,"column":6},"end":{"line":129,"column":7}},"type":"if","locations":[{"start":{"line":127,"column":6},"end":{"line":129,"column":7}},{"start":{"line":127,"column":6},"end":{"line":129,"column":7}}],"line":127},"21":{"loc":{"start":{"line":135,"column":6},"end":{"line":137,"column":7}},"type":"if","locations":[{"start":{"line":135,"column":6},"end":{"line":137,"column":7}},{"start":{"line":135,"column":6},"end":{"line":137,"column":7}}],"line":135},"22":{"loc":{"start":{"line":138,"column":6},"end":{"line":140,"column":7}},"type":"if","locations":[{"start":{"line":138,"column":6},"end":{"line":140,"column":7}},{"start":{"line":138,"column":6},"end":{"line":140,"column":7}}],"line":138},"23":{"loc":{"start":{"line":152,"column":6},"end":{"line":178,"column":7}},"type":"if","locations":[{"start":{"line":152,"column":6},"end":{"line":178,"column":7}},{"start":{"line":152,"column":6},"end":{"line":178,"column":7}}],"line":152},"24":{"loc":{"start":{"line":158,"column":10},"end":{"line":160,"column":11}},"type":"if","locations":[{"start":{"line":158,"column":10},"end":{"line":160,"column":11}},{"start":{"line":158,"column":10},"end":{"line":160,"column":11}}],"line":158},"25":{"loc":{"start":{"line":158,"column":14},"end":{"line":158,"column":74}},"type":"binary-expr","locations":[{"start":{"line":158,"column":14},"end":{"line":158,"column":32}},{"start":{"line":158,"column":36},"end":{"line":158,"column":74}}],"line":158},"26":{"loc":{"start":{"line":171,"column":8},"end":{"line":173,"column":9}},"type":"if","locations":[{"start":{"line":171,"column":8},"end":{"line":173,"column":9}},{"start":{"line":171,"column":8},"end":{"line":173,"column":9}}],"line":171},"27":{"loc":{"start":{"line":171,"column":12},"end":{"line":171,"column":72}},"type":"binary-expr","locations":[{"start":{"line":171,"column":12},"end":{"line":171,"column":30}},{"start":{"line":171,"column":34},"end":{"line":171,"column":72}}],"line":171},"28":{"loc":{"start":{"line":183,"column":6},"end":{"line":185,"column":7}},"type":"if","locations":[{"start":{"line":183,"column":6},"end":{"line":185,"column":7}},{"start":{"line":183,"column":6},"end":{"line":185,"column":7}}],"line":183},"29":{"loc":{"start":{"line":186,"column":6},"end":{"line":188,"column":7}},"type":"if","locations":[{"start":{"line":186,"column":6},"end":{"line":188,"column":7}},{"start":{"line":186,"column":6},"end":{"line":188,"column":7}}],"line":186},"30":{"loc":{"start":{"line":189,"column":6},"end":{"line":191,"column":7}},"type":"if","locations":[{"start":{"line":189,"column":6},"end":{"line":191,"column":7}},{"start":{"line":189,"column":6},"end":{"line":191,"column":7}}],"line":189},"31":{"loc":{"start":{"line":202,"column":6},"end":{"line":228,"column":7}},"type":"if","locations":[{"start":{"line":202,"column":6},"end":{"line":228,"column":7}},{"start":{"line":202,"column":6},"end":{"line":228,"column":7}}],"line":202},"32":{"loc":{"start":{"line":208,"column":10},"end":{"line":210,"column":11}},"type":"if","locations":[{"start":{"line":208,"column":10},"end":{"line":210,"column":11}},{"start":{"line":208,"column":10},"end":{"line":210,"column":11}}],"line":208},"33":{"loc":{"start":{"line":208,"column":14},"end":{"line":208,"column":74}},"type":"binary-expr","locations":[{"start":{"line":208,"column":14},"end":{"line":208,"column":32}},{"start":{"line":208,"column":36},"end":{"line":208,"column":74}}],"line":208},"34":{"loc":{"start":{"line":221,"column":8},"end":{"line":223,"column":9}},"type":"if","locations":[{"start":{"line":221,"column":8},"end":{"line":223,"column":9}},{"start":{"line":221,"column":8},"end":{"line":223,"column":9}}],"line":221},"35":{"loc":{"start":{"line":221,"column":12},"end":{"line":221,"column":72}},"type":"binary-expr","locations":[{"start":{"line":221,"column":12},"end":{"line":221,"column":30}},{"start":{"line":221,"column":34},"end":{"line":221,"column":72}}],"line":221},"36":{"loc":{"start":{"line":258,"column":2},"end":{"line":272,"column":3}},"type":"if","locations":[{"start":{"line":258,"column":2},"end":{"line":272,"column":3}},{"start":{"line":258,"column":2},"end":{"line":272,"column":3}}],"line":258},"37":{"loc":{"start":{"line":265,"column":9},"end":{"line":272,"column":3}},"type":"if","locations":[{"start":{"line":265,"column":9},"end":{"line":272,"column":3}},{"start":{"line":265,"column":9},"end":{"line":272,"column":3}}],"line":265},"38":{"loc":{"start":{"line":285,"column":2},"end":{"line":314,"column":3}},"type":"switch","locations":[{"start":{"line":286,"column":4},"end":{"line":288,"column":12}},{"start":{"line":289,"column":4},"end":{"line":291,"column":12}},{"start":{"line":292,"column":4},"end":{"line":294,"column":12}},{"start":{"line":295,"column":4},"end":{"line":308,"column":12}},{"start":{"line":309,"column":4},"end":{"line":311,"column":12}},{"start":{"line":312,"column":4},"end":{"line":313,"column":63}}],"line":285},"39":{"loc":{"start":{"line":297,"column":6},"end":{"line":307,"column":7}},"type":"switch","locations":[{"start":{"line":298,"column":8},"end":{"line":300,"column":16}},{"start":{"line":301,"column":8},"end":{"line":301,"column":29}},{"start":{"line":302,"column":8},"end":{"line":304,"column":16}},{"start":{"line":305,"column":8},"end":{"line":306,"column":42}}],"line":297},"40":{"loc":{"start":{"line":317,"column":2},"end":{"line":327,"column":3}},"type":"if","locations":[{"start":{"line":317,"column":2},"end":{"line":327,"column":3}},{"start":{"line":317,"column":2},"end":{"line":327,"column":3}}],"line":317},"41":{"loc":{"start":{"line":318,"column":4},"end":{"line":321,"column":55}},"type":"binary-expr","locations":[{"start":{"line":318,"column":4},"end":{"line":318,"column":39}},{"start":{"line":319,"column":4},"end":{"line":319,"column":19}},{"start":{"line":320,"column":6},"end":{"line":320,"column":28}},{"start":{"line":320,"column":32},"end":{"line":320,"column":60}},{"start":{"line":321,"column":7},"end":{"line":321,"column":25}},{"start":{"line":321,"column":29},"end":{"line":321,"column":53}}],"line":318},"42":{"loc":{"start":{"line":357,"column":4},"end":{"line":368,"column":5}},"type":"if","locations":[{"start":{"line":357,"column":4},"end":{"line":368,"column":5}},{"start":{"line":357,"column":4},"end":{"line":368,"column":5}}],"line":357},"43":{"loc":{"start":{"line":401,"column":2},"end":{"line":428,"column":3}},"type":"if","locations":[{"start":{"line":401,"column":2},"end":{"line":428,"column":3}},{"start":{"line":401,"column":2},"end":{"line":428,"column":3}}],"line":401},"44":{"loc":{"start":{"line":403,"column":9},"end":{"line":428,"column":3}},"type":"if","locations":[{"start":{"line":403,"column":9},"end":{"line":428,"column":3}},{"start":{"line":403,"column":9},"end":{"line":428,"column":3}}],"line":403},"45":{"loc":{"start":{"line":432,"column":2},"end":{"line":435,"column":3}},"type":"if","locations":[{"start":{"line":432,"column":2},"end":{"line":435,"column":3}},{"start":{"line":432,"column":2},"end":{"line":435,"column":3}}],"line":432},"46":{"loc":{"start":{"line":432,"column":6},"end":{"line":432,"column":50}},"type":"binary-expr","locations":[{"start":{"line":432,"column":6},"end":{"line":432,"column":28}},{"start":{"line":432,"column":32},"end":{"line":432,"column":50}}],"line":432},"47":{"loc":{"start":{"line":446,"column":8},"end":{"line":501,"column":9}},"type":"if","locations":[{"start":{"line":446,"column":8},"end":{"line":501,"column":9}},{"start":{"line":446,"column":8},"end":{"line":501,"column":9}}],"line":446},"48":{"loc":{"start":{"line":455,"column":10},"end":{"line":462,"column":11}},"type":"if","locations":[{"start":{"line":455,"column":10},"end":{"line":462,"column":11}},{"start":{"line":455,"column":10},"end":{"line":462,"column":11}}],"line":455},"49":{"loc":{"start":{"line":456,"column":12},"end":{"line":458,"column":42}},"type":"binary-expr","locations":[{"start":{"line":456,"column":12},"end":{"line":456,"column":38}},{"start":{"line":457,"column":13},"end":{"line":457,"column":66}},{"start":{"line":458,"column":14},"end":{"line":458,"column":41}}],"line":456},"50":{"loc":{"start":{"line":463,"column":10},"end":{"line":470,"column":11}},"type":"if","locations":[{"start":{"line":463,"column":10},"end":{"line":470,"column":11}},{"start":{"line":463,"column":10},"end":{"line":470,"column":11}}],"line":463},"51":{"loc":{"start":{"line":464,"column":12},"end":{"line":466,"column":42}},"type":"binary-expr","locations":[{"start":{"line":464,"column":12},"end":{"line":464,"column":35}},{"start":{"line":465,"column":13},"end":{"line":465,"column":60}},{"start":{"line":466,"column":14},"end":{"line":466,"column":41}}],"line":464},"52":{"loc":{"start":{"line":485,"column":10},"end":{"line":492,"column":11}},"type":"if","locations":[{"start":{"line":485,"column":10},"end":{"line":492,"column":11}},{"start":{"line":485,"column":10},"end":{"line":492,"column":11}}],"line":485},"53":{"loc":{"start":{"line":486,"column":12},"end":{"line":488,"column":42}},"type":"binary-expr","locations":[{"start":{"line":486,"column":12},"end":{"line":486,"column":38}},{"start":{"line":487,"column":13},"end":{"line":487,"column":66}},{"start":{"line":488,"column":14},"end":{"line":488,"column":41}}],"line":486},"54":{"loc":{"start":{"line":493,"column":10},"end":{"line":500,"column":11}},"type":"if","locations":[{"start":{"line":493,"column":10},"end":{"line":500,"column":11}},{"start":{"line":493,"column":10},"end":{"line":500,"column":11}}],"line":493},"55":{"loc":{"start":{"line":494,"column":12},"end":{"line":496,"column":42}},"type":"binary-expr","locations":[{"start":{"line":494,"column":12},"end":{"line":494,"column":35}},{"start":{"line":495,"column":13},"end":{"line":495,"column":60}},{"start":{"line":496,"column":14},"end":{"line":496,"column":41}}],"line":494},"56":{"loc":{"start":{"line":506,"column":12},"end":{"line":506,"column":56}},"type":"cond-expr","locations":[{"start":{"line":506,"column":29},"end":{"line":506,"column":50}},{"start":{"line":506,"column":53},"end":{"line":506,"column":56}}],"line":506},"57":{"loc":{"start":{"line":507,"column":12},"end":{"line":507,"column":71}},"type":"binary-expr","locations":[{"start":{"line":507,"column":12},"end":{"line":507,"column":25}},{"start":{"line":507,"column":29},"end":{"line":507,"column":71}}],"line":507},"58":{"loc":{"start":{"line":516,"column":2},"end":{"line":518,"column":3}},"type":"if","locations":[{"start":{"line":516,"column":2},"end":{"line":518,"column":3}},{"start":{"line":516,"column":2},"end":{"line":518,"column":3}}],"line":516},"59":{"loc":{"start":{"line":521,"column":2},"end":{"line":523,"column":3}},"type":"if","locations":[{"start":{"line":521,"column":2},"end":{"line":523,"column":3}},{"start":{"line":521,"column":2},"end":{"line":523,"column":3}}],"line":521}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":32,"6":1,"7":41,"8":41,"9":41,"10":3,"11":3,"12":3,"13":3,"14":2,"15":1,"16":3,"17":2,"18":2,"19":2,"20":11,"21":3,"22":11,"23":11,"24":11,"25":11,"26":10,"27":8,"28":3,"29":5,"30":2,"31":3,"32":1,"33":2,"34":6,"35":6,"36":1,"37":5,"38":6,"39":6,"40":1,"41":6,"42":1,"43":6,"44":4,"45":2,"46":2,"47":1,"48":1,"49":1,"50":0,"51":4,"52":4,"53":1,"54":3,"55":4,"56":4,"57":1,"58":4,"59":1,"60":4,"61":3,"62":3,"63":3,"64":3,"65":1,"66":3,"67":1,"68":3,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":5,"102":5,"103":5,"104":5,"105":5,"106":5,"107":4,"108":8,"109":8,"110":6,"111":8,"112":8,"113":8,"114":8,"115":1,"116":1,"117":0,"118":1,"119":1,"120":1,"121":1,"122":5,"123":5,"124":4,"125":2,"126":0,"127":36,"128":36,"129":36,"130":36,"131":36,"132":31,"133":31,"134":5,"135":5,"136":5,"137":3,"138":3,"139":2,"140":2,"141":2,"142":5,"143":5,"144":37,"145":37,"146":37,"147":11,"148":11,"149":8,"150":8,"151":4,"152":4,"153":9,"154":9,"155":1,"156":1,"157":5,"158":5,"159":3,"160":9,"161":4,"162":4,"163":1,"164":36,"165":31,"166":5,"167":26,"168":37,"169":2,"170":2,"171":2,"172":2,"173":2,"174":2,"175":2,"176":2,"177":6,"178":6,"179":2,"180":1,"181":1,"182":1,"183":1,"184":2,"185":2,"186":2,"187":2,"188":7,"189":3,"190":4,"191":3,"192":1,"193":1,"194":1,"195":1,"196":1,"197":1,"198":1,"199":1,"200":1,"201":1,"202":1,"203":1,"204":1,"205":0,"206":0,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":7,"215":7,"216":0,"217":0,"218":0,"219":0,"220":0,"221":0,"222":0,"223":7,"224":7,"225":1,"226":1,"227":7,"228":1,"229":1,"230":0,"231":1,"232":1,"233":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1},"f":{"0":32,"1":41,"2":2,"3":8,"4":36,"5":5,"6":37,"7":37,"8":2,"9":2,"10":6,"11":7,"12":1,"13":7},"b":{"0":[1,31],"1":[32,5],"2":[3,2,11,8,4,3,1,5,4,0],"3":[2,1],"4":[3,8],"5":[3,5],"6":[2,3],"7":[5,4,4,2],"8":[1,2],"9":[3,1,1,0],"10":[1,5],"11":[1,5],"12":[1,5],"13":[2,2],"14":[1,1],"15":[2,1,1,0],"16":[1,0],"17":[1,1,1,0],"18":[1,3],"19":[1,3],"20":[1,3],"21":[1,2],"22":[1,2],"23":[1,0],"24":[2,0],"25":[2,2],"26":[0,0],"27":[0,0],"28":[1,0],"29":[1,0],"30":[1,0],"31":[4,1],"32":[6,2],"33":[8,8],"34":[0,1],"35":[1,0],"36":[3,2],"37":[2,0],"38":[11,8,4,9,4,1],"39":[1,5,5,3],"40":[5,26],"41":[31,10,10,3,7,2],"42":[1,1],"43":[3,4],"44":[3,1],"45":[0,1],"46":[1,1],"47":[0,7],"48":[0,0],"49":[0,0,0],"50":[0,0],"51":[0,0,0],"52":[1,6],"53":[7,6,6],"54":[1,6],"55":[7,7,7],"56":[0,0],"57":[0,0],"58":[1,0],"59":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"5d5c8dfc386830210c185b862e598b741f8f1022"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\kafka\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\kafka\\transform.js","statementMap":{"0":{"start":{"line":2,"column":19},"end":{"line":2,"column":21}},"1":{"start":{"line":3,"column":25},"end":{"line":3,"column":27}},"2":{"start":{"line":4,"column":19},"end":{"line":4,"column":21}},"3":{"start":{"line":5,"column":2},"end":{"line":8,"column":5}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":34}},"5":{"start":{"line":7,"column":4},"end":{"line":7,"column":39}},"6":{"start":{"line":9,"column":2},"end":{"line":13,"column":5}},"7":{"start":{"line":15,"column":2},"end":{"line":15,"column":18}},"8":{"start":{"line":19,"column":17},"end":{"line":22,"column":3}},"9":{"start":{"line":23,"column":2},"end":{"line":23,"column":16}},"10":{"start":{"line":26,"column":0},"end":{"line":26,"column":36}}},"fnMap":{"0":{"name":"batch","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":14}},"loc":{"start":{"line":1,"column":27},"end":{"line":16,"column":1}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":5,"column":21},"end":{"line":5,"column":22}},"loc":{"start":{"line":5,"column":30},"end":{"line":8,"column":3}},"line":5},"2":{"name":"process","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":16}},"loc":{"start":{"line":18,"column":24},"end":{"line":24,"column":1}},"line":18}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":12},"end":{"line":21,"column":61}},"type":"binary-expr","locations":[{"start":{"line":21,"column":12},"end":{"line":21,"column":32}},{"start":{"line":21,"column":36},"end":{"line":21,"column":61}}],"line":21}},"s":{"0":1,"1":1,"2":1,"3":1,"4":4,"5":4,"6":1,"7":1,"8":5,"9":5,"10":1},"f":{"0":1,"1":4,"2":5},"b":{"0":[5,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"dd42251792c1fc5248fc4b3fd460eec09cd09a0c"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\keen\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\keen\\config.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":51}},"1":{"start":{"line":3,"column":0},"end":{"line":5,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4e5fc2b0aba71599ebc24d56c5e715dbba94ba58"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\keen\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\keen\\transform.js","statementMap":{"0":{"start":{"line":3,"column":13},"end":{"line":3,"column":29}},"1":{"start":{"line":4,"column":17},"end":{"line":4,"column":37}},"2":{"start":{"line":5,"column":22},"end":{"line":5,"column":51}},"3":{"start":{"line":14,"column":4},"end":{"line":14,"column":25}},"4":{"start":{"line":15,"column":21},"end":{"line":15,"column":40}},"5":{"start":{"line":18,"column":17},"end":{"line":18,"column":19}},"6":{"start":{"line":19,"column":2},"end":{"line":25,"column":3}},"7":{"start":{"line":20,"column":4},"end":{"line":24,"column":7}},"8":{"start":{"line":26,"column":2},"end":{"line":32,"column":3}},"9":{"start":{"line":27,"column":4},"end":{"line":31,"column":7}},"10":{"start":{"line":33,"column":2},"end":{"line":39,"column":3}},"11":{"start":{"line":34,"column":4},"end":{"line":38,"column":7}},"12":{"start":{"line":41,"column":2},"end":{"line":55,"column":3}},"13":{"start":{"line":47,"column":4},"end":{"line":54,"column":7}},"14":{"start":{"line":57,"column":2},"end":{"line":59,"column":4}},"15":{"start":{"line":63,"column":19},"end":{"line":63,"column":84}},"16":{"start":{"line":64,"column":19},"end":{"line":64,"column":41}},"17":{"start":{"line":65,"column":2},"end":{"line":65,"column":31}},"18":{"start":{"line":66,"column":2},"end":{"line":66,"column":59}},"19":{"start":{"line":67,"column":2},"end":{"line":70,"column":4}},"20":{"start":{"line":71,"column":2},"end":{"line":71,"column":74}},"21":{"start":{"line":72,"column":2},"end":{"line":74,"column":4}},"22":{"start":{"line":75,"column":2},"end":{"line":75,"column":18}},"23":{"start":{"line":79,"column":20},"end":{"line":79,"column":33}},"24":{"start":{"line":80,"column":23},"end":{"line":80,"column":30}},"25":{"start":{"line":81,"column":15},"end":{"line":81,"column":17}},"26":{"start":{"line":82,"column":2},"end":{"line":86,"column":26}},"27":{"start":{"line":87,"column":2},"end":{"line":87,"column":66}},"28":{"start":{"line":88,"column":2},"end":{"line":91,"column":4}},"29":{"start":{"line":93,"column":2},"end":{"line":93,"column":37}},"30":{"start":{"line":94,"column":2},"end":{"line":94,"column":47}},"31":{"start":{"line":97,"column":2},"end":{"line":97,"column":47}},"32":{"start":{"line":100,"column":2},"end":{"line":100,"column":52}},"33":{"start":{"line":102,"column":2},"end":{"line":102,"column":44}},"34":{"start":{"line":104,"column":2},"end":{"line":104,"column":34}},"35":{"start":{"line":105,"column":2},"end":{"line":105,"column":56}},"36":{"start":{"line":109,"column":19},"end":{"line":109,"column":31}},"37":{"start":{"line":110,"column":23},"end":{"line":112,"column":15}},"38":{"start":{"line":114,"column":18},"end":{"line":114,"column":33}},"39":{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},"40":{"start":{"line":117,"column":4},"end":{"line":117,"column":42}},"41":{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},"42":{"start":{"line":121,"column":4},"end":{"line":121,"column":58}},"43":{"start":{"line":124,"column":2},"end":{"line":124,"column":28}},"44":{"start":{"line":126,"column":2},"end":{"line":126,"column":44}},"45":{"start":{"line":131,"column":35},"end":{"line":131,"column":40}},"46":{"start":{"line":132,"column":22},"end":{"line":132,"column":48}},"47":{"start":{"line":134,"column":2},"end":{"line":143,"column":3}},"48":{"start":{"line":136,"column":6},"end":{"line":136,"column":51}},"49":{"start":{"line":137,"column":6},"end":{"line":137,"column":12}},"50":{"start":{"line":139,"column":6},"end":{"line":139,"column":52}},"51":{"start":{"line":140,"column":6},"end":{"line":140,"column":12}},"52":{"start":{"line":142,"column":6},"end":{"line":142,"column":63}},"53":{"start":{"line":145,"column":2},"end":{"line":145,"column":28}},"54":{"start":{"line":146,"column":2},"end":{"line":146,"column":18}},"55":{"start":{"line":149,"column":26},"end":{"line":186,"column":1}},"56":{"start":{"line":150,"column":2},"end":{"line":153,"column":3}},"57":{"start":{"line":151,"column":23},"end":{"line":151,"column":75}},"58":{"start":{"line":152,"column":4},"end":{"line":152,"column":24}},"59":{"start":{"line":155,"column":19},"end":{"line":184,"column":3}},"60":{"start":{"line":157,"column":6},"end":{"line":182,"column":7}},"61":{"start":{"line":158,"column":8},"end":{"line":165,"column":9}},"62":{"start":{"line":160,"column":10},"end":{"line":164,"column":12}},"63":{"start":{"line":167,"column":8},"end":{"line":171,"column":10}},"64":{"start":{"line":173,"column":8},"end":{"line":181,"column":10}},"65":{"start":{"line":185,"column":2},"end":{"line":185,"column":18}},"66":{"start":{"line":188,"column":0},"end":{"line":188,"column":48}}},"fnMap":{"0":{"name":"addAddons","decl":{"start":{"line":17,"column":9},"end":{"line":17,"column":18}},"loc":{"start":{"line":17,"column":39},"end":{"line":60,"column":1}},"line":17},"1":{"name":"buildResponse","decl":{"start":{"line":62,"column":9},"end":{"line":62,"column":22}},"loc":{"start":{"line":62,"column":56},"end":{"line":76,"column":1}},"line":62},"2":{"name":"processTrack","decl":{"start":{"line":78,"column":9},"end":{"line":78,"column":21}},"loc":{"start":{"line":78,"column":44},"end":{"line":106,"column":1}},"line":78},"3":{"name":"processPage","decl":{"start":{"line":108,"column":9},"end":{"line":108,"column":20}},"loc":{"start":{"line":108,"column":43},"end":{"line":127,"column":1}},"line":108},"4":{"name":"process","decl":{"start":{"line":129,"column":9},"end":{"line":129,"column":16}},"loc":{"start":{"line":129,"column":24},"end":{"line":147,"column":1}},"line":129},"5":{"name":"(anonymous_5)","decl":{"start":{"line":149,"column":26},"end":{"line":149,"column":27}},"loc":{"start":{"line":149,"column":42},"end":{"line":186,"column":1}},"line":149},"6":{"name":"(anonymous_6)","decl":{"start":{"line":156,"column":15},"end":{"line":156,"column":16}},"loc":{"start":{"line":156,"column":30},"end":{"line":183,"column":5}},"line":156}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":2},"end":{"line":25,"column":3}},"type":"if","locations":[{"start":{"line":19,"column":2},"end":{"line":25,"column":3}},{"start":{"line":19,"column":2},"end":{"line":25,"column":3}}],"line":19},"1":{"loc":{"start":{"line":19,"column":6},"end":{"line":19,"column":76}},"type":"binary-expr","locations":[{"start":{"line":19,"column":6},"end":{"line":19,"column":20}},{"start":{"line":19,"column":24},"end":{"line":19,"column":45}},{"start":{"line":19,"column":49},"end":{"line":19,"column":76}}],"line":19},"2":{"loc":{"start":{"line":26,"column":2},"end":{"line":32,"column":3}},"type":"if","locations":[{"start":{"line":26,"column":2},"end":{"line":32,"column":3}},{"start":{"line":26,"column":2},"end":{"line":32,"column":3}}],"line":26},"3":{"loc":{"start":{"line":26,"column":6},"end":{"line":26,"column":45}},"type":"binary-expr","locations":[{"start":{"line":26,"column":6},"end":{"line":26,"column":20}},{"start":{"line":26,"column":24},"end":{"line":26,"column":45}}],"line":26},"4":{"loc":{"start":{"line":33,"column":2},"end":{"line":39,"column":3}},"type":"if","locations":[{"start":{"line":33,"column":2},"end":{"line":39,"column":3}},{"start":{"line":33,"column":2},"end":{"line":39,"column":3}}],"line":33},"5":{"loc":{"start":{"line":33,"column":6},"end":{"line":33,"column":73}},"type":"binary-expr","locations":[{"start":{"line":33,"column":6},"end":{"line":33,"column":21}},{"start":{"line":33,"column":25},"end":{"line":33,"column":39}},{"start":{"line":33,"column":43},"end":{"line":33,"column":73}}],"line":33},"6":{"loc":{"start":{"line":41,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":55,"column":3}},{"start":{"line":41,"column":2},"end":{"line":55,"column":3}}],"line":41},"7":{"loc":{"start":{"line":42,"column":4},"end":{"line":45,"column":34}},"type":"binary-expr","locations":[{"start":{"line":42,"column":4},"end":{"line":42,"column":24}},{"start":{"line":43,"column":4},"end":{"line":43,"column":23}},{"start":{"line":44,"column":4},"end":{"line":44,"column":18}},{"start":{"line":45,"column":4},"end":{"line":45,"column":34}}],"line":42},"8":{"loc":{"start":{"line":71,"column":20},"end":{"line":71,"column":73}},"type":"cond-expr","locations":[{"start":{"line":71,"column":37},"end":{"line":71,"column":51}},{"start":{"line":71,"column":54},"end":{"line":71,"column":73}}],"line":71},"9":{"loc":{"start":{"line":82,"column":16},"end":{"line":86,"column":25}},"type":"cond-expr","locations":[{"start":{"line":83,"column":6},"end":{"line":85,"column":27}},{"start":{"line":86,"column":6},"end":{"line":86,"column":25}}],"line":82},"10":{"loc":{"start":{"line":83,"column":6},"end":{"line":85,"column":27}},"type":"cond-expr","locations":[{"start":{"line":84,"column":8},"end":{"line":84,"column":22}},{"start":{"line":85,"column":8},"end":{"line":85,"column":27}}],"line":83},"11":{"loc":{"start":{"line":87,"column":16},"end":{"line":87,"column":65}},"type":"binary-expr","locations":[{"start":{"line":87,"column":16},"end":{"line":87,"column":59}},{"start":{"line":87,"column":63},"end":{"line":87,"column":65}}],"line":87},"12":{"loc":{"start":{"line":110,"column":23},"end":{"line":112,"column":15}},"type":"cond-expr","locations":[{"start":{"line":111,"column":6},"end":{"line":111,"column":33}},{"start":{"line":112,"column":6},"end":{"line":112,"column":15}}],"line":110},"13":{"loc":{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},{"start":{"line":116,"column":2},"end":{"line":118,"column":3}}],"line":116},"14":{"loc":{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},"type":"if","locations":[{"start":{"line":120,"column":2},"end":{"line":122,"column":3}},{"start":{"line":120,"column":2},"end":{"line":122,"column":3}}],"line":120},"15":{"loc":{"start":{"line":120,"column":6},"end":{"line":120,"column":30}},"type":"binary-expr","locations":[{"start":{"line":120,"column":6},"end":{"line":120,"column":18}},{"start":{"line":120,"column":22},"end":{"line":120,"column":30}}],"line":120},"16":{"loc":{"start":{"line":134,"column":2},"end":{"line":143,"column":3}},"type":"switch","locations":[{"start":{"line":135,"column":4},"end":{"line":137,"column":12}},{"start":{"line":138,"column":4},"end":{"line":140,"column":12}},{"start":{"line":141,"column":4},"end":{"line":142,"column":63}}],"line":134},"17":{"loc":{"start":{"line":150,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":150,"column":2},"end":{"line":153,"column":3}},{"start":{"line":150,"column":2},"end":{"line":153,"column":3}}],"line":150},"18":{"loc":{"start":{"line":150,"column":6},"end":{"line":150,"column":50}},"type":"binary-expr","locations":[{"start":{"line":150,"column":6},"end":{"line":150,"column":28}},{"start":{"line":150,"column":32},"end":{"line":150,"column":50}}],"line":150},"19":{"loc":{"start":{"line":158,"column":8},"end":{"line":165,"column":9}},"type":"if","locations":[{"start":{"line":158,"column":8},"end":{"line":165,"column":9}},{"start":{"line":158,"column":8},"end":{"line":165,"column":9}}],"line":158},"20":{"loc":{"start":{"line":175,"column":10},"end":{"line":179,"column":17}},"type":"cond-expr","locations":[{"start":{"line":176,"column":14},"end":{"line":176,"column":35}},{"start":{"line":177,"column":14},"end":{"line":179,"column":17}}],"line":175},"21":{"loc":{"start":{"line":177,"column":14},"end":{"line":179,"column":17}},"type":"cond-expr","locations":[{"start":{"line":178,"column":14},"end":{"line":178,"column":24}},{"start":{"line":179,"column":14},"end":{"line":179,"column":17}}],"line":177},"22":{"loc":{"start":{"line":180,"column":10},"end":{"line":180,"column":69}},"type":"binary-expr","locations":[{"start":{"line":180,"column":10},"end":{"line":180,"column":23}},{"start":{"line":180,"column":27},"end":{"line":180,"column":69}}],"line":180}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":4,"6":4,"7":4,"8":4,"9":4,"10":4,"11":0,"12":4,"13":0,"14":4,"15":4,"16":4,"17":4,"18":4,"19":4,"20":4,"21":4,"22":4,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"30":4,"31":4,"32":4,"33":4,"34":4,"35":4,"36":2,"37":2,"38":2,"39":2,"40":2,"41":2,"42":0,"43":2,"44":2,"45":5,"46":5,"47":5,"48":2,"49":2,"50":2,"51":2,"52":1,"53":4,"54":4,"55":1,"56":1,"57":0,"58":0,"59":1,"60":2,"61":2,"62":0,"63":2,"64":0,"65":1,"66":1},"f":{"0":4,"1":4,"2":4,"3":2,"4":5,"5":1,"6":2},"b":{"0":[4,0],"1":[4,4,4],"2":[4,0],"3":[4,4],"4":[0,4],"5":[4,4,2],"6":[0,4],"7":[4,4,2,2],"8":[4,0],"9":[4,0],"10":[4,0],"11":[4,0],"12":[2,0],"13":[2,0],"14":[0,2],"15":[2,0],"16":[2,2,1],"17":[0,1],"18":[1,1],"19":[0,2],"20":[0,0],"21":[0,0],"22":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"76143f26a1a1627a49325aec2f1762bbd2f471f2"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\kinesis\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\kinesis\\transform.js","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":5,"column":3}},"1":{"start":{"line":6,"column":2},"end":{"line":6,"column":16}},"2":{"start":{"line":9,"column":0},"end":{"line":9,"column":26}}},"fnMap":{"0":{"name":"process","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":16}},"loc":{"start":{"line":1,"column":24},"end":{"line":7,"column":1}},"line":1}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":12},"end":{"line":4,"column":61}},"type":"binary-expr","locations":[{"start":{"line":4,"column":12},"end":{"line":4,"column":32}},{"start":{"line":4,"column":36},"end":{"line":4,"column":61}}],"line":4}},"s":{"0":5,"1":5,"2":1},"f":{"0":5},"b":{"0":[5,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"2368abc73a79c4e684e1b6419f458952d2bf6967"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\kissmetrics\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\kissmetrics\\config.js","statementMap":{"0":{"start":{"line":1,"column":23},"end":{"line":1,"column":54}},"1":{"start":{"line":2,"column":26},"end":{"line":2,"column":57}},"2":{"start":{"line":3,"column":23},"end":{"line":3,"column":54}},"3":{"start":{"line":5,"column":17},"end":{"line":9,"column":1}},"4":{"start":{"line":11,"column":0},"end":{"line":13,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"94fef9eb6d3c7411842aa3005fa3efa74e1e5e90"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\kissmetrics\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\kissmetrics\\transform.js","statementMap":{"0":{"start":{"line":9,"column":11},"end":{"line":9,"column":24}},"1":{"start":{"line":10,"column":15},"end":{"line":10,"column":41}},"2":{"start":{"line":11,"column":13},"end":{"line":11,"column":38}},"3":{"start":{"line":12,"column":22},"end":{"line":12,"column":51}},"4":{"start":{"line":20,"column":4},"end":{"line":20,"column":25}},"5":{"start":{"line":21,"column":21},"end":{"line":21,"column":40}},"6":{"start":{"line":22,"column":15},"end":{"line":22,"column":41}},"7":{"start":{"line":26,"column":2},"end":{"line":26,"column":24}},"8":{"start":{"line":27,"column":2},"end":{"line":27,"column":48}},"9":{"start":{"line":32,"column":2},"end":{"line":32,"column":20}},"10":{"start":{"line":34,"column":20},"end":{"line":34,"column":41}},"11":{"start":{"line":35,"column":21},"end":{"line":35,"column":25}},"12":{"start":{"line":36,"column":21},"end":{"line":36,"column":22}},"13":{"start":{"line":37,"column":17},"end":{"line":37,"column":19}},"14":{"start":{"line":40,"column":4},"end":{"line":68,"column":5}},"15":{"start":{"line":41,"column":6},"end":{"line":67,"column":7}},"16":{"start":{"line":42,"column":22},"end":{"line":42,"column":33}},"17":{"start":{"line":43,"column":24},"end":{"line":43,"column":52}},"18":{"start":{"line":44,"column":21},"end":{"line":44,"column":58}},"19":{"start":{"line":46,"column":10},"end":{"line":46,"column":65}},"20":{"start":{"line":47,"column":20},"end":{"line":47,"column":22}},"21":{"start":{"line":49,"column":23},"end":{"line":49,"column":58}},"22":{"start":{"line":51,"column":8},"end":{"line":53,"column":9}},"23":{"start":{"line":52,"column":10},"end":{"line":52,"column":38}},"24":{"start":{"line":55,"column":8},"end":{"line":59,"column":9}},"25":{"start":{"line":56,"column":10},"end":{"line":58,"column":11}},"26":{"start":{"line":57,"column":12},"end":{"line":57,"column":27}},"27":{"start":{"line":61,"column":8},"end":{"line":64,"column":9}},"28":{"start":{"line":62,"column":10},"end":{"line":62,"column":25}},"29":{"start":{"line":63,"column":10},"end":{"line":63,"column":37}},"30":{"start":{"line":66,"column":8},"end":{"line":66,"column":31}},"31":{"start":{"line":71,"column":2},"end":{"line":71,"column":15}},"32":{"start":{"line":73,"column":2},"end":{"line":73,"column":16}},"33":{"start":{"line":78,"column":12},"end":{"line":78,"column":14}},"34":{"start":{"line":80,"column":2},"end":{"line":126,"column":3}},"35":{"start":{"line":81,"column":4},"end":{"line":125,"column":5}},"36":{"start":{"line":82,"column":20},"end":{"line":82,"column":26}},"37":{"start":{"line":83,"column":6},"end":{"line":83,"column":67}},"38":{"start":{"line":83,"column":58},"end":{"line":83,"column":67}},"39":{"start":{"line":86,"column":6},"end":{"line":89,"column":7}},"40":{"start":{"line":87,"column":8},"end":{"line":87,"column":40}},"41":{"start":{"line":88,"column":8},"end":{"line":88,"column":17}},"42":{"start":{"line":92,"column":6},"end":{"line":95,"column":7}},"43":{"start":{"line":93,"column":8},"end":{"line":93,"column":23}},"44":{"start":{"line":94,"column":8},"end":{"line":94,"column":17}},"45":{"start":{"line":98,"column":6},"end":{"line":101,"column":7}},"46":{"start":{"line":99,"column":8},"end":{"line":99,"column":23}},"47":{"start":{"line":100,"column":8},"end":{"line":100,"column":17}},"48":{"start":{"line":105,"column":6},"end":{"line":108,"column":7}},"49":{"start":{"line":106,"column":8},"end":{"line":106,"column":34}},"50":{"start":{"line":107,"column":8},"end":{"line":107,"column":17}},"51":{"start":{"line":112,"column":24},"end":{"line":112,"column":26}},"52":{"start":{"line":113,"column":6},"end":{"line":113,"column":27}},"53":{"start":{"line":114,"column":27},"end":{"line":114,"column":61}},"54":{"start":{"line":117,"column":6},"end":{"line":121,"column":7}},"55":{"start":{"line":118,"column":8},"end":{"line":120,"column":9}},"56":{"start":{"line":119,"column":10},"end":{"line":119,"column":59}},"57":{"start":{"line":123,"column":6},"end":{"line":123,"column":38}},"58":{"start":{"line":124,"column":6},"end":{"line":124,"column":20}},"59":{"start":{"line":127,"column":2},"end":{"line":127,"column":13}},"60":{"start":{"line":132,"column":19},"end":{"line":132,"column":21}},"61":{"start":{"line":133,"column":2},"end":{"line":142,"column":5}},"62":{"start":{"line":134,"column":4},"end":{"line":141,"column":5}},"63":{"start":{"line":135,"column":6},"end":{"line":135,"column":26}},"64":{"start":{"line":136,"column":11},"end":{"line":141,"column":5}},"65":{"start":{"line":137,"column":6},"end":{"line":137,"column":42}},"66":{"start":{"line":138,"column":6},"end":{"line":138,"column":39}},"67":{"start":{"line":140,"column":6},"end":{"line":140,"column":40}},"68":{"start":{"line":143,"column":2},"end":{"line":143,"column":18}},"69":{"start":{"line":147,"column":2},"end":{"line":147,"column":19}},"70":{"start":{"line":147,"column":12},"end":{"line":147,"column":19}},"71":{"start":{"line":148,"column":2},"end":{"line":150,"column":3}},"72":{"start":{"line":149,"column":4},"end":{"line":149,"column":15}},"73":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"74":{"start":{"line":152,"column":4},"end":{"line":152,"column":11}},"75":{"start":{"line":155,"column":2},"end":{"line":155,"column":31}},"76":{"start":{"line":156,"column":2},"end":{"line":156,"column":24}},"77":{"start":{"line":158,"column":2},"end":{"line":160,"column":3}},"78":{"start":{"line":159,"column":4},"end":{"line":159,"column":15}},"79":{"start":{"line":164,"column":20},"end":{"line":164,"column":30}},"80":{"start":{"line":165,"column":31},"end":{"line":165,"column":96}},"81":{"start":{"line":168,"column":2},"end":{"line":170,"column":3}},"82":{"start":{"line":169,"column":4},"end":{"line":169,"column":31}},"83":{"start":{"line":172,"column":2},"end":{"line":172,"column":30}},"84":{"start":{"line":176,"column":19},"end":{"line":176,"column":41}},"85":{"start":{"line":177,"column":2},"end":{"line":177,"column":31}},"86":{"start":{"line":178,"column":2},"end":{"line":178,"column":58}},"87":{"start":{"line":179,"column":2},"end":{"line":179,"column":74}},"88":{"start":{"line":180,"column":2},"end":{"line":182,"column":4}},"89":{"start":{"line":183,"column":2},"end":{"line":183,"column":18}},"90":{"start":{"line":204,"column":21},"end":{"line":204,"column":39}},"91":{"start":{"line":205,"column":19},"end":{"line":207,"column":3}},"92":{"start":{"line":208,"column":20},"end":{"line":208,"column":62}},"93":{"start":{"line":209,"column":19},"end":{"line":209,"column":36}},"94":{"start":{"line":211,"column":2},"end":{"line":211,"column":33}},"95":{"start":{"line":214,"column":2},"end":{"line":214,"column":25}},"96":{"start":{"line":215,"column":2},"end":{"line":215,"column":72}},"97":{"start":{"line":216,"column":2},"end":{"line":216,"column":28}},"98":{"start":{"line":217,"column":2},"end":{"line":217,"column":20}},"99":{"start":{"line":219,"column":2},"end":{"line":219,"column":54}},"100":{"start":{"line":223,"column":21},"end":{"line":223,"column":39}},"101":{"start":{"line":224,"column":20},"end":{"line":224,"column":27}},"102":{"start":{"line":225,"column":22},"end":{"line":225,"column":48}},"103":{"start":{"line":226,"column":19},"end":{"line":226,"column":21}},"104":{"start":{"line":227,"column":2},"end":{"line":229,"column":3}},"105":{"start":{"line":228,"column":4},"end":{"line":228,"column":64}},"106":{"start":{"line":232,"column":20},"end":{"line":232,"column":62}},"107":{"start":{"line":233,"column":17},"end":{"line":233,"column":31}},"108":{"start":{"line":235,"column":18},"end":{"line":235,"column":40}},"109":{"start":{"line":236,"column":2},"end":{"line":238,"column":3}},"110":{"start":{"line":237,"column":4},"end":{"line":237,"column":33}},"111":{"start":{"line":240,"column":23},"end":{"line":240,"column":33}},"112":{"start":{"line":241,"column":2},"end":{"line":243,"column":3}},"113":{"start":{"line":242,"column":4},"end":{"line":242,"column":31}},"114":{"start":{"line":245,"column":2},"end":{"line":245,"column":33}},"115":{"start":{"line":247,"column":2},"end":{"line":254,"column":3}},"116":{"start":{"line":248,"column":4},"end":{"line":250,"column":5}},"117":{"start":{"line":249,"column":6},"end":{"line":249,"column":45}},"118":{"start":{"line":251,"column":4},"end":{"line":253,"column":5}},"119":{"start":{"line":252,"column":6},"end":{"line":252,"column":46}},"120":{"start":{"line":255,"column":2},"end":{"line":255,"column":25}},"121":{"start":{"line":256,"column":2},"end":{"line":256,"column":72}},"122":{"start":{"line":257,"column":2},"end":{"line":257,"column":24}},"123":{"start":{"line":258,"column":2},"end":{"line":258,"column":28}},"124":{"start":{"line":259,"column":2},"end":{"line":259,"column":20}},"125":{"start":{"line":261,"column":20},"end":{"line":261,"column":22}},"126":{"start":{"line":262,"column":2},"end":{"line":262,"column":63}},"127":{"start":{"line":263,"column":2},"end":{"line":273,"column":3}},"128":{"start":{"line":264,"column":4},"end":{"line":272,"column":7}},"129":{"start":{"line":265,"column":17},"end":{"line":265,"column":24}},"130":{"start":{"line":266,"column":6},"end":{"line":266,"column":74}},"131":{"start":{"line":266,"column":47},"end":{"line":266,"column":74}},"132":{"start":{"line":267,"column":6},"end":{"line":267,"column":23}},"133":{"start":{"line":268,"column":6},"end":{"line":268,"column":70}},"134":{"start":{"line":270,"column":6},"end":{"line":270,"column":35}},"135":{"start":{"line":271,"column":6},"end":{"line":271,"column":61}},"136":{"start":{"line":274,"column":2},"end":{"line":274,"column":19}},"137":{"start":{"line":278,"column":19},"end":{"line":278,"column":31}},"138":{"start":{"line":279,"column":23},"end":{"line":281,"column":15}},"139":{"start":{"line":283,"column":18},"end":{"line":283,"column":33}},"140":{"start":{"line":285,"column":2},"end":{"line":287,"column":3}},"141":{"start":{"line":286,"column":4},"end":{"line":286,"column":42}},"142":{"start":{"line":289,"column":2},"end":{"line":291,"column":3}},"143":{"start":{"line":290,"column":4},"end":{"line":290,"column":58}},"144":{"start":{"line":293,"column":2},"end":{"line":293,"column":28}},"145":{"start":{"line":295,"column":2},"end":{"line":295,"column":47}},"146":{"start":{"line":299,"column":21},"end":{"line":299,"column":33}},"147":{"start":{"line":300,"column":25},"end":{"line":302,"column":15}},"148":{"start":{"line":304,"column":18},"end":{"line":304,"column":35}},"149":{"start":{"line":306,"column":2},"end":{"line":308,"column":3}},"150":{"start":{"line":307,"column":4},"end":{"line":307,"column":46}},"151":{"start":{"line":310,"column":2},"end":{"line":312,"column":3}},"152":{"start":{"line":311,"column":4},"end":{"line":311,"column":62}},"153":{"start":{"line":314,"column":2},"end":{"line":314,"column":28}},"154":{"start":{"line":316,"column":2},"end":{"line":316,"column":47}},"155":{"start":{"line":320,"column":25},"end":{"line":320,"column":32}},"156":{"start":{"line":321,"column":21},"end":{"line":321,"column":28}},"157":{"start":{"line":322,"column":21},"end":{"line":322,"column":39}},"158":{"start":{"line":323,"column":19},"end":{"line":323,"column":33}},"159":{"start":{"line":325,"column":21},"end":{"line":325,"column":23}},"160":{"start":{"line":326,"column":2},"end":{"line":326,"column":25}},"161":{"start":{"line":327,"column":2},"end":{"line":327,"column":29}},"162":{"start":{"line":328,"column":2},"end":{"line":328,"column":25}},"163":{"start":{"line":329,"column":2},"end":{"line":329,"column":54}},"164":{"start":{"line":333,"column":19},"end":{"line":333,"column":21}},"165":{"start":{"line":336,"column":35},"end":{"line":336,"column":40}},"166":{"start":{"line":337,"column":22},"end":{"line":337,"column":48}},"167":{"start":{"line":339,"column":2},"end":{"line":370,"column":3}},"168":{"start":{"line":341,"column":6},"end":{"line":341,"column":51}},"169":{"start":{"line":342,"column":6},"end":{"line":342,"column":32}},"170":{"start":{"line":343,"column":6},"end":{"line":343,"column":30}},"171":{"start":{"line":344,"column":6},"end":{"line":344,"column":12}},"172":{"start":{"line":346,"column":6},"end":{"line":346,"column":53}},"173":{"start":{"line":347,"column":6},"end":{"line":347,"column":32}},"174":{"start":{"line":348,"column":6},"end":{"line":348,"column":30}},"175":{"start":{"line":349,"column":6},"end":{"line":349,"column":12}},"176":{"start":{"line":351,"column":6},"end":{"line":351,"column":53}},"177":{"start":{"line":352,"column":6},"end":{"line":355,"column":9}},"178":{"start":{"line":353,"column":8},"end":{"line":353,"column":33}},"179":{"start":{"line":354,"column":8},"end":{"line":354,"column":31}},"180":{"start":{"line":356,"column":6},"end":{"line":356,"column":12}},"181":{"start":{"line":358,"column":6},"end":{"line":358,"column":55}},"182":{"start":{"line":359,"column":6},"end":{"line":359,"column":32}},"183":{"start":{"line":360,"column":6},"end":{"line":360,"column":30}},"184":{"start":{"line":361,"column":6},"end":{"line":361,"column":12}},"185":{"start":{"line":363,"column":6},"end":{"line":363,"column":52}},"186":{"start":{"line":364,"column":6},"end":{"line":364,"column":32}},"187":{"start":{"line":365,"column":6},"end":{"line":365,"column":30}},"188":{"start":{"line":366,"column":6},"end":{"line":366,"column":12}},"189":{"start":{"line":368,"column":6},"end":{"line":368,"column":49}},"190":{"start":{"line":369,"column":6},"end":{"line":369,"column":63}},"191":{"start":{"line":371,"column":2},"end":{"line":371,"column":18}},"192":{"start":{"line":374,"column":26},"end":{"line":411,"column":1}},"193":{"start":{"line":375,"column":2},"end":{"line":378,"column":3}},"194":{"start":{"line":376,"column":23},"end":{"line":376,"column":75}},"195":{"start":{"line":377,"column":4},"end":{"line":377,"column":24}},"196":{"start":{"line":380,"column":19},"end":{"line":409,"column":3}},"197":{"start":{"line":382,"column":6},"end":{"line":407,"column":7}},"198":{"start":{"line":383,"column":8},"end":{"line":390,"column":9}},"199":{"start":{"line":385,"column":10},"end":{"line":389,"column":12}},"200":{"start":{"line":392,"column":8},"end":{"line":396,"column":10}},"201":{"start":{"line":398,"column":8},"end":{"line":406,"column":10}},"202":{"start":{"line":410,"column":2},"end":{"line":410,"column":18}},"203":{"start":{"line":413,"column":0},"end":{"line":413,"column":48}}},"fnMap":{"0":{"name":"toUnixTimestamp","decl":{"start":{"line":25,"column":9},"end":{"line":25,"column":24}},"loc":{"start":{"line":25,"column":31},"end":{"line":28,"column":1}},"line":25},"1":{"name":"flatten","decl":{"start":{"line":31,"column":9},"end":{"line":31,"column":16}},"loc":{"start":{"line":31,"column":31},"end":{"line":74,"column":1}},"line":31},"2":{"name":"step","decl":{"start":{"line":39,"column":11},"end":{"line":39,"column":15}},"loc":{"start":{"line":39,"column":30},"end":{"line":69,"column":3}},"line":39},"3":{"name":"clean","decl":{"start":{"line":77,"column":9},"end":{"line":77,"column":14}},"loc":{"start":{"line":77,"column":20},"end":{"line":128,"column":1}},"line":77},"4":{"name":"prefix","decl":{"start":{"line":131,"column":9},"end":{"line":131,"column":15}},"loc":{"start":{"line":131,"column":35},"end":{"line":144,"column":1}},"line":131},"5":{"name":"(anonymous_5)","decl":{"start":{"line":133,"column":19},"end":{"line":133,"column":20}},"loc":{"start":{"line":133,"column":38},"end":{"line":142,"column":3}},"line":133},"6":{"name":"getCurrency","decl":{"start":{"line":146,"column":9},"end":{"line":146,"column":20}},"loc":{"start":{"line":146,"column":26},"end":{"line":161,"column":1}},"line":146},"7":{"name":"getRevenue","decl":{"start":{"line":163,"column":9},"end":{"line":163,"column":19}},"loc":{"start":{"line":163,"column":43},"end":{"line":173,"column":1}},"line":163},"8":{"name":"buildResponse","decl":{"start":{"line":175,"column":9},"end":{"line":175,"column":22}},"loc":{"start":{"line":175,"column":54},"end":{"line":184,"column":1}},"line":175},"9":{"name":"processIdentify","decl":{"start":{"line":203,"column":9},"end":{"line":203,"column":24}},"loc":{"start":{"line":203,"column":47},"end":{"line":220,"column":1}},"line":203},"10":{"name":"processTrack","decl":{"start":{"line":222,"column":9},"end":{"line":222,"column":21}},"loc":{"start":{"line":222,"column":44},"end":{"line":275,"column":1}},"line":222},"11":{"name":"(anonymous_11)","decl":{"start":{"line":264,"column":21},"end":{"line":264,"column":22}},"loc":{"start":{"line":264,"column":32},"end":{"line":272,"column":5}},"line":264},"12":{"name":"processPage","decl":{"start":{"line":277,"column":9},"end":{"line":277,"column":20}},"loc":{"start":{"line":277,"column":43},"end":{"line":296,"column":1}},"line":277},"13":{"name":"processScreen","decl":{"start":{"line":298,"column":9},"end":{"line":298,"column":22}},"loc":{"start":{"line":298,"column":45},"end":{"line":317,"column":1}},"line":298},"14":{"name":"processAlias","decl":{"start":{"line":319,"column":9},"end":{"line":319,"column":21}},"loc":{"start":{"line":319,"column":44},"end":{"line":330,"column":1}},"line":319},"15":{"name":"process","decl":{"start":{"line":332,"column":9},"end":{"line":332,"column":16}},"loc":{"start":{"line":332,"column":24},"end":{"line":372,"column":1}},"line":332},"16":{"name":"(anonymous_16)","decl":{"start":{"line":352,"column":24},"end":{"line":352,"column":25}},"loc":{"start":{"line":352,"column":35},"end":{"line":355,"column":7}},"line":352},"17":{"name":"(anonymous_17)","decl":{"start":{"line":374,"column":26},"end":{"line":374,"column":27}},"loc":{"start":{"line":374,"column":42},"end":{"line":411,"column":1}},"line":374},"18":{"name":"(anonymous_18)","decl":{"start":{"line":381,"column":15},"end":{"line":381,"column":16}},"loc":{"start":{"line":381,"column":30},"end":{"line":408,"column":5}},"line":381}},"branchMap":{"0":{"loc":{"start":{"line":32,"column":9},"end":{"line":32,"column":19}},"type":"binary-expr","locations":[{"start":{"line":32,"column":9},"end":{"line":32,"column":13}},{"start":{"line":32,"column":17},"end":{"line":32,"column":19}}],"line":32},"1":{"loc":{"start":{"line":34,"column":20},"end":{"line":34,"column":41}},"type":"binary-expr","locations":[{"start":{"line":34,"column":20},"end":{"line":34,"column":34}},{"start":{"line":34,"column":38},"end":{"line":34,"column":41}}],"line":34},"2":{"loc":{"start":{"line":41,"column":6},"end":{"line":67,"column":7}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":67,"column":7}},{"start":{"line":41,"column":6},"end":{"line":67,"column":7}}],"line":41},"3":{"loc":{"start":{"line":43,"column":24},"end":{"line":43,"column":52}},"type":"binary-expr","locations":[{"start":{"line":43,"column":24},"end":{"line":43,"column":33}},{"start":{"line":43,"column":37},"end":{"line":43,"column":52}}],"line":43},"4":{"loc":{"start":{"line":46,"column":10},"end":{"line":46,"column":65}},"type":"binary-expr","locations":[{"start":{"line":46,"column":10},"end":{"line":46,"column":36}},{"start":{"line":46,"column":40},"end":{"line":46,"column":65}}],"line":46},"5":{"loc":{"start":{"line":49,"column":23},"end":{"line":49,"column":58}},"type":"cond-expr","locations":[{"start":{"line":49,"column":30},"end":{"line":49,"column":52}},{"start":{"line":49,"column":55},"end":{"line":49,"column":58}}],"line":49},"6":{"loc":{"start":{"line":51,"column":8},"end":{"line":53,"column":9}},"type":"if","locations":[{"start":{"line":51,"column":8},"end":{"line":53,"column":9}},{"start":{"line":51,"column":8},"end":{"line":53,"column":9}}],"line":51},"7":{"loc":{"start":{"line":56,"column":10},"end":{"line":58,"column":11}},"type":"if","locations":[{"start":{"line":56,"column":10},"end":{"line":58,"column":11}},{"start":{"line":56,"column":10},"end":{"line":58,"column":11}}],"line":56},"8":{"loc":{"start":{"line":61,"column":8},"end":{"line":64,"column":9}},"type":"if","locations":[{"start":{"line":61,"column":8},"end":{"line":64,"column":9}},{"start":{"line":61,"column":8},"end":{"line":64,"column":9}}],"line":61},"9":{"loc":{"start":{"line":61,"column":12},"end":{"line":61,"column":73}},"type":"binary-expr","locations":[{"start":{"line":61,"column":12},"end":{"line":61,"column":20}},{"start":{"line":61,"column":24},"end":{"line":61,"column":32}},{"start":{"line":61,"column":36},"end":{"line":61,"column":46}},{"start":{"line":61,"column":50},"end":{"line":61,"column":73}}],"line":61},"10":{"loc":{"start":{"line":81,"column":4},"end":{"line":125,"column":5}},"type":"if","locations":[{"start":{"line":81,"column":4},"end":{"line":125,"column":5}},{"start":{"line":81,"column":4},"end":{"line":125,"column":5}}],"line":81},"11":{"loc":{"start":{"line":83,"column":6},"end":{"line":83,"column":67}},"type":"if","locations":[{"start":{"line":83,"column":6},"end":{"line":83,"column":67}},{"start":{"line":83,"column":6},"end":{"line":83,"column":67}}],"line":83},"12":{"loc":{"start":{"line":83,"column":10},"end":{"line":83,"column":56}},"type":"binary-expr","locations":[{"start":{"line":83,"column":10},"end":{"line":83,"column":24}},{"start":{"line":83,"column":28},"end":{"line":83,"column":56}}],"line":83},"13":{"loc":{"start":{"line":86,"column":6},"end":{"line":89,"column":7}},"type":"if","locations":[{"start":{"line":86,"column":6},"end":{"line":89,"column":7}},{"start":{"line":86,"column":6},"end":{"line":89,"column":7}}],"line":86},"14":{"loc":{"start":{"line":92,"column":6},"end":{"line":95,"column":7}},"type":"if","locations":[{"start":{"line":92,"column":6},"end":{"line":95,"column":7}},{"start":{"line":92,"column":6},"end":{"line":95,"column":7}}],"line":92},"15":{"loc":{"start":{"line":98,"column":6},"end":{"line":101,"column":7}},"type":"if","locations":[{"start":{"line":98,"column":6},"end":{"line":101,"column":7}},{"start":{"line":98,"column":6},"end":{"line":101,"column":7}}],"line":98},"16":{"loc":{"start":{"line":105,"column":6},"end":{"line":108,"column":7}},"type":"if","locations":[{"start":{"line":105,"column":6},"end":{"line":108,"column":7}},{"start":{"line":105,"column":6},"end":{"line":108,"column":7}}],"line":105},"17":{"loc":{"start":{"line":118,"column":8},"end":{"line":120,"column":9}},"type":"if","locations":[{"start":{"line":118,"column":8},"end":{"line":120,"column":9}},{"start":{"line":118,"column":8},"end":{"line":120,"column":9}}],"line":118},"18":{"loc":{"start":{"line":134,"column":4},"end":{"line":141,"column":5}},"type":"if","locations":[{"start":{"line":134,"column":4},"end":{"line":141,"column":5}},{"start":{"line":134,"column":4},"end":{"line":141,"column":5}}],"line":134},"19":{"loc":{"start":{"line":136,"column":11},"end":{"line":141,"column":5}},"type":"if","locations":[{"start":{"line":136,"column":11},"end":{"line":141,"column":5}},{"start":{"line":136,"column":11},"end":{"line":141,"column":5}}],"line":136},"20":{"loc":{"start":{"line":147,"column":2},"end":{"line":147,"column":19}},"type":"if","locations":[{"start":{"line":147,"column":2},"end":{"line":147,"column":19}},{"start":{"line":147,"column":2},"end":{"line":147,"column":19}}],"line":147},"21":{"loc":{"start":{"line":148,"column":2},"end":{"line":150,"column":3}},"type":"if","locations":[{"start":{"line":148,"column":2},"end":{"line":150,"column":3}},{"start":{"line":148,"column":2},"end":{"line":150,"column":3}}],"line":148},"22":{"loc":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},{"start":{"line":151,"column":2},"end":{"line":153,"column":3}}],"line":151},"23":{"loc":{"start":{"line":158,"column":2},"end":{"line":160,"column":3}},"type":"if","locations":[{"start":{"line":158,"column":2},"end":{"line":160,"column":3}},{"start":{"line":158,"column":2},"end":{"line":160,"column":3}}],"line":158},"24":{"loc":{"start":{"line":168,"column":2},"end":{"line":170,"column":3}},"type":"if","locations":[{"start":{"line":168,"column":2},"end":{"line":170,"column":3}},{"start":{"line":168,"column":2},"end":{"line":170,"column":3}}],"line":168},"25":{"loc":{"start":{"line":168,"column":6},"end":{"line":168,"column":68}},"type":"binary-expr","locations":[{"start":{"line":168,"column":6},"end":{"line":168,"column":14}},{"start":{"line":168,"column":18},"end":{"line":168,"column":27}},{"start":{"line":168,"column":31},"end":{"line":168,"column":68}}],"line":168},"26":{"loc":{"start":{"line":179,"column":20},"end":{"line":179,"column":73}},"type":"cond-expr","locations":[{"start":{"line":179,"column":37},"end":{"line":179,"column":51}},{"start":{"line":179,"column":54},"end":{"line":179,"column":73}}],"line":179},"27":{"loc":{"start":{"line":206,"column":19},"end":{"line":206,"column":68}},"type":"binary-expr","locations":[{"start":{"line":206,"column":19},"end":{"line":206,"column":62}},{"start":{"line":206,"column":66},"end":{"line":206,"column":68}}],"line":206},"28":{"loc":{"start":{"line":215,"column":18},"end":{"line":215,"column":71}},"type":"cond-expr","locations":[{"start":{"line":215,"column":35},"end":{"line":215,"column":49}},{"start":{"line":215,"column":52},"end":{"line":215,"column":71}}],"line":215},"29":{"loc":{"start":{"line":227,"column":2},"end":{"line":229,"column":3}},"type":"if","locations":[{"start":{"line":227,"column":2},"end":{"line":229,"column":3}},{"start":{"line":227,"column":2},"end":{"line":229,"column":3}}],"line":227},"30":{"loc":{"start":{"line":236,"column":2},"end":{"line":238,"column":3}},"type":"if","locations":[{"start":{"line":236,"column":2},"end":{"line":238,"column":3}},{"start":{"line":236,"column":2},"end":{"line":238,"column":3}}],"line":236},"31":{"loc":{"start":{"line":241,"column":2},"end":{"line":243,"column":3}},"type":"if","locations":[{"start":{"line":241,"column":2},"end":{"line":243,"column":3}},{"start":{"line":241,"column":2},"end":{"line":243,"column":3}}],"line":241},"32":{"loc":{"start":{"line":247,"column":2},"end":{"line":254,"column":3}},"type":"if","locations":[{"start":{"line":247,"column":2},"end":{"line":254,"column":3}},{"start":{"line":247,"column":2},"end":{"line":254,"column":3}}],"line":247},"33":{"loc":{"start":{"line":248,"column":4},"end":{"line":250,"column":5}},"type":"if","locations":[{"start":{"line":248,"column":4},"end":{"line":250,"column":5}},{"start":{"line":248,"column":4},"end":{"line":250,"column":5}}],"line":248},"34":{"loc":{"start":{"line":251,"column":4},"end":{"line":253,"column":5}},"type":"if","locations":[{"start":{"line":251,"column":4},"end":{"line":253,"column":5}},{"start":{"line":251,"column":4},"end":{"line":253,"column":5}}],"line":251},"35":{"loc":{"start":{"line":256,"column":18},"end":{"line":256,"column":71}},"type":"cond-expr","locations":[{"start":{"line":256,"column":35},"end":{"line":256,"column":49}},{"start":{"line":256,"column":52},"end":{"line":256,"column":71}}],"line":256},"36":{"loc":{"start":{"line":263,"column":2},"end":{"line":273,"column":3}},"type":"if","locations":[{"start":{"line":263,"column":2},"end":{"line":273,"column":3}},{"start":{"line":263,"column":2},"end":{"line":273,"column":3}}],"line":263},"37":{"loc":{"start":{"line":266,"column":6},"end":{"line":266,"column":74}},"type":"if","locations":[{"start":{"line":266,"column":6},"end":{"line":266,"column":74}},{"start":{"line":266,"column":6},"end":{"line":266,"column":74}}],"line":266},"38":{"loc":{"start":{"line":268,"column":16},"end":{"line":268,"column":69}},"type":"cond-expr","locations":[{"start":{"line":268,"column":33},"end":{"line":268,"column":47}},{"start":{"line":268,"column":50},"end":{"line":268,"column":69}}],"line":268},"39":{"loc":{"start":{"line":279,"column":23},"end":{"line":281,"column":15}},"type":"cond-expr","locations":[{"start":{"line":280,"column":6},"end":{"line":280,"column":33}},{"start":{"line":281,"column":6},"end":{"line":281,"column":15}}],"line":279},"40":{"loc":{"start":{"line":285,"column":2},"end":{"line":287,"column":3}},"type":"if","locations":[{"start":{"line":285,"column":2},"end":{"line":287,"column":3}},{"start":{"line":285,"column":2},"end":{"line":287,"column":3}}],"line":285},"41":{"loc":{"start":{"line":289,"column":2},"end":{"line":291,"column":3}},"type":"if","locations":[{"start":{"line":289,"column":2},"end":{"line":291,"column":3}},{"start":{"line":289,"column":2},"end":{"line":291,"column":3}}],"line":289},"42":{"loc":{"start":{"line":289,"column":6},"end":{"line":289,"column":30}},"type":"binary-expr","locations":[{"start":{"line":289,"column":6},"end":{"line":289,"column":18}},{"start":{"line":289,"column":22},"end":{"line":289,"column":30}}],"line":289},"43":{"loc":{"start":{"line":300,"column":25},"end":{"line":302,"column":15}},"type":"cond-expr","locations":[{"start":{"line":301,"column":6},"end":{"line":301,"column":33}},{"start":{"line":302,"column":6},"end":{"line":302,"column":15}}],"line":300},"44":{"loc":{"start":{"line":306,"column":2},"end":{"line":308,"column":3}},"type":"if","locations":[{"start":{"line":306,"column":2},"end":{"line":308,"column":3}},{"start":{"line":306,"column":2},"end":{"line":308,"column":3}}],"line":306},"45":{"loc":{"start":{"line":310,"column":2},"end":{"line":312,"column":3}},"type":"if","locations":[{"start":{"line":310,"column":2},"end":{"line":312,"column":3}},{"start":{"line":310,"column":2},"end":{"line":312,"column":3}}],"line":310},"46":{"loc":{"start":{"line":310,"column":6},"end":{"line":310,"column":34}},"type":"binary-expr","locations":[{"start":{"line":310,"column":6},"end":{"line":310,"column":20}},{"start":{"line":310,"column":24},"end":{"line":310,"column":34}}],"line":310},"47":{"loc":{"start":{"line":339,"column":2},"end":{"line":370,"column":3}},"type":"switch","locations":[{"start":{"line":340,"column":4},"end":{"line":344,"column":12}},{"start":{"line":345,"column":4},"end":{"line":349,"column":12}},{"start":{"line":350,"column":4},"end":{"line":356,"column":12}},{"start":{"line":357,"column":4},"end":{"line":361,"column":12}},{"start":{"line":362,"column":4},"end":{"line":366,"column":12}},{"start":{"line":367,"column":4},"end":{"line":369,"column":63}}],"line":339},"48":{"loc":{"start":{"line":375,"column":2},"end":{"line":378,"column":3}},"type":"if","locations":[{"start":{"line":375,"column":2},"end":{"line":378,"column":3}},{"start":{"line":375,"column":2},"end":{"line":378,"column":3}}],"line":375},"49":{"loc":{"start":{"line":375,"column":6},"end":{"line":375,"column":50}},"type":"binary-expr","locations":[{"start":{"line":375,"column":6},"end":{"line":375,"column":28}},{"start":{"line":375,"column":32},"end":{"line":375,"column":50}}],"line":375},"50":{"loc":{"start":{"line":383,"column":8},"end":{"line":390,"column":9}},"type":"if","locations":[{"start":{"line":383,"column":8},"end":{"line":390,"column":9}},{"start":{"line":383,"column":8},"end":{"line":390,"column":9}}],"line":383},"51":{"loc":{"start":{"line":400,"column":10},"end":{"line":404,"column":17}},"type":"cond-expr","locations":[{"start":{"line":401,"column":14},"end":{"line":401,"column":35}},{"start":{"line":402,"column":14},"end":{"line":404,"column":17}}],"line":400},"52":{"loc":{"start":{"line":402,"column":14},"end":{"line":404,"column":17}},"type":"cond-expr","locations":[{"start":{"line":403,"column":14},"end":{"line":403,"column":24}},{"start":{"line":404,"column":14},"end":{"line":404,"column":17}}],"line":402},"53":{"loc":{"start":{"line":405,"column":10},"end":{"line":405,"column":69}},"type":"binary-expr","locations":[{"start":{"line":405,"column":10},"end":{"line":405,"column":23}},{"start":{"line":405,"column":27},"end":{"line":405,"column":69}}],"line":405}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":7,"8":7,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":7,"34":7,"35":35,"36":35,"37":35,"38":0,"39":35,"40":0,"41":0,"42":35,"43":0,"44":0,"45":35,"46":7,"47":7,"48":28,"49":28,"50":28,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":7,"60":6,"61":6,"62":37,"63":0,"64":37,"65":2,"66":2,"67":35,"68":6,"69":4,"70":2,"71":2,"72":2,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":4,"80":4,"81":4,"82":0,"83":4,"84":10,"85":10,"86":10,"87":10,"88":10,"89":10,"90":3,"91":3,"92":3,"93":3,"94":3,"95":3,"96":3,"97":3,"98":3,"99":3,"100":4,"101":4,"102":4,"103":4,"104":4,"105":4,"106":4,"107":4,"108":4,"109":4,"110":2,"111":4,"112":4,"113":1,"114":4,"115":4,"116":4,"117":2,"118":4,"119":2,"120":4,"121":4,"122":4,"123":4,"124":4,"125":4,"126":4,"127":4,"128":1,"129":2,"130":2,"131":2,"132":2,"133":2,"134":2,"135":2,"136":4,"137":2,"138":2,"139":2,"140":2,"141":0,"142":2,"143":0,"144":2,"145":2,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":8,"165":8,"166":8,"167":8,"168":2,"169":2,"170":2,"171":2,"172":0,"173":0,"174":0,"175":0,"176":2,"177":2,"178":4,"179":4,"180":2,"181":3,"182":3,"183":3,"184":3,"185":1,"186":1,"187":1,"188":1,"189":0,"190":0,"191":8,"192":1,"193":1,"194":0,"195":0,"196":1,"197":2,"198":2,"199":0,"200":2,"201":0,"202":1,"203":1},"f":{"0":7,"1":0,"2":0,"3":7,"4":6,"5":37,"6":4,"7":4,"8":10,"9":3,"10":4,"11":2,"12":2,"13":0,"14":1,"15":8,"16":4,"17":1,"18":2},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0,0,0],"10":[35,0],"11":[0,35],"12":[35,35],"13":[0,35],"14":[0,35],"15":[7,28],"16":[28,0],"17":[0,0],"18":[0,37],"19":[2,35],"20":[2,2],"21":[2,0],"22":[0,0],"23":[0,0],"24":[0,4],"25":[4,2,0],"26":[1,9],"27":[3,0],"28":[0,3],"29":[4,0],"30":[2,2],"31":[1,3],"32":[4,0],"33":[2,2],"34":[2,2],"35":[0,4],"36":[1,3],"37":[2,0],"38":[0,2],"39":[2,0],"40":[0,2],"41":[0,2],"42":[2,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0],"47":[2,0,2,3,1,0],"48":[0,1],"49":[1,1],"50":[0,2],"51":[0,0],"52":[0,0],"53":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"12a78aa7f9b06fd78fe77065f4d80380880d7d3c"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\klaviyo\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\klaviyo\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":22},"end":{"line":3,"column":45}},"2":{"start":{"line":8,"column":26},"end":{"line":17,"column":1}},"3":{"start":{"line":18,"column":26},"end":{"line":37,"column":1}},"4":{"start":{"line":39,"column":19},"end":{"line":44,"column":1}},"5":{"start":{"line":45,"column":25},"end":{"line":50,"column":1}},"6":{"start":{"line":51,"column":24},"end":{"line":55,"column":1}},"7":{"start":{"line":56,"column":18},"end":{"line":59,"column":1}},"8":{"start":{"line":61,"column":23},"end":{"line":61,"column":69}},"9":{"start":{"line":63,"column":0},"end":{"line":72,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a2b0b8206021d06e449e6b5bf1bdb538768c2e63"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\klaviyo\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\klaviyo\\transform.js","statementMap":{"0":{"start":{"line":4,"column":12},"end":{"line":4,"column":32}},"1":{"start":{"line":5,"column":14},"end":{"line":5,"column":30}},"2":{"start":{"line":6,"column":15},"end":{"line":6,"column":41}},"3":{"start":{"line":11,"column":4},"end":{"line":11,"column":33}},"4":{"start":{"line":21,"column":4},"end":{"line":21,"column":23}},"5":{"start":{"line":38,"column":4},"end":{"line":38,"column":25}},"6":{"start":{"line":43,"column":22},"end":{"line":92,"column":1}},"7":{"start":{"line":45,"column":18},"end":{"line":45,"column":77}},"8":{"start":{"line":46,"column":2},"end":{"line":51,"column":3}},"9":{"start":{"line":47,"column":4},"end":{"line":50,"column":8}},"10":{"start":{"line":52,"column":16},"end":{"line":56,"column":3}},"11":{"start":{"line":57,"column":2},"end":{"line":60,"column":3}},"12":{"start":{"line":58,"column":4},"end":{"line":58,"column":22}},"13":{"start":{"line":59,"column":4},"end":{"line":59,"column":62}},"14":{"start":{"line":62,"column":2},"end":{"line":73,"column":3}},"15":{"start":{"line":63,"column":4},"end":{"line":63,"column":39}},"16":{"start":{"line":66,"column":4},"end":{"line":66,"column":41}},"17":{"start":{"line":67,"column":4},"end":{"line":69,"column":38}},"18":{"start":{"line":70,"column":4},"end":{"line":72,"column":35}},"19":{"start":{"line":74,"column":2},"end":{"line":74,"column":43}},"20":{"start":{"line":76,"column":2},"end":{"line":91,"column":3}},"21":{"start":{"line":77,"column":4},"end":{"line":88,"column":6}},"22":{"start":{"line":90,"column":4},"end":{"line":90,"column":48}},"23":{"start":{"line":101,"column":31},"end":{"line":155,"column":1}},"24":{"start":{"line":103,"column":21},"end":{"line":103,"column":64}},"25":{"start":{"line":104,"column":2},"end":{"line":121,"column":3}},"26":{"start":{"line":108,"column":4},"end":{"line":108,"column":80}},"27":{"start":{"line":109,"column":4},"end":{"line":116,"column":5}},"28":{"start":{"line":110,"column":6},"end":{"line":115,"column":8}},"29":{"start":{"line":118,"column":4},"end":{"line":120,"column":6}},"30":{"start":{"line":123,"column":30},"end":{"line":123,"column":66}},"31":{"start":{"line":124,"column":2},"end":{"line":127,"column":3}},"32":{"start":{"line":125,"column":4},"end":{"line":125,"column":35}},"33":{"start":{"line":126,"column":4},"end":{"line":126,"column":37}},"34":{"start":{"line":129,"column":24},"end":{"line":132,"column":3}},"35":{"start":{"line":134,"column":2},"end":{"line":139,"column":4}},"36":{"start":{"line":140,"column":2},"end":{"line":140,"column":66}},"37":{"start":{"line":141,"column":2},"end":{"line":144,"column":3}},"38":{"start":{"line":142,"column":4},"end":{"line":142,"column":31}},"39":{"start":{"line":143,"column":4},"end":{"line":143,"column":70}},"40":{"start":{"line":146,"column":18},"end":{"line":149,"column":3}},"41":{"start":{"line":150,"column":22},"end":{"line":150,"column":77}},"42":{"start":{"line":151,"column":19},"end":{"line":151,"column":41}},"43":{"start":{"line":152,"column":2},"end":{"line":152,"column":79}},"44":{"start":{"line":153,"column":2},"end":{"line":153,"column":58}},"45":{"start":{"line":154,"column":2},"end":{"line":154,"column":18}},"46":{"start":{"line":163,"column":33},"end":{"line":177,"column":1}},"47":{"start":{"line":164,"column":27},"end":{"line":167,"column":3}},"48":{"start":{"line":169,"column":2},"end":{"line":174,"column":4}},"49":{"start":{"line":175,"column":2},"end":{"line":175,"column":72}},"50":{"start":{"line":176,"column":2},"end":{"line":176,"column":28}},"51":{"start":{"line":178,"column":28},"end":{"line":263,"column":1}},"52":{"start":{"line":179,"column":16},"end":{"line":179,"column":18}},"53":{"start":{"line":180,"column":14},"end":{"line":180,"column":35}},"54":{"start":{"line":181,"column":2},"end":{"line":181,"column":53}},"55":{"start":{"line":182,"column":2},"end":{"line":254,"column":3}},"56":{"start":{"line":183,"column":22},"end":{"line":183,"column":45}},"57":{"start":{"line":184,"column":4},"end":{"line":184,"column":30}},"58":{"start":{"line":185,"column":4},"end":{"line":185,"column":52}},"59":{"start":{"line":186,"column":21},"end":{"line":186,"column":47}},"60":{"start":{"line":188,"column":4},"end":{"line":188,"column":68}},"61":{"start":{"line":189,"column":4},"end":{"line":197,"column":5}},"62":{"start":{"line":193,"column":6},"end":{"line":196,"column":8}},"63":{"start":{"line":198,"column":18},"end":{"line":198,"column":45}},"64":{"start":{"line":199,"column":4},"end":{"line":202,"column":6}},"65":{"start":{"line":205,"column":4},"end":{"line":221,"column":5}},"66":{"start":{"line":206,"column":22},"end":{"line":206,"column":24}},"67":{"start":{"line":207,"column":6},"end":{"line":216,"column":9}},"68":{"start":{"line":208,"column":19},"end":{"line":211,"column":9}},"69":{"start":{"line":212,"column":8},"end":{"line":212,"column":50}},"70":{"start":{"line":213,"column":8},"end":{"line":215,"column":9}},"71":{"start":{"line":214,"column":10},"end":{"line":214,"column":29}},"72":{"start":{"line":217,"column":6},"end":{"line":219,"column":7}},"73":{"start":{"line":218,"column":8},"end":{"line":218,"column":32}},"74":{"start":{"line":220,"column":6},"end":{"line":220,"column":41}},"75":{"start":{"line":224,"column":27},"end":{"line":224,"column":29}},"76":{"start":{"line":225,"column":4},"end":{"line":230,"column":6}},"77":{"start":{"line":231,"column":4},"end":{"line":236,"column":5}},"78":{"start":{"line":232,"column":6},"end":{"line":235,"column":8}},"79":{"start":{"line":238,"column":4},"end":{"line":240,"column":5}},"80":{"start":{"line":239,"column":6},"end":{"line":239,"column":32}},"81":{"start":{"line":242,"column":4},"end":{"line":242,"column":71}},"82":{"start":{"line":243,"column":4},"end":{"line":243,"column":52}},"83":{"start":{"line":244,"column":4},"end":{"line":247,"column":5}},"84":{"start":{"line":245,"column":6},"end":{"line":245,"column":61}},"85":{"start":{"line":246,"column":6},"end":{"line":246,"column":40}},"86":{"start":{"line":248,"column":31},"end":{"line":248,"column":64}},"87":{"start":{"line":249,"column":4},"end":{"line":252,"column":5}},"88":{"start":{"line":250,"column":6},"end":{"line":250,"column":36}},"89":{"start":{"line":251,"column":6},"end":{"line":251,"column":75}},"90":{"start":{"line":253,"column":4},"end":{"line":253,"column":53}},"91":{"start":{"line":255,"column":2},"end":{"line":257,"column":3}},"92":{"start":{"line":256,"column":4},"end":{"line":256,"column":54}},"93":{"start":{"line":258,"column":22},"end":{"line":258,"column":77}},"94":{"start":{"line":259,"column":19},"end":{"line":259,"column":41}},"95":{"start":{"line":260,"column":2},"end":{"line":260,"column":79}},"96":{"start":{"line":261,"column":2},"end":{"line":261,"column":58}},"97":{"start":{"line":262,"column":2},"end":{"line":262,"column":18}},"98":{"start":{"line":271,"column":28},"end":{"line":336,"column":1}},"99":{"start":{"line":272,"column":20},"end":{"line":275,"column":15}},"100":{"start":{"line":276,"column":16},"end":{"line":276,"column":72}},"101":{"start":{"line":278,"column":33},"end":{"line":281,"column":3}},"102":{"start":{"line":282,"column":2},"end":{"line":287,"column":4}},"103":{"start":{"line":288,"column":2},"end":{"line":288,"column":50}},"104":{"start":{"line":289,"column":2},"end":{"line":292,"column":3}},"105":{"start":{"line":290,"column":4},"end":{"line":290,"column":23}},"106":{"start":{"line":291,"column":4},"end":{"line":291,"column":62}},"107":{"start":{"line":293,"column":2},"end":{"line":318,"column":3}},"108":{"start":{"line":295,"column":4},"end":{"line":297,"column":5}},"109":{"start":{"line":296,"column":6},"end":{"line":296,"column":58}},"110":{"start":{"line":298,"column":4},"end":{"line":300,"column":5}},"111":{"start":{"line":299,"column":6},"end":{"line":299,"column":52}},"112":{"start":{"line":302,"column":4},"end":{"line":317,"column":5}},"113":{"start":{"line":303,"column":6},"end":{"line":314,"column":8}},"114":{"start":{"line":316,"column":6},"end":{"line":316,"column":71}},"115":{"start":{"line":319,"column":2},"end":{"line":319,"column":29}},"116":{"start":{"line":320,"column":2},"end":{"line":320,"column":26}},"117":{"start":{"line":321,"column":18},"end":{"line":324,"column":3}},"118":{"start":{"line":325,"column":19},"end":{"line":325,"column":41}},"119":{"start":{"line":326,"column":2},"end":{"line":329,"column":14}},"120":{"start":{"line":330,"column":2},"end":{"line":332,"column":4}},"121":{"start":{"line":333,"column":2},"end":{"line":333,"column":31}},"122":{"start":{"line":334,"column":2},"end":{"line":334,"column":59}},"123":{"start":{"line":335,"column":2},"end":{"line":335,"column":18}},"124":{"start":{"line":339,"column":21},"end":{"line":368,"column":1}},"125":{"start":{"line":340,"column":2},"end":{"line":345,"column":3}},"126":{"start":{"line":341,"column":4},"end":{"line":344,"column":6}},"127":{"start":{"line":346,"column":22},"end":{"line":346,"column":48}},"128":{"start":{"line":350,"column":2},"end":{"line":366,"column":3}},"129":{"start":{"line":352,"column":6},"end":{"line":352,"column":44}},"130":{"start":{"line":353,"column":6},"end":{"line":353,"column":78}},"131":{"start":{"line":354,"column":6},"end":{"line":354,"column":12}},"132":{"start":{"line":357,"column":6},"end":{"line":357,"column":41}},"133":{"start":{"line":358,"column":6},"end":{"line":358,"column":69}},"134":{"start":{"line":359,"column":6},"end":{"line":359,"column":12}},"135":{"start":{"line":361,"column":6},"end":{"line":361,"column":41}},"136":{"start":{"line":362,"column":6},"end":{"line":362,"column":75}},"137":{"start":{"line":363,"column":6},"end":{"line":363,"column":12}},"138":{"start":{"line":365,"column":6},"end":{"line":365,"column":63}},"139":{"start":{"line":367,"column":2},"end":{"line":367,"column":18}},"140":{"start":{"line":370,"column":16},"end":{"line":373,"column":1}},"141":{"start":{"line":371,"column":17},"end":{"line":371,"column":69}},"142":{"start":{"line":372,"column":2},"end":{"line":372,"column":16}},"143":{"start":{"line":375,"column":26},"end":{"line":412,"column":1}},"144":{"start":{"line":376,"column":2},"end":{"line":379,"column":3}},"145":{"start":{"line":377,"column":23},"end":{"line":377,"column":75}},"146":{"start":{"line":378,"column":4},"end":{"line":378,"column":24}},"147":{"start":{"line":381,"column":19},"end":{"line":410,"column":3}},"148":{"start":{"line":383,"column":6},"end":{"line":408,"column":7}},"149":{"start":{"line":384,"column":8},"end":{"line":391,"column":9}},"150":{"start":{"line":386,"column":10},"end":{"line":390,"column":12}},"151":{"start":{"line":393,"column":8},"end":{"line":397,"column":10}},"152":{"start":{"line":399,"column":8},"end":{"line":407,"column":10}},"153":{"start":{"line":411,"column":2},"end":{"line":411,"column":18}},"154":{"start":{"line":414,"column":0},"end":{"line":414,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":43,"column":22},"end":{"line":43,"column":23}},"loc":{"start":{"line":43,"column":72},"end":{"line":92,"column":1}},"line":43},"1":{"name":"(anonymous_1)","decl":{"start":{"line":101,"column":31},"end":{"line":101,"column":32}},"loc":{"start":{"line":101,"column":73},"end":{"line":155,"column":1}},"line":101},"2":{"name":"(anonymous_2)","decl":{"start":{"line":163,"column":33},"end":{"line":163,"column":34}},"loc":{"start":{"line":163,"column":44},"end":{"line":177,"column":1}},"line":163},"3":{"name":"(anonymous_3)","decl":{"start":{"line":178,"column":28},"end":{"line":178,"column":29}},"loc":{"start":{"line":178,"column":64},"end":{"line":263,"column":1}},"line":178},"4":{"name":"(anonymous_4)","decl":{"start":{"line":207,"column":39},"end":{"line":207,"column":40}},"loc":{"start":{"line":207,"column":46},"end":{"line":216,"column":7}},"line":207},"5":{"name":"(anonymous_5)","decl":{"start":{"line":271,"column":28},"end":{"line":271,"column":29}},"loc":{"start":{"line":271,"column":70},"end":{"line":336,"column":1}},"line":271},"6":{"name":"(anonymous_6)","decl":{"start":{"line":339,"column":21},"end":{"line":339,"column":22}},"loc":{"start":{"line":339,"column":53},"end":{"line":368,"column":1}},"line":339},"7":{"name":"(anonymous_7)","decl":{"start":{"line":370,"column":16},"end":{"line":370,"column":17}},"loc":{"start":{"line":370,"column":31},"end":{"line":373,"column":1}},"line":370},"8":{"name":"(anonymous_8)","decl":{"start":{"line":375,"column":26},"end":{"line":375,"column":27}},"loc":{"start":{"line":375,"column":42},"end":{"line":412,"column":1}},"line":375},"9":{"name":"(anonymous_9)","decl":{"start":{"line":382,"column":15},"end":{"line":382,"column":16}},"loc":{"start":{"line":382,"column":30},"end":{"line":409,"column":5}},"line":382}},"branchMap":{"0":{"loc":{"start":{"line":46,"column":2},"end":{"line":51,"column":3}},"type":"if","locations":[{"start":{"line":46,"column":2},"end":{"line":51,"column":3}},{"start":{"line":46,"column":2},"end":{"line":51,"column":3}}],"line":46},"1":{"loc":{"start":{"line":57,"column":2},"end":{"line":60,"column":3}},"type":"if","locations":[{"start":{"line":57,"column":2},"end":{"line":60,"column":3}},{"start":{"line":57,"column":2},"end":{"line":60,"column":3}}],"line":57},"2":{"loc":{"start":{"line":62,"column":2},"end":{"line":73,"column":3}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":73,"column":3}},{"start":{"line":62,"column":2},"end":{"line":73,"column":3}}],"line":62},"3":{"loc":{"start":{"line":67,"column":26},"end":{"line":69,"column":37}},"type":"cond-expr","locations":[{"start":{"line":68,"column":8},"end":{"line":68,"column":48}},{"start":{"line":69,"column":8},"end":{"line":69,"column":37}}],"line":67},"4":{"loc":{"start":{"line":70,"column":23},"end":{"line":72,"column":34}},"type":"cond-expr","locations":[{"start":{"line":71,"column":8},"end":{"line":71,"column":45}},{"start":{"line":72,"column":8},"end":{"line":72,"column":34}}],"line":70},"5":{"loc":{"start":{"line":104,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":121,"column":3}},{"start":{"line":104,"column":2},"end":{"line":121,"column":3}}],"line":104},"6":{"loc":{"start":{"line":105,"column":4},"end":{"line":106,"column":36}},"type":"binary-expr","locations":[{"start":{"line":105,"column":5},"end":{"line":105,"column":32}},{"start":{"line":105,"column":36},"end":{"line":105,"column":74}},{"start":{"line":106,"column":4},"end":{"line":106,"column":36}}],"line":105},"7":{"loc":{"start":{"line":109,"column":4},"end":{"line":116,"column":5}},"type":"if","locations":[{"start":{"line":109,"column":4},"end":{"line":116,"column":5}},{"start":{"line":109,"column":4},"end":{"line":116,"column":5}}],"line":109},"8":{"loc":{"start":{"line":124,"column":2},"end":{"line":127,"column":3}},"type":"if","locations":[{"start":{"line":124,"column":2},"end":{"line":127,"column":3}},{"start":{"line":124,"column":2},"end":{"line":127,"column":3}}],"line":124},"9":{"loc":{"start":{"line":141,"column":2},"end":{"line":144,"column":3}},"type":"if","locations":[{"start":{"line":141,"column":2},"end":{"line":144,"column":3}},{"start":{"line":141,"column":2},"end":{"line":144,"column":3}}],"line":141},"10":{"loc":{"start":{"line":181,"column":10},"end":{"line":181,"column":52}},"type":"cond-expr","locations":[{"start":{"line":181,"column":18},"end":{"line":181,"column":44}},{"start":{"line":181,"column":47},"end":{"line":181,"column":52}}],"line":181},"11":{"loc":{"start":{"line":182,"column":2},"end":{"line":254,"column":3}},"type":"if","locations":[{"start":{"line":182,"column":2},"end":{"line":254,"column":3}},{"start":{"line":182,"column":2},"end":{"line":254,"column":3}}],"line":182},"12":{"loc":{"start":{"line":182,"column":6},"end":{"line":182,"column":54}},"type":"binary-expr","locations":[{"start":{"line":182,"column":6},"end":{"line":182,"column":32}},{"start":{"line":182,"column":36},"end":{"line":182,"column":54}}],"line":182},"13":{"loc":{"start":{"line":189,"column":4},"end":{"line":197,"column":5}},"type":"if","locations":[{"start":{"line":189,"column":4},"end":{"line":197,"column":5}},{"start":{"line":189,"column":4},"end":{"line":197,"column":5}}],"line":189},"14":{"loc":{"start":{"line":190,"column":6},"end":{"line":191,"column":48}},"type":"binary-expr","locations":[{"start":{"line":190,"column":6},"end":{"line":190,"column":41}},{"start":{"line":191,"column":6},"end":{"line":191,"column":48}}],"line":190},"15":{"loc":{"start":{"line":205,"column":4},"end":{"line":221,"column":5}},"type":"if","locations":[{"start":{"line":205,"column":4},"end":{"line":221,"column":5}},{"start":{"line":205,"column":4},"end":{"line":221,"column":5}}],"line":205},"16":{"loc":{"start":{"line":205,"column":8},"end":{"line":205,"column":75}},"type":"binary-expr","locations":[{"start":{"line":205,"column":8},"end":{"line":205,"column":32}},{"start":{"line":205,"column":36},"end":{"line":205,"column":75}}],"line":205},"17":{"loc":{"start":{"line":213,"column":8},"end":{"line":215,"column":9}},"type":"if","locations":[{"start":{"line":213,"column":8},"end":{"line":215,"column":9}},{"start":{"line":213,"column":8},"end":{"line":215,"column":9}}],"line":213},"18":{"loc":{"start":{"line":217,"column":6},"end":{"line":219,"column":7}},"type":"if","locations":[{"start":{"line":217,"column":6},"end":{"line":219,"column":7}},{"start":{"line":217,"column":6},"end":{"line":219,"column":7}}],"line":217},"19":{"loc":{"start":{"line":231,"column":4},"end":{"line":236,"column":5}},"type":"if","locations":[{"start":{"line":231,"column":4},"end":{"line":236,"column":5}},{"start":{"line":231,"column":4},"end":{"line":236,"column":5}}],"line":231},"20":{"loc":{"start":{"line":238,"column":4},"end":{"line":240,"column":5}},"type":"if","locations":[{"start":{"line":238,"column":4},"end":{"line":240,"column":5}},{"start":{"line":238,"column":4},"end":{"line":240,"column":5}}],"line":238},"21":{"loc":{"start":{"line":244,"column":4},"end":{"line":247,"column":5}},"type":"if","locations":[{"start":{"line":244,"column":4},"end":{"line":247,"column":5}},{"start":{"line":244,"column":4},"end":{"line":247,"column":5}}],"line":244},"22":{"loc":{"start":{"line":244,"column":8},"end":{"line":244,"column":56}},"type":"binary-expr","locations":[{"start":{"line":244,"column":8},"end":{"line":244,"column":26}},{"start":{"line":244,"column":30},"end":{"line":244,"column":56}}],"line":244},"23":{"loc":{"start":{"line":249,"column":4},"end":{"line":252,"column":5}},"type":"if","locations":[{"start":{"line":249,"column":4},"end":{"line":252,"column":5}},{"start":{"line":249,"column":4},"end":{"line":252,"column":5}}],"line":249},"24":{"loc":{"start":{"line":255,"column":2},"end":{"line":257,"column":3}},"type":"if","locations":[{"start":{"line":255,"column":2},"end":{"line":257,"column":3}},{"start":{"line":255,"column":2},"end":{"line":257,"column":3}}],"line":255},"25":{"loc":{"start":{"line":289,"column":2},"end":{"line":292,"column":3}},"type":"if","locations":[{"start":{"line":289,"column":2},"end":{"line":292,"column":3}},{"start":{"line":289,"column":2},"end":{"line":292,"column":3}}],"line":289},"26":{"loc":{"start":{"line":293,"column":2},"end":{"line":318,"column":3}},"type":"if","locations":[{"start":{"line":293,"column":2},"end":{"line":318,"column":3}},{"start":{"line":293,"column":2},"end":{"line":318,"column":3}}],"line":293},"27":{"loc":{"start":{"line":295,"column":4},"end":{"line":297,"column":5}},"type":"if","locations":[{"start":{"line":295,"column":4},"end":{"line":297,"column":5}},{"start":{"line":295,"column":4},"end":{"line":297,"column":5}}],"line":295},"28":{"loc":{"start":{"line":298,"column":4},"end":{"line":300,"column":5}},"type":"if","locations":[{"start":{"line":298,"column":4},"end":{"line":300,"column":5}},{"start":{"line":298,"column":4},"end":{"line":300,"column":5}}],"line":298},"29":{"loc":{"start":{"line":340,"column":2},"end":{"line":345,"column":3}},"type":"if","locations":[{"start":{"line":340,"column":2},"end":{"line":345,"column":3}},{"start":{"line":340,"column":2},"end":{"line":345,"column":3}}],"line":340},"30":{"loc":{"start":{"line":350,"column":2},"end":{"line":366,"column":3}},"type":"switch","locations":[{"start":{"line":351,"column":4},"end":{"line":354,"column":12}},{"start":{"line":355,"column":4},"end":{"line":355,"column":26}},{"start":{"line":356,"column":4},"end":{"line":359,"column":12}},{"start":{"line":360,"column":4},"end":{"line":363,"column":12}},{"start":{"line":364,"column":4},"end":{"line":365,"column":63}}],"line":350},"31":{"loc":{"start":{"line":376,"column":2},"end":{"line":379,"column":3}},"type":"if","locations":[{"start":{"line":376,"column":2},"end":{"line":379,"column":3}},{"start":{"line":376,"column":2},"end":{"line":379,"column":3}}],"line":376},"32":{"loc":{"start":{"line":376,"column":6},"end":{"line":376,"column":50}},"type":"binary-expr","locations":[{"start":{"line":376,"column":6},"end":{"line":376,"column":28}},{"start":{"line":376,"column":32},"end":{"line":376,"column":50}}],"line":376},"33":{"loc":{"start":{"line":384,"column":8},"end":{"line":391,"column":9}},"type":"if","locations":[{"start":{"line":384,"column":8},"end":{"line":391,"column":9}},{"start":{"line":384,"column":8},"end":{"line":391,"column":9}}],"line":384},"34":{"loc":{"start":{"line":401,"column":10},"end":{"line":405,"column":17}},"type":"cond-expr","locations":[{"start":{"line":402,"column":14},"end":{"line":402,"column":35}},{"start":{"line":403,"column":14},"end":{"line":405,"column":17}}],"line":401},"35":{"loc":{"start":{"line":403,"column":14},"end":{"line":405,"column":17}},"type":"cond-expr","locations":[{"start":{"line":404,"column":14},"end":{"line":404,"column":24}},{"start":{"line":405,"column":14},"end":{"line":405,"column":17}}],"line":403},"36":{"loc":{"start":{"line":406,"column":10},"end":{"line":406,"column":69}},"type":"binary-expr","locations":[{"start":{"line":406,"column":10},"end":{"line":406,"column":23}},{"start":{"line":406,"column":27},"end":{"line":406,"column":69}}],"line":406}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":4,"8":4,"9":4,"10":4,"11":4,"12":0,"13":0,"14":4,"15":2,"16":2,"17":2,"18":2,"19":4,"20":4,"21":4,"22":0,"23":1,"24":4,"25":4,"26":2,"27":2,"28":2,"29":2,"30":4,"31":4,"32":1,"33":1,"34":4,"35":4,"36":4,"37":4,"38":0,"39":0,"40":4,"41":4,"42":4,"43":4,"44":4,"45":4,"46":1,"47":6,"48":6,"49":6,"50":6,"51":1,"52":6,"53":6,"54":6,"55":6,"56":3,"57":3,"58":3,"59":3,"60":3,"61":3,"62":1,"63":2,"64":2,"65":2,"66":1,"67":1,"68":2,"69":2,"70":2,"71":2,"72":1,"73":0,"74":1,"75":2,"76":2,"77":2,"78":0,"79":2,"80":0,"81":3,"82":3,"83":3,"84":1,"85":1,"86":3,"87":3,"88":0,"89":0,"90":3,"91":5,"92":0,"93":5,"94":5,"95":5,"96":5,"97":5,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":0,"106":0,"107":1,"108":1,"109":0,"110":1,"111":0,"112":1,"113":1,"114":0,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":12,"126":0,"127":12,"128":12,"129":4,"130":4,"131":4,"132":6,"133":6,"134":5,"135":1,"136":1,"137":1,"138":1,"139":10,"140":1,"141":12,"142":10,"143":1,"144":1,"145":0,"146":0,"147":1,"148":2,"149":2,"150":0,"151":2,"152":0,"153":1,"154":1},"f":{"0":4,"1":4,"2":6,"3":6,"4":2,"5":1,"6":12,"7":12,"8":1,"9":2},"b":{"0":[4,0],"1":[0,4],"2":[2,2],"3":[0,2],"4":[2,0],"5":[2,2],"6":[4,4,2],"7":[2,0],"8":[1,3],"9":[0,4],"10":[6,0],"11":[3,3],"12":[6,3],"13":[1,2],"14":[3,1],"15":[1,1],"16":[2,1],"17":[2,0],"18":[0,1],"19":[0,2],"20":[0,2],"21":[1,2],"22":[3,3],"23":[0,3],"24":[0,5],"25":[0,1],"26":[1,0],"27":[0,1],"28":[0,1],"29":[0,12],"30":[4,2,6,1,1],"31":[0,1],"32":[1,1],"33":[0,2],"34":[0,0],"35":[0,0],"36":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ae402a04f02e4a9db0de7d340f02a418a5a94d92"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\kustomer\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\kustomer\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":22},"end":{"line":3,"column":51}},"2":{"start":{"line":5,"column":26},"end":{"line":10,"column":1}},"3":{"start":{"line":12,"column":23},"end":{"line":12,"column":69}},"4":{"start":{"line":14,"column":0},"end":{"line":18,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"10da64a49d0ed7107f814cb02c07479ec8260c50"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\kustomer\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\kustomer\\transform.js","statementMap":{"0":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"1":{"start":{"line":3,"column":22},"end":{"line":3,"column":51}},"2":{"start":{"line":8,"column":4},"end":{"line":8,"column":23}},"3":{"start":{"line":19,"column":4},"end":{"line":19,"column":25}},"4":{"start":{"line":24,"column":4},"end":{"line":24,"column":21}},"5":{"start":{"line":28,"column":33},"end":{"line":92,"column":1}},"6":{"start":{"line":29,"column":26},"end":{"line":32,"column":3}},"7":{"start":{"line":34,"column":20},"end":{"line":34,"column":66}},"8":{"start":{"line":35,"column":19},"end":{"line":35,"column":64}},"9":{"start":{"line":36,"column":16},"end":{"line":36,"column":58}},"10":{"start":{"line":37,"column":14},"end":{"line":37,"column":58}},"11":{"start":{"line":39,"column":2},"end":{"line":41,"column":3}},"12":{"start":{"line":40,"column":4},"end":{"line":40,"column":54}},"13":{"start":{"line":43,"column":2},"end":{"line":50,"column":3}},"14":{"start":{"line":44,"column":4},"end":{"line":49,"column":6}},"15":{"start":{"line":52,"column":2},"end":{"line":59,"column":3}},"16":{"start":{"line":53,"column":4},"end":{"line":58,"column":6}},"17":{"start":{"line":61,"column":2},"end":{"line":67,"column":3}},"18":{"start":{"line":62,"column":4},"end":{"line":66,"column":6}},"19":{"start":{"line":69,"column":18},"end":{"line":69,"column":62}},"20":{"start":{"line":70,"column":2},"end":{"line":89,"column":3}},"21":{"start":{"line":72,"column":4},"end":{"line":80,"column":5}},"22":{"start":{"line":73,"column":6},"end":{"line":73,"column":24}},"23":{"start":{"line":75,"column":50},"end":{"line":75,"column":57}},"24":{"start":{"line":76,"column":6},"end":{"line":79,"column":20}},"25":{"start":{"line":81,"column":4},"end":{"line":88,"column":5}},"26":{"start":{"line":82,"column":6},"end":{"line":87,"column":8}},"27":{"start":{"line":91,"column":2},"end":{"line":91,"column":55}},"28":{"start":{"line":96,"column":30},"end":{"line":215,"column":1}},"29":{"start":{"line":97,"column":16},"end":{"line":97,"column":18}},"30":{"start":{"line":99,"column":20},"end":{"line":101,"column":3}},"31":{"start":{"line":110,"column":2},"end":{"line":199,"column":3}},"32":{"start":{"line":111,"column":22},"end":{"line":111,"column":64}},"33":{"start":{"line":112,"column":19},"end":{"line":112,"column":66}},"34":{"start":{"line":113,"column":24},"end":{"line":113,"column":51}},"35":{"start":{"line":114,"column":23},"end":{"line":114,"column":70}},"36":{"start":{"line":115,"column":4},"end":{"line":120,"column":5}},"37":{"start":{"line":116,"column":6},"end":{"line":119,"column":8}},"38":{"start":{"line":123,"column":4},"end":{"line":128,"column":5}},"39":{"start":{"line":124,"column":6},"end":{"line":127,"column":8}},"40":{"start":{"line":132,"column":4},"end":{"line":137,"column":5}},"41":{"start":{"line":133,"column":6},"end":{"line":136,"column":8}},"42":{"start":{"line":141,"column":4},"end":{"line":149,"column":5}},"43":{"start":{"line":142,"column":6},"end":{"line":148,"column":8}},"44":{"start":{"line":151,"column":4},"end":{"line":157,"column":5}},"45":{"start":{"line":152,"column":6},"end":{"line":152,"column":50}},"46":{"start":{"line":156,"column":6},"end":{"line":156,"column":40}},"47":{"start":{"line":158,"column":4},"end":{"line":158,"column":69}},"48":{"start":{"line":167,"column":4},"end":{"line":167,"column":61}},"49":{"start":{"line":168,"column":23},"end":{"line":168,"column":79}},"50":{"start":{"line":170,"column":4},"end":{"line":181,"column":5}},"51":{"start":{"line":172,"column":8},"end":{"line":174,"column":9}},"52":{"start":{"line":173,"column":10},"end":{"line":173,"column":48}},"53":{"start":{"line":175,"column":8},"end":{"line":175,"column":14}},"54":{"start":{"line":177,"column":8},"end":{"line":179,"column":9}},"55":{"start":{"line":178,"column":10},"end":{"line":178,"column":46}},"56":{"start":{"line":180,"column":8},"end":{"line":180,"column":14}},"57":{"start":{"line":182,"column":4},"end":{"line":182,"column":62}},"58":{"start":{"line":183,"column":4},"end":{"line":185,"column":5}},"59":{"start":{"line":184,"column":6},"end":{"line":184,"column":65}},"60":{"start":{"line":186,"column":4},"end":{"line":191,"column":6}},"61":{"start":{"line":193,"column":4},"end":{"line":198,"column":5}},"62":{"start":{"line":194,"column":6},"end":{"line":194,"column":74}},"63":{"start":{"line":195,"column":6},"end":{"line":197,"column":7}},"64":{"start":{"line":196,"column":8},"end":{"line":196,"column":40}},"65":{"start":{"line":200,"column":2},"end":{"line":212,"column":3}},"66":{"start":{"line":201,"column":21},"end":{"line":201,"column":43}},"67":{"start":{"line":202,"column":4},"end":{"line":202,"column":34}},"68":{"start":{"line":203,"column":4},"end":{"line":205,"column":47}},"69":{"start":{"line":206,"column":4},"end":{"line":209,"column":6}},"70":{"start":{"line":210,"column":4},"end":{"line":210,"column":40}},"71":{"start":{"line":211,"column":4},"end":{"line":211,"column":20}},"72":{"start":{"line":214,"column":2},"end":{"line":214,"column":79}},"73":{"start":{"line":217,"column":21},"end":{"line":242,"column":1}},"74":{"start":{"line":218,"column":2},"end":{"line":223,"column":3}},"75":{"start":{"line":219,"column":4},"end":{"line":222,"column":6}},"76":{"start":{"line":225,"column":2},"end":{"line":240,"column":3}},"77":{"start":{"line":227,"column":6},"end":{"line":227,"column":44}},"78":{"start":{"line":228,"column":6},"end":{"line":228,"column":12}},"79":{"start":{"line":230,"column":6},"end":{"line":230,"column":40}},"80":{"start":{"line":231,"column":6},"end":{"line":231,"column":12}},"81":{"start":{"line":233,"column":6},"end":{"line":233,"column":42}},"82":{"start":{"line":234,"column":6},"end":{"line":234,"column":12}},"83":{"start":{"line":236,"column":6},"end":{"line":236,"column":41}},"84":{"start":{"line":237,"column":6},"end":{"line":237,"column":12}},"85":{"start":{"line":239,"column":6},"end":{"line":239,"column":77}},"86":{"start":{"line":241,"column":2},"end":{"line":241,"column":63}},"87":{"start":{"line":244,"column":16},"end":{"line":246,"column":1}},"88":{"start":{"line":245,"column":2},"end":{"line":245,"column":56}},"89":{"start":{"line":248,"column":26},"end":{"line":285,"column":1}},"90":{"start":{"line":249,"column":2},"end":{"line":252,"column":3}},"91":{"start":{"line":250,"column":23},"end":{"line":250,"column":75}},"92":{"start":{"line":251,"column":4},"end":{"line":251,"column":24}},"93":{"start":{"line":254,"column":19},"end":{"line":283,"column":3}},"94":{"start":{"line":256,"column":6},"end":{"line":281,"column":7}},"95":{"start":{"line":257,"column":8},"end":{"line":264,"column":9}},"96":{"start":{"line":259,"column":10},"end":{"line":263,"column":12}},"97":{"start":{"line":266,"column":8},"end":{"line":270,"column":10}},"98":{"start":{"line":272,"column":8},"end":{"line":280,"column":10}},"99":{"start":{"line":284,"column":2},"end":{"line":284,"column":18}},"100":{"start":{"line":287,"column":0},"end":{"line":287,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":28,"column":33},"end":{"line":28,"column":34}},"loc":{"start":{"line":28,"column":63},"end":{"line":92,"column":1}},"line":28},"1":{"name":"(anonymous_1)","decl":{"start":{"line":96,"column":30},"end":{"line":96,"column":31}},"loc":{"start":{"line":96,"column":72},"end":{"line":215,"column":1}},"line":96},"2":{"name":"(anonymous_2)","decl":{"start":{"line":217,"column":21},"end":{"line":217,"column":22}},"loc":{"start":{"line":217,"column":47},"end":{"line":242,"column":1}},"line":217},"3":{"name":"(anonymous_3)","decl":{"start":{"line":244,"column":16},"end":{"line":244,"column":17}},"loc":{"start":{"line":244,"column":25},"end":{"line":246,"column":1}},"line":244},"4":{"name":"(anonymous_4)","decl":{"start":{"line":248,"column":26},"end":{"line":248,"column":27}},"loc":{"start":{"line":248,"column":42},"end":{"line":285,"column":1}},"line":248},"5":{"name":"(anonymous_5)","decl":{"start":{"line":255,"column":15},"end":{"line":255,"column":16}},"loc":{"start":{"line":255,"column":30},"end":{"line":282,"column":5}},"line":255}},"branchMap":{"0":{"loc":{"start":{"line":39,"column":2},"end":{"line":41,"column":3}},"type":"if","locations":[{"start":{"line":39,"column":2},"end":{"line":41,"column":3}},{"start":{"line":39,"column":2},"end":{"line":41,"column":3}}],"line":39},"1":{"loc":{"start":{"line":39,"column":6},"end":{"line":39,"column":60}},"type":"binary-expr","locations":[{"start":{"line":39,"column":6},"end":{"line":39,"column":35}},{"start":{"line":39,"column":39},"end":{"line":39,"column":48}},{"start":{"line":39,"column":52},"end":{"line":39,"column":60}}],"line":39},"2":{"loc":{"start":{"line":43,"column":2},"end":{"line":50,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":50,"column":3}},{"start":{"line":43,"column":2},"end":{"line":50,"column":3}}],"line":43},"3":{"loc":{"start":{"line":43,"column":6},"end":{"line":43,"column":38}},"type":"binary-expr","locations":[{"start":{"line":43,"column":6},"end":{"line":43,"column":29}},{"start":{"line":43,"column":33},"end":{"line":43,"column":38}}],"line":43},"4":{"loc":{"start":{"line":52,"column":2},"end":{"line":59,"column":3}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":59,"column":3}},{"start":{"line":52,"column":2},"end":{"line":59,"column":3}}],"line":52},"5":{"loc":{"start":{"line":52,"column":6},"end":{"line":52,"column":38}},"type":"binary-expr","locations":[{"start":{"line":52,"column":6},"end":{"line":52,"column":29}},{"start":{"line":52,"column":33},"end":{"line":52,"column":38}}],"line":52},"6":{"loc":{"start":{"line":61,"column":2},"end":{"line":67,"column":3}},"type":"if","locations":[{"start":{"line":61,"column":2},"end":{"line":67,"column":3}},{"start":{"line":61,"column":2},"end":{"line":67,"column":3}}],"line":61},"7":{"loc":{"start":{"line":70,"column":2},"end":{"line":89,"column":3}},"type":"if","locations":[{"start":{"line":70,"column":2},"end":{"line":89,"column":3}},{"start":{"line":70,"column":2},"end":{"line":89,"column":3}}],"line":70},"8":{"loc":{"start":{"line":72,"column":4},"end":{"line":80,"column":5}},"type":"if","locations":[{"start":{"line":72,"column":4},"end":{"line":80,"column":5}},{"start":{"line":72,"column":4},"end":{"line":80,"column":5}}],"line":72},"9":{"loc":{"start":{"line":77,"column":8},"end":{"line":79,"column":19}},"type":"cond-expr","locations":[{"start":{"line":78,"column":12},"end":{"line":78,"column":78}},{"start":{"line":79,"column":12},"end":{"line":79,"column":19}}],"line":77},"10":{"loc":{"start":{"line":77,"column":8},"end":{"line":77,"column":45}},"type":"binary-expr","locations":[{"start":{"line":77,"column":8},"end":{"line":77,"column":14}},{"start":{"line":77,"column":18},"end":{"line":77,"column":22}},{"start":{"line":77,"column":26},"end":{"line":77,"column":31}},{"start":{"line":77,"column":35},"end":{"line":77,"column":45}}],"line":77},"11":{"loc":{"start":{"line":78,"column":15},"end":{"line":78,"column":27}},"type":"binary-expr","locations":[{"start":{"line":78,"column":15},"end":{"line":78,"column":21}},{"start":{"line":78,"column":25},"end":{"line":78,"column":27}}],"line":78},"12":{"loc":{"start":{"line":78,"column":31},"end":{"line":78,"column":41}},"type":"binary-expr","locations":[{"start":{"line":78,"column":31},"end":{"line":78,"column":35}},{"start":{"line":78,"column":39},"end":{"line":78,"column":41}}],"line":78},"13":{"loc":{"start":{"line":78,"column":45},"end":{"line":78,"column":56}},"type":"binary-expr","locations":[{"start":{"line":78,"column":45},"end":{"line":78,"column":50}},{"start":{"line":78,"column":54},"end":{"line":78,"column":56}}],"line":78},"14":{"loc":{"start":{"line":78,"column":60},"end":{"line":78,"column":76}},"type":"binary-expr","locations":[{"start":{"line":78,"column":60},"end":{"line":78,"column":70}},{"start":{"line":78,"column":74},"end":{"line":78,"column":76}}],"line":78},"15":{"loc":{"start":{"line":81,"column":4},"end":{"line":88,"column":5}},"type":"if","locations":[{"start":{"line":81,"column":4},"end":{"line":88,"column":5}},{"start":{"line":81,"column":4},"end":{"line":88,"column":5}}],"line":81},"16":{"loc":{"start":{"line":110,"column":2},"end":{"line":199,"column":3}},"type":"if","locations":[{"start":{"line":110,"column":2},"end":{"line":199,"column":3}},{"start":{"line":110,"column":2},"end":{"line":199,"column":3}}],"line":110},"17":{"loc":{"start":{"line":115,"column":4},"end":{"line":120,"column":5}},"type":"if","locations":[{"start":{"line":115,"column":4},"end":{"line":120,"column":5}},{"start":{"line":115,"column":4},"end":{"line":120,"column":5}}],"line":115},"18":{"loc":{"start":{"line":123,"column":4},"end":{"line":128,"column":5}},"type":"if","locations":[{"start":{"line":123,"column":4},"end":{"line":128,"column":5}},{"start":{"line":123,"column":4},"end":{"line":128,"column":5}}],"line":123},"19":{"loc":{"start":{"line":123,"column":8},"end":{"line":123,"column":44}},"type":"binary-expr","locations":[{"start":{"line":123,"column":8},"end":{"line":123,"column":31}},{"start":{"line":123,"column":35},"end":{"line":123,"column":44}}],"line":123},"20":{"loc":{"start":{"line":132,"column":4},"end":{"line":137,"column":5}},"type":"if","locations":[{"start":{"line":132,"column":4},"end":{"line":137,"column":5}},{"start":{"line":132,"column":4},"end":{"line":137,"column":5}}],"line":132},"21":{"loc":{"start":{"line":132,"column":8},"end":{"line":132,"column":41}},"type":"binary-expr","locations":[{"start":{"line":132,"column":8},"end":{"line":132,"column":31}},{"start":{"line":132,"column":35},"end":{"line":132,"column":41}}],"line":132},"22":{"loc":{"start":{"line":141,"column":4},"end":{"line":149,"column":5}},"type":"if","locations":[{"start":{"line":141,"column":4},"end":{"line":149,"column":5}},{"start":{"line":141,"column":4},"end":{"line":149,"column":5}}],"line":141},"23":{"loc":{"start":{"line":141,"column":8},"end":{"line":141,"column":46}},"type":"binary-expr","locations":[{"start":{"line":141,"column":8},"end":{"line":141,"column":31}},{"start":{"line":141,"column":35},"end":{"line":141,"column":46}}],"line":141},"24":{"loc":{"start":{"line":151,"column":4},"end":{"line":157,"column":5}},"type":"if","locations":[{"start":{"line":151,"column":4},"end":{"line":157,"column":5}},{"start":{"line":151,"column":4},"end":{"line":157,"column":5}}],"line":151},"25":{"loc":{"start":{"line":170,"column":4},"end":{"line":181,"column":5}},"type":"switch","locations":[{"start":{"line":171,"column":6},"end":{"line":175,"column":14}},{"start":{"line":176,"column":6},"end":{"line":180,"column":14}}],"line":170},"26":{"loc":{"start":{"line":172,"column":8},"end":{"line":174,"column":9}},"type":"if","locations":[{"start":{"line":172,"column":8},"end":{"line":174,"column":9}},{"start":{"line":172,"column":8},"end":{"line":174,"column":9}}],"line":172},"27":{"loc":{"start":{"line":177,"column":8},"end":{"line":179,"column":9}},"type":"if","locations":[{"start":{"line":177,"column":8},"end":{"line":179,"column":9}},{"start":{"line":177,"column":8},"end":{"line":179,"column":9}}],"line":177},"28":{"loc":{"start":{"line":183,"column":4},"end":{"line":185,"column":5}},"type":"if","locations":[{"start":{"line":183,"column":4},"end":{"line":185,"column":5}},{"start":{"line":183,"column":4},"end":{"line":185,"column":5}}],"line":183},"29":{"loc":{"start":{"line":193,"column":4},"end":{"line":198,"column":5}},"type":"if","locations":[{"start":{"line":193,"column":4},"end":{"line":198,"column":5}},{"start":{"line":193,"column":4},"end":{"line":198,"column":5}}],"line":193},"30":{"loc":{"start":{"line":195,"column":6},"end":{"line":197,"column":7}},"type":"if","locations":[{"start":{"line":195,"column":6},"end":{"line":197,"column":7}},{"start":{"line":195,"column":6},"end":{"line":197,"column":7}}],"line":195},"31":{"loc":{"start":{"line":200,"column":2},"end":{"line":212,"column":3}},"type":"if","locations":[{"start":{"line":200,"column":2},"end":{"line":212,"column":3}},{"start":{"line":200,"column":2},"end":{"line":212,"column":3}}],"line":200},"32":{"loc":{"start":{"line":203,"column":22},"end":{"line":205,"column":46}},"type":"cond-expr","locations":[{"start":{"line":204,"column":8},"end":{"line":204,"column":45}},{"start":{"line":205,"column":8},"end":{"line":205,"column":46}}],"line":203},"33":{"loc":{"start":{"line":218,"column":2},"end":{"line":223,"column":3}},"type":"if","locations":[{"start":{"line":218,"column":2},"end":{"line":223,"column":3}},{"start":{"line":218,"column":2},"end":{"line":223,"column":3}}],"line":218},"34":{"loc":{"start":{"line":225,"column":2},"end":{"line":240,"column":3}},"type":"switch","locations":[{"start":{"line":226,"column":4},"end":{"line":228,"column":12}},{"start":{"line":229,"column":4},"end":{"line":231,"column":12}},{"start":{"line":232,"column":4},"end":{"line":234,"column":12}},{"start":{"line":235,"column":4},"end":{"line":237,"column":12}},{"start":{"line":238,"column":4},"end":{"line":239,"column":77}}],"line":225},"35":{"loc":{"start":{"line":249,"column":2},"end":{"line":252,"column":3}},"type":"if","locations":[{"start":{"line":249,"column":2},"end":{"line":252,"column":3}},{"start":{"line":249,"column":2},"end":{"line":252,"column":3}}],"line":249},"36":{"loc":{"start":{"line":249,"column":6},"end":{"line":249,"column":50}},"type":"binary-expr","locations":[{"start":{"line":249,"column":6},"end":{"line":249,"column":28}},{"start":{"line":249,"column":32},"end":{"line":249,"column":50}}],"line":249},"37":{"loc":{"start":{"line":257,"column":8},"end":{"line":264,"column":9}},"type":"if","locations":[{"start":{"line":257,"column":8},"end":{"line":264,"column":9}},{"start":{"line":257,"column":8},"end":{"line":264,"column":9}}],"line":257},"38":{"loc":{"start":{"line":274,"column":10},"end":{"line":278,"column":17}},"type":"cond-expr","locations":[{"start":{"line":275,"column":14},"end":{"line":275,"column":35}},{"start":{"line":276,"column":14},"end":{"line":278,"column":17}}],"line":274},"39":{"loc":{"start":{"line":276,"column":14},"end":{"line":278,"column":17}},"type":"cond-expr","locations":[{"start":{"line":277,"column":14},"end":{"line":277,"column":24}},{"start":{"line":278,"column":14},"end":{"line":278,"column":17}}],"line":276},"40":{"loc":{"start":{"line":279,"column":10},"end":{"line":279,"column":69}},"type":"binary-expr","locations":[{"start":{"line":279,"column":10},"end":{"line":279,"column":23}},{"start":{"line":279,"column":27},"end":{"line":279,"column":69}}],"line":279}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":6,"7":6,"8":6,"9":6,"10":6,"11":6,"12":3,"13":6,"14":4,"15":6,"16":4,"17":6,"18":5,"19":6,"20":6,"21":5,"22":2,"23":3,"24":3,"25":5,"26":5,"27":6,"28":1,"29":14,"30":14,"31":14,"32":6,"33":6,"34":6,"35":6,"36":6,"37":1,"38":6,"39":4,"40":6,"41":5,"42":6,"43":4,"44":6,"45":4,"46":2,"47":6,"48":8,"49":8,"50":8,"51":3,"52":1,"53":3,"54":2,"55":1,"56":2,"57":8,"58":8,"59":0,"60":8,"61":8,"62":0,"63":0,"64":0,"65":14,"66":14,"67":14,"68":14,"69":14,"70":14,"71":14,"72":0,"73":1,"74":14,"75":0,"76":14,"77":6,"78":6,"79":3,"80":3,"81":2,"82":2,"83":3,"84":3,"85":0,"86":14,"87":1,"88":14,"89":1,"90":1,"91":0,"92":0,"93":1,"94":2,"95":2,"96":0,"97":2,"98":0,"99":1,"100":1},"f":{"0":6,"1":14,"2":14,"3":14,"4":1,"5":2},"b":{"0":[3,3],"1":[6,3,3],"2":[4,2],"3":[6,4],"4":[4,2],"5":[6,4],"6":[5,1],"7":[5,1],"8":[2,3],"9":[3,0],"10":[3,0,0,0],"11":[3,0],"12":[3,0],"13":[3,0],"14":[3,0],"15":[5,0],"16":[6,8],"17":[1,5],"18":[4,2],"19":[6,5],"20":[5,1],"21":[6,5],"22":[4,2],"23":[6,4],"24":[4,2],"25":[3,2],"26":[1,2],"27":[1,1],"28":[0,8],"29":[0,8],"30":[0,0],"31":[14,0],"32":[2,12],"33":[0,14],"34":[6,3,2,3,0],"35":[0,1],"36":[1,1],"37":[0,2],"38":[0,0],"39":[0,0],"40":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0aa99ef8f5d0d73d3f71435b788265284714b2b2"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\kustomer\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\kustomer\\util.js","statementMap":{"0":{"start":{"line":2,"column":14},"end":{"line":2,"column":30}},"1":{"start":{"line":3,"column":10},"end":{"line":3,"column":27}},"2":{"start":{"line":4,"column":12},"end":{"line":4,"column":32}},"3":{"start":{"line":5,"column":12},"end":{"line":5,"column":32}},"4":{"start":{"line":6,"column":26},"end":{"line":6,"column":45}},"5":{"start":{"line":7,"column":51},"end":{"line":7,"column":72}},"6":{"start":{"line":20,"column":17},"end":{"line":20,"column":92}},"7":{"start":{"line":24,"column":4},"end":{"line":24,"column":19}},"8":{"start":{"line":25,"column":4},"end":{"line":25,"column":43}},"9":{"start":{"line":30,"column":29},"end":{"line":37,"column":1}},"10":{"start":{"line":31,"column":20},"end":{"line":31,"column":22}},"11":{"start":{"line":32,"column":31},"end":{"line":32,"column":68}},"12":{"start":{"line":33,"column":2},"end":{"line":35,"column":3}},"13":{"start":{"line":34,"column":4},"end":{"line":34,"column":32}},"14":{"start":{"line":36,"column":2},"end":{"line":36,"column":50}},"15":{"start":{"line":39,"column":27},"end":{"line":46,"column":1}},"16":{"start":{"line":40,"column":20},"end":{"line":40,"column":22}},"17":{"start":{"line":41,"column":31},"end":{"line":41,"column":68}},"18":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"19":{"start":{"line":43,"column":4},"end":{"line":43,"column":32}},"20":{"start":{"line":45,"column":2},"end":{"line":45,"column":49}},"21":{"start":{"line":48,"column":30},"end":{"line":51,"column":1}},"22":{"start":{"line":49,"column":32},"end":{"line":49,"column":42}},"23":{"start":{"line":50,"column":2},"end":{"line":50,"column":31}},"24":{"start":{"line":53,"column":28},"end":{"line":56,"column":1}},"25":{"start":{"line":54,"column":32},"end":{"line":54,"column":78}},"26":{"start":{"line":54,"column":50},"end":{"line":54,"column":67}},"27":{"start":{"line":55,"column":2},"end":{"line":55,"column":31}},"28":{"start":{"line":58,"column":31},"end":{"line":61,"column":1}},"29":{"start":{"line":59,"column":31},"end":{"line":59,"column":55}},"30":{"start":{"line":60,"column":2},"end":{"line":60,"column":30}},"31":{"start":{"line":63,"column":23},"end":{"line":66,"column":1}},"32":{"start":{"line":64,"column":31},"end":{"line":64,"column":68}},"33":{"start":{"line":65,"column":2},"end":{"line":65,"column":30}},"34":{"start":{"line":68,"column":38},"end":{"line":108,"column":1}},"35":{"start":{"line":69,"column":19},"end":{"line":69,"column":37}},"36":{"start":{"line":70,"column":26},"end":{"line":70,"column":28}},"37":{"start":{"line":71,"column":18},"end":{"line":71,"column":41}},"38":{"start":{"line":72,"column":19},"end":{"line":72,"column":29}},"39":{"start":{"line":76,"column":2},"end":{"line":79,"column":3}},"40":{"start":{"line":77,"column":4},"end":{"line":77,"column":54}},"41":{"start":{"line":78,"column":4},"end":{"line":78,"column":52}},"42":{"start":{"line":81,"column":2},"end":{"line":103,"column":3}},"43":{"start":{"line":82,"column":4},"end":{"line":102,"column":7}},"44":{"start":{"line":83,"column":6},"end":{"line":101,"column":7}},"45":{"start":{"line":84,"column":8},"end":{"line":84,"column":71}},"46":{"start":{"line":85,"column":13},"end":{"line":101,"column":7}},"47":{"start":{"line":86,"column":8},"end":{"line":86,"column":69}},"48":{"start":{"line":87,"column":13},"end":{"line":101,"column":7}},"49":{"start":{"line":88,"column":8},"end":{"line":90,"column":10}},"50":{"start":{"line":91,"column":13},"end":{"line":101,"column":7}},"51":{"start":{"line":92,"column":8},"end":{"line":94,"column":10}},"52":{"start":{"line":95,"column":13},"end":{"line":101,"column":7}},"53":{"start":{"line":96,"column":8},"end":{"line":98,"column":10}},"54":{"start":{"line":100,"column":8},"end":{"line":100,"column":65}},"55":{"start":{"line":105,"column":2},"end":{"line":105,"column":56}},"56":{"start":{"line":107,"column":2},"end":{"line":107,"column":20}},"57":{"start":{"line":110,"column":23},"end":{"line":134,"column":1}},"58":{"start":{"line":111,"column":27},"end":{"line":111,"column":35}},"59":{"start":{"line":112,"column":2},"end":{"line":133,"column":3}},"60":{"start":{"line":114,"column":6},"end":{"line":119,"column":7}},"61":{"start":{"line":115,"column":8},"end":{"line":118,"column":10}},"62":{"start":{"line":120,"column":6},"end":{"line":125,"column":8}},"63":{"start":{"line":127,"column":6},"end":{"line":127,"column":35}},"64":{"start":{"line":129,"column":6},"end":{"line":132,"column":8}},"65":{"start":{"line":136,"column":22},"end":{"line":151,"column":1}},"66":{"start":{"line":138,"column":2},"end":{"line":149,"column":3}},"67":{"start":{"line":139,"column":4},"end":{"line":143,"column":7}},"68":{"start":{"line":145,"column":4},"end":{"line":147,"column":5}},"69":{"start":{"line":146,"column":6},"end":{"line":146,"column":42}},"70":{"start":{"line":148,"column":4},"end":{"line":148,"column":44}},"71":{"start":{"line":150,"column":2},"end":{"line":150,"column":34}},"72":{"start":{"line":153,"column":0},"end":{"line":157,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":23,"column":2},"end":{"line":23,"column":3}},"loc":{"start":{"line":23,"column":35},"end":{"line":26,"column":3}},"line":23},"1":{"name":"(anonymous_1)","decl":{"start":{"line":30,"column":29},"end":{"line":30,"column":30}},"loc":{"start":{"line":30,"column":42},"end":{"line":37,"column":1}},"line":30},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":27},"end":{"line":39,"column":28}},"loc":{"start":{"line":39,"column":40},"end":{"line":46,"column":1}},"line":39},"3":{"name":"(anonymous_3)","decl":{"start":{"line":48,"column":30},"end":{"line":48,"column":31}},"loc":{"start":{"line":48,"column":39},"end":{"line":51,"column":1}},"line":48},"4":{"name":"(anonymous_4)","decl":{"start":{"line":53,"column":28},"end":{"line":53,"column":29}},"loc":{"start":{"line":53,"column":40},"end":{"line":56,"column":1}},"line":53},"5":{"name":"(anonymous_5)","decl":{"start":{"line":54,"column":45},"end":{"line":54,"column":46}},"loc":{"start":{"line":54,"column":50},"end":{"line":54,"column":67}},"line":54},"6":{"name":"(anonymous_6)","decl":{"start":{"line":58,"column":31},"end":{"line":58,"column":32}},"loc":{"start":{"line":58,"column":43},"end":{"line":61,"column":1}},"line":58},"7":{"name":"(anonymous_7)","decl":{"start":{"line":63,"column":23},"end":{"line":63,"column":24}},"loc":{"start":{"line":63,"column":36},"end":{"line":66,"column":1}},"line":63},"8":{"name":"(anonymous_8)","decl":{"start":{"line":68,"column":38},"end":{"line":68,"column":39}},"loc":{"start":{"line":68,"column":47},"end":{"line":108,"column":1}},"line":68},"9":{"name":"(anonymous_9)","decl":{"start":{"line":82,"column":30},"end":{"line":82,"column":31}},"loc":{"start":{"line":82,"column":41},"end":{"line":102,"column":5}},"line":82},"10":{"name":"(anonymous_10)","decl":{"start":{"line":110,"column":23},"end":{"line":110,"column":24}},"loc":{"start":{"line":110,"column":35},"end":{"line":134,"column":1}},"line":110},"11":{"name":"(anonymous_11)","decl":{"start":{"line":136,"column":22},"end":{"line":136,"column":23}},"loc":{"start":{"line":136,"column":50},"end":{"line":151,"column":1}},"line":136}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":2},"end":{"line":35,"column":3}},"type":"if","locations":[{"start":{"line":33,"column":2},"end":{"line":35,"column":3}},{"start":{"line":33,"column":2},"end":{"line":35,"column":3}}],"line":33},"1":{"loc":{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":44,"column":3}},{"start":{"line":42,"column":2},"end":{"line":44,"column":3}}],"line":42},"2":{"loc":{"start":{"line":76,"column":2},"end":{"line":79,"column":3}},"type":"if","locations":[{"start":{"line":76,"column":2},"end":{"line":79,"column":3}},{"start":{"line":76,"column":2},"end":{"line":79,"column":3}}],"line":76},"3":{"loc":{"start":{"line":81,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":103,"column":3}},{"start":{"line":81,"column":2},"end":{"line":103,"column":3}}],"line":81},"4":{"loc":{"start":{"line":81,"column":6},"end":{"line":81,"column":49}},"type":"binary-expr","locations":[{"start":{"line":81,"column":6},"end":{"line":81,"column":31}},{"start":{"line":81,"column":35},"end":{"line":81,"column":49}}],"line":81},"5":{"loc":{"start":{"line":83,"column":6},"end":{"line":101,"column":7}},"type":"if","locations":[{"start":{"line":83,"column":6},"end":{"line":101,"column":7}},{"start":{"line":83,"column":6},"end":{"line":101,"column":7}}],"line":83},"6":{"loc":{"start":{"line":85,"column":13},"end":{"line":101,"column":7}},"type":"if","locations":[{"start":{"line":85,"column":13},"end":{"line":101,"column":7}},{"start":{"line":85,"column":13},"end":{"line":101,"column":7}}],"line":85},"7":{"loc":{"start":{"line":87,"column":13},"end":{"line":101,"column":7}},"type":"if","locations":[{"start":{"line":87,"column":13},"end":{"line":101,"column":7}},{"start":{"line":87,"column":13},"end":{"line":101,"column":7}}],"line":87},"8":{"loc":{"start":{"line":91,"column":13},"end":{"line":101,"column":7}},"type":"if","locations":[{"start":{"line":91,"column":13},"end":{"line":101,"column":7}},{"start":{"line":91,"column":13},"end":{"line":101,"column":7}}],"line":91},"9":{"loc":{"start":{"line":95,"column":13},"end":{"line":101,"column":7}},"type":"if","locations":[{"start":{"line":95,"column":13},"end":{"line":101,"column":7}},{"start":{"line":95,"column":13},"end":{"line":101,"column":7}}],"line":95},"10":{"loc":{"start":{"line":112,"column":2},"end":{"line":133,"column":3}},"type":"switch","locations":[{"start":{"line":113,"column":4},"end":{"line":125,"column":8}},{"start":{"line":126,"column":4},"end":{"line":127,"column":35}},{"start":{"line":128,"column":4},"end":{"line":132,"column":8}}],"line":112},"11":{"loc":{"start":{"line":114,"column":6},"end":{"line":119,"column":7}},"type":"if","locations":[{"start":{"line":114,"column":6},"end":{"line":119,"column":7}},{"start":{"line":114,"column":6},"end":{"line":119,"column":7}}],"line":114},"12":{"loc":{"start":{"line":114,"column":10},"end":{"line":114,"column":43}},"type":"binary-expr","locations":[{"start":{"line":114,"column":10},"end":{"line":114,"column":14}},{"start":{"line":114,"column":18},"end":{"line":114,"column":27}},{"start":{"line":114,"column":31},"end":{"line":114,"column":43}}],"line":114},"13":{"loc":{"start":{"line":122,"column":10},"end":{"line":122,"column":52}},"type":"cond-expr","locations":[{"start":{"line":122,"column":22},"end":{"line":122,"column":47}},{"start":{"line":122,"column":50},"end":{"line":122,"column":52}}],"line":122},"14":{"loc":{"start":{"line":130,"column":8},"end":{"line":130,"column":70}},"type":"cond-expr","locations":[{"start":{"line":130,"column":15},"end":{"line":130,"column":35}},{"start":{"line":130,"column":38},"end":{"line":130,"column":70}}],"line":130},"15":{"loc":{"start":{"line":131,"column":8},"end":{"line":131,"column":21}},"type":"binary-expr","locations":[{"start":{"line":131,"column":8},"end":{"line":131,"column":14}},{"start":{"line":131,"column":18},"end":{"line":131,"column":21}}],"line":131},"16":{"loc":{"start":{"line":145,"column":4},"end":{"line":147,"column":5}},"type":"if","locations":[{"start":{"line":145,"column":4},"end":{"line":147,"column":5}},{"start":{"line":145,"column":4},"end":{"line":147,"column":5}}],"line":145}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":0,"9":1,"10":0,"11":0,"12":0,"13":0,"14":0,"15":1,"16":0,"17":0,"18":0,"19":0,"20":0,"21":1,"22":0,"23":0,"24":1,"25":0,"26":0,"27":0,"28":1,"29":0,"30":0,"31":1,"32":0,"33":0,"34":1,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":1,"58":13,"59":13,"60":1,"61":1,"62":0,"63":12,"64":0,"65":1,"66":13,"67":13,"68":0,"69":0,"70":0,"71":13,"72":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":13,"11":13},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[1,12,0],"11":[1,0],"12":[1,1,1],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"6616862a8019eb7636e8303afbdb6ea607150646"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\leanplum\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\leanplum\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":23},"end":{"line":24,"column":1}},"2":{"start":{"line":26,"column":17},"end":{"line":26,"column":47}},"3":{"start":{"line":27,"column":20},"end":{"line":27,"column":27}},"4":{"start":{"line":29,"column":22},"end":{"line":29,"column":65}},"5":{"start":{"line":31,"column":0},"end":{"line":36,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"9234798995562105a2a06b06d12c0597a8e430f5"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\leanplum\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\leanplum\\transform.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":51}},"1":{"start":{"line":7,"column":4},"end":{"line":7,"column":23}},"2":{"start":{"line":16,"column":4},"end":{"line":16,"column":25}},"3":{"start":{"line":19,"column":22},"end":{"line":19,"column":41}},"4":{"start":{"line":20,"column":21},"end":{"line":25,"column":3}},"5":{"start":{"line":27,"column":2},"end":{"line":29,"column":3}},"6":{"start":{"line":28,"column":4},"end":{"line":28,"column":32}},"7":{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},"8":{"start":{"line":32,"column":4},"end":{"line":32,"column":30}},"9":{"start":{"line":37,"column":2},"end":{"line":40,"column":3}},"10":{"start":{"line":38,"column":20},"end":{"line":38,"column":77}},"11":{"start":{"line":39,"column":4},"end":{"line":39,"column":33}},"12":{"start":{"line":41,"column":2},"end":{"line":44,"column":3}},"13":{"start":{"line":42,"column":17},"end":{"line":42,"column":71}},"14":{"start":{"line":43,"column":4},"end":{"line":43,"column":27}},"15":{"start":{"line":46,"column":2},"end":{"line":46,"column":43}},"16":{"start":{"line":50,"column":19},"end":{"line":50,"column":41}},"17":{"start":{"line":51,"column":2},"end":{"line":51,"column":31}},"18":{"start":{"line":52,"column":2},"end":{"line":52,"column":59}},"19":{"start":{"line":53,"column":2},"end":{"line":55,"column":4}},"20":{"start":{"line":56,"column":2},"end":{"line":56,"column":40}},"21":{"start":{"line":57,"column":2},"end":{"line":57,"column":75}},"22":{"start":{"line":58,"column":2},"end":{"line":60,"column":4}},"23":{"start":{"line":62,"column":2},"end":{"line":62,"column":18}},"24":{"start":{"line":66,"column":2},"end":{"line":66,"column":75}},"25":{"start":{"line":70,"column":2},"end":{"line":75,"column":3}},"26":{"start":{"line":71,"column":4},"end":{"line":74,"column":6}},"27":{"start":{"line":76,"column":22},"end":{"line":76,"column":48}},"28":{"start":{"line":79,"column":2},"end":{"line":94,"column":3}},"29":{"start":{"line":81,"column":6},"end":{"line":81,"column":37}},"30":{"start":{"line":82,"column":6},"end":{"line":82,"column":12}},"31":{"start":{"line":84,"column":6},"end":{"line":84,"column":41}},"32":{"start":{"line":85,"column":6},"end":{"line":85,"column":12}},"33":{"start":{"line":87,"column":6},"end":{"line":87,"column":38}},"34":{"start":{"line":88,"column":6},"end":{"line":88,"column":12}},"35":{"start":{"line":90,"column":6},"end":{"line":90,"column":39}},"36":{"start":{"line":91,"column":6},"end":{"line":91,"column":12}},"37":{"start":{"line":93,"column":6},"end":{"line":93,"column":63}},"38":{"start":{"line":97,"column":19},"end":{"line":97,"column":72}},"39":{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},"40":{"start":{"line":101,"column":4},"end":{"line":101,"column":58}},"41":{"start":{"line":104,"column":2},"end":{"line":104,"column":18}},"42":{"start":{"line":109,"column":2},"end":{"line":116,"column":3}},"43":{"start":{"line":110,"column":4},"end":{"line":110,"column":70}},"44":{"start":{"line":112,"column":4},"end":{"line":115,"column":6}},"45":{"start":{"line":117,"column":2},"end":{"line":117,"column":18}},"46":{"start":{"line":120,"column":26},"end":{"line":157,"column":1}},"47":{"start":{"line":121,"column":2},"end":{"line":124,"column":3}},"48":{"start":{"line":122,"column":23},"end":{"line":122,"column":75}},"49":{"start":{"line":123,"column":4},"end":{"line":123,"column":24}},"50":{"start":{"line":126,"column":19},"end":{"line":155,"column":3}},"51":{"start":{"line":128,"column":6},"end":{"line":153,"column":7}},"52":{"start":{"line":129,"column":8},"end":{"line":136,"column":9}},"53":{"start":{"line":131,"column":10},"end":{"line":135,"column":12}},"54":{"start":{"line":138,"column":8},"end":{"line":142,"column":10}},"55":{"start":{"line":144,"column":8},"end":{"line":152,"column":10}},"56":{"start":{"line":156,"column":2},"end":{"line":156,"column":18}},"57":{"start":{"line":159,"column":0},"end":{"line":159,"column":48}}},"fnMap":{"0":{"name":"preparePayload","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":23}},"loc":{"start":{"line":18,"column":52},"end":{"line":47,"column":1}},"line":18},"1":{"name":"responseBuilderSimple","decl":{"start":{"line":49,"column":9},"end":{"line":49,"column":30}},"loc":{"start":{"line":49,"column":63},"end":{"line":63,"column":1}},"line":49},"2":{"name":"startSession","decl":{"start":{"line":65,"column":9},"end":{"line":65,"column":21}},"loc":{"start":{"line":65,"column":44},"end":{"line":67,"column":1}},"line":65},"3":{"name":"processSingleMessage","decl":{"start":{"line":69,"column":9},"end":{"line":69,"column":29}},"loc":{"start":{"line":69,"column":52},"end":{"line":105,"column":1}},"line":69},"4":{"name":"process","decl":{"start":{"line":107,"column":9},"end":{"line":107,"column":16}},"loc":{"start":{"line":107,"column":24},"end":{"line":118,"column":1}},"line":107},"5":{"name":"(anonymous_5)","decl":{"start":{"line":120,"column":26},"end":{"line":120,"column":27}},"loc":{"start":{"line":120,"column":42},"end":{"line":157,"column":1}},"line":120},"6":{"name":"(anonymous_6)","decl":{"start":{"line":127,"column":15},"end":{"line":127,"column":16}},"loc":{"start":{"line":127,"column":30},"end":{"line":154,"column":5}},"line":127}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":2},"end":{"line":29,"column":3}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":29,"column":3}},{"start":{"line":27,"column":2},"end":{"line":29,"column":3}}],"line":27},"1":{"loc":{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},"type":"if","locations":[{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},{"start":{"line":31,"column":2},"end":{"line":33,"column":3}}],"line":31},"2":{"loc":{"start":{"line":37,"column":2},"end":{"line":40,"column":3}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":40,"column":3}},{"start":{"line":37,"column":2},"end":{"line":40,"column":3}}],"line":37},"3":{"loc":{"start":{"line":41,"column":2},"end":{"line":44,"column":3}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":44,"column":3}},{"start":{"line":41,"column":2},"end":{"line":44,"column":3}}],"line":41},"4":{"loc":{"start":{"line":70,"column":2},"end":{"line":75,"column":3}},"type":"if","locations":[{"start":{"line":70,"column":2},"end":{"line":75,"column":3}},{"start":{"line":70,"column":2},"end":{"line":75,"column":3}}],"line":70},"5":{"loc":{"start":{"line":79,"column":2},"end":{"line":94,"column":3}},"type":"switch","locations":[{"start":{"line":80,"column":4},"end":{"line":82,"column":12}},{"start":{"line":83,"column":4},"end":{"line":85,"column":12}},{"start":{"line":86,"column":4},"end":{"line":88,"column":12}},{"start":{"line":89,"column":4},"end":{"line":91,"column":12}},{"start":{"line":92,"column":4},"end":{"line":93,"column":63}}],"line":79},"6":{"loc":{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},"type":"if","locations":[{"start":{"line":100,"column":2},"end":{"line":102,"column":3}},{"start":{"line":100,"column":2},"end":{"line":102,"column":3}}],"line":100},"7":{"loc":{"start":{"line":113,"column":6},"end":{"line":113,"column":38}},"type":"binary-expr","locations":[{"start":{"line":113,"column":6},"end":{"line":113,"column":19}},{"start":{"line":113,"column":23},"end":{"line":113,"column":38}}],"line":113},"8":{"loc":{"start":{"line":114,"column":6},"end":{"line":114,"column":25}},"type":"binary-expr","locations":[{"start":{"line":114,"column":6},"end":{"line":114,"column":18}},{"start":{"line":114,"column":22},"end":{"line":114,"column":25}}],"line":114},"9":{"loc":{"start":{"line":121,"column":2},"end":{"line":124,"column":3}},"type":"if","locations":[{"start":{"line":121,"column":2},"end":{"line":124,"column":3}},{"start":{"line":121,"column":2},"end":{"line":124,"column":3}}],"line":121},"10":{"loc":{"start":{"line":121,"column":6},"end":{"line":121,"column":50}},"type":"binary-expr","locations":[{"start":{"line":121,"column":6},"end":{"line":121,"column":28}},{"start":{"line":121,"column":32},"end":{"line":121,"column":50}}],"line":121},"11":{"loc":{"start":{"line":129,"column":8},"end":{"line":136,"column":9}},"type":"if","locations":[{"start":{"line":129,"column":8},"end":{"line":136,"column":9}},{"start":{"line":129,"column":8},"end":{"line":136,"column":9}}],"line":129},"12":{"loc":{"start":{"line":146,"column":10},"end":{"line":150,"column":17}},"type":"cond-expr","locations":[{"start":{"line":147,"column":14},"end":{"line":147,"column":35}},{"start":{"line":148,"column":14},"end":{"line":150,"column":17}}],"line":146},"13":{"loc":{"start":{"line":148,"column":14},"end":{"line":150,"column":17}},"type":"cond-expr","locations":[{"start":{"line":149,"column":14},"end":{"line":149,"column":24}},{"start":{"line":150,"column":14},"end":{"line":150,"column":17}}],"line":148},"14":{"loc":{"start":{"line":151,"column":10},"end":{"line":151,"column":69}},"type":"binary-expr","locations":[{"start":{"line":151,"column":10},"end":{"line":151,"column":23}},{"start":{"line":151,"column":27},"end":{"line":151,"column":69}}],"line":151}},"s":{"0":1,"1":1,"2":1,"3":29,"4":29,"5":27,"6":0,"7":27,"8":27,"9":27,"10":1,"11":1,"12":27,"13":27,"14":27,"15":27,"16":29,"17":29,"18":29,"19":29,"20":29,"21":29,"22":27,"23":27,"24":13,"25":16,"26":0,"27":16,"28":16,"29":2,"30":2,"31":1,"32":1,"33":2,"34":2,"35":11,"36":11,"37":0,"38":16,"39":14,"40":13,"41":1,"42":16,"43":16,"44":2,"45":14,"46":1,"47":1,"48":0,"49":0,"50":1,"51":2,"52":2,"53":0,"54":2,"55":0,"56":1,"57":1},"f":{"0":29,"1":29,"2":13,"3":16,"4":16,"5":1,"6":2},"b":{"0":[0,27],"1":[27,0],"2":[1,26],"3":[27,0],"4":[0,16],"5":[2,1,2,11,0],"6":[13,1],"7":[2,0],"8":[2,2],"9":[0,1],"10":[1,1],"11":[0,2],"12":[0,0],"13":[0,0],"14":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"6a53e507db69b29e2efed2d9b8a01ec3475c2f4f"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\mailchimp\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\mailchimp\\config.js","statementMap":{"0":{"start":{"line":1,"column":20},"end":{"line":5,"column":1}},"1":{"start":{"line":2,"column":23},"end":{"line":2,"column":42}},"2":{"start":{"line":3,"column":19},"end":{"line":3,"column":70}},"3":{"start":{"line":4,"column":2},"end":{"line":4,"column":37}},"4":{"start":{"line":7,"column":30},"end":{"line":11,"column":1}},"5":{"start":{"line":13,"column":27},"end":{"line":16,"column":1}},"6":{"start":{"line":18,"column":22},"end":{"line":24,"column":1}},"7":{"start":{"line":26,"column":0},"end":{"line":31,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":20},"end":{"line":1,"column":21}},"loc":{"start":{"line":1,"column":50},"end":{"line":5,"column":1}},"line":1}},"branchMap":{},"s":{"0":1,"1":28,"2":28,"3":28,"4":1,"5":1,"6":1,"7":1},"f":{"0":28},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"dc42930f15b937e66e902de950001770e58a179c"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\mailchimp\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\mailchimp\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":14},"end":{"line":2,"column":30}},"2":{"start":{"line":3,"column":12},"end":{"line":3,"column":26}},"3":{"start":{"line":4,"column":46},"end":{"line":4,"column":75}},"4":{"start":{"line":10,"column":4},"end":{"line":10,"column":23}},"5":{"start":{"line":20,"column":4},"end":{"line":20,"column":25}},"6":{"start":{"line":21,"column":15},"end":{"line":21,"column":41}},"7":{"start":{"line":25,"column":20},"end":{"line":25,"column":22}},"8":{"start":{"line":26,"column":17},"end":{"line":26,"column":45}},"9":{"start":{"line":27,"column":2},"end":{"line":29,"column":3}},"10":{"start":{"line":28,"column":4},"end":{"line":28,"column":31}},"11":{"start":{"line":30,"column":2},"end":{"line":30,"column":30}},"12":{"start":{"line":34,"column":2},"end":{"line":34,"column":79}},"13":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"14":{"start":{"line":39,"column":4},"end":{"line":39,"column":17}},"15":{"start":{"line":41,"column":15},"end":{"line":41,"column":25}},"16":{"start":{"line":42,"column":14},"end":{"line":42,"column":72}},"17":{"start":{"line":44,"column":15},"end":{"line":44,"column":20}},"18":{"start":{"line":45,"column":2},"end":{"line":55,"column":3}},"19":{"start":{"line":46,"column":4},"end":{"line":51,"column":7}},"20":{"start":{"line":52,"column":4},"end":{"line":52,"column":18}},"21":{"start":{"line":54,"column":4},"end":{"line":54,"column":32}},"22":{"start":{"line":56,"column":2},"end":{"line":56,"column":16}},"23":{"start":{"line":61,"column":14},"end":{"line":61,"column":56}},"24":{"start":{"line":62,"column":2},"end":{"line":74,"column":3}},"25":{"start":{"line":63,"column":4},"end":{"line":68,"column":7}},"26":{"start":{"line":70,"column":4},"end":{"line":73,"column":6}},"27":{"start":{"line":75,"column":2},"end":{"line":75,"column":38}},"28":{"start":{"line":79,"column":2},"end":{"line":79,"column":60}},"29":{"start":{"line":84,"column":15},"end":{"line":84,"column":25}},"30":{"start":{"line":85,"column":2},"end":{"line":85,"column":68}},"31":{"start":{"line":89,"column":16},"end":{"line":89,"column":58}},"32":{"start":{"line":90,"column":22},"end":{"line":90,"column":69}},"33":{"start":{"line":92,"column":19},"end":{"line":92,"column":41}},"34":{"start":{"line":93,"column":2},"end":{"line":99,"column":3}},"35":{"start":{"line":94,"column":4},"end":{"line":94,"column":71}},"36":{"start":{"line":95,"column":4},"end":{"line":95,"column":60}},"37":{"start":{"line":97,"column":4},"end":{"line":97,"column":61}},"38":{"start":{"line":98,"column":4},"end":{"line":98,"column":61}},"39":{"start":{"line":100,"column":2},"end":{"line":100,"column":31}},"40":{"start":{"line":101,"column":20},"end":{"line":103,"column":3}},"41":{"start":{"line":104,"column":2},"end":{"line":109,"column":3}},"42":{"start":{"line":105,"column":4},"end":{"line":108,"column":6}},"43":{"start":{"line":110,"column":2},"end":{"line":117,"column":4}},"44":{"start":{"line":127,"column":2},"end":{"line":146,"column":3}},"45":{"start":{"line":128,"column":23},"end":{"line":128,"column":25}},"46":{"start":{"line":129,"column":4},"end":{"line":129,"column":33}},"47":{"start":{"line":130,"column":4},"end":{"line":136,"column":7}},"48":{"start":{"line":131,"column":6},"end":{"line":135,"column":7}},"49":{"start":{"line":132,"column":8},"end":{"line":132,"column":66}},"50":{"start":{"line":134,"column":8},"end":{"line":134,"column":66}},"51":{"start":{"line":137,"column":4},"end":{"line":144,"column":7}},"52":{"start":{"line":138,"column":6},"end":{"line":143,"column":7}},"53":{"start":{"line":139,"column":8},"end":{"line":139,"column":49}},"54":{"start":{"line":140,"column":13},"end":{"line":143,"column":7}},"55":{"start":{"line":141,"column":20},"end":{"line":141,"column":41}},"56":{"start":{"line":142,"column":8},"end":{"line":142,"column":53}},"57":{"start":{"line":145,"column":4},"end":{"line":145,"column":22}},"58":{"start":{"line":148,"column":16},"end":{"line":148,"column":58}},"59":{"start":{"line":149,"column":2},"end":{"line":169,"column":3}},"60":{"start":{"line":150,"column":23},"end":{"line":150,"column":25}},"61":{"start":{"line":151,"column":4},"end":{"line":151,"column":33}},"62":{"start":{"line":153,"column":4},"end":{"line":160,"column":7}},"63":{"start":{"line":154,"column":6},"end":{"line":159,"column":7}},"64":{"start":{"line":155,"column":8},"end":{"line":155,"column":49}},"65":{"start":{"line":157,"column":20},"end":{"line":157,"column":41}},"66":{"start":{"line":158,"column":8},"end":{"line":158,"column":53}},"67":{"start":{"line":162,"column":4},"end":{"line":167,"column":5}},"68":{"start":{"line":163,"column":28},"end":{"line":163,"column":69}},"69":{"start":{"line":164,"column":6},"end":{"line":166,"column":40}},"70":{"start":{"line":168,"column":4},"end":{"line":168,"column":22}},"71":{"start":{"line":170,"column":2},"end":{"line":170,"column":14}},"72":{"start":{"line":174,"column":30},"end":{"line":174,"column":66}},"73":{"start":{"line":175,"column":2},"end":{"line":178,"column":3}},"74":{"start":{"line":176,"column":4},"end":{"line":176,"column":35}},"75":{"start":{"line":177,"column":4},"end":{"line":177,"column":55}},"76":{"start":{"line":180,"column":17},"end":{"line":180,"column":60}},"77":{"start":{"line":182,"column":29},"end":{"line":184,"column":15}},"78":{"start":{"line":186,"column":16},"end":{"line":186,"column":58}},"79":{"start":{"line":187,"column":2},"end":{"line":189,"column":3}},"80":{"start":{"line":188,"column":4},"end":{"line":188,"column":65}},"81":{"start":{"line":191,"column":22},"end":{"line":191,"column":69}},"82":{"start":{"line":193,"column":21},"end":{"line":199,"column":3}},"83":{"start":{"line":200,"column":2},"end":{"line":200,"column":27}},"84":{"start":{"line":204,"column":21},"end":{"line":204,"column":52}},"85":{"start":{"line":205,"column":26},"end":{"line":205,"column":28}},"86":{"start":{"line":206,"column":2},"end":{"line":225,"column":5}},"87":{"start":{"line":207,"column":4},"end":{"line":224,"column":5}},"88":{"start":{"line":209,"column":8},"end":{"line":209,"column":62}},"89":{"start":{"line":210,"column":8},"end":{"line":210,"column":14}},"90":{"start":{"line":212,"column":8},"end":{"line":212,"column":66}},"91":{"start":{"line":213,"column":8},"end":{"line":213,"column":14}},"92":{"start":{"line":215,"column":8},"end":{"line":215,"column":68}},"93":{"start":{"line":216,"column":8},"end":{"line":216,"column":14}},"94":{"start":{"line":218,"column":8},"end":{"line":219,"column":47}},"95":{"start":{"line":220,"column":8},"end":{"line":220,"column":14}},"96":{"start":{"line":222,"column":8},"end":{"line":222,"column":59}},"97":{"start":{"line":223,"column":8},"end":{"line":223,"column":14}},"98":{"start":{"line":227,"column":26},"end":{"line":227,"column":59}},"99":{"start":{"line":228,"column":2},"end":{"line":233,"column":3}},"100":{"start":{"line":229,"column":25},"end":{"line":229,"column":65}},"101":{"start":{"line":230,"column":4},"end":{"line":232,"column":5}},"102":{"start":{"line":231,"column":6},"end":{"line":231,"column":68}},"103":{"start":{"line":234,"column":2},"end":{"line":234,"column":25}},"104":{"start":{"line":238,"column":26},"end":{"line":238,"column":66}},"105":{"start":{"line":239,"column":21},"end":{"line":239,"column":71}},"106":{"start":{"line":240,"column":2},"end":{"line":240,"column":69}},"107":{"start":{"line":244,"column":2},"end":{"line":246,"column":3}},"108":{"start":{"line":245,"column":4},"end":{"line":245,"column":80}},"109":{"start":{"line":248,"column":2},"end":{"line":248,"column":47}},"110":{"start":{"line":252,"column":2},"end":{"line":252,"column":64}},"111":{"start":{"line":255,"column":26},"end":{"line":292,"column":1}},"112":{"start":{"line":256,"column":2},"end":{"line":259,"column":3}},"113":{"start":{"line":257,"column":23},"end":{"line":257,"column":75}},"114":{"start":{"line":258,"column":4},"end":{"line":258,"column":24}},"115":{"start":{"line":261,"column":19},"end":{"line":290,"column":3}},"116":{"start":{"line":263,"column":6},"end":{"line":288,"column":7}},"117":{"start":{"line":264,"column":8},"end":{"line":271,"column":9}},"118":{"start":{"line":266,"column":10},"end":{"line":270,"column":12}},"119":{"start":{"line":273,"column":8},"end":{"line":277,"column":10}},"120":{"start":{"line":279,"column":8},"end":{"line":287,"column":10}},"121":{"start":{"line":291,"column":2},"end":{"line":291,"column":18}},"122":{"start":{"line":294,"column":0},"end":{"line":294,"column":48}}},"fnMap":{"0":{"name":"filterTagValue","decl":{"start":{"line":24,"column":9},"end":{"line":24,"column":23}},"loc":{"start":{"line":24,"column":29},"end":{"line":31,"column":1}},"line":24},"1":{"name":"getMailChimpEndpoint","decl":{"start":{"line":33,"column":9},"end":{"line":33,"column":29}},"loc":{"start":{"line":33,"column":47},"end":{"line":35,"column":1}},"line":33},"2":{"name":"checkIfMailExists","decl":{"start":{"line":37,"column":15},"end":{"line":37,"column":32}},"loc":{"start":{"line":37,"column":57},"end":{"line":57,"column":1}},"line":37},"3":{"name":"checkIfDoubleOptIn","decl":{"start":{"line":59,"column":15},"end":{"line":59,"column":33}},"loc":{"start":{"line":59,"column":51},"end":{"line":76,"column":1}},"line":59},"4":{"name":"getSubscribeUserUrl","decl":{"start":{"line":78,"column":9},"end":{"line":78,"column":28}},"loc":{"start":{"line":78,"column":46},"end":{"line":80,"column":1}},"line":78},"5":{"name":"getUpdateUserTraitsUrl","decl":{"start":{"line":83,"column":9},"end":{"line":83,"column":31}},"loc":{"start":{"line":83,"column":56},"end":{"line":86,"column":1}},"line":83},"6":{"name":"responseBuilderSimple","decl":{"start":{"line":88,"column":15},"end":{"line":88,"column":36}},"loc":{"start":{"line":88,"column":72},"end":{"line":118,"column":1}},"line":88},"7":{"name":"getPayload","decl":{"start":{"line":120,"column":15},"end":{"line":120,"column":25}},"loc":{"start":{"line":126,"column":2},"end":{"line":171,"column":1}},"line":126},"8":{"name":"(anonymous_8)","decl":{"start":{"line":130,"column":56},"end":{"line":130,"column":57}},"loc":{"start":{"line":130,"column":65},"end":{"line":136,"column":5}},"line":130},"9":{"name":"(anonymous_9)","decl":{"start":{"line":137,"column":32},"end":{"line":137,"column":33}},"loc":{"start":{"line":137,"column":41},"end":{"line":144,"column":5}},"line":137},"10":{"name":"(anonymous_10)","decl":{"start":{"line":153,"column":32},"end":{"line":153,"column":33}},"loc":{"start":{"line":153,"column":41},"end":{"line":160,"column":5}},"line":153},"11":{"name":"getTransformedJSON","decl":{"start":{"line":173,"column":15},"end":{"line":173,"column":33}},"loc":{"start":{"line":173,"column":60},"end":{"line":201,"column":1}},"line":173},"12":{"name":"getMailChimpConfig","decl":{"start":{"line":203,"column":9},"end":{"line":203,"column":27}},"loc":{"start":{"line":203,"column":50},"end":{"line":235,"column":1}},"line":203},"13":{"name":"(anonymous_13)","decl":{"start":{"line":206,"column":21},"end":{"line":206,"column":22}},"loc":{"start":{"line":206,"column":28},"end":{"line":225,"column":3}},"line":206},"14":{"name":"processIdentify","decl":{"start":{"line":237,"column":15},"end":{"line":237,"column":30}},"loc":{"start":{"line":237,"column":53},"end":{"line":241,"column":1}},"line":237},"15":{"name":"processSingleMessage","decl":{"start":{"line":243,"column":15},"end":{"line":243,"column":35}},"loc":{"start":{"line":243,"column":58},"end":{"line":249,"column":1}},"line":243},"16":{"name":"process","decl":{"start":{"line":251,"column":15},"end":{"line":251,"column":22}},"loc":{"start":{"line":251,"column":30},"end":{"line":253,"column":1}},"line":251},"17":{"name":"(anonymous_17)","decl":{"start":{"line":255,"column":26},"end":{"line":255,"column":27}},"loc":{"start":{"line":255,"column":42},"end":{"line":292,"column":1}},"line":255},"18":{"name":"(anonymous_18)","decl":{"start":{"line":262,"column":15},"end":{"line":262,"column":16}},"loc":{"start":{"line":262,"column":30},"end":{"line":289,"column":5}},"line":262}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":2},"end":{"line":29,"column":3}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":29,"column":3}},{"start":{"line":27,"column":2},"end":{"line":29,"column":3}}],"line":27},"1":{"loc":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},{"start":{"line":38,"column":2},"end":{"line":40,"column":3}}],"line":38},"2":{"loc":{"start":{"line":72,"column":6},"end":{"line":72,"column":25}},"type":"binary-expr","locations":[{"start":{"line":72,"column":6},"end":{"line":72,"column":18}},{"start":{"line":72,"column":22},"end":{"line":72,"column":25}}],"line":72},"3":{"loc":{"start":{"line":93,"column":2},"end":{"line":99,"column":3}},"type":"if","locations":[{"start":{"line":93,"column":2},"end":{"line":99,"column":3}},{"start":{"line":93,"column":2},"end":{"line":99,"column":3}}],"line":93},"4":{"loc":{"start":{"line":104,"column":2},"end":{"line":109,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":109,"column":3}},{"start":{"line":104,"column":2},"end":{"line":109,"column":3}}],"line":104},"5":{"loc":{"start":{"line":104,"column":6},"end":{"line":104,"column":63}},"type":"binary-expr","locations":[{"start":{"line":104,"column":6},"end":{"line":104,"column":20}},{"start":{"line":104,"column":24},"end":{"line":104,"column":63}}],"line":104},"6":{"loc":{"start":{"line":116,"column":12},"end":{"line":116,"column":65}},"type":"cond-expr","locations":[{"start":{"line":116,"column":29},"end":{"line":116,"column":43}},{"start":{"line":116,"column":46},"end":{"line":116,"column":65}}],"line":116},"7":{"loc":{"start":{"line":127,"column":2},"end":{"line":146,"column":3}},"type":"if","locations":[{"start":{"line":127,"column":2},"end":{"line":146,"column":3}},{"start":{"line":127,"column":2},"end":{"line":146,"column":3}}],"line":127},"8":{"loc":{"start":{"line":127,"column":6},"end":{"line":127,"column":53}},"type":"binary-expr","locations":[{"start":{"line":127,"column":6},"end":{"line":127,"column":38}},{"start":{"line":127,"column":42},"end":{"line":127,"column":53}}],"line":127},"9":{"loc":{"start":{"line":131,"column":6},"end":{"line":135,"column":7}},"type":"if","locations":[{"start":{"line":131,"column":6},"end":{"line":135,"column":7}},{"start":{"line":131,"column":6},"end":{"line":135,"column":7}}],"line":131},"10":{"loc":{"start":{"line":138,"column":6},"end":{"line":143,"column":7}},"type":"if","locations":[{"start":{"line":138,"column":6},"end":{"line":143,"column":7}},{"start":{"line":138,"column":6},"end":{"line":143,"column":7}}],"line":138},"11":{"loc":{"start":{"line":140,"column":13},"end":{"line":143,"column":7}},"type":"if","locations":[{"start":{"line":140,"column":13},"end":{"line":143,"column":7}},{"start":{"line":140,"column":13},"end":{"line":143,"column":7}}],"line":140},"12":{"loc":{"start":{"line":149,"column":2},"end":{"line":169,"column":3}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":169,"column":3}},{"start":{"line":149,"column":2},"end":{"line":169,"column":3}}],"line":149},"13":{"loc":{"start":{"line":154,"column":6},"end":{"line":159,"column":7}},"type":"if","locations":[{"start":{"line":154,"column":6},"end":{"line":159,"column":7}},{"start":{"line":154,"column":6},"end":{"line":159,"column":7}}],"line":154},"14":{"loc":{"start":{"line":162,"column":4},"end":{"line":167,"column":5}},"type":"if","locations":[{"start":{"line":162,"column":4},"end":{"line":167,"column":5}},{"start":{"line":162,"column":4},"end":{"line":167,"column":5}}],"line":162},"15":{"loc":{"start":{"line":164,"column":26},"end":{"line":166,"column":39}},"type":"cond-expr","locations":[{"start":{"line":165,"column":10},"end":{"line":165,"column":36}},{"start":{"line":166,"column":10},"end":{"line":166,"column":39}}],"line":164},"16":{"loc":{"start":{"line":175,"column":2},"end":{"line":178,"column":3}},"type":"if","locations":[{"start":{"line":175,"column":2},"end":{"line":178,"column":3}},{"start":{"line":175,"column":2},"end":{"line":178,"column":3}}],"line":175},"17":{"loc":{"start":{"line":182,"column":29},"end":{"line":184,"column":15}},"type":"cond-expr","locations":[{"start":{"line":183,"column":6},"end":{"line":183,"column":36}},{"start":{"line":184,"column":6},"end":{"line":184,"column":15}}],"line":182},"18":{"loc":{"start":{"line":187,"column":2},"end":{"line":189,"column":3}},"type":"if","locations":[{"start":{"line":187,"column":2},"end":{"line":189,"column":3}},{"start":{"line":187,"column":2},"end":{"line":189,"column":3}}],"line":187},"19":{"loc":{"start":{"line":207,"column":4},"end":{"line":224,"column":5}},"type":"switch","locations":[{"start":{"line":208,"column":6},"end":{"line":210,"column":14}},{"start":{"line":211,"column":6},"end":{"line":213,"column":14}},{"start":{"line":214,"column":6},"end":{"line":216,"column":14}},{"start":{"line":217,"column":6},"end":{"line":220,"column":14}},{"start":{"line":221,"column":6},"end":{"line":223,"column":14}}],"line":207},"20":{"loc":{"start":{"line":228,"column":2},"end":{"line":233,"column":3}},"type":"if","locations":[{"start":{"line":228,"column":2},"end":{"line":233,"column":3}},{"start":{"line":228,"column":2},"end":{"line":233,"column":3}}],"line":228},"21":{"loc":{"start":{"line":230,"column":4},"end":{"line":232,"column":5}},"type":"if","locations":[{"start":{"line":230,"column":4},"end":{"line":232,"column":5}},{"start":{"line":230,"column":4},"end":{"line":232,"column":5}}],"line":230},"22":{"loc":{"start":{"line":244,"column":2},"end":{"line":246,"column":3}},"type":"if","locations":[{"start":{"line":244,"column":2},"end":{"line":246,"column":3}},{"start":{"line":244,"column":2},"end":{"line":246,"column":3}}],"line":244},"23":{"loc":{"start":{"line":256,"column":2},"end":{"line":259,"column":3}},"type":"if","locations":[{"start":{"line":256,"column":2},"end":{"line":259,"column":3}},{"start":{"line":256,"column":2},"end":{"line":259,"column":3}}],"line":256},"24":{"loc":{"start":{"line":256,"column":6},"end":{"line":256,"column":50}},"type":"binary-expr","locations":[{"start":{"line":256,"column":6},"end":{"line":256,"column":28}},{"start":{"line":256,"column":32},"end":{"line":256,"column":50}}],"line":256},"25":{"loc":{"start":{"line":264,"column":8},"end":{"line":271,"column":9}},"type":"if","locations":[{"start":{"line":264,"column":8},"end":{"line":271,"column":9}},{"start":{"line":264,"column":8},"end":{"line":271,"column":9}}],"line":264},"26":{"loc":{"start":{"line":281,"column":10},"end":{"line":285,"column":17}},"type":"cond-expr","locations":[{"start":{"line":282,"column":14},"end":{"line":282,"column":35}},{"start":{"line":283,"column":14},"end":{"line":285,"column":17}}],"line":281},"27":{"loc":{"start":{"line":283,"column":14},"end":{"line":285,"column":17}},"type":"cond-expr","locations":[{"start":{"line":284,"column":14},"end":{"line":284,"column":24}},{"start":{"line":285,"column":14},"end":{"line":285,"column":17}}],"line":283},"28":{"loc":{"start":{"line":286,"column":10},"end":{"line":286,"column":69}},"type":"binary-expr","locations":[{"start":{"line":286,"column":10},"end":{"line":286,"column":23}},{"start":{"line":286,"column":27},"end":{"line":286,"column":69}}],"line":286}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":13,"8":13,"9":13,"10":7,"11":6,"12":28,"13":17,"14":0,"15":17,"16":17,"17":17,"18":17,"19":17,"20":13,"21":4,"22":17,"23":2,"24":2,"25":2,"26":1,"27":1,"28":2,"29":7,"30":7,"31":9,"32":9,"33":9,"34":9,"35":7,"36":7,"37":2,"38":2,"39":9,"40":9,"41":9,"42":1,"43":8,"44":8,"45":3,"46":3,"47":3,"48":3,"49":3,"50":0,"51":3,"52":6,"53":3,"54":3,"55":2,"56":2,"57":3,"58":5,"59":5,"60":5,"61":5,"62":5,"63":16,"64":5,"65":11,"66":11,"67":5,"68":2,"69":1,"70":4,"71":0,"72":11,"73":11,"74":2,"75":2,"76":9,"77":9,"78":9,"79":9,"80":1,"81":8,"82":8,"83":7,"84":11,"85":11,"86":11,"87":35,"88":11,"89":11,"90":11,"91":11,"92":11,"93":11,"94":2,"95":2,"96":0,"97":0,"98":11,"99":11,"100":0,"101":0,"102":0,"103":11,"104":11,"105":11,"106":9,"107":12,"108":1,"109":11,"110":12,"111":1,"112":1,"113":0,"114":0,"115":1,"116":2,"117":2,"118":0,"119":2,"120":0,"121":1,"122":1},"f":{"0":13,"1":28,"2":17,"3":2,"4":2,"5":7,"6":9,"7":8,"8":3,"9":6,"10":16,"11":11,"12":11,"13":35,"14":11,"15":12,"16":12,"17":1,"18":2},"b":{"0":[7,6],"1":[0,17],"2":[1,0],"3":[7,2],"4":[1,8],"5":[9,6],"6":[8,0],"7":[3,5],"8":[8,3],"9":[3,0],"10":[3,3],"11":[2,1],"12":[5,0],"13":[5,11],"14":[2,3],"15":[0,1],"16":[2,9],"17":[3,6],"18":[1,8],"19":[11,11,11,2,0],"20":[0,11],"21":[0,0],"22":[1,11],"23":[0,1],"24":[1,1],"25":[0,2],"26":[0,0],"27":[0,0],"28":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"9fefefb953d696055446c32a8fdcac122675be4f"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\marketo\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\marketo\\config.js","statementMap":{"0":{"start":{"line":1,"column":47},"end":{"line":1,"column":68}},"1":{"start":{"line":3,"column":26},"end":{"line":5,"column":1}},"2":{"start":{"line":7,"column":27},"end":{"line":7,"column":48}},"3":{"start":{"line":8,"column":24},"end":{"line":8,"column":42}},"4":{"start":{"line":9,"column":27},"end":{"line":9,"column":48}},"5":{"start":{"line":11,"column":23},"end":{"line":11,"column":69}},"6":{"start":{"line":12,"column":20},"end":{"line":12,"column":29}},"7":{"start":{"line":14,"column":21},"end":{"line":46,"column":1}},"8":{"start":{"line":15,"column":2},"end":{"line":45,"column":4}},"9":{"start":{"line":48,"column":0},"end":{"line":55,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":21},"end":{"line":14,"column":22}},"loc":{"start":{"line":14,"column":36},"end":{"line":46,"column":1}},"line":14}},"branchMap":{"0":{"loc":{"start":{"line":42,"column":19},"end":{"line":44,"column":12}},"type":"cond-expr","locations":[{"start":{"line":43,"column":8},"end":{"line":43,"column":55}},{"start":{"line":44,"column":8},"end":{"line":44,"column":12}}],"line":42}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":27,"9":2},"f":{"0":27},"b":{"0":[2,25]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"93b735b3bfce37ee8f87e3415bc54eecfa66ce93"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\marketo\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\marketo\\transform.js","statementMap":{"0":{"start":{"line":4,"column":12},"end":{"line":4,"column":32}},"1":{"start":{"line":5,"column":14},"end":{"line":5,"column":44}},"2":{"start":{"line":6,"column":46},"end":{"line":6,"column":75}},"3":{"start":{"line":14,"column":4},"end":{"line":14,"column":23}},"4":{"start":{"line":29,"column":4},"end":{"line":29,"column":25}},"5":{"start":{"line":30,"column":21},"end":{"line":30,"column":48}},"6":{"start":{"line":31,"column":14},"end":{"line":31,"column":41}},"7":{"start":{"line":36,"column":4},"end":{"line":36,"column":34}},"8":{"start":{"line":41,"column":4},"end":{"line":41,"column":21}},"9":{"start":{"line":43,"column":24},"end":{"line":43,"column":54}},"10":{"start":{"line":44,"column":23},"end":{"line":44,"column":53}},"11":{"start":{"line":45,"column":18},"end":{"line":45,"column":43}},"12":{"start":{"line":55,"column":21},"end":{"line":80,"column":1}},"13":{"start":{"line":56,"column":2},"end":{"line":79,"column":5}},"14":{"start":{"line":57,"column":50},"end":{"line":57,"column":70}},"15":{"start":{"line":58,"column":27},"end":{"line":67,"column":5}},"16":{"start":{"line":68,"column":17},"end":{"line":72,"column":5}},"17":{"start":{"line":73,"column":4},"end":{"line":76,"column":5}},"18":{"start":{"line":74,"column":6},"end":{"line":74,"column":68}},"19":{"start":{"line":75,"column":6},"end":{"line":75,"column":31}},"20":{"start":{"line":77,"column":4},"end":{"line":77,"column":65}},"21":{"start":{"line":78,"column":4},"end":{"line":78,"column":16}},"22":{"start":{"line":97,"column":27},"end":{"line":138,"column":1}},"23":{"start":{"line":103,"column":2},"end":{"line":137,"column":5}},"24":{"start":{"line":104,"column":22},"end":{"line":104,"column":59}},"25":{"start":{"line":105,"column":4},"end":{"line":108,"column":7}},"26":{"start":{"line":109,"column":26},"end":{"line":109,"column":46}},"27":{"start":{"line":110,"column":27},"end":{"line":124,"column":5}},"28":{"start":{"line":125,"column":17},"end":{"line":129,"column":5}},"29":{"start":{"line":130,"column":4},"end":{"line":135,"column":5}},"30":{"start":{"line":131,"column":25},"end":{"line":131,"column":29}},"31":{"start":{"line":132,"column":6},"end":{"line":134,"column":7}},"32":{"start":{"line":133,"column":8},"end":{"line":133,"column":28}},"33":{"start":{"line":136,"column":4},"end":{"line":136,"column":16}},"34":{"start":{"line":145,"column":29},"end":{"line":169,"column":1}},"35":{"start":{"line":146,"column":2},"end":{"line":168,"column":5}},"36":{"start":{"line":147,"column":4},"end":{"line":147,"column":79}},"37":{"start":{"line":148,"column":27},"end":{"line":155,"column":5}},"38":{"start":{"line":156,"column":17},"end":{"line":160,"column":5}},"39":{"start":{"line":161,"column":4},"end":{"line":166,"column":5}},"40":{"start":{"line":162,"column":25},"end":{"line":162,"column":29}},"41":{"start":{"line":163,"column":6},"end":{"line":165,"column":7}},"42":{"start":{"line":164,"column":8},"end":{"line":164,"column":28}},"43":{"start":{"line":167,"column":4},"end":{"line":167,"column":16}},"44":{"start":{"line":177,"column":26},"end":{"line":208,"column":1}},"45":{"start":{"line":183,"column":2},"end":{"line":207,"column":5}},"46":{"start":{"line":184,"column":4},"end":{"line":184,"column":80}},"47":{"start":{"line":185,"column":27},"end":{"line":194,"column":5}},"48":{"start":{"line":195,"column":17},"end":{"line":199,"column":5}},"49":{"start":{"line":200,"column":4},"end":{"line":205,"column":5}},"50":{"start":{"line":201,"column":25},"end":{"line":201,"column":29}},"51":{"start":{"line":202,"column":6},"end":{"line":204,"column":7}},"52":{"start":{"line":203,"column":8},"end":{"line":203,"column":28}},"53":{"start":{"line":206,"column":4},"end":{"line":206,"column":16}},"54":{"start":{"line":210,"column":18},"end":{"line":300,"column":1}},"55":{"start":{"line":219,"column":17},"end":{"line":219,"column":64}},"56":{"start":{"line":220,"column":16},"end":{"line":220,"column":58}},"57":{"start":{"line":228,"column":15},"end":{"line":229,"column":26}},"58":{"start":{"line":230,"column":2},"end":{"line":232,"column":3}},"59":{"start":{"line":231,"column":4},"end":{"line":231,"column":64}},"60":{"start":{"line":235,"column":2},"end":{"line":248,"column":3}},"61":{"start":{"line":237,"column":4},"end":{"line":247,"column":5}},"62":{"start":{"line":238,"column":6},"end":{"line":238,"column":78}},"63":{"start":{"line":241,"column":6},"end":{"line":246,"column":8}},"64":{"start":{"line":251,"column":2},"end":{"line":274,"column":3}},"65":{"start":{"line":253,"column":4},"end":{"line":273,"column":5}},"66":{"start":{"line":254,"column":6},"end":{"line":259,"column":8}},"67":{"start":{"line":261,"column":6},"end":{"line":272,"column":17}},"68":{"start":{"line":276,"column":2},"end":{"line":297,"column":3}},"69":{"start":{"line":283,"column":4},"end":{"line":296,"column":15}},"70":{"start":{"line":299,"column":2},"end":{"line":299,"column":16}},"71":{"start":{"line":309,"column":24},"end":{"line":390,"column":1}},"72":{"start":{"line":311,"column":2},"end":{"line":313,"column":3}},"73":{"start":{"line":312,"column":4},"end":{"line":312,"column":35}},"74":{"start":{"line":315,"column":42},"end":{"line":315,"column":62}},"75":{"start":{"line":317,"column":17},"end":{"line":317,"column":60}},"76":{"start":{"line":318,"column":2},"end":{"line":329,"column":3}},"77":{"start":{"line":319,"column":4},"end":{"line":328,"column":15}},"78":{"start":{"line":331,"column":17},"end":{"line":331,"column":70}},"79":{"start":{"line":333,"column":18},"end":{"line":333,"column":58}},"80":{"start":{"line":335,"column":2},"end":{"line":343,"column":3}},"81":{"start":{"line":336,"column":4},"end":{"line":339,"column":7}},"82":{"start":{"line":337,"column":18},"end":{"line":337,"column":29}},"83":{"start":{"line":338,"column":6},"end":{"line":338,"column":45}},"84":{"start":{"line":340,"column":4},"end":{"line":340,"column":49}},"85":{"start":{"line":342,"column":4},"end":{"line":342,"column":46}},"86":{"start":{"line":345,"column":17},"end":{"line":345,"column":64}},"87":{"start":{"line":346,"column":19},"end":{"line":349,"column":3}},"88":{"start":{"line":350,"column":2},"end":{"line":352,"column":3}},"89":{"start":{"line":351,"column":4},"end":{"line":351,"column":29}},"90":{"start":{"line":353,"column":17},"end":{"line":353,"column":71}},"91":{"start":{"line":354,"column":16},"end":{"line":358,"column":3}},"92":{"start":{"line":360,"column":2},"end":{"line":382,"column":3}},"93":{"start":{"line":361,"column":27},"end":{"line":364,"column":5}},"94":{"start":{"line":366,"column":4},"end":{"line":381,"column":5}},"95":{"start":{"line":367,"column":6},"end":{"line":367,"column":94}},"96":{"start":{"line":372,"column":6},"end":{"line":374,"column":7}},"97":{"start":{"line":373,"column":8},"end":{"line":373,"column":34}},"98":{"start":{"line":375,"column":20},"end":{"line":375,"column":51}},"99":{"start":{"line":376,"column":6},"end":{"line":380,"column":8}},"100":{"start":{"line":383,"column":2},"end":{"line":389,"column":4}},"101":{"start":{"line":395,"column":21},"end":{"line":497,"column":1}},"102":{"start":{"line":411,"column":6},"end":{"line":411,"column":26}},"103":{"start":{"line":413,"column":17},"end":{"line":413,"column":64}},"104":{"start":{"line":414,"column":2},"end":{"line":426,"column":3}},"105":{"start":{"line":415,"column":4},"end":{"line":425,"column":15}},"106":{"start":{"line":428,"column":25},"end":{"line":428,"column":62}},"107":{"start":{"line":429,"column":2},"end":{"line":441,"column":3}},"108":{"start":{"line":430,"column":4},"end":{"line":440,"column":15}},"109":{"start":{"line":443,"column":29},"end":{"line":443,"column":71}},"110":{"start":{"line":444,"column":32},"end":{"line":447,"column":3}},"111":{"start":{"line":448,"column":2},"end":{"line":460,"column":3}},"112":{"start":{"line":449,"column":4},"end":{"line":459,"column":15}},"113":{"start":{"line":463,"column":17},"end":{"line":463,"column":70}},"114":{"start":{"line":466,"column":20},"end":{"line":466,"column":22}},"115":{"start":{"line":467,"column":2},"end":{"line":475,"column":5}},"116":{"start":{"line":469,"column":4},"end":{"line":474,"column":5}},"117":{"start":{"line":470,"column":20},"end":{"line":470,"column":43}},"118":{"start":{"line":471,"column":6},"end":{"line":473,"column":7}},"119":{"start":{"line":472,"column":8},"end":{"line":472,"column":75}},"120":{"start":{"line":477,"column":18},"end":{"line":487,"column":3}},"121":{"start":{"line":490,"column":2},"end":{"line":490,"column":38}},"122":{"start":{"line":492,"column":2},"end":{"line":496,"column":4}},"123":{"start":{"line":499,"column":24},"end":{"line":506,"column":1}},"124":{"start":{"line":500,"column":15},"end":{"line":500,"column":37}},"125":{"start":{"line":501,"column":2},"end":{"line":501,"column":36}},"126":{"start":{"line":502,"column":2},"end":{"line":502,"column":55}},"127":{"start":{"line":503,"column":2},"end":{"line":503,"column":77}},"128":{"start":{"line":504,"column":2},"end":{"line":504,"column":36}},"129":{"start":{"line":505,"column":2},"end":{"line":505,"column":14}},"130":{"start":{"line":508,"column":21},"end":{"line":548,"column":1}},"131":{"start":{"line":509,"column":2},"end":{"line":520,"column":3}},"132":{"start":{"line":510,"column":4},"end":{"line":519,"column":15}},"133":{"start":{"line":521,"column":22},"end":{"line":521,"column":48}},"134":{"start":{"line":522,"column":31},"end":{"line":522,"column":56}},"135":{"start":{"line":525,"column":2},"end":{"line":544,"column":3}},"136":{"start":{"line":527,"column":6},"end":{"line":527,"column":77}},"137":{"start":{"line":528,"column":6},"end":{"line":528,"column":12}},"138":{"start":{"line":530,"column":6},"end":{"line":530,"column":74}},"139":{"start":{"line":531,"column":6},"end":{"line":531,"column":12}},"140":{"start":{"line":533,"column":6},"end":{"line":543,"column":17}},"141":{"start":{"line":547,"column":2},"end":{"line":547,"column":35}},"142":{"start":{"line":550,"column":16},"end":{"line":565,"column":1}},"143":{"start":{"line":551,"column":16},"end":{"line":551,"column":67}},"144":{"start":{"line":552,"column":2},"end":{"line":562,"column":3}},"145":{"start":{"line":553,"column":4},"end":{"line":561,"column":15}},"146":{"start":{"line":563,"column":19},"end":{"line":563,"column":78}},"147":{"start":{"line":564,"column":2},"end":{"line":564,"column":18}},"148":{"start":{"line":567,"column":26},"end":{"line":640,"column":1}},"149":{"start":{"line":570,"column":2},"end":{"line":573,"column":3}},"150":{"start":{"line":571,"column":23},"end":{"line":571,"column":75}},"151":{"start":{"line":572,"column":4},"end":{"line":572,"column":24}},"152":{"start":{"line":575,"column":2},"end":{"line":590,"column":3}},"153":{"start":{"line":576,"column":4},"end":{"line":576,"column":68}},"154":{"start":{"line":578,"column":19},"end":{"line":582,"column":5}},"155":{"start":{"line":583,"column":23},"end":{"line":588,"column":5}},"156":{"start":{"line":584,"column":26},"end":{"line":584,"column":40}},"157":{"start":{"line":589,"column":4},"end":{"line":589,"column":24}},"158":{"start":{"line":593,"column":2},"end":{"line":611,"column":3}},"159":{"start":{"line":594,"column":20},"end":{"line":603,"column":5}},"160":{"start":{"line":604,"column":23},"end":{"line":609,"column":5}},"161":{"start":{"line":605,"column":26},"end":{"line":605,"column":40}},"162":{"start":{"line":610,"column":4},"end":{"line":610,"column":24}},"163":{"start":{"line":616,"column":19},"end":{"line":638,"column":3}},"164":{"start":{"line":618,"column":6},"end":{"line":636,"column":7}},"165":{"start":{"line":619,"column":8},"end":{"line":623,"column":10}},"166":{"start":{"line":625,"column":23},"end":{"line":629,"column":9}},"167":{"start":{"line":630,"column":8},"end":{"line":635,"column":10}},"168":{"start":{"line":639,"column":2},"end":{"line":639,"column":18}},"169":{"start":{"line":642,"column":0},"end":{"line":642,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":55,"column":21},"end":{"line":55,"column":22}},"loc":{"start":{"line":55,"column":51},"end":{"line":80,"column":1}},"line":55},"1":{"name":"(anonymous_1)","decl":{"start":{"line":56,"column":48},"end":{"line":56,"column":49}},"loc":{"start":{"line":56,"column":60},"end":{"line":79,"column":3}},"line":56},"2":{"name":"(anonymous_2)","decl":{"start":{"line":97,"column":27},"end":{"line":97,"column":28}},"loc":{"start":{"line":102,"column":5},"end":{"line":138,"column":1}},"line":102},"3":{"name":"(anonymous_3)","decl":{"start":{"line":103,"column":52},"end":{"line":103,"column":53}},"loc":{"start":{"line":103,"column":64},"end":{"line":137,"column":3}},"line":103},"4":{"name":"(anonymous_4)","decl":{"start":{"line":145,"column":29},"end":{"line":145,"column":30}},"loc":{"start":{"line":145,"column":75},"end":{"line":169,"column":1}},"line":145},"5":{"name":"(anonymous_5)","decl":{"start":{"line":146,"column":35},"end":{"line":146,"column":36}},"loc":{"start":{"line":146,"column":47},"end":{"line":168,"column":3}},"line":146},"6":{"name":"(anonymous_6)","decl":{"start":{"line":177,"column":26},"end":{"line":177,"column":27}},"loc":{"start":{"line":182,"column":5},"end":{"line":208,"column":1}},"line":182},"7":{"name":"(anonymous_7)","decl":{"start":{"line":183,"column":52},"end":{"line":183,"column":53}},"loc":{"start":{"line":183,"column":64},"end":{"line":207,"column":3}},"line":183},"8":{"name":"(anonymous_8)","decl":{"start":{"line":210,"column":18},"end":{"line":210,"column":19}},"loc":{"start":{"line":210,"column":66},"end":{"line":300,"column":1}},"line":210},"9":{"name":"(anonymous_9)","decl":{"start":{"line":309,"column":24},"end":{"line":309,"column":25}},"loc":{"start":{"line":309,"column":72},"end":{"line":390,"column":1}},"line":309},"10":{"name":"(anonymous_10)","decl":{"start":{"line":336,"column":42},"end":{"line":336,"column":43}},"loc":{"start":{"line":336,"column":49},"end":{"line":339,"column":5}},"line":336},"11":{"name":"(anonymous_11)","decl":{"start":{"line":395,"column":21},"end":{"line":395,"column":22}},"loc":{"start":{"line":395,"column":69},"end":{"line":497,"column":1}},"line":395},"12":{"name":"(anonymous_12)","decl":{"start":{"line":467,"column":49},"end":{"line":467,"column":50}},"loc":{"start":{"line":467,"column":56},"end":{"line":475,"column":3}},"line":467},"13":{"name":"(anonymous_13)","decl":{"start":{"line":499,"column":24},"end":{"line":499,"column":25}},"loc":{"start":{"line":499,"column":36},"end":{"line":506,"column":1}},"line":499},"14":{"name":"(anonymous_14)","decl":{"start":{"line":508,"column":21},"end":{"line":508,"column":22}},"loc":{"start":{"line":508,"column":60},"end":{"line":548,"column":1}},"line":508},"15":{"name":"(anonymous_15)","decl":{"start":{"line":550,"column":16},"end":{"line":550,"column":17}},"loc":{"start":{"line":550,"column":31},"end":{"line":565,"column":1}},"line":550},"16":{"name":"(anonymous_16)","decl":{"start":{"line":567,"column":26},"end":{"line":567,"column":27}},"loc":{"start":{"line":567,"column":42},"end":{"line":640,"column":1}},"line":567},"17":{"name":"(anonymous_17)","decl":{"start":{"line":584,"column":17},"end":{"line":584,"column":18}},"loc":{"start":{"line":584,"column":26},"end":{"line":584,"column":40}},"line":584},"18":{"name":"(anonymous_18)","decl":{"start":{"line":605,"column":17},"end":{"line":605,"column":18}},"loc":{"start":{"line":605,"column":26},"end":{"line":605,"column":40}},"line":605},"19":{"name":"(anonymous_19)","decl":{"start":{"line":617,"column":15},"end":{"line":617,"column":16}},"loc":{"start":{"line":617,"column":30},"end":{"line":637,"column":5}},"line":617}},"branchMap":{"0":{"loc":{"start":{"line":73,"column":4},"end":{"line":76,"column":5}},"type":"if","locations":[{"start":{"line":73,"column":4},"end":{"line":76,"column":5}},{"start":{"line":73,"column":4},"end":{"line":76,"column":5}}],"line":73},"1":{"loc":{"start":{"line":103,"column":29},"end":{"line":103,"column":50}},"type":"binary-expr","locations":[{"start":{"line":103,"column":29},"end":{"line":103,"column":35}},{"start":{"line":103,"column":39},"end":{"line":103,"column":50}}],"line":103},"2":{"loc":{"start":{"line":104,"column":22},"end":{"line":104,"column":59}},"type":"cond-expr","locations":[{"start":{"line":104,"column":31},"end":{"line":104,"column":41}},{"start":{"line":104,"column":44},"end":{"line":104,"column":59}}],"line":104},"3":{"loc":{"start":{"line":116,"column":21},"end":{"line":116,"column":54}},"type":"cond-expr","locations":[{"start":{"line":116,"column":30},"end":{"line":116,"column":38}},{"start":{"line":116,"column":41},"end":{"line":116,"column":54}}],"line":116},"4":{"loc":{"start":{"line":130,"column":4},"end":{"line":135,"column":5}},"type":"if","locations":[{"start":{"line":130,"column":4},"end":{"line":135,"column":5}},{"start":{"line":130,"column":4},"end":{"line":135,"column":5}}],"line":130},"5":{"loc":{"start":{"line":132,"column":6},"end":{"line":134,"column":7}},"type":"if","locations":[{"start":{"line":132,"column":6},"end":{"line":134,"column":7}},{"start":{"line":132,"column":6},"end":{"line":134,"column":7}}],"line":132},"6":{"loc":{"start":{"line":132,"column":10},"end":{"line":132,"column":62}},"type":"binary-expr","locations":[{"start":{"line":132,"column":10},"end":{"line":132,"column":16}},{"start":{"line":132,"column":20},"end":{"line":132,"column":41}},{"start":{"line":132,"column":45},"end":{"line":132,"column":62}}],"line":132},"7":{"loc":{"start":{"line":161,"column":4},"end":{"line":166,"column":5}},"type":"if","locations":[{"start":{"line":161,"column":4},"end":{"line":166,"column":5}},{"start":{"line":161,"column":4},"end":{"line":166,"column":5}}],"line":161},"8":{"loc":{"start":{"line":163,"column":6},"end":{"line":165,"column":7}},"type":"if","locations":[{"start":{"line":163,"column":6},"end":{"line":165,"column":7}},{"start":{"line":163,"column":6},"end":{"line":165,"column":7}}],"line":163},"9":{"loc":{"start":{"line":163,"column":10},"end":{"line":163,"column":62}},"type":"binary-expr","locations":[{"start":{"line":163,"column":10},"end":{"line":163,"column":16}},{"start":{"line":163,"column":20},"end":{"line":163,"column":41}},{"start":{"line":163,"column":45},"end":{"line":163,"column":62}}],"line":163},"10":{"loc":{"start":{"line":183,"column":29},"end":{"line":183,"column":50}},"type":"binary-expr","locations":[{"start":{"line":183,"column":29},"end":{"line":183,"column":35}},{"start":{"line":183,"column":39},"end":{"line":183,"column":50}}],"line":183},"11":{"loc":{"start":{"line":189,"column":24},"end":{"line":189,"column":45}},"type":"binary-expr","locations":[{"start":{"line":189,"column":24},"end":{"line":189,"column":30}},{"start":{"line":189,"column":34},"end":{"line":189,"column":45}}],"line":189},"12":{"loc":{"start":{"line":190,"column":22},"end":{"line":190,"column":55}},"type":"cond-expr","locations":[{"start":{"line":190,"column":31},"end":{"line":190,"column":39}},{"start":{"line":190,"column":42},"end":{"line":190,"column":55}}],"line":190},"13":{"loc":{"start":{"line":200,"column":4},"end":{"line":205,"column":5}},"type":"if","locations":[{"start":{"line":200,"column":4},"end":{"line":205,"column":5}},{"start":{"line":200,"column":4},"end":{"line":205,"column":5}}],"line":200},"14":{"loc":{"start":{"line":202,"column":6},"end":{"line":204,"column":7}},"type":"if","locations":[{"start":{"line":202,"column":6},"end":{"line":204,"column":7}},{"start":{"line":202,"column":6},"end":{"line":204,"column":7}}],"line":202},"15":{"loc":{"start":{"line":202,"column":10},"end":{"line":202,"column":62}},"type":"binary-expr","locations":[{"start":{"line":202,"column":10},"end":{"line":202,"column":16}},{"start":{"line":202,"column":20},"end":{"line":202,"column":41}},{"start":{"line":202,"column":45},"end":{"line":202,"column":62}}],"line":202},"16":{"loc":{"start":{"line":230,"column":2},"end":{"line":232,"column":3}},"type":"if","locations":[{"start":{"line":230,"column":2},"end":{"line":232,"column":3}},{"start":{"line":230,"column":2},"end":{"line":232,"column":3}}],"line":230},"17":{"loc":{"start":{"line":235,"column":2},"end":{"line":248,"column":3}},"type":"if","locations":[{"start":{"line":235,"column":2},"end":{"line":248,"column":3}},{"start":{"line":235,"column":2},"end":{"line":248,"column":3}}],"line":235},"18":{"loc":{"start":{"line":237,"column":4},"end":{"line":247,"column":5}},"type":"if","locations":[{"start":{"line":237,"column":4},"end":{"line":247,"column":5}},{"start":{"line":237,"column":4},"end":{"line":247,"column":5}}],"line":237},"19":{"loc":{"start":{"line":251,"column":2},"end":{"line":274,"column":3}},"type":"if","locations":[{"start":{"line":251,"column":2},"end":{"line":274,"column":3}},{"start":{"line":251,"column":2},"end":{"line":274,"column":3}}],"line":251},"20":{"loc":{"start":{"line":253,"column":4},"end":{"line":273,"column":5}},"type":"if","locations":[{"start":{"line":253,"column":4},"end":{"line":273,"column":5}},{"start":{"line":253,"column":4},"end":{"line":273,"column":5}}],"line":253},"21":{"loc":{"start":{"line":276,"column":2},"end":{"line":297,"column":3}},"type":"if","locations":[{"start":{"line":276,"column":2},"end":{"line":297,"column":3}},{"start":{"line":276,"column":2},"end":{"line":297,"column":3}}],"line":276},"22":{"loc":{"start":{"line":311,"column":2},"end":{"line":313,"column":3}},"type":"if","locations":[{"start":{"line":311,"column":2},"end":{"line":313,"column":3}},{"start":{"line":311,"column":2},"end":{"line":313,"column":3}}],"line":311},"23":{"loc":{"start":{"line":318,"column":2},"end":{"line":329,"column":3}},"type":"if","locations":[{"start":{"line":318,"column":2},"end":{"line":329,"column":3}},{"start":{"line":318,"column":2},"end":{"line":329,"column":3}}],"line":318},"24":{"loc":{"start":{"line":335,"column":2},"end":{"line":343,"column":3}},"type":"if","locations":[{"start":{"line":335,"column":2},"end":{"line":343,"column":3}},{"start":{"line":335,"column":2},"end":{"line":343,"column":3}}],"line":335},"25":{"loc":{"start":{"line":350,"column":2},"end":{"line":352,"column":3}},"type":"if","locations":[{"start":{"line":350,"column":2},"end":{"line":352,"column":3}},{"start":{"line":350,"column":2},"end":{"line":352,"column":3}}],"line":350},"26":{"loc":{"start":{"line":360,"column":2},"end":{"line":382,"column":3}},"type":"if","locations":[{"start":{"line":360,"column":2},"end":{"line":382,"column":3}},{"start":{"line":360,"column":2},"end":{"line":382,"column":3}}],"line":360},"27":{"loc":{"start":{"line":366,"column":4},"end":{"line":381,"column":5}},"type":"if","locations":[{"start":{"line":366,"column":4},"end":{"line":381,"column":5}},{"start":{"line":366,"column":4},"end":{"line":381,"column":5}}],"line":366},"28":{"loc":{"start":{"line":372,"column":6},"end":{"line":374,"column":7}},"type":"if","locations":[{"start":{"line":372,"column":6},"end":{"line":374,"column":7}},{"start":{"line":372,"column":6},"end":{"line":374,"column":7}}],"line":372},"29":{"loc":{"start":{"line":414,"column":2},"end":{"line":426,"column":3}},"type":"if","locations":[{"start":{"line":414,"column":2},"end":{"line":426,"column":3}},{"start":{"line":414,"column":2},"end":{"line":426,"column":3}}],"line":414},"30":{"loc":{"start":{"line":414,"column":8},"end":{"line":414,"column":38}},"type":"binary-expr","locations":[{"start":{"line":414,"column":8},"end":{"line":414,"column":28}},{"start":{"line":414,"column":32},"end":{"line":414,"column":38}}],"line":414},"31":{"loc":{"start":{"line":429,"column":2},"end":{"line":441,"column":3}},"type":"if","locations":[{"start":{"line":429,"column":2},"end":{"line":441,"column":3}},{"start":{"line":429,"column":2},"end":{"line":441,"column":3}}],"line":429},"32":{"loc":{"start":{"line":448,"column":2},"end":{"line":460,"column":3}},"type":"if","locations":[{"start":{"line":448,"column":2},"end":{"line":460,"column":3}},{"start":{"line":448,"column":2},"end":{"line":460,"column":3}}],"line":448},"33":{"loc":{"start":{"line":469,"column":4},"end":{"line":474,"column":5}},"type":"if","locations":[{"start":{"line":469,"column":4},"end":{"line":474,"column":5}},{"start":{"line":469,"column":4},"end":{"line":474,"column":5}}],"line":469},"34":{"loc":{"start":{"line":471,"column":6},"end":{"line":473,"column":7}},"type":"if","locations":[{"start":{"line":471,"column":6},"end":{"line":473,"column":7}},{"start":{"line":471,"column":6},"end":{"line":473,"column":7}}],"line":471},"35":{"loc":{"start":{"line":509,"column":2},"end":{"line":520,"column":3}},"type":"if","locations":[{"start":{"line":509,"column":2},"end":{"line":520,"column":3}},{"start":{"line":509,"column":2},"end":{"line":520,"column":3}}],"line":509},"36":{"loc":{"start":{"line":525,"column":2},"end":{"line":544,"column":3}},"type":"switch","locations":[{"start":{"line":526,"column":4},"end":{"line":528,"column":12}},{"start":{"line":529,"column":4},"end":{"line":531,"column":12}},{"start":{"line":532,"column":4},"end":{"line":543,"column":17}}],"line":525},"37":{"loc":{"start":{"line":552,"column":2},"end":{"line":562,"column":3}},"type":"if","locations":[{"start":{"line":552,"column":2},"end":{"line":562,"column":3}},{"start":{"line":552,"column":2},"end":{"line":562,"column":3}}],"line":552},"38":{"loc":{"start":{"line":570,"column":2},"end":{"line":573,"column":3}},"type":"if","locations":[{"start":{"line":570,"column":2},"end":{"line":573,"column":3}},{"start":{"line":570,"column":2},"end":{"line":573,"column":3}}],"line":570},"39":{"loc":{"start":{"line":570,"column":6},"end":{"line":570,"column":50}},"type":"binary-expr","locations":[{"start":{"line":570,"column":6},"end":{"line":570,"column":28}},{"start":{"line":570,"column":32},"end":{"line":570,"column":50}}],"line":570},"40":{"loc":{"start":{"line":585,"column":6},"end":{"line":585,"column":25}},"type":"binary-expr","locations":[{"start":{"line":585,"column":6},"end":{"line":585,"column":18}},{"start":{"line":585,"column":22},"end":{"line":585,"column":25}}],"line":585},"41":{"loc":{"start":{"line":586,"column":6},"end":{"line":586,"column":65}},"type":"binary-expr","locations":[{"start":{"line":586,"column":6},"end":{"line":586,"column":19}},{"start":{"line":586,"column":23},"end":{"line":586,"column":65}}],"line":586},"42":{"loc":{"start":{"line":593,"column":2},"end":{"line":611,"column":3}},"type":"if","locations":[{"start":{"line":593,"column":2},"end":{"line":611,"column":3}},{"start":{"line":593,"column":2},"end":{"line":611,"column":3}}],"line":593},"43":{"loc":{"start":{"line":632,"column":10},"end":{"line":632,"column":29}},"type":"binary-expr","locations":[{"start":{"line":632,"column":10},"end":{"line":632,"column":22}},{"start":{"line":632,"column":26},"end":{"line":632,"column":29}}],"line":632},"44":{"loc":{"start":{"line":633,"column":10},"end":{"line":633,"column":69}},"type":"binary-expr","locations":[{"start":{"line":633,"column":10},"end":{"line":633,"column":23}},{"start":{"line":633,"column":27},"end":{"line":633,"column":69}}],"line":633}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":2,"11":2,"12":2,"13":14,"14":4,"15":4,"16":4,"17":3,"18":3,"19":3,"20":0,"21":0,"22":2,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":2,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":2,"45":7,"46":4,"47":4,"48":4,"49":4,"50":4,"51":4,"52":4,"53":0,"54":2,"55":8,"56":8,"57":8,"58":8,"59":7,"60":8,"61":7,"62":0,"63":7,"64":8,"65":0,"66":0,"67":0,"68":8,"69":0,"70":8,"71":2,"72":3,"73":1,"74":3,"75":3,"76":3,"77":1,"78":2,"79":2,"80":2,"81":1,"82":1,"83":1,"84":1,"85":1,"86":2,"87":2,"88":2,"89":1,"90":2,"91":2,"92":2,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":2,"101":2,"102":9,"103":9,"104":9,"105":1,"106":8,"107":8,"108":1,"109":7,"110":7,"111":7,"112":1,"113":6,"114":6,"115":6,"116":7,"117":1,"118":1,"119":1,"120":6,"121":6,"122":6,"123":2,"124":8,"125":8,"126":8,"127":8,"128":8,"129":8,"130":2,"131":14,"132":1,"133":13,"134":13,"135":13,"136":3,"137":2,"138":9,"139":6,"140":1,"141":8,"142":2,"143":12,"144":11,"145":0,"146":11,"147":5,"148":2,"149":2,"150":0,"151":0,"152":2,"153":2,"154":0,"155":0,"156":0,"157":0,"158":2,"159":0,"160":0,"161":0,"162":0,"163":2,"164":3,"165":3,"166":0,"167":0,"168":2,"169":2},"f":{"0":14,"1":4,"2":0,"3":0,"4":0,"5":0,"6":7,"7":4,"8":8,"9":3,"10":1,"11":9,"12":7,"13":8,"14":14,"15":12,"16":2,"17":0,"18":0,"19":3},"b":{"0":[3,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0,0],"7":[0,0],"8":[0,0],"9":[0,0,0],"10":[7,6],"11":[4,3],"12":[1,3],"13":[4,0],"14":[4,0],"15":[4,4,4],"16":[7,1],"17":[7,1],"18":[0,7],"19":[0,8],"20":[0,0],"21":[0,8],"22":[1,2],"23":[1,2],"24":[1,1],"25":[1,1],"26":[1,1],"27":[1,0],"28":[1,0],"29":[1,8],"30":[9,2],"31":[1,7],"32":[1,6],"33":[1,6],"34":[1,0],"35":[1,13],"36":[3,9,1],"37":[0,11],"38":[0,2],"39":[2,2],"40":[0,0],"41":[0,0],"42":[0,2],"43":[0,0],"44":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"607d5d07fbf7ec0631c7dd0a6619385c11246832"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\marketo\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\marketo\\util.js","statementMap":{"0":{"start":{"line":5,"column":4},"end":{"line":5,"column":40}},"1":{"start":{"line":9,"column":4},"end":{"line":9,"column":51}},"2":{"start":{"line":10,"column":32},"end":{"line":10,"column":59}},"3":{"start":{"line":11,"column":31},"end":{"line":11,"column":61}},"4":{"start":{"line":12,"column":21},"end":{"line":12,"column":48}},"5":{"start":{"line":14,"column":32},"end":{"line":14,"column":60}},"6":{"start":{"line":15,"column":32},"end":{"line":15,"column":74}},"7":{"start":{"line":16,"column":32},"end":{"line":16,"column":67}},"8":{"start":{"line":17,"column":24},"end":{"line":17,"column":43}},"9":{"start":{"line":20,"column":39},"end":{"line":73,"column":1}},"10":{"start":{"line":25,"column":23},"end":{"line":25,"column":38}},"11":{"start":{"line":26,"column":21},"end":{"line":26,"column":29}},"12":{"start":{"line":27,"column":2},"end":{"line":72,"column":3}},"13":{"start":{"line":28,"column":4},"end":{"line":41,"column":15}},"14":{"start":{"line":42,"column":9},"end":{"line":72,"column":3}},"15":{"start":{"line":43,"column":4},"end":{"line":56,"column":15}},"16":{"start":{"line":57,"column":9},"end":{"line":72,"column":3}},"17":{"start":{"line":58,"column":4},"end":{"line":71,"column":15}},"18":{"start":{"line":75,"column":31},"end":{"line":103,"column":1}},"19":{"start":{"line":76,"column":31},"end":{"line":76,"column":43}},"20":{"start":{"line":77,"column":2},"end":{"line":90,"column":3}},"21":{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},"22":{"start":{"line":80,"column":6},"end":{"line":80,"column":22}},"23":{"start":{"line":83,"column":4},"end":{"line":85,"column":5}},"24":{"start":{"line":84,"column":6},"end":{"line":84,"column":22}},"25":{"start":{"line":87,"column":4},"end":{"line":89,"column":5}},"26":{"start":{"line":88,"column":6},"end":{"line":88,"column":73}},"27":{"start":{"line":92,"column":2},"end":{"line":102,"column":13}},"28":{"start":{"line":111,"column":23},"end":{"line":115,"column":1}},"29":{"start":{"line":112,"column":25},"end":{"line":112,"column":52}},"30":{"start":{"line":113,"column":28},"end":{"line":113,"column":64}},"31":{"start":{"line":114,"column":2},"end":{"line":114,"column":27}},"32":{"start":{"line":123,"column":24},"end":{"line":127,"column":1}},"33":{"start":{"line":124,"column":25},"end":{"line":124,"column":53}},"34":{"start":{"line":125,"column":28},"end":{"line":125,"column":64}},"35":{"start":{"line":126,"column":2},"end":{"line":126,"column":27}},"36":{"start":{"line":130,"column":24},"end":{"line":162,"column":1}},"37":{"start":{"line":131,"column":18},"end":{"line":131,"column":79}},"38":{"start":{"line":132,"column":21},"end":{"line":132,"column":40}},"39":{"start":{"line":134,"column":2},"end":{"line":149,"column":3}},"40":{"start":{"line":135,"column":4},"end":{"line":148,"column":15}},"41":{"start":{"line":151,"column":2},"end":{"line":155,"column":4}},"42":{"start":{"line":157,"column":2},"end":{"line":161,"column":4}},"43":{"start":{"line":164,"column":23},"end":{"line":168,"column":1}},"44":{"start":{"line":165,"column":2},"end":{"line":165,"column":41}},"45":{"start":{"line":166,"column":2},"end":{"line":166,"column":28}},"46":{"start":{"line":167,"column":2},"end":{"line":167,"column":51}},"47":{"start":{"line":170,"column":0},"end":{"line":175,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":20,"column":39},"end":{"line":20,"column":40}},"loc":{"start":{"line":24,"column":5},"end":{"line":73,"column":1}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":75,"column":31},"end":{"line":75,"column":32}},"loc":{"start":{"line":75,"column":71},"end":{"line":103,"column":1}},"line":75},"2":{"name":"(anonymous_2)","decl":{"start":{"line":111,"column":23},"end":{"line":111,"column":24}},"loc":{"start":{"line":111,"column":47},"end":{"line":115,"column":1}},"line":111},"3":{"name":"(anonymous_3)","decl":{"start":{"line":123,"column":24},"end":{"line":123,"column":25}},"loc":{"start":{"line":123,"column":54},"end":{"line":127,"column":1}},"line":123},"4":{"name":"(anonymous_4)","decl":{"start":{"line":130,"column":24},"end":{"line":130,"column":25}},"loc":{"start":{"line":130,"column":56},"end":{"line":162,"column":1}},"line":130},"5":{"name":"(anonymous_5)","decl":{"start":{"line":164,"column":23},"end":{"line":164,"column":24}},"loc":{"start":{"line":164,"column":34},"end":{"line":168,"column":1}},"line":164}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":2},"end":{"line":72,"column":3}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":72,"column":3}},{"start":{"line":27,"column":2},"end":{"line":72,"column":3}}],"line":27},"1":{"loc":{"start":{"line":27,"column":6},"end":{"line":27,"column":68}},"type":"binary-expr","locations":[{"start":{"line":27,"column":6},"end":{"line":27,"column":12}},{"start":{"line":27,"column":16},"end":{"line":27,"column":68}}],"line":27},"2":{"loc":{"start":{"line":42,"column":9},"end":{"line":72,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":9},"end":{"line":72,"column":3}},{"start":{"line":42,"column":9},"end":{"line":72,"column":3}}],"line":42},"3":{"loc":{"start":{"line":42,"column":13},"end":{"line":42,"column":75}},"type":"binary-expr","locations":[{"start":{"line":42,"column":13},"end":{"line":42,"column":19}},{"start":{"line":42,"column":23},"end":{"line":42,"column":75}}],"line":42},"4":{"loc":{"start":{"line":57,"column":9},"end":{"line":72,"column":3}},"type":"if","locations":[{"start":{"line":57,"column":9},"end":{"line":72,"column":3}},{"start":{"line":57,"column":9},"end":{"line":72,"column":3}}],"line":57},"5":{"loc":{"start":{"line":57,"column":13},"end":{"line":57,"column":75}},"type":"binary-expr","locations":[{"start":{"line":57,"column":13},"end":{"line":57,"column":19}},{"start":{"line":57,"column":23},"end":{"line":57,"column":75}}],"line":57},"6":{"loc":{"start":{"line":77,"column":2},"end":{"line":90,"column":3}},"type":"if","locations":[{"start":{"line":77,"column":2},"end":{"line":90,"column":3}},{"start":{"line":77,"column":2},"end":{"line":90,"column":3}}],"line":77},"7":{"loc":{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},"type":"if","locations":[{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},{"start":{"line":79,"column":4},"end":{"line":81,"column":5}}],"line":79},"8":{"loc":{"start":{"line":79,"column":8},"end":{"line":79,"column":41}},"type":"binary-expr","locations":[{"start":{"line":79,"column":8},"end":{"line":79,"column":16}},{"start":{"line":79,"column":20},"end":{"line":79,"column":41}}],"line":79},"9":{"loc":{"start":{"line":83,"column":4},"end":{"line":85,"column":5}},"type":"if","locations":[{"start":{"line":83,"column":4},"end":{"line":85,"column":5}},{"start":{"line":83,"column":4},"end":{"line":85,"column":5}}],"line":83},"10":{"loc":{"start":{"line":83,"column":8},"end":{"line":83,"column":36}},"type":"binary-expr","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":16}},{"start":{"line":83,"column":20},"end":{"line":83,"column":36}}],"line":83},"11":{"loc":{"start":{"line":87,"column":4},"end":{"line":89,"column":5}},"type":"if","locations":[{"start":{"line":87,"column":4},"end":{"line":89,"column":5}},{"start":{"line":87,"column":4},"end":{"line":89,"column":5}}],"line":87},"12":{"loc":{"start":{"line":87,"column":8},"end":{"line":87,"column":37}},"type":"binary-expr","locations":[{"start":{"line":87,"column":8},"end":{"line":87,"column":16}},{"start":{"line":87,"column":20},"end":{"line":87,"column":37}}],"line":87},"13":{"loc":{"start":{"line":134,"column":2},"end":{"line":149,"column":3}},"type":"if","locations":[{"start":{"line":134,"column":2},"end":{"line":149,"column":3}},{"start":{"line":134,"column":2},"end":{"line":149,"column":3}}],"line":134}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":2,"7":2,"8":2,"9":2,"10":1,"11":1,"12":1,"13":0,"14":1,"15":0,"16":1,"17":1,"18":2,"19":8,"20":8,"21":8,"22":3,"23":5,"24":4,"25":1,"26":1,"27":0,"28":2,"29":8,"30":8,"31":8,"32":2,"33":0,"34":0,"35":0,"36":2,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":2,"44":0,"45":0,"46":0,"47":2},"f":{"0":1,"1":8,"2":8,"3":0,"4":0,"5":0},"b":{"0":[0,1],"1":[1,1],"2":[0,1],"3":[1,1],"4":[1,0],"5":[1,1],"6":[8,0],"7":[3,5],"8":[8,8],"9":[4,1],"10":[5,5],"11":[1,0],"12":[1,1],"13":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a2c9bd3b33e50e483ad5e1fb996aaae664d33194"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\moengage\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\moengage\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":19},"end":{"line":10,"column":1}},"2":{"start":{"line":12,"column":19},"end":{"line":16,"column":1}},"3":{"start":{"line":18,"column":20},"end":{"line":22,"column":1}},"4":{"start":{"line":24,"column":26},"end":{"line":40,"column":1}},"5":{"start":{"line":42,"column":23},"end":{"line":42,"column":69}},"6":{"start":{"line":44,"column":0},"end":{"line":50,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"7e6e70e2aaeb2349773c9becdf178def5c384650"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\moengage\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\moengage\\transform.js","statementMap":{"0":{"start":{"line":1,"column":13},"end":{"line":1,"column":28}},"1":{"start":{"line":2,"column":22},"end":{"line":2,"column":51}},"2":{"start":{"line":9,"column":4},"end":{"line":9,"column":23}},"3":{"start":{"line":19,"column":4},"end":{"line":19,"column":25}},"4":{"start":{"line":22,"column":18},"end":{"line":22,"column":74}},"5":{"start":{"line":23,"column":36},"end":{"line":23,"column":54}},"6":{"start":{"line":24,"column":19},"end":{"line":24,"column":41}},"7":{"start":{"line":26,"column":2},"end":{"line":38,"column":3}},"8":{"start":{"line":28,"column":6},"end":{"line":28,"column":65}},"9":{"start":{"line":29,"column":6},"end":{"line":29,"column":12}},"10":{"start":{"line":31,"column":6},"end":{"line":31,"column":65}},"11":{"start":{"line":32,"column":6},"end":{"line":32,"column":12}},"12":{"start":{"line":34,"column":6},"end":{"line":34,"column":66}},"13":{"start":{"line":35,"column":6},"end":{"line":35,"column":12}},"14":{"start":{"line":37,"column":6},"end":{"line":37,"column":60}},"15":{"start":{"line":39,"column":2},"end":{"line":39,"column":59}},"16":{"start":{"line":40,"column":2},"end":{"line":46,"column":4}},"17":{"start":{"line":47,"column":2},"end":{"line":47,"column":58}},"18":{"start":{"line":48,"column":2},"end":{"line":88,"column":3}},"19":{"start":{"line":49,"column":4},"end":{"line":82,"column":5}},"20":{"start":{"line":52,"column":8},"end":{"line":52,"column":34}},"21":{"start":{"line":53,"column":8},"end":{"line":56,"column":10}},"22":{"start":{"line":58,"column":8},"end":{"line":58,"column":61}},"23":{"start":{"line":59,"column":8},"end":{"line":59,"column":14}},"24":{"start":{"line":62,"column":8},"end":{"line":62,"column":32}},"25":{"start":{"line":63,"column":8},"end":{"line":66,"column":10}},"26":{"start":{"line":68,"column":8},"end":{"line":68,"column":61}},"27":{"start":{"line":69,"column":8},"end":{"line":69,"column":14}},"28":{"start":{"line":72,"column":8},"end":{"line":72,"column":31}},"29":{"start":{"line":73,"column":8},"end":{"line":78,"column":10}},"30":{"start":{"line":79,"column":8},"end":{"line":79,"column":14}},"31":{"start":{"line":81,"column":8},"end":{"line":81,"column":61}},"32":{"start":{"line":84,"column":4},"end":{"line":84,"column":63}},"33":{"start":{"line":87,"column":4},"end":{"line":87,"column":67}},"34":{"start":{"line":89,"column":2},"end":{"line":89,"column":18}},"35":{"start":{"line":92,"column":21},"end":{"line":133,"column":1}},"36":{"start":{"line":93,"column":2},"end":{"line":98,"column":3}},"37":{"start":{"line":94,"column":4},"end":{"line":97,"column":6}},"38":{"start":{"line":100,"column":22},"end":{"line":100,"column":48}},"39":{"start":{"line":103,"column":2},"end":{"line":130,"column":3}},"40":{"start":{"line":105,"column":6},"end":{"line":105,"column":44}},"41":{"start":{"line":106,"column":6},"end":{"line":106,"column":71}},"42":{"start":{"line":109,"column":6},"end":{"line":121,"column":7}},"43":{"start":{"line":115,"column":8},"end":{"line":120,"column":10}},"44":{"start":{"line":122,"column":6},"end":{"line":122,"column":12}},"45":{"start":{"line":124,"column":6},"end":{"line":124,"column":41}},"46":{"start":{"line":126,"column":6},"end":{"line":126,"column":71}},"47":{"start":{"line":127,"column":6},"end":{"line":127,"column":12}},"48":{"start":{"line":129,"column":6},"end":{"line":129,"column":63}},"49":{"start":{"line":132,"column":2},"end":{"line":132,"column":18}},"50":{"start":{"line":135,"column":16},"end":{"line":137,"column":1}},"51":{"start":{"line":136,"column":2},"end":{"line":136,"column":56}},"52":{"start":{"line":139,"column":26},"end":{"line":176,"column":1}},"53":{"start":{"line":140,"column":2},"end":{"line":143,"column":3}},"54":{"start":{"line":141,"column":23},"end":{"line":141,"column":75}},"55":{"start":{"line":142,"column":4},"end":{"line":142,"column":24}},"56":{"start":{"line":145,"column":19},"end":{"line":174,"column":3}},"57":{"start":{"line":147,"column":6},"end":{"line":172,"column":7}},"58":{"start":{"line":148,"column":8},"end":{"line":155,"column":9}},"59":{"start":{"line":150,"column":10},"end":{"line":154,"column":12}},"60":{"start":{"line":157,"column":8},"end":{"line":161,"column":10}},"61":{"start":{"line":163,"column":8},"end":{"line":171,"column":10}},"62":{"start":{"line":175,"column":2},"end":{"line":175,"column":18}},"63":{"start":{"line":178,"column":0},"end":{"line":178,"column":48}}},"fnMap":{"0":{"name":"responseBuilderSimple","decl":{"start":{"line":21,"column":9},"end":{"line":21,"column":30}},"loc":{"start":{"line":21,"column":63},"end":{"line":90,"column":1}},"line":21},"1":{"name":"(anonymous_1)","decl":{"start":{"line":92,"column":21},"end":{"line":92,"column":22}},"loc":{"start":{"line":92,"column":47},"end":{"line":133,"column":1}},"line":92},"2":{"name":"(anonymous_2)","decl":{"start":{"line":135,"column":16},"end":{"line":135,"column":17}},"loc":{"start":{"line":135,"column":25},"end":{"line":137,"column":1}},"line":135},"3":{"name":"(anonymous_3)","decl":{"start":{"line":139,"column":26},"end":{"line":139,"column":27}},"loc":{"start":{"line":139,"column":42},"end":{"line":176,"column":1}},"line":139},"4":{"name":"(anonymous_4)","decl":{"start":{"line":146,"column":15},"end":{"line":146,"column":16}},"loc":{"start":{"line":146,"column":30},"end":{"line":173,"column":5}},"line":146}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":2},"end":{"line":38,"column":3}},"type":"switch","locations":[{"start":{"line":27,"column":4},"end":{"line":29,"column":12}},{"start":{"line":30,"column":4},"end":{"line":32,"column":12}},{"start":{"line":33,"column":4},"end":{"line":35,"column":12}},{"start":{"line":36,"column":4},"end":{"line":37,"column":60}}],"line":26},"1":{"loc":{"start":{"line":47,"column":20},"end":{"line":47,"column":57}},"type":"binary-expr","locations":[{"start":{"line":47,"column":20},"end":{"line":47,"column":39}},{"start":{"line":47,"column":43},"end":{"line":47,"column":57}}],"line":47},"2":{"loc":{"start":{"line":48,"column":2},"end":{"line":88,"column":3}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":88,"column":3}},{"start":{"line":48,"column":2},"end":{"line":88,"column":3}}],"line":48},"3":{"loc":{"start":{"line":49,"column":4},"end":{"line":82,"column":5}},"type":"switch","locations":[{"start":{"line":50,"column":6},"end":{"line":59,"column":14}},{"start":{"line":60,"column":6},"end":{"line":69,"column":14}},{"start":{"line":70,"column":6},"end":{"line":79,"column":14}},{"start":{"line":80,"column":6},"end":{"line":81,"column":61}}],"line":49},"4":{"loc":{"start":{"line":93,"column":2},"end":{"line":98,"column":3}},"type":"if","locations":[{"start":{"line":93,"column":2},"end":{"line":98,"column":3}},{"start":{"line":93,"column":2},"end":{"line":98,"column":3}}],"line":93},"5":{"loc":{"start":{"line":103,"column":2},"end":{"line":130,"column":3}},"type":"switch","locations":[{"start":{"line":104,"column":4},"end":{"line":122,"column":12}},{"start":{"line":123,"column":4},"end":{"line":127,"column":12}},{"start":{"line":128,"column":4},"end":{"line":129,"column":63}}],"line":103},"6":{"loc":{"start":{"line":109,"column":6},"end":{"line":121,"column":7}},"type":"if","locations":[{"start":{"line":109,"column":6},"end":{"line":121,"column":7}},{"start":{"line":109,"column":6},"end":{"line":121,"column":7}}],"line":109},"7":{"loc":{"start":{"line":110,"column":8},"end":{"line":112,"column":36}},"type":"binary-expr","locations":[{"start":{"line":110,"column":8},"end":{"line":110,"column":30}},{"start":{"line":111,"column":8},"end":{"line":111,"column":35}},{"start":{"line":112,"column":8},"end":{"line":112,"column":36}}],"line":110},"8":{"loc":{"start":{"line":140,"column":2},"end":{"line":143,"column":3}},"type":"if","locations":[{"start":{"line":140,"column":2},"end":{"line":143,"column":3}},{"start":{"line":140,"column":2},"end":{"line":143,"column":3}}],"line":140},"9":{"loc":{"start":{"line":140,"column":6},"end":{"line":140,"column":50}},"type":"binary-expr","locations":[{"start":{"line":140,"column":6},"end":{"line":140,"column":28}},{"start":{"line":140,"column":32},"end":{"line":140,"column":50}}],"line":140},"10":{"loc":{"start":{"line":148,"column":8},"end":{"line":155,"column":9}},"type":"if","locations":[{"start":{"line":148,"column":8},"end":{"line":155,"column":9}},{"start":{"line":148,"column":8},"end":{"line":155,"column":9}}],"line":148},"11":{"loc":{"start":{"line":165,"column":10},"end":{"line":169,"column":17}},"type":"cond-expr","locations":[{"start":{"line":166,"column":14},"end":{"line":166,"column":35}},{"start":{"line":167,"column":14},"end":{"line":169,"column":17}}],"line":165},"12":{"loc":{"start":{"line":167,"column":14},"end":{"line":169,"column":17}},"type":"cond-expr","locations":[{"start":{"line":168,"column":14},"end":{"line":168,"column":24}},{"start":{"line":169,"column":14},"end":{"line":169,"column":17}}],"line":167},"13":{"loc":{"start":{"line":170,"column":10},"end":{"line":170,"column":69}},"type":"binary-expr","locations":[{"start":{"line":170,"column":10},"end":{"line":170,"column":23}},{"start":{"line":170,"column":27},"end":{"line":170,"column":69}}],"line":170}},"s":{"0":1,"1":1,"2":1,"3":1,"4":12,"5":12,"6":12,"7":12,"8":1,"9":1,"10":9,"11":9,"12":1,"13":1,"14":1,"15":11,"16":11,"17":11,"18":11,"19":11,"20":6,"21":6,"22":6,"23":6,"24":1,"25":1,"26":1,"27":1,"28":4,"29":4,"30":4,"31":0,"32":11,"33":0,"34":11,"35":1,"36":13,"37":1,"38":12,"39":12,"40":7,"41":7,"42":6,"43":1,"44":6,"45":4,"46":4,"47":4,"48":1,"49":10,"50":1,"51":13,"52":1,"53":1,"54":0,"55":0,"56":1,"57":2,"58":2,"59":0,"60":2,"61":0,"62":1,"63":1},"f":{"0":12,"1":13,"2":13,"3":1,"4":2},"b":{"0":[1,9,1,1],"1":[11,1],"2":[11,0],"3":[6,1,4,0],"4":[1,12],"5":[7,4,1],"6":[1,5],"7":[6,1,1],"8":[0,1],"9":[1,1],"10":[0,2],"11":[0,0],"12":[0,0],"13":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e22b2207f0d6e060e5d327bb40667e06111ca301"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\monetate\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\monetate\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":68}},"2":{"start":{"line":5,"column":22},"end":{"line":18,"column":1}},"3":{"start":{"line":20,"column":0},"end":{"line":20,"column":28}},"4":{"start":{"line":21,"column":0},"end":{"line":21,"column":38}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"73ea1ef087eaa912b32d5c82016230495f6013d0"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\monetate\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\monetate\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":12,"column":4},"end":{"line":12,"column":25}},"3":{"start":{"line":13,"column":22},"end":{"line":13,"column":51}},"4":{"start":{"line":15,"column":36},"end":{"line":15,"column":55}},"5":{"start":{"line":17,"column":21},"end":{"line":32,"column":1}},"6":{"start":{"line":18,"column":2},"end":{"line":20,"column":3}},"7":{"start":{"line":19,"column":4},"end":{"line":19,"column":66}},"8":{"start":{"line":22,"column":15},"end":{"line":22,"column":17}},"9":{"start":{"line":23,"column":2},"end":{"line":30,"column":3}},"10":{"start":{"line":25,"column":6},"end":{"line":25,"column":18}},"11":{"start":{"line":26,"column":6},"end":{"line":26,"column":12}},"12":{"start":{"line":28,"column":6},"end":{"line":28,"column":18}},"13":{"start":{"line":29,"column":6},"end":{"line":29,"column":12}},"14":{"start":{"line":31,"column":2},"end":{"line":31,"column":16}},"15":{"start":{"line":34,"column":23},"end":{"line":48,"column":1}},"16":{"start":{"line":36,"column":2},"end":{"line":46,"column":3}},"17":{"start":{"line":37,"column":4},"end":{"line":37,"column":16}},"18":{"start":{"line":38,"column":9},"end":{"line":46,"column":3}},"19":{"start":{"line":41,"column":14},"end":{"line":41,"column":49}},"20":{"start":{"line":42,"column":4},"end":{"line":42,"column":24}},"21":{"start":{"line":45,"column":4},"end":{"line":45,"column":14}},"22":{"start":{"line":47,"column":2},"end":{"line":47,"column":13}},"23":{"start":{"line":50,"column":17},"end":{"line":73,"column":1}},"24":{"start":{"line":52,"column":2},"end":{"line":71,"column":3}},"25":{"start":{"line":53,"column":4},"end":{"line":53,"column":37}},"26":{"start":{"line":54,"column":9},"end":{"line":71,"column":3}},"27":{"start":{"line":55,"column":4},"end":{"line":55,"column":13}},"28":{"start":{"line":56,"column":4},"end":{"line":67,"column":7}},"29":{"start":{"line":57,"column":6},"end":{"line":66,"column":7}},"30":{"start":{"line":58,"column":18},"end":{"line":58,"column":42}},"31":{"start":{"line":59,"column":8},"end":{"line":61,"column":9}},"32":{"start":{"line":60,"column":10},"end":{"line":60,"column":22}},"33":{"start":{"line":65,"column":8},"end":{"line":65,"column":20}},"34":{"start":{"line":68,"column":4},"end":{"line":70,"column":5}},"35":{"start":{"line":69,"column":6},"end":{"line":69,"column":22}},"36":{"start":{"line":72,"column":2},"end":{"line":72,"column":13}},"37":{"start":{"line":75,"column":20},"end":{"line":100,"column":1}},"38":{"start":{"line":76,"column":21},"end":{"line":76,"column":23}},"39":{"start":{"line":79,"column":2},"end":{"line":98,"column":3}},"40":{"start":{"line":83,"column":23},"end":{"line":83,"column":42}},"41":{"start":{"line":84,"column":4},"end":{"line":97,"column":5}},"42":{"start":{"line":84,"column":17},"end":{"line":84,"column":18}},"43":{"start":{"line":85,"column":6},"end":{"line":85,"column":26}},"44":{"start":{"line":87,"column":6},"end":{"line":87,"column":30}},"45":{"start":{"line":88,"column":6},"end":{"line":88,"column":39}},"46":{"start":{"line":89,"column":6},"end":{"line":96,"column":7}},"47":{"start":{"line":90,"column":8},"end":{"line":90,"column":32}},"48":{"start":{"line":91,"column":13},"end":{"line":96,"column":7}},"49":{"start":{"line":94,"column":8},"end":{"line":94,"column":33}},"50":{"start":{"line":95,"column":8},"end":{"line":95,"column":14}},"51":{"start":{"line":99,"column":2},"end":{"line":99,"column":22}},"52":{"start":{"line":102,"column":30},"end":{"line":124,"column":1}},"53":{"start":{"line":104,"column":2},"end":{"line":106,"column":3}},"54":{"start":{"line":105,"column":4},"end":{"line":105,"column":57}},"55":{"start":{"line":108,"column":2},"end":{"line":123,"column":3}},"56":{"start":{"line":111,"column":4},"end":{"line":111,"column":33}},"57":{"start":{"line":115,"column":24},"end":{"line":119,"column":5}},"58":{"start":{"line":120,"column":4},"end":{"line":122,"column":5}},"59":{"start":{"line":121,"column":6},"end":{"line":121,"column":53}},"60":{"start":{"line":127,"column":28},"end":{"line":127,"column":52}},"61":{"start":{"line":128,"column":19},"end":{"line":128,"column":41}},"62":{"start":{"line":131,"column":2},"end":{"line":131,"column":51}},"63":{"start":{"line":133,"column":2},"end":{"line":133,"column":69}},"64":{"start":{"line":134,"column":2},"end":{"line":134,"column":28}},"65":{"start":{"line":135,"column":2},"end":{"line":137,"column":4}},"66":{"start":{"line":139,"column":2},"end":{"line":139,"column":18}},"67":{"start":{"line":142,"column":25},"end":{"line":169,"column":1}},"68":{"start":{"line":144,"column":2},"end":{"line":167,"column":3}},"69":{"start":{"line":145,"column":20},"end":{"line":145,"column":22}},"70":{"start":{"line":147,"column":4},"end":{"line":165,"column":7}},"71":{"start":{"line":148,"column":58},"end":{"line":148,"column":65}},"72":{"start":{"line":150,"column":20},"end":{"line":150,"column":60}},"73":{"start":{"line":151,"column":6},"end":{"line":164,"column":7}},"74":{"start":{"line":153,"column":8},"end":{"line":157,"column":9}},"75":{"start":{"line":154,"column":10},"end":{"line":154,"column":67}},"76":{"start":{"line":156,"column":10},"end":{"line":156,"column":39}},"77":{"start":{"line":158,"column":13},"end":{"line":164,"column":7}},"78":{"start":{"line":160,"column":8},"end":{"line":163,"column":10}},"79":{"start":{"line":166,"column":4},"end":{"line":166,"column":19}},"80":{"start":{"line":168,"column":2},"end":{"line":168,"column":14}},"81":{"start":{"line":172,"column":21},"end":{"line":172,"column":75}},"82":{"start":{"line":174,"column":2},"end":{"line":178,"column":3}},"83":{"start":{"line":175,"column":4},"end":{"line":175,"column":43}},"84":{"start":{"line":177,"column":4},"end":{"line":177,"column":46}},"85":{"start":{"line":181,"column":17},"end":{"line":181,"column":30}},"86":{"start":{"line":182,"column":21},"end":{"line":182,"column":45}},"87":{"start":{"line":183,"column":2},"end":{"line":339,"column":3}},"88":{"start":{"line":184,"column":4},"end":{"line":338,"column":5}},"89":{"start":{"line":185,"column":6},"end":{"line":201,"column":7}},"90":{"start":{"line":186,"column":20},"end":{"line":186,"column":40}},"91":{"start":{"line":187,"column":8},"end":{"line":195,"column":11}},"92":{"start":{"line":197,"column":8},"end":{"line":200,"column":10}},"93":{"start":{"line":202,"column":11},"end":{"line":338,"column":5}},"94":{"start":{"line":203,"column":6},"end":{"line":224,"column":7}},"95":{"start":{"line":204,"column":31},"end":{"line":206,"column":9}},"96":{"start":{"line":205,"column":21},"end":{"line":205,"column":39}},"97":{"start":{"line":207,"column":8},"end":{"line":212,"column":9}},"98":{"start":{"line":208,"column":10},"end":{"line":211,"column":12}},"99":{"start":{"line":213,"column":8},"end":{"line":218,"column":11}},"100":{"start":{"line":216,"column":12},"end":{"line":216,"column":41}},"101":{"start":{"line":220,"column":8},"end":{"line":223,"column":10}},"102":{"start":{"line":225,"column":11},"end":{"line":338,"column":5}},"103":{"start":{"line":226,"column":23},"end":{"line":226,"column":51}},"104":{"start":{"line":227,"column":18},"end":{"line":227,"column":38}},"105":{"start":{"line":228,"column":6},"end":{"line":255,"column":7}},"106":{"start":{"line":234,"column":8},"end":{"line":249,"column":11}},"107":{"start":{"line":251,"column":8},"end":{"line":254,"column":10}},"108":{"start":{"line":256,"column":11},"end":{"line":338,"column":5}},"109":{"start":{"line":257,"column":6},"end":{"line":287,"column":7}},"110":{"start":{"line":258,"column":29},"end":{"line":265,"column":9}},"111":{"start":{"line":260,"column":12},"end":{"line":264,"column":30}},"112":{"start":{"line":266,"column":8},"end":{"line":271,"column":9}},"113":{"start":{"line":267,"column":10},"end":{"line":270,"column":12}},"114":{"start":{"line":272,"column":8},"end":{"line":286,"column":11}},"115":{"start":{"line":275,"column":30},"end":{"line":275,"column":75}},"116":{"start":{"line":276,"column":29},"end":{"line":276,"column":77}},"117":{"start":{"line":277,"column":24},"end":{"line":277,"column":41}},"118":{"start":{"line":278,"column":12},"end":{"line":284,"column":14}},"119":{"start":{"line":288,"column":11},"end":{"line":338,"column":5}},"120":{"start":{"line":289,"column":25},"end":{"line":289,"column":44}},"121":{"start":{"line":290,"column":27},"end":{"line":290,"column":37}},"122":{"start":{"line":291,"column":6},"end":{"line":322,"column":7}},"123":{"start":{"line":292,"column":30},"end":{"line":299,"column":9}},"124":{"start":{"line":294,"column":12},"end":{"line":298,"column":30}},"125":{"start":{"line":300,"column":8},"end":{"line":305,"column":9}},"126":{"start":{"line":301,"column":10},"end":{"line":304,"column":12}},"127":{"start":{"line":306,"column":8},"end":{"line":321,"column":11}},"128":{"start":{"line":310,"column":29},"end":{"line":310,"column":74}},"129":{"start":{"line":311,"column":29},"end":{"line":311,"column":77}},"130":{"start":{"line":312,"column":24},"end":{"line":312,"column":41}},"131":{"start":{"line":313,"column":12},"end":{"line":319,"column":14}},"132":{"start":{"line":341,"column":2},"end":{"line":341,"column":73}},"133":{"start":{"line":345,"column":21},"end":{"line":345,"column":74}},"134":{"start":{"line":347,"column":2},"end":{"line":347,"column":73}},"135":{"start":{"line":351,"column":21},"end":{"line":351,"column":76}},"136":{"start":{"line":353,"column":2},"end":{"line":353,"column":73}},"137":{"start":{"line":358,"column":15},"end":{"line":358,"column":41}},"138":{"start":{"line":359,"column":2},"end":{"line":359,"column":53}},"139":{"start":{"line":362,"column":2},"end":{"line":373,"column":3}},"140":{"start":{"line":363,"column":4},"end":{"line":372,"column":5}},"141":{"start":{"line":365,"column":8},"end":{"line":365,"column":55}},"142":{"start":{"line":367,"column":8},"end":{"line":367,"column":54}},"143":{"start":{"line":369,"column":8},"end":{"line":369,"column":56}},"144":{"start":{"line":371,"column":8},"end":{"line":371,"column":75}},"145":{"start":{"line":374,"column":2},"end":{"line":374,"column":64}},"146":{"start":{"line":377,"column":26},"end":{"line":414,"column":1}},"147":{"start":{"line":378,"column":2},"end":{"line":381,"column":3}},"148":{"start":{"line":379,"column":23},"end":{"line":379,"column":75}},"149":{"start":{"line":380,"column":4},"end":{"line":380,"column":24}},"150":{"start":{"line":383,"column":19},"end":{"line":412,"column":3}},"151":{"start":{"line":385,"column":6},"end":{"line":410,"column":7}},"152":{"start":{"line":386,"column":8},"end":{"line":393,"column":9}},"153":{"start":{"line":388,"column":10},"end":{"line":392,"column":12}},"154":{"start":{"line":395,"column":8},"end":{"line":399,"column":10}},"155":{"start":{"line":401,"column":8},"end":{"line":409,"column":10}},"156":{"start":{"line":413,"column":2},"end":{"line":413,"column":18}},"157":{"start":{"line":416,"column":0},"end":{"line":416,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":17,"column":21},"end":{"line":17,"column":22}},"loc":{"start":{"line":17,"column":29},"end":{"line":32,"column":1}},"line":17},"1":{"name":"(anonymous_1)","decl":{"start":{"line":34,"column":23},"end":{"line":34,"column":24}},"loc":{"start":{"line":34,"column":39},"end":{"line":48,"column":1}},"line":34},"2":{"name":"(anonymous_2)","decl":{"start":{"line":50,"column":17},"end":{"line":50,"column":18}},"loc":{"start":{"line":50,"column":33},"end":{"line":73,"column":1}},"line":50},"3":{"name":"(anonymous_3)","decl":{"start":{"line":56,"column":16},"end":{"line":56,"column":17}},"loc":{"start":{"line":56,"column":21},"end":{"line":67,"column":5}},"line":56},"4":{"name":"(anonymous_4)","decl":{"start":{"line":75,"column":20},"end":{"line":75,"column":21}},"loc":{"start":{"line":75,"column":49},"end":{"line":100,"column":1}},"line":75},"5":{"name":"(anonymous_5)","decl":{"start":{"line":102,"column":30},"end":{"line":102,"column":31}},"loc":{"start":{"line":102,"column":69},"end":{"line":124,"column":1}},"line":102},"6":{"name":"responseBuilder","decl":{"start":{"line":126,"column":9},"end":{"line":126,"column":24}},"loc":{"start":{"line":126,"column":44},"end":{"line":140,"column":1}},"line":126},"7":{"name":"(anonymous_7)","decl":{"start":{"line":142,"column":25},"end":{"line":142,"column":26}},"loc":{"start":{"line":142,"column":51},"end":{"line":169,"column":1}},"line":142},"8":{"name":"(anonymous_8)","decl":{"start":{"line":147,"column":24},"end":{"line":147,"column":25}},"loc":{"start":{"line":147,"column":35},"end":{"line":165,"column":5}},"line":147},"9":{"name":"track","decl":{"start":{"line":171,"column":9},"end":{"line":171,"column":14}},"loc":{"start":{"line":171,"column":37},"end":{"line":342,"column":1}},"line":171},"10":{"name":"(anonymous_10)","decl":{"start":{"line":205,"column":10},"end":{"line":205,"column":11}},"loc":{"start":{"line":205,"column":21},"end":{"line":205,"column":39}},"line":205},"11":{"name":"(anonymous_11)","decl":{"start":{"line":215,"column":44},"end":{"line":215,"column":45}},"loc":{"start":{"line":216,"column":12},"end":{"line":216,"column":41}},"line":216},"12":{"name":"(anonymous_12)","decl":{"start":{"line":259,"column":10},"end":{"line":259,"column":11}},"loc":{"start":{"line":260,"column":12},"end":{"line":264,"column":30}},"line":260},"13":{"name":"(anonymous_13)","decl":{"start":{"line":274,"column":45},"end":{"line":274,"column":46}},"loc":{"start":{"line":274,"column":56},"end":{"line":285,"column":11}},"line":274},"14":{"name":"(anonymous_14)","decl":{"start":{"line":293,"column":10},"end":{"line":293,"column":11}},"loc":{"start":{"line":294,"column":12},"end":{"line":298,"column":30}},"line":294},"15":{"name":"(anonymous_15)","decl":{"start":{"line":309,"column":43},"end":{"line":309,"column":44}},"loc":{"start":{"line":309,"column":54},"end":{"line":320,"column":11}},"line":309},"16":{"name":"page","decl":{"start":{"line":344,"column":9},"end":{"line":344,"column":13}},"loc":{"start":{"line":344,"column":36},"end":{"line":348,"column":1}},"line":344},"17":{"name":"screen","decl":{"start":{"line":350,"column":9},"end":{"line":350,"column":15}},"loc":{"start":{"line":350,"column":38},"end":{"line":354,"column":1}},"line":350},"18":{"name":"process","decl":{"start":{"line":356,"column":9},"end":{"line":356,"column":16}},"loc":{"start":{"line":356,"column":24},"end":{"line":375,"column":1}},"line":356},"19":{"name":"(anonymous_19)","decl":{"start":{"line":377,"column":26},"end":{"line":377,"column":27}},"loc":{"start":{"line":377,"column":42},"end":{"line":414,"column":1}},"line":377},"20":{"name":"(anonymous_20)","decl":{"start":{"line":384,"column":15},"end":{"line":384,"column":16}},"loc":{"start":{"line":384,"column":30},"end":{"line":411,"column":5}},"line":384}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":2},"end":{"line":20,"column":3}},"type":"if","locations":[{"start":{"line":18,"column":2},"end":{"line":20,"column":3}},{"start":{"line":18,"column":2},"end":{"line":20,"column":3}}],"line":18},"1":{"loc":{"start":{"line":23,"column":2},"end":{"line":30,"column":3}},"type":"switch","locations":[{"start":{"line":24,"column":4},"end":{"line":26,"column":12}},{"start":{"line":27,"column":4},"end":{"line":29,"column":12}}],"line":23},"2":{"loc":{"start":{"line":36,"column":2},"end":{"line":46,"column":3}},"type":"if","locations":[{"start":{"line":36,"column":2},"end":{"line":46,"column":3}},{"start":{"line":36,"column":2},"end":{"line":46,"column":3}}],"line":36},"3":{"loc":{"start":{"line":38,"column":9},"end":{"line":46,"column":3}},"type":"if","locations":[{"start":{"line":38,"column":9},"end":{"line":46,"column":3}},{"start":{"line":38,"column":9},"end":{"line":46,"column":3}}],"line":38},"4":{"loc":{"start":{"line":52,"column":2},"end":{"line":71,"column":3}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":71,"column":3}},{"start":{"line":52,"column":2},"end":{"line":71,"column":3}}],"line":52},"5":{"loc":{"start":{"line":54,"column":9},"end":{"line":71,"column":3}},"type":"if","locations":[{"start":{"line":54,"column":9},"end":{"line":71,"column":3}},{"start":{"line":54,"column":9},"end":{"line":71,"column":3}}],"line":54},"6":{"loc":{"start":{"line":57,"column":6},"end":{"line":66,"column":7}},"type":"if","locations":[{"start":{"line":57,"column":6},"end":{"line":66,"column":7}},{"start":{"line":57,"column":6},"end":{"line":66,"column":7}}],"line":57},"7":{"loc":{"start":{"line":59,"column":8},"end":{"line":61,"column":9}},"type":"if","locations":[{"start":{"line":59,"column":8},"end":{"line":61,"column":9}},{"start":{"line":59,"column":8},"end":{"line":61,"column":9}}],"line":59},"8":{"loc":{"start":{"line":68,"column":4},"end":{"line":70,"column":5}},"type":"if","locations":[{"start":{"line":68,"column":4},"end":{"line":70,"column":5}},{"start":{"line":68,"column":4},"end":{"line":70,"column":5}}],"line":68},"9":{"loc":{"start":{"line":79,"column":2},"end":{"line":98,"column":3}},"type":"if","locations":[{"start":{"line":79,"column":2},"end":{"line":98,"column":3}},{"start":{"line":79,"column":2},"end":{"line":98,"column":3}}],"line":79},"10":{"loc":{"start":{"line":79,"column":6},"end":{"line":79,"column":21}},"type":"binary-expr","locations":[{"start":{"line":79,"column":6},"end":{"line":79,"column":11}},{"start":{"line":79,"column":15},"end":{"line":79,"column":21}}],"line":79},"11":{"loc":{"start":{"line":89,"column":6},"end":{"line":96,"column":7}},"type":"if","locations":[{"start":{"line":89,"column":6},"end":{"line":96,"column":7}},{"start":{"line":89,"column":6},"end":{"line":96,"column":7}}],"line":89},"12":{"loc":{"start":{"line":91,"column":13},"end":{"line":96,"column":7}},"type":"if","locations":[{"start":{"line":91,"column":13},"end":{"line":96,"column":7}},{"start":{"line":91,"column":13},"end":{"line":96,"column":7}}],"line":91},"13":{"loc":{"start":{"line":104,"column":2},"end":{"line":106,"column":3}},"type":"if","locations":[{"start":{"line":104,"column":2},"end":{"line":106,"column":3}},{"start":{"line":104,"column":2},"end":{"line":106,"column":3}}],"line":104},"14":{"loc":{"start":{"line":104,"column":6},"end":{"line":104,"column":51}},"type":"binary-expr","locations":[{"start":{"line":104,"column":6},"end":{"line":104,"column":28}},{"start":{"line":104,"column":32},"end":{"line":104,"column":51}}],"line":104},"15":{"loc":{"start":{"line":108,"column":2},"end":{"line":123,"column":3}},"type":"if","locations":[{"start":{"line":108,"column":2},"end":{"line":123,"column":3}},{"start":{"line":108,"column":2},"end":{"line":123,"column":3}}],"line":108},"16":{"loc":{"start":{"line":120,"column":4},"end":{"line":122,"column":5}},"type":"if","locations":[{"start":{"line":120,"column":4},"end":{"line":122,"column":5}},{"start":{"line":120,"column":4},"end":{"line":122,"column":5}}],"line":120},"17":{"loc":{"start":{"line":120,"column":8},"end":{"line":120,"column":75}},"type":"binary-expr","locations":[{"start":{"line":120,"column":8},"end":{"line":120,"column":23}},{"start":{"line":120,"column":27},"end":{"line":120,"column":60}},{"start":{"line":120,"column":64},"end":{"line":120,"column":75}}],"line":120},"18":{"loc":{"start":{"line":127,"column":28},"end":{"line":127,"column":52}},"type":"binary-expr","locations":[{"start":{"line":127,"column":28},"end":{"line":127,"column":46}},{"start":{"line":127,"column":50},"end":{"line":127,"column":52}}],"line":127},"19":{"loc":{"start":{"line":144,"column":2},"end":{"line":167,"column":3}},"type":"if","locations":[{"start":{"line":144,"column":2},"end":{"line":167,"column":3}},{"start":{"line":144,"column":2},"end":{"line":167,"column":3}}],"line":144},"20":{"loc":{"start":{"line":144,"column":6},"end":{"line":144,"column":58}},"type":"binary-expr","locations":[{"start":{"line":144,"column":6},"end":{"line":144,"column":32}},{"start":{"line":144,"column":36},"end":{"line":144,"column":58}}],"line":144},"21":{"loc":{"start":{"line":151,"column":6},"end":{"line":164,"column":7}},"type":"if","locations":[{"start":{"line":151,"column":6},"end":{"line":164,"column":7}},{"start":{"line":151,"column":6},"end":{"line":164,"column":7}}],"line":151},"22":{"loc":{"start":{"line":153,"column":8},"end":{"line":157,"column":9}},"type":"if","locations":[{"start":{"line":153,"column":8},"end":{"line":157,"column":9}},{"start":{"line":153,"column":8},"end":{"line":157,"column":9}}],"line":153},"23":{"loc":{"start":{"line":158,"column":13},"end":{"line":164,"column":7}},"type":"if","locations":[{"start":{"line":158,"column":13},"end":{"line":164,"column":7}},{"start":{"line":158,"column":13},"end":{"line":164,"column":7}}],"line":158},"24":{"loc":{"start":{"line":174,"column":2},"end":{"line":178,"column":3}},"type":"if","locations":[{"start":{"line":174,"column":2},"end":{"line":178,"column":3}},{"start":{"line":174,"column":2},"end":{"line":178,"column":3}}],"line":174},"25":{"loc":{"start":{"line":182,"column":21},"end":{"line":182,"column":45}},"type":"binary-expr","locations":[{"start":{"line":182,"column":21},"end":{"line":182,"column":39}},{"start":{"line":182,"column":43},"end":{"line":182,"column":45}}],"line":182},"26":{"loc":{"start":{"line":183,"column":2},"end":{"line":339,"column":3}},"type":"if","locations":[{"start":{"line":183,"column":2},"end":{"line":339,"column":3}},{"start":{"line":183,"column":2},"end":{"line":339,"column":3}}],"line":183},"27":{"loc":{"start":{"line":184,"column":4},"end":{"line":338,"column":5}},"type":"if","locations":[{"start":{"line":184,"column":4},"end":{"line":338,"column":5}},{"start":{"line":184,"column":4},"end":{"line":338,"column":5}}],"line":184},"28":{"loc":{"start":{"line":185,"column":6},"end":{"line":201,"column":7}},"type":"if","locations":[{"start":{"line":185,"column":6},"end":{"line":201,"column":7}},{"start":{"line":185,"column":6},"end":{"line":201,"column":7}}],"line":185},"29":{"loc":{"start":{"line":186,"column":20},"end":{"line":186,"column":40}},"type":"binary-expr","locations":[{"start":{"line":186,"column":20},"end":{"line":186,"column":34}},{"start":{"line":186,"column":38},"end":{"line":186,"column":40}}],"line":186},"30":{"loc":{"start":{"line":202,"column":11},"end":{"line":338,"column":5}},"type":"if","locations":[{"start":{"line":202,"column":11},"end":{"line":338,"column":5}},{"start":{"line":202,"column":11},"end":{"line":338,"column":5}}],"line":202},"31":{"loc":{"start":{"line":203,"column":6},"end":{"line":224,"column":7}},"type":"if","locations":[{"start":{"line":203,"column":6},"end":{"line":224,"column":7}},{"start":{"line":203,"column":6},"end":{"line":224,"column":7}}],"line":203},"32":{"loc":{"start":{"line":203,"column":10},"end":{"line":203,"column":67}},"type":"binary-expr","locations":[{"start":{"line":203,"column":10},"end":{"line":203,"column":29}},{"start":{"line":203,"column":33},"end":{"line":203,"column":67}}],"line":203},"33":{"loc":{"start":{"line":207,"column":8},"end":{"line":212,"column":9}},"type":"if","locations":[{"start":{"line":207,"column":8},"end":{"line":212,"column":9}},{"start":{"line":207,"column":8},"end":{"line":212,"column":9}}],"line":207},"34":{"loc":{"start":{"line":225,"column":11},"end":{"line":338,"column":5}},"type":"if","locations":[{"start":{"line":225,"column":11},"end":{"line":338,"column":5}},{"start":{"line":225,"column":11},"end":{"line":338,"column":5}}],"line":225},"35":{"loc":{"start":{"line":226,"column":23},"end":{"line":226,"column":51}},"type":"binary-expr","locations":[{"start":{"line":226,"column":23},"end":{"line":226,"column":42}},{"start":{"line":226,"column":46},"end":{"line":226,"column":51}}],"line":226},"36":{"loc":{"start":{"line":227,"column":18},"end":{"line":227,"column":38}},"type":"binary-expr","locations":[{"start":{"line":227,"column":18},"end":{"line":227,"column":32}},{"start":{"line":227,"column":36},"end":{"line":227,"column":38}}],"line":227},"37":{"loc":{"start":{"line":228,"column":6},"end":{"line":255,"column":7}},"type":"if","locations":[{"start":{"line":228,"column":6},"end":{"line":255,"column":7}},{"start":{"line":228,"column":6},"end":{"line":255,"column":7}}],"line":228},"38":{"loc":{"start":{"line":229,"column":8},"end":{"line":232,"column":29}},"type":"binary-expr","locations":[{"start":{"line":229,"column":8},"end":{"line":229,"column":29}},{"start":{"line":230,"column":8},"end":{"line":230,"column":27}},{"start":{"line":231,"column":8},"end":{"line":231,"column":45}},{"start":{"line":232,"column":8},"end":{"line":232,"column":29}}],"line":229},"39":{"loc":{"start":{"line":238,"column":19},"end":{"line":240,"column":20}},"type":"cond-expr","locations":[{"start":{"line":239,"column":18},"end":{"line":239,"column":50}},{"start":{"line":240,"column":18},"end":{"line":240,"column":20}}],"line":238},"40":{"loc":{"start":{"line":243,"column":21},"end":{"line":245,"column":20}},"type":"cond-expr","locations":[{"start":{"line":244,"column":18},"end":{"line":244,"column":50}},{"start":{"line":245,"column":18},"end":{"line":245,"column":20}}],"line":243},"41":{"loc":{"start":{"line":256,"column":11},"end":{"line":338,"column":5}},"type":"if","locations":[{"start":{"line":256,"column":11},"end":{"line":338,"column":5}},{"start":{"line":256,"column":11},"end":{"line":338,"column":5}}],"line":256},"42":{"loc":{"start":{"line":257,"column":6},"end":{"line":287,"column":7}},"type":"if","locations":[{"start":{"line":257,"column":6},"end":{"line":287,"column":7}},{"start":{"line":257,"column":6},"end":{"line":287,"column":7}}],"line":257},"43":{"loc":{"start":{"line":257,"column":10},"end":{"line":257,"column":67}},"type":"binary-expr","locations":[{"start":{"line":257,"column":10},"end":{"line":257,"column":29}},{"start":{"line":257,"column":33},"end":{"line":257,"column":67}}],"line":257},"44":{"loc":{"start":{"line":260,"column":12},"end":{"line":264,"column":30}},"type":"binary-expr","locations":[{"start":{"line":260,"column":12},"end":{"line":260,"column":28}},{"start":{"line":261,"column":12},"end":{"line":261,"column":46}},{"start":{"line":262,"column":12},"end":{"line":262,"column":46}},{"start":{"line":263,"column":12},"end":{"line":263,"column":45}},{"start":{"line":264,"column":12},"end":{"line":264,"column":30}}],"line":260},"45":{"loc":{"start":{"line":266,"column":8},"end":{"line":271,"column":9}},"type":"if","locations":[{"start":{"line":266,"column":8},"end":{"line":271,"column":9}},{"start":{"line":266,"column":8},"end":{"line":271,"column":9}}],"line":266},"46":{"loc":{"start":{"line":276,"column":29},"end":{"line":276,"column":77}},"type":"binary-expr","locations":[{"start":{"line":276,"column":29},"end":{"line":276,"column":45}},{"start":{"line":276,"column":49},"end":{"line":276,"column":68}},{"start":{"line":276,"column":72},"end":{"line":276,"column":77}}],"line":276},"47":{"loc":{"start":{"line":277,"column":24},"end":{"line":277,"column":41}},"type":"binary-expr","locations":[{"start":{"line":277,"column":24},"end":{"line":277,"column":35}},{"start":{"line":277,"column":39},"end":{"line":277,"column":41}}],"line":277},"48":{"loc":{"start":{"line":279,"column":19},"end":{"line":279,"column":74}},"type":"cond-expr","locations":[{"start":{"line":279,"column":40},"end":{"line":279,"column":69}},{"start":{"line":279,"column":72},"end":{"line":279,"column":74}}],"line":279},"49":{"loc":{"start":{"line":282,"column":21},"end":{"line":282,"column":58}},"type":"cond-expr","locations":[{"start":{"line":282,"column":33},"end":{"line":282,"column":53}},{"start":{"line":282,"column":56},"end":{"line":282,"column":58}}],"line":282},"50":{"loc":{"start":{"line":288,"column":11},"end":{"line":338,"column":5}},"type":"if","locations":[{"start":{"line":288,"column":11},"end":{"line":338,"column":5}},{"start":{"line":288,"column":11},"end":{"line":338,"column":5}}],"line":288},"51":{"loc":{"start":{"line":291,"column":6},"end":{"line":322,"column":7}},"type":"if","locations":[{"start":{"line":291,"column":6},"end":{"line":322,"column":7}},{"start":{"line":291,"column":6},"end":{"line":322,"column":7}}],"line":291},"52":{"loc":{"start":{"line":291,"column":10},"end":{"line":291,"column":59}},"type":"binary-expr","locations":[{"start":{"line":291,"column":10},"end":{"line":291,"column":20}},{"start":{"line":291,"column":24},"end":{"line":291,"column":32}},{"start":{"line":291,"column":36},"end":{"line":291,"column":59}}],"line":291},"53":{"loc":{"start":{"line":294,"column":12},"end":{"line":298,"column":30}},"type":"binary-expr","locations":[{"start":{"line":294,"column":12},"end":{"line":294,"column":28}},{"start":{"line":295,"column":12},"end":{"line":295,"column":46}},{"start":{"line":296,"column":12},"end":{"line":296,"column":46}},{"start":{"line":297,"column":12},"end":{"line":297,"column":45}},{"start":{"line":298,"column":12},"end":{"line":298,"column":30}}],"line":294},"54":{"loc":{"start":{"line":300,"column":8},"end":{"line":305,"column":9}},"type":"if","locations":[{"start":{"line":300,"column":8},"end":{"line":305,"column":9}},{"start":{"line":300,"column":8},"end":{"line":305,"column":9}}],"line":300},"55":{"loc":{"start":{"line":311,"column":29},"end":{"line":311,"column":77}},"type":"binary-expr","locations":[{"start":{"line":311,"column":29},"end":{"line":311,"column":45}},{"start":{"line":311,"column":49},"end":{"line":311,"column":68}},{"start":{"line":311,"column":72},"end":{"line":311,"column":77}}],"line":311},"56":{"loc":{"start":{"line":312,"column":24},"end":{"line":312,"column":41}},"type":"binary-expr","locations":[{"start":{"line":312,"column":24},"end":{"line":312,"column":35}},{"start":{"line":312,"column":39},"end":{"line":312,"column":41}}],"line":312},"57":{"loc":{"start":{"line":314,"column":19},"end":{"line":314,"column":74}},"type":"cond-expr","locations":[{"start":{"line":314,"column":40},"end":{"line":314,"column":69}},{"start":{"line":314,"column":72},"end":{"line":314,"column":74}}],"line":314},"58":{"loc":{"start":{"line":317,"column":21},"end":{"line":317,"column":56}},"type":"cond-expr","locations":[{"start":{"line":317,"column":32},"end":{"line":317,"column":51}},{"start":{"line":317,"column":54},"end":{"line":317,"column":56}}],"line":317},"59":{"loc":{"start":{"line":359,"column":11},"end":{"line":359,"column":52}},"type":"cond-expr","locations":[{"start":{"line":359,"column":20},"end":{"line":359,"column":40}},{"start":{"line":359,"column":43},"end":{"line":359,"column":52}}],"line":359},"60":{"loc":{"start":{"line":362,"column":2},"end":{"line":373,"column":3}},"type":"if","locations":[{"start":{"line":362,"column":2},"end":{"line":373,"column":3}},{"start":{"line":362,"column":2},"end":{"line":373,"column":3}}],"line":362},"61":{"loc":{"start":{"line":363,"column":4},"end":{"line":372,"column":5}},"type":"switch","locations":[{"start":{"line":364,"column":6},"end":{"line":365,"column":55}},{"start":{"line":366,"column":6},"end":{"line":367,"column":54}},{"start":{"line":368,"column":6},"end":{"line":369,"column":56}},{"start":{"line":370,"column":6},"end":{"line":371,"column":75}}],"line":363},"62":{"loc":{"start":{"line":378,"column":2},"end":{"line":381,"column":3}},"type":"if","locations":[{"start":{"line":378,"column":2},"end":{"line":381,"column":3}},{"start":{"line":378,"column":2},"end":{"line":381,"column":3}}],"line":378},"63":{"loc":{"start":{"line":378,"column":6},"end":{"line":378,"column":50}},"type":"binary-expr","locations":[{"start":{"line":378,"column":6},"end":{"line":378,"column":28}},{"start":{"line":378,"column":32},"end":{"line":378,"column":50}}],"line":378},"64":{"loc":{"start":{"line":386,"column":8},"end":{"line":393,"column":9}},"type":"if","locations":[{"start":{"line":386,"column":8},"end":{"line":393,"column":9}},{"start":{"line":386,"column":8},"end":{"line":393,"column":9}}],"line":386},"65":{"loc":{"start":{"line":403,"column":10},"end":{"line":407,"column":17}},"type":"cond-expr","locations":[{"start":{"line":404,"column":14},"end":{"line":404,"column":35}},{"start":{"line":405,"column":14},"end":{"line":407,"column":17}}],"line":403},"66":{"loc":{"start":{"line":405,"column":14},"end":{"line":407,"column":17}},"type":"cond-expr","locations":[{"start":{"line":406,"column":14},"end":{"line":406,"column":24}},{"start":{"line":407,"column":14},"end":{"line":407,"column":17}}],"line":405},"67":{"loc":{"start":{"line":408,"column":10},"end":{"line":408,"column":69}},"type":"binary-expr","locations":[{"start":{"line":408,"column":10},"end":{"line":408,"column":23}},{"start":{"line":408,"column":27},"end":{"line":408,"column":69}}],"line":408}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":29,"7":0,"8":29,"9":29,"10":29,"11":29,"12":0,"13":0,"14":29,"15":1,"16":205,"17":34,"18":171,"19":99,"20":99,"21":72,"22":205,"23":1,"24":205,"25":173,"26":32,"27":32,"28":32,"29":32,"30":32,"31":32,"32":3,"33":0,"34":32,"35":29,"36":205,"37":1,"38":72,"39":72,"40":72,"41":72,"42":72,"43":205,"44":205,"45":205,"46":205,"47":166,"48":39,"49":9,"50":9,"51":72,"52":1,"53":72,"54":29,"55":72,"56":0,"57":72,"58":72,"59":63,"60":21,"61":21,"62":21,"63":21,"64":21,"65":21,"66":21,"67":1,"68":29,"69":29,"70":29,"71":136,"72":136,"73":136,"74":82,"75":72,"76":10,"77":54,"78":0,"79":29,"80":0,"81":20,"82":20,"83":19,"84":1,"85":20,"86":20,"87":20,"88":20,"89":5,"90":3,"91":3,"92":2,"93":15,"94":4,"95":3,"96":6,"97":3,"98":1,"99":2,"100":4,"101":1,"102":11,"103":4,"104":4,"105":4,"106":2,"107":2,"108":7,"109":2,"110":2,"111":4,"112":2,"113":1,"114":1,"115":2,"116":2,"117":2,"118":2,"119":5,"120":3,"121":3,"122":3,"123":3,"124":6,"125":3,"126":1,"127":2,"128":4,"129":4,"130":4,"131":4,"132":12,"133":7,"134":7,"135":2,"136":2,"137":32,"138":32,"139":32,"140":31,"141":20,"142":7,"143":2,"144":2,"145":1,"146":1,"147":1,"148":0,"149":0,"150":1,"151":2,"152":2,"153":0,"154":2,"155":0,"156":1,"157":1},"f":{"0":29,"1":205,"2":205,"3":32,"4":72,"5":72,"6":21,"7":29,"8":136,"9":20,"10":6,"11":4,"12":4,"13":2,"14":6,"15":4,"16":7,"17":2,"18":32,"19":1,"20":2},"b":{"0":[0,29],"1":[29,0],"2":[34,171],"3":[99,72],"4":[173,32],"5":[32,0],"6":[32,0],"7":[3,29],"8":[29,3],"9":[72,0],"10":[72,72],"11":[166,39],"12":[9,30],"13":[29,43],"14":[72,29],"15":[0,72],"16":[63,9],"17":[72,72,72],"18":[21,0],"19":[29,0],"20":[29,29],"21":[82,54],"22":[72,10],"23":[0,54],"24":[19,1],"25":[20,0],"26":[20,0],"27":[5,15],"28":[3,2],"29":[3,2],"30":[4,11],"31":[3,1],"32":[4,4],"33":[1,2],"34":[4,7],"35":[4,1],"36":[4,2],"37":[2,2],"38":[4,3,2,2],"39":[2,0],"40":[2,0],"41":[2,5],"42":[2,0],"43":[2,2],"44":[4,4,2,2,2],"45":[1,1],"46":[2,1,1],"47":[2,2],"48":[2,0],"49":[2,0],"50":[3,2],"51":[3,0],"52":[3,3,3],"53":[6,6,4,4,4],"54":[1,2],"55":[4,2,2],"56":[4,0],"57":[4,0],"58":[4,0],"59":[31,1],"60":[31,1],"61":[20,7,2,2],"62":[0,1],"63":[1,1],"64":[0,2],"65":[0,0],"66":[0,0],"67":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4894071a85611328c2bd67e265d4fe78c8363310"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\mp\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\mp\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":23},"end":{"line":16,"column":1}},"2":{"start":{"line":18,"column":22},"end":{"line":18,"column":65}},"3":{"start":{"line":20,"column":35},"end":{"line":39,"column":1}},"4":{"start":{"line":41,"column":0},"end":{"line":45,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0227832003b0eb2464961ae9e8535dba8ef84053"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\mp\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\mp\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":22},"end":{"line":3,"column":51}},"3":{"start":{"line":20,"column":4},"end":{"line":20,"column":25}},"4":{"start":{"line":25,"column":4},"end":{"line":25,"column":23}},"5":{"start":{"line":27,"column":29},"end":{"line":27,"column":72}},"6":{"start":{"line":29,"column":2},"end":{"line":29,"column":52}},"7":{"start":{"line":30,"column":31},"end":{"line":30,"column":77}},"8":{"start":{"line":32,"column":2},"end":{"line":32,"column":53}},"9":{"start":{"line":35,"column":2},"end":{"line":35,"column":51}},"10":{"start":{"line":39,"column":16},"end":{"line":39,"column":18}},"11":{"start":{"line":41,"column":4},"end":{"line":43,"column":42}},"12":{"start":{"line":45,"column":2},"end":{"line":79,"column":3}},"13":{"start":{"line":50,"column":21},"end":{"line":50,"column":57}},"14":{"start":{"line":51,"column":4},"end":{"line":78,"column":5}},"15":{"start":{"line":52,"column":6},"end":{"line":55,"column":46}},"16":{"start":{"line":56,"column":11},"end":{"line":78,"column":5}},"17":{"start":{"line":57,"column":6},"end":{"line":60,"column":8}},"18":{"start":{"line":62,"column":6},"end":{"line":65,"column":47}},"19":{"start":{"line":66,"column":6},"end":{"line":77,"column":7}},"20":{"start":{"line":67,"column":8},"end":{"line":71,"column":10}},"21":{"start":{"line":73,"column":8},"end":{"line":76,"column":10}},"22":{"start":{"line":81,"column":22},"end":{"line":83,"column":22}},"23":{"start":{"line":85,"column":19},"end":{"line":85,"column":41}},"24":{"start":{"line":86,"column":2},"end":{"line":86,"column":59}},"25":{"start":{"line":87,"column":2},"end":{"line":87,"column":31}},"26":{"start":{"line":88,"column":2},"end":{"line":88,"column":29}},"27":{"start":{"line":89,"column":2},"end":{"line":89,"column":58}},"28":{"start":{"line":90,"column":2},"end":{"line":90,"column":42}},"29":{"start":{"line":92,"column":2},"end":{"line":92,"column":18}},"30":{"start":{"line":96,"column":23},"end":{"line":96,"column":57}},"31":{"start":{"line":97,"column":23},"end":{"line":100,"column":3}},"32":{"start":{"line":101,"column":21},"end":{"line":105,"column":3}},"33":{"start":{"line":107,"column":2},"end":{"line":112,"column":4}},"34":{"start":{"line":116,"column":27},"end":{"line":119,"column":3}},"35":{"start":{"line":120,"column":24},"end":{"line":120,"column":58}},"36":{"start":{"line":122,"column":21},"end":{"line":129,"column":3}},"37":{"start":{"line":131,"column":2},"end":{"line":135,"column":3}},"38":{"start":{"line":132,"column":20},"end":{"line":132,"column":61}},"39":{"start":{"line":133,"column":4},"end":{"line":133,"column":39}},"40":{"start":{"line":134,"column":4},"end":{"line":134,"column":50}},"41":{"start":{"line":137,"column":21},"end":{"line":140,"column":3}},"42":{"start":{"line":142,"column":2},"end":{"line":147,"column":4}},"43":{"start":{"line":151,"column":22},"end":{"line":151,"column":24}},"44":{"start":{"line":152,"column":2},"end":{"line":154,"column":3}},"45":{"start":{"line":153,"column":4},"end":{"line":153,"column":65}},"46":{"start":{"line":155,"column":2},"end":{"line":155,"column":69}},"47":{"start":{"line":156,"column":2},"end":{"line":156,"column":21}},"48":{"start":{"line":160,"column":19},"end":{"line":160,"column":57}},"49":{"start":{"line":161,"column":19},"end":{"line":161,"column":43}},"50":{"start":{"line":162,"column":2},"end":{"line":164,"column":3}},"51":{"start":{"line":163,"column":4},"end":{"line":163,"column":51}},"52":{"start":{"line":166,"column":2},"end":{"line":171,"column":4}},"53":{"start":{"line":178,"column":2},"end":{"line":187,"column":3}},"54":{"start":{"line":179,"column":4},"end":{"line":182,"column":5}},"55":{"start":{"line":180,"column":6},"end":{"line":180,"column":53}},"56":{"start":{"line":181,"column":6},"end":{"line":181,"column":36}},"57":{"start":{"line":183,"column":4},"end":{"line":186,"column":5}},"58":{"start":{"line":184,"column":6},"end":{"line":184,"column":51}},"59":{"start":{"line":185,"column":6},"end":{"line":185,"column":35}},"60":{"start":{"line":189,"column":2},"end":{"line":189,"column":20}},"61":{"start":{"line":193,"column":22},"end":{"line":193,"column":24}},"62":{"start":{"line":195,"column":28},"end":{"line":195,"column":46}},"63":{"start":{"line":197,"column":19},"end":{"line":201,"column":3}},"64":{"start":{"line":202,"column":17},"end":{"line":202,"column":47}},"65":{"start":{"line":203,"column":2},"end":{"line":213,"column":3}},"66":{"start":{"line":205,"column":4},"end":{"line":211,"column":5}},"67":{"start":{"line":206,"column":6},"end":{"line":206,"column":66}},"68":{"start":{"line":207,"column":6},"end":{"line":207,"column":47}},"69":{"start":{"line":208,"column":11},"end":{"line":211,"column":5}},"70":{"start":{"line":209,"column":6},"end":{"line":209,"column":70}},"71":{"start":{"line":210,"column":6},"end":{"line":210,"column":51}},"72":{"start":{"line":212,"column":4},"end":{"line":212,"column":47}},"73":{"start":{"line":214,"column":2},"end":{"line":218,"column":3}},"74":{"start":{"line":215,"column":20},"end":{"line":215,"column":61}},"75":{"start":{"line":216,"column":4},"end":{"line":216,"column":39}},"76":{"start":{"line":217,"column":4},"end":{"line":217,"column":50}},"77":{"start":{"line":219,"column":24},"end":{"line":219,"column":58}},"78":{"start":{"line":221,"column":21},"end":{"line":227,"column":3}},"79":{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},"80":{"start":{"line":229,"column":4},"end":{"line":229,"column":35}},"81":{"start":{"line":231,"column":2},"end":{"line":233,"column":4}},"82":{"start":{"line":235,"column":2},"end":{"line":282,"column":3}},"83":{"start":{"line":257,"column":28},"end":{"line":263,"column":5}},"84":{"start":{"line":264,"column":34},"end":{"line":269,"column":5}},"85":{"start":{"line":271,"column":4},"end":{"line":274,"column":45}},"86":{"start":{"line":276,"column":4},"end":{"line":280,"column":6}},"87":{"start":{"line":281,"column":4},"end":{"line":281,"column":44}},"88":{"start":{"line":284,"column":2},"end":{"line":284,"column":21}},"89":{"start":{"line":288,"column":27},"end":{"line":291,"column":3}},"90":{"start":{"line":292,"column":24},"end":{"line":292,"column":58}},"91":{"start":{"line":293,"column":21},"end":{"line":300,"column":3}},"92":{"start":{"line":302,"column":2},"end":{"line":304,"column":3}},"93":{"start":{"line":303,"column":4},"end":{"line":303,"column":35}},"94":{"start":{"line":305,"column":2},"end":{"line":307,"column":3}},"95":{"start":{"line":306,"column":4},"end":{"line":306,"column":43}},"96":{"start":{"line":308,"column":2},"end":{"line":312,"column":3}},"97":{"start":{"line":309,"column":20},"end":{"line":309,"column":61}},"98":{"start":{"line":310,"column":4},"end":{"line":310,"column":39}},"99":{"start":{"line":311,"column":4},"end":{"line":311,"column":50}},"100":{"start":{"line":314,"column":20},"end":{"line":314,"column":73}},"101":{"start":{"line":315,"column":21},"end":{"line":318,"column":3}},"102":{"start":{"line":319,"column":2},"end":{"line":319,"column":78}},"103":{"start":{"line":323,"column":2},"end":{"line":328,"column":3}},"104":{"start":{"line":324,"column":4},"end":{"line":327,"column":6}},"105":{"start":{"line":329,"column":21},"end":{"line":336,"column":3}},"106":{"start":{"line":337,"column":2},"end":{"line":337,"column":78}},"107":{"start":{"line":341,"column":22},"end":{"line":341,"column":24}},"108":{"start":{"line":342,"column":20},"end":{"line":345,"column":3}},"109":{"start":{"line":347,"column":2},"end":{"line":392,"column":3}},"110":{"start":{"line":348,"column":4},"end":{"line":389,"column":7}},"111":{"start":{"line":349,"column":6},"end":{"line":349,"column":50}},"112":{"start":{"line":350,"column":6},"end":{"line":388,"column":7}},"113":{"start":{"line":351,"column":27},"end":{"line":357,"column":9}},"114":{"start":{"line":358,"column":25},"end":{"line":363,"column":9}},"115":{"start":{"line":364,"column":8},"end":{"line":364,"column":35}},"116":{"start":{"line":366,"column":32},"end":{"line":373,"column":9}},"117":{"start":{"line":375,"column":30},"end":{"line":380,"column":9}},"118":{"start":{"line":382,"column":8},"end":{"line":385,"column":49}},"119":{"start":{"line":387,"column":8},"end":{"line":387,"column":40}},"120":{"start":{"line":391,"column":4},"end":{"line":391,"column":58}},"121":{"start":{"line":393,"column":2},"end":{"line":393,"column":21}},"122":{"start":{"line":397,"column":2},"end":{"line":402,"column":3}},"123":{"start":{"line":398,"column":4},"end":{"line":401,"column":6}},"124":{"start":{"line":403,"column":2},"end":{"line":419,"column":3}},"125":{"start":{"line":405,"column":6},"end":{"line":405,"column":48}},"126":{"start":{"line":408,"column":6},"end":{"line":408,"column":75}},"127":{"start":{"line":411,"column":6},"end":{"line":411,"column":71}},"128":{"start":{"line":413,"column":6},"end":{"line":413,"column":68}},"129":{"start":{"line":415,"column":6},"end":{"line":415,"column":68}},"130":{"start":{"line":418,"column":6},"end":{"line":418,"column":63}},"131":{"start":{"line":423,"column":2},"end":{"line":423,"column":64}},"132":{"start":{"line":430,"column":26},"end":{"line":467,"column":1}},"133":{"start":{"line":431,"column":2},"end":{"line":434,"column":3}},"134":{"start":{"line":432,"column":23},"end":{"line":432,"column":75}},"135":{"start":{"line":433,"column":4},"end":{"line":433,"column":24}},"136":{"start":{"line":436,"column":19},"end":{"line":465,"column":3}},"137":{"start":{"line":438,"column":6},"end":{"line":463,"column":7}},"138":{"start":{"line":439,"column":8},"end":{"line":446,"column":9}},"139":{"start":{"line":441,"column":10},"end":{"line":445,"column":12}},"140":{"start":{"line":448,"column":8},"end":{"line":452,"column":10}},"141":{"start":{"line":454,"column":8},"end":{"line":462,"column":10}},"142":{"start":{"line":466,"column":2},"end":{"line":466,"column":18}},"143":{"start":{"line":469,"column":0},"end":{"line":469,"column":48}}},"fnMap":{"0":{"name":"getEventTime","decl":{"start":{"line":34,"column":9},"end":{"line":34,"column":21}},"loc":{"start":{"line":34,"column":31},"end":{"line":36,"column":1}},"line":34},"1":{"name":"responseBuilderSimple","decl":{"start":{"line":38,"column":9},"end":{"line":38,"column":30}},"loc":{"start":{"line":38,"column":75},"end":{"line":93,"column":1}},"line":38},"2":{"name":"processRevenueEvents","decl":{"start":{"line":95,"column":9},"end":{"line":95,"column":29}},"loc":{"start":{"line":95,"column":52},"end":{"line":113,"column":1}},"line":95},"3":{"name":"getEventValueForTrackEvent","decl":{"start":{"line":115,"column":9},"end":{"line":115,"column":35}},"loc":{"start":{"line":115,"column":58},"end":{"line":148,"column":1}},"line":115},"4":{"name":"processTrack","decl":{"start":{"line":150,"column":9},"end":{"line":150,"column":21}},"loc":{"start":{"line":150,"column":44},"end":{"line":157,"column":1}},"line":150},"5":{"name":"getTransformedJSON","decl":{"start":{"line":159,"column":9},"end":{"line":159,"column":27}},"loc":{"start":{"line":159,"column":65},"end":{"line":190,"column":1}},"line":159},"6":{"name":"processIdentifyEvents","decl":{"start":{"line":192,"column":9},"end":{"line":192,"column":30}},"loc":{"start":{"line":192,"column":59},"end":{"line":285,"column":1}},"line":192},"7":{"name":"processPageOrScreenEvents","decl":{"start":{"line":287,"column":9},"end":{"line":287,"column":34}},"loc":{"start":{"line":287,"column":63},"end":{"line":320,"column":1}},"line":287},"8":{"name":"processAliasEvents","decl":{"start":{"line":322,"column":9},"end":{"line":322,"column":27}},"loc":{"start":{"line":322,"column":56},"end":{"line":338,"column":1}},"line":322},"9":{"name":"processGroupEvents","decl":{"start":{"line":340,"column":9},"end":{"line":340,"column":27}},"loc":{"start":{"line":340,"column":56},"end":{"line":394,"column":1}},"line":340},"10":{"name":"(anonymous_10)","decl":{"start":{"line":348,"column":22},"end":{"line":348,"column":23}},"loc":{"start":{"line":348,"column":34},"end":{"line":389,"column":5}},"line":348},"11":{"name":"processSingleMessage","decl":{"start":{"line":396,"column":9},"end":{"line":396,"column":29}},"loc":{"start":{"line":396,"column":52},"end":{"line":420,"column":1}},"line":396},"12":{"name":"process","decl":{"start":{"line":422,"column":9},"end":{"line":422,"column":16}},"loc":{"start":{"line":422,"column":24},"end":{"line":424,"column":1}},"line":422},"13":{"name":"(anonymous_13)","decl":{"start":{"line":430,"column":26},"end":{"line":430,"column":27}},"loc":{"start":{"line":430,"column":42},"end":{"line":467,"column":1}},"line":430},"14":{"name":"(anonymous_14)","decl":{"start":{"line":437,"column":15},"end":{"line":437,"column":16}},"loc":{"start":{"line":437,"column":30},"end":{"line":464,"column":5}},"line":437}},"branchMap":{"0":{"loc":{"start":{"line":41,"column":4},"end":{"line":43,"column":42}},"type":"cond-expr","locations":[{"start":{"line":42,"column":8},"end":{"line":42,"column":45}},{"start":{"line":43,"column":8},"end":{"line":43,"column":42}}],"line":41},"1":{"loc":{"start":{"line":45,"column":2},"end":{"line":79,"column":3}},"type":"if","locations":[{"start":{"line":45,"column":2},"end":{"line":79,"column":3}},{"start":{"line":45,"column":2},"end":{"line":79,"column":3}}],"line":45},"2":{"loc":{"start":{"line":46,"column":4},"end":{"line":48,"column":27}},"type":"binary-expr","locations":[{"start":{"line":46,"column":4},"end":{"line":46,"column":36}},{"start":{"line":47,"column":4},"end":{"line":47,"column":33}},{"start":{"line":48,"column":4},"end":{"line":48,"column":27}}],"line":46},"3":{"loc":{"start":{"line":51,"column":4},"end":{"line":78,"column":5}},"type":"if","locations":[{"start":{"line":51,"column":4},"end":{"line":78,"column":5}},{"start":{"line":51,"column":4},"end":{"line":78,"column":5}}],"line":51},"4":{"loc":{"start":{"line":53,"column":8},"end":{"line":55,"column":45}},"type":"cond-expr","locations":[{"start":{"line":54,"column":12},"end":{"line":54,"column":48}},{"start":{"line":55,"column":12},"end":{"line":55,"column":45}}],"line":53},"5":{"loc":{"start":{"line":56,"column":11},"end":{"line":78,"column":5}},"type":"if","locations":[{"start":{"line":56,"column":11},"end":{"line":78,"column":5}},{"start":{"line":56,"column":11},"end":{"line":78,"column":5}}],"line":56},"6":{"loc":{"start":{"line":63,"column":8},"end":{"line":65,"column":46}},"type":"cond-expr","locations":[{"start":{"line":64,"column":12},"end":{"line":64,"column":49}},{"start":{"line":65,"column":12},"end":{"line":65,"column":46}}],"line":63},"7":{"loc":{"start":{"line":66,"column":6},"end":{"line":77,"column":7}},"type":"if","locations":[{"start":{"line":66,"column":6},"end":{"line":77,"column":7}},{"start":{"line":66,"column":6},"end":{"line":77,"column":7}}],"line":66},"8":{"loc":{"start":{"line":89,"column":20},"end":{"line":89,"column":57}},"type":"binary-expr","locations":[{"start":{"line":89,"column":20},"end":{"line":89,"column":39}},{"start":{"line":89,"column":43},"end":{"line":89,"column":57}}],"line":89},"9":{"loc":{"start":{"line":104,"column":18},"end":{"line":104,"column":55}},"type":"binary-expr","locations":[{"start":{"line":104,"column":18},"end":{"line":104,"column":32}},{"start":{"line":104,"column":36},"end":{"line":104,"column":55}}],"line":104},"10":{"loc":{"start":{"line":127,"column":17},"end":{"line":127,"column":54}},"type":"binary-expr","locations":[{"start":{"line":127,"column":17},"end":{"line":127,"column":31}},{"start":{"line":127,"column":35},"end":{"line":127,"column":54}}],"line":127},"11":{"loc":{"start":{"line":131,"column":2},"end":{"line":135,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":135,"column":3}},{"start":{"line":131,"column":2},"end":{"line":135,"column":3}}],"line":131},"12":{"loc":{"start":{"line":131,"column":6},"end":{"line":131,"column":60}},"type":"binary-expr","locations":[{"start":{"line":131,"column":6},"end":{"line":131,"column":31}},{"start":{"line":131,"column":35},"end":{"line":131,"column":60}}],"line":131},"13":{"loc":{"start":{"line":152,"column":2},"end":{"line":154,"column":3}},"type":"if","locations":[{"start":{"line":152,"column":2},"end":{"line":154,"column":3}},{"start":{"line":152,"column":2},"end":{"line":154,"column":3}}],"line":152},"14":{"loc":{"start":{"line":152,"column":6},"end":{"line":152,"column":54}},"type":"binary-expr","locations":[{"start":{"line":152,"column":6},"end":{"line":152,"column":24}},{"start":{"line":152,"column":28},"end":{"line":152,"column":54}}],"line":152},"15":{"loc":{"start":{"line":162,"column":2},"end":{"line":164,"column":3}},"type":"if","locations":[{"start":{"line":162,"column":2},"end":{"line":164,"column":3}},{"start":{"line":162,"column":2},"end":{"line":164,"column":3}}],"line":162},"16":{"loc":{"start":{"line":178,"column":2},"end":{"line":187,"column":3}},"type":"if","locations":[{"start":{"line":178,"column":2},"end":{"line":187,"column":3}},{"start":{"line":178,"column":2},"end":{"line":187,"column":3}}],"line":178},"17":{"loc":{"start":{"line":179,"column":4},"end":{"line":182,"column":5}},"type":"if","locations":[{"start":{"line":179,"column":4},"end":{"line":182,"column":5}},{"start":{"line":179,"column":4},"end":{"line":182,"column":5}}],"line":179},"18":{"loc":{"start":{"line":183,"column":4},"end":{"line":186,"column":5}},"type":"if","locations":[{"start":{"line":183,"column":4},"end":{"line":186,"column":5}},{"start":{"line":183,"column":4},"end":{"line":186,"column":5}}],"line":183},"19":{"loc":{"start":{"line":203,"column":2},"end":{"line":213,"column":3}},"type":"if","locations":[{"start":{"line":203,"column":2},"end":{"line":213,"column":3}},{"start":{"line":203,"column":2},"end":{"line":213,"column":3}}],"line":203},"20":{"loc":{"start":{"line":203,"column":6},"end":{"line":203,"column":28}},"type":"binary-expr","locations":[{"start":{"line":203,"column":6},"end":{"line":203,"column":12}},{"start":{"line":203,"column":16},"end":{"line":203,"column":28}}],"line":203},"21":{"loc":{"start":{"line":205,"column":4},"end":{"line":211,"column":5}},"type":"if","locations":[{"start":{"line":205,"column":4},"end":{"line":211,"column":5}},{"start":{"line":205,"column":4},"end":{"line":211,"column":5}}],"line":205},"22":{"loc":{"start":{"line":208,"column":11},"end":{"line":211,"column":5}},"type":"if","locations":[{"start":{"line":208,"column":11},"end":{"line":211,"column":5}},{"start":{"line":208,"column":11},"end":{"line":211,"column":5}}],"line":208},"23":{"loc":{"start":{"line":214,"column":2},"end":{"line":218,"column":3}},"type":"if","locations":[{"start":{"line":214,"column":2},"end":{"line":218,"column":3}},{"start":{"line":214,"column":2},"end":{"line":218,"column":3}}],"line":214},"24":{"loc":{"start":{"line":214,"column":6},"end":{"line":214,"column":60}},"type":"binary-expr","locations":[{"start":{"line":214,"column":6},"end":{"line":214,"column":31}},{"start":{"line":214,"column":35},"end":{"line":214,"column":60}}],"line":214},"25":{"loc":{"start":{"line":224,"column":18},"end":{"line":224,"column":55}},"type":"binary-expr","locations":[{"start":{"line":224,"column":18},"end":{"line":224,"column":32}},{"start":{"line":224,"column":36},"end":{"line":224,"column":55}}],"line":224},"26":{"loc":{"start":{"line":225,"column":9},"end":{"line":225,"column":57}},"type":"binary-expr","locations":[{"start":{"line":225,"column":9},"end":{"line":225,"column":35}},{"start":{"line":225,"column":39},"end":{"line":225,"column":57}}],"line":225},"27":{"loc":{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},{"start":{"line":228,"column":2},"end":{"line":230,"column":3}}],"line":228},"28":{"loc":{"start":{"line":235,"column":2},"end":{"line":282,"column":3}},"type":"if","locations":[{"start":{"line":235,"column":2},"end":{"line":282,"column":3}},{"start":{"line":235,"column":2},"end":{"line":282,"column":3}}],"line":235},"29":{"loc":{"start":{"line":235,"column":6},"end":{"line":235,"column":75}},"type":"binary-expr","locations":[{"start":{"line":235,"column":6},"end":{"line":235,"column":20}},{"start":{"line":235,"column":24},"end":{"line":235,"column":43}},{"start":{"line":235,"column":47},"end":{"line":235,"column":75}}],"line":235},"30":{"loc":{"start":{"line":272,"column":6},"end":{"line":274,"column":44}},"type":"cond-expr","locations":[{"start":{"line":273,"column":10},"end":{"line":273,"column":47}},{"start":{"line":274,"column":10},"end":{"line":274,"column":44}}],"line":272},"31":{"loc":{"start":{"line":298,"column":17},"end":{"line":298,"column":54}},"type":"binary-expr","locations":[{"start":{"line":298,"column":17},"end":{"line":298,"column":31}},{"start":{"line":298,"column":35},"end":{"line":298,"column":54}}],"line":298},"32":{"loc":{"start":{"line":302,"column":2},"end":{"line":304,"column":3}},"type":"if","locations":[{"start":{"line":302,"column":2},"end":{"line":304,"column":3}},{"start":{"line":302,"column":2},"end":{"line":304,"column":3}}],"line":302},"33":{"loc":{"start":{"line":305,"column":2},"end":{"line":307,"column":3}},"type":"if","locations":[{"start":{"line":305,"column":2},"end":{"line":307,"column":3}},{"start":{"line":305,"column":2},"end":{"line":307,"column":3}}],"line":305},"34":{"loc":{"start":{"line":308,"column":2},"end":{"line":312,"column":3}},"type":"if","locations":[{"start":{"line":308,"column":2},"end":{"line":312,"column":3}},{"start":{"line":308,"column":2},"end":{"line":312,"column":3}}],"line":308},"35":{"loc":{"start":{"line":308,"column":6},"end":{"line":308,"column":60}},"type":"binary-expr","locations":[{"start":{"line":308,"column":6},"end":{"line":308,"column":31}},{"start":{"line":308,"column":35},"end":{"line":308,"column":60}}],"line":308},"36":{"loc":{"start":{"line":314,"column":20},"end":{"line":314,"column":73}},"type":"cond-expr","locations":[{"start":{"line":314,"column":38},"end":{"line":314,"column":53}},{"start":{"line":314,"column":56},"end":{"line":314,"column":73}}],"line":314},"37":{"loc":{"start":{"line":323,"column":2},"end":{"line":328,"column":3}},"type":"if","locations":[{"start":{"line":323,"column":2},"end":{"line":328,"column":3}},{"start":{"line":323,"column":2},"end":{"line":328,"column":3}}],"line":323},"38":{"loc":{"start":{"line":323,"column":8},"end":{"line":323,"column":49}},"type":"binary-expr","locations":[{"start":{"line":323,"column":8},"end":{"line":323,"column":26}},{"start":{"line":323,"column":30},"end":{"line":323,"column":49}}],"line":323},"39":{"loc":{"start":{"line":332,"column":19},"end":{"line":332,"column":60}},"type":"binary-expr","locations":[{"start":{"line":332,"column":19},"end":{"line":332,"column":37}},{"start":{"line":332,"column":41},"end":{"line":332,"column":60}}],"line":332},"40":{"loc":{"start":{"line":347,"column":2},"end":{"line":392,"column":3}},"type":"if","locations":[{"start":{"line":347,"column":2},"end":{"line":392,"column":3}},{"start":{"line":347,"column":2},"end":{"line":392,"column":3}}],"line":347},"41":{"loc":{"start":{"line":350,"column":6},"end":{"line":388,"column":7}},"type":"if","locations":[{"start":{"line":350,"column":6},"end":{"line":388,"column":7}},{"start":{"line":350,"column":6},"end":{"line":388,"column":7}}],"line":350},"42":{"loc":{"start":{"line":353,"column":24},"end":{"line":353,"column":61}},"type":"binary-expr","locations":[{"start":{"line":353,"column":24},"end":{"line":353,"column":38}},{"start":{"line":353,"column":42},"end":{"line":353,"column":61}}],"line":353},"43":{"loc":{"start":{"line":383,"column":10},"end":{"line":385,"column":48}},"type":"cond-expr","locations":[{"start":{"line":384,"column":14},"end":{"line":384,"column":51}},{"start":{"line":385,"column":14},"end":{"line":385,"column":48}}],"line":383},"44":{"loc":{"start":{"line":397,"column":2},"end":{"line":402,"column":3}},"type":"if","locations":[{"start":{"line":397,"column":2},"end":{"line":402,"column":3}},{"start":{"line":397,"column":2},"end":{"line":402,"column":3}}],"line":397},"45":{"loc":{"start":{"line":403,"column":2},"end":{"line":419,"column":3}},"type":"switch","locations":[{"start":{"line":404,"column":4},"end":{"line":405,"column":48}},{"start":{"line":406,"column":4},"end":{"line":406,"column":26}},{"start":{"line":407,"column":4},"end":{"line":409,"column":5}},{"start":{"line":410,"column":4},"end":{"line":411,"column":71}},{"start":{"line":412,"column":4},"end":{"line":413,"column":68}},{"start":{"line":414,"column":4},"end":{"line":415,"column":68}},{"start":{"line":417,"column":4},"end":{"line":418,"column":63}}],"line":403},"46":{"loc":{"start":{"line":431,"column":2},"end":{"line":434,"column":3}},"type":"if","locations":[{"start":{"line":431,"column":2},"end":{"line":434,"column":3}},{"start":{"line":431,"column":2},"end":{"line":434,"column":3}}],"line":431},"47":{"loc":{"start":{"line":431,"column":6},"end":{"line":431,"column":50}},"type":"binary-expr","locations":[{"start":{"line":431,"column":6},"end":{"line":431,"column":28}},{"start":{"line":431,"column":32},"end":{"line":431,"column":50}}],"line":431},"48":{"loc":{"start":{"line":439,"column":8},"end":{"line":446,"column":9}},"type":"if","locations":[{"start":{"line":439,"column":8},"end":{"line":446,"column":9}},{"start":{"line":439,"column":8},"end":{"line":446,"column":9}}],"line":439},"49":{"loc":{"start":{"line":456,"column":10},"end":{"line":460,"column":17}},"type":"cond-expr","locations":[{"start":{"line":457,"column":14},"end":{"line":457,"column":35}},{"start":{"line":458,"column":14},"end":{"line":460,"column":17}}],"line":456},"50":{"loc":{"start":{"line":458,"column":14},"end":{"line":460,"column":17}},"type":"cond-expr","locations":[{"start":{"line":459,"column":14},"end":{"line":459,"column":24}},{"start":{"line":460,"column":14},"end":{"line":460,"column":17}}],"line":458},"51":{"loc":{"start":{"line":461,"column":10},"end":{"line":461,"column":69}},"type":"binary-expr","locations":[{"start":{"line":461,"column":10},"end":{"line":461,"column":23}},{"start":{"line":461,"column":27},"end":{"line":461,"column":69}}],"line":461}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":4,"10":45,"11":45,"12":45,"13":18,"14":18,"15":15,"16":3,"17":1,"18":2,"19":2,"20":1,"21":1,"22":43,"23":43,"24":43,"25":43,"26":43,"27":43,"28":43,"29":43,"30":4,"31":4,"32":4,"33":4,"34":9,"35":9,"36":9,"37":9,"38":8,"39":8,"40":8,"41":9,"42":9,"43":9,"44":9,"45":4,"46":9,"47":7,"48":17,"49":17,"50":17,"51":14,"52":17,"53":17,"54":10,"55":7,"56":7,"57":10,"58":4,"59":4,"60":17,"61":17,"62":17,"63":17,"64":17,"65":17,"66":3,"67":2,"68":2,"69":1,"70":1,"71":1,"72":3,"73":17,"74":14,"75":14,"76":14,"77":17,"78":17,"79":17,"80":1,"81":17,"82":17,"83":2,"84":2,"85":2,"86":2,"87":2,"88":17,"89":7,"90":7,"91":7,"92":7,"93":7,"94":7,"95":2,"96":7,"97":4,"98":4,"99":4,"100":7,"101":7,"102":7,"103":3,"104":1,"105":2,"106":2,"107":3,"108":3,"109":3,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"117":2,"118":2,"119":2,"120":1,"121":2,"122":40,"123":0,"124":40,"125":9,"126":7,"127":17,"128":3,"129":3,"130":1,"131":40,"132":1,"133":1,"134":0,"135":0,"136":1,"137":2,"138":2,"139":0,"140":2,"141":0,"142":1,"143":1},"f":{"0":4,"1":45,"2":4,"3":9,"4":9,"5":17,"6":17,"7":7,"8":3,"9":3,"10":2,"11":40,"12":40,"13":1,"14":2},"b":{"0":[10,35],"1":[18,27],"2":[45,26,22],"3":[15,3],"4":[1,14],"5":[1,2],"6":[1,1],"7":[1,1],"8":[43,2],"9":[4,4],"10":[9,6],"11":[8,1],"12":[9,8],"13":[4,5],"14":[9,9],"15":[14,3],"16":[10,7],"17":[7,3],"18":[4,6],"19":[3,14],"20":[17,3],"21":[2,1],"22":[1,0],"23":[14,3],"24":[17,14],"25":[17,15],"26":[17,3],"27":[1,16],"28":[2,15],"29":[17,2,2],"30":[2,0],"31":[7,1],"32":[7,0],"33":[2,5],"34":[4,3],"35":[7,4],"36":[4,3],"37":[1,2],"38":[3,2],"39":[2,1],"40":[2,1],"41":[2,0],"42":[2,1],"43":[1,1],"44":[0,40],"45":[9,3,7,17,3,3,1],"46":[0,1],"47":[1,1],"48":[0,2],"49":[0,0],"50":[0,0],"51":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8e4e6ef842b9cad7402bf5e4c82d49e66dd4947a"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\mssql\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\mssql\\transform.js","statementMap":{"0":{"start":{"line":1,"column":36},"end":{"line":1,"column":65}},"1":{"start":{"line":3,"column":14},"end":{"line":3,"column":21}},"2":{"start":{"line":6,"column":2},"end":{"line":6,"column":51}},"3":{"start":{"line":12,"column":26},"end":{"line":12,"column":69}},"4":{"start":{"line":13,"column":23},"end":{"line":13,"column":71}},"5":{"start":{"line":14,"column":19},"end":{"line":14,"column":24}},"6":{"start":{"line":15,"column":2},"end":{"line":22,"column":5}},"7":{"start":{"line":25,"column":0},"end":{"line":28,"column":2}}},"fnMap":{"0":{"name":"processSingleMessage","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":29}},"loc":{"start":{"line":5,"column":48},"end":{"line":7,"column":1}},"line":5},"1":{"name":"getDataTypeOverride","decl":{"start":{"line":9,"column":9},"end":{"line":9,"column":28}},"loc":{"start":{"line":9,"column":48},"end":{"line":9,"column":50}},"line":9},"2":{"name":"process","decl":{"start":{"line":11,"column":9},"end":{"line":11,"column":16}},"loc":{"start":{"line":11,"column":24},"end":{"line":23,"column":1}},"line":11}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":26},"end":{"line":12,"column":69}},"type":"binary-expr","locations":[{"start":{"line":12,"column":26},"end":{"line":12,"column":61}},{"start":{"line":12,"column":65},"end":{"line":12,"column":69}}],"line":12},"1":{"loc":{"start":{"line":21,"column":20},"end":{"line":21,"column":73}},"type":"cond-expr","locations":[{"start":{"line":21,"column":37},"end":{"line":21,"column":66}},{"start":{"line":21,"column":69},"end":{"line":21,"column":73}}],"line":21}},"s":{"0":3,"1":3,"2":124,"3":124,"4":124,"5":124,"6":124,"7":3},"f":{"0":124,"1":2917,"2":124},"b":{"0":[124,0],"1":[6,118]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"9971ad97317a6ec76b7041651dfbc1b865ee98eb"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\ometria\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\ometria\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":50}},"2":{"start":{"line":4,"column":26},"end":{"line":10,"column":1}},"3":{"start":{"line":12,"column":23},"end":{"line":12,"column":26}},"4":{"start":{"line":13,"column":23},"end":{"line":13,"column":69}},"5":{"start":{"line":14,"column":34},"end":{"line":51,"column":1}},"6":{"start":{"line":53,"column":38},"end":{"line":62,"column":1}},"7":{"start":{"line":64,"column":31},"end":{"line":88,"column":1}},"8":{"start":{"line":90,"column":35},"end":{"line":106,"column":1}},"9":{"start":{"line":108,"column":29},"end":{"line":112,"column":1}},"10":{"start":{"line":114,"column":19},"end":{"line":122,"column":1}},"11":{"start":{"line":124,"column":25},"end":{"line":132,"column":1}},"12":{"start":{"line":134,"column":21},"end":{"line":296,"column":1}},"13":{"start":{"line":298,"column":0},"end":{"line":314,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"61aa1f22b7082ccc9bfdd80b13041c9989c21a5f"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\ometria\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\ometria\\transform.js","statementMap":{"0":{"start":{"line":3,"column":22},"end":{"line":3,"column":51}},"1":{"start":{"line":18,"column":4},"end":{"line":18,"column":31}},"2":{"start":{"line":32,"column":4},"end":{"line":32,"column":23}},"3":{"start":{"line":38,"column":4},"end":{"line":38,"column":21}},"4":{"start":{"line":40,"column":32},"end":{"line":121,"column":1}},"5":{"start":{"line":41,"column":16},"end":{"line":41,"column":61}},"6":{"start":{"line":42,"column":2},"end":{"line":42,"column":45}},"7":{"start":{"line":44,"column":2},"end":{"line":44,"column":31}},"8":{"start":{"line":45,"column":2},"end":{"line":56,"column":3}},"9":{"start":{"line":46,"column":23},"end":{"line":46,"column":25}},"10":{"start":{"line":47,"column":4},"end":{"line":52,"column":6}},"11":{"start":{"line":53,"column":4},"end":{"line":55,"column":5}},"12":{"start":{"line":54,"column":6},"end":{"line":54,"column":40}},"13":{"start":{"line":58,"column":63},"end":{"line":58,"column":69}},"14":{"start":{"line":61,"column":26},"end":{"line":61,"column":64}},"15":{"start":{"line":62,"column":2},"end":{"line":88,"column":3}},"16":{"start":{"line":63,"column":4},"end":{"line":68,"column":5}},"17":{"start":{"line":67,"column":6},"end":{"line":67,"column":54}},"18":{"start":{"line":69,"column":4},"end":{"line":71,"column":5}},"19":{"start":{"line":70,"column":6},"end":{"line":70,"column":45}},"20":{"start":{"line":73,"column":4},"end":{"line":73,"column":70}},"21":{"start":{"line":74,"column":4},"end":{"line":75,"column":63}},"22":{"start":{"line":76,"column":4},"end":{"line":81,"column":5}},"23":{"start":{"line":80,"column":6},"end":{"line":80,"column":66}},"24":{"start":{"line":82,"column":4},"end":{"line":87,"column":5}},"25":{"start":{"line":86,"column":6},"end":{"line":86,"column":74}},"26":{"start":{"line":90,"column":2},"end":{"line":92,"column":3}},"27":{"start":{"line":91,"column":4},"end":{"line":91,"column":69}},"28":{"start":{"line":93,"column":2},"end":{"line":93,"column":43}},"29":{"start":{"line":94,"column":2},"end":{"line":101,"column":4}},"30":{"start":{"line":103,"column":15},"end":{"line":106,"column":4}},"31":{"start":{"line":107,"column":2},"end":{"line":118,"column":3}},"32":{"start":{"line":108,"column":21},"end":{"line":108,"column":36}},"33":{"start":{"line":109,"column":34},"end":{"line":109,"column":42}},"34":{"start":{"line":110,"column":4},"end":{"line":117,"column":5}},"35":{"start":{"line":111,"column":6},"end":{"line":111,"column":40}},"36":{"start":{"line":112,"column":6},"end":{"line":112,"column":39}},"37":{"start":{"line":114,"column":6},"end":{"line":114,"column":40}},"38":{"start":{"line":115,"column":6},"end":{"line":115,"column":41}},"39":{"start":{"line":116,"column":6},"end":{"line":116,"column":39}},"40":{"start":{"line":120,"column":2},"end":{"line":120,"column":47}},"41":{"start":{"line":123,"column":29},"end":{"line":214,"column":1}},"42":{"start":{"line":124,"column":14},"end":{"line":124,"column":51}},"43":{"start":{"line":125,"column":2},"end":{"line":127,"column":3}},"44":{"start":{"line":126,"column":4},"end":{"line":126,"column":73}},"45":{"start":{"line":129,"column":2},"end":{"line":129,"column":37}},"46":{"start":{"line":130,"column":16},"end":{"line":130,"column":18}},"47":{"start":{"line":131,"column":2},"end":{"line":191,"column":3}},"48":{"start":{"line":132,"column":4},"end":{"line":132,"column":54}},"49":{"start":{"line":133,"column":4},"end":{"line":135,"column":5}},"50":{"start":{"line":134,"column":6},"end":{"line":134,"column":70}},"51":{"start":{"line":136,"column":4},"end":{"line":136,"column":61}},"52":{"start":{"line":137,"column":4},"end":{"line":142,"column":5}},"53":{"start":{"line":138,"column":6},"end":{"line":141,"column":8}},"54":{"start":{"line":144,"column":21},"end":{"line":153,"column":6}},"55":{"start":{"line":154,"column":4},"end":{"line":159,"column":5}},"56":{"start":{"line":155,"column":6},"end":{"line":158,"column":8}},"57":{"start":{"line":161,"column":4},"end":{"line":161,"column":32}},"58":{"start":{"line":162,"column":4},"end":{"line":162,"column":31}},"59":{"start":{"line":163,"column":4},"end":{"line":163,"column":45}},"60":{"start":{"line":164,"column":4},"end":{"line":164,"column":28}},"61":{"start":{"line":165,"column":4},"end":{"line":176,"column":5}},"62":{"start":{"line":166,"column":25},"end":{"line":166,"column":27}},"63":{"start":{"line":167,"column":6},"end":{"line":172,"column":8}},"64":{"start":{"line":173,"column":6},"end":{"line":175,"column":7}},"65":{"start":{"line":174,"column":8},"end":{"line":174,"column":42}},"66":{"start":{"line":177,"column":18},"end":{"line":177,"column":69}},"67":{"start":{"line":178,"column":4},"end":{"line":183,"column":5}},"68":{"start":{"line":179,"column":24},"end":{"line":179,"column":46}},"69":{"start":{"line":180,"column":6},"end":{"line":182,"column":7}},"70":{"start":{"line":181,"column":8},"end":{"line":181,"column":38}},"71":{"start":{"line":184,"column":4},"end":{"line":186,"column":5}},"72":{"start":{"line":185,"column":6},"end":{"line":185,"column":72}},"73":{"start":{"line":187,"column":4},"end":{"line":189,"column":5}},"74":{"start":{"line":188,"column":6},"end":{"line":188,"column":74}},"75":{"start":{"line":190,"column":4},"end":{"line":190,"column":49}},"76":{"start":{"line":194,"column":2},"end":{"line":194,"column":58}},"77":{"start":{"line":195,"column":2},"end":{"line":197,"column":3}},"78":{"start":{"line":196,"column":4},"end":{"line":196,"column":68}},"79":{"start":{"line":198,"column":2},"end":{"line":200,"column":3}},"80":{"start":{"line":199,"column":4},"end":{"line":199,"column":35}},"81":{"start":{"line":201,"column":2},"end":{"line":201,"column":36}},"82":{"start":{"line":202,"column":2},"end":{"line":202,"column":29}},"83":{"start":{"line":203,"column":2},"end":{"line":212,"column":3}},"84":{"start":{"line":204,"column":23},"end":{"line":204,"column":25}},"85":{"start":{"line":205,"column":4},"end":{"line":210,"column":6}},"86":{"start":{"line":211,"column":4},"end":{"line":211,"column":38}},"87":{"start":{"line":213,"column":2},"end":{"line":213,"column":47}},"88":{"start":{"line":216,"column":22},"end":{"line":233,"column":1}},"89":{"start":{"line":217,"column":2},"end":{"line":219,"column":3}},"90":{"start":{"line":218,"column":4},"end":{"line":218,"column":62}},"91":{"start":{"line":220,"column":22},"end":{"line":220,"column":48}},"92":{"start":{"line":222,"column":2},"end":{"line":231,"column":3}},"93":{"start":{"line":224,"column":6},"end":{"line":224,"column":62}},"94":{"start":{"line":225,"column":6},"end":{"line":225,"column":12}},"95":{"start":{"line":227,"column":6},"end":{"line":227,"column":46}},"96":{"start":{"line":228,"column":6},"end":{"line":228,"column":12}},"97":{"start":{"line":230,"column":6},"end":{"line":230,"column":78}},"98":{"start":{"line":232,"column":2},"end":{"line":232,"column":17}},"99":{"start":{"line":238,"column":16},"end":{"line":260,"column":1}},"100":{"start":{"line":239,"column":35},"end":{"line":239,"column":40}},"101":{"start":{"line":240,"column":2},"end":{"line":245,"column":3}},"102":{"start":{"line":241,"column":4},"end":{"line":244,"column":6}},"103":{"start":{"line":247,"column":2},"end":{"line":249,"column":3}},"104":{"start":{"line":248,"column":4},"end":{"line":248,"column":50}},"105":{"start":{"line":251,"column":18},"end":{"line":251,"column":53}},"106":{"start":{"line":252,"column":19},"end":{"line":252,"column":41}},"107":{"start":{"line":253,"column":2},"end":{"line":253,"column":59}},"108":{"start":{"line":254,"column":2},"end":{"line":254,"column":66}},"109":{"start":{"line":255,"column":2},"end":{"line":255,"column":31}},"110":{"start":{"line":256,"column":2},"end":{"line":258,"column":4}},"111":{"start":{"line":259,"column":2},"end":{"line":259,"column":18}},"112":{"start":{"line":262,"column":26},"end":{"line":311,"column":1}},"113":{"start":{"line":263,"column":2},"end":{"line":266,"column":3}},"114":{"start":{"line":264,"column":23},"end":{"line":264,"column":75}},"115":{"start":{"line":265,"column":4},"end":{"line":265,"column":24}},"116":{"start":{"line":267,"column":22},"end":{"line":267,"column":68}},"117":{"start":{"line":268,"column":22},"end":{"line":268,"column":24}},"118":{"start":{"line":269,"column":20},"end":{"line":269,"column":22}},"119":{"start":{"line":270,"column":2},"end":{"line":309,"column":5}},"120":{"start":{"line":271,"column":23},"end":{"line":271,"column":25}},"121":{"start":{"line":272,"column":25},"end":{"line":272,"column":27}},"122":{"start":{"line":276,"column":28},"end":{"line":276,"column":36}},"123":{"start":{"line":277,"column":4},"end":{"line":295,"column":7}},"124":{"start":{"line":278,"column":6},"end":{"line":294,"column":7}},"125":{"start":{"line":279,"column":33},"end":{"line":279,"column":74}},"126":{"start":{"line":280,"column":8},"end":{"line":280,"column":42}},"127":{"start":{"line":281,"column":8},"end":{"line":281,"column":42}},"128":{"start":{"line":283,"column":8},"end":{"line":293,"column":10}},"129":{"start":{"line":297,"column":4},"end":{"line":308,"column":5}},"130":{"start":{"line":299,"column":29},"end":{"line":299,"column":51}},"131":{"start":{"line":300,"column":6},"end":{"line":300,"column":41}},"132":{"start":{"line":301,"column":6},"end":{"line":303,"column":8}},"133":{"start":{"line":304,"column":6},"end":{"line":304,"column":77}},"134":{"start":{"line":305,"column":6},"end":{"line":307,"column":8}},"135":{"start":{"line":310,"column":2},"end":{"line":310,"column":40}},"136":{"start":{"line":313,"column":0},"end":{"line":313,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":40,"column":32},"end":{"line":40,"column":33}},"loc":{"start":{"line":40,"column":57},"end":{"line":121,"column":1}},"line":40},"1":{"name":"(anonymous_1)","decl":{"start":{"line":123,"column":29},"end":{"line":123,"column":30}},"loc":{"start":{"line":123,"column":40},"end":{"line":214,"column":1}},"line":123},"2":{"name":"(anonymous_2)","decl":{"start":{"line":216,"column":22},"end":{"line":216,"column":23}},"loc":{"start":{"line":216,"column":48},"end":{"line":233,"column":1}},"line":216},"3":{"name":"(anonymous_3)","decl":{"start":{"line":238,"column":16},"end":{"line":238,"column":17}},"loc":{"start":{"line":238,"column":25},"end":{"line":260,"column":1}},"line":238},"4":{"name":"(anonymous_4)","decl":{"start":{"line":262,"column":26},"end":{"line":262,"column":27}},"loc":{"start":{"line":262,"column":42},"end":{"line":311,"column":1}},"line":262},"5":{"name":"(anonymous_5)","decl":{"start":{"line":270,"column":22},"end":{"line":270,"column":23}},"loc":{"start":{"line":270,"column":31},"end":{"line":309,"column":3}},"line":270},"6":{"name":"(anonymous_6)","decl":{"start":{"line":277,"column":18},"end":{"line":277,"column":19}},"loc":{"start":{"line":277,"column":33},"end":{"line":295,"column":5}},"line":277}},"branchMap":{"0":{"loc":{"start":{"line":45,"column":2},"end":{"line":56,"column":3}},"type":"if","locations":[{"start":{"line":45,"column":2},"end":{"line":56,"column":3}},{"start":{"line":45,"column":2},"end":{"line":56,"column":3}}],"line":45},"1":{"loc":{"start":{"line":53,"column":4},"end":{"line":55,"column":5}},"type":"if","locations":[{"start":{"line":53,"column":4},"end":{"line":55,"column":5}},{"start":{"line":53,"column":4},"end":{"line":55,"column":5}}],"line":53},"2":{"loc":{"start":{"line":62,"column":2},"end":{"line":88,"column":3}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":88,"column":3}},{"start":{"line":62,"column":2},"end":{"line":88,"column":3}}],"line":62},"3":{"loc":{"start":{"line":63,"column":4},"end":{"line":68,"column":5}},"type":"if","locations":[{"start":{"line":63,"column":4},"end":{"line":68,"column":5}},{"start":{"line":63,"column":4},"end":{"line":68,"column":5}}],"line":63},"4":{"loc":{"start":{"line":64,"column":6},"end":{"line":65,"column":67}},"type":"binary-expr","locations":[{"start":{"line":64,"column":6},"end":{"line":64,"column":36}},{"start":{"line":65,"column":6},"end":{"line":65,"column":67}}],"line":64},"5":{"loc":{"start":{"line":69,"column":4},"end":{"line":71,"column":5}},"type":"if","locations":[{"start":{"line":69,"column":4},"end":{"line":71,"column":5}},{"start":{"line":69,"column":4},"end":{"line":71,"column":5}}],"line":69},"6":{"loc":{"start":{"line":73,"column":21},"end":{"line":73,"column":69}},"type":"binary-expr","locations":[{"start":{"line":73,"column":21},"end":{"line":73,"column":51}},{"start":{"line":73,"column":55},"end":{"line":73,"column":69}}],"line":73},"7":{"loc":{"start":{"line":75,"column":6},"end":{"line":75,"column":62}},"type":"binary-expr","locations":[{"start":{"line":75,"column":6},"end":{"line":75,"column":40}},{"start":{"line":75,"column":44},"end":{"line":75,"column":62}}],"line":75},"8":{"loc":{"start":{"line":76,"column":4},"end":{"line":81,"column":5}},"type":"if","locations":[{"start":{"line":76,"column":4},"end":{"line":81,"column":5}},{"start":{"line":76,"column":4},"end":{"line":81,"column":5}}],"line":76},"9":{"loc":{"start":{"line":77,"column":6},"end":{"line":78,"column":60}},"type":"binary-expr","locations":[{"start":{"line":77,"column":6},"end":{"line":77,"column":42}},{"start":{"line":78,"column":6},"end":{"line":78,"column":60}}],"line":77},"10":{"loc":{"start":{"line":82,"column":4},"end":{"line":87,"column":5}},"type":"if","locations":[{"start":{"line":82,"column":4},"end":{"line":87,"column":5}},{"start":{"line":82,"column":4},"end":{"line":87,"column":5}}],"line":82},"11":{"loc":{"start":{"line":83,"column":6},"end":{"line":84,"column":64}},"type":"binary-expr","locations":[{"start":{"line":83,"column":6},"end":{"line":83,"column":46}},{"start":{"line":84,"column":6},"end":{"line":84,"column":64}}],"line":83},"12":{"loc":{"start":{"line":90,"column":2},"end":{"line":92,"column":3}},"type":"if","locations":[{"start":{"line":90,"column":2},"end":{"line":92,"column":3}},{"start":{"line":90,"column":2},"end":{"line":92,"column":3}}],"line":90},"13":{"loc":{"start":{"line":107,"column":2},"end":{"line":118,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":118,"column":3}},{"start":{"line":107,"column":2},"end":{"line":118,"column":3}}],"line":107},"14":{"loc":{"start":{"line":110,"column":4},"end":{"line":117,"column":5}},"type":"if","locations":[{"start":{"line":110,"column":4},"end":{"line":117,"column":5}},{"start":{"line":110,"column":4},"end":{"line":117,"column":5}}],"line":110},"15":{"loc":{"start":{"line":110,"column":8},"end":{"line":110,"column":40}},"type":"binary-expr","locations":[{"start":{"line":110,"column":8},"end":{"line":110,"column":16}},{"start":{"line":110,"column":20},"end":{"line":110,"column":40}}],"line":110},"16":{"loc":{"start":{"line":111,"column":26},"end":{"line":111,"column":39}},"type":"binary-expr","locations":[{"start":{"line":111,"column":26},"end":{"line":111,"column":31}},{"start":{"line":111,"column":35},"end":{"line":111,"column":39}}],"line":111},"17":{"loc":{"start":{"line":112,"column":25},"end":{"line":112,"column":38}},"type":"binary-expr","locations":[{"start":{"line":112,"column":25},"end":{"line":112,"column":30}},{"start":{"line":112,"column":34},"end":{"line":112,"column":38}}],"line":112},"18":{"loc":{"start":{"line":114,"column":26},"end":{"line":114,"column":39}},"type":"binary-expr","locations":[{"start":{"line":114,"column":26},"end":{"line":114,"column":31}},{"start":{"line":114,"column":35},"end":{"line":114,"column":39}}],"line":114},"19":{"loc":{"start":{"line":115,"column":27},"end":{"line":115,"column":40}},"type":"binary-expr","locations":[{"start":{"line":115,"column":27},"end":{"line":115,"column":32}},{"start":{"line":115,"column":36},"end":{"line":115,"column":40}}],"line":115},"20":{"loc":{"start":{"line":116,"column":25},"end":{"line":116,"column":38}},"type":"binary-expr","locations":[{"start":{"line":116,"column":25},"end":{"line":116,"column":30}},{"start":{"line":116,"column":34},"end":{"line":116,"column":38}}],"line":116},"21":{"loc":{"start":{"line":125,"column":2},"end":{"line":127,"column":3}},"type":"if","locations":[{"start":{"line":125,"column":2},"end":{"line":127,"column":3}},{"start":{"line":125,"column":2},"end":{"line":127,"column":3}}],"line":125},"22":{"loc":{"start":{"line":131,"column":2},"end":{"line":191,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":191,"column":3}},{"start":{"line":131,"column":2},"end":{"line":191,"column":3}}],"line":131},"23":{"loc":{"start":{"line":133,"column":4},"end":{"line":135,"column":5}},"type":"if","locations":[{"start":{"line":133,"column":4},"end":{"line":135,"column":5}},{"start":{"line":133,"column":4},"end":{"line":135,"column":5}}],"line":133},"24":{"loc":{"start":{"line":137,"column":4},"end":{"line":142,"column":5}},"type":"if","locations":[{"start":{"line":137,"column":4},"end":{"line":142,"column":5}},{"start":{"line":137,"column":4},"end":{"line":142,"column":5}}],"line":137},"25":{"loc":{"start":{"line":154,"column":4},"end":{"line":159,"column":5}},"type":"if","locations":[{"start":{"line":154,"column":4},"end":{"line":159,"column":5}},{"start":{"line":154,"column":4},"end":{"line":159,"column":5}}],"line":154},"26":{"loc":{"start":{"line":154,"column":8},"end":{"line":154,"column":39}},"type":"binary-expr","locations":[{"start":{"line":154,"column":8},"end":{"line":154,"column":20}},{"start":{"line":154,"column":24},"end":{"line":154,"column":39}}],"line":154},"27":{"loc":{"start":{"line":165,"column":4},"end":{"line":176,"column":5}},"type":"if","locations":[{"start":{"line":165,"column":4},"end":{"line":176,"column":5}},{"start":{"line":165,"column":4},"end":{"line":176,"column":5}}],"line":165},"28":{"loc":{"start":{"line":173,"column":6},"end":{"line":175,"column":7}},"type":"if","locations":[{"start":{"line":173,"column":6},"end":{"line":175,"column":7}},{"start":{"line":173,"column":6},"end":{"line":175,"column":7}}],"line":173},"29":{"loc":{"start":{"line":178,"column":4},"end":{"line":183,"column":5}},"type":"if","locations":[{"start":{"line":178,"column":4},"end":{"line":183,"column":5}},{"start":{"line":178,"column":4},"end":{"line":183,"column":5}}],"line":178},"30":{"loc":{"start":{"line":180,"column":6},"end":{"line":182,"column":7}},"type":"if","locations":[{"start":{"line":180,"column":6},"end":{"line":182,"column":7}},{"start":{"line":180,"column":6},"end":{"line":182,"column":7}}],"line":180},"31":{"loc":{"start":{"line":180,"column":10},"end":{"line":180,"column":43}},"type":"binary-expr","locations":[{"start":{"line":180,"column":10},"end":{"line":180,"column":19}},{"start":{"line":180,"column":23},"end":{"line":180,"column":43}}],"line":180},"32":{"loc":{"start":{"line":184,"column":4},"end":{"line":186,"column":5}},"type":"if","locations":[{"start":{"line":184,"column":4},"end":{"line":186,"column":5}},{"start":{"line":184,"column":4},"end":{"line":186,"column":5}}],"line":184},"33":{"loc":{"start":{"line":187,"column":4},"end":{"line":189,"column":5}},"type":"if","locations":[{"start":{"line":187,"column":4},"end":{"line":189,"column":5}},{"start":{"line":187,"column":4},"end":{"line":189,"column":5}}],"line":187},"34":{"loc":{"start":{"line":195,"column":2},"end":{"line":197,"column":3}},"type":"if","locations":[{"start":{"line":195,"column":2},"end":{"line":197,"column":3}},{"start":{"line":195,"column":2},"end":{"line":197,"column":3}}],"line":195},"35":{"loc":{"start":{"line":198,"column":2},"end":{"line":200,"column":3}},"type":"if","locations":[{"start":{"line":198,"column":2},"end":{"line":200,"column":3}},{"start":{"line":198,"column":2},"end":{"line":200,"column":3}}],"line":198},"36":{"loc":{"start":{"line":203,"column":2},"end":{"line":212,"column":3}},"type":"if","locations":[{"start":{"line":203,"column":2},"end":{"line":212,"column":3}},{"start":{"line":203,"column":2},"end":{"line":212,"column":3}}],"line":203},"37":{"loc":{"start":{"line":217,"column":2},"end":{"line":219,"column":3}},"type":"if","locations":[{"start":{"line":217,"column":2},"end":{"line":219,"column":3}},{"start":{"line":217,"column":2},"end":{"line":219,"column":3}}],"line":217},"38":{"loc":{"start":{"line":222,"column":2},"end":{"line":231,"column":3}},"type":"switch","locations":[{"start":{"line":223,"column":4},"end":{"line":225,"column":12}},{"start":{"line":226,"column":4},"end":{"line":228,"column":12}},{"start":{"line":229,"column":4},"end":{"line":230,"column":78}}],"line":222},"39":{"loc":{"start":{"line":240,"column":2},"end":{"line":245,"column":3}},"type":"if","locations":[{"start":{"line":240,"column":2},"end":{"line":245,"column":3}},{"start":{"line":240,"column":2},"end":{"line":245,"column":3}}],"line":240},"40":{"loc":{"start":{"line":247,"column":2},"end":{"line":249,"column":3}},"type":"if","locations":[{"start":{"line":247,"column":2},"end":{"line":249,"column":3}},{"start":{"line":247,"column":2},"end":{"line":249,"column":3}}],"line":247},"41":{"loc":{"start":{"line":263,"column":2},"end":{"line":266,"column":3}},"type":"if","locations":[{"start":{"line":263,"column":2},"end":{"line":266,"column":3}},{"start":{"line":263,"column":2},"end":{"line":266,"column":3}}],"line":263},"42":{"loc":{"start":{"line":263,"column":6},"end":{"line":263,"column":50}},"type":"binary-expr","locations":[{"start":{"line":263,"column":6},"end":{"line":263,"column":28}},{"start":{"line":263,"column":32},"end":{"line":263,"column":50}}],"line":263},"43":{"loc":{"start":{"line":286,"column":12},"end":{"line":290,"column":19}},"type":"cond-expr","locations":[{"start":{"line":287,"column":16},"end":{"line":287,"column":37}},{"start":{"line":288,"column":16},"end":{"line":290,"column":19}}],"line":286},"44":{"loc":{"start":{"line":288,"column":16},"end":{"line":290,"column":19}},"type":"cond-expr","locations":[{"start":{"line":289,"column":16},"end":{"line":289,"column":26}},{"start":{"line":290,"column":16},"end":{"line":290,"column":19}}],"line":288},"45":{"loc":{"start":{"line":291,"column":12},"end":{"line":291,"column":71}},"type":"binary-expr","locations":[{"start":{"line":291,"column":12},"end":{"line":291,"column":25}},{"start":{"line":291,"column":29},"end":{"line":291,"column":71}}],"line":291},"46":{"loc":{"start":{"line":297,"column":4},"end":{"line":308,"column":5}},"type":"if","locations":[{"start":{"line":297,"column":4},"end":{"line":308,"column":5}},{"start":{"line":297,"column":4},"end":{"line":308,"column":5}}],"line":297}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":7,"6":7,"7":7,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":7,"17":0,"18":7,"19":7,"20":7,"21":7,"22":7,"23":0,"24":7,"25":0,"26":7,"27":0,"28":7,"29":7,"30":7,"31":7,"32":3,"33":3,"34":3,"35":2,"36":2,"37":1,"38":1,"39":1,"40":7,"41":1,"42":6,"43":6,"44":0,"45":6,"46":6,"47":6,"48":5,"49":5,"50":0,"51":5,"52":5,"53":0,"54":5,"55":5,"56":0,"57":5,"58":5,"59":5,"60":5,"61":5,"62":5,"63":5,"64":5,"65":5,"66":5,"67":5,"68":4,"69":4,"70":4,"71":5,"72":1,"73":5,"74":2,"75":5,"76":1,"77":1,"78":0,"79":1,"80":0,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":13,"90":0,"91":13,"92":13,"93":7,"94":7,"95":6,"96":6,"97":0,"98":13,"99":1,"100":11,"101":11,"102":0,"103":11,"104":0,"105":11,"106":11,"107":11,"108":11,"109":11,"110":11,"111":11,"112":1,"113":1,"114":0,"115":0,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":2,"125":2,"126":2,"127":2,"128":0,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"f":{"0":7,"1":6,"2":13,"3":11,"4":1,"5":1,"6":2},"b":{"0":[7,0],"1":[7,0],"2":[7,0],"3":[0,7],"4":[7,0],"5":[7,0],"6":[7,4],"7":[7,6],"8":[0,7],"9":[7,0],"10":[0,7],"11":[7,0],"12":[0,7],"13":[3,4],"14":[2,1],"15":[3,3],"16":[2,0],"17":[2,0],"18":[1,0],"19":[1,0],"20":[1,0],"21":[0,6],"22":[5,1],"23":[0,5],"24":[0,5],"25":[0,5],"26":[5,5],"27":[5,0],"28":[5,0],"29":[4,1],"30":[4,0],"31":[4,4],"32":[1,4],"33":[2,3],"34":[0,1],"35":[0,1],"36":[1,0],"37":[0,13],"38":[7,6,0],"39":[0,11],"40":[0,11],"41":[0,1],"42":[1,1],"43":[0,0],"44":[0,0],"45":[0,0],"46":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"dcf427d8b3536c2347582ace1b307654939f2859"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\ometria\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\ometria\\util.js","statementMap":{"0":{"start":{"line":5,"column":4},"end":{"line":5,"column":23}},"1":{"start":{"line":6,"column":15},"end":{"line":6,"column":41}},"2":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"3":{"start":{"line":17,"column":25},"end":{"line":20,"column":1}},"4":{"start":{"line":18,"column":13},"end":{"line":18,"column":145}},"5":{"start":{"line":19,"column":2},"end":{"line":19,"column":36}},"6":{"start":{"line":22,"column":21},"end":{"line":25,"column":1}},"7":{"start":{"line":23,"column":22},"end":{"line":23,"column":42}},"8":{"start":{"line":24,"column":2},"end":{"line":24,"column":41}},"9":{"start":{"line":27,"column":26},"end":{"line":42,"column":1}},"10":{"start":{"line":28,"column":22},"end":{"line":28,"column":24}},"11":{"start":{"line":29,"column":2},"end":{"line":40,"column":3}},"12":{"start":{"line":30,"column":4},"end":{"line":39,"column":7}},"13":{"start":{"line":31,"column":29},"end":{"line":31,"column":70}},"14":{"start":{"line":32,"column":6},"end":{"line":38,"column":7}},"15":{"start":{"line":33,"column":8},"end":{"line":33,"column":41}},"16":{"start":{"line":35,"column":8},"end":{"line":37,"column":10}},"17":{"start":{"line":41,"column":2},"end":{"line":41,"column":21}},"18":{"start":{"line":44,"column":24},"end":{"line":90,"column":1}},"19":{"start":{"line":45,"column":19},"end":{"line":45,"column":21}},"20":{"start":{"line":46,"column":2},"end":{"line":88,"column":3}},"21":{"start":{"line":47,"column":4},"end":{"line":87,"column":7}},"22":{"start":{"line":48,"column":26},"end":{"line":48,"column":66}},"23":{"start":{"line":49,"column":6},"end":{"line":86,"column":7}},"24":{"start":{"line":54,"column":28},"end":{"line":54,"column":48}},"25":{"start":{"line":55,"column":8},"end":{"line":62,"column":9}},"26":{"start":{"line":56,"column":10},"end":{"line":56,"column":71}},"27":{"start":{"line":58,"column":33},"end":{"line":58,"column":63}},"28":{"start":{"line":59,"column":10},"end":{"line":61,"column":11}},"29":{"start":{"line":60,"column":12},"end":{"line":60,"column":57}},"30":{"start":{"line":63,"column":8},"end":{"line":74,"column":9}},"31":{"start":{"line":64,"column":29},"end":{"line":64,"column":31}},"32":{"start":{"line":65,"column":10},"end":{"line":70,"column":12}},"33":{"start":{"line":71,"column":10},"end":{"line":73,"column":11}},"34":{"start":{"line":72,"column":12},"end":{"line":72,"column":50}},"35":{"start":{"line":75,"column":8},"end":{"line":80,"column":9}},"36":{"start":{"line":79,"column":10},"end":{"line":79,"column":40}},"37":{"start":{"line":81,"column":8},"end":{"line":81,"column":65}},"38":{"start":{"line":83,"column":8},"end":{"line":85,"column":10}},"39":{"start":{"line":89,"column":2},"end":{"line":89,"column":18}},"40":{"start":{"line":92,"column":23},"end":{"line":112,"column":1}},"41":{"start":{"line":93,"column":2},"end":{"line":96,"column":3}},"42":{"start":{"line":94,"column":4},"end":{"line":94,"column":77}},"43":{"start":{"line":95,"column":4},"end":{"line":95,"column":16}},"44":{"start":{"line":97,"column":14},"end":{"line":110,"column":3}},"45":{"start":{"line":111,"column":2},"end":{"line":111,"column":13}},"46":{"start":{"line":114,"column":32},"end":{"line":146,"column":1}},"47":{"start":{"line":115,"column":25},"end":{"line":115,"column":32}},"48":{"start":{"line":116,"column":2},"end":{"line":119,"column":3}},"49":{"start":{"line":117,"column":4},"end":{"line":117,"column":42}},"50":{"start":{"line":118,"column":4},"end":{"line":118,"column":64}},"51":{"start":{"line":120,"column":2},"end":{"line":123,"column":3}},"52":{"start":{"line":121,"column":4},"end":{"line":121,"column":39}},"53":{"start":{"line":122,"column":4},"end":{"line":122,"column":55}},"54":{"start":{"line":124,"column":2},"end":{"line":130,"column":3}},"55":{"start":{"line":128,"column":4},"end":{"line":128,"column":45}},"56":{"start":{"line":129,"column":4},"end":{"line":129,"column":55}},"57":{"start":{"line":131,"column":2},"end":{"line":137,"column":3}},"58":{"start":{"line":135,"column":4},"end":{"line":135,"column":47}},"59":{"start":{"line":136,"column":4},"end":{"line":136,"column":55}},"60":{"start":{"line":138,"column":2},"end":{"line":144,"column":3}},"61":{"start":{"line":142,"column":4},"end":{"line":142,"column":49}},"62":{"start":{"line":143,"column":4},"end":{"line":143,"column":55}},"63":{"start":{"line":145,"column":2},"end":{"line":145,"column":24}},"64":{"start":{"line":148,"column":0},"end":{"line":154,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":17,"column":25},"end":{"line":17,"column":26}},"loc":{"start":{"line":17,"column":38},"end":{"line":20,"column":1}},"line":17},"1":{"name":"(anonymous_1)","decl":{"start":{"line":22,"column":21},"end":{"line":22,"column":22}},"loc":{"start":{"line":22,"column":30},"end":{"line":25,"column":1}},"line":22},"2":{"name":"(anonymous_2)","decl":{"start":{"line":27,"column":26},"end":{"line":27,"column":27}},"loc":{"start":{"line":27,"column":38},"end":{"line":42,"column":1}},"line":27},"3":{"name":"(anonymous_3)","decl":{"start":{"line":30,"column":21},"end":{"line":30,"column":22}},"loc":{"start":{"line":30,"column":41},"end":{"line":39,"column":5}},"line":30},"4":{"name":"(anonymous_4)","decl":{"start":{"line":44,"column":24},"end":{"line":44,"column":25}},"loc":{"start":{"line":44,"column":33},"end":{"line":90,"column":1}},"line":44},"5":{"name":"(anonymous_5)","decl":{"start":{"line":47,"column":18},"end":{"line":47,"column":19}},"loc":{"start":{"line":47,"column":35},"end":{"line":87,"column":5}},"line":47},"6":{"name":"(anonymous_6)","decl":{"start":{"line":92,"column":23},"end":{"line":92,"column":24}},"loc":{"start":{"line":92,"column":34},"end":{"line":112,"column":1}},"line":92},"7":{"name":"(anonymous_7)","decl":{"start":{"line":114,"column":32},"end":{"line":114,"column":33}},"loc":{"start":{"line":114,"column":43},"end":{"line":146,"column":1}},"line":114}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":40,"column":3}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":40,"column":3}},{"start":{"line":29,"column":2},"end":{"line":40,"column":3}}],"line":29},"1":{"loc":{"start":{"line":32,"column":6},"end":{"line":38,"column":7}},"type":"if","locations":[{"start":{"line":32,"column":6},"end":{"line":38,"column":7}},{"start":{"line":32,"column":6},"end":{"line":38,"column":7}}],"line":32},"2":{"loc":{"start":{"line":32,"column":10},"end":{"line":32,"column":74}},"type":"binary-expr","locations":[{"start":{"line":32,"column":10},"end":{"line":32,"column":27}},{"start":{"line":32,"column":31},"end":{"line":32,"column":50}},{"start":{"line":32,"column":54},"end":{"line":32,"column":74}}],"line":32},"3":{"loc":{"start":{"line":46,"column":2},"end":{"line":88,"column":3}},"type":"if","locations":[{"start":{"line":46,"column":2},"end":{"line":88,"column":3}},{"start":{"line":46,"column":2},"end":{"line":88,"column":3}}],"line":46},"4":{"loc":{"start":{"line":49,"column":6},"end":{"line":86,"column":7}},"type":"if","locations":[{"start":{"line":49,"column":6},"end":{"line":86,"column":7}},{"start":{"line":49,"column":6},"end":{"line":86,"column":7}}],"line":49},"5":{"loc":{"start":{"line":50,"column":8},"end":{"line":52,"column":98}},"type":"binary-expr","locations":[{"start":{"line":50,"column":8},"end":{"line":50,"column":30}},{"start":{"line":51,"column":8},"end":{"line":51,"column":28}},{"start":{"line":52,"column":9},"end":{"line":52,"column":52}},{"start":{"line":52,"column":56},"end":{"line":52,"column":97}}],"line":50},"6":{"loc":{"start":{"line":55,"column":8},"end":{"line":62,"column":9}},"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":62,"column":9}},{"start":{"line":55,"column":8},"end":{"line":62,"column":9}}],"line":55},"7":{"loc":{"start":{"line":55,"column":12},"end":{"line":55,"column":55}},"type":"binary-expr","locations":[{"start":{"line":55,"column":12},"end":{"line":55,"column":24}},{"start":{"line":55,"column":28},"end":{"line":55,"column":55}}],"line":55},"8":{"loc":{"start":{"line":59,"column":10},"end":{"line":61,"column":11}},"type":"if","locations":[{"start":{"line":59,"column":10},"end":{"line":61,"column":11}},{"start":{"line":59,"column":10},"end":{"line":61,"column":11}}],"line":59},"9":{"loc":{"start":{"line":59,"column":14},"end":{"line":59,"column":57}},"type":"binary-expr","locations":[{"start":{"line":59,"column":14},"end":{"line":59,"column":28}},{"start":{"line":59,"column":32},"end":{"line":59,"column":57}}],"line":59},"10":{"loc":{"start":{"line":63,"column":8},"end":{"line":74,"column":9}},"type":"if","locations":[{"start":{"line":63,"column":8},"end":{"line":74,"column":9}},{"start":{"line":63,"column":8},"end":{"line":74,"column":9}}],"line":63},"11":{"loc":{"start":{"line":71,"column":10},"end":{"line":73,"column":11}},"type":"if","locations":[{"start":{"line":71,"column":10},"end":{"line":73,"column":11}},{"start":{"line":71,"column":10},"end":{"line":73,"column":11}}],"line":71},"12":{"loc":{"start":{"line":75,"column":8},"end":{"line":80,"column":9}},"type":"if","locations":[{"start":{"line":75,"column":8},"end":{"line":80,"column":9}},{"start":{"line":75,"column":8},"end":{"line":80,"column":9}}],"line":75},"13":{"loc":{"start":{"line":76,"column":10},"end":{"line":77,"column":53}},"type":"binary-expr","locations":[{"start":{"line":76,"column":10},"end":{"line":76,"column":32}},{"start":{"line":77,"column":10},"end":{"line":77,"column":53}}],"line":76},"14":{"loc":{"start":{"line":93,"column":2},"end":{"line":96,"column":3}},"type":"if","locations":[{"start":{"line":93,"column":2},"end":{"line":96,"column":3}},{"start":{"line":93,"column":2},"end":{"line":96,"column":3}}],"line":93},"15":{"loc":{"start":{"line":116,"column":2},"end":{"line":119,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":119,"column":3}},{"start":{"line":116,"column":2},"end":{"line":119,"column":3}}],"line":116},"16":{"loc":{"start":{"line":116,"column":6},"end":{"line":116,"column":77}},"type":"binary-expr","locations":[{"start":{"line":116,"column":6},"end":{"line":116,"column":29}},{"start":{"line":116,"column":33},"end":{"line":116,"column":77}}],"line":116},"17":{"loc":{"start":{"line":120,"column":2},"end":{"line":123,"column":3}},"type":"if","locations":[{"start":{"line":120,"column":2},"end":{"line":123,"column":3}},{"start":{"line":120,"column":2},"end":{"line":123,"column":3}}],"line":120},"18":{"loc":{"start":{"line":120,"column":6},"end":{"line":120,"column":65}},"type":"binary-expr","locations":[{"start":{"line":120,"column":6},"end":{"line":120,"column":26}},{"start":{"line":120,"column":30},"end":{"line":120,"column":65}}],"line":120},"19":{"loc":{"start":{"line":124,"column":2},"end":{"line":130,"column":3}},"type":"if","locations":[{"start":{"line":124,"column":2},"end":{"line":130,"column":3}},{"start":{"line":124,"column":2},"end":{"line":130,"column":3}}],"line":124},"20":{"loc":{"start":{"line":125,"column":4},"end":{"line":126,"column":49}},"type":"binary-expr","locations":[{"start":{"line":125,"column":4},"end":{"line":125,"column":30}},{"start":{"line":126,"column":4},"end":{"line":126,"column":49}}],"line":125},"21":{"loc":{"start":{"line":131,"column":2},"end":{"line":137,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":137,"column":3}},{"start":{"line":131,"column":2},"end":{"line":137,"column":3}}],"line":131},"22":{"loc":{"start":{"line":132,"column":4},"end":{"line":133,"column":51}},"type":"binary-expr","locations":[{"start":{"line":132,"column":4},"end":{"line":132,"column":32}},{"start":{"line":133,"column":4},"end":{"line":133,"column":51}}],"line":132},"23":{"loc":{"start":{"line":138,"column":2},"end":{"line":144,"column":3}},"type":"if","locations":[{"start":{"line":138,"column":2},"end":{"line":144,"column":3}},{"start":{"line":138,"column":2},"end":{"line":144,"column":3}}],"line":138},"24":{"loc":{"start":{"line":139,"column":4},"end":{"line":140,"column":53}},"type":"binary-expr","locations":[{"start":{"line":139,"column":4},"end":{"line":139,"column":34}},{"start":{"line":140,"column":4},"end":{"line":140,"column":53}}],"line":139}},"s":{"0":1,"1":1,"2":1,"3":1,"4":6,"5":6,"6":1,"7":2,"8":2,"9":1,"10":3,"11":3,"12":3,"13":3,"14":3,"15":3,"16":0,"17":3,"18":1,"19":4,"20":4,"21":4,"22":4,"23":4,"24":4,"25":4,"26":1,"27":3,"28":3,"29":3,"30":4,"31":4,"32":4,"33":4,"34":0,"35":4,"36":0,"37":4,"38":0,"39":4,"40":1,"41":3,"42":2,"43":2,"44":1,"45":1,"46":1,"47":7,"48":7,"49":0,"50":0,"51":7,"52":0,"53":0,"54":7,"55":0,"56":0,"57":7,"58":0,"59":0,"60":7,"61":0,"62":0,"63":7,"64":1},"f":{"0":6,"1":2,"2":3,"3":3,"4":4,"5":4,"6":3,"7":7},"b":{"0":[3,0],"1":[3,0],"2":[3,3,3],"3":[4,0],"4":[4,0],"5":[4,4,4,4],"6":[1,3],"7":[4,3],"8":[3,0],"9":[3,3],"10":[4,0],"11":[0,4],"12":[0,4],"13":[4,0],"14":[2,1],"15":[0,7],"16":[7,0],"17":[0,7],"18":[7,2],"19":[0,7],"20":[7,0],"21":[0,7],"22":[7,0],"23":[0,7],"24":[7,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"33bb5f2b0e5f50ce65e61e9d5a9581efd879bf26"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\pardot\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\pardot\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":40}},"2":{"start":{"line":4,"column":16},"end":{"line":4,"column":19}},"3":{"start":{"line":6,"column":18},"end":{"line":8,"column":1}},"4":{"start":{"line":10,"column":26},"end":{"line":15,"column":1}},"5":{"start":{"line":17,"column":23},"end":{"line":17,"column":69}},"6":{"start":{"line":19,"column":0},"end":{"line":24,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"047a62f2fdea09df344ce781b74ba01d84347a7b"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\pardot\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\pardot\\transform.js","statementMap":{"0":{"start":{"line":36,"column":12},"end":{"line":36,"column":32}},"1":{"start":{"line":37,"column":27},"end":{"line":37,"column":46}},"2":{"start":{"line":38,"column":15},"end":{"line":38,"column":41}},"3":{"start":{"line":48,"column":4},"end":{"line":48,"column":25}},"4":{"start":{"line":49,"column":21},"end":{"line":49,"column":48}},"5":{"start":{"line":51,"column":30},"end":{"line":51,"column":49}},"6":{"start":{"line":52,"column":31},"end":{"line":52,"column":61}},"7":{"start":{"line":65,"column":23},"end":{"line":75,"column":1}},"8":{"start":{"line":67,"column":21},"end":{"line":67,"column":29}},"9":{"start":{"line":68,"column":2},"end":{"line":73,"column":3}},"10":{"start":{"line":69,"column":4},"end":{"line":72,"column":15}},"11":{"start":{"line":74,"column":2},"end":{"line":74,"column":29}},"12":{"start":{"line":77,"column":22},"end":{"line":88,"column":1}},"13":{"start":{"line":78,"column":23},"end":{"line":78,"column":53}},"14":{"start":{"line":79,"column":19},"end":{"line":79,"column":41}},"15":{"start":{"line":80,"column":2},"end":{"line":80,"column":26}},"16":{"start":{"line":81,"column":2},"end":{"line":81,"column":59}},"17":{"start":{"line":82,"column":2},"end":{"line":85,"column":4}},"18":{"start":{"line":86,"column":2},"end":{"line":86,"column":36}},"19":{"start":{"line":87,"column":2},"end":{"line":87,"column":18}},"20":{"start":{"line":90,"column":34},"end":{"line":92,"column":1}},"21":{"start":{"line":91,"column":2},"end":{"line":91,"column":77}},"22":{"start":{"line":103,"column":15},"end":{"line":125,"column":1}},"23":{"start":{"line":104,"column":58},"end":{"line":104,"column":67}},"24":{"start":{"line":105,"column":18},"end":{"line":105,"column":61}},"25":{"start":{"line":106,"column":2},"end":{"line":109,"column":3}},"26":{"start":{"line":107,"column":4},"end":{"line":107,"column":75}},"27":{"start":{"line":108,"column":4},"end":{"line":108,"column":21}},"28":{"start":{"line":111,"column":2},"end":{"line":123,"column":3}},"29":{"start":{"line":113,"column":6},"end":{"line":113,"column":67}},"30":{"start":{"line":114,"column":6},"end":{"line":114,"column":12}},"31":{"start":{"line":116,"column":6},"end":{"line":116,"column":68}},"32":{"start":{"line":117,"column":6},"end":{"line":117,"column":12}},"33":{"start":{"line":119,"column":6},"end":{"line":121,"column":8}},"34":{"start":{"line":122,"column":6},"end":{"line":122,"column":12}},"35":{"start":{"line":124,"column":2},"end":{"line":124,"column":19}},"36":{"start":{"line":127,"column":24},"end":{"line":162,"column":1}},"37":{"start":{"line":128,"column":25},"end":{"line":128,"column":43}},"38":{"start":{"line":129,"column":22},"end":{"line":129,"column":46}},"39":{"start":{"line":131,"column":14},"end":{"line":131,"column":48}},"40":{"start":{"line":132,"column":2},"end":{"line":132,"column":54}},"41":{"start":{"line":133,"column":16},"end":{"line":133,"column":58}},"42":{"start":{"line":135,"column":25},"end":{"line":135,"column":66}},"43":{"start":{"line":136,"column":25},"end":{"line":136,"column":57}},"44":{"start":{"line":137,"column":2},"end":{"line":149,"column":3}},"45":{"start":{"line":138,"column":4},"end":{"line":148,"column":15}},"46":{"start":{"line":150,"column":14},"end":{"line":155,"column":4}},"47":{"start":{"line":157,"column":2},"end":{"line":159,"column":3}},"48":{"start":{"line":158,"column":4},"end":{"line":158,"column":44}},"49":{"start":{"line":161,"column":2},"end":{"line":161,"column":70}},"50":{"start":{"line":164,"column":21},"end":{"line":197,"column":1}},"51":{"start":{"line":166,"column":2},"end":{"line":171,"column":3}},"52":{"start":{"line":167,"column":4},"end":{"line":170,"column":15}},"53":{"start":{"line":172,"column":2},"end":{"line":177,"column":3}},"54":{"start":{"line":173,"column":4},"end":{"line":176,"column":15}},"55":{"start":{"line":179,"column":2},"end":{"line":184,"column":3}},"56":{"start":{"line":180,"column":4},"end":{"line":183,"column":15}},"57":{"start":{"line":186,"column":2},"end":{"line":195,"column":3}},"58":{"start":{"line":187,"column":21},"end":{"line":187,"column":47}},"59":{"start":{"line":189,"column":4},"end":{"line":189,"column":77}},"60":{"start":{"line":191,"column":4},"end":{"line":194,"column":15}},"61":{"start":{"line":196,"column":2},"end":{"line":196,"column":18}},"62":{"start":{"line":199,"column":16},"end":{"line":201,"column":1}},"63":{"start":{"line":200,"column":2},"end":{"line":200,"column":72}},"64":{"start":{"line":203,"column":26},"end":{"line":232,"column":1}},"65":{"start":{"line":204,"column":2},"end":{"line":207,"column":3}},"66":{"start":{"line":205,"column":23},"end":{"line":205,"column":75}},"67":{"start":{"line":206,"column":4},"end":{"line":206,"column":24}},"68":{"start":{"line":209,"column":23},"end":{"line":230,"column":3}},"69":{"start":{"line":211,"column":6},"end":{"line":228,"column":7}},"70":{"start":{"line":212,"column":8},"end":{"line":216,"column":10}},"71":{"start":{"line":218,"column":8},"end":{"line":227,"column":10}},"72":{"start":{"line":231,"column":2},"end":{"line":231,"column":22}},"73":{"start":{"line":234,"column":0},"end":{"line":234,"column":46}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":65,"column":23},"end":{"line":65,"column":24}},"loc":{"start":{"line":65,"column":35},"end":{"line":75,"column":1}},"line":65},"1":{"name":"(anonymous_1)","decl":{"start":{"line":77,"column":22},"end":{"line":77,"column":23}},"loc":{"start":{"line":77,"column":60},"end":{"line":88,"column":1}},"line":77},"2":{"name":"(anonymous_2)","decl":{"start":{"line":90,"column":34},"end":{"line":90,"column":35}},"loc":{"start":{"line":90,"column":48},"end":{"line":92,"column":1}},"line":90},"3":{"name":"(anonymous_3)","decl":{"start":{"line":103,"column":15},"end":{"line":103,"column":16}},"loc":{"start":{"line":103,"column":28},"end":{"line":125,"column":1}},"line":103},"4":{"name":"(anonymous_4)","decl":{"start":{"line":127,"column":24},"end":{"line":127,"column":25}},"loc":{"start":{"line":127,"column":74},"end":{"line":162,"column":1}},"line":127},"5":{"name":"(anonymous_5)","decl":{"start":{"line":164,"column":21},"end":{"line":164,"column":22}},"loc":{"start":{"line":164,"column":57},"end":{"line":197,"column":1}},"line":164},"6":{"name":"(anonymous_6)","decl":{"start":{"line":199,"column":16},"end":{"line":199,"column":17}},"loc":{"start":{"line":199,"column":25},"end":{"line":201,"column":1}},"line":199},"7":{"name":"(anonymous_7)","decl":{"start":{"line":203,"column":26},"end":{"line":203,"column":27}},"loc":{"start":{"line":203,"column":42},"end":{"line":232,"column":1}},"line":203},"8":{"name":"(anonymous_8)","decl":{"start":{"line":210,"column":15},"end":{"line":210,"column":16}},"loc":{"start":{"line":210,"column":24},"end":{"line":229,"column":5}},"line":210}},"branchMap":{"0":{"loc":{"start":{"line":68,"column":2},"end":{"line":73,"column":3}},"type":"if","locations":[{"start":{"line":68,"column":2},"end":{"line":73,"column":3}},{"start":{"line":68,"column":2},"end":{"line":73,"column":3}}],"line":68},"1":{"loc":{"start":{"line":91,"column":9},"end":{"line":91,"column":76}},"type":"binary-expr","locations":[{"start":{"line":91,"column":9},"end":{"line":91,"column":20}},{"start":{"line":91,"column":25},"end":{"line":91,"column":35}},{"start":{"line":91,"column":40},"end":{"line":91,"column":56}},{"start":{"line":91,"column":60},"end":{"line":91,"column":74}}],"line":91},"2":{"loc":{"start":{"line":106,"column":2},"end":{"line":109,"column":3}},"type":"if","locations":[{"start":{"line":106,"column":2},"end":{"line":109,"column":3}},{"start":{"line":106,"column":2},"end":{"line":109,"column":3}}],"line":106},"3":{"loc":{"start":{"line":111,"column":2},"end":{"line":123,"column":3}},"type":"switch","locations":[{"start":{"line":112,"column":4},"end":{"line":114,"column":12}},{"start":{"line":115,"column":4},"end":{"line":117,"column":12}},{"start":{"line":118,"column":4},"end":{"line":122,"column":12}}],"line":111},"4":{"loc":{"start":{"line":132,"column":10},"end":{"line":132,"column":53}},"type":"cond-expr","locations":[{"start":{"line":132,"column":38},"end":{"line":132,"column":46}},{"start":{"line":132,"column":49},"end":{"line":132,"column":53}}],"line":132},"5":{"loc":{"start":{"line":132,"column":10},"end":{"line":132,"column":35}},"type":"binary-expr","locations":[{"start":{"line":132,"column":10},"end":{"line":132,"column":15}},{"start":{"line":132,"column":19},"end":{"line":132,"column":35}}],"line":132},"6":{"loc":{"start":{"line":137,"column":2},"end":{"line":149,"column":3}},"type":"if","locations":[{"start":{"line":137,"column":2},"end":{"line":149,"column":3}},{"start":{"line":137,"column":2},"end":{"line":149,"column":3}}],"line":137},"7":{"loc":{"start":{"line":137,"column":6},"end":{"line":137,"column":30}},"type":"binary-expr","locations":[{"start":{"line":137,"column":6},"end":{"line":137,"column":20}},{"start":{"line":137,"column":24},"end":{"line":137,"column":30}}],"line":137},"8":{"loc":{"start":{"line":157,"column":2},"end":{"line":159,"column":3}},"type":"if","locations":[{"start":{"line":157,"column":2},"end":{"line":159,"column":3}},{"start":{"line":157,"column":2},"end":{"line":159,"column":3}}],"line":157},"9":{"loc":{"start":{"line":166,"column":2},"end":{"line":171,"column":3}},"type":"if","locations":[{"start":{"line":166,"column":2},"end":{"line":171,"column":3}},{"start":{"line":166,"column":2},"end":{"line":171,"column":3}}],"line":166},"10":{"loc":{"start":{"line":172,"column":2},"end":{"line":177,"column":3}},"type":"if","locations":[{"start":{"line":172,"column":2},"end":{"line":177,"column":3}},{"start":{"line":172,"column":2},"end":{"line":177,"column":3}}],"line":172},"11":{"loc":{"start":{"line":179,"column":2},"end":{"line":184,"column":3}},"type":"if","locations":[{"start":{"line":179,"column":2},"end":{"line":184,"column":3}},{"start":{"line":179,"column":2},"end":{"line":184,"column":3}}],"line":179},"12":{"loc":{"start":{"line":186,"column":2},"end":{"line":195,"column":3}},"type":"if","locations":[{"start":{"line":186,"column":2},"end":{"line":195,"column":3}},{"start":{"line":186,"column":2},"end":{"line":195,"column":3}}],"line":186},"13":{"loc":{"start":{"line":204,"column":2},"end":{"line":207,"column":3}},"type":"if","locations":[{"start":{"line":204,"column":2},"end":{"line":207,"column":3}},{"start":{"line":204,"column":2},"end":{"line":207,"column":3}}],"line":204},"14":{"loc":{"start":{"line":204,"column":6},"end":{"line":204,"column":50}},"type":"binary-expr","locations":[{"start":{"line":204,"column":6},"end":{"line":204,"column":28}},{"start":{"line":204,"column":32},"end":{"line":204,"column":50}}],"line":204},"15":{"loc":{"start":{"line":221,"column":10},"end":{"line":225,"column":33}},"type":"cond-expr","locations":[{"start":{"line":222,"column":14},"end":{"line":222,"column":35}},{"start":{"line":223,"column":14},"end":{"line":225,"column":33}}],"line":221},"16":{"loc":{"start":{"line":223,"column":14},"end":{"line":225,"column":33}},"type":"cond-expr","locations":[{"start":{"line":224,"column":14},"end":{"line":224,"column":24}},{"start":{"line":225,"column":14},"end":{"line":225,"column":33}}],"line":223},"17":{"loc":{"start":{"line":225,"column":14},"end":{"line":225,"column":33}},"type":"binary-expr","locations":[{"start":{"line":225,"column":14},"end":{"line":225,"column":26}},{"start":{"line":225,"column":30},"end":{"line":225,"column":33}}],"line":225},"18":{"loc":{"start":{"line":226,"column":10},"end":{"line":226,"column":69}},"type":"binary-expr","locations":[{"start":{"line":226,"column":10},"end":{"line":226,"column":23}},{"start":{"line":226,"column":27},"end":{"line":226,"column":69}}],"line":226}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":5,"9":5,"10":1,"11":4,"12":1,"13":4,"14":4,"15":4,"16":4,"17":4,"18":4,"19":4,"20":1,"21":4,"22":1,"23":4,"24":4,"25":4,"26":2,"27":2,"28":2,"29":1,"30":1,"31":1,"32":1,"33":0,"34":0,"35":2,"36":1,"37":5,"38":5,"39":4,"40":4,"41":4,"42":4,"43":4,"44":4,"45":0,"46":4,"47":4,"48":4,"49":4,"50":1,"51":5,"52":0,"53":5,"54":0,"55":5,"56":0,"57":5,"58":5,"59":5,"60":0,"61":4,"62":1,"63":5,"64":1,"65":1,"66":0,"67":0,"68":1,"69":5,"70":5,"71":1,"72":1,"73":1},"f":{"0":5,"1":4,"2":4,"3":4,"4":5,"5":5,"6":5,"7":1,"8":5},"b":{"0":[1,4],"1":[4,2,2,2],"2":[2,2],"3":[1,1,0],"4":[2,2],"5":[4,2],"6":[0,4],"7":[4,2],"8":[4,0],"9":[0,5],"10":[0,5],"11":[0,5],"12":[5,0],"13":[0,1],"14":[1,1],"15":[0,1],"16":[0,1],"17":[1,0],"18":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"19215a2d84c8e87202414b058e046be959ab819a"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\personalize\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\personalize\\config.js","statementMap":{"0":{"start":{"line":1,"column":23},"end":{"line":6,"column":1}},"1":{"start":{"line":8,"column":29},"end":{"line":8,"column":67}},"2":{"start":{"line":10,"column":0},"end":{"line":13,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d25b2d72f1a82ef2ea9607f9848b30f95868073c"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\personalize\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\personalize\\transform.js","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":1,"column":27}},"1":{"start":{"line":2,"column":49},"end":{"line":2,"column":68}},"2":{"start":{"line":3,"column":22},"end":{"line":3,"column":51}},"3":{"start":{"line":13,"column":4},"end":{"line":13,"column":25}},"4":{"start":{"line":15,"column":25},"end":{"line":108,"column":1}},"5":{"start":{"line":16,"column":45},"end":{"line":16,"column":52}},"6":{"start":{"line":17,"column":41},"end":{"line":17,"column":59}},"7":{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},"8":{"start":{"line":20,"column":4},"end":{"line":20,"column":77}},"9":{"start":{"line":23,"column":2},"end":{"line":28,"column":3}},"10":{"start":{"line":24,"column":4},"end":{"line":27,"column":6}},"11":{"start":{"line":30,"column":17},"end":{"line":30,"column":70}},"12":{"start":{"line":33,"column":22},"end":{"line":37,"column":3}},"13":{"start":{"line":38,"column":2},"end":{"line":82,"column":5}},"14":{"start":{"line":40,"column":18},"end":{"line":40,"column":55}},"15":{"start":{"line":41,"column":4},"end":{"line":81,"column":5}},"16":{"start":{"line":45,"column":6},"end":{"line":47,"column":7}},"17":{"start":{"line":46,"column":8},"end":{"line":46,"column":79}},"18":{"start":{"line":49,"column":6},"end":{"line":49,"column":63}},"19":{"start":{"line":50,"column":11},"end":{"line":81,"column":5}},"20":{"start":{"line":51,"column":6},"end":{"line":59,"column":7}},"21":{"start":{"line":55,"column":8},"end":{"line":58,"column":10}},"22":{"start":{"line":60,"column":6},"end":{"line":80,"column":80}},"23":{"start":{"line":66,"column":8},"end":{"line":66,"column":54}},"24":{"start":{"line":67,"column":11},"end":{"line":80,"column":80}},"25":{"start":{"line":68,"column":8},"end":{"line":70,"column":28}},"26":{"start":{"line":71,"column":8},"end":{"line":76,"column":10}},"27":{"start":{"line":77,"column":13},"end":{"line":80,"column":80}},"28":{"start":{"line":79,"column":8},"end":{"line":79,"column":58}},"29":{"start":{"line":80,"column":13},"end":{"line":80,"column":80}},"30":{"start":{"line":84,"column":2},"end":{"line":89,"column":26}},"31":{"start":{"line":91,"column":17},"end":{"line":91,"column":64}},"32":{"start":{"line":92,"column":19},"end":{"line":105,"column":3}},"33":{"start":{"line":107,"column":2},"end":{"line":107,"column":18}},"34":{"start":{"line":110,"column":24},"end":{"line":162,"column":1}},"35":{"start":{"line":111,"column":25},"end":{"line":111,"column":32}},"36":{"start":{"line":112,"column":41},"end":{"line":112,"column":59}},"37":{"start":{"line":113,"column":17},"end":{"line":113,"column":70}},"38":{"start":{"line":115,"column":2},"end":{"line":119,"column":3}},"39":{"start":{"line":116,"column":4},"end":{"line":118,"column":6}},"40":{"start":{"line":120,"column":2},"end":{"line":125,"column":3}},"41":{"start":{"line":121,"column":4},"end":{"line":124,"column":6}},"42":{"start":{"line":126,"column":21},"end":{"line":128,"column":3}},"43":{"start":{"line":129,"column":2},"end":{"line":150,"column":5}},"44":{"start":{"line":132,"column":4},"end":{"line":140,"column":5}},"45":{"start":{"line":133,"column":6},"end":{"line":133,"column":52}},"46":{"start":{"line":136,"column":6},"end":{"line":139,"column":7}},"47":{"start":{"line":138,"column":8},"end":{"line":138,"column":52}},"48":{"start":{"line":141,"column":4},"end":{"line":143,"column":5}},"49":{"start":{"line":142,"column":6},"end":{"line":142,"column":77}},"50":{"start":{"line":144,"column":4},"end":{"line":149,"column":5}},"51":{"start":{"line":146,"column":6},"end":{"line":146,"column":54}},"52":{"start":{"line":148,"column":6},"end":{"line":148,"column":40}},"53":{"start":{"line":151,"column":2},"end":{"line":156,"column":3}},"54":{"start":{"line":152,"column":4},"end":{"line":155,"column":6}},"55":{"start":{"line":157,"column":19},"end":{"line":160,"column":3}},"56":{"start":{"line":161,"column":2},"end":{"line":161,"column":18}},"57":{"start":{"line":164,"column":28},"end":{"line":181,"column":1}},"58":{"start":{"line":167,"column":2},"end":{"line":179,"column":3}},"59":{"start":{"line":169,"column":6},"end":{"line":169,"column":56}},"60":{"start":{"line":170,"column":6},"end":{"line":170,"column":12}},"61":{"start":{"line":172,"column":6},"end":{"line":172,"column":55}},"62":{"start":{"line":173,"column":6},"end":{"line":173,"column":12}},"63":{"start":{"line":175,"column":6},"end":{"line":178,"column":8}},"64":{"start":{"line":180,"column":2},"end":{"line":180,"column":18}},"65":{"start":{"line":183,"column":31},"end":{"line":234,"column":1}},"66":{"start":{"line":184,"column":17},"end":{"line":184,"column":60}},"67":{"start":{"line":185,"column":41},"end":{"line":185,"column":59}},"68":{"start":{"line":187,"column":17},"end":{"line":187,"column":70}},"69":{"start":{"line":189,"column":2},"end":{"line":194,"column":3}},"70":{"start":{"line":190,"column":4},"end":{"line":193,"column":6}},"71":{"start":{"line":196,"column":2},"end":{"line":200,"column":3}},"72":{"start":{"line":197,"column":4},"end":{"line":199,"column":6}},"73":{"start":{"line":202,"column":2},"end":{"line":207,"column":3}},"74":{"start":{"line":203,"column":4},"end":{"line":206,"column":6}},"75":{"start":{"line":209,"column":21},"end":{"line":212,"column":3}},"76":{"start":{"line":213,"column":2},"end":{"line":222,"column":5}},"77":{"start":{"line":214,"column":18},"end":{"line":214,"column":47}},"78":{"start":{"line":215,"column":4},"end":{"line":217,"column":5}},"79":{"start":{"line":216,"column":6},"end":{"line":216,"column":77}},"80":{"start":{"line":218,"column":4},"end":{"line":221,"column":5}},"81":{"start":{"line":220,"column":6},"end":{"line":220,"column":54}},"82":{"start":{"line":223,"column":2},"end":{"line":228,"column":3}},"83":{"start":{"line":224,"column":4},"end":{"line":227,"column":6}},"84":{"start":{"line":229,"column":19},"end":{"line":232,"column":3}},"85":{"start":{"line":233,"column":2},"end":{"line":233,"column":18}},"86":{"start":{"line":236,"column":21},"end":{"line":271,"column":1}},"87":{"start":{"line":239,"column":26},"end":{"line":239,"column":44}},"88":{"start":{"line":240,"column":25},"end":{"line":240,"column":51}},"89":{"start":{"line":241,"column":2},"end":{"line":246,"column":3}},"90":{"start":{"line":242,"column":4},"end":{"line":245,"column":6}},"91":{"start":{"line":248,"column":22},"end":{"line":248,"column":48}},"92":{"start":{"line":249,"column":2},"end":{"line":258,"column":3}},"93":{"start":{"line":251,"column":6},"end":{"line":251,"column":78}},"94":{"start":{"line":252,"column":6},"end":{"line":252,"column":12}},"95":{"start":{"line":254,"column":6},"end":{"line":254,"column":75}},"96":{"start":{"line":255,"column":6},"end":{"line":255,"column":12}},"97":{"start":{"line":257,"column":6},"end":{"line":257,"column":63}},"98":{"start":{"line":260,"column":2},"end":{"line":268,"column":3}},"99":{"start":{"line":261,"column":4},"end":{"line":264,"column":6}},"100":{"start":{"line":267,"column":4},"end":{"line":267,"column":31}},"101":{"start":{"line":270,"column":2},"end":{"line":270,"column":25}},"102":{"start":{"line":273,"column":16},"end":{"line":275,"column":1}},"103":{"start":{"line":274,"column":2},"end":{"line":274,"column":56}},"104":{"start":{"line":277,"column":26},"end":{"line":315,"column":1}},"105":{"start":{"line":278,"column":2},"end":{"line":281,"column":3}},"106":{"start":{"line":279,"column":23},"end":{"line":279,"column":75}},"107":{"start":{"line":280,"column":4},"end":{"line":280,"column":24}},"108":{"start":{"line":283,"column":19},"end":{"line":313,"column":3}},"109":{"start":{"line":285,"column":6},"end":{"line":311,"column":7}},"110":{"start":{"line":286,"column":8},"end":{"line":293,"column":9}},"111":{"start":{"line":288,"column":10},"end":{"line":292,"column":12}},"112":{"start":{"line":295,"column":8},"end":{"line":299,"column":10}},"113":{"start":{"line":301,"column":8},"end":{"line":310,"column":10}},"114":{"start":{"line":314,"column":2},"end":{"line":314,"column":18}},"115":{"start":{"line":317,"column":0},"end":{"line":317,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":15,"column":25},"end":{"line":15,"column":26}},"loc":{"start":{"line":15,"column":51},"end":{"line":108,"column":1}},"line":15},"1":{"name":"(anonymous_1)","decl":{"start":{"line":38,"column":30},"end":{"line":38,"column":31}},"loc":{"start":{"line":38,"column":37},"end":{"line":82,"column":3}},"line":38},"2":{"name":"(anonymous_2)","decl":{"start":{"line":110,"column":24},"end":{"line":110,"column":25}},"loc":{"start":{"line":110,"column":50},"end":{"line":162,"column":1}},"line":110},"3":{"name":"(anonymous_3)","decl":{"start":{"line":129,"column":30},"end":{"line":129,"column":31}},"loc":{"start":{"line":129,"column":37},"end":{"line":150,"column":3}},"line":129},"4":{"name":"(anonymous_4)","decl":{"start":{"line":164,"column":28},"end":{"line":164,"column":29}},"loc":{"start":{"line":164,"column":70},"end":{"line":181,"column":1}},"line":164},"5":{"name":"(anonymous_5)","decl":{"start":{"line":183,"column":31},"end":{"line":183,"column":32}},"loc":{"start":{"line":183,"column":73},"end":{"line":234,"column":1}},"line":183},"6":{"name":"(anonymous_6)","decl":{"start":{"line":213,"column":30},"end":{"line":213,"column":31}},"loc":{"start":{"line":213,"column":37},"end":{"line":222,"column":3}},"line":213},"7":{"name":"(anonymous_7)","decl":{"start":{"line":236,"column":21},"end":{"line":236,"column":22}},"loc":{"start":{"line":236,"column":53},"end":{"line":271,"column":1}},"line":236},"8":{"name":"(anonymous_8)","decl":{"start":{"line":273,"column":16},"end":{"line":273,"column":17}},"loc":{"start":{"line":273,"column":25},"end":{"line":275,"column":1}},"line":273},"9":{"name":"(anonymous_9)","decl":{"start":{"line":277,"column":26},"end":{"line":277,"column":27}},"loc":{"start":{"line":277,"column":42},"end":{"line":315,"column":1}},"line":277},"10":{"name":"(anonymous_10)","decl":{"start":{"line":284,"column":15},"end":{"line":284,"column":16}},"loc":{"start":{"line":284,"column":30},"end":{"line":312,"column":5}},"line":284}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},"type":"if","locations":[{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},{"start":{"line":19,"column":2},"end":{"line":21,"column":3}}],"line":19},"1":{"loc":{"start":{"line":19,"column":6},"end":{"line":19,"column":61}},"type":"binary-expr","locations":[{"start":{"line":19,"column":6},"end":{"line":19,"column":12}},{"start":{"line":19,"column":16},"end":{"line":19,"column":43}},{"start":{"line":19,"column":47},"end":{"line":19,"column":61}}],"line":19},"2":{"loc":{"start":{"line":23,"column":2},"end":{"line":28,"column":3}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":28,"column":3}},{"start":{"line":23,"column":2},"end":{"line":28,"column":3}}],"line":23},"3":{"loc":{"start":{"line":40,"column":18},"end":{"line":40,"column":55}},"type":"binary-expr","locations":[{"start":{"line":40,"column":18},"end":{"line":40,"column":28}},{"start":{"line":40,"column":32},"end":{"line":40,"column":55}}],"line":40},"4":{"loc":{"start":{"line":41,"column":4},"end":{"line":81,"column":5}},"type":"if","locations":[{"start":{"line":41,"column":4},"end":{"line":81,"column":5}},{"start":{"line":41,"column":4},"end":{"line":81,"column":5}}],"line":41},"5":{"loc":{"start":{"line":42,"column":6},"end":{"line":43,"column":55}},"type":"binary-expr","locations":[{"start":{"line":42,"column":6},"end":{"line":42,"column":49}},{"start":{"line":43,"column":6},"end":{"line":43,"column":55}}],"line":42},"6":{"loc":{"start":{"line":45,"column":6},"end":{"line":47,"column":7}},"type":"if","locations":[{"start":{"line":45,"column":6},"end":{"line":47,"column":7}},{"start":{"line":45,"column":6},"end":{"line":47,"column":7}}],"line":45},"7":{"loc":{"start":{"line":50,"column":11},"end":{"line":81,"column":5}},"type":"if","locations":[{"start":{"line":50,"column":11},"end":{"line":81,"column":5}},{"start":{"line":50,"column":11},"end":{"line":81,"column":5}}],"line":50},"8":{"loc":{"start":{"line":51,"column":6},"end":{"line":59,"column":7}},"type":"if","locations":[{"start":{"line":51,"column":6},"end":{"line":59,"column":7}},{"start":{"line":51,"column":6},"end":{"line":59,"column":7}}],"line":51},"9":{"loc":{"start":{"line":52,"column":8},"end":{"line":53,"column":39}},"type":"binary-expr","locations":[{"start":{"line":52,"column":9},"end":{"line":52,"column":36}},{"start":{"line":52,"column":40},"end":{"line":52,"column":54}},{"start":{"line":53,"column":8},"end":{"line":53,"column":39}}],"line":52},"10":{"loc":{"start":{"line":60,"column":6},"end":{"line":80,"column":80}},"type":"if","locations":[{"start":{"line":60,"column":6},"end":{"line":80,"column":80}},{"start":{"line":60,"column":6},"end":{"line":80,"column":80}}],"line":60},"11":{"loc":{"start":{"line":62,"column":10},"end":{"line":63,"column":45}},"type":"binary-expr","locations":[{"start":{"line":62,"column":10},"end":{"line":62,"column":44}},{"start":{"line":63,"column":10},"end":{"line":63,"column":45}}],"line":62},"12":{"loc":{"start":{"line":67,"column":11},"end":{"line":80,"column":80}},"type":"if","locations":[{"start":{"line":67,"column":11},"end":{"line":80,"column":80}},{"start":{"line":67,"column":11},"end":{"line":80,"column":80}}],"line":67},"13":{"loc":{"start":{"line":68,"column":40},"end":{"line":70,"column":27}},"type":"cond-expr","locations":[{"start":{"line":69,"column":12},"end":{"line":69,"column":29}},{"start":{"line":70,"column":12},"end":{"line":70,"column":27}}],"line":68},"14":{"loc":{"start":{"line":77,"column":13},"end":{"line":80,"column":80}},"type":"if","locations":[{"start":{"line":77,"column":13},"end":{"line":80,"column":80}},{"start":{"line":77,"column":13},"end":{"line":80,"column":80}}],"line":77},"15":{"loc":{"start":{"line":85,"column":4},"end":{"line":89,"column":25}},"type":"cond-expr","locations":[{"start":{"line":88,"column":8},"end":{"line":88,"column":26}},{"start":{"line":89,"column":8},"end":{"line":89,"column":25}}],"line":85},"16":{"loc":{"start":{"line":85,"column":4},"end":{"line":87,"column":30}},"type":"binary-expr","locations":[{"start":{"line":85,"column":4},"end":{"line":85,"column":22}},{"start":{"line":86,"column":4},"end":{"line":86,"column":38}},{"start":{"line":87,"column":4},"end":{"line":87,"column":30}}],"line":85},"17":{"loc":{"start":{"line":94,"column":6},"end":{"line":99,"column":16}},"type":"cond-expr","locations":[{"start":{"line":98,"column":10},"end":{"line":98,"column":36}},{"start":{"line":99,"column":10},"end":{"line":99,"column":16}}],"line":94},"18":{"loc":{"start":{"line":94,"column":6},"end":{"line":97,"column":40}},"type":"binary-expr","locations":[{"start":{"line":94,"column":6},"end":{"line":94,"column":20}},{"start":{"line":95,"column":6},"end":{"line":95,"column":53}},{"start":{"line":96,"column":6},"end":{"line":96,"column":42}},{"start":{"line":97,"column":6},"end":{"line":97,"column":40}}],"line":94},"19":{"loc":{"start":{"line":102,"column":15},"end":{"line":102,"column":36}},"type":"binary-expr","locations":[{"start":{"line":102,"column":15},"end":{"line":102,"column":26}},{"start":{"line":102,"column":30},"end":{"line":102,"column":36}}],"line":102},"20":{"loc":{"start":{"line":115,"column":2},"end":{"line":119,"column":3}},"type":"if","locations":[{"start":{"line":115,"column":2},"end":{"line":119,"column":3}},{"start":{"line":115,"column":2},"end":{"line":119,"column":3}}],"line":115},"21":{"loc":{"start":{"line":120,"column":2},"end":{"line":125,"column":3}},"type":"if","locations":[{"start":{"line":120,"column":2},"end":{"line":125,"column":3}},{"start":{"line":120,"column":2},"end":{"line":125,"column":3}}],"line":120},"22":{"loc":{"start":{"line":132,"column":4},"end":{"line":140,"column":5}},"type":"if","locations":[{"start":{"line":132,"column":4},"end":{"line":140,"column":5}},{"start":{"line":132,"column":4},"end":{"line":140,"column":5}}],"line":132},"23":{"loc":{"start":{"line":133,"column":14},"end":{"line":133,"column":51}},"type":"binary-expr","locations":[{"start":{"line":133,"column":14},"end":{"line":133,"column":24}},{"start":{"line":133,"column":28},"end":{"line":133,"column":51}}],"line":133},"24":{"loc":{"start":{"line":136,"column":6},"end":{"line":139,"column":7}},"type":"if","locations":[{"start":{"line":136,"column":6},"end":{"line":139,"column":7}},{"start":{"line":136,"column":6},"end":{"line":139,"column":7}}],"line":136},"25":{"loc":{"start":{"line":136,"column":10},"end":{"line":136,"column":55}},"type":"binary-expr","locations":[{"start":{"line":136,"column":10},"end":{"line":136,"column":37}},{"start":{"line":136,"column":41},"end":{"line":136,"column":55}}],"line":136},"26":{"loc":{"start":{"line":141,"column":4},"end":{"line":143,"column":5}},"type":"if","locations":[{"start":{"line":141,"column":4},"end":{"line":143,"column":5}},{"start":{"line":141,"column":4},"end":{"line":143,"column":5}}],"line":141},"27":{"loc":{"start":{"line":144,"column":4},"end":{"line":149,"column":5}},"type":"if","locations":[{"start":{"line":144,"column":4},"end":{"line":149,"column":5}},{"start":{"line":144,"column":4},"end":{"line":149,"column":5}}],"line":144},"28":{"loc":{"start":{"line":151,"column":2},"end":{"line":156,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":156,"column":3}},{"start":{"line":151,"column":2},"end":{"line":156,"column":3}}],"line":151},"29":{"loc":{"start":{"line":167,"column":2},"end":{"line":179,"column":3}},"type":"switch","locations":[{"start":{"line":168,"column":4},"end":{"line":170,"column":12}},{"start":{"line":171,"column":4},"end":{"line":173,"column":12}},{"start":{"line":174,"column":4},"end":{"line":178,"column":8}}],"line":167},"30":{"loc":{"start":{"line":189,"column":2},"end":{"line":194,"column":3}},"type":"if","locations":[{"start":{"line":189,"column":2},"end":{"line":194,"column":3}},{"start":{"line":189,"column":2},"end":{"line":194,"column":3}}],"line":189},"31":{"loc":{"start":{"line":196,"column":2},"end":{"line":200,"column":3}},"type":"if","locations":[{"start":{"line":196,"column":2},"end":{"line":200,"column":3}},{"start":{"line":196,"column":2},"end":{"line":200,"column":3}}],"line":196},"32":{"loc":{"start":{"line":202,"column":2},"end":{"line":207,"column":3}},"type":"if","locations":[{"start":{"line":202,"column":2},"end":{"line":207,"column":3}},{"start":{"line":202,"column":2},"end":{"line":207,"column":3}}],"line":202},"33":{"loc":{"start":{"line":214,"column":18},"end":{"line":214,"column":47}},"type":"binary-expr","locations":[{"start":{"line":214,"column":18},"end":{"line":214,"column":24}},{"start":{"line":214,"column":28},"end":{"line":214,"column":47}}],"line":214},"34":{"loc":{"start":{"line":215,"column":4},"end":{"line":217,"column":5}},"type":"if","locations":[{"start":{"line":215,"column":4},"end":{"line":217,"column":5}},{"start":{"line":215,"column":4},"end":{"line":217,"column":5}}],"line":215},"35":{"loc":{"start":{"line":218,"column":4},"end":{"line":221,"column":5}},"type":"if","locations":[{"start":{"line":218,"column":4},"end":{"line":221,"column":5}},{"start":{"line":218,"column":4},"end":{"line":221,"column":5}}],"line":218},"36":{"loc":{"start":{"line":223,"column":2},"end":{"line":228,"column":3}},"type":"if","locations":[{"start":{"line":223,"column":2},"end":{"line":228,"column":3}},{"start":{"line":223,"column":2},"end":{"line":228,"column":3}}],"line":223},"37":{"loc":{"start":{"line":240,"column":25},"end":{"line":240,"column":51}},"type":"binary-expr","locations":[{"start":{"line":240,"column":25},"end":{"line":240,"column":36}},{"start":{"line":240,"column":40},"end":{"line":240,"column":51}}],"line":240},"38":{"loc":{"start":{"line":241,"column":2},"end":{"line":246,"column":3}},"type":"if","locations":[{"start":{"line":241,"column":2},"end":{"line":246,"column":3}},{"start":{"line":241,"column":2},"end":{"line":246,"column":3}}],"line":241},"39":{"loc":{"start":{"line":249,"column":2},"end":{"line":258,"column":3}},"type":"switch","locations":[{"start":{"line":250,"column":4},"end":{"line":252,"column":12}},{"start":{"line":253,"column":4},"end":{"line":255,"column":12}},{"start":{"line":256,"column":4},"end":{"line":257,"column":63}}],"line":249},"40":{"loc":{"start":{"line":260,"column":2},"end":{"line":268,"column":3}},"type":"if","locations":[{"start":{"line":260,"column":2},"end":{"line":268,"column":3}},{"start":{"line":260,"column":2},"end":{"line":268,"column":3}}],"line":260},"41":{"loc":{"start":{"line":260,"column":6},"end":{"line":260,"column":48}},"type":"binary-expr","locations":[{"start":{"line":260,"column":6},"end":{"line":260,"column":17}},{"start":{"line":260,"column":21},"end":{"line":260,"column":48}}],"line":260},"42":{"loc":{"start":{"line":278,"column":2},"end":{"line":281,"column":3}},"type":"if","locations":[{"start":{"line":278,"column":2},"end":{"line":281,"column":3}},{"start":{"line":278,"column":2},"end":{"line":281,"column":3}}],"line":278},"43":{"loc":{"start":{"line":278,"column":6},"end":{"line":278,"column":50}},"type":"binary-expr","locations":[{"start":{"line":278,"column":6},"end":{"line":278,"column":28}},{"start":{"line":278,"column":32},"end":{"line":278,"column":50}}],"line":278},"44":{"loc":{"start":{"line":286,"column":8},"end":{"line":293,"column":9}},"type":"if","locations":[{"start":{"line":286,"column":8},"end":{"line":293,"column":9}},{"start":{"line":286,"column":8},"end":{"line":293,"column":9}}],"line":286},"45":{"loc":{"start":{"line":304,"column":10},"end":{"line":308,"column":17}},"type":"cond-expr","locations":[{"start":{"line":305,"column":14},"end":{"line":305,"column":35}},{"start":{"line":306,"column":14},"end":{"line":308,"column":17}}],"line":304},"46":{"loc":{"start":{"line":306,"column":14},"end":{"line":308,"column":17}},"type":"cond-expr","locations":[{"start":{"line":307,"column":14},"end":{"line":307,"column":24}},{"start":{"line":308,"column":14},"end":{"line":308,"column":17}}],"line":306},"47":{"loc":{"start":{"line":309,"column":10},"end":{"line":309,"column":69}},"type":"binary-expr","locations":[{"start":{"line":309,"column":10},"end":{"line":309,"column":23}},{"start":{"line":309,"column":27},"end":{"line":309,"column":69}}],"line":309}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":14,"6":14,"7":14,"8":1,"9":13,"10":1,"11":12,"12":12,"13":12,"14":35,"15":35,"16":24,"17":0,"18":24,"19":11,"20":9,"21":0,"22":9,"23":2,"24":7,"25":4,"26":4,"27":3,"28":3,"29":0,"30":12,"31":12,"32":12,"33":12,"34":1,"35":5,"36":5,"37":5,"38":5,"39":1,"40":4,"41":1,"42":3,"43":3,"44":7,"45":5,"46":2,"47":2,"48":7,"49":1,"50":6,"51":4,"52":2,"53":2,"54":1,"55":1,"56":1,"57":1,"58":20,"59":14,"60":12,"61":5,"62":1,"63":1,"64":13,"65":1,"66":5,"67":5,"68":5,"69":5,"70":1,"71":4,"72":1,"73":3,"74":1,"75":2,"76":2,"77":4,"78":4,"79":1,"80":3,"81":3,"82":1,"83":0,"84":1,"85":1,"86":1,"87":27,"88":27,"89":27,"90":1,"91":26,"92":26,"93":5,"94":1,"95":20,"96":13,"97":1,"98":14,"99":2,"100":12,"101":14,"102":1,"103":27,"104":1,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":1},"f":{"0":14,"1":35,"2":5,"3":7,"4":20,"5":5,"6":4,"7":27,"8":27,"9":0,"10":0},"b":{"0":[1,13],"1":[14,13,13],"2":[1,12],"3":[35,35],"4":[24,11],"5":[35,26],"6":[0,24],"7":[9,2],"8":[0,9],"9":[9,8,1],"10":[2,7],"11":[9,5],"12":[4,3],"13":[2,2],"14":[3,0],"15":[1,11],"16":[12,2,1],"17":[1,11],"18":[12,2,1,1],"19":[12,1],"20":[1,4],"21":[1,3],"22":[5,2],"23":[5,5],"24":[2,0],"25":[2,0],"26":[1,6],"27":[4,2],"28":[1,1],"29":[14,5,1],"30":[1,4],"31":[1,3],"32":[1,2],"33":[4,4],"34":[1,3],"35":[3,0],"36":[0,1],"37":[27,0],"38":[1,26],"39":[5,20,1],"40":[2,12],"41":[14,14],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0],"47":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ea1b007ddabdf3414168f303b16d7427bc354b6d"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\postgres\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\postgres\\transform.js","statementMap":{"0":{"start":{"line":1,"column":36},"end":{"line":1,"column":65}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":27}},"2":{"start":{"line":6,"column":2},"end":{"line":6,"column":51}},"3":{"start":{"line":10,"column":2},"end":{"line":12,"column":3}},"4":{"start":{"line":11,"column":4},"end":{"line":11,"column":18}},"5":{"start":{"line":13,"column":2},"end":{"line":13,"column":18}},"6":{"start":{"line":17,"column":26},"end":{"line":17,"column":69}},"7":{"start":{"line":18,"column":23},"end":{"line":18,"column":71}},"8":{"start":{"line":19,"column":19},"end":{"line":19,"column":27}},"9":{"start":{"line":20,"column":2},"end":{"line":27,"column":5}},"10":{"start":{"line":30,"column":0},"end":{"line":33,"column":2}}},"fnMap":{"0":{"name":"processSingleMessage","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":29}},"loc":{"start":{"line":5,"column":48},"end":{"line":7,"column":1}},"line":5},"1":{"name":"getDataTypeOverride","decl":{"start":{"line":9,"column":9},"end":{"line":9,"column":28}},"loc":{"start":{"line":9,"column":48},"end":{"line":14,"column":1}},"line":9},"2":{"name":"process","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":16}},"loc":{"start":{"line":16,"column":24},"end":{"line":28,"column":1}},"line":16}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":2},"end":{"line":12,"column":3}},"type":"if","locations":[{"start":{"line":10,"column":2},"end":{"line":12,"column":3}},{"start":{"line":10,"column":2},"end":{"line":12,"column":3}}],"line":10},"1":{"loc":{"start":{"line":17,"column":26},"end":{"line":17,"column":69}},"type":"binary-expr","locations":[{"start":{"line":17,"column":26},"end":{"line":17,"column":61}},{"start":{"line":17,"column":65},"end":{"line":17,"column":69}}],"line":17},"2":{"loc":{"start":{"line":26,"column":20},"end":{"line":26,"column":73}},"type":"cond-expr","locations":[{"start":{"line":26,"column":37},"end":{"line":26,"column":66}},{"start":{"line":26,"column":69},"end":{"line":26,"column":73}}],"line":26}},"s":{"0":3,"1":3,"2":124,"3":2917,"4":1,"5":2916,"6":124,"7":124,"8":124,"9":124,"10":3},"f":{"0":124,"1":2917,"2":124},"b":{"0":[1,2916],"1":[124,0],"2":[6,118]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"297fa10bf25122eb9fb2a29434a360dfca8f7569"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\posthog\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\posthog\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":30},"end":{"line":3,"column":55}},"2":{"start":{"line":5,"column":26},"end":{"line":40,"column":1}},"3":{"start":{"line":42,"column":23},"end":{"line":42,"column":69}},"4":{"start":{"line":44,"column":0},"end":{"line":48,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"20ee2a599c7382bb2ff37201b23f009c059d5d24"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\posthog\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\posthog\\transform.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":51}},"1":{"start":{"line":6,"column":4},"end":{"line":6,"column":23}},"2":{"start":{"line":21,"column":4},"end":{"line":21,"column":25}},"3":{"start":{"line":24,"column":35},"end":{"line":68,"column":1}},"4":{"start":{"line":25,"column":25},"end":{"line":25,"column":56}},"5":{"start":{"line":26,"column":23},"end":{"line":26,"column":53}},"6":{"start":{"line":27,"column":13},"end":{"line":27,"column":15}},"7":{"start":{"line":41,"column":2},"end":{"line":41,"column":49}},"8":{"start":{"line":44,"column":2},"end":{"line":54,"column":3}},"9":{"start":{"line":49,"column":20},"end":{"line":49,"column":61}},"10":{"start":{"line":50,"column":19},"end":{"line":50,"column":42}},"11":{"start":{"line":51,"column":4},"end":{"line":51,"column":22}},"12":{"start":{"line":52,"column":4},"end":{"line":52,"column":33}},"13":{"start":{"line":53,"column":4},"end":{"line":53,"column":44}},"14":{"start":{"line":57,"column":2},"end":{"line":59,"column":3}},"15":{"start":{"line":58,"column":4},"end":{"line":58,"column":38}},"16":{"start":{"line":62,"column":14},"end":{"line":62,"column":43}},"17":{"start":{"line":63,"column":2},"end":{"line":65,"column":3}},"18":{"start":{"line":64,"column":4},"end":{"line":64,"column":26}},"19":{"start":{"line":67,"column":2},"end":{"line":67,"column":44}},"20":{"start":{"line":70,"column":30},"end":{"line":127,"column":1}},"21":{"start":{"line":73,"column":2},"end":{"line":80,"column":3}},"22":{"start":{"line":74,"column":4},"end":{"line":77,"column":6}},"23":{"start":{"line":79,"column":4},"end":{"line":79,"column":71}},"24":{"start":{"line":81,"column":2},"end":{"line":84,"column":3}},"25":{"start":{"line":83,"column":4},"end":{"line":83,"column":70}},"26":{"start":{"line":86,"column":2},"end":{"line":89,"column":4}},"27":{"start":{"line":91,"column":2},"end":{"line":95,"column":3}},"28":{"start":{"line":94,"column":4},"end":{"line":94,"column":54}},"29":{"start":{"line":98,"column":2},"end":{"line":100,"column":3}},"30":{"start":{"line":99,"column":4},"end":{"line":99,"column":57}},"31":{"start":{"line":101,"column":2},"end":{"line":106,"column":3}},"32":{"start":{"line":105,"column":4},"end":{"line":105,"column":79}},"33":{"start":{"line":109,"column":2},"end":{"line":111,"column":3}},"34":{"start":{"line":110,"column":4},"end":{"line":110,"column":35}},"35":{"start":{"line":113,"column":23},"end":{"line":117,"column":3}},"36":{"start":{"line":118,"column":19},"end":{"line":118,"column":41}},"37":{"start":{"line":119,"column":2},"end":{"line":120,"column":34}},"38":{"start":{"line":121,"column":2},"end":{"line":121,"column":59}},"39":{"start":{"line":122,"column":2},"end":{"line":124,"column":4}},"40":{"start":{"line":125,"column":2},"end":{"line":125,"column":36}},"41":{"start":{"line":126,"column":2},"end":{"line":126,"column":18}},"42":{"start":{"line":129,"column":21},"end":{"line":140,"column":1}},"43":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"44":{"start":{"line":131,"column":4},"end":{"line":131,"column":58}},"45":{"start":{"line":134,"column":19},"end":{"line":134,"column":64}},"46":{"start":{"line":135,"column":2},"end":{"line":137,"column":3}},"47":{"start":{"line":136,"column":4},"end":{"line":136,"column":62}},"48":{"start":{"line":139,"column":2},"end":{"line":139,"column":63}},"49":{"start":{"line":142,"column":16},"end":{"line":144,"column":1}},"50":{"start":{"line":143,"column":2},"end":{"line":143,"column":56}},"51":{"start":{"line":146,"column":26},"end":{"line":183,"column":1}},"52":{"start":{"line":147,"column":2},"end":{"line":150,"column":3}},"53":{"start":{"line":148,"column":23},"end":{"line":148,"column":75}},"54":{"start":{"line":149,"column":4},"end":{"line":149,"column":24}},"55":{"start":{"line":152,"column":19},"end":{"line":181,"column":3}},"56":{"start":{"line":154,"column":6},"end":{"line":179,"column":7}},"57":{"start":{"line":155,"column":8},"end":{"line":162,"column":9}},"58":{"start":{"line":157,"column":10},"end":{"line":161,"column":12}},"59":{"start":{"line":164,"column":8},"end":{"line":168,"column":10}},"60":{"start":{"line":170,"column":8},"end":{"line":178,"column":10}},"61":{"start":{"line":182,"column":2},"end":{"line":182,"column":18}},"62":{"start":{"line":185,"column":0},"end":{"line":185,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":24,"column":35},"end":{"line":24,"column":36}},"loc":{"start":{"line":24,"column":46},"end":{"line":68,"column":1}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":70,"column":30},"end":{"line":70,"column":31}},"loc":{"start":{"line":70,"column":66},"end":{"line":127,"column":1}},"line":70},"2":{"name":"(anonymous_2)","decl":{"start":{"line":129,"column":21},"end":{"line":129,"column":22}},"loc":{"start":{"line":129,"column":47},"end":{"line":140,"column":1}},"line":129},"3":{"name":"(anonymous_3)","decl":{"start":{"line":142,"column":16},"end":{"line":142,"column":17}},"loc":{"start":{"line":142,"column":25},"end":{"line":144,"column":1}},"line":142},"4":{"name":"(anonymous_4)","decl":{"start":{"line":146,"column":26},"end":{"line":146,"column":27}},"loc":{"start":{"line":146,"column":42},"end":{"line":183,"column":1}},"line":146},"5":{"name":"(anonymous_5)","decl":{"start":{"line":153,"column":15},"end":{"line":153,"column":16}},"loc":{"start":{"line":153,"column":30},"end":{"line":180,"column":5}},"line":153}},"branchMap":{"0":{"loc":{"start":{"line":44,"column":2},"end":{"line":54,"column":3}},"type":"if","locations":[{"start":{"line":44,"column":2},"end":{"line":54,"column":3}},{"start":{"line":44,"column":2},"end":{"line":54,"column":3}}],"line":44},"1":{"loc":{"start":{"line":45,"column":4},"end":{"line":47,"column":29}},"type":"binary-expr","locations":[{"start":{"line":45,"column":4},"end":{"line":45,"column":29}},{"start":{"line":46,"column":4},"end":{"line":46,"column":19}},{"start":{"line":47,"column":4},"end":{"line":47,"column":29}}],"line":45},"2":{"loc":{"start":{"line":57,"column":2},"end":{"line":59,"column":3}},"type":"if","locations":[{"start":{"line":57,"column":2},"end":{"line":59,"column":3}},{"start":{"line":57,"column":2},"end":{"line":59,"column":3}}],"line":57},"3":{"loc":{"start":{"line":63,"column":2},"end":{"line":65,"column":3}},"type":"if","locations":[{"start":{"line":63,"column":2},"end":{"line":65,"column":3}},{"start":{"line":63,"column":2},"end":{"line":65,"column":3}}],"line":63},"4":{"loc":{"start":{"line":73,"column":2},"end":{"line":80,"column":3}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":80,"column":3}},{"start":{"line":73,"column":2},"end":{"line":80,"column":3}}],"line":73},"5":{"loc":{"start":{"line":73,"column":6},"end":{"line":73,"column":64}},"type":"binary-expr","locations":[{"start":{"line":73,"column":6},"end":{"line":73,"column":31}},{"start":{"line":73,"column":35},"end":{"line":73,"column":64}}],"line":73},"6":{"loc":{"start":{"line":81,"column":2},"end":{"line":84,"column":3}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":84,"column":3}},{"start":{"line":81,"column":2},"end":{"line":84,"column":3}}],"line":81},"7":{"loc":{"start":{"line":91,"column":2},"end":{"line":95,"column":3}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":95,"column":3}},{"start":{"line":91,"column":2},"end":{"line":95,"column":3}}],"line":91},"8":{"loc":{"start":{"line":91,"column":6},"end":{"line":91,"column":64}},"type":"binary-expr","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":31}},{"start":{"line":91,"column":35},"end":{"line":91,"column":64}}],"line":91},"9":{"loc":{"start":{"line":98,"column":2},"end":{"line":100,"column":3}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":100,"column":3}},{"start":{"line":98,"column":2},"end":{"line":100,"column":3}}],"line":98},"10":{"loc":{"start":{"line":101,"column":2},"end":{"line":106,"column":3}},"type":"if","locations":[{"start":{"line":101,"column":2},"end":{"line":106,"column":3}},{"start":{"line":101,"column":2},"end":{"line":106,"column":3}}],"line":101},"11":{"loc":{"start":{"line":102,"column":4},"end":{"line":103,"column":55}},"type":"binary-expr","locations":[{"start":{"line":102,"column":4},"end":{"line":102,"column":22}},{"start":{"line":103,"column":4},"end":{"line":103,"column":55}}],"line":102},"12":{"loc":{"start":{"line":109,"column":2},"end":{"line":111,"column":3}},"type":"if","locations":[{"start":{"line":109,"column":2},"end":{"line":111,"column":3}},{"start":{"line":109,"column":2},"end":{"line":111,"column":3}}],"line":109},"13":{"loc":{"start":{"line":119,"column":25},"end":{"line":120,"column":25}},"type":"binary-expr","locations":[{"start":{"line":119,"column":25},"end":{"line":119,"column":76}},{"start":{"line":120,"column":4},"end":{"line":120,"column":25}}],"line":119},"14":{"loc":{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":130,"column":2},"end":{"line":132,"column":3}},{"start":{"line":130,"column":2},"end":{"line":132,"column":3}}],"line":130},"15":{"loc":{"start":{"line":135,"column":2},"end":{"line":137,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":137,"column":3}},{"start":{"line":135,"column":2},"end":{"line":137,"column":3}}],"line":135},"16":{"loc":{"start":{"line":147,"column":2},"end":{"line":150,"column":3}},"type":"if","locations":[{"start":{"line":147,"column":2},"end":{"line":150,"column":3}},{"start":{"line":147,"column":2},"end":{"line":150,"column":3}}],"line":147},"17":{"loc":{"start":{"line":147,"column":6},"end":{"line":147,"column":50}},"type":"binary-expr","locations":[{"start":{"line":147,"column":6},"end":{"line":147,"column":28}},{"start":{"line":147,"column":32},"end":{"line":147,"column":50}}],"line":147},"18":{"loc":{"start":{"line":155,"column":8},"end":{"line":162,"column":9}},"type":"if","locations":[{"start":{"line":155,"column":8},"end":{"line":162,"column":9}},{"start":{"line":155,"column":8},"end":{"line":162,"column":9}}],"line":155},"19":{"loc":{"start":{"line":172,"column":10},"end":{"line":176,"column":17}},"type":"cond-expr","locations":[{"start":{"line":173,"column":14},"end":{"line":173,"column":35}},{"start":{"line":174,"column":14},"end":{"line":176,"column":17}}],"line":172},"20":{"loc":{"start":{"line":174,"column":14},"end":{"line":176,"column":17}},"type":"cond-expr","locations":[{"start":{"line":175,"column":14},"end":{"line":175,"column":24}},{"start":{"line":176,"column":14},"end":{"line":176,"column":17}}],"line":174},"21":{"loc":{"start":{"line":177,"column":10},"end":{"line":177,"column":69}},"type":"binary-expr","locations":[{"start":{"line":177,"column":10},"end":{"line":177,"column":23}},{"start":{"line":177,"column":27},"end":{"line":177,"column":69}}],"line":177}},"s":{"0":1,"1":1,"2":1,"3":1,"4":11,"5":11,"6":11,"7":11,"8":11,"9":5,"10":5,"11":5,"12":5,"13":5,"14":11,"15":1,"16":11,"17":11,"18":5,"19":11,"20":1,"21":11,"22":1,"23":10,"24":11,"25":0,"26":11,"27":11,"28":1,"29":11,"30":9,"31":11,"32":11,"33":11,"34":6,"35":11,"36":11,"37":11,"38":11,"39":11,"40":11,"41":11,"42":1,"43":11,"44":0,"45":11,"46":11,"47":0,"48":11,"49":1,"50":11,"51":1,"52":1,"53":0,"54":0,"55":1,"56":2,"57":2,"58":0,"59":2,"60":0,"61":1,"62":1},"f":{"0":11,"1":11,"2":11,"3":11,"4":1,"5":2},"b":{"0":[5,6],"1":[11,5,5],"2":[1,10],"3":[5,6],"4":[1,10],"5":[11,2],"6":[0,11],"7":[1,10],"8":[11,2],"9":[9,2],"10":[11,0],"11":[11,11],"12":[6,5],"13":[11,2],"14":[0,11],"15":[0,11],"16":[0,1],"17":[1,1],"18":[0,2],"19":[0,0],"20":[0,0],"21":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"49bc88040d248eaa33ed96659395dff07764bcd4"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\profitwell\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\profitwell\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":22},"end":{"line":3,"column":50}},"2":{"start":{"line":5,"column":23},"end":{"line":14,"column":1}},"3":{"start":{"line":16,"column":22},"end":{"line":16,"column":65}},"4":{"start":{"line":17,"column":0},"end":{"line":22,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a4bd350ea2ec2de7a7a14f3f9e91e7c9cdf939ba"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\profitwell\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\profitwell\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":22},"end":{"line":2,"column":51}},"2":{"start":{"line":7,"column":4},"end":{"line":7,"column":22}},"3":{"start":{"line":19,"column":4},"end":{"line":19,"column":25}},"4":{"start":{"line":24,"column":4},"end":{"line":24,"column":23}},"5":{"start":{"line":26,"column":32},"end":{"line":239,"column":1}},"6":{"start":{"line":27,"column":17},"end":{"line":27,"column":70}},"7":{"start":{"line":28,"column":20},"end":{"line":28,"column":63}},"8":{"start":{"line":30,"column":2},"end":{"line":32,"column":3}},"9":{"start":{"line":31,"column":4},"end":{"line":31,"column":79}},"10":{"start":{"line":34,"column":23},"end":{"line":37,"column":3}},"11":{"start":{"line":39,"column":4},"end":{"line":40,"column":52}},"12":{"start":{"line":42,"column":2},"end":{"line":47,"column":3}},"13":{"start":{"line":43,"column":4},"end":{"line":46,"column":6}},"14":{"start":{"line":49,"column":20},"end":{"line":49,"column":71}},"15":{"start":{"line":50,"column":14},"end":{"line":54,"column":4}},"16":{"start":{"line":57,"column":19},"end":{"line":57,"column":41}},"17":{"start":{"line":59,"column":2},"end":{"line":184,"column":3}},"18":{"start":{"line":60,"column":28},"end":{"line":60,"column":32}},"19":{"start":{"line":61,"column":21},"end":{"line":96,"column":6}},"20":{"start":{"line":62,"column":6},"end":{"line":94,"column":7}},"21":{"start":{"line":63,"column":8},"end":{"line":67,"column":9}},"22":{"start":{"line":64,"column":10},"end":{"line":64,"column":51}},"23":{"start":{"line":65,"column":10},"end":{"line":65,"column":35}},"24":{"start":{"line":66,"column":10},"end":{"line":66,"column":22}},"25":{"start":{"line":68,"column":8},"end":{"line":76,"column":9}},"26":{"start":{"line":73,"column":10},"end":{"line":73,"column":57}},"27":{"start":{"line":74,"column":10},"end":{"line":74,"column":35}},"28":{"start":{"line":75,"column":10},"end":{"line":75,"column":22}},"29":{"start":{"line":77,"column":8},"end":{"line":77,"column":34}},"30":{"start":{"line":78,"column":13},"end":{"line":94,"column":7}},"31":{"start":{"line":79,"column":8},"end":{"line":83,"column":9}},"32":{"start":{"line":80,"column":10},"end":{"line":80,"column":51}},"33":{"start":{"line":81,"column":10},"end":{"line":81,"column":35}},"34":{"start":{"line":82,"column":10},"end":{"line":82,"column":22}},"35":{"start":{"line":84,"column":8},"end":{"line":92,"column":9}},"36":{"start":{"line":89,"column":10},"end":{"line":89,"column":57}},"37":{"start":{"line":90,"column":10},"end":{"line":90,"column":35}},"38":{"start":{"line":91,"column":10},"end":{"line":91,"column":22}},"39":{"start":{"line":93,"column":8},"end":{"line":93,"column":34}},"40":{"start":{"line":95,"column":6},"end":{"line":95,"column":19}},"41":{"start":{"line":98,"column":4},"end":{"line":147,"column":5}},"42":{"start":{"line":102,"column":6},"end":{"line":104,"column":7}},"43":{"start":{"line":103,"column":8},"end":{"line":103,"column":75}},"44":{"start":{"line":105,"column":6},"end":{"line":105,"column":64}},"45":{"start":{"line":106,"column":6},"end":{"line":110,"column":8}},"46":{"start":{"line":111,"column":6},"end":{"line":119,"column":7}},"47":{"start":{"line":118,"column":8},"end":{"line":118,"column":80}},"48":{"start":{"line":120,"column":6},"end":{"line":125,"column":7}},"49":{"start":{"line":124,"column":8},"end":{"line":124,"column":37}},"50":{"start":{"line":126,"column":6},"end":{"line":134,"column":7}},"51":{"start":{"line":133,"column":8},"end":{"line":133,"column":30}},"52":{"start":{"line":135,"column":6},"end":{"line":138,"column":8}},"53":{"start":{"line":139,"column":6},"end":{"line":139,"column":63}},"54":{"start":{"line":140,"column":6},"end":{"line":140,"column":63}},"55":{"start":{"line":141,"column":6},"end":{"line":144,"column":8}},"56":{"start":{"line":145,"column":6},"end":{"line":145,"column":65}},"57":{"start":{"line":146,"column":6},"end":{"line":146,"column":22}},"58":{"start":{"line":150,"column":4},"end":{"line":183,"column":5}},"59":{"start":{"line":151,"column":6},"end":{"line":151,"column":64}},"60":{"start":{"line":152,"column":6},"end":{"line":160,"column":7}},"61":{"start":{"line":159,"column":8},"end":{"line":159,"column":80}},"62":{"start":{"line":161,"column":6},"end":{"line":169,"column":7}},"63":{"start":{"line":168,"column":8},"end":{"line":168,"column":30}},"64":{"start":{"line":170,"column":6},"end":{"line":173,"column":8}},"65":{"start":{"line":174,"column":6},"end":{"line":174,"column":62}},"66":{"start":{"line":175,"column":6},"end":{"line":176,"column":29}},"67":{"start":{"line":177,"column":6},"end":{"line":180,"column":8}},"68":{"start":{"line":181,"column":6},"end":{"line":181,"column":65}},"69":{"start":{"line":182,"column":6},"end":{"line":182,"column":22}},"70":{"start":{"line":187,"column":16},"end":{"line":187,"column":28}},"71":{"start":{"line":188,"column":2},"end":{"line":193,"column":3}},"72":{"start":{"line":189,"column":4},"end":{"line":192,"column":6}},"73":{"start":{"line":196,"column":2},"end":{"line":198,"column":3}},"74":{"start":{"line":197,"column":4},"end":{"line":197,"column":71}},"75":{"start":{"line":201,"column":2},"end":{"line":201,"column":60}},"76":{"start":{"line":202,"column":2},"end":{"line":205,"column":4}},"77":{"start":{"line":206,"column":2},"end":{"line":214,"column":3}},"78":{"start":{"line":213,"column":4},"end":{"line":213,"column":76}},"79":{"start":{"line":215,"column":2},"end":{"line":217,"column":3}},"80":{"start":{"line":216,"column":4},"end":{"line":216,"column":33}},"81":{"start":{"line":218,"column":2},"end":{"line":226,"column":3}},"82":{"start":{"line":225,"column":4},"end":{"line":225,"column":26}},"83":{"start":{"line":227,"column":2},"end":{"line":230,"column":4}},"84":{"start":{"line":231,"column":2},"end":{"line":231,"column":59}},"85":{"start":{"line":232,"column":2},"end":{"line":232,"column":59}},"86":{"start":{"line":233,"column":2},"end":{"line":236,"column":4}},"87":{"start":{"line":237,"column":2},"end":{"line":237,"column":61}},"88":{"start":{"line":238,"column":2},"end":{"line":238,"column":18}},"89":{"start":{"line":241,"column":16},"end":{"line":262,"column":1}},"90":{"start":{"line":242,"column":35},"end":{"line":242,"column":40}},"91":{"start":{"line":243,"column":2},"end":{"line":245,"column":3}},"92":{"start":{"line":244,"column":4},"end":{"line":244,"column":66}},"93":{"start":{"line":247,"column":2},"end":{"line":249,"column":3}},"94":{"start":{"line":248,"column":4},"end":{"line":248,"column":71}},"95":{"start":{"line":251,"column":22},"end":{"line":251,"column":48}},"96":{"start":{"line":254,"column":2},"end":{"line":260,"column":3}},"97":{"start":{"line":256,"column":6},"end":{"line":256,"column":69}},"98":{"start":{"line":257,"column":6},"end":{"line":257,"column":12}},"99":{"start":{"line":259,"column":6},"end":{"line":259,"column":78}},"100":{"start":{"line":261,"column":2},"end":{"line":261,"column":18}},"101":{"start":{"line":264,"column":26},"end":{"line":293,"column":1}},"102":{"start":{"line":265,"column":2},"end":{"line":268,"column":3}},"103":{"start":{"line":266,"column":23},"end":{"line":266,"column":75}},"104":{"start":{"line":267,"column":4},"end":{"line":267,"column":24}},"105":{"start":{"line":270,"column":19},"end":{"line":291,"column":3}},"106":{"start":{"line":272,"column":6},"end":{"line":289,"column":7}},"107":{"start":{"line":274,"column":8},"end":{"line":278,"column":10}},"108":{"start":{"line":280,"column":8},"end":{"line":288,"column":10}},"109":{"start":{"line":292,"column":2},"end":{"line":292,"column":18}},"110":{"start":{"line":295,"column":0},"end":{"line":295,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":26,"column":32},"end":{"line":26,"column":33}},"loc":{"start":{"line":26,"column":63},"end":{"line":239,"column":1}},"line":26},"1":{"name":"(anonymous_1)","decl":{"start":{"line":61,"column":44},"end":{"line":61,"column":45}},"loc":{"start":{"line":61,"column":55},"end":{"line":96,"column":5}},"line":61},"2":{"name":"(anonymous_2)","decl":{"start":{"line":241,"column":16},"end":{"line":241,"column":17}},"loc":{"start":{"line":241,"column":31},"end":{"line":262,"column":1}},"line":241},"3":{"name":"(anonymous_3)","decl":{"start":{"line":264,"column":26},"end":{"line":264,"column":27}},"loc":{"start":{"line":264,"column":42},"end":{"line":293,"column":1}},"line":264},"4":{"name":"(anonymous_4)","decl":{"start":{"line":271,"column":15},"end":{"line":271,"column":16}},"loc":{"start":{"line":271,"column":30},"end":{"line":290,"column":5}},"line":271}},"branchMap":{"0":{"loc":{"start":{"line":30,"column":2},"end":{"line":32,"column":3}},"type":"if","locations":[{"start":{"line":30,"column":2},"end":{"line":32,"column":3}},{"start":{"line":30,"column":2},"end":{"line":32,"column":3}}],"line":30},"1":{"loc":{"start":{"line":30,"column":6},"end":{"line":30,"column":27}},"type":"binary-expr","locations":[{"start":{"line":30,"column":6},"end":{"line":30,"column":13}},{"start":{"line":30,"column":17},"end":{"line":30,"column":27}}],"line":30},"2":{"loc":{"start":{"line":39,"column":4},"end":{"line":40,"column":52}},"type":"binary-expr","locations":[{"start":{"line":39,"column":4},"end":{"line":39,"column":44}},{"start":{"line":40,"column":4},"end":{"line":40,"column":52}}],"line":39},"3":{"loc":{"start":{"line":42,"column":2},"end":{"line":47,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":47,"column":3}},{"start":{"line":42,"column":2},"end":{"line":47,"column":3}}],"line":42},"4":{"loc":{"start":{"line":42,"column":6},"end":{"line":42,"column":43}},"type":"binary-expr","locations":[{"start":{"line":42,"column":6},"end":{"line":42,"column":21}},{"start":{"line":42,"column":25},"end":{"line":42,"column":43}}],"line":42},"5":{"loc":{"start":{"line":49,"column":49},"end":{"line":49,"column":68}},"type":"binary-expr","locations":[{"start":{"line":49,"column":49},"end":{"line":49,"column":55}},{"start":{"line":49,"column":59},"end":{"line":49,"column":68}}],"line":49},"6":{"loc":{"start":{"line":59,"column":2},"end":{"line":184,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":184,"column":3}},{"start":{"line":59,"column":2},"end":{"line":184,"column":3}}],"line":59},"7":{"loc":{"start":{"line":62,"column":6},"end":{"line":94,"column":7}},"type":"if","locations":[{"start":{"line":62,"column":6},"end":{"line":94,"column":7}},{"start":{"line":62,"column":6},"end":{"line":94,"column":7}}],"line":62},"8":{"loc":{"start":{"line":62,"column":10},"end":{"line":62,"column":46}},"type":"binary-expr","locations":[{"start":{"line":62,"column":10},"end":{"line":62,"column":16}},{"start":{"line":62,"column":20},"end":{"line":62,"column":46}}],"line":62},"9":{"loc":{"start":{"line":63,"column":8},"end":{"line":67,"column":9}},"type":"if","locations":[{"start":{"line":63,"column":8},"end":{"line":67,"column":9}},{"start":{"line":63,"column":8},"end":{"line":67,"column":9}}],"line":63},"10":{"loc":{"start":{"line":63,"column":12},"end":{"line":63,"column":72}},"type":"binary-expr","locations":[{"start":{"line":63,"column":12},"end":{"line":63,"column":26}},{"start":{"line":63,"column":30},"end":{"line":63,"column":72}}],"line":63},"11":{"loc":{"start":{"line":68,"column":8},"end":{"line":76,"column":9}},"type":"if","locations":[{"start":{"line":68,"column":8},"end":{"line":76,"column":9}},{"start":{"line":68,"column":8},"end":{"line":76,"column":9}}],"line":68},"12":{"loc":{"start":{"line":69,"column":10},"end":{"line":71,"column":58}},"type":"binary-expr","locations":[{"start":{"line":69,"column":10},"end":{"line":69,"column":25}},{"start":{"line":70,"column":10},"end":{"line":70,"column":27}},{"start":{"line":71,"column":10},"end":{"line":71,"column":58}}],"line":69},"13":{"loc":{"start":{"line":78,"column":13},"end":{"line":94,"column":7}},"type":"if","locations":[{"start":{"line":78,"column":13},"end":{"line":94,"column":7}},{"start":{"line":78,"column":13},"end":{"line":94,"column":7}}],"line":78},"14":{"loc":{"start":{"line":78,"column":17},"end":{"line":78,"column":62}},"type":"binary-expr","locations":[{"start":{"line":78,"column":17},"end":{"line":78,"column":26}},{"start":{"line":78,"column":30},"end":{"line":78,"column":62}}],"line":78},"15":{"loc":{"start":{"line":79,"column":8},"end":{"line":83,"column":9}},"type":"if","locations":[{"start":{"line":79,"column":8},"end":{"line":83,"column":9}},{"start":{"line":79,"column":8},"end":{"line":83,"column":9}}],"line":79},"16":{"loc":{"start":{"line":79,"column":12},"end":{"line":79,"column":72}},"type":"binary-expr","locations":[{"start":{"line":79,"column":12},"end":{"line":79,"column":26}},{"start":{"line":79,"column":30},"end":{"line":79,"column":72}}],"line":79},"17":{"loc":{"start":{"line":84,"column":8},"end":{"line":92,"column":9}},"type":"if","locations":[{"start":{"line":84,"column":8},"end":{"line":92,"column":9}},{"start":{"line":84,"column":8},"end":{"line":92,"column":9}}],"line":84},"18":{"loc":{"start":{"line":85,"column":10},"end":{"line":87,"column":58}},"type":"binary-expr","locations":[{"start":{"line":85,"column":10},"end":{"line":85,"column":25}},{"start":{"line":86,"column":10},"end":{"line":86,"column":27}},{"start":{"line":87,"column":10},"end":{"line":87,"column":58}}],"line":85},"19":{"loc":{"start":{"line":98,"column":4},"end":{"line":147,"column":5}},"type":"if","locations":[{"start":{"line":98,"column":4},"end":{"line":147,"column":5}},{"start":{"line":98,"column":4},"end":{"line":147,"column":5}}],"line":98},"20":{"loc":{"start":{"line":102,"column":6},"end":{"line":104,"column":7}},"type":"if","locations":[{"start":{"line":102,"column":6},"end":{"line":104,"column":7}},{"start":{"line":102,"column":6},"end":{"line":104,"column":7}}],"line":102},"21":{"loc":{"start":{"line":111,"column":6},"end":{"line":119,"column":7}},"type":"if","locations":[{"start":{"line":111,"column":6},"end":{"line":119,"column":7}},{"start":{"line":111,"column":6},"end":{"line":119,"column":7}}],"line":111},"22":{"loc":{"start":{"line":112,"column":8},"end":{"line":116,"column":9}},"type":"binary-expr","locations":[{"start":{"line":112,"column":8},"end":{"line":112,"column":29}},{"start":{"line":113,"column":8},"end":{"line":116,"column":9}}],"line":112},"23":{"loc":{"start":{"line":114,"column":10},"end":{"line":115,"column":56}},"type":"binary-expr","locations":[{"start":{"line":114,"column":10},"end":{"line":114,"column":57}},{"start":{"line":115,"column":10},"end":{"line":115,"column":56}}],"line":114},"24":{"loc":{"start":{"line":120,"column":6},"end":{"line":125,"column":7}},"type":"if","locations":[{"start":{"line":120,"column":6},"end":{"line":125,"column":7}},{"start":{"line":120,"column":6},"end":{"line":125,"column":7}}],"line":120},"25":{"loc":{"start":{"line":121,"column":8},"end":{"line":122,"column":51}},"type":"binary-expr","locations":[{"start":{"line":121,"column":8},"end":{"line":121,"column":29}},{"start":{"line":122,"column":8},"end":{"line":122,"column":51}}],"line":121},"26":{"loc":{"start":{"line":126,"column":6},"end":{"line":134,"column":7}},"type":"if","locations":[{"start":{"line":126,"column":6},"end":{"line":134,"column":7}},{"start":{"line":126,"column":6},"end":{"line":134,"column":7}}],"line":126},"27":{"loc":{"start":{"line":127,"column":8},"end":{"line":131,"column":9}},"type":"binary-expr","locations":[{"start":{"line":127,"column":8},"end":{"line":127,"column":22}},{"start":{"line":128,"column":8},"end":{"line":131,"column":9}}],"line":127},"28":{"loc":{"start":{"line":129,"column":10},"end":{"line":130,"column":53}},"type":"binary-expr","locations":[{"start":{"line":129,"column":10},"end":{"line":129,"column":51}},{"start":{"line":130,"column":10},"end":{"line":130,"column":53}}],"line":129},"29":{"loc":{"start":{"line":150,"column":4},"end":{"line":183,"column":5}},"type":"if","locations":[{"start":{"line":150,"column":4},"end":{"line":183,"column":5}},{"start":{"line":150,"column":4},"end":{"line":183,"column":5}}],"line":150},"30":{"loc":{"start":{"line":152,"column":6},"end":{"line":160,"column":7}},"type":"if","locations":[{"start":{"line":152,"column":6},"end":{"line":160,"column":7}},{"start":{"line":152,"column":6},"end":{"line":160,"column":7}}],"line":152},"31":{"loc":{"start":{"line":153,"column":8},"end":{"line":157,"column":9}},"type":"binary-expr","locations":[{"start":{"line":153,"column":8},"end":{"line":153,"column":29}},{"start":{"line":154,"column":8},"end":{"line":157,"column":9}}],"line":153},"32":{"loc":{"start":{"line":155,"column":10},"end":{"line":156,"column":56}},"type":"binary-expr","locations":[{"start":{"line":155,"column":10},"end":{"line":155,"column":57}},{"start":{"line":156,"column":10},"end":{"line":156,"column":56}}],"line":155},"33":{"loc":{"start":{"line":161,"column":6},"end":{"line":169,"column":7}},"type":"if","locations":[{"start":{"line":161,"column":6},"end":{"line":169,"column":7}},{"start":{"line":161,"column":6},"end":{"line":169,"column":7}}],"line":161},"34":{"loc":{"start":{"line":162,"column":8},"end":{"line":166,"column":9}},"type":"binary-expr","locations":[{"start":{"line":162,"column":8},"end":{"line":162,"column":22}},{"start":{"line":163,"column":8},"end":{"line":166,"column":9}}],"line":162},"35":{"loc":{"start":{"line":164,"column":10},"end":{"line":165,"column":53}},"type":"binary-expr","locations":[{"start":{"line":164,"column":10},"end":{"line":164,"column":51}},{"start":{"line":165,"column":10},"end":{"line":165,"column":53}}],"line":164},"36":{"loc":{"start":{"line":175,"column":63},"end":{"line":176,"column":25}},"type":"binary-expr","locations":[{"start":{"line":175,"column":63},"end":{"line":175,"column":77}},{"start":{"line":176,"column":8},"end":{"line":176,"column":25}}],"line":175},"37":{"loc":{"start":{"line":188,"column":2},"end":{"line":193,"column":3}},"type":"if","locations":[{"start":{"line":188,"column":2},"end":{"line":193,"column":3}},{"start":{"line":188,"column":2},"end":{"line":193,"column":3}}],"line":188},"38":{"loc":{"start":{"line":196,"column":2},"end":{"line":198,"column":3}},"type":"if","locations":[{"start":{"line":196,"column":2},"end":{"line":198,"column":3}},{"start":{"line":196,"column":2},"end":{"line":198,"column":3}}],"line":196},"39":{"loc":{"start":{"line":206,"column":2},"end":{"line":214,"column":3}},"type":"if","locations":[{"start":{"line":206,"column":2},"end":{"line":214,"column":3}},{"start":{"line":206,"column":2},"end":{"line":214,"column":3}}],"line":206},"40":{"loc":{"start":{"line":207,"column":4},"end":{"line":211,"column":5}},"type":"binary-expr","locations":[{"start":{"line":207,"column":4},"end":{"line":207,"column":25}},{"start":{"line":208,"column":4},"end":{"line":211,"column":5}}],"line":207},"41":{"loc":{"start":{"line":209,"column":6},"end":{"line":210,"column":52}},"type":"binary-expr","locations":[{"start":{"line":209,"column":6},"end":{"line":209,"column":53}},{"start":{"line":210,"column":6},"end":{"line":210,"column":52}}],"line":209},"42":{"loc":{"start":{"line":215,"column":2},"end":{"line":217,"column":3}},"type":"if","locations":[{"start":{"line":215,"column":2},"end":{"line":217,"column":3}},{"start":{"line":215,"column":2},"end":{"line":217,"column":3}}],"line":215},"43":{"loc":{"start":{"line":215,"column":6},"end":{"line":215,"column":74}},"type":"binary-expr","locations":[{"start":{"line":215,"column":6},"end":{"line":215,"column":27}},{"start":{"line":215,"column":31},"end":{"line":215,"column":74}}],"line":215},"44":{"loc":{"start":{"line":218,"column":2},"end":{"line":226,"column":3}},"type":"if","locations":[{"start":{"line":218,"column":2},"end":{"line":226,"column":3}},{"start":{"line":218,"column":2},"end":{"line":226,"column":3}}],"line":218},"45":{"loc":{"start":{"line":219,"column":4},"end":{"line":223,"column":5}},"type":"binary-expr","locations":[{"start":{"line":219,"column":4},"end":{"line":219,"column":18}},{"start":{"line":220,"column":4},"end":{"line":223,"column":5}}],"line":219},"46":{"loc":{"start":{"line":221,"column":6},"end":{"line":222,"column":49}},"type":"binary-expr","locations":[{"start":{"line":221,"column":6},"end":{"line":221,"column":47}},{"start":{"line":222,"column":6},"end":{"line":222,"column":49}}],"line":221},"47":{"loc":{"start":{"line":243,"column":2},"end":{"line":245,"column":3}},"type":"if","locations":[{"start":{"line":243,"column":2},"end":{"line":245,"column":3}},{"start":{"line":243,"column":2},"end":{"line":245,"column":3}}],"line":243},"48":{"loc":{"start":{"line":247,"column":2},"end":{"line":249,"column":3}},"type":"if","locations":[{"start":{"line":247,"column":2},"end":{"line":249,"column":3}},{"start":{"line":247,"column":2},"end":{"line":249,"column":3}}],"line":247},"49":{"loc":{"start":{"line":254,"column":2},"end":{"line":260,"column":3}},"type":"switch","locations":[{"start":{"line":255,"column":4},"end":{"line":257,"column":12}},{"start":{"line":258,"column":4},"end":{"line":259,"column":78}}],"line":254},"50":{"loc":{"start":{"line":265,"column":2},"end":{"line":268,"column":3}},"type":"if","locations":[{"start":{"line":265,"column":2},"end":{"line":268,"column":3}},{"start":{"line":265,"column":2},"end":{"line":268,"column":3}}],"line":265},"51":{"loc":{"start":{"line":265,"column":6},"end":{"line":265,"column":50}},"type":"binary-expr","locations":[{"start":{"line":265,"column":6},"end":{"line":265,"column":28}},{"start":{"line":265,"column":32},"end":{"line":265,"column":50}}],"line":265},"52":{"loc":{"start":{"line":282,"column":10},"end":{"line":286,"column":17}},"type":"cond-expr","locations":[{"start":{"line":283,"column":14},"end":{"line":283,"column":35}},{"start":{"line":284,"column":14},"end":{"line":286,"column":17}}],"line":282},"53":{"loc":{"start":{"line":284,"column":14},"end":{"line":286,"column":17}},"type":"cond-expr","locations":[{"start":{"line":285,"column":14},"end":{"line":285,"column":24}},{"start":{"line":286,"column":14},"end":{"line":286,"column":17}}],"line":284},"54":{"loc":{"start":{"line":287,"column":10},"end":{"line":287,"column":69}},"type":"binary-expr","locations":[{"start":{"line":287,"column":10},"end":{"line":287,"column":23}},{"start":{"line":287,"column":27},"end":{"line":287,"column":69}}],"line":287}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":13,"7":13,"8":13,"9":1,"10":12,"11":12,"12":12,"13":1,"14":11,"15":11,"16":11,"17":11,"18":6,"19":6,"20":6,"21":6,"22":4,"23":4,"24":4,"25":2,"26":0,"27":0,"28":0,"29":2,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":2,"41":6,"42":2,"43":1,"44":1,"45":1,"46":1,"47":0,"48":1,"49":0,"50":1,"51":0,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":4,"59":4,"60":3,"61":1,"62":2,"63":1,"64":2,"65":2,"66":2,"67":2,"68":2,"69":2,"70":5,"71":5,"72":0,"73":5,"74":2,"75":3,"76":3,"77":3,"78":0,"79":3,"80":0,"81":3,"82":0,"83":3,"84":3,"85":3,"86":3,"87":3,"88":3,"89":1,"90":14,"91":14,"92":0,"93":14,"94":1,"95":13,"96":13,"97":13,"98":6,"99":0,"100":6,"101":1,"102":1,"103":0,"104":0,"105":1,"106":1,"107":1,"108":0,"109":1,"110":1},"f":{"0":13,"1":6,"2":14,"3":1,"4":1},"b":{"0":[1,12],"1":[13,5],"2":[12,11],"3":[1,11],"4":[12,7],"5":[11,3],"6":[6,5],"7":[6,0],"8":[6,6],"9":[4,2],"10":[6,5],"11":[0,2],"12":[2,1,1],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0,0],"19":[2,4],"20":[1,1],"21":[0,1],"22":[1,1],"23":[1,0],"24":[0,1],"25":[1,1],"26":[0,1],"27":[1,1],"28":[1,0],"29":[4,0],"30":[1,2],"31":[3,3],"32":[3,1],"33":[1,1],"34":[2,2],"35":[2,1],"36":[2,0],"37":[0,5],"38":[2,3],"39":[0,3],"40":[3,3],"41":[3,0],"42":[0,3],"43":[3,3],"44":[0,3],"45":[3,3],"46":[3,0],"47":[0,14],"48":[1,13],"49":[13,0],"50":[0,1],"51":[1,1],"52":[0,0],"53":[0,0],"54":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c881fa9d45d259a0e975d4c4a0c13ed629712e63"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\profitwell\\utils.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\profitwell\\utils.js","statementMap":{"0":{"start":{"line":1,"column":20},"end":{"line":1,"column":56}},"1":{"start":{"line":2,"column":41},"end":{"line":2,"column":62}},"2":{"start":{"line":4,"column":23},"end":{"line":165,"column":1}},"3":{"start":{"line":167,"column":31},"end":{"line":175,"column":1}},"4":{"start":{"line":168,"column":25},"end":{"line":171,"column":3}},"5":{"start":{"line":173,"column":14},"end":{"line":173,"column":53}},"6":{"start":{"line":174,"column":2},"end":{"line":174,"column":13}},"7":{"start":{"line":177,"column":29},"end":{"line":189,"column":1}},"8":{"start":{"line":178,"column":2},"end":{"line":180,"column":3}},"9":{"start":{"line":179,"column":4},"end":{"line":179,"column":46}},"10":{"start":{"line":181,"column":22},"end":{"line":181,"column":59}},"11":{"start":{"line":182,"column":2},"end":{"line":184,"column":3}},"12":{"start":{"line":183,"column":4},"end":{"line":183,"column":23}},"13":{"start":{"line":185,"column":2},"end":{"line":188,"column":4}},"14":{"start":{"line":191,"column":28},"end":{"line":193,"column":1}},"15":{"start":{"line":192,"column":2},"end":{"line":192,"column":61}},"16":{"start":{"line":195,"column":0},"end":{"line":199,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":167,"column":31},"end":{"line":167,"column":32}},"loc":{"start":{"line":167,"column":60},"end":{"line":175,"column":1}},"line":167},"1":{"name":"(anonymous_1)","decl":{"start":{"line":177,"column":29},"end":{"line":177,"column":30}},"loc":{"start":{"line":177,"column":63},"end":{"line":189,"column":1}},"line":177},"2":{"name":"(anonymous_2)","decl":{"start":{"line":191,"column":28},"end":{"line":191,"column":29}},"loc":{"start":{"line":191,"column":44},"end":{"line":193,"column":1}},"line":191}},"branchMap":{"0":{"loc":{"start":{"line":178,"column":2},"end":{"line":180,"column":3}},"type":"if","locations":[{"start":{"line":178,"column":2},"end":{"line":180,"column":3}},{"start":{"line":178,"column":2},"end":{"line":180,"column":3}}],"line":178},"1":{"loc":{"start":{"line":182,"column":2},"end":{"line":184,"column":3}},"type":"if","locations":[{"start":{"line":182,"column":2},"end":{"line":184,"column":3}},{"start":{"line":182,"column":2},"end":{"line":184,"column":3}}],"line":182}},"s":{"0":1,"1":1,"2":1,"3":1,"4":11,"5":11,"6":11,"7":1,"8":6,"9":3,"10":3,"11":3,"12":3,"13":0,"14":1,"15":4,"16":1},"f":{"0":11,"1":6,"2":4},"b":{"0":[3,3],"1":[3,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"948034530ee7cb42612b928dec05db03cde64f33"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\redis\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\redis\\transform.js","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":1,"column":27}},"1":{"start":{"line":2,"column":16},"end":{"line":2,"column":31}},"2":{"start":{"line":4,"column":43},"end":{"line":4,"column":64}},"3":{"start":{"line":5,"column":22},"end":{"line":5,"column":51}},"4":{"start":{"line":10,"column":22},"end":{"line":21,"column":1}},"5":{"start":{"line":11,"column":2},"end":{"line":20,"column":5}},"6":{"start":{"line":12,"column":4},"end":{"line":16,"column":5}},"7":{"start":{"line":14,"column":6},"end":{"line":14,"column":22}},"8":{"start":{"line":15,"column":6},"end":{"line":15,"column":13}},"9":{"start":{"line":17,"column":16},"end":{"line":17,"column":24}},"10":{"start":{"line":19,"column":4},"end":{"line":19,"column":70}},"11":{"start":{"line":23,"column":16},"end":{"line":71,"column":1}},"12":{"start":{"line":24,"column":35},"end":{"line":24,"column":40}},"13":{"start":{"line":25,"column":22},"end":{"line":25,"column":75}},"14":{"start":{"line":27,"column":2},"end":{"line":29,"column":3}},"15":{"start":{"line":28,"column":4},"end":{"line":28,"column":14}},"16":{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},"17":{"start":{"line":32,"column":4},"end":{"line":32,"column":72}},"18":{"start":{"line":35,"column":21},"end":{"line":35,"column":39}},"19":{"start":{"line":36,"column":20},"end":{"line":36,"column":62}},"20":{"start":{"line":38,"column":15},"end":{"line":41,"column":3}},"21":{"start":{"line":43,"column":2},"end":{"line":48,"column":3}},"22":{"start":{"line":44,"column":4},"end":{"line":47,"column":7}},"23":{"start":{"line":50,"column":2},"end":{"line":58,"column":3}},"24":{"start":{"line":51,"column":4},"end":{"line":57,"column":6}},"25":{"start":{"line":60,"column":2},"end":{"line":60,"column":29}},"26":{"start":{"line":62,"column":2},"end":{"line":64,"column":3}},"27":{"start":{"line":63,"column":4},"end":{"line":63,"column":79}},"28":{"start":{"line":66,"column":17},"end":{"line":69,"column":3}},"29":{"start":{"line":70,"column":2},"end":{"line":70,"column":16}},"30":{"start":{"line":73,"column":0},"end":{"line":73,"column":26}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":22},"end":{"line":10,"column":23}},"loc":{"start":{"line":10,"column":29},"end":{"line":21,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":11,"column":27},"end":{"line":11,"column":28}},"loc":{"start":{"line":11,"column":34},"end":{"line":20,"column":3}},"line":11},"2":{"name":"(anonymous_2)","decl":{"start":{"line":23,"column":16},"end":{"line":23,"column":17}},"loc":{"start":{"line":23,"column":25},"end":{"line":71,"column":1}},"line":23}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":4},"end":{"line":16,"column":5}},"type":"if","locations":[{"start":{"line":12,"column":4},"end":{"line":16,"column":5}},{"start":{"line":12,"column":4},"end":{"line":16,"column":5}}],"line":12},"1":{"loc":{"start":{"line":12,"column":8},"end":{"line":12,"column":47}},"type":"binary-expr","locations":[{"start":{"line":12,"column":8},"end":{"line":12,"column":25}},{"start":{"line":12,"column":29},"end":{"line":12,"column":47}}],"line":12},"2":{"loc":{"start":{"line":19,"column":15},"end":{"line":19,"column":69}},"type":"cond-expr","locations":[{"start":{"line":19,"column":32},"end":{"line":19,"column":51}},{"start":{"line":19,"column":54},"end":{"line":19,"column":69}}],"line":19},"3":{"loc":{"start":{"line":25,"column":22},"end":{"line":25,"column":75}},"type":"binary-expr","locations":[{"start":{"line":25,"column":22},"end":{"line":25,"column":29}},{"start":{"line":25,"column":33},"end":{"line":25,"column":45}},{"start":{"line":25,"column":49},"end":{"line":25,"column":75}}],"line":25},"4":{"loc":{"start":{"line":27,"column":2},"end":{"line":29,"column":3}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":29,"column":3}},{"start":{"line":27,"column":2},"end":{"line":29,"column":3}}],"line":27},"5":{"loc":{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},"type":"if","locations":[{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},{"start":{"line":31,"column":2},"end":{"line":33,"column":3}}],"line":31},"6":{"loc":{"start":{"line":36,"column":20},"end":{"line":36,"column":62}},"type":"cond-expr","locations":[{"start":{"line":36,"column":38},"end":{"line":36,"column":40}},{"start":{"line":36,"column":43},"end":{"line":36,"column":62}}],"line":36},"7":{"loc":{"start":{"line":43,"column":2},"end":{"line":48,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":48,"column":3}},{"start":{"line":43,"column":2},"end":{"line":48,"column":3}}],"line":43},"8":{"loc":{"start":{"line":43,"column":6},"end":{"line":43,"column":67}},"type":"binary-expr","locations":[{"start":{"line":43,"column":6},"end":{"line":43,"column":31}},{"start":{"line":43,"column":35},"end":{"line":43,"column":67}}],"line":43},"9":{"loc":{"start":{"line":50,"column":2},"end":{"line":58,"column":3}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":58,"column":3}},{"start":{"line":50,"column":2},"end":{"line":58,"column":3}}],"line":50},"10":{"loc":{"start":{"line":62,"column":2},"end":{"line":64,"column":3}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":64,"column":3}},{"start":{"line":62,"column":2},"end":{"line":64,"column":3}}],"line":62}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":5,"6":49,"7":4,"8":4,"9":45,"10":45,"11":1,"12":5,"13":5,"14":5,"15":0,"16":5,"17":0,"18":5,"19":5,"20":5,"21":5,"22":5,"23":5,"24":2,"25":5,"26":5,"27":1,"28":4,"29":4,"30":1},"f":{"0":5,"1":49,"2":5},"b":{"0":[4,45],"1":[49,49],"2":[4,41],"3":[5,5,5],"4":[0,5],"5":[0,5],"6":[1,4],"7":[5,0],"8":[5,5],"9":[2,3],"10":[1,4]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f234693a842979f553975bba9479ad83a3e1a056"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\rs\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\rs\\transform.js","statementMap":{"0":{"start":{"line":1,"column":36},"end":{"line":1,"column":65}},"1":{"start":{"line":4,"column":22},"end":{"line":4,"column":25}},"2":{"start":{"line":5,"column":17},"end":{"line":5,"column":21}},"3":{"start":{"line":8,"column":2},"end":{"line":8,"column":51}},"4":{"start":{"line":12,"column":2},"end":{"line":17,"column":3}},"5":{"start":{"line":13,"column":27},"end":{"line":13,"column":73}},"6":{"start":{"line":14,"column":4},"end":{"line":16,"column":5}},"7":{"start":{"line":15,"column":6},"end":{"line":15,"column":20}},"8":{"start":{"line":18,"column":2},"end":{"line":18,"column":18}},"9":{"start":{"line":22,"column":26},"end":{"line":22,"column":69}},"10":{"start":{"line":23,"column":23},"end":{"line":23,"column":71}},"11":{"start":{"line":25,"column":4},"end":{"line":25,"column":54}},"12":{"start":{"line":26,"column":19},"end":{"line":26,"column":27}},"13":{"start":{"line":27,"column":2},"end":{"line":35,"column":5}},"14":{"start":{"line":38,"column":0},"end":{"line":41,"column":2}}},"fnMap":{"0":{"name":"processSingleMessage","decl":{"start":{"line":7,"column":9},"end":{"line":7,"column":29}},"loc":{"start":{"line":7,"column":48},"end":{"line":9,"column":1}},"line":7},"1":{"name":"getDataTypeOverride","decl":{"start":{"line":11,"column":9},"end":{"line":11,"column":28}},"loc":{"start":{"line":11,"column":48},"end":{"line":19,"column":1}},"line":11},"2":{"name":"process","decl":{"start":{"line":21,"column":9},"end":{"line":21,"column":16}},"loc":{"start":{"line":21,"column":24},"end":{"line":36,"column":1}},"line":21}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":2},"end":{"line":17,"column":3}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":17,"column":3}},{"start":{"line":12,"column":2},"end":{"line":17,"column":3}}],"line":12},"1":{"loc":{"start":{"line":12,"column":6},"end":{"line":12,"column":51}},"type":"binary-expr","locations":[{"start":{"line":12,"column":6},"end":{"line":12,"column":44}},{"start":{"line":12,"column":48},"end":{"line":12,"column":51}}],"line":12},"2":{"loc":{"start":{"line":13,"column":27},"end":{"line":13,"column":73}},"type":"cond-expr","locations":[{"start":{"line":13,"column":48},"end":{"line":13,"column":67}},{"start":{"line":13,"column":70},"end":{"line":13,"column":73}}],"line":13},"3":{"loc":{"start":{"line":14,"column":4},"end":{"line":16,"column":5}},"type":"if","locations":[{"start":{"line":14,"column":4},"end":{"line":16,"column":5}},{"start":{"line":14,"column":4},"end":{"line":16,"column":5}}],"line":14},"4":{"loc":{"start":{"line":22,"column":26},"end":{"line":22,"column":69}},"type":"binary-expr","locations":[{"start":{"line":22,"column":26},"end":{"line":22,"column":61}},{"start":{"line":22,"column":65},"end":{"line":22,"column":69}}],"line":22},"5":{"loc":{"start":{"line":25,"column":4},"end":{"line":25,"column":54}},"type":"binary-expr","locations":[{"start":{"line":25,"column":4},"end":{"line":25,"column":43}},{"start":{"line":25,"column":47},"end":{"line":25,"column":54}}],"line":25},"6":{"loc":{"start":{"line":34,"column":20},"end":{"line":34,"column":73}},"type":"cond-expr","locations":[{"start":{"line":34,"column":37},"end":{"line":34,"column":66}},{"start":{"line":34,"column":69},"end":{"line":34,"column":73}}],"line":34}},"s":{"0":3,"1":3,"2":3,"3":124,"4":2917,"5":0,"6":0,"7":0,"8":2917,"9":124,"10":124,"11":124,"12":124,"13":124,"14":3},"f":{"0":124,"1":2917,"2":124},"b":{"0":[0,2917],"1":[2917,0],"2":[0,0],"3":[0,0],"4":[124,0],"5":[124,124],"6":[6,118]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3450c2c38c3baa57ca0ee0178f4e7c069c8130be"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\s3\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\s3\\transform.js","statementMap":{"0":{"start":{"line":2,"column":2},"end":{"line":2,"column":23}},"1":{"start":{"line":5,"column":0},"end":{"line":5,"column":26}}},"fnMap":{"0":{"name":"process","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":16}},"loc":{"start":{"line":1,"column":24},"end":{"line":3,"column":1}},"line":1}},"branchMap":{},"s":{"0":2,"1":1},"f":{"0":2},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"9380eeeeea9bf14e21ad3b09721f42bf5e9f7464"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\s3_datalake\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\s3_datalake\\transform.js","statementMap":{"0":{"start":{"line":1,"column":36},"end":{"line":1,"column":65}},"1":{"start":{"line":4,"column":27},"end":{"line":4,"column":40}},"2":{"start":{"line":7,"column":2},"end":{"line":7,"column":51}},"3":{"start":{"line":13,"column":26},"end":{"line":13,"column":69}},"4":{"start":{"line":14,"column":23},"end":{"line":14,"column":71}},"5":{"start":{"line":15,"column":19},"end":{"line":15,"column":37}},"6":{"start":{"line":16,"column":2},"end":{"line":23,"column":5}},"7":{"start":{"line":26,"column":0},"end":{"line":29,"column":2}}},"fnMap":{"0":{"name":"processSingleMessage","decl":{"start":{"line":6,"column":9},"end":{"line":6,"column":29}},"loc":{"start":{"line":6,"column":48},"end":{"line":8,"column":1}},"line":6},"1":{"name":"getDataTypeOverride","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":28}},"loc":{"start":{"line":10,"column":48},"end":{"line":10,"column":50}},"line":10},"2":{"name":"process","decl":{"start":{"line":12,"column":9},"end":{"line":12,"column":16}},"loc":{"start":{"line":12,"column":24},"end":{"line":24,"column":1}},"line":12}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":26},"end":{"line":13,"column":69}},"type":"binary-expr","locations":[{"start":{"line":13,"column":26},"end":{"line":13,"column":61}},{"start":{"line":13,"column":65},"end":{"line":13,"column":69}}],"line":13},"1":{"loc":{"start":{"line":22,"column":20},"end":{"line":22,"column":73}},"type":"cond-expr","locations":[{"start":{"line":22,"column":37},"end":{"line":22,"column":66}},{"start":{"line":22,"column":69},"end":{"line":22,"column":73}}],"line":22}},"s":{"0":3,"1":3,"2":123,"3":123,"4":123,"5":123,"6":123,"7":3},"f":{"0":123,"1":2895,"2":123},"b":{"0":[123,0],"1":[6,117]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a140b1950842d0a2f8566e4c7f4151165ed43281"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\salesforce\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\salesforce\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":23},"end":{"line":10,"column":1}},"2":{"start":{"line":12,"column":23},"end":{"line":12,"column":29}},"3":{"start":{"line":14,"column":2},"end":{"line":14,"column":54}},"4":{"start":{"line":16,"column":2},"end":{"line":16,"column":53}},"5":{"start":{"line":18,"column":22},"end":{"line":18,"column":65}},"6":{"start":{"line":20,"column":0},"end":{"line":26,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8936f9220b6f55d4c21c9c396c1bbf91b3dc4a42"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\salesforce\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\salesforce\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":14},"end":{"line":2,"column":30}},"2":{"start":{"line":3,"column":46},"end":{"line":3,"column":75}},"3":{"start":{"line":10,"column":4},"end":{"line":10,"column":23}},"4":{"start":{"line":22,"column":4},"end":{"line":22,"column":25}},"5":{"start":{"line":23,"column":15},"end":{"line":23,"column":41}},"6":{"start":{"line":30,"column":2},"end":{"line":34,"column":3}},"7":{"start":{"line":31,"column":4},"end":{"line":31,"column":48}},"8":{"start":{"line":33,"column":4},"end":{"line":33,"column":40}},"9":{"start":{"line":35,"column":18},"end":{"line":41,"column":75}},"10":{"start":{"line":43,"column":2},"end":{"line":51,"column":3}},"11":{"start":{"line":44,"column":4},"end":{"line":44,"column":45}},"12":{"start":{"line":46,"column":4},"end":{"line":46,"column":24}},"13":{"start":{"line":47,"column":4},"end":{"line":50,"column":6}},"14":{"start":{"line":53,"column":2},"end":{"line":56,"column":4}},"15":{"start":{"line":70,"column":43},"end":{"line":70,"column":56}},"16":{"start":{"line":74,"column":23},"end":{"line":74,"column":117}},"17":{"start":{"line":75,"column":2},"end":{"line":77,"column":3}},"18":{"start":{"line":76,"column":4},"end":{"line":76,"column":59}},"19":{"start":{"line":81,"column":19},"end":{"line":81,"column":25}},"20":{"start":{"line":84,"column":2},"end":{"line":97,"column":3}},"21":{"start":{"line":88,"column":4},"end":{"line":91,"column":6}},"22":{"start":{"line":92,"column":4},"end":{"line":96,"column":7}},"23":{"start":{"line":93,"column":6},"end":{"line":95,"column":7}},"24":{"start":{"line":94,"column":8},"end":{"line":94,"column":46}},"25":{"start":{"line":99,"column":19},"end":{"line":99,"column":41}},"26":{"start":{"line":100,"column":17},"end":{"line":103,"column":3}},"27":{"start":{"line":104,"column":2},"end":{"line":104,"column":59}},"28":{"start":{"line":105,"column":2},"end":{"line":105,"column":28}},"29":{"start":{"line":106,"column":2},"end":{"line":106,"column":57}},"30":{"start":{"line":107,"column":2},"end":{"line":107,"column":37}},"31":{"start":{"line":109,"column":2},"end":{"line":109,"column":18}},"32":{"start":{"line":118,"column":23},"end":{"line":118,"column":199}},"33":{"start":{"line":120,"column":28},"end":{"line":122,"column":4}},"34":{"start":{"line":124,"column":2},"end":{"line":124,"column":59}},"35":{"start":{"line":149,"column":25},"end":{"line":149,"column":27}},"36":{"start":{"line":152,"column":22},"end":{"line":152,"column":56}},"37":{"start":{"line":153,"column":30},"end":{"line":153,"column":66}},"38":{"start":{"line":156,"column":2},"end":{"line":166,"column":3}},"39":{"start":{"line":157,"column":4},"end":{"line":165,"column":7}},"40":{"start":{"line":158,"column":27},"end":{"line":158,"column":35}},"41":{"start":{"line":159,"column":6},"end":{"line":164,"column":7}},"42":{"start":{"line":160,"column":8},"end":{"line":163,"column":11}},"43":{"start":{"line":169,"column":2},"end":{"line":201,"column":3}},"44":{"start":{"line":170,"column":41},"end":{"line":170,"column":77}},"45":{"start":{"line":172,"column":4},"end":{"line":182,"column":5}},"46":{"start":{"line":178,"column":6},"end":{"line":181,"column":8}},"47":{"start":{"line":184,"column":23},"end":{"line":184,"column":68}},"48":{"start":{"line":185,"column":23},"end":{"line":185,"column":25}},"49":{"start":{"line":188,"column":4},"end":{"line":195,"column":5}},"50":{"start":{"line":189,"column":6},"end":{"line":194,"column":8}},"51":{"start":{"line":197,"column":4},"end":{"line":200,"column":7}},"52":{"start":{"line":205,"column":2},"end":{"line":261,"column":3}},"53":{"start":{"line":209,"column":18},"end":{"line":209,"column":60}},"54":{"start":{"line":211,"column":4},"end":{"line":213,"column":5}},"55":{"start":{"line":212,"column":6},"end":{"line":212,"column":73}},"56":{"start":{"line":215,"column":25},"end":{"line":215,"column":193}},"57":{"start":{"line":219,"column":4},"end":{"line":228,"column":5}},"58":{"start":{"line":220,"column":6},"end":{"line":222,"column":9}},"59":{"start":{"line":224,"column":6},"end":{"line":227,"column":8}},"60":{"start":{"line":230,"column":4},"end":{"line":260,"column":5}},"61":{"start":{"line":236,"column":21},"end":{"line":236,"column":60}},"62":{"start":{"line":237,"column":6},"end":{"line":243,"column":7}},"63":{"start":{"line":238,"column":8},"end":{"line":242,"column":9}},"64":{"start":{"line":239,"column":10},"end":{"line":239,"column":70}},"65":{"start":{"line":241,"column":10},"end":{"line":241,"column":67}},"66":{"start":{"line":244,"column":6},"end":{"line":254,"column":7}},"67":{"start":{"line":245,"column":8},"end":{"line":248,"column":11}},"68":{"start":{"line":250,"column":8},"end":{"line":253,"column":11}},"69":{"start":{"line":256,"column":6},"end":{"line":259,"column":9}},"70":{"start":{"line":262,"column":2},"end":{"line":262,"column":24}},"71":{"start":{"line":268,"column":4},"end":{"line":270,"column":38}},"72":{"start":{"line":272,"column":17},"end":{"line":272,"column":60}},"73":{"start":{"line":273,"column":2},"end":{"line":275,"column":3}},"74":{"start":{"line":274,"column":4},"end":{"line":274,"column":72}},"75":{"start":{"line":279,"column":30},"end":{"line":279,"column":66}},"76":{"start":{"line":280,"column":25},"end":{"line":280,"column":66}},"77":{"start":{"line":281,"column":2},"end":{"line":287,"column":3}},"78":{"start":{"line":286,"column":4},"end":{"line":286,"column":35}},"79":{"start":{"line":290,"column":23},"end":{"line":290,"column":25}},"80":{"start":{"line":293,"column":25},"end":{"line":297,"column":3}},"81":{"start":{"line":300,"column":2},"end":{"line":311,"column":5}},"82":{"start":{"line":302,"column":4},"end":{"line":310,"column":6}},"83":{"start":{"line":313,"column":2},"end":{"line":313,"column":22}},"84":{"start":{"line":320,"column":2},"end":{"line":324,"column":3}},"85":{"start":{"line":321,"column":4},"end":{"line":321,"column":78}},"86":{"start":{"line":323,"column":4},"end":{"line":323,"column":80}},"87":{"start":{"line":325,"column":2},"end":{"line":325,"column":18}},"88":{"start":{"line":330,"column":28},"end":{"line":330,"column":66}},"89":{"start":{"line":331,"column":19},"end":{"line":335,"column":3}},"90":{"start":{"line":336,"column":2},"end":{"line":336,"column":18}},"91":{"start":{"line":339,"column":26},"end":{"line":398,"column":1}},"92":{"start":{"line":340,"column":2},"end":{"line":343,"column":3}},"93":{"start":{"line":341,"column":23},"end":{"line":341,"column":75}},"94":{"start":{"line":342,"column":4},"end":{"line":342,"column":24}},"95":{"start":{"line":346,"column":2},"end":{"line":355,"column":3}},"96":{"start":{"line":347,"column":4},"end":{"line":347,"column":67}},"97":{"start":{"line":349,"column":23},"end":{"line":353,"column":5}},"98":{"start":{"line":350,"column":26},"end":{"line":350,"column":40}},"99":{"start":{"line":354,"column":4},"end":{"line":354,"column":24}},"100":{"start":{"line":357,"column":2},"end":{"line":364,"column":3}},"101":{"start":{"line":358,"column":23},"end":{"line":362,"column":5}},"102":{"start":{"line":359,"column":26},"end":{"line":359,"column":40}},"103":{"start":{"line":363,"column":4},"end":{"line":363,"column":24}},"104":{"start":{"line":366,"column":19},"end":{"line":396,"column":3}},"105":{"start":{"line":368,"column":6},"end":{"line":394,"column":7}},"106":{"start":{"line":369,"column":8},"end":{"line":376,"column":9}},"107":{"start":{"line":371,"column":10},"end":{"line":375,"column":12}},"108":{"start":{"line":379,"column":8},"end":{"line":387,"column":10}},"109":{"start":{"line":389,"column":8},"end":{"line":393,"column":10}},"110":{"start":{"line":397,"column":2},"end":{"line":397,"column":18}},"111":{"start":{"line":400,"column":0},"end":{"line":400,"column":48}}},"fnMap":{"0":{"name":"getSFDCHeader","decl":{"start":{"line":28,"column":15},"end":{"line":28,"column":28}},"loc":{"start":{"line":28,"column":42},"end":{"line":57,"column":1}},"line":28},"1":{"name":"responseBuilderSimple","decl":{"start":{"line":63,"column":9},"end":{"line":63,"column":30}},"loc":{"start":{"line":69,"column":2},"end":{"line":110,"column":1}},"line":69},"2":{"name":"(anonymous_2)","decl":{"start":{"line":92,"column":32},"end":{"line":92,"column":33}},"loc":{"start":{"line":92,"column":39},"end":{"line":96,"column":5}},"line":92},"3":{"name":"getSaleforceIdForRecord","decl":{"start":{"line":112,"column":15},"end":{"line":112,"column":38}},"loc":{"start":{"line":117,"column":2},"end":{"line":125,"column":1}},"line":117},"4":{"name":"getSalesforceIdFromPayload","decl":{"start":{"line":143,"column":15},"end":{"line":143,"column":41}},"loc":{"start":{"line":147,"column":2},"end":{"line":263,"column":1}},"line":147},"5":{"name":"(anonymous_5)","decl":{"start":{"line":157,"column":24},"end":{"line":157,"column":25}},"loc":{"start":{"line":157,"column":36},"end":{"line":165,"column":5}},"line":157},"6":{"name":"processIdentify","decl":{"start":{"line":266,"column":15},"end":{"line":266,"column":30}},"loc":{"start":{"line":266,"column":72},"end":{"line":314,"column":1}},"line":266},"7":{"name":"(anonymous_7)","decl":{"start":{"line":300,"column":25},"end":{"line":300,"column":26}},"loc":{"start":{"line":300,"column":42},"end":{"line":311,"column":3}},"line":300},"8":{"name":"processSingleMessage","decl":{"start":{"line":318,"column":15},"end":{"line":318,"column":35}},"loc":{"start":{"line":318,"column":77},"end":{"line":326,"column":1}},"line":318},"9":{"name":"process","decl":{"start":{"line":328,"column":15},"end":{"line":328,"column":22}},"loc":{"start":{"line":328,"column":30},"end":{"line":337,"column":1}},"line":328},"10":{"name":"(anonymous_10)","decl":{"start":{"line":339,"column":26},"end":{"line":339,"column":27}},"loc":{"start":{"line":339,"column":42},"end":{"line":398,"column":1}},"line":339},"11":{"name":"(anonymous_11)","decl":{"start":{"line":350,"column":17},"end":{"line":350,"column":18}},"loc":{"start":{"line":350,"column":26},"end":{"line":350,"column":40}},"line":350},"12":{"name":"(anonymous_12)","decl":{"start":{"line":359,"column":17},"end":{"line":359,"column":18}},"loc":{"start":{"line":359,"column":26},"end":{"line":359,"column":40}},"line":359},"13":{"name":"(anonymous_13)","decl":{"start":{"line":367,"column":15},"end":{"line":367,"column":16}},"loc":{"start":{"line":367,"column":30},"end":{"line":395,"column":5}},"line":367}},"branchMap":{"0":{"loc":{"start":{"line":30,"column":2},"end":{"line":34,"column":3}},"type":"if","locations":[{"start":{"line":30,"column":2},"end":{"line":34,"column":3}},{"start":{"line":30,"column":2},"end":{"line":34,"column":3}}],"line":30},"1":{"loc":{"start":{"line":49,"column":6},"end":{"line":49,"column":25}},"type":"binary-expr","locations":[{"start":{"line":49,"column":6},"end":{"line":49,"column":18}},{"start":{"line":49,"column":22},"end":{"line":49,"column":25}}],"line":49},"2":{"loc":{"start":{"line":75,"column":2},"end":{"line":77,"column":3}},"type":"if","locations":[{"start":{"line":75,"column":2},"end":{"line":77,"column":3}},{"start":{"line":75,"column":2},"end":{"line":77,"column":3}}],"line":75},"3":{"loc":{"start":{"line":84,"column":2},"end":{"line":97,"column":3}},"type":"if","locations":[{"start":{"line":84,"column":2},"end":{"line":97,"column":3}},{"start":{"line":84,"column":2},"end":{"line":97,"column":3}}],"line":84},"4":{"loc":{"start":{"line":84,"column":6},"end":{"line":84,"column":70}},"type":"binary-expr","locations":[{"start":{"line":84,"column":6},"end":{"line":84,"column":31}},{"start":{"line":84,"column":35},"end":{"line":84,"column":46}},{"start":{"line":84,"column":50},"end":{"line":84,"column":70}}],"line":84},"5":{"loc":{"start":{"line":93,"column":6},"end":{"line":95,"column":7}},"type":"if","locations":[{"start":{"line":93,"column":6},"end":{"line":95,"column":7}},{"start":{"line":93,"column":6},"end":{"line":95,"column":7}}],"line":93},"6":{"loc":{"start":{"line":93,"column":10},"end":{"line":93,"column":58}},"type":"binary-expr","locations":[{"start":{"line":93,"column":10},"end":{"line":93,"column":43}},{"start":{"line":93,"column":47},"end":{"line":93,"column":58}}],"line":93},"7":{"loc":{"start":{"line":156,"column":2},"end":{"line":166,"column":3}},"type":"if","locations":[{"start":{"line":156,"column":2},"end":{"line":166,"column":3}},{"start":{"line":156,"column":2},"end":{"line":166,"column":3}}],"line":156},"8":{"loc":{"start":{"line":156,"column":6},"end":{"line":156,"column":71}},"type":"binary-expr","locations":[{"start":{"line":156,"column":6},"end":{"line":156,"column":17}},{"start":{"line":156,"column":21},"end":{"line":156,"column":47}},{"start":{"line":156,"column":51},"end":{"line":156,"column":71}}],"line":156},"9":{"loc":{"start":{"line":159,"column":6},"end":{"line":164,"column":7}},"type":"if","locations":[{"start":{"line":159,"column":6},"end":{"line":164,"column":7}},{"start":{"line":159,"column":6},"end":{"line":164,"column":7}}],"line":159},"10":{"loc":{"start":{"line":169,"column":2},"end":{"line":201,"column":3}},"type":"if","locations":[{"start":{"line":169,"column":2},"end":{"line":201,"column":3}},{"start":{"line":169,"column":2},"end":{"line":201,"column":3}}],"line":169},"11":{"loc":{"start":{"line":172,"column":4},"end":{"line":182,"column":5}},"type":"if","locations":[{"start":{"line":172,"column":4},"end":{"line":182,"column":5}},{"start":{"line":172,"column":4},"end":{"line":182,"column":5}}],"line":172},"12":{"loc":{"start":{"line":173,"column":6},"end":{"line":176,"column":48}},"type":"binary-expr","locations":[{"start":{"line":173,"column":6},"end":{"line":173,"column":9}},{"start":{"line":174,"column":6},"end":{"line":174,"column":11}},{"start":{"line":175,"column":6},"end":{"line":175,"column":21}},{"start":{"line":176,"column":6},"end":{"line":176,"column":48}}],"line":173},"13":{"loc":{"start":{"line":188,"column":4},"end":{"line":195,"column":5}},"type":"if","locations":[{"start":{"line":188,"column":4},"end":{"line":195,"column":5}},{"start":{"line":188,"column":4},"end":{"line":195,"column":5}}],"line":188},"14":{"loc":{"start":{"line":205,"column":2},"end":{"line":261,"column":3}},"type":"if","locations":[{"start":{"line":205,"column":2},"end":{"line":261,"column":3}},{"start":{"line":205,"column":2},"end":{"line":261,"column":3}}],"line":205},"15":{"loc":{"start":{"line":205,"column":6},"end":{"line":205,"column":57}},"type":"binary-expr","locations":[{"start":{"line":205,"column":6},"end":{"line":205,"column":33}},{"start":{"line":205,"column":37},"end":{"line":205,"column":57}}],"line":205},"16":{"loc":{"start":{"line":211,"column":4},"end":{"line":213,"column":5}},"type":"if","locations":[{"start":{"line":211,"column":4},"end":{"line":213,"column":5}},{"start":{"line":211,"column":4},"end":{"line":213,"column":5}}],"line":211},"17":{"loc":{"start":{"line":225,"column":8},"end":{"line":225,"column":59}},"type":"binary-expr","locations":[{"start":{"line":225,"column":8},"end":{"line":225,"column":44}},{"start":{"line":225,"column":48},"end":{"line":225,"column":59}}],"line":225},"18":{"loc":{"start":{"line":226,"column":8},"end":{"line":226,"column":34}},"type":"binary-expr","locations":[{"start":{"line":226,"column":8},"end":{"line":226,"column":27}},{"start":{"line":226,"column":31},"end":{"line":226,"column":34}}],"line":226},"19":{"loc":{"start":{"line":230,"column":4},"end":{"line":260,"column":5}},"type":"if","locations":[{"start":{"line":230,"column":4},"end":{"line":260,"column":5}},{"start":{"line":230,"column":4},"end":{"line":260,"column":5}}],"line":230},"20":{"loc":{"start":{"line":231,"column":6},"end":{"line":232,"column":55}},"type":"binary-expr","locations":[{"start":{"line":231,"column":6},"end":{"line":231,"column":23}},{"start":{"line":232,"column":6},"end":{"line":232,"column":55}}],"line":231},"21":{"loc":{"start":{"line":237,"column":6},"end":{"line":243,"column":7}},"type":"if","locations":[{"start":{"line":237,"column":6},"end":{"line":243,"column":7}},{"start":{"line":237,"column":6},"end":{"line":243,"column":7}}],"line":237},"22":{"loc":{"start":{"line":238,"column":8},"end":{"line":242,"column":9}},"type":"if","locations":[{"start":{"line":238,"column":8},"end":{"line":242,"column":9}},{"start":{"line":238,"column":8},"end":{"line":242,"column":9}}],"line":238},"23":{"loc":{"start":{"line":244,"column":6},"end":{"line":254,"column":7}},"type":"if","locations":[{"start":{"line":244,"column":6},"end":{"line":254,"column":7}},{"start":{"line":244,"column":6},"end":{"line":254,"column":7}}],"line":244},"24":{"loc":{"start":{"line":244,"column":10},"end":{"line":244,"column":63}},"type":"binary-expr","locations":[{"start":{"line":244,"column":10},"end":{"line":244,"column":28}},{"start":{"line":244,"column":32},"end":{"line":244,"column":63}}],"line":244},"25":{"loc":{"start":{"line":268,"column":4},"end":{"line":270,"column":38}},"type":"cond-expr","locations":[{"start":{"line":269,"column":8},"end":{"line":269,"column":12}},{"start":{"line":270,"column":8},"end":{"line":270,"column":38}}],"line":268},"26":{"loc":{"start":{"line":273,"column":2},"end":{"line":275,"column":3}},"type":"if","locations":[{"start":{"line":273,"column":2},"end":{"line":275,"column":3}},{"start":{"line":273,"column":2},"end":{"line":275,"column":3}}],"line":273},"27":{"loc":{"start":{"line":281,"column":2},"end":{"line":287,"column":3}},"type":"if","locations":[{"start":{"line":281,"column":2},"end":{"line":287,"column":3}},{"start":{"line":281,"column":2},"end":{"line":287,"column":3}}],"line":281},"28":{"loc":{"start":{"line":282,"column":4},"end":{"line":284,"column":39}},"type":"binary-expr","locations":[{"start":{"line":282,"column":4},"end":{"line":282,"column":23}},{"start":{"line":283,"column":4},"end":{"line":283,"column":18}},{"start":{"line":284,"column":4},"end":{"line":284,"column":39}}],"line":282},"29":{"loc":{"start":{"line":320,"column":2},"end":{"line":324,"column":3}},"type":"if","locations":[{"start":{"line":320,"column":2},"end":{"line":324,"column":3}},{"start":{"line":320,"column":2},"end":{"line":324,"column":3}}],"line":320},"30":{"loc":{"start":{"line":340,"column":2},"end":{"line":343,"column":3}},"type":"if","locations":[{"start":{"line":340,"column":2},"end":{"line":343,"column":3}},{"start":{"line":340,"column":2},"end":{"line":343,"column":3}}],"line":340},"31":{"loc":{"start":{"line":340,"column":6},"end":{"line":340,"column":50}},"type":"binary-expr","locations":[{"start":{"line":340,"column":6},"end":{"line":340,"column":28}},{"start":{"line":340,"column":32},"end":{"line":340,"column":50}}],"line":340},"32":{"loc":{"start":{"line":357,"column":2},"end":{"line":364,"column":3}},"type":"if","locations":[{"start":{"line":357,"column":2},"end":{"line":364,"column":3}},{"start":{"line":357,"column":2},"end":{"line":364,"column":3}}],"line":357},"33":{"loc":{"start":{"line":369,"column":8},"end":{"line":376,"column":9}},"type":"if","locations":[{"start":{"line":369,"column":8},"end":{"line":376,"column":9}},{"start":{"line":369,"column":8},"end":{"line":376,"column":9}}],"line":369},"34":{"loc":{"start":{"line":391,"column":10},"end":{"line":391,"column":54}},"type":"cond-expr","locations":[{"start":{"line":391,"column":27},"end":{"line":391,"column":48}},{"start":{"line":391,"column":51},"end":{"line":391,"column":54}}],"line":391},"35":{"loc":{"start":{"line":392,"column":10},"end":{"line":392,"column":69}},"type":"binary-expr","locations":[{"start":{"line":392,"column":10},"end":{"line":392,"column":23}},{"start":{"line":392,"column":27},"end":{"line":392,"column":69}}],"line":392}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":10,"7":1,"8":9,"9":10,"10":10,"11":10,"12":0,"13":0,"14":10,"15":10,"16":10,"17":10,"18":2,"19":10,"20":10,"21":8,"22":8,"23":69,"24":2,"25":10,"26":10,"27":10,"28":10,"29":10,"30":10,"31":10,"32":0,"33":0,"34":0,"35":10,"36":10,"37":10,"38":10,"39":2,"40":2,"41":2,"42":2,"43":10,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":10,"53":8,"54":8,"55":0,"56":8,"57":8,"58":8,"59":0,"60":8,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":8,"70":10,"71":10,"72":10,"73":10,"74":0,"75":10,"76":10,"77":10,"78":0,"79":10,"80":10,"81":10,"82":10,"83":10,"84":11,"85":10,"86":1,"87":10,"88":9,"89":9,"90":8,"91":1,"92":1,"93":0,"94":0,"95":1,"96":1,"97":0,"98":0,"99":0,"100":1,"101":0,"102":0,"103":0,"104":1,"105":3,"106":3,"107":1,"108":2,"109":0,"110":1,"111":1},"f":{"0":10,"1":10,"2":69,"3":0,"4":10,"5":2,"6":10,"7":10,"8":11,"9":9,"10":1,"11":0,"12":0,"13":3},"b":{"0":[1,9],"1":[0,0],"2":[2,8],"3":[8,2],"4":[10,9,8],"5":[2,67],"6":[69,4],"7":[2,8],"8":[10,2,2],"9":[2,0],"10":[0,10],"11":[0,0],"12":[0,0,0,0],"13":[0,0],"14":[8,2],"15":[10,8],"16":[0,8],"17":[0,0],"18":[0,0],"19":[0,8],"20":[8,8],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0],"25":[9,1],"26":[0,10],"27":[0,10],"28":[10,0,0],"29":[10,1],"30":[0,1],"31":[1,1],"32":[0,1],"33":[1,2],"34":[0,0],"35":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bfe4fe608ff67c4e6909ba302fe157ca687739fc"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\segment\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\segment\\config.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":0},"end":{"line":5,"column":2}},"2":{"start":{"line":7,"column":0},"end":{"line":10,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8315bd31dc6274841dc6ca4c7ab74adf207f7f46"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\segment\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\segment\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":49},"end":{"line":2,"column":68}},"2":{"start":{"line":8,"column":4},"end":{"line":8,"column":25}},"3":{"start":{"line":11,"column":20},"end":{"line":13,"column":3}},"4":{"start":{"line":15,"column":19},"end":{"line":15,"column":41}},"5":{"start":{"line":16,"column":17},"end":{"line":19,"column":3}},"6":{"start":{"line":20,"column":2},"end":{"line":20,"column":59}},"7":{"start":{"line":21,"column":2},"end":{"line":21,"column":28}},"8":{"start":{"line":22,"column":2},"end":{"line":22,"column":61}},"9":{"start":{"line":23,"column":2},"end":{"line":23,"column":36}},"10":{"start":{"line":24,"column":2},"end":{"line":24,"column":41}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":28}},"12":{"start":{"line":27,"column":2},"end":{"line":27,"column":18}},"13":{"start":{"line":31,"column":32},"end":{"line":31,"column":39}},"14":{"start":{"line":32,"column":21},"end":{"line":32,"column":34}},"15":{"start":{"line":33,"column":17},"end":{"line":33,"column":60}},"16":{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},"17":{"start":{"line":35,"column":4},"end":{"line":35,"column":30}},"18":{"start":{"line":37,"column":21},"end":{"line":39,"column":15}},"19":{"start":{"line":40,"column":16},"end":{"line":40,"column":65}},"20":{"start":{"line":41,"column":20},"end":{"line":41,"column":66}},"21":{"start":{"line":43,"column":2},"end":{"line":51,"column":5}},"22":{"start":{"line":55,"column":24},"end":{"line":55,"column":26}},"23":{"start":{"line":56,"column":21},"end":{"line":56,"column":52}},"24":{"start":{"line":57,"column":2},"end":{"line":65,"column":5}},"25":{"start":{"line":58,"column":4},"end":{"line":64,"column":5}},"26":{"start":{"line":60,"column":8},"end":{"line":60,"column":62}},"27":{"start":{"line":61,"column":8},"end":{"line":61,"column":14}},"28":{"start":{"line":63,"column":8},"end":{"line":63,"column":14}},"29":{"start":{"line":67,"column":2},"end":{"line":67,"column":69}},"30":{"start":{"line":68,"column":2},"end":{"line":68,"column":23}},"31":{"start":{"line":72,"column":24},"end":{"line":72,"column":62}},"32":{"start":{"line":73,"column":21},"end":{"line":73,"column":63}},"33":{"start":{"line":74,"column":18},"end":{"line":76,"column":3}},"34":{"start":{"line":77,"column":2},"end":{"line":77,"column":33}},"35":{"start":{"line":78,"column":2},"end":{"line":78,"column":55}},"36":{"start":{"line":82,"column":2},"end":{"line":82,"column":64}},"37":{"start":{"line":85,"column":0},"end":{"line":85,"column":26}}},"fnMap":{"0":{"name":"responseBuilderSimple","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":30}},"loc":{"start":{"line":10,"column":55},"end":{"line":28,"column":1}},"line":10},"1":{"name":"getTransformedJSON","decl":{"start":{"line":30,"column":9},"end":{"line":30,"column":27}},"loc":{"start":{"line":30,"column":52},"end":{"line":52,"column":1}},"line":30},"2":{"name":"getSegmentConfig","decl":{"start":{"line":54,"column":9},"end":{"line":54,"column":25}},"loc":{"start":{"line":54,"column":48},"end":{"line":69,"column":1}},"line":54},"3":{"name":"(anonymous_3)","decl":{"start":{"line":57,"column":21},"end":{"line":57,"column":22}},"loc":{"start":{"line":57,"column":28},"end":{"line":65,"column":3}},"line":57},"4":{"name":"processSingleMessage","decl":{"start":{"line":71,"column":9},"end":{"line":71,"column":29}},"loc":{"start":{"line":71,"column":52},"end":{"line":79,"column":1}},"line":71},"5":{"name":"process","decl":{"start":{"line":81,"column":9},"end":{"line":81,"column":16}},"loc":{"start":{"line":81,"column":24},"end":{"line":83,"column":1}},"line":81}},"branchMap":{"0":{"loc":{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},{"start":{"line":34,"column":2},"end":{"line":36,"column":3}}],"line":34},"1":{"loc":{"start":{"line":34,"column":6},"end":{"line":34,"column":34}},"type":"binary-expr","locations":[{"start":{"line":34,"column":6},"end":{"line":34,"column":12}},{"start":{"line":34,"column":16},"end":{"line":34,"column":34}}],"line":34},"2":{"loc":{"start":{"line":37,"column":21},"end":{"line":39,"column":15}},"type":"cond-expr","locations":[{"start":{"line":38,"column":6},"end":{"line":38,"column":24}},{"start":{"line":39,"column":6},"end":{"line":39,"column":15}}],"line":37},"3":{"loc":{"start":{"line":40,"column":16},"end":{"line":40,"column":65}},"type":"cond-expr","locations":[{"start":{"line":40,"column":40},"end":{"line":40,"column":53}},{"start":{"line":40,"column":56},"end":{"line":40,"column":65}}],"line":40},"4":{"loc":{"start":{"line":58,"column":4},"end":{"line":64,"column":5}},"type":"switch","locations":[{"start":{"line":59,"column":6},"end":{"line":61,"column":14}},{"start":{"line":62,"column":6},"end":{"line":63,"column":14}}],"line":58}},"s":{"0":1,"1":1,"2":1,"3":5,"4":5,"5":5,"6":5,"7":5,"8":5,"9":5,"10":5,"11":5,"12":5,"13":5,"14":5,"15":5,"16":5,"17":0,"18":5,"19":5,"20":5,"21":5,"22":5,"23":5,"24":5,"25":5,"26":5,"27":5,"28":0,"29":5,"30":5,"31":5,"32":5,"33":5,"34":5,"35":5,"36":5,"37":1},"f":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":5},"b":{"0":[0,5],"1":[5,4],"2":[4,1],"3":[2,3],"4":[5,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a35fa97f5370795e15889c4780045acab22cb21a"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\sendgrid\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\sendgrid\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":56}},"2":{"start":{"line":4,"column":24},"end":{"line":4,"column":25}},"3":{"start":{"line":5,"column":24},"end":{"line":5,"column":26}},"4":{"start":{"line":7,"column":26},"end":{"line":9,"column":1}},"5":{"start":{"line":11,"column":23},"end":{"line":11,"column":69}},"6":{"start":{"line":13,"column":31},"end":{"line":30,"column":1}},"7":{"start":{"line":32,"column":0},"end":{"line":38,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d975c75040ca3d028661bdf6ef03286ddbbd6fb2"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\sendgrid\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\sendgrid\\transform.js","statementMap":{"0":{"start":{"line":2,"column":22},"end":{"line":2,"column":51}},"1":{"start":{"line":14,"column":4},"end":{"line":14,"column":25}},"2":{"start":{"line":21,"column":4},"end":{"line":21,"column":23}},"3":{"start":{"line":30,"column":4},"end":{"line":30,"column":21}},"4":{"start":{"line":32,"column":29},"end":{"line":108,"column":1}},"5":{"start":{"line":33,"column":14},"end":{"line":33,"column":51}},"6":{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},"7":{"start":{"line":35,"column":4},"end":{"line":35,"column":67}},"8":{"start":{"line":37,"column":2},"end":{"line":37,"column":37}},"9":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"10":{"start":{"line":39,"column":4},"end":{"line":39,"column":68}},"11":{"start":{"line":41,"column":16},"end":{"line":41,"column":18}},"12":{"start":{"line":42,"column":2},"end":{"line":42,"column":52}},"13":{"start":{"line":43,"column":2},"end":{"line":59,"column":3}},"14":{"start":{"line":44,"column":4},"end":{"line":58,"column":5}},"15":{"start":{"line":46,"column":20},"end":{"line":49,"column":8}},"16":{"start":{"line":50,"column":6},"end":{"line":57,"column":7}},"17":{"start":{"line":51,"column":8},"end":{"line":51,"column":64}},"18":{"start":{"line":53,"column":8},"end":{"line":56,"column":10}},"19":{"start":{"line":60,"column":2},"end":{"line":60,"column":55}},"20":{"start":{"line":61,"column":2},"end":{"line":61,"column":34}},"21":{"start":{"line":62,"column":2},"end":{"line":62,"column":19}},"22":{"start":{"line":63,"column":2},"end":{"line":69,"column":3}},"23":{"start":{"line":68,"column":4},"end":{"line":68,"column":48}},"24":{"start":{"line":70,"column":26},"end":{"line":70,"column":44}},"25":{"start":{"line":71,"column":2},"end":{"line":72,"column":56}},"26":{"start":{"line":74,"column":2},"end":{"line":80,"column":3}},"27":{"start":{"line":79,"column":4},"end":{"line":79,"column":45}},"28":{"start":{"line":81,"column":2},"end":{"line":81,"column":68}},"29":{"start":{"line":82,"column":2},"end":{"line":82,"column":58}},"30":{"start":{"line":83,"column":2},"end":{"line":83,"column":57}},"31":{"start":{"line":84,"column":2},"end":{"line":84,"column":49}},"32":{"start":{"line":85,"column":2},"end":{"line":96,"column":3}},"33":{"start":{"line":86,"column":23},"end":{"line":86,"column":25}},"34":{"start":{"line":87,"column":4},"end":{"line":92,"column":6}},"35":{"start":{"line":93,"column":4},"end":{"line":95,"column":5}},"36":{"start":{"line":94,"column":6},"end":{"line":94,"column":41}},"37":{"start":{"line":97,"column":2},"end":{"line":97,"column":38}},"38":{"start":{"line":98,"column":2},"end":{"line":98,"column":50}},"39":{"start":{"line":99,"column":19},"end":{"line":99,"column":41}},"40":{"start":{"line":100,"column":2},"end":{"line":103,"column":4}},"41":{"start":{"line":104,"column":2},"end":{"line":104,"column":59}},"42":{"start":{"line":105,"column":2},"end":{"line":105,"column":31}},"43":{"start":{"line":106,"column":2},"end":{"line":106,"column":61}},"44":{"start":{"line":107,"column":2},"end":{"line":107,"column":18}},"45":{"start":{"line":109,"column":16},"end":{"line":132,"column":1}},"46":{"start":{"line":110,"column":35},"end":{"line":110,"column":40}},"47":{"start":{"line":111,"column":2},"end":{"line":116,"column":3}},"48":{"start":{"line":112,"column":4},"end":{"line":115,"column":6}},"49":{"start":{"line":118,"column":2},"end":{"line":120,"column":3}},"50":{"start":{"line":119,"column":4},"end":{"line":119,"column":50}},"51":{"start":{"line":121,"column":22},"end":{"line":121,"column":48}},"52":{"start":{"line":124,"column":2},"end":{"line":130,"column":3}},"53":{"start":{"line":126,"column":6},"end":{"line":126,"column":60}},"54":{"start":{"line":127,"column":6},"end":{"line":127,"column":12}},"55":{"start":{"line":129,"column":6},"end":{"line":129,"column":78}},"56":{"start":{"line":131,"column":2},"end":{"line":131,"column":18}},"57":{"start":{"line":134,"column":26},"end":{"line":162,"column":1}},"58":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"59":{"start":{"line":136,"column":23},"end":{"line":136,"column":75}},"60":{"start":{"line":137,"column":4},"end":{"line":137,"column":24}},"61":{"start":{"line":140,"column":19},"end":{"line":160,"column":3}},"62":{"start":{"line":142,"column":6},"end":{"line":158,"column":7}},"63":{"start":{"line":143,"column":8},"end":{"line":147,"column":10}},"64":{"start":{"line":149,"column":8},"end":{"line":157,"column":10}},"65":{"start":{"line":161,"column":2},"end":{"line":161,"column":18}},"66":{"start":{"line":164,"column":0},"end":{"line":164,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":32,"column":29},"end":{"line":32,"column":30}},"loc":{"start":{"line":32,"column":54},"end":{"line":108,"column":1}},"line":32},"1":{"name":"(anonymous_1)","decl":{"start":{"line":109,"column":16},"end":{"line":109,"column":17}},"loc":{"start":{"line":109,"column":25},"end":{"line":132,"column":1}},"line":109},"2":{"name":"(anonymous_2)","decl":{"start":{"line":134,"column":26},"end":{"line":134,"column":27}},"loc":{"start":{"line":134,"column":42},"end":{"line":162,"column":1}},"line":134},"3":{"name":"(anonymous_3)","decl":{"start":{"line":141,"column":15},"end":{"line":141,"column":16}},"loc":{"start":{"line":141,"column":30},"end":{"line":159,"column":5}},"line":141}},"branchMap":{"0":{"loc":{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":36,"column":3}},{"start":{"line":34,"column":2},"end":{"line":36,"column":3}}],"line":34},"1":{"loc":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},{"start":{"line":38,"column":2},"end":{"line":40,"column":3}}],"line":38},"2":{"loc":{"start":{"line":43,"column":2},"end":{"line":59,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":59,"column":3}},{"start":{"line":43,"column":2},"end":{"line":59,"column":3}}],"line":43},"3":{"loc":{"start":{"line":44,"column":4},"end":{"line":58,"column":5}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":58,"column":5}},{"start":{"line":44,"column":4},"end":{"line":58,"column":5}}],"line":44},"4":{"loc":{"start":{"line":50,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":50,"column":6},"end":{"line":57,"column":7}},{"start":{"line":50,"column":6},"end":{"line":57,"column":7}}],"line":50},"5":{"loc":{"start":{"line":63,"column":2},"end":{"line":69,"column":3}},"type":"if","locations":[{"start":{"line":63,"column":2},"end":{"line":69,"column":3}},{"start":{"line":63,"column":2},"end":{"line":69,"column":3}}],"line":63},"6":{"loc":{"start":{"line":64,"column":4},"end":{"line":66,"column":42}},"type":"binary-expr","locations":[{"start":{"line":64,"column":4},"end":{"line":64,"column":16}},{"start":{"line":65,"column":4},"end":{"line":65,"column":39}},{"start":{"line":66,"column":4},"end":{"line":66,"column":42}}],"line":64},"7":{"loc":{"start":{"line":72,"column":4},"end":{"line":72,"column":55}},"type":"cond-expr","locations":[{"start":{"line":72,"column":33},"end":{"line":72,"column":48}},{"start":{"line":72,"column":51},"end":{"line":72,"column":55}}],"line":72},"8":{"loc":{"start":{"line":74,"column":2},"end":{"line":80,"column":3}},"type":"if","locations":[{"start":{"line":74,"column":2},"end":{"line":80,"column":3}},{"start":{"line":74,"column":2},"end":{"line":80,"column":3}}],"line":74},"9":{"loc":{"start":{"line":75,"column":4},"end":{"line":77,"column":47}},"type":"binary-expr","locations":[{"start":{"line":75,"column":4},"end":{"line":75,"column":21}},{"start":{"line":76,"column":4},"end":{"line":76,"column":47}},{"start":{"line":77,"column":4},"end":{"line":77,"column":47}}],"line":75},"10":{"loc":{"start":{"line":85,"column":2},"end":{"line":96,"column":3}},"type":"if","locations":[{"start":{"line":85,"column":2},"end":{"line":96,"column":3}},{"start":{"line":85,"column":2},"end":{"line":96,"column":3}}],"line":85},"11":{"loc":{"start":{"line":93,"column":4},"end":{"line":95,"column":5}},"type":"if","locations":[{"start":{"line":93,"column":4},"end":{"line":95,"column":5}},{"start":{"line":93,"column":4},"end":{"line":95,"column":5}}],"line":93},"12":{"loc":{"start":{"line":111,"column":2},"end":{"line":116,"column":3}},"type":"if","locations":[{"start":{"line":111,"column":2},"end":{"line":116,"column":3}},{"start":{"line":111,"column":2},"end":{"line":116,"column":3}}],"line":111},"13":{"loc":{"start":{"line":118,"column":2},"end":{"line":120,"column":3}},"type":"if","locations":[{"start":{"line":118,"column":2},"end":{"line":120,"column":3}},{"start":{"line":118,"column":2},"end":{"line":120,"column":3}}],"line":118},"14":{"loc":{"start":{"line":124,"column":2},"end":{"line":130,"column":3}},"type":"switch","locations":[{"start":{"line":125,"column":4},"end":{"line":127,"column":12}},{"start":{"line":128,"column":4},"end":{"line":129,"column":78}}],"line":124},"15":{"loc":{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":138,"column":3}},{"start":{"line":135,"column":2},"end":{"line":138,"column":3}}],"line":135},"16":{"loc":{"start":{"line":135,"column":6},"end":{"line":135,"column":50}},"type":"binary-expr","locations":[{"start":{"line":135,"column":6},"end":{"line":135,"column":28}},{"start":{"line":135,"column":32},"end":{"line":135,"column":50}}],"line":135},"17":{"loc":{"start":{"line":151,"column":10},"end":{"line":155,"column":17}},"type":"cond-expr","locations":[{"start":{"line":152,"column":14},"end":{"line":152,"column":35}},{"start":{"line":153,"column":14},"end":{"line":155,"column":17}}],"line":151},"18":{"loc":{"start":{"line":153,"column":14},"end":{"line":155,"column":17}},"type":"cond-expr","locations":[{"start":{"line":154,"column":14},"end":{"line":154,"column":24}},{"start":{"line":155,"column":14},"end":{"line":155,"column":17}}],"line":153},"19":{"loc":{"start":{"line":156,"column":10},"end":{"line":156,"column":69}},"type":"binary-expr","locations":[{"start":{"line":156,"column":10},"end":{"line":156,"column":23}},{"start":{"line":156,"column":27},"end":{"line":156,"column":69}}],"line":156}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":8,"6":8,"7":0,"8":8,"9":8,"10":1,"11":7,"12":7,"13":7,"14":0,"15":0,"16":0,"17":0,"18":0,"19":7,"20":7,"21":7,"22":7,"23":4,"24":7,"25":7,"26":7,"27":0,"28":7,"29":7,"30":7,"31":7,"32":7,"33":7,"34":7,"35":7,"36":0,"37":7,"38":7,"39":7,"40":7,"41":7,"42":7,"43":7,"44":7,"45":1,"46":8,"47":8,"48":0,"49":8,"50":0,"51":8,"52":8,"53":8,"54":7,"55":0,"56":7,"57":1,"58":1,"59":0,"60":0,"61":1,"62":1,"63":1,"64":0,"65":1,"66":1},"f":{"0":8,"1":8,"2":1,"3":1},"b":{"0":[0,8],"1":[1,7],"2":[0,7],"3":[0,0],"4":[0,0],"5":[4,3],"6":[7,4,4],"7":[4,3],"8":[0,7],"9":[7,0,0],"10":[7,0],"11":[0,7],"12":[0,8],"13":[0,8],"14":[8,0],"15":[0,1],"16":[1,1],"17":[0,0],"18":[0,0],"19":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"8de569719bbcf6aaa4d1934a8d8f3017164484af"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\sendgrid\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\sendgrid\\util.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":41}},"1":{"start":{"line":9,"column":4},"end":{"line":9,"column":25}},"2":{"start":{"line":11,"column":22},"end":{"line":14,"column":1}},"3":{"start":{"line":12,"column":13},"end":{"line":12,"column":79}},"4":{"start":{"line":13,"column":2},"end":{"line":13,"column":34}},"5":{"start":{"line":16,"column":31},"end":{"line":34,"column":1}},"6":{"start":{"line":17,"column":2},"end":{"line":21,"column":3}},"7":{"start":{"line":18,"column":4},"end":{"line":20,"column":5}},"8":{"start":{"line":19,"column":6},"end":{"line":19,"column":79}},"9":{"start":{"line":22,"column":2},"end":{"line":27,"column":3}},"10":{"start":{"line":23,"column":4},"end":{"line":26,"column":6}},"11":{"start":{"line":28,"column":2},"end":{"line":30,"column":3}},"12":{"start":{"line":29,"column":4},"end":{"line":29,"column":57}},"13":{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},"14":{"start":{"line":32,"column":4},"end":{"line":32,"column":71}},"15":{"start":{"line":36,"column":25},"end":{"line":99,"column":1}},"16":{"start":{"line":37,"column":25},"end":{"line":37,"column":32}},"17":{"start":{"line":40,"column":2},"end":{"line":54,"column":3}},"18":{"start":{"line":41,"column":4},"end":{"line":53,"column":7}},"19":{"start":{"line":42,"column":34},"end":{"line":42,"column":36}},"20":{"start":{"line":43,"column":6},"end":{"line":51,"column":7}},"21":{"start":{"line":44,"column":8},"end":{"line":48,"column":11}},"22":{"start":{"line":45,"column":10},"end":{"line":47,"column":11}},"23":{"start":{"line":46,"column":12},"end":{"line":46,"column":44}},"24":{"start":{"line":50,"column":8},"end":{"line":50,"column":78}},"25":{"start":{"line":52,"column":6},"end":{"line":52,"column":70}},"26":{"start":{"line":55,"column":2},"end":{"line":69,"column":3}},"27":{"start":{"line":56,"column":4},"end":{"line":68,"column":7}},"28":{"start":{"line":57,"column":6},"end":{"line":60,"column":7}},"29":{"start":{"line":58,"column":8},"end":{"line":58,"column":49}},"30":{"start":{"line":59,"column":8},"end":{"line":59,"column":74}},"31":{"start":{"line":61,"column":6},"end":{"line":67,"column":7}},"32":{"start":{"line":65,"column":8},"end":{"line":65,"column":49}},"33":{"start":{"line":66,"column":8},"end":{"line":66,"column":57}},"34":{"start":{"line":70,"column":2},"end":{"line":77,"column":3}},"35":{"start":{"line":71,"column":4},"end":{"line":75,"column":7}},"36":{"start":{"line":72,"column":6},"end":{"line":74,"column":7}},"37":{"start":{"line":73,"column":8},"end":{"line":73,"column":68}},"38":{"start":{"line":76,"column":4},"end":{"line":76,"column":34}},"39":{"start":{"line":78,"column":2},"end":{"line":80,"column":3}},"40":{"start":{"line":79,"column":4},"end":{"line":79,"column":34}},"41":{"start":{"line":81,"column":2},"end":{"line":83,"column":3}},"42":{"start":{"line":82,"column":4},"end":{"line":82,"column":34}},"43":{"start":{"line":84,"column":2},"end":{"line":86,"column":3}},"44":{"start":{"line":85,"column":4},"end":{"line":85,"column":35}},"45":{"start":{"line":87,"column":2},"end":{"line":90,"column":3}},"46":{"start":{"line":88,"column":4},"end":{"line":88,"column":57}},"47":{"start":{"line":89,"column":4},"end":{"line":89,"column":35}},"48":{"start":{"line":91,"column":2},"end":{"line":94,"column":3}},"49":{"start":{"line":92,"column":4},"end":{"line":92,"column":58}},"50":{"start":{"line":93,"column":4},"end":{"line":93,"column":30}},"51":{"start":{"line":95,"column":2},"end":{"line":97,"column":3}},"52":{"start":{"line":96,"column":4},"end":{"line":96,"column":30}},"53":{"start":{"line":98,"column":2},"end":{"line":98,"column":24}},"54":{"start":{"line":101,"column":21},"end":{"line":114,"column":1}},"55":{"start":{"line":102,"column":13},"end":{"line":102,"column":18}},"56":{"start":{"line":103,"column":2},"end":{"line":112,"column":5}},"57":{"start":{"line":104,"column":4},"end":{"line":111,"column":5}},"58":{"start":{"line":109,"column":6},"end":{"line":109,"column":18}},"59":{"start":{"line":110,"column":6},"end":{"line":110,"column":18}},"60":{"start":{"line":113,"column":2},"end":{"line":113,"column":14}},"61":{"start":{"line":116,"column":19},"end":{"line":131,"column":1}},"62":{"start":{"line":117,"column":18},"end":{"line":117,"column":20}},"63":{"start":{"line":118,"column":2},"end":{"line":129,"column":3}},"64":{"start":{"line":119,"column":4},"end":{"line":128,"column":7}},"65":{"start":{"line":120,"column":6},"end":{"line":127,"column":7}},"66":{"start":{"line":126,"column":8},"end":{"line":126,"column":45}},"67":{"start":{"line":130,"column":2},"end":{"line":130,"column":17}},"68":{"start":{"line":133,"column":22},"end":{"line":148,"column":1}},"69":{"start":{"line":134,"column":22},"end":{"line":134,"column":24}},"70":{"start":{"line":135,"column":2},"end":{"line":146,"column":3}},"71":{"start":{"line":136,"column":16},"end":{"line":136,"column":42}},"72":{"start":{"line":137,"column":4},"end":{"line":145,"column":7}},"73":{"start":{"line":138,"column":6},"end":{"line":144,"column":7}},"74":{"start":{"line":139,"column":8},"end":{"line":139,"column":34}},"75":{"start":{"line":140,"column":13},"end":{"line":144,"column":7}},"76":{"start":{"line":141,"column":8},"end":{"line":143,"column":10}},"77":{"start":{"line":147,"column":2},"end":{"line":147,"column":21}},"78":{"start":{"line":150,"column":26},"end":{"line":165,"column":1}},"79":{"start":{"line":151,"column":25},"end":{"line":151,"column":27}},"80":{"start":{"line":152,"column":2},"end":{"line":163,"column":3}},"81":{"start":{"line":153,"column":16},"end":{"line":153,"column":45}},"82":{"start":{"line":154,"column":4},"end":{"line":162,"column":7}},"83":{"start":{"line":155,"column":6},"end":{"line":161,"column":7}},"84":{"start":{"line":156,"column":8},"end":{"line":156,"column":78}},"85":{"start":{"line":157,"column":13},"end":{"line":161,"column":7}},"86":{"start":{"line":158,"column":8},"end":{"line":160,"column":10}},"87":{"start":{"line":164,"column":2},"end":{"line":164,"column":24}},"88":{"start":{"line":167,"column":27},"end":{"line":247,"column":1}},"89":{"start":{"line":168,"column":25},"end":{"line":168,"column":32}},"90":{"start":{"line":169,"column":2},"end":{"line":176,"column":4}},"91":{"start":{"line":177,"column":2},"end":{"line":177,"column":61}},"92":{"start":{"line":178,"column":2},"end":{"line":178,"column":63}},"93":{"start":{"line":179,"column":2},"end":{"line":179,"column":63}},"94":{"start":{"line":180,"column":2},"end":{"line":180,"column":72}},"95":{"start":{"line":182,"column":2},"end":{"line":213,"column":3}},"96":{"start":{"line":183,"column":20},"end":{"line":183,"column":51}},"97":{"start":{"line":184,"column":4},"end":{"line":200,"column":5}},"98":{"start":{"line":185,"column":6},"end":{"line":186,"column":37}},"99":{"start":{"line":188,"column":6},"end":{"line":191,"column":7}},"100":{"start":{"line":189,"column":8},"end":{"line":190,"column":39}},"101":{"start":{"line":192,"column":6},"end":{"line":195,"column":7}},"102":{"start":{"line":193,"column":8},"end":{"line":194,"column":41}},"103":{"start":{"line":196,"column":6},"end":{"line":199,"column":7}},"104":{"start":{"line":197,"column":8},"end":{"line":198,"column":46}},"105":{"start":{"line":201,"column":4},"end":{"line":203,"column":5}},"106":{"start":{"line":202,"column":6},"end":{"line":202,"column":66}},"107":{"start":{"line":204,"column":4},"end":{"line":206,"column":5}},"108":{"start":{"line":205,"column":6},"end":{"line":205,"column":68}},"109":{"start":{"line":207,"column":4},"end":{"line":209,"column":5}},"110":{"start":{"line":208,"column":6},"end":{"line":208,"column":68}},"111":{"start":{"line":210,"column":4},"end":{"line":212,"column":5}},"112":{"start":{"line":211,"column":6},"end":{"line":211,"column":77}},"113":{"start":{"line":214,"column":15},"end":{"line":219,"column":3}},"114":{"start":{"line":220,"column":2},"end":{"line":224,"column":5}},"115":{"start":{"line":221,"column":4},"end":{"line":223,"column":5}},"116":{"start":{"line":222,"column":6},"end":{"line":222,"column":47}},"117":{"start":{"line":225,"column":2},"end":{"line":227,"column":3}},"118":{"start":{"line":226,"column":4},"end":{"line":226,"column":52}},"119":{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},"120":{"start":{"line":229,"column":4},"end":{"line":229,"column":52}},"121":{"start":{"line":231,"column":2},"end":{"line":233,"column":4}},"122":{"start":{"line":234,"column":2},"end":{"line":236,"column":4}},"123":{"start":{"line":237,"column":2},"end":{"line":239,"column":3}},"124":{"start":{"line":238,"column":4},"end":{"line":238,"column":47}},"125":{"start":{"line":240,"column":2},"end":{"line":242,"column":3}},"126":{"start":{"line":241,"column":4},"end":{"line":241,"column":53}},"127":{"start":{"line":243,"column":2},"end":{"line":245,"column":3}},"128":{"start":{"line":244,"column":4},"end":{"line":244,"column":40}},"129":{"start":{"line":246,"column":2},"end":{"line":246,"column":24}},"130":{"start":{"line":249,"column":28},"end":{"line":316,"column":1}},"131":{"start":{"line":250,"column":25},"end":{"line":250,"column":32}},"132":{"start":{"line":251,"column":2},"end":{"line":256,"column":4}},"133":{"start":{"line":257,"column":2},"end":{"line":257,"column":80}},"134":{"start":{"line":258,"column":2},"end":{"line":259,"column":35}},"135":{"start":{"line":261,"column":2},"end":{"line":261,"column":78}},"136":{"start":{"line":262,"column":2},"end":{"line":263,"column":47}},"137":{"start":{"line":265,"column":2},"end":{"line":265,"column":62}},"138":{"start":{"line":266,"column":2},"end":{"line":267,"column":41}},"139":{"start":{"line":268,"column":2},"end":{"line":269,"column":24}},"140":{"start":{"line":270,"column":2},"end":{"line":271,"column":24}},"141":{"start":{"line":272,"column":2},"end":{"line":273,"column":35}},"142":{"start":{"line":275,"column":2},"end":{"line":275,"column":73}},"143":{"start":{"line":276,"column":2},"end":{"line":277,"column":29}},"144":{"start":{"line":278,"column":2},"end":{"line":279,"column":29}},"145":{"start":{"line":280,"column":2},"end":{"line":280,"column":80}},"146":{"start":{"line":281,"column":2},"end":{"line":282,"column":30}},"147":{"start":{"line":283,"column":2},"end":{"line":284,"column":31}},"148":{"start":{"line":286,"column":15},"end":{"line":286,"column":71}},"149":{"start":{"line":287,"column":2},"end":{"line":291,"column":5}},"150":{"start":{"line":288,"column":4},"end":{"line":290,"column":6}},"151":{"start":{"line":293,"column":2},"end":{"line":295,"column":4}},"152":{"start":{"line":297,"column":2},"end":{"line":299,"column":3}},"153":{"start":{"line":298,"column":4},"end":{"line":298,"column":66}},"154":{"start":{"line":300,"column":2},"end":{"line":302,"column":3}},"155":{"start":{"line":301,"column":4},"end":{"line":301,"column":58}},"156":{"start":{"line":303,"column":2},"end":{"line":305,"column":3}},"157":{"start":{"line":304,"column":4},"end":{"line":304,"column":55}},"158":{"start":{"line":306,"column":2},"end":{"line":311,"column":3}},"159":{"start":{"line":310,"column":4},"end":{"line":310,"column":59}},"160":{"start":{"line":312,"column":2},"end":{"line":314,"column":3}},"161":{"start":{"line":313,"column":4},"end":{"line":313,"column":44}},"162":{"start":{"line":315,"column":2},"end":{"line":315,"column":24}},"163":{"start":{"line":318,"column":34},"end":{"line":362,"column":1}},"164":{"start":{"line":319,"column":25},"end":{"line":319,"column":32}},"165":{"start":{"line":320,"column":2},"end":{"line":325,"column":3}},"166":{"start":{"line":321,"column":4},"end":{"line":321,"column":29}},"167":{"start":{"line":322,"column":4},"end":{"line":322,"column":49}},"168":{"start":{"line":323,"column":4},"end":{"line":323,"column":72}},"169":{"start":{"line":324,"column":4},"end":{"line":324,"column":76}},"170":{"start":{"line":326,"column":2},"end":{"line":328,"column":3}},"171":{"start":{"line":327,"column":4},"end":{"line":327,"column":51}},"172":{"start":{"line":329,"column":2},"end":{"line":339,"column":3}},"173":{"start":{"line":333,"column":24},"end":{"line":333,"column":49}},"174":{"start":{"line":334,"column":4},"end":{"line":338,"column":5}},"175":{"start":{"line":335,"column":6},"end":{"line":335,"column":47}},"176":{"start":{"line":337,"column":6},"end":{"line":337,"column":40}},"177":{"start":{"line":341,"column":2},"end":{"line":348,"column":3}},"178":{"start":{"line":342,"column":20},"end":{"line":342,"column":41}},"179":{"start":{"line":343,"column":4},"end":{"line":347,"column":5}},"180":{"start":{"line":344,"column":6},"end":{"line":344,"column":39}},"181":{"start":{"line":346,"column":6},"end":{"line":346,"column":36}},"182":{"start":{"line":349,"column":2},"end":{"line":351,"column":3}},"183":{"start":{"line":350,"column":4},"end":{"line":350,"column":44}},"184":{"start":{"line":352,"column":2},"end":{"line":360,"column":3}},"185":{"start":{"line":353,"column":4},"end":{"line":353,"column":33}},"186":{"start":{"line":354,"column":4},"end":{"line":356,"column":13}},"187":{"start":{"line":357,"column":4},"end":{"line":359,"column":13}},"188":{"start":{"line":361,"column":2},"end":{"line":361,"column":24}},"189":{"start":{"line":364,"column":0},"end":{"line":372,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":11,"column":22},"end":{"line":11,"column":23}},"loc":{"start":{"line":11,"column":33},"end":{"line":14,"column":1}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":31},"end":{"line":16,"column":32}},"loc":{"start":{"line":16,"column":42},"end":{"line":34,"column":1}},"line":16},"2":{"name":"(anonymous_2)","decl":{"start":{"line":36,"column":25},"end":{"line":36,"column":26}},"loc":{"start":{"line":36,"column":36},"end":{"line":99,"column":1}},"line":36},"3":{"name":"(anonymous_3)","decl":{"start":{"line":41,"column":37},"end":{"line":41,"column":38}},"loc":{"start":{"line":41,"column":54},"end":{"line":53,"column":5}},"line":41},"4":{"name":"(anonymous_4)","decl":{"start":{"line":44,"column":24},"end":{"line":44,"column":25}},"loc":{"start":{"line":44,"column":33},"end":{"line":48,"column":9}},"line":44},"5":{"name":"(anonymous_5)","decl":{"start":{"line":56,"column":32},"end":{"line":56,"column":33}},"loc":{"start":{"line":56,"column":55},"end":{"line":68,"column":5}},"line":56},"6":{"name":"(anonymous_6)","decl":{"start":{"line":71,"column":31},"end":{"line":71,"column":32}},"loc":{"start":{"line":71,"column":52},"end":{"line":75,"column":5}},"line":71},"7":{"name":"(anonymous_7)","decl":{"start":{"line":101,"column":21},"end":{"line":101,"column":22}},"loc":{"start":{"line":101,"column":40},"end":{"line":114,"column":1}},"line":101},"8":{"name":"(anonymous_8)","decl":{"start":{"line":103,"column":33},"end":{"line":103,"column":34}},"loc":{"start":{"line":103,"column":46},"end":{"line":112,"column":3}},"line":103},"9":{"name":"(anonymous_9)","decl":{"start":{"line":116,"column":19},"end":{"line":116,"column":20}},"loc":{"start":{"line":116,"column":29},"end":{"line":131,"column":1}},"line":116},"10":{"name":"(anonymous_10)","decl":{"start":{"line":119,"column":35},"end":{"line":119,"column":36}},"loc":{"start":{"line":119,"column":45},"end":{"line":128,"column":5}},"line":119},"11":{"name":"(anonymous_11)","decl":{"start":{"line":133,"column":22},"end":{"line":133,"column":23}},"loc":{"start":{"line":133,"column":32},"end":{"line":148,"column":1}},"line":133},"12":{"name":"(anonymous_12)","decl":{"start":{"line":137,"column":28},"end":{"line":137,"column":29}},"loc":{"start":{"line":137,"column":48},"end":{"line":145,"column":5}},"line":137},"13":{"name":"(anonymous_13)","decl":{"start":{"line":150,"column":26},"end":{"line":150,"column":27}},"loc":{"start":{"line":150,"column":36},"end":{"line":165,"column":1}},"line":150},"14":{"name":"(anonymous_14)","decl":{"start":{"line":154,"column":31},"end":{"line":154,"column":32}},"loc":{"start":{"line":154,"column":54},"end":{"line":162,"column":5}},"line":154},"15":{"name":"(anonymous_15)","decl":{"start":{"line":167,"column":27},"end":{"line":167,"column":28}},"loc":{"start":{"line":167,"column":57},"end":{"line":247,"column":1}},"line":167},"16":{"name":"(anonymous_16)","decl":{"start":{"line":220,"column":15},"end":{"line":220,"column":16}},"loc":{"start":{"line":220,"column":22},"end":{"line":224,"column":3}},"line":220},"17":{"name":"(anonymous_17)","decl":{"start":{"line":249,"column":28},"end":{"line":249,"column":29}},"loc":{"start":{"line":249,"column":49},"end":{"line":316,"column":1}},"line":249},"18":{"name":"(anonymous_18)","decl":{"start":{"line":287,"column":15},"end":{"line":287,"column":16}},"loc":{"start":{"line":287,"column":22},"end":{"line":291,"column":3}},"line":287},"19":{"name":"(anonymous_19)","decl":{"start":{"line":318,"column":34},"end":{"line":318,"column":35}},"loc":{"start":{"line":318,"column":55},"end":{"line":362,"column":1}},"line":318}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":21,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":21,"column":3}},{"start":{"line":17,"column":2},"end":{"line":21,"column":3}}],"line":17},"1":{"loc":{"start":{"line":18,"column":4},"end":{"line":20,"column":5}},"type":"if","locations":[{"start":{"line":18,"column":4},"end":{"line":20,"column":5}},{"start":{"line":18,"column":4},"end":{"line":20,"column":5}}],"line":18},"2":{"loc":{"start":{"line":18,"column":8},"end":{"line":18,"column":73}},"type":"binary-expr","locations":[{"start":{"line":18,"column":8},"end":{"line":18,"column":24}},{"start":{"line":18,"column":29},"end":{"line":18,"column":44}},{"start":{"line":18,"column":48},"end":{"line":18,"column":72}}],"line":18},"3":{"loc":{"start":{"line":22,"column":2},"end":{"line":27,"column":3}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":27,"column":3}},{"start":{"line":22,"column":2},"end":{"line":27,"column":3}}],"line":22},"4":{"loc":{"start":{"line":22,"column":6},"end":{"line":22,"column":68}},"type":"binary-expr","locations":[{"start":{"line":22,"column":6},"end":{"line":22,"column":31}},{"start":{"line":22,"column":35},"end":{"line":22,"column":68}}],"line":22},"5":{"loc":{"start":{"line":28,"column":2},"end":{"line":30,"column":3}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":30,"column":3}},{"start":{"line":28,"column":2},"end":{"line":30,"column":3}}],"line":28},"6":{"loc":{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},"type":"if","locations":[{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},{"start":{"line":31,"column":2},"end":{"line":33,"column":3}}],"line":31},"7":{"loc":{"start":{"line":31,"column":6},"end":{"line":31,"column":41}},"type":"binary-expr","locations":[{"start":{"line":31,"column":6},"end":{"line":31,"column":18}},{"start":{"line":31,"column":22},"end":{"line":31,"column":41}}],"line":31},"8":{"loc":{"start":{"line":40,"column":2},"end":{"line":54,"column":3}},"type":"if","locations":[{"start":{"line":40,"column":2},"end":{"line":54,"column":3}},{"start":{"line":40,"column":2},"end":{"line":54,"column":3}}],"line":40},"9":{"loc":{"start":{"line":43,"column":6},"end":{"line":51,"column":7}},"type":"if","locations":[{"start":{"line":43,"column":6},"end":{"line":51,"column":7}},{"start":{"line":43,"column":6},"end":{"line":51,"column":7}}],"line":43},"10":{"loc":{"start":{"line":43,"column":10},"end":{"line":43,"column":54}},"type":"binary-expr","locations":[{"start":{"line":43,"column":10},"end":{"line":43,"column":17}},{"start":{"line":43,"column":22},"end":{"line":43,"column":37}},{"start":{"line":43,"column":41},"end":{"line":43,"column":53}}],"line":43},"11":{"loc":{"start":{"line":45,"column":10},"end":{"line":47,"column":11}},"type":"if","locations":[{"start":{"line":45,"column":10},"end":{"line":47,"column":11}},{"start":{"line":45,"column":10},"end":{"line":47,"column":11}}],"line":45},"12":{"loc":{"start":{"line":55,"column":2},"end":{"line":69,"column":3}},"type":"if","locations":[{"start":{"line":55,"column":2},"end":{"line":69,"column":3}},{"start":{"line":55,"column":2},"end":{"line":69,"column":3}}],"line":55},"13":{"loc":{"start":{"line":57,"column":6},"end":{"line":60,"column":7}},"type":"if","locations":[{"start":{"line":57,"column":6},"end":{"line":60,"column":7}},{"start":{"line":57,"column":6},"end":{"line":60,"column":7}}],"line":57},"14":{"loc":{"start":{"line":57,"column":10},"end":{"line":57,"column":53}},"type":"binary-expr","locations":[{"start":{"line":57,"column":10},"end":{"line":57,"column":29}},{"start":{"line":57,"column":33},"end":{"line":57,"column":53}}],"line":57},"15":{"loc":{"start":{"line":61,"column":6},"end":{"line":67,"column":7}},"type":"if","locations":[{"start":{"line":61,"column":6},"end":{"line":67,"column":7}},{"start":{"line":61,"column":6},"end":{"line":67,"column":7}}],"line":61},"16":{"loc":{"start":{"line":62,"column":8},"end":{"line":63,"column":51}},"type":"binary-expr","locations":[{"start":{"line":62,"column":8},"end":{"line":62,"column":35}},{"start":{"line":63,"column":8},"end":{"line":63,"column":51}}],"line":62},"17":{"loc":{"start":{"line":70,"column":2},"end":{"line":77,"column":3}},"type":"if","locations":[{"start":{"line":70,"column":2},"end":{"line":77,"column":3}},{"start":{"line":70,"column":2},"end":{"line":77,"column":3}}],"line":70},"18":{"loc":{"start":{"line":72,"column":6},"end":{"line":74,"column":7}},"type":"if","locations":[{"start":{"line":72,"column":6},"end":{"line":74,"column":7}},{"start":{"line":72,"column":6},"end":{"line":74,"column":7}}],"line":72},"19":{"loc":{"start":{"line":78,"column":2},"end":{"line":80,"column":3}},"type":"if","locations":[{"start":{"line":78,"column":2},"end":{"line":80,"column":3}},{"start":{"line":78,"column":2},"end":{"line":80,"column":3}}],"line":78},"20":{"loc":{"start":{"line":78,"column":6},"end":{"line":78,"column":51}},"type":"binary-expr","locations":[{"start":{"line":78,"column":6},"end":{"line":78,"column":21}},{"start":{"line":78,"column":25},"end":{"line":78,"column":51}}],"line":78},"21":{"loc":{"start":{"line":81,"column":2},"end":{"line":83,"column":3}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":83,"column":3}},{"start":{"line":81,"column":2},"end":{"line":83,"column":3}}],"line":81},"22":{"loc":{"start":{"line":81,"column":6},"end":{"line":81,"column":51}},"type":"binary-expr","locations":[{"start":{"line":81,"column":6},"end":{"line":81,"column":21}},{"start":{"line":81,"column":25},"end":{"line":81,"column":51}}],"line":81},"23":{"loc":{"start":{"line":84,"column":2},"end":{"line":86,"column":3}},"type":"if","locations":[{"start":{"line":84,"column":2},"end":{"line":86,"column":3}},{"start":{"line":84,"column":2},"end":{"line":86,"column":3}}],"line":84},"24":{"loc":{"start":{"line":87,"column":2},"end":{"line":90,"column":3}},"type":"if","locations":[{"start":{"line":87,"column":2},"end":{"line":90,"column":3}},{"start":{"line":87,"column":2},"end":{"line":90,"column":3}}],"line":87},"25":{"loc":{"start":{"line":87,"column":6},"end":{"line":87,"column":49}},"type":"binary-expr","locations":[{"start":{"line":87,"column":6},"end":{"line":87,"column":22}},{"start":{"line":87,"column":26},"end":{"line":87,"column":49}}],"line":87},"26":{"loc":{"start":{"line":91,"column":2},"end":{"line":94,"column":3}},"type":"if","locations":[{"start":{"line":91,"column":2},"end":{"line":94,"column":3}},{"start":{"line":91,"column":2},"end":{"line":94,"column":3}}],"line":91},"27":{"loc":{"start":{"line":91,"column":6},"end":{"line":91,"column":75}},"type":"binary-expr","locations":[{"start":{"line":91,"column":6},"end":{"line":91,"column":17}},{"start":{"line":91,"column":21},"end":{"line":91,"column":50}},{"start":{"line":91,"column":54},"end":{"line":91,"column":75}}],"line":91},"28":{"loc":{"start":{"line":95,"column":2},"end":{"line":97,"column":3}},"type":"if","locations":[{"start":{"line":95,"column":2},"end":{"line":97,"column":3}},{"start":{"line":95,"column":2},"end":{"line":97,"column":3}}],"line":95},"29":{"loc":{"start":{"line":104,"column":4},"end":{"line":111,"column":5}},"type":"if","locations":[{"start":{"line":104,"column":4},"end":{"line":111,"column":5}},{"start":{"line":104,"column":4},"end":{"line":111,"column":5}}],"line":104},"30":{"loc":{"start":{"line":105,"column":6},"end":{"line":107,"column":52}},"type":"binary-expr","locations":[{"start":{"line":105,"column":6},"end":{"line":105,"column":21}},{"start":{"line":106,"column":6},"end":{"line":106,"column":41}},{"start":{"line":107,"column":6},"end":{"line":107,"column":52}}],"line":105},"31":{"loc":{"start":{"line":118,"column":2},"end":{"line":129,"column":3}},"type":"if","locations":[{"start":{"line":118,"column":2},"end":{"line":129,"column":3}},{"start":{"line":118,"column":2},"end":{"line":129,"column":3}}],"line":118},"32":{"loc":{"start":{"line":118,"column":6},"end":{"line":118,"column":65}},"type":"binary-expr","locations":[{"start":{"line":118,"column":6},"end":{"line":118,"column":28}},{"start":{"line":118,"column":32},"end":{"line":118,"column":65}}],"line":118},"33":{"loc":{"start":{"line":120,"column":6},"end":{"line":127,"column":7}},"type":"if","locations":[{"start":{"line":120,"column":6},"end":{"line":127,"column":7}},{"start":{"line":120,"column":6},"end":{"line":127,"column":7}}],"line":120},"34":{"loc":{"start":{"line":121,"column":8},"end":{"line":124,"column":48}},"type":"binary-expr","locations":[{"start":{"line":121,"column":8},"end":{"line":121,"column":22}},{"start":{"line":122,"column":8},"end":{"line":122,"column":29}},{"start":{"line":123,"column":8},"end":{"line":123,"column":45}},{"start":{"line":124,"column":8},"end":{"line":124,"column":48}}],"line":121},"35":{"loc":{"start":{"line":135,"column":2},"end":{"line":146,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":146,"column":3}},{"start":{"line":135,"column":2},"end":{"line":146,"column":3}}],"line":135},"36":{"loc":{"start":{"line":135,"column":6},"end":{"line":135,"column":51}},"type":"binary-expr","locations":[{"start":{"line":135,"column":6},"end":{"line":135,"column":21}},{"start":{"line":135,"column":25},"end":{"line":135,"column":51}}],"line":135},"37":{"loc":{"start":{"line":138,"column":6},"end":{"line":144,"column":7}},"type":"if","locations":[{"start":{"line":138,"column":6},"end":{"line":144,"column":7}},{"start":{"line":138,"column":6},"end":{"line":144,"column":7}}],"line":138},"38":{"loc":{"start":{"line":138,"column":10},"end":{"line":138,"column":39}},"type":"binary-expr","locations":[{"start":{"line":138,"column":10},"end":{"line":138,"column":22}},{"start":{"line":138,"column":26},"end":{"line":138,"column":39}}],"line":138},"39":{"loc":{"start":{"line":140,"column":13},"end":{"line":144,"column":7}},"type":"if","locations":[{"start":{"line":140,"column":13},"end":{"line":144,"column":7}},{"start":{"line":140,"column":13},"end":{"line":144,"column":7}}],"line":140},"40":{"loc":{"start":{"line":152,"column":2},"end":{"line":163,"column":3}},"type":"if","locations":[{"start":{"line":152,"column":2},"end":{"line":163,"column":3}},{"start":{"line":152,"column":2},"end":{"line":163,"column":3}}],"line":152},"41":{"loc":{"start":{"line":152,"column":6},"end":{"line":152,"column":57}},"type":"binary-expr","locations":[{"start":{"line":152,"column":6},"end":{"line":152,"column":24}},{"start":{"line":152,"column":28},"end":{"line":152,"column":57}}],"line":152},"42":{"loc":{"start":{"line":155,"column":6},"end":{"line":161,"column":7}},"type":"if","locations":[{"start":{"line":155,"column":6},"end":{"line":161,"column":7}},{"start":{"line":155,"column":6},"end":{"line":161,"column":7}}],"line":155},"43":{"loc":{"start":{"line":155,"column":10},"end":{"line":155,"column":51}},"type":"binary-expr","locations":[{"start":{"line":155,"column":10},"end":{"line":155,"column":28}},{"start":{"line":155,"column":32},"end":{"line":155,"column":51}}],"line":155},"44":{"loc":{"start":{"line":157,"column":13},"end":{"line":161,"column":7}},"type":"if","locations":[{"start":{"line":157,"column":13},"end":{"line":161,"column":7}},{"start":{"line":157,"column":13},"end":{"line":161,"column":7}}],"line":157},"45":{"loc":{"start":{"line":182,"column":2},"end":{"line":213,"column":3}},"type":"if","locations":[{"start":{"line":182,"column":2},"end":{"line":213,"column":3}},{"start":{"line":182,"column":2},"end":{"line":213,"column":3}}],"line":182},"46":{"loc":{"start":{"line":184,"column":4},"end":{"line":200,"column":5}},"type":"if","locations":[{"start":{"line":184,"column":4},"end":{"line":200,"column":5}},{"start":{"line":184,"column":4},"end":{"line":200,"column":5}}],"line":184},"47":{"loc":{"start":{"line":188,"column":6},"end":{"line":191,"column":7}},"type":"if","locations":[{"start":{"line":188,"column":6},"end":{"line":191,"column":7}},{"start":{"line":188,"column":6},"end":{"line":191,"column":7}}],"line":188},"48":{"loc":{"start":{"line":192,"column":6},"end":{"line":195,"column":7}},"type":"if","locations":[{"start":{"line":192,"column":6},"end":{"line":195,"column":7}},{"start":{"line":192,"column":6},"end":{"line":195,"column":7}}],"line":192},"49":{"loc":{"start":{"line":196,"column":6},"end":{"line":199,"column":7}},"type":"if","locations":[{"start":{"line":196,"column":6},"end":{"line":199,"column":7}},{"start":{"line":196,"column":6},"end":{"line":199,"column":7}}],"line":196},"50":{"loc":{"start":{"line":201,"column":4},"end":{"line":203,"column":5}},"type":"if","locations":[{"start":{"line":201,"column":4},"end":{"line":203,"column":5}},{"start":{"line":201,"column":4},"end":{"line":203,"column":5}}],"line":201},"51":{"loc":{"start":{"line":204,"column":4},"end":{"line":206,"column":5}},"type":"if","locations":[{"start":{"line":204,"column":4},"end":{"line":206,"column":5}},{"start":{"line":204,"column":4},"end":{"line":206,"column":5}}],"line":204},"52":{"loc":{"start":{"line":207,"column":4},"end":{"line":209,"column":5}},"type":"if","locations":[{"start":{"line":207,"column":4},"end":{"line":209,"column":5}},{"start":{"line":207,"column":4},"end":{"line":209,"column":5}}],"line":207},"53":{"loc":{"start":{"line":210,"column":4},"end":{"line":212,"column":5}},"type":"if","locations":[{"start":{"line":210,"column":4},"end":{"line":212,"column":5}},{"start":{"line":210,"column":4},"end":{"line":212,"column":5}}],"line":210},"54":{"loc":{"start":{"line":221,"column":4},"end":{"line":223,"column":5}},"type":"if","locations":[{"start":{"line":221,"column":4},"end":{"line":223,"column":5}},{"start":{"line":221,"column":4},"end":{"line":223,"column":5}}],"line":221},"55":{"loc":{"start":{"line":225,"column":2},"end":{"line":227,"column":3}},"type":"if","locations":[{"start":{"line":225,"column":2},"end":{"line":227,"column":3}},{"start":{"line":225,"column":2},"end":{"line":227,"column":3}}],"line":225},"56":{"loc":{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},"type":"if","locations":[{"start":{"line":228,"column":2},"end":{"line":230,"column":3}},{"start":{"line":228,"column":2},"end":{"line":230,"column":3}}],"line":228},"57":{"loc":{"start":{"line":237,"column":2},"end":{"line":239,"column":3}},"type":"if","locations":[{"start":{"line":237,"column":2},"end":{"line":239,"column":3}},{"start":{"line":237,"column":2},"end":{"line":239,"column":3}}],"line":237},"58":{"loc":{"start":{"line":240,"column":2},"end":{"line":242,"column":3}},"type":"if","locations":[{"start":{"line":240,"column":2},"end":{"line":242,"column":3}},{"start":{"line":240,"column":2},"end":{"line":242,"column":3}}],"line":240},"59":{"loc":{"start":{"line":243,"column":2},"end":{"line":245,"column":3}},"type":"if","locations":[{"start":{"line":243,"column":2},"end":{"line":245,"column":3}},{"start":{"line":243,"column":2},"end":{"line":245,"column":3}}],"line":243},"60":{"loc":{"start":{"line":263,"column":4},"end":{"line":263,"column":46}},"type":"binary-expr","locations":[{"start":{"line":263,"column":4},"end":{"line":263,"column":38}},{"start":{"line":263,"column":42},"end":{"line":263,"column":46}}],"line":263},"61":{"loc":{"start":{"line":267,"column":4},"end":{"line":267,"column":40}},"type":"binary-expr","locations":[{"start":{"line":267,"column":4},"end":{"line":267,"column":31}},{"start":{"line":267,"column":35},"end":{"line":267,"column":40}}],"line":267},"62":{"loc":{"start":{"line":269,"column":4},"end":{"line":269,"column":23}},"type":"binary-expr","locations":[{"start":{"line":269,"column":4},"end":{"line":269,"column":15}},{"start":{"line":269,"column":19},"end":{"line":269,"column":23}}],"line":269},"63":{"loc":{"start":{"line":271,"column":4},"end":{"line":271,"column":23}},"type":"binary-expr","locations":[{"start":{"line":271,"column":4},"end":{"line":271,"column":15}},{"start":{"line":271,"column":19},"end":{"line":271,"column":23}}],"line":271},"64":{"loc":{"start":{"line":273,"column":4},"end":{"line":273,"column":34}},"type":"binary-expr","locations":[{"start":{"line":273,"column":4},"end":{"line":273,"column":26}},{"start":{"line":273,"column":30},"end":{"line":273,"column":34}}],"line":273},"65":{"loc":{"start":{"line":277,"column":4},"end":{"line":277,"column":28}},"type":"binary-expr","locations":[{"start":{"line":277,"column":4},"end":{"line":277,"column":20}},{"start":{"line":277,"column":24},"end":{"line":277,"column":28}}],"line":277},"66":{"loc":{"start":{"line":279,"column":4},"end":{"line":279,"column":28}},"type":"binary-expr","locations":[{"start":{"line":279,"column":4},"end":{"line":279,"column":20}},{"start":{"line":279,"column":24},"end":{"line":279,"column":28}}],"line":279},"67":{"loc":{"start":{"line":280,"column":57},"end":{"line":280,"column":79}},"type":"binary-expr","locations":[{"start":{"line":280,"column":57},"end":{"line":280,"column":71}},{"start":{"line":280,"column":75},"end":{"line":280,"column":79}}],"line":280},"68":{"loc":{"start":{"line":282,"column":4},"end":{"line":282,"column":29}},"type":"binary-expr","locations":[{"start":{"line":282,"column":4},"end":{"line":282,"column":21}},{"start":{"line":282,"column":25},"end":{"line":282,"column":29}}],"line":282},"69":{"loc":{"start":{"line":284,"column":4},"end":{"line":284,"column":30}},"type":"binary-expr","locations":[{"start":{"line":284,"column":4},"end":{"line":284,"column":22}},{"start":{"line":284,"column":26},"end":{"line":284,"column":30}}],"line":284},"70":{"loc":{"start":{"line":297,"column":2},"end":{"line":299,"column":3}},"type":"if","locations":[{"start":{"line":297,"column":2},"end":{"line":299,"column":3}},{"start":{"line":297,"column":2},"end":{"line":299,"column":3}}],"line":297},"71":{"loc":{"start":{"line":300,"column":2},"end":{"line":302,"column":3}},"type":"if","locations":[{"start":{"line":300,"column":2},"end":{"line":302,"column":3}},{"start":{"line":300,"column":2},"end":{"line":302,"column":3}}],"line":300},"72":{"loc":{"start":{"line":303,"column":2},"end":{"line":305,"column":3}},"type":"if","locations":[{"start":{"line":303,"column":2},"end":{"line":305,"column":3}},{"start":{"line":303,"column":2},"end":{"line":305,"column":3}}],"line":303},"73":{"loc":{"start":{"line":306,"column":2},"end":{"line":311,"column":3}},"type":"if","locations":[{"start":{"line":306,"column":2},"end":{"line":311,"column":3}},{"start":{"line":306,"column":2},"end":{"line":311,"column":3}}],"line":306},"74":{"loc":{"start":{"line":307,"column":4},"end":{"line":308,"column":64}},"type":"binary-expr","locations":[{"start":{"line":307,"column":4},"end":{"line":307,"column":59}},{"start":{"line":308,"column":4},"end":{"line":308,"column":64}}],"line":307},"75":{"loc":{"start":{"line":312,"column":2},"end":{"line":314,"column":3}},"type":"if","locations":[{"start":{"line":312,"column":2},"end":{"line":314,"column":3}},{"start":{"line":312,"column":2},"end":{"line":314,"column":3}}],"line":312},"76":{"loc":{"start":{"line":320,"column":2},"end":{"line":325,"column":3}},"type":"if","locations":[{"start":{"line":320,"column":2},"end":{"line":325,"column":3}},{"start":{"line":320,"column":2},"end":{"line":325,"column":3}}],"line":320},"77":{"loc":{"start":{"line":323,"column":31},"end":{"line":323,"column":71}},"type":"cond-expr","locations":[{"start":{"line":323,"column":49},"end":{"line":323,"column":64}},{"start":{"line":323,"column":67},"end":{"line":323,"column":71}}],"line":323},"78":{"loc":{"start":{"line":326,"column":2},"end":{"line":328,"column":3}},"type":"if","locations":[{"start":{"line":326,"column":2},"end":{"line":328,"column":3}},{"start":{"line":326,"column":2},"end":{"line":328,"column":3}}],"line":326},"79":{"loc":{"start":{"line":326,"column":6},"end":{"line":326,"column":47}},"type":"binary-expr","locations":[{"start":{"line":326,"column":6},"end":{"line":326,"column":23}},{"start":{"line":326,"column":27},"end":{"line":326,"column":47}}],"line":326},"80":{"loc":{"start":{"line":329,"column":2},"end":{"line":339,"column":3}},"type":"if","locations":[{"start":{"line":329,"column":2},"end":{"line":339,"column":3}},{"start":{"line":329,"column":2},"end":{"line":339,"column":3}}],"line":329},"81":{"loc":{"start":{"line":330,"column":4},"end":{"line":331,"column":57}},"type":"binary-expr","locations":[{"start":{"line":330,"column":4},"end":{"line":330,"column":24}},{"start":{"line":331,"column":5},"end":{"line":331,"column":24}},{"start":{"line":331,"column":28},"end":{"line":331,"column":56}}],"line":330},"82":{"loc":{"start":{"line":334,"column":4},"end":{"line":338,"column":5}},"type":"if","locations":[{"start":{"line":334,"column":4},"end":{"line":338,"column":5}},{"start":{"line":334,"column":4},"end":{"line":338,"column":5}}],"line":334},"83":{"loc":{"start":{"line":341,"column":2},"end":{"line":348,"column":3}},"type":"if","locations":[{"start":{"line":341,"column":2},"end":{"line":348,"column":3}},{"start":{"line":341,"column":2},"end":{"line":348,"column":3}}],"line":341},"84":{"loc":{"start":{"line":341,"column":6},"end":{"line":341,"column":71}},"type":"binary-expr","locations":[{"start":{"line":341,"column":6},"end":{"line":341,"column":22}},{"start":{"line":341,"column":27},"end":{"line":341,"column":42}},{"start":{"line":341,"column":46},"end":{"line":341,"column":70}}],"line":341},"85":{"loc":{"start":{"line":343,"column":4},"end":{"line":347,"column":5}},"type":"if","locations":[{"start":{"line":343,"column":4},"end":{"line":347,"column":5}},{"start":{"line":343,"column":4},"end":{"line":347,"column":5}}],"line":343},"86":{"loc":{"start":{"line":349,"column":2},"end":{"line":351,"column":3}},"type":"if","locations":[{"start":{"line":349,"column":2},"end":{"line":351,"column":3}},{"start":{"line":349,"column":2},"end":{"line":351,"column":3}}],"line":349},"87":{"loc":{"start":{"line":349,"column":6},"end":{"line":349,"column":71}},"type":"binary-expr","locations":[{"start":{"line":349,"column":6},"end":{"line":349,"column":22}},{"start":{"line":349,"column":27},"end":{"line":349,"column":42}},{"start":{"line":349,"column":46},"end":{"line":349,"column":70}}],"line":349},"88":{"loc":{"start":{"line":352,"column":2},"end":{"line":360,"column":3}},"type":"if","locations":[{"start":{"line":352,"column":2},"end":{"line":360,"column":3}},{"start":{"line":352,"column":2},"end":{"line":360,"column":3}}],"line":352},"89":{"loc":{"start":{"line":354,"column":36},"end":{"line":356,"column":12}},"type":"cond-expr","locations":[{"start":{"line":355,"column":8},"end":{"line":355,"column":27}},{"start":{"line":356,"column":8},"end":{"line":356,"column":12}}],"line":354},"90":{"loc":{"start":{"line":357,"column":35},"end":{"line":359,"column":12}},"type":"cond-expr","locations":[{"start":{"line":358,"column":8},"end":{"line":358,"column":26}},{"start":{"line":359,"column":8},"end":{"line":359,"column":12}}],"line":357}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":1,"6":7,"7":7,"8":0,"9":7,"10":0,"11":7,"12":0,"13":7,"14":0,"15":1,"16":7,"17":7,"18":7,"19":7,"20":7,"21":7,"22":14,"23":7,"24":0,"25":7,"26":7,"27":3,"28":3,"29":0,"30":0,"31":3,"32":0,"33":0,"34":7,"35":0,"36":0,"37":0,"38":0,"39":7,"40":0,"41":7,"42":0,"43":7,"44":0,"45":7,"46":0,"47":0,"48":7,"49":0,"50":0,"51":7,"52":3,"53":7,"54":1,"55":8,"56":8,"57":9,"58":7,"59":7,"60":8,"61":1,"62":7,"63":7,"64":4,"65":12,"66":8,"67":7,"68":1,"69":7,"70":7,"71":7,"72":7,"73":7,"74":7,"75":0,"76":0,"77":7,"78":1,"79":7,"80":7,"81":3,"82":3,"83":5,"84":3,"85":2,"86":0,"87":7,"88":1,"89":7,"90":7,"91":7,"92":7,"93":7,"94":7,"95":7,"96":1,"97":1,"98":1,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":1,"106":1,"107":1,"108":0,"109":1,"110":0,"111":1,"112":0,"113":7,"114":7,"115":28,"116":27,"117":7,"118":2,"119":7,"120":7,"121":7,"122":7,"123":7,"124":6,"125":7,"126":7,"127":7,"128":6,"129":7,"130":1,"131":7,"132":7,"133":7,"134":7,"135":7,"136":7,"137":7,"138":7,"139":7,"140":7,"141":7,"142":7,"143":7,"144":7,"145":7,"146":7,"147":7,"148":7,"149":7,"150":21,"151":7,"152":7,"153":7,"154":7,"155":7,"156":7,"157":7,"158":7,"159":7,"160":7,"161":7,"162":7,"163":1,"164":7,"165":7,"166":0,"167":0,"168":0,"169":0,"170":7,"171":0,"172":7,"173":7,"174":7,"175":3,"176":4,"177":7,"178":7,"179":7,"180":7,"181":0,"182":7,"183":7,"184":7,"185":2,"186":2,"187":2,"188":7,"189":1},"f":{"0":0,"1":7,"2":7,"3":7,"4":14,"5":3,"6":0,"7":8,"8":9,"9":7,"10":12,"11":7,"12":7,"13":7,"14":5,"15":7,"16":28,"17":7,"18":21,"19":7},"b":{"0":[7,0],"1":[0,7],"2":[7,7,7],"3":[0,7],"4":[7,7],"5":[0,7],"6":[0,7],"7":[7,7],"8":[7,0],"9":[7,0],"10":[7,7,0],"11":[7,7],"12":[3,4],"13":[0,3],"14":[3,3],"15":[0,3],"16":[3,0],"17":[0,7],"18":[0,0],"19":[0,7],"20":[7,0],"21":[0,7],"22":[7,7],"23":[0,7],"24":[0,7],"25":[7,7],"26":[0,7],"27":[7,7,4],"28":[3,4],"29":[7,2],"30":[9,9,9],"31":[4,3],"32":[7,4],"33":[8,4],"34":[12,12,12,8],"35":[7,0],"36":[7,7],"37":[7,0],"38":[7,7],"39":[0,0],"40":[3,4],"41":[7,3],"42":[3,2],"43":[5,5],"44":[0,2],"45":[1,6],"46":[1,0],"47":[0,0],"48":[0,0],"49":[0,0],"50":[1,0],"51":[0,1],"52":[0,1],"53":[0,1],"54":[27,1],"55":[2,5],"56":[7,0],"57":[6,1],"58":[7,0],"59":[6,1],"60":[7,7],"61":[7,7],"62":[7,7],"63":[7,7],"64":[7,7],"65":[7,7],"66":[7,7],"67":[7,7],"68":[7,7],"69":[7,7],"70":[7,0],"71":[7,0],"72":[7,0],"73":[7,0],"74":[7,7],"75":[7,0],"76":[0,7],"77":[0,0],"78":[0,7],"79":[7,0],"80":[7,0],"81":[7,0,0],"82":[3,4],"83":[7,0],"84":[7,0,0],"85":[7,0],"86":[7,0],"87":[7,0,0],"88":[2,5],"89":[2,0],"90":[0,2]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"79bf678e51c0de408e31fcb8507cdd6c3b3fb8de"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\sfmc\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\sfmc\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":18},"end":{"line":7,"column":1}},"2":{"start":{"line":9,"column":26},"end":{"line":18,"column":1}},"3":{"start":{"line":20,"column":23},"end":{"line":20,"column":69}},"4":{"start":{"line":22,"column":0},"end":{"line":26,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1eaa30fd1a2eff334f22592797f43e9c7abd3af9"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\sfmc\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\sfmc\\transform.js","statementMap":{"0":{"start":{"line":2,"column":14},"end":{"line":2,"column":30}},"1":{"start":{"line":3,"column":22},"end":{"line":3,"column":51}},"2":{"start":{"line":4,"column":57},"end":{"line":4,"column":76}},"3":{"start":{"line":19,"column":4},"end":{"line":19,"column":25}},"4":{"start":{"line":20,"column":33},"end":{"line":20,"column":80}},"5":{"start":{"line":24,"column":17},"end":{"line":55,"column":1}},"6":{"start":{"line":25,"column":2},"end":{"line":54,"column":3}},"7":{"start":{"line":26,"column":17},"end":{"line":36,"column":5}},"8":{"start":{"line":37,"column":4},"end":{"line":39,"column":5}},"9":{"start":{"line":38,"column":6},"end":{"line":38,"column":36}},"10":{"start":{"line":40,"column":4},"end":{"line":40,"column":73}},"11":{"start":{"line":42,"column":4},"end":{"line":53,"column":5}},"12":{"start":{"line":43,"column":6},"end":{"line":46,"column":8}},"13":{"start":{"line":48,"column":24},"end":{"line":48,"column":56}},"14":{"start":{"line":49,"column":6},"end":{"line":52,"column":8}},"15":{"start":{"line":59,"column":43},"end":{"line":76,"column":1}},"16":{"start":{"line":60,"column":19},"end":{"line":60,"column":41}},"17":{"start":{"line":61,"column":2},"end":{"line":61,"column":67}},"18":{"start":{"line":62,"column":2},"end":{"line":62,"column":59}},"19":{"start":{"line":65,"column":4},"end":{"line":66,"column":46}},"20":{"start":{"line":67,"column":2},"end":{"line":69,"column":3}},"21":{"start":{"line":68,"column":4},"end":{"line":68,"column":69}},"22":{"start":{"line":70,"column":2},"end":{"line":70,"column":57}},"23":{"start":{"line":71,"column":2},"end":{"line":74,"column":4}},"24":{"start":{"line":75,"column":2},"end":{"line":75,"column":18}},"25":{"start":{"line":80,"column":37},"end":{"line":167,"column":1}},"26":{"start":{"line":92,"column":4},"end":{"line":93,"column":46}},"27":{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},"28":{"start":{"line":95,"column":4},"end":{"line":95,"column":69}},"29":{"start":{"line":98,"column":19},"end":{"line":98,"column":41}},"30":{"start":{"line":99,"column":2},"end":{"line":99,"column":58}},"31":{"start":{"line":100,"column":2},"end":{"line":103,"column":4}},"32":{"start":{"line":106,"column":2},"end":{"line":108,"column":3}},"33":{"start":{"line":107,"column":4},"end":{"line":107,"column":44}},"34":{"start":{"line":111,"column":18},"end":{"line":115,"column":3}},"35":{"start":{"line":117,"column":2},"end":{"line":164,"column":3}},"36":{"start":{"line":124,"column":4},"end":{"line":124,"column":121}},"37":{"start":{"line":125,"column":4},"end":{"line":130,"column":6}},"38":{"start":{"line":131,"column":9},"end":{"line":164,"column":3}},"39":{"start":{"line":133,"column":25},"end":{"line":133,"column":42}},"40":{"start":{"line":134,"column":4},"end":{"line":134,"column":116}},"41":{"start":{"line":135,"column":4},"end":{"line":140,"column":6}},"42":{"start":{"line":143,"column":21},"end":{"line":143,"column":23}},"43":{"start":{"line":144,"column":4},"end":{"line":157,"column":7}},"44":{"start":{"line":145,"column":25},"end":{"line":145,"column":35}},"45":{"start":{"line":146,"column":25},"end":{"line":146,"column":44}},"46":{"start":{"line":147,"column":6},"end":{"line":150,"column":7}},"47":{"start":{"line":149,"column":8},"end":{"line":149,"column":34}},"48":{"start":{"line":152,"column":6},"end":{"line":156,"column":7}},"49":{"start":{"line":153,"column":8},"end":{"line":153,"column":54}},"50":{"start":{"line":155,"column":8},"end":{"line":155,"column":55}},"51":{"start":{"line":158,"column":4},"end":{"line":158,"column":109}},"52":{"start":{"line":159,"column":4},"end":{"line":163,"column":6}},"53":{"start":{"line":166,"column":2},"end":{"line":166,"column":18}},"54":{"start":{"line":169,"column":30},"end":{"line":229,"column":1}},"55":{"start":{"line":179,"column":6},"end":{"line":179,"column":24}},"56":{"start":{"line":181,"column":29},"end":{"line":181,"column":79}},"57":{"start":{"line":183,"column":28},"end":{"line":183,"column":77}},"58":{"start":{"line":185,"column":22},"end":{"line":185,"column":68}},"59":{"start":{"line":187,"column":20},"end":{"line":187,"column":69}},"60":{"start":{"line":189,"column":2},"end":{"line":206,"column":3}},"61":{"start":{"line":191,"column":36},"end":{"line":195,"column":5}},"62":{"start":{"line":197,"column":38},"end":{"line":204,"column":5}},"63":{"start":{"line":205,"column":4},"end":{"line":205,"column":64}},"64":{"start":{"line":208,"column":2},"end":{"line":210,"column":3}},"65":{"start":{"line":209,"column":4},"end":{"line":209,"column":76}},"66":{"start":{"line":212,"column":2},"end":{"line":226,"column":3}},"67":{"start":{"line":216,"column":4},"end":{"line":225,"column":6}},"68":{"start":{"line":228,"column":2},"end":{"line":228,"column":69}},"69":{"start":{"line":231,"column":21},"end":{"line":256,"column":1}},"70":{"start":{"line":232,"column":2},"end":{"line":237,"column":3}},"71":{"start":{"line":233,"column":4},"end":{"line":236,"column":6}},"72":{"start":{"line":239,"column":22},"end":{"line":239,"column":48}},"73":{"start":{"line":242,"column":2},"end":{"line":251,"column":3}},"74":{"start":{"line":244,"column":6},"end":{"line":244,"column":44}},"75":{"start":{"line":245,"column":6},"end":{"line":245,"column":12}},"76":{"start":{"line":247,"column":6},"end":{"line":247,"column":41}},"77":{"start":{"line":248,"column":6},"end":{"line":248,"column":12}},"78":{"start":{"line":250,"column":6},"end":{"line":250,"column":63}},"79":{"start":{"line":254,"column":19},"end":{"line":254,"column":78}},"80":{"start":{"line":255,"column":2},"end":{"line":255,"column":18}},"81":{"start":{"line":258,"column":16},"end":{"line":261,"column":1}},"82":{"start":{"line":259,"column":19},"end":{"line":259,"column":71}},"83":{"start":{"line":260,"column":2},"end":{"line":260,"column":18}},"84":{"start":{"line":263,"column":26},"end":{"line":300,"column":1}},"85":{"start":{"line":264,"column":2},"end":{"line":267,"column":3}},"86":{"start":{"line":265,"column":23},"end":{"line":265,"column":75}},"87":{"start":{"line":266,"column":4},"end":{"line":266,"column":24}},"88":{"start":{"line":269,"column":19},"end":{"line":298,"column":3}},"89":{"start":{"line":271,"column":6},"end":{"line":296,"column":7}},"90":{"start":{"line":272,"column":8},"end":{"line":279,"column":9}},"91":{"start":{"line":274,"column":10},"end":{"line":278,"column":12}},"92":{"start":{"line":281,"column":8},"end":{"line":285,"column":10}},"93":{"start":{"line":287,"column":8},"end":{"line":295,"column":10}},"94":{"start":{"line":299,"column":2},"end":{"line":299,"column":18}},"95":{"start":{"line":302,"column":0},"end":{"line":302,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":24,"column":17},"end":{"line":24,"column":18}},"loc":{"start":{"line":24,"column":62},"end":{"line":55,"column":1}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":59,"column":43},"end":{"line":59,"column":44}},"loc":{"start":{"line":59,"column":78},"end":{"line":76,"column":1}},"line":59},"2":{"name":"(anonymous_2)","decl":{"start":{"line":80,"column":37},"end":{"line":80,"column":38}},"loc":{"start":{"line":89,"column":5},"end":{"line":167,"column":1}},"line":89},"3":{"name":"(anonymous_3)","decl":{"start":{"line":144,"column":28},"end":{"line":144,"column":29}},"loc":{"start":{"line":144,"column":44},"end":{"line":157,"column":5}},"line":144},"4":{"name":"(anonymous_4)","decl":{"start":{"line":169,"column":30},"end":{"line":169,"column":31}},"loc":{"start":{"line":169,"column":72},"end":{"line":229,"column":1}},"line":169},"5":{"name":"(anonymous_5)","decl":{"start":{"line":231,"column":21},"end":{"line":231,"column":22}},"loc":{"start":{"line":231,"column":53},"end":{"line":256,"column":1}},"line":231},"6":{"name":"(anonymous_6)","decl":{"start":{"line":258,"column":16},"end":{"line":258,"column":17}},"loc":{"start":{"line":258,"column":31},"end":{"line":261,"column":1}},"line":258},"7":{"name":"(anonymous_7)","decl":{"start":{"line":263,"column":26},"end":{"line":263,"column":27}},"loc":{"start":{"line":263,"column":42},"end":{"line":300,"column":1}},"line":263},"8":{"name":"(anonymous_8)","decl":{"start":{"line":270,"column":15},"end":{"line":270,"column":16}},"loc":{"start":{"line":270,"column":30},"end":{"line":297,"column":5}},"line":270}},"branchMap":{"0":{"loc":{"start":{"line":37,"column":4},"end":{"line":39,"column":5}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":39,"column":5}},{"start":{"line":37,"column":4},"end":{"line":39,"column":5}}],"line":37},"1":{"loc":{"start":{"line":37,"column":8},"end":{"line":37,"column":25}},"type":"binary-expr","locations":[{"start":{"line":37,"column":8},"end":{"line":37,"column":12}},{"start":{"line":37,"column":16},"end":{"line":37,"column":25}}],"line":37},"2":{"loc":{"start":{"line":42,"column":4},"end":{"line":53,"column":5}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":53,"column":5}},{"start":{"line":42,"column":4},"end":{"line":53,"column":5}}],"line":42},"3":{"loc":{"start":{"line":65,"column":4},"end":{"line":66,"column":46}},"type":"binary-expr","locations":[{"start":{"line":65,"column":4},"end":{"line":65,"column":51}},{"start":{"line":66,"column":4},"end":{"line":66,"column":46}}],"line":65},"4":{"loc":{"start":{"line":67,"column":2},"end":{"line":69,"column":3}},"type":"if","locations":[{"start":{"line":67,"column":2},"end":{"line":69,"column":3}},{"start":{"line":67,"column":2},"end":{"line":69,"column":3}}],"line":67},"5":{"loc":{"start":{"line":92,"column":4},"end":{"line":93,"column":46}},"type":"binary-expr","locations":[{"start":{"line":92,"column":4},"end":{"line":92,"column":51}},{"start":{"line":93,"column":4},"end":{"line":93,"column":46}}],"line":92},"6":{"loc":{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},"type":"if","locations":[{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},{"start":{"line":94,"column":2},"end":{"line":96,"column":3}}],"line":94},"7":{"loc":{"start":{"line":106,"column":2},"end":{"line":108,"column":3}},"type":"if","locations":[{"start":{"line":106,"column":2},"end":{"line":108,"column":3}},{"start":{"line":106,"column":2},"end":{"line":108,"column":3}}],"line":106},"8":{"loc":{"start":{"line":117,"column":2},"end":{"line":164,"column":3}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":164,"column":3}},{"start":{"line":117,"column":2},"end":{"line":164,"column":3}}],"line":117},"9":{"loc":{"start":{"line":118,"column":4},"end":{"line":122,"column":12}},"type":"binary-expr","locations":[{"start":{"line":118,"column":4},"end":{"line":118,"column":23}},{"start":{"line":119,"column":5},"end":{"line":119,"column":21}},{"start":{"line":120,"column":6},"end":{"line":120,"column":34}},{"start":{"line":121,"column":6},"end":{"line":121,"column":45}},{"start":{"line":122,"column":6},"end":{"line":122,"column":11}}],"line":118},"10":{"loc":{"start":{"line":131,"column":9},"end":{"line":164,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":9},"end":{"line":164,"column":3}},{"start":{"line":131,"column":9},"end":{"line":164,"column":3}}],"line":131},"11":{"loc":{"start":{"line":131,"column":13},"end":{"line":131,"column":37}},"type":"binary-expr","locations":[{"start":{"line":131,"column":13},"end":{"line":131,"column":29}},{"start":{"line":131,"column":33},"end":{"line":131,"column":37}}],"line":131},"12":{"loc":{"start":{"line":147,"column":6},"end":{"line":150,"column":7}},"type":"if","locations":[{"start":{"line":147,"column":6},"end":{"line":150,"column":7}},{"start":{"line":147,"column":6},"end":{"line":150,"column":7}}],"line":147},"13":{"loc":{"start":{"line":152,"column":6},"end":{"line":156,"column":7}},"type":"if","locations":[{"start":{"line":152,"column":6},"end":{"line":156,"column":7}},{"start":{"line":152,"column":6},"end":{"line":156,"column":7}}],"line":152},"14":{"loc":{"start":{"line":189,"column":2},"end":{"line":206,"column":3}},"type":"if","locations":[{"start":{"line":189,"column":2},"end":{"line":206,"column":3}},{"start":{"line":189,"column":2},"end":{"line":206,"column":3}}],"line":189},"15":{"loc":{"start":{"line":189,"column":6},"end":{"line":189,"column":61}},"type":"binary-expr","locations":[{"start":{"line":189,"column":6},"end":{"line":189,"column":34}},{"start":{"line":189,"column":38},"end":{"line":189,"column":61}}],"line":189},"16":{"loc":{"start":{"line":208,"column":2},"end":{"line":210,"column":3}},"type":"if","locations":[{"start":{"line":208,"column":2},"end":{"line":210,"column":3}},{"start":{"line":208,"column":2},"end":{"line":210,"column":3}}],"line":208},"17":{"loc":{"start":{"line":208,"column":6},"end":{"line":208,"column":60}},"type":"binary-expr","locations":[{"start":{"line":208,"column":6},"end":{"line":208,"column":34}},{"start":{"line":208,"column":38},"end":{"line":208,"column":60}}],"line":208},"18":{"loc":{"start":{"line":212,"column":2},"end":{"line":226,"column":3}},"type":"if","locations":[{"start":{"line":212,"column":2},"end":{"line":226,"column":3}},{"start":{"line":212,"column":2},"end":{"line":226,"column":3}}],"line":212},"19":{"loc":{"start":{"line":213,"column":4},"end":{"line":214,"column":51}},"type":"binary-expr","locations":[{"start":{"line":213,"column":4},"end":{"line":213,"column":29}},{"start":{"line":214,"column":4},"end":{"line":214,"column":51}}],"line":213},"20":{"loc":{"start":{"line":223,"column":6},"end":{"line":223,"column":69}},"type":"binary-expr","locations":[{"start":{"line":223,"column":6},"end":{"line":223,"column":52}},{"start":{"line":223,"column":56},"end":{"line":223,"column":69}}],"line":223},"21":{"loc":{"start":{"line":232,"column":2},"end":{"line":237,"column":3}},"type":"if","locations":[{"start":{"line":232,"column":2},"end":{"line":237,"column":3}},{"start":{"line":232,"column":2},"end":{"line":237,"column":3}}],"line":232},"22":{"loc":{"start":{"line":242,"column":2},"end":{"line":251,"column":3}},"type":"switch","locations":[{"start":{"line":243,"column":4},"end":{"line":245,"column":12}},{"start":{"line":246,"column":4},"end":{"line":248,"column":12}},{"start":{"line":249,"column":4},"end":{"line":250,"column":63}}],"line":242},"23":{"loc":{"start":{"line":264,"column":2},"end":{"line":267,"column":3}},"type":"if","locations":[{"start":{"line":264,"column":2},"end":{"line":267,"column":3}},{"start":{"line":264,"column":2},"end":{"line":267,"column":3}}],"line":264},"24":{"loc":{"start":{"line":264,"column":6},"end":{"line":264,"column":50}},"type":"binary-expr","locations":[{"start":{"line":264,"column":6},"end":{"line":264,"column":28}},{"start":{"line":264,"column":32},"end":{"line":264,"column":50}}],"line":264},"25":{"loc":{"start":{"line":272,"column":8},"end":{"line":279,"column":9}},"type":"if","locations":[{"start":{"line":272,"column":8},"end":{"line":279,"column":9}},{"start":{"line":272,"column":8},"end":{"line":279,"column":9}}],"line":272},"26":{"loc":{"start":{"line":289,"column":10},"end":{"line":293,"column":19}},"type":"cond-expr","locations":[{"start":{"line":290,"column":14},"end":{"line":290,"column":35}},{"start":{"line":291,"column":14},"end":{"line":293,"column":19}}],"line":289},"27":{"loc":{"start":{"line":291,"column":14},"end":{"line":293,"column":19}},"type":"cond-expr","locations":[{"start":{"line":292,"column":16},"end":{"line":292,"column":26}},{"start":{"line":293,"column":16},"end":{"line":293,"column":19}}],"line":291},"28":{"loc":{"start":{"line":294,"column":10},"end":{"line":294,"column":69}},"type":"binary-expr","locations":[{"start":{"line":294,"column":10},"end":{"line":294,"column":23}},{"start":{"line":294,"column":27},"end":{"line":294,"column":69}}],"line":294}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":12,"7":12,"8":12,"9":12,"10":0,"11":0,"12":0,"13":0,"14":0,"15":1,"16":4,"17":4,"18":4,"19":4,"20":4,"21":1,"22":3,"23":3,"24":3,"25":1,"26":8,"27":8,"28":1,"29":7,"30":7,"31":7,"32":7,"33":4,"34":7,"35":7,"36":4,"37":4,"38":3,"39":1,"40":1,"41":1,"42":2,"43":2,"44":3,"45":3,"46":3,"47":1,"48":3,"49":2,"50":1,"51":2,"52":2,"53":7,"54":1,"55":12,"56":12,"57":12,"58":12,"59":12,"60":12,"61":4,"62":3,"63":3,"64":8,"65":2,"66":6,"67":5,"68":1,"69":1,"70":14,"71":1,"72":13,"73":13,"74":6,"75":6,"76":6,"77":6,"78":1,"79":12,"80":7,"81":1,"82":14,"83":7,"84":1,"85":1,"86":0,"87":0,"88":1,"89":2,"90":2,"91":0,"92":2,"93":1,"94":1,"95":1},"f":{"0":12,"1":4,"2":8,"3":3,"4":12,"5":14,"6":14,"7":1,"8":2},"b":{"0":[12,0],"1":[12,12],"2":[0,0],"3":[4,1],"4":[1,3],"5":[8,1],"6":[1,7],"7":[4,3],"8":[4,3],"9":[7,4,4,3,2],"10":[1,2],"11":[3,3],"12":[1,2],"13":[2,1],"14":[4,8],"15":[12,6],"16":[2,6],"17":[8,2],"18":[5,1],"19":[6,6],"20":[5,3],"21":[1,13],"22":[6,6,1],"23":[0,1],"24":[1,1],"25":[0,2],"26":[1,0],"27":[0,0],"28":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0e80d7eb3a649f8225668d742631ae8bf2d6a6e8"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\slack\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\slack\\config.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":1,"column":37}},"1":{"start":{"line":2,"column":31},"end":{"line":2,"column":75}},"2":{"start":{"line":4,"column":0},"end":{"line":7,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"b8c9e340ccf8ebe03962ce069ad346c4db610648"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\slack\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\slack\\transform.js","statementMap":{"0":{"start":{"line":3,"column":19},"end":{"line":3,"column":40}},"1":{"start":{"line":4,"column":22},"end":{"line":4,"column":51}},"2":{"start":{"line":6,"column":15},"end":{"line":6,"column":41}},"3":{"start":{"line":8,"column":52},"end":{"line":8,"column":71}},"4":{"start":{"line":16,"column":4},"end":{"line":16,"column":25}},"5":{"start":{"line":21,"column":15},"end":{"line":21,"column":17}},"6":{"start":{"line":22,"column":2},"end":{"line":32,"column":5}},"7":{"start":{"line":23,"column":4},"end":{"line":31,"column":5}},"8":{"start":{"line":24,"column":6},"end":{"line":30,"column":7}},"9":{"start":{"line":25,"column":8},"end":{"line":27,"column":9}},"10":{"start":{"line":26,"column":10},"end":{"line":26,"column":44}},"11":{"start":{"line":29,"column":8},"end":{"line":29,"column":42}},"12":{"start":{"line":33,"column":2},"end":{"line":33,"column":42}},"13":{"start":{"line":34,"column":2},"end":{"line":34,"column":16}},"14":{"start":{"line":40,"column":17},"end":{"line":40,"column":60}},"15":{"start":{"line":42,"column":2},"end":{"line":60,"column":3}},"16":{"start":{"line":43,"column":4},"end":{"line":54,"column":46}},"17":{"start":{"line":56,"column":4},"end":{"line":59,"column":46}},"18":{"start":{"line":62,"column":2},"end":{"line":62,"column":40}},"19":{"start":{"line":63,"column":2},"end":{"line":63,"column":15}},"20":{"start":{"line":70,"column":19},"end":{"line":70,"column":48}},"21":{"start":{"line":71,"column":19},"end":{"line":71,"column":41}},"22":{"start":{"line":72,"column":2},"end":{"line":72,"column":31}},"23":{"start":{"line":73,"column":2},"end":{"line":73,"column":59}},"24":{"start":{"line":74,"column":2},"end":{"line":74,"column":77}},"25":{"start":{"line":75,"column":2},"end":{"line":75,"column":74}},"26":{"start":{"line":76,"column":2},"end":{"line":82,"column":4}},"27":{"start":{"line":83,"column":2},"end":{"line":83,"column":28}},"28":{"start":{"line":84,"column":2},"end":{"line":84,"column":25}},"29":{"start":{"line":85,"column":2},"end":{"line":85,"column":18}},"30":{"start":{"line":91,"column":23},"end":{"line":91,"column":45}},"31":{"start":{"line":93,"column":2},"end":{"line":95,"column":5}},"32":{"start":{"line":94,"column":4},"end":{"line":94,"column":48}},"33":{"start":{"line":97,"column":2},"end":{"line":103,"column":3}},"34":{"start":{"line":98,"column":4},"end":{"line":102,"column":7}},"35":{"start":{"line":99,"column":6},"end":{"line":101,"column":7}},"36":{"start":{"line":100,"column":8},"end":{"line":100,"column":58}},"37":{"start":{"line":104,"column":2},"end":{"line":104,"column":24}},"38":{"start":{"line":108,"column":2},"end":{"line":118,"column":5}},"39":{"start":{"line":109,"column":4},"end":{"line":117,"column":5}},"40":{"start":{"line":116,"column":6},"end":{"line":116,"column":44}},"41":{"start":{"line":123,"column":33},"end":{"line":123,"column":68}},"42":{"start":{"line":124,"column":21},"end":{"line":124,"column":23}},"43":{"start":{"line":126,"column":2},"end":{"line":126,"column":48}},"44":{"start":{"line":128,"column":2},"end":{"line":128,"column":50}},"45":{"start":{"line":129,"column":16},"end":{"line":129,"column":32}},"46":{"start":{"line":136,"column":19},"end":{"line":146,"column":3}},"47":{"start":{"line":147,"column":2},"end":{"line":158,"column":4}},"48":{"start":{"line":162,"column":25},"end":{"line":162,"column":74}},"49":{"start":{"line":164,"column":24},"end":{"line":169,"column":3}},"50":{"start":{"line":171,"column":21},"end":{"line":171,"column":44}},"51":{"start":{"line":172,"column":2},"end":{"line":172,"column":67}},"52":{"start":{"line":177,"column":21},"end":{"line":177,"column":23}},"53":{"start":{"line":178,"column":29},"end":{"line":178,"column":68}},"54":{"start":{"line":179,"column":30},"end":{"line":179,"column":70}},"55":{"start":{"line":181,"column":2},"end":{"line":183,"column":3}},"56":{"start":{"line":182,"column":4},"end":{"line":182,"column":57}},"57":{"start":{"line":184,"column":20},"end":{"line":184,"column":33}},"58":{"start":{"line":185,"column":37},"end":{"line":185,"column":46}},"59":{"start":{"line":186,"column":35},"end":{"line":186,"column":44}},"60":{"start":{"line":188,"column":2},"end":{"line":188,"column":48}},"61":{"start":{"line":196,"column":2},"end":{"line":229,"column":5}},"62":{"start":{"line":197,"column":28},"end":{"line":201,"column":17}},"63":{"start":{"line":202,"column":31},"end":{"line":206,"column":17}},"64":{"start":{"line":207,"column":4},"end":{"line":228,"column":5}},"65":{"start":{"line":208,"column":6},"end":{"line":227,"column":7}},"66":{"start":{"line":209,"column":8},"end":{"line":212,"column":10}},"67":{"start":{"line":213,"column":8},"end":{"line":218,"column":10}},"68":{"start":{"line":219,"column":8},"end":{"line":224,"column":9}},"69":{"start":{"line":223,"column":10},"end":{"line":223,"column":61}},"70":{"start":{"line":225,"column":13},"end":{"line":227,"column":7}},"71":{"start":{"line":226,"column":8},"end":{"line":226,"column":59}},"72":{"start":{"line":231,"column":27},"end":{"line":231,"column":65}},"73":{"start":{"line":234,"column":2},"end":{"line":257,"column":5}},"74":{"start":{"line":235,"column":28},"end":{"line":239,"column":17}},"75":{"start":{"line":240,"column":32},"end":{"line":244,"column":17}},"76":{"start":{"line":245,"column":4},"end":{"line":256,"column":5}},"77":{"start":{"line":246,"column":6},"end":{"line":255,"column":7}},"78":{"start":{"line":247,"column":8},"end":{"line":252,"column":9}},"79":{"start":{"line":251,"column":10},"end":{"line":251,"column":60}},"80":{"start":{"line":253,"column":13},"end":{"line":255,"column":7}},"81":{"start":{"line":254,"column":8},"end":{"line":254,"column":58}},"82":{"start":{"line":259,"column":28},"end":{"line":259,"column":64}},"83":{"start":{"line":261,"column":2},"end":{"line":265,"column":4}},"84":{"start":{"line":266,"column":2},"end":{"line":266,"column":65}},"85":{"start":{"line":269,"column":26},"end":{"line":269,"column":50}},"86":{"start":{"line":271,"column":24},"end":{"line":277,"column":3}},"87":{"start":{"line":280,"column":25},"end":{"line":280,"column":74}},"88":{"start":{"line":281,"column":24},"end":{"line":289,"column":3}},"89":{"start":{"line":291,"column":2},"end":{"line":291,"column":54}},"90":{"start":{"line":293,"column":21},"end":{"line":293,"column":49}},"91":{"start":{"line":294,"column":2},"end":{"line":300,"column":3}},"92":{"start":{"line":295,"column":4},"end":{"line":299,"column":6}},"93":{"start":{"line":301,"column":2},"end":{"line":301,"column":67}},"94":{"start":{"line":305,"column":2},"end":{"line":305,"column":34}},"95":{"start":{"line":306,"column":2},"end":{"line":306,"column":38}},"96":{"start":{"line":307,"column":19},"end":{"line":307,"column":21}},"97":{"start":{"line":309,"column":35},"end":{"line":309,"column":40}},"98":{"start":{"line":310,"column":2},"end":{"line":315,"column":3}},"99":{"start":{"line":311,"column":4},"end":{"line":314,"column":6}},"100":{"start":{"line":316,"column":22},"end":{"line":316,"column":48}},"101":{"start":{"line":317,"column":2},"end":{"line":317,"column":45}},"102":{"start":{"line":319,"column":2},"end":{"line":333,"column":3}},"103":{"start":{"line":321,"column":6},"end":{"line":321,"column":55}},"104":{"start":{"line":322,"column":6},"end":{"line":322,"column":32}},"105":{"start":{"line":323,"column":6},"end":{"line":323,"column":30}},"106":{"start":{"line":324,"column":6},"end":{"line":324,"column":12}},"107":{"start":{"line":326,"column":6},"end":{"line":326,"column":52}},"108":{"start":{"line":327,"column":6},"end":{"line":327,"column":32}},"109":{"start":{"line":328,"column":6},"end":{"line":328,"column":30}},"110":{"start":{"line":329,"column":6},"end":{"line":329,"column":12}},"111":{"start":{"line":331,"column":6},"end":{"line":331,"column":49}},"112":{"start":{"line":332,"column":6},"end":{"line":332,"column":63}},"113":{"start":{"line":334,"column":2},"end":{"line":334,"column":41}},"114":{"start":{"line":335,"column":2},"end":{"line":335,"column":33}},"115":{"start":{"line":336,"column":2},"end":{"line":336,"column":18}},"116":{"start":{"line":339,"column":26},"end":{"line":376,"column":1}},"117":{"start":{"line":340,"column":2},"end":{"line":343,"column":3}},"118":{"start":{"line":341,"column":23},"end":{"line":341,"column":75}},"119":{"start":{"line":342,"column":4},"end":{"line":342,"column":24}},"120":{"start":{"line":345,"column":19},"end":{"line":374,"column":3}},"121":{"start":{"line":347,"column":6},"end":{"line":372,"column":7}},"122":{"start":{"line":348,"column":8},"end":{"line":355,"column":9}},"123":{"start":{"line":350,"column":10},"end":{"line":354,"column":12}},"124":{"start":{"line":357,"column":8},"end":{"line":361,"column":10}},"125":{"start":{"line":363,"column":8},"end":{"line":371,"column":10}},"126":{"start":{"line":375,"column":2},"end":{"line":375,"column":18}},"127":{"start":{"line":378,"column":0},"end":{"line":378,"column":48}}},"fnMap":{"0":{"name":"stringifyJSON","decl":{"start":{"line":20,"column":9},"end":{"line":20,"column":22}},"loc":{"start":{"line":20,"column":48},"end":{"line":35,"column":1}},"line":20},"1":{"name":"(anonymous_1)","decl":{"start":{"line":22,"column":28},"end":{"line":22,"column":29}},"loc":{"start":{"line":22,"column":35},"end":{"line":32,"column":3}},"line":22},"2":{"name":"getName","decl":{"start":{"line":39,"column":9},"end":{"line":39,"column":16}},"loc":{"start":{"line":39,"column":26},"end":{"line":64,"column":1}},"line":39},"3":{"name":"buildResponse","decl":{"start":{"line":69,"column":9},"end":{"line":69,"column":22}},"loc":{"start":{"line":69,"column":58},"end":{"line":86,"column":1}},"line":69},"4":{"name":"buildDefaultTraitTemplate","decl":{"start":{"line":90,"column":9},"end":{"line":90,"column":34}},"loc":{"start":{"line":90,"column":55},"end":{"line":105,"column":1}},"line":90},"5":{"name":"(anonymous_5)","decl":{"start":{"line":93,"column":21},"end":{"line":93,"column":22}},"loc":{"start":{"line":93,"column":30},"end":{"line":95,"column":3}},"line":93},"6":{"name":"(anonymous_6)","decl":{"start":{"line":98,"column":32},"end":{"line":98,"column":33}},"loc":{"start":{"line":98,"column":44},"end":{"line":102,"column":5}},"line":98},"7":{"name":"getWhiteListedTraits","decl":{"start":{"line":107,"column":9},"end":{"line":107,"column":29}},"loc":{"start":{"line":107,"column":55},"end":{"line":119,"column":1}},"line":107},"8":{"name":"(anonymous_8)","decl":{"start":{"line":108,"column":55},"end":{"line":108,"column":56}},"loc":{"start":{"line":108,"column":73},"end":{"line":118,"column":3}},"line":108},"9":{"name":"processIdentify","decl":{"start":{"line":121,"column":9},"end":{"line":121,"column":24}},"loc":{"start":{"line":121,"column":47},"end":{"line":173,"column":1}},"line":121},"10":{"name":"processTrack","decl":{"start":{"line":175,"column":9},"end":{"line":175,"column":21}},"loc":{"start":{"line":175,"column":44},"end":{"line":302,"column":1}},"line":175},"11":{"name":"(anonymous_11)","decl":{"start":{"line":196,"column":29},"end":{"line":196,"column":30}},"loc":{"start":{"line":196,"column":46},"end":{"line":229,"column":3}},"line":196},"12":{"name":"(anonymous_12)","decl":{"start":{"line":234,"column":30},"end":{"line":234,"column":31}},"loc":{"start":{"line":234,"column":48},"end":{"line":257,"column":3}},"line":234},"13":{"name":"process","decl":{"start":{"line":304,"column":9},"end":{"line":304,"column":16}},"loc":{"start":{"line":304,"column":24},"end":{"line":337,"column":1}},"line":304},"14":{"name":"(anonymous_14)","decl":{"start":{"line":339,"column":26},"end":{"line":339,"column":27}},"loc":{"start":{"line":339,"column":42},"end":{"line":376,"column":1}},"line":339},"15":{"name":"(anonymous_15)","decl":{"start":{"line":346,"column":15},"end":{"line":346,"column":16}},"loc":{"start":{"line":346,"column":30},"end":{"line":373,"column":5}},"line":346}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":4},"end":{"line":31,"column":5}},"type":"if","locations":[{"start":{"line":23,"column":4},"end":{"line":31,"column":5}},{"start":{"line":23,"column":4},"end":{"line":31,"column":5}}],"line":23},"1":{"loc":{"start":{"line":24,"column":6},"end":{"line":30,"column":7}},"type":"if","locations":[{"start":{"line":24,"column":6},"end":{"line":30,"column":7}},{"start":{"line":24,"column":6},"end":{"line":30,"column":7}}],"line":24},"2":{"loc":{"start":{"line":24,"column":10},"end":{"line":24,"column":59}},"type":"binary-expr","locations":[{"start":{"line":24,"column":10},"end":{"line":24,"column":27}},{"start":{"line":24,"column":31},"end":{"line":24,"column":59}}],"line":24},"3":{"loc":{"start":{"line":25,"column":8},"end":{"line":27,"column":9}},"type":"if","locations":[{"start":{"line":25,"column":8},"end":{"line":27,"column":9}},{"start":{"line":25,"column":8},"end":{"line":27,"column":9}}],"line":25},"4":{"loc":{"start":{"line":42,"column":2},"end":{"line":60,"column":3}},"type":"if","locations":[{"start":{"line":42,"column":2},"end":{"line":60,"column":3}},{"start":{"line":42,"column":2},"end":{"line":60,"column":3}}],"line":42},"5":{"loc":{"start":{"line":44,"column":6},"end":{"line":54,"column":45}},"type":"binary-expr","locations":[{"start":{"line":44,"column":6},"end":{"line":44,"column":17}},{"start":{"line":45,"column":7},"end":{"line":49,"column":19}},{"start":{"line":50,"column":6},"end":{"line":50,"column":21}},{"start":{"line":51,"column":7},"end":{"line":51,"column":64}},{"start":{"line":52,"column":6},"end":{"line":52,"column":18}},{"start":{"line":53,"column":7},"end":{"line":53,"column":60}},{"start":{"line":54,"column":6},"end":{"line":54,"column":45}}],"line":44},"6":{"loc":{"start":{"line":45,"column":7},"end":{"line":49,"column":19}},"type":"cond-expr","locations":[{"start":{"line":46,"column":10},"end":{"line":48,"column":28}},{"start":{"line":49,"column":10},"end":{"line":49,"column":19}}],"line":45},"7":{"loc":{"start":{"line":46,"column":10},"end":{"line":48,"column":28}},"type":"cond-expr","locations":[{"start":{"line":47,"column":12},"end":{"line":47,"column":51}},{"start":{"line":48,"column":12},"end":{"line":48,"column":28}}],"line":46},"8":{"loc":{"start":{"line":51,"column":7},"end":{"line":51,"column":64}},"type":"cond-expr","locations":[{"start":{"line":51,"column":28},"end":{"line":51,"column":52}},{"start":{"line":51,"column":55},"end":{"line":51,"column":64}}],"line":51},"9":{"loc":{"start":{"line":53,"column":7},"end":{"line":53,"column":60}},"type":"cond-expr","locations":[{"start":{"line":53,"column":24},"end":{"line":53,"column":48}},{"start":{"line":53,"column":51},"end":{"line":53,"column":60}}],"line":53},"10":{"loc":{"start":{"line":57,"column":6},"end":{"line":59,"column":45}},"type":"binary-expr","locations":[{"start":{"line":57,"column":7},"end":{"line":57,"column":64}},{"start":{"line":58,"column":7},"end":{"line":58,"column":60}},{"start":{"line":59,"column":6},"end":{"line":59,"column":45}}],"line":57},"11":{"loc":{"start":{"line":57,"column":7},"end":{"line":57,"column":64}},"type":"cond-expr","locations":[{"start":{"line":57,"column":28},"end":{"line":57,"column":52}},{"start":{"line":57,"column":55},"end":{"line":57,"column":64}}],"line":57},"12":{"loc":{"start":{"line":58,"column":7},"end":{"line":58,"column":60}},"type":"cond-expr","locations":[{"start":{"line":58,"column":24},"end":{"line":58,"column":48}},{"start":{"line":58,"column":51},"end":{"line":58,"column":60}}],"line":58},"13":{"loc":{"start":{"line":75,"column":20},"end":{"line":75,"column":73}},"type":"cond-expr","locations":[{"start":{"line":75,"column":37},"end":{"line":75,"column":51}},{"start":{"line":75,"column":54},"end":{"line":75,"column":73}}],"line":75},"14":{"loc":{"start":{"line":97,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":97,"column":2},"end":{"line":103,"column":3}},{"start":{"line":97,"column":2},"end":{"line":103,"column":3}}],"line":97},"15":{"loc":{"start":{"line":99,"column":6},"end":{"line":101,"column":7}},"type":"if","locations":[{"start":{"line":99,"column":6},"end":{"line":101,"column":7}},{"start":{"line":99,"column":6},"end":{"line":101,"column":7}}],"line":99},"16":{"loc":{"start":{"line":109,"column":4},"end":{"line":117,"column":5}},"type":"if","locations":[{"start":{"line":109,"column":4},"end":{"line":117,"column":5}},{"start":{"line":109,"column":4},"end":{"line":117,"column":5}}],"line":109},"17":{"loc":{"start":{"line":110,"column":6},"end":{"line":114,"column":19}},"type":"cond-expr","locations":[{"start":{"line":111,"column":10},"end":{"line":113,"column":21}},{"start":{"line":114,"column":10},"end":{"line":114,"column":19}}],"line":110},"18":{"loc":{"start":{"line":111,"column":10},"end":{"line":113,"column":21}},"type":"cond-expr","locations":[{"start":{"line":112,"column":12},"end":{"line":112,"column":32}},{"start":{"line":113,"column":12},"end":{"line":113,"column":21}}],"line":111},"19":{"loc":{"start":{"line":137,"column":4},"end":{"line":145,"column":7}},"type":"binary-expr","locations":[{"start":{"line":137,"column":5},"end":{"line":141,"column":17}},{"start":{"line":142,"column":6},"end":{"line":145,"column":7}}],"line":137},"20":{"loc":{"start":{"line":137,"column":5},"end":{"line":141,"column":17}},"type":"cond-expr","locations":[{"start":{"line":138,"column":8},"end":{"line":140,"column":32}},{"start":{"line":141,"column":8},"end":{"line":141,"column":17}}],"line":137},"21":{"loc":{"start":{"line":138,"column":8},"end":{"line":140,"column":32}},"type":"cond-expr","locations":[{"start":{"line":139,"column":10},"end":{"line":139,"column":19}},{"start":{"line":140,"column":10},"end":{"line":140,"column":32}}],"line":138},"22":{"loc":{"start":{"line":144,"column":8},"end":{"line":144,"column":57}},"type":"binary-expr","locations":[{"start":{"line":144,"column":8},"end":{"line":144,"column":51}},{"start":{"line":144,"column":55},"end":{"line":144,"column":57}}],"line":144},"23":{"loc":{"start":{"line":149,"column":4},"end":{"line":157,"column":7}},"type":"binary-expr","locations":[{"start":{"line":149,"column":5},"end":{"line":153,"column":17}},{"start":{"line":154,"column":6},"end":{"line":157,"column":7}}],"line":149},"24":{"loc":{"start":{"line":149,"column":5},"end":{"line":153,"column":17}},"type":"cond-expr","locations":[{"start":{"line":150,"column":8},"end":{"line":152,"column":32}},{"start":{"line":153,"column":8},"end":{"line":153,"column":17}}],"line":149},"25":{"loc":{"start":{"line":150,"column":8},"end":{"line":152,"column":32}},"type":"cond-expr","locations":[{"start":{"line":151,"column":10},"end":{"line":151,"column":19}},{"start":{"line":152,"column":10},"end":{"line":152,"column":32}}],"line":150},"26":{"loc":{"start":{"line":156,"column":8},"end":{"line":156,"column":57}},"type":"binary-expr","locations":[{"start":{"line":156,"column":8},"end":{"line":156,"column":51}},{"start":{"line":156,"column":55},"end":{"line":156,"column":57}}],"line":156},"27":{"loc":{"start":{"line":162,"column":25},"end":{"line":162,"column":74}},"type":"binary-expr","locations":[{"start":{"line":162,"column":25},"end":{"line":162,"column":68}},{"start":{"line":162,"column":72},"end":{"line":162,"column":74}}],"line":162},"28":{"loc":{"start":{"line":181,"column":2},"end":{"line":183,"column":3}},"type":"if","locations":[{"start":{"line":181,"column":2},"end":{"line":183,"column":3}},{"start":{"line":181,"column":2},"end":{"line":183,"column":3}}],"line":181},"29":{"loc":{"start":{"line":197,"column":28},"end":{"line":201,"column":17}},"type":"cond-expr","locations":[{"start":{"line":198,"column":8},"end":{"line":200,"column":19}},{"start":{"line":201,"column":8},"end":{"line":201,"column":17}}],"line":197},"30":{"loc":{"start":{"line":198,"column":8},"end":{"line":200,"column":19}},"type":"cond-expr","locations":[{"start":{"line":199,"column":10},"end":{"line":199,"column":33}},{"start":{"line":200,"column":10},"end":{"line":200,"column":19}}],"line":198},"31":{"loc":{"start":{"line":202,"column":31},"end":{"line":206,"column":17}},"type":"cond-expr","locations":[{"start":{"line":203,"column":8},"end":{"line":205,"column":19}},{"start":{"line":206,"column":8},"end":{"line":206,"column":17}}],"line":202},"32":{"loc":{"start":{"line":203,"column":8},"end":{"line":205,"column":19}},"type":"cond-expr","locations":[{"start":{"line":204,"column":10},"end":{"line":204,"column":36}},{"start":{"line":205,"column":10},"end":{"line":205,"column":19}}],"line":203},"33":{"loc":{"start":{"line":207,"column":4},"end":{"line":228,"column":5}},"type":"if","locations":[{"start":{"line":207,"column":4},"end":{"line":228,"column":5}},{"start":{"line":207,"column":4},"end":{"line":228,"column":5}}],"line":207},"34":{"loc":{"start":{"line":207,"column":8},"end":{"line":207,"column":45}},"type":"binary-expr","locations":[{"start":{"line":207,"column":8},"end":{"line":207,"column":23}},{"start":{"line":207,"column":27},"end":{"line":207,"column":45}}],"line":207},"35":{"loc":{"start":{"line":208,"column":6},"end":{"line":227,"column":7}},"type":"if","locations":[{"start":{"line":208,"column":6},"end":{"line":227,"column":7}},{"start":{"line":208,"column":6},"end":{"line":227,"column":7}}],"line":208},"36":{"loc":{"start":{"line":219,"column":8},"end":{"line":224,"column":9}},"type":"if","locations":[{"start":{"line":219,"column":8},"end":{"line":224,"column":9}},{"start":{"line":219,"column":8},"end":{"line":224,"column":9}}],"line":219},"37":{"loc":{"start":{"line":220,"column":10},"end":{"line":221,"column":70}},"type":"binary-expr","locations":[{"start":{"line":220,"column":10},"end":{"line":220,"column":59}},{"start":{"line":221,"column":10},"end":{"line":221,"column":70}}],"line":220},"38":{"loc":{"start":{"line":225,"column":13},"end":{"line":227,"column":7}},"type":"if","locations":[{"start":{"line":225,"column":13},"end":{"line":227,"column":7}},{"start":{"line":225,"column":13},"end":{"line":227,"column":7}}],"line":225},"39":{"loc":{"start":{"line":235,"column":28},"end":{"line":239,"column":17}},"type":"cond-expr","locations":[{"start":{"line":236,"column":8},"end":{"line":238,"column":19}},{"start":{"line":239,"column":8},"end":{"line":239,"column":17}}],"line":235},"40":{"loc":{"start":{"line":236,"column":8},"end":{"line":238,"column":19}},"type":"cond-expr","locations":[{"start":{"line":237,"column":10},"end":{"line":237,"column":34}},{"start":{"line":238,"column":10},"end":{"line":238,"column":19}}],"line":236},"41":{"loc":{"start":{"line":240,"column":32},"end":{"line":244,"column":17}},"type":"cond-expr","locations":[{"start":{"line":241,"column":8},"end":{"line":243,"column":19}},{"start":{"line":244,"column":8},"end":{"line":244,"column":17}}],"line":240},"42":{"loc":{"start":{"line":241,"column":8},"end":{"line":243,"column":19}},"type":"cond-expr","locations":[{"start":{"line":242,"column":10},"end":{"line":242,"column":38}},{"start":{"line":243,"column":10},"end":{"line":243,"column":19}}],"line":241},"43":{"loc":{"start":{"line":245,"column":4},"end":{"line":256,"column":5}},"type":"if","locations":[{"start":{"line":245,"column":4},"end":{"line":256,"column":5}},{"start":{"line":245,"column":4},"end":{"line":256,"column":5}}],"line":245},"44":{"loc":{"start":{"line":245,"column":8},"end":{"line":245,"column":46}},"type":"binary-expr","locations":[{"start":{"line":245,"column":8},"end":{"line":245,"column":23}},{"start":{"line":245,"column":27},"end":{"line":245,"column":46}}],"line":245},"45":{"loc":{"start":{"line":246,"column":6},"end":{"line":255,"column":7}},"type":"if","locations":[{"start":{"line":246,"column":6},"end":{"line":255,"column":7}},{"start":{"line":246,"column":6},"end":{"line":255,"column":7}}],"line":246},"46":{"loc":{"start":{"line":247,"column":8},"end":{"line":252,"column":9}},"type":"if","locations":[{"start":{"line":247,"column":8},"end":{"line":252,"column":9}},{"start":{"line":247,"column":8},"end":{"line":252,"column":9}}],"line":247},"47":{"loc":{"start":{"line":248,"column":10},"end":{"line":249,"column":70}},"type":"binary-expr","locations":[{"start":{"line":248,"column":10},"end":{"line":248,"column":59}},{"start":{"line":249,"column":10},"end":{"line":249,"column":70}}],"line":248},"48":{"loc":{"start":{"line":253,"column":13},"end":{"line":255,"column":7}},"type":"if","locations":[{"start":{"line":253,"column":13},"end":{"line":255,"column":7}},{"start":{"line":253,"column":13},"end":{"line":255,"column":7}}],"line":253},"49":{"loc":{"start":{"line":264,"column":4},"end":{"line":264,"column":67}},"type":"cond-expr","locations":[{"start":{"line":264,"column":35},"end":{"line":264,"column":55}},{"start":{"line":264,"column":58},"end":{"line":264,"column":67}}],"line":264},"50":{"loc":{"start":{"line":272,"column":4},"end":{"line":276,"column":23}},"type":"cond-expr","locations":[{"start":{"line":273,"column":8},"end":{"line":275,"column":25}},{"start":{"line":276,"column":8},"end":{"line":276,"column":23}}],"line":272},"51":{"loc":{"start":{"line":273,"column":8},"end":{"line":275,"column":25}},"type":"cond-expr","locations":[{"start":{"line":274,"column":10},"end":{"line":274,"column":30}},{"start":{"line":275,"column":10},"end":{"line":275,"column":25}}],"line":273},"52":{"loc":{"start":{"line":280,"column":25},"end":{"line":280,"column":74}},"type":"binary-expr","locations":[{"start":{"line":280,"column":25},"end":{"line":280,"column":68}},{"start":{"line":280,"column":72},"end":{"line":280,"column":74}}],"line":280},"53":{"loc":{"start":{"line":286,"column":34},"end":{"line":286,"column":58}},"type":"binary-expr","locations":[{"start":{"line":286,"column":34},"end":{"line":286,"column":52}},{"start":{"line":286,"column":56},"end":{"line":286,"column":58}}],"line":286},"54":{"loc":{"start":{"line":294,"column":2},"end":{"line":300,"column":3}},"type":"if","locations":[{"start":{"line":294,"column":2},"end":{"line":300,"column":3}},{"start":{"line":294,"column":2},"end":{"line":300,"column":3}}],"line":294},"55":{"loc":{"start":{"line":294,"column":6},"end":{"line":294,"column":53}},"type":"binary-expr","locations":[{"start":{"line":294,"column":6},"end":{"line":294,"column":22}},{"start":{"line":294,"column":26},"end":{"line":294,"column":53}}],"line":294},"56":{"loc":{"start":{"line":310,"column":2},"end":{"line":315,"column":3}},"type":"if","locations":[{"start":{"line":310,"column":2},"end":{"line":315,"column":3}},{"start":{"line":310,"column":2},"end":{"line":315,"column":3}}],"line":310},"57":{"loc":{"start":{"line":319,"column":2},"end":{"line":333,"column":3}},"type":"switch","locations":[{"start":{"line":320,"column":4},"end":{"line":324,"column":12}},{"start":{"line":325,"column":4},"end":{"line":329,"column":12}},{"start":{"line":330,"column":4},"end":{"line":332,"column":63}}],"line":319},"58":{"loc":{"start":{"line":340,"column":2},"end":{"line":343,"column":3}},"type":"if","locations":[{"start":{"line":340,"column":2},"end":{"line":343,"column":3}},{"start":{"line":340,"column":2},"end":{"line":343,"column":3}}],"line":340},"59":{"loc":{"start":{"line":340,"column":6},"end":{"line":340,"column":50}},"type":"binary-expr","locations":[{"start":{"line":340,"column":6},"end":{"line":340,"column":28}},{"start":{"line":340,"column":32},"end":{"line":340,"column":50}}],"line":340},"60":{"loc":{"start":{"line":348,"column":8},"end":{"line":355,"column":9}},"type":"if","locations":[{"start":{"line":348,"column":8},"end":{"line":355,"column":9}},{"start":{"line":348,"column":8},"end":{"line":355,"column":9}}],"line":348},"61":{"loc":{"start":{"line":365,"column":10},"end":{"line":369,"column":17}},"type":"cond-expr","locations":[{"start":{"line":366,"column":14},"end":{"line":366,"column":35}},{"start":{"line":367,"column":14},"end":{"line":369,"column":17}}],"line":365},"62":{"loc":{"start":{"line":367,"column":14},"end":{"line":369,"column":17}},"type":"cond-expr","locations":[{"start":{"line":368,"column":14},"end":{"line":368,"column":24}},{"start":{"line":369,"column":14},"end":{"line":369,"column":17}}],"line":367},"63":{"loc":{"start":{"line":370,"column":10},"end":{"line":370,"column":69}},"type":"binary-expr","locations":[{"start":{"line":370,"column":10},"end":{"line":370,"column":23}},{"start":{"line":370,"column":27},"end":{"line":370,"column":69}}],"line":370}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":6,"6":6,"7":26,"8":26,"9":16,"10":4,"11":10,"12":6,"13":6,"14":4,"15":4,"16":4,"17":0,"18":4,"19":4,"20":4,"21":4,"22":4,"23":4,"24":4,"25":4,"26":4,"27":4,"28":4,"29":4,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":4,"39":8,"40":4,"41":2,"42":2,"43":2,"44":2,"45":2,"46":2,"47":2,"48":2,"49":2,"50":2,"51":2,"52":3,"53":3,"54":3,"55":3,"56":1,"57":2,"58":2,"59":2,"60":2,"61":2,"62":6,"63":6,"64":6,"65":2,"66":2,"67":2,"68":2,"69":2,"70":0,"71":0,"72":2,"73":2,"74":4,"75":4,"76":4,"77":2,"78":2,"79":2,"80":0,"81":0,"82":2,"83":2,"84":2,"85":2,"86":2,"87":2,"88":2,"89":2,"90":2,"91":2,"92":2,"93":0,"94":8,"95":8,"96":8,"97":8,"98":8,"99":1,"100":7,"101":7,"102":7,"103":2,"104":2,"105":2,"106":2,"107":3,"108":2,"109":2,"110":2,"111":2,"112":2,"113":4,"114":4,"115":4,"116":1,"117":1,"118":0,"119":0,"120":1,"121":2,"122":2,"123":0,"124":2,"125":1,"126":1,"127":1},"f":{"0":6,"1":26,"2":4,"3":4,"4":0,"5":0,"6":0,"7":4,"8":8,"9":2,"10":3,"11":6,"12":4,"13":8,"14":1,"15":2},"b":{"0":[26,0],"1":[16,10],"2":[26,16],"3":[4,12],"4":[4,0],"5":[4,0,0,0,0,0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0,0],"11":[0,0],"12":[0,0],"13":[4,0],"14":[0,0],"15":[0,0],"16":[4,4],"17":[4,4],"18":[4,0],"19":[2,0],"20":[2,0],"21":[0,2],"22":[0,0],"23":[2,0],"24":[2,0],"25":[0,2],"26":[0,0],"27":[2,0],"28":[1,2],"29":[2,4],"30":[2,0],"31":[2,4],"32":[2,0],"33":[2,4],"34":[6,2],"35":[2,0],"36":[2,0],"37":[2,2],"38":[0,0],"39":[2,2],"40":[2,0],"41":[2,2],"42":[2,0],"43":[2,2],"44":[4,2],"45":[2,0],"46":[2,0],"47":[2,2],"48":[0,0],"49":[2,0],"50":[2,0],"51":[2,0],"52":[2,0],"53":[2,0],"54":[2,0],"55":[2,2],"56":[1,7],"57":[2,3,2],"58":[0,1],"59":[1,1],"60":[0,2],"61":[1,0],"62":[0,0],"63":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"2f417f8ff775ed683e6789c0eaff97bf388f44a9"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\snapchat_conversion\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\snapchat_conversion\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":17},"end":{"line":3,"column":56}},"2":{"start":{"line":4,"column":23},"end":{"line":4,"column":27}},"3":{"start":{"line":6,"column":23},"end":{"line":30,"column":1}},"4":{"start":{"line":32,"column":25},"end":{"line":74,"column":1}},"5":{"start":{"line":76,"column":22},"end":{"line":76,"column":65}},"6":{"start":{"line":78,"column":0},"end":{"line":85,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"b08eb23e741c80b001ce8a2167ff304b08606cc6"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\snapchat_conversion\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\snapchat_conversion\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":19},"end":{"line":2,"column":40}},"2":{"start":{"line":3,"column":22},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":15},"end":{"line":4,"column":32}},"4":{"start":{"line":5,"column":22},"end":{"line":5,"column":51}},"5":{"start":{"line":17,"column":4},"end":{"line":17,"column":25}},"6":{"start":{"line":24,"column":4},"end":{"line":24,"column":23}},"7":{"start":{"line":33,"column":4},"end":{"line":33,"column":21}},"8":{"start":{"line":36,"column":14},"end":{"line":36,"column":35}},"9":{"start":{"line":37,"column":2},"end":{"line":39,"column":3}},"10":{"start":{"line":38,"column":4},"end":{"line":38,"column":71}},"11":{"start":{"line":40,"column":2},"end":{"line":40,"column":44}},"12":{"start":{"line":42,"column":48},"end":{"line":42,"column":54}},"13":{"start":{"line":43,"column":16},"end":{"line":43,"column":39}},"14":{"start":{"line":44,"column":28},"end":{"line":44,"column":68}},"15":{"start":{"line":45,"column":2},"end":{"line":54,"column":3}},"16":{"start":{"line":49,"column":4},"end":{"line":51,"column":47}},"17":{"start":{"line":53,"column":4},"end":{"line":53,"column":36}},"18":{"start":{"line":56,"column":2},"end":{"line":64,"column":3}},"19":{"start":{"line":60,"column":4},"end":{"line":63,"column":6}},"20":{"start":{"line":66,"column":2},"end":{"line":74,"column":3}},"21":{"start":{"line":67,"column":4},"end":{"line":73,"column":5}},"22":{"start":{"line":68,"column":6},"end":{"line":68,"column":79}},"23":{"start":{"line":70,"column":6},"end":{"line":72,"column":8}},"24":{"start":{"line":76,"column":2},"end":{"line":182,"column":3}},"25":{"start":{"line":80,"column":4},"end":{"line":176,"column":5}},"26":{"start":{"line":83,"column":8},"end":{"line":86,"column":10}},"27":{"start":{"line":87,"column":8},"end":{"line":87,"column":67}},"28":{"start":{"line":88,"column":8},"end":{"line":88,"column":14}},"29":{"start":{"line":90,"column":8},"end":{"line":93,"column":10}},"30":{"start":{"line":94,"column":8},"end":{"line":94,"column":67}},"31":{"start":{"line":95,"column":8},"end":{"line":95,"column":47}},"32":{"start":{"line":96,"column":8},"end":{"line":96,"column":45}},"33":{"start":{"line":97,"column":8},"end":{"line":97,"column":14}},"34":{"start":{"line":100,"column":8},"end":{"line":103,"column":10}},"35":{"start":{"line":104,"column":8},"end":{"line":104,"column":67}},"36":{"start":{"line":105,"column":8},"end":{"line":105,"column":14}},"37":{"start":{"line":107,"column":8},"end":{"line":110,"column":10}},"38":{"start":{"line":111,"column":8},"end":{"line":111,"column":67}},"39":{"start":{"line":112,"column":8},"end":{"line":112,"column":14}},"40":{"start":{"line":115,"column":8},"end":{"line":118,"column":10}},"41":{"start":{"line":119,"column":8},"end":{"line":119,"column":67}},"42":{"start":{"line":120,"column":8},"end":{"line":120,"column":14}},"43":{"start":{"line":122,"column":8},"end":{"line":125,"column":10}},"44":{"start":{"line":126,"column":8},"end":{"line":126,"column":67}},"45":{"start":{"line":127,"column":8},"end":{"line":127,"column":47}},"46":{"start":{"line":128,"column":8},"end":{"line":128,"column":45}},"47":{"start":{"line":129,"column":8},"end":{"line":129,"column":14}},"48":{"start":{"line":131,"column":8},"end":{"line":134,"column":10}},"49":{"start":{"line":135,"column":8},"end":{"line":135,"column":67}},"50":{"start":{"line":136,"column":8},"end":{"line":136,"column":14}},"51":{"start":{"line":138,"column":8},"end":{"line":141,"column":10}},"52":{"start":{"line":142,"column":8},"end":{"line":142,"column":67}},"53":{"start":{"line":143,"column":8},"end":{"line":143,"column":47}},"54":{"start":{"line":144,"column":8},"end":{"line":144,"column":45}},"55":{"start":{"line":145,"column":8},"end":{"line":145,"column":14}},"56":{"start":{"line":147,"column":8},"end":{"line":150,"column":10}},"57":{"start":{"line":151,"column":8},"end":{"line":151,"column":67}},"58":{"start":{"line":152,"column":8},"end":{"line":152,"column":14}},"59":{"start":{"line":155,"column":8},"end":{"line":158,"column":10}},"60":{"start":{"line":159,"column":8},"end":{"line":159,"column":67}},"61":{"start":{"line":160,"column":8},"end":{"line":160,"column":14}},"62":{"start":{"line":163,"column":8},"end":{"line":166,"column":10}},"63":{"start":{"line":167,"column":8},"end":{"line":167,"column":67}},"64":{"start":{"line":168,"column":8},"end":{"line":168,"column":14}},"65":{"start":{"line":170,"column":8},"end":{"line":173,"column":10}},"66":{"start":{"line":174,"column":8},"end":{"line":174,"column":67}},"67":{"start":{"line":175,"column":8},"end":{"line":175,"column":14}},"68":{"start":{"line":178,"column":4},"end":{"line":181,"column":6}},"69":{"start":{"line":184,"column":2},"end":{"line":186,"column":3}},"70":{"start":{"line":185,"column":4},"end":{"line":185,"column":53}},"71":{"start":{"line":188,"column":2},"end":{"line":193,"column":4}},"72":{"start":{"line":194,"column":2},"end":{"line":198,"column":4}},"73":{"start":{"line":199,"column":2},"end":{"line":199,"column":78}},"74":{"start":{"line":200,"column":2},"end":{"line":202,"column":4}},"75":{"start":{"line":203,"column":2},"end":{"line":208,"column":7}},"76":{"start":{"line":210,"column":2},"end":{"line":220,"column":3}},"77":{"start":{"line":216,"column":4},"end":{"line":219,"column":6}},"78":{"start":{"line":221,"column":2},"end":{"line":221,"column":69}},"79":{"start":{"line":222,"column":20},"end":{"line":222,"column":37}},"80":{"start":{"line":223,"column":2},"end":{"line":234,"column":3}},"81":{"start":{"line":224,"column":18},"end":{"line":224,"column":60}},"82":{"start":{"line":225,"column":20},"end":{"line":225,"column":53}},"83":{"start":{"line":227,"column":21},"end":{"line":227,"column":77}},"84":{"start":{"line":228,"column":4},"end":{"line":233,"column":5}},"85":{"start":{"line":229,"column":6},"end":{"line":232,"column":8}},"86":{"start":{"line":235,"column":2},"end":{"line":235,"column":46}},"87":{"start":{"line":236,"column":2},"end":{"line":240,"column":3}},"88":{"start":{"line":237,"column":4},"end":{"line":239,"column":21}},"89":{"start":{"line":242,"column":2},"end":{"line":242,"column":54}},"90":{"start":{"line":243,"column":2},"end":{"line":246,"column":3}},"91":{"start":{"line":244,"column":4},"end":{"line":244,"column":31}},"92":{"start":{"line":245,"column":4},"end":{"line":245,"column":68}},"93":{"start":{"line":247,"column":2},"end":{"line":250,"column":3}},"94":{"start":{"line":248,"column":4},"end":{"line":248,"column":36}},"95":{"start":{"line":249,"column":4},"end":{"line":249,"column":27}},"96":{"start":{"line":251,"column":2},"end":{"line":253,"column":3}},"97":{"start":{"line":252,"column":4},"end":{"line":252,"column":31}},"98":{"start":{"line":255,"column":2},"end":{"line":255,"column":50}},"99":{"start":{"line":258,"column":19},"end":{"line":258,"column":41}},"100":{"start":{"line":259,"column":2},"end":{"line":259,"column":31}},"101":{"start":{"line":260,"column":2},"end":{"line":263,"column":4}},"102":{"start":{"line":264,"column":2},"end":{"line":264,"column":59}},"103":{"start":{"line":265,"column":2},"end":{"line":265,"column":61}},"104":{"start":{"line":266,"column":2},"end":{"line":266,"column":18}},"105":{"start":{"line":270,"column":35},"end":{"line":270,"column":40}},"106":{"start":{"line":272,"column":2},"end":{"line":277,"column":3}},"107":{"start":{"line":273,"column":4},"end":{"line":276,"column":6}},"108":{"start":{"line":279,"column":22},"end":{"line":279,"column":48}},"109":{"start":{"line":281,"column":2},"end":{"line":287,"column":3}},"110":{"start":{"line":283,"column":6},"end":{"line":283,"column":60}},"111":{"start":{"line":284,"column":6},"end":{"line":284,"column":12}},"112":{"start":{"line":286,"column":6},"end":{"line":286,"column":78}},"113":{"start":{"line":288,"column":2},"end":{"line":288,"column":18}},"114":{"start":{"line":292,"column":30},"end":{"line":292,"column":32}},"115":{"start":{"line":295,"column":2},"end":{"line":334,"column":5}},"116":{"start":{"line":296,"column":30},"end":{"line":296,"column":32}},"117":{"start":{"line":297,"column":21},"end":{"line":297,"column":23}},"118":{"start":{"line":301,"column":28},"end":{"line":301,"column":36}},"119":{"start":{"line":302,"column":23},"end":{"line":302,"column":41}},"120":{"start":{"line":304,"column":29},"end":{"line":304,"column":56}},"121":{"start":{"line":307,"column":4},"end":{"line":310,"column":7}},"122":{"start":{"line":308,"column":6},"end":{"line":308,"column":51}},"123":{"start":{"line":309,"column":6},"end":{"line":309,"column":33}},"124":{"start":{"line":312,"column":4},"end":{"line":314,"column":6}},"125":{"start":{"line":316,"column":4},"end":{"line":316,"column":58}},"126":{"start":{"line":317,"column":4},"end":{"line":320,"column":6}},"127":{"start":{"line":321,"column":4},"end":{"line":325,"column":6}},"128":{"start":{"line":326,"column":4},"end":{"line":333,"column":6}},"129":{"start":{"line":336,"column":2},"end":{"line":336,"column":29}},"130":{"start":{"line":341,"column":2},"end":{"line":341,"column":26}},"131":{"start":{"line":344,"column":26},"end":{"line":405,"column":1}},"132":{"start":{"line":345,"column":2},"end":{"line":348,"column":3}},"133":{"start":{"line":346,"column":23},"end":{"line":346,"column":75}},"134":{"start":{"line":347,"column":4},"end":{"line":347,"column":24}},"135":{"start":{"line":350,"column":20},"end":{"line":350,"column":22}},"136":{"start":{"line":351,"column":22},"end":{"line":351,"column":24}},"137":{"start":{"line":352,"column":24},"end":{"line":352,"column":26}},"138":{"start":{"line":353,"column":2},"end":{"line":398,"column":4}},"139":{"start":{"line":355,"column":6},"end":{"line":396,"column":7}},"140":{"start":{"line":356,"column":8},"end":{"line":387,"column":9}},"141":{"start":{"line":358,"column":10},"end":{"line":358,"column":45}},"142":{"start":{"line":360,"column":10},"end":{"line":367,"column":11}},"143":{"start":{"line":365,"column":12},"end":{"line":365,"column":42}},"144":{"start":{"line":366,"column":12},"end":{"line":366,"column":29}},"145":{"start":{"line":370,"column":10},"end":{"line":377,"column":12}},"146":{"start":{"line":379,"column":10},"end":{"line":386,"column":11}},"147":{"start":{"line":384,"column":12},"end":{"line":384,"column":42}},"148":{"start":{"line":385,"column":12},"end":{"line":385,"column":29}},"149":{"start":{"line":389,"column":8},"end":{"line":395,"column":10}},"150":{"start":{"line":400,"column":28},"end":{"line":400,"column":30}},"151":{"start":{"line":401,"column":2},"end":{"line":403,"column":3}},"152":{"start":{"line":402,"column":4},"end":{"line":402,"column":51}},"153":{"start":{"line":404,"column":2},"end":{"line":404,"column":52}},"154":{"start":{"line":407,"column":0},"end":{"line":407,"column":48}}},"fnMap":{"0":{"name":"trackResponseBuilder","decl":{"start":{"line":35,"column":9},"end":{"line":35,"column":29}},"loc":{"start":{"line":35,"column":51},"end":{"line":267,"column":1}},"line":35},"1":{"name":"process","decl":{"start":{"line":269,"column":9},"end":{"line":269,"column":16}},"loc":{"start":{"line":269,"column":24},"end":{"line":289,"column":1}},"line":269},"2":{"name":"batchEvents","decl":{"start":{"line":291,"column":9},"end":{"line":291,"column":20}},"loc":{"start":{"line":291,"column":34},"end":{"line":337,"column":1}},"line":291},"3":{"name":"(anonymous_3)","decl":{"start":{"line":295,"column":22},"end":{"line":295,"column":23}},"loc":{"start":{"line":295,"column":31},"end":{"line":334,"column":3}},"line":295},"4":{"name":"(anonymous_4)","decl":{"start":{"line":307,"column":18},"end":{"line":307,"column":19}},"loc":{"start":{"line":307,"column":24},"end":{"line":310,"column":5}},"line":307},"5":{"name":"getEventChunks","decl":{"start":{"line":339,"column":9},"end":{"line":339,"column":23}},"loc":{"start":{"line":339,"column":44},"end":{"line":342,"column":1}},"line":339},"6":{"name":"(anonymous_6)","decl":{"start":{"line":344,"column":26},"end":{"line":344,"column":27}},"loc":{"start":{"line":344,"column":42},"end":{"line":405,"column":1}},"line":344},"7":{"name":"(anonymous_7)","decl":{"start":{"line":354,"column":15},"end":{"line":354,"column":16}},"loc":{"start":{"line":354,"column":39},"end":{"line":397,"column":5}},"line":354}},"branchMap":{"0":{"loc":{"start":{"line":37,"column":2},"end":{"line":39,"column":3}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":39,"column":3}},{"start":{"line":37,"column":2},"end":{"line":39,"column":3}}],"line":37},"1":{"loc":{"start":{"line":45,"column":2},"end":{"line":54,"column":3}},"type":"if","locations":[{"start":{"line":45,"column":2},"end":{"line":54,"column":3}},{"start":{"line":45,"column":2},"end":{"line":54,"column":3}}],"line":45},"2":{"loc":{"start":{"line":46,"column":4},"end":{"line":47,"column":42}},"type":"binary-expr","locations":[{"start":{"line":46,"column":4},"end":{"line":46,"column":54}},{"start":{"line":47,"column":4},"end":{"line":47,"column":42}}],"line":46},"3":{"loc":{"start":{"line":49,"column":26},"end":{"line":51,"column":46}},"type":"cond-expr","locations":[{"start":{"line":50,"column":8},"end":{"line":50,"column":58}},{"start":{"line":51,"column":8},"end":{"line":51,"column":46}}],"line":49},"4":{"loc":{"start":{"line":56,"column":2},"end":{"line":64,"column":3}},"type":"if","locations":[{"start":{"line":56,"column":2},"end":{"line":64,"column":3}},{"start":{"line":56,"column":2},"end":{"line":64,"column":3}}],"line":56},"5":{"loc":{"start":{"line":57,"column":4},"end":{"line":58,"column":12}},"type":"binary-expr","locations":[{"start":{"line":57,"column":5},"end":{"line":57,"column":34}},{"start":{"line":57,"column":38},"end":{"line":57,"column":71}},{"start":{"line":58,"column":4},"end":{"line":58,"column":12}}],"line":57},"6":{"loc":{"start":{"line":66,"column":2},"end":{"line":74,"column":3}},"type":"if","locations":[{"start":{"line":66,"column":2},"end":{"line":74,"column":3}},{"start":{"line":66,"column":2},"end":{"line":74,"column":3}}],"line":66},"7":{"loc":{"start":{"line":66,"column":6},"end":{"line":66,"column":67}},"type":"binary-expr","locations":[{"start":{"line":66,"column":6},"end":{"line":66,"column":42}},{"start":{"line":66,"column":46},"end":{"line":66,"column":67}}],"line":66},"8":{"loc":{"start":{"line":66,"column":48},"end":{"line":66,"column":66}},"type":"binary-expr","locations":[{"start":{"line":66,"column":48},"end":{"line":66,"column":53}},{"start":{"line":66,"column":57},"end":{"line":66,"column":66}}],"line":66},"9":{"loc":{"start":{"line":67,"column":4},"end":{"line":73,"column":5}},"type":"if","locations":[{"start":{"line":67,"column":4},"end":{"line":73,"column":5}},{"start":{"line":67,"column":4},"end":{"line":73,"column":5}}],"line":67},"10":{"loc":{"start":{"line":76,"column":2},"end":{"line":182,"column":3}},"type":"if","locations":[{"start":{"line":76,"column":2},"end":{"line":182,"column":3}},{"start":{"line":76,"column":2},"end":{"line":182,"column":3}}],"line":76},"11":{"loc":{"start":{"line":80,"column":4},"end":{"line":176,"column":5}},"type":"switch","locations":[{"start":{"line":82,"column":6},"end":{"line":88,"column":14}},{"start":{"line":89,"column":6},"end":{"line":97,"column":14}},{"start":{"line":99,"column":6},"end":{"line":105,"column":14}},{"start":{"line":106,"column":6},"end":{"line":112,"column":14}},{"start":{"line":114,"column":6},"end":{"line":120,"column":14}},{"start":{"line":121,"column":6},"end":{"line":129,"column":14}},{"start":{"line":130,"column":6},"end":{"line":136,"column":14}},{"start":{"line":137,"column":6},"end":{"line":145,"column":14}},{"start":{"line":146,"column":6},"end":{"line":152,"column":14}},{"start":{"line":154,"column":6},"end":{"line":160,"column":14}},{"start":{"line":162,"column":6},"end":{"line":168,"column":14}},{"start":{"line":169,"column":6},"end":{"line":175,"column":14}}],"line":80},"12":{"loc":{"start":{"line":184,"column":2},"end":{"line":186,"column":3}},"type":"if","locations":[{"start":{"line":184,"column":2},"end":{"line":186,"column":3}},{"start":{"line":184,"column":2},"end":{"line":186,"column":3}}],"line":184},"13":{"loc":{"start":{"line":210,"column":2},"end":{"line":220,"column":3}},"type":"if","locations":[{"start":{"line":210,"column":2},"end":{"line":220,"column":3}},{"start":{"line":210,"column":2},"end":{"line":220,"column":3}}],"line":210},"14":{"loc":{"start":{"line":211,"column":4},"end":{"line":214,"column":54}},"type":"binary-expr","locations":[{"start":{"line":211,"column":4},"end":{"line":211,"column":25}},{"start":{"line":212,"column":4},"end":{"line":212,"column":32}},{"start":{"line":213,"column":4},"end":{"line":213,"column":32}},{"start":{"line":214,"column":4},"end":{"line":214,"column":54}}],"line":211},"15":{"loc":{"start":{"line":214,"column":6},"end":{"line":214,"column":53}},"type":"binary-expr","locations":[{"start":{"line":214,"column":6},"end":{"line":214,"column":31}},{"start":{"line":214,"column":35},"end":{"line":214,"column":53}}],"line":214},"16":{"loc":{"start":{"line":223,"column":2},"end":{"line":234,"column":3}},"type":"if","locations":[{"start":{"line":223,"column":2},"end":{"line":234,"column":3}},{"start":{"line":223,"column":2},"end":{"line":234,"column":3}}],"line":223},"17":{"loc":{"start":{"line":228,"column":4},"end":{"line":233,"column":5}},"type":"if","locations":[{"start":{"line":228,"column":4},"end":{"line":233,"column":5}},{"start":{"line":228,"column":4},"end":{"line":233,"column":5}}],"line":228},"18":{"loc":{"start":{"line":236,"column":2},"end":{"line":240,"column":3}},"type":"if","locations":[{"start":{"line":236,"column":2},"end":{"line":240,"column":3}},{"start":{"line":236,"column":2},"end":{"line":240,"column":3}}],"line":236},"19":{"loc":{"start":{"line":243,"column":2},"end":{"line":246,"column":3}},"type":"if","locations":[{"start":{"line":243,"column":2},"end":{"line":246,"column":3}},{"start":{"line":243,"column":2},"end":{"line":246,"column":3}}],"line":243},"20":{"loc":{"start":{"line":247,"column":2},"end":{"line":250,"column":3}},"type":"if","locations":[{"start":{"line":247,"column":2},"end":{"line":250,"column":3}},{"start":{"line":247,"column":2},"end":{"line":250,"column":3}}],"line":247},"21":{"loc":{"start":{"line":251,"column":2},"end":{"line":253,"column":3}},"type":"if","locations":[{"start":{"line":251,"column":2},"end":{"line":253,"column":3}},{"start":{"line":251,"column":2},"end":{"line":253,"column":3}}],"line":251},"22":{"loc":{"start":{"line":272,"column":2},"end":{"line":277,"column":3}},"type":"if","locations":[{"start":{"line":272,"column":2},"end":{"line":277,"column":3}},{"start":{"line":272,"column":2},"end":{"line":277,"column":3}}],"line":272},"23":{"loc":{"start":{"line":281,"column":2},"end":{"line":287,"column":3}},"type":"switch","locations":[{"start":{"line":282,"column":4},"end":{"line":284,"column":12}},{"start":{"line":285,"column":4},"end":{"line":286,"column":78}}],"line":281},"24":{"loc":{"start":{"line":345,"column":2},"end":{"line":348,"column":3}},"type":"if","locations":[{"start":{"line":345,"column":2},"end":{"line":348,"column":3}},{"start":{"line":345,"column":2},"end":{"line":348,"column":3}}],"line":345},"25":{"loc":{"start":{"line":345,"column":6},"end":{"line":345,"column":50}},"type":"binary-expr","locations":[{"start":{"line":345,"column":6},"end":{"line":345,"column":28}},{"start":{"line":345,"column":32},"end":{"line":345,"column":50}}],"line":345},"26":{"loc":{"start":{"line":356,"column":8},"end":{"line":387,"column":9}},"type":"if","locations":[{"start":{"line":356,"column":8},"end":{"line":387,"column":9}},{"start":{"line":356,"column":8},"end":{"line":387,"column":9}}],"line":356},"27":{"loc":{"start":{"line":360,"column":10},"end":{"line":367,"column":11}},"type":"if","locations":[{"start":{"line":360,"column":10},"end":{"line":367,"column":11}},{"start":{"line":360,"column":10},"end":{"line":367,"column":11}}],"line":360},"28":{"loc":{"start":{"line":361,"column":12},"end":{"line":363,"column":42}},"type":"binary-expr","locations":[{"start":{"line":361,"column":12},"end":{"line":361,"column":30}},{"start":{"line":362,"column":13},"end":{"line":362,"column":49}},{"start":{"line":363,"column":14},"end":{"line":363,"column":41}}],"line":361},"29":{"loc":{"start":{"line":379,"column":10},"end":{"line":386,"column":11}},"type":"if","locations":[{"start":{"line":379,"column":10},"end":{"line":386,"column":11}},{"start":{"line":379,"column":10},"end":{"line":386,"column":11}}],"line":379},"30":{"loc":{"start":{"line":380,"column":12},"end":{"line":382,"column":42}},"type":"binary-expr","locations":[{"start":{"line":380,"column":12},"end":{"line":380,"column":30}},{"start":{"line":381,"column":13},"end":{"line":381,"column":49}},{"start":{"line":382,"column":14},"end":{"line":382,"column":41}}],"line":380},"31":{"loc":{"start":{"line":392,"column":12},"end":{"line":392,"column":56}},"type":"cond-expr","locations":[{"start":{"line":392,"column":29},"end":{"line":392,"column":50}},{"start":{"line":392,"column":53},"end":{"line":392,"column":56}}],"line":392},"32":{"loc":{"start":{"line":393,"column":12},"end":{"line":393,"column":71}},"type":"binary-expr","locations":[{"start":{"line":393,"column":12},"end":{"line":393,"column":25}},{"start":{"line":393,"column":29},"end":{"line":393,"column":71}}],"line":393},"33":{"loc":{"start":{"line":401,"column":2},"end":{"line":403,"column":3}},"type":"if","locations":[{"start":{"line":401,"column":2},"end":{"line":403,"column":3}},{"start":{"line":401,"column":2},"end":{"line":403,"column":3}}],"line":401}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":26,"9":26,"10":1,"11":25,"12":25,"13":25,"14":25,"15":25,"16":13,"17":12,"18":25,"19":1,"20":24,"21":2,"22":1,"23":1,"24":22,"25":22,"26":7,"27":7,"28":7,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":4,"41":4,"42":4,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":2,"52":2,"53":2,"54":2,"55":2,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":0,"63":0,"64":0,"65":2,"66":2,"67":2,"68":0,"69":22,"70":1,"71":22,"72":22,"73":22,"74":22,"75":22,"76":22,"77":0,"78":22,"79":22,"80":22,"81":22,"82":22,"83":22,"84":22,"85":0,"86":22,"87":22,"88":22,"89":22,"90":22,"91":3,"92":3,"93":22,"94":7,"95":7,"96":22,"97":12,"98":22,"99":22,"100":22,"101":22,"102":22,"103":22,"104":22,"105":27,"106":27,"107":0,"108":27,"109":27,"110":26,"111":22,"112":1,"113":22,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":3,"123":3,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":3,"131":1,"132":1,"133":0,"134":0,"135":1,"136":1,"137":1,"138":1,"139":3,"140":3,"141":0,"142":0,"143":0,"144":0,"145":3,"146":3,"147":1,"148":1,"149":0,"150":1,"151":1,"152":1,"153":1,"154":1},"f":{"0":26,"1":27,"2":1,"3":1,"4":3,"5":3,"6":1,"7":3},"b":{"0":[1,25],"1":[13,12],"2":[25,23],"3":[2,11],"4":[1,24],"5":[25,22,16],"6":[2,22],"7":[24,9],"8":[9,8],"9":[1,1],"10":[22,0],"11":[7,1,1,1,4,1,1,2,1,1,0,2],"12":[1,21],"13":[0,22],"14":[22,0,0,0],"15":[0,0],"16":[22,0],"17":[0,22],"18":[22,0],"19":[3,19],"20":[7,15],"21":[12,10],"22":[0,27],"23":[26,1],"24":[0,1],"25":[1,1],"26":[0,3],"27":[0,0],"28":[0,0,0],"29":[1,2],"30":[3,3,3],"31":[0,0],"32":[0,0],"33":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"159104fec1cc769ab29e8aaa9401805b142c80c3"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\snapchat_conversion\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\snapchat_conversion\\util.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":19},"end":{"line":3,"column":40}},"3":{"start":{"line":5,"column":32},"end":{"line":5,"column":53}},"4":{"start":{"line":7,"column":23},"end":{"line":12,"column":1}},"5":{"start":{"line":15,"column":15},"end":{"line":15,"column":34}},"6":{"start":{"line":16,"column":2},"end":{"line":16,"column":56}},"7":{"start":{"line":20,"column":2},"end":{"line":26,"column":3}},"8":{"start":{"line":21,"column":21},"end":{"line":21,"column":39}},"9":{"start":{"line":22,"column":4},"end":{"line":24,"column":5}},"10":{"start":{"line":23,"column":6},"end":{"line":23,"column":32}},"11":{"start":{"line":25,"column":4},"end":{"line":25,"column":22}},"12":{"start":{"line":29,"column":19},"end":{"line":29,"column":37}},"13":{"start":{"line":30,"column":20},"end":{"line":30,"column":63}},"14":{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},"15":{"start":{"line":32,"column":4},"end":{"line":32,"column":23}},"16":{"start":{"line":34,"column":20},"end":{"line":34,"column":24}},"17":{"start":{"line":35,"column":2},"end":{"line":48,"column":3}},"18":{"start":{"line":36,"column":4},"end":{"line":46,"column":5}},"19":{"start":{"line":36,"column":17},"end":{"line":36,"column":18}},"20":{"start":{"line":37,"column":6},"end":{"line":45,"column":7}},"21":{"start":{"line":38,"column":8},"end":{"line":38,"column":62}},"22":{"start":{"line":39,"column":8},"end":{"line":39,"column":12}},"23":{"start":{"line":40,"column":13},"end":{"line":45,"column":7}},"24":{"start":{"line":41,"column":8},"end":{"line":41,"column":62}},"25":{"start":{"line":42,"column":8},"end":{"line":42,"column":12}},"26":{"start":{"line":44,"column":8},"end":{"line":44,"column":28}},"27":{"start":{"line":47,"column":4},"end":{"line":47,"column":23}},"28":{"start":{"line":52,"column":14},"end":{"line":52,"column":62}},"29":{"start":{"line":54,"column":2},"end":{"line":60,"column":3}},"30":{"start":{"line":55,"column":4},"end":{"line":59,"column":5}},"31":{"start":{"line":56,"column":6},"end":{"line":56,"column":30}},"32":{"start":{"line":57,"column":11},"end":{"line":59,"column":5}},"33":{"start":{"line":58,"column":6},"end":{"line":58,"column":29}},"34":{"start":{"line":61,"column":2},"end":{"line":64,"column":3}},"35":{"start":{"line":62,"column":4},"end":{"line":62,"column":32}},"36":{"start":{"line":63,"column":4},"end":{"line":63,"column":27}},"37":{"start":{"line":68,"column":16},"end":{"line":68,"column":18}},"38":{"start":{"line":69,"column":19},"end":{"line":69,"column":54}},"39":{"start":{"line":70,"column":2},"end":{"line":81,"column":3}},"40":{"start":{"line":71,"column":4},"end":{"line":78,"column":7}},"41":{"start":{"line":72,"column":18},"end":{"line":72,"column":36}},"42":{"start":{"line":73,"column":6},"end":{"line":77,"column":7}},"43":{"start":{"line":74,"column":8},"end":{"line":74,"column":26}},"44":{"start":{"line":76,"column":8},"end":{"line":76,"column":77}},"45":{"start":{"line":80,"column":4},"end":{"line":80,"column":19}},"46":{"start":{"line":82,"column":2},"end":{"line":82,"column":17}},"47":{"start":{"line":85,"column":17},"end":{"line":85,"column":18}},"48":{"start":{"line":86,"column":19},"end":{"line":86,"column":54}},"49":{"start":{"line":87,"column":2},"end":{"line":96,"column":3}},"50":{"start":{"line":88,"column":4},"end":{"line":93,"column":7}},"51":{"start":{"line":89,"column":21},"end":{"line":89,"column":34}},"52":{"start":{"line":90,"column":6},"end":{"line":92,"column":7}},"53":{"start":{"line":91,"column":8},"end":{"line":91,"column":39}},"54":{"start":{"line":95,"column":4},"end":{"line":95,"column":20}},"55":{"start":{"line":97,"column":2},"end":{"line":97,"column":26}},"56":{"start":{"line":100,"column":0},"end":{"line":108,"column":2}}},"fnMap":{"0":{"name":"msUnixTimestamp","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":24}},"loc":{"start":{"line":14,"column":36},"end":{"line":17,"column":1}},"line":14},"1":{"name":"getHashedValue","decl":{"start":{"line":19,"column":9},"end":{"line":19,"column":23}},"loc":{"start":{"line":19,"column":36},"end":{"line":27,"column":1}},"line":19},"2":{"name":"getNormalizedPhoneNumber","decl":{"start":{"line":28,"column":9},"end":{"line":28,"column":33}},"loc":{"start":{"line":28,"column":43},"end":{"line":49,"column":1}},"line":28},"3":{"name":"getDataUseValue","decl":{"start":{"line":51,"column":9},"end":{"line":51,"column":24}},"loc":{"start":{"line":51,"column":34},"end":{"line":65,"column":1}},"line":51},"4":{"name":"getItemIds","decl":{"start":{"line":67,"column":9},"end":{"line":67,"column":19}},"loc":{"start":{"line":67,"column":29},"end":{"line":83,"column":1}},"line":67},"5":{"name":"(anonymous_5)","decl":{"start":{"line":71,"column":21},"end":{"line":71,"column":22}},"loc":{"start":{"line":71,"column":41},"end":{"line":78,"column":5}},"line":71},"6":{"name":"getPriceSum","decl":{"start":{"line":84,"column":9},"end":{"line":84,"column":20}},"loc":{"start":{"line":84,"column":30},"end":{"line":98,"column":1}},"line":84},"7":{"name":"(anonymous_7)","decl":{"start":{"line":88,"column":21},"end":{"line":88,"column":22}},"loc":{"start":{"line":88,"column":32},"end":{"line":93,"column":5}},"line":88}},"branchMap":{"0":{"loc":{"start":{"line":20,"column":2},"end":{"line":26,"column":3}},"type":"if","locations":[{"start":{"line":20,"column":2},"end":{"line":26,"column":3}},{"start":{"line":20,"column":2},"end":{"line":26,"column":3}}],"line":20},"1":{"loc":{"start":{"line":22,"column":4},"end":{"line":24,"column":5}},"type":"if","locations":[{"start":{"line":22,"column":4},"end":{"line":24,"column":5}},{"start":{"line":22,"column":4},"end":{"line":24,"column":5}}],"line":22},"2":{"loc":{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},"type":"if","locations":[{"start":{"line":31,"column":2},"end":{"line":33,"column":3}},{"start":{"line":31,"column":2},"end":{"line":33,"column":3}}],"line":31},"3":{"loc":{"start":{"line":35,"column":2},"end":{"line":48,"column":3}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":48,"column":3}},{"start":{"line":35,"column":2},"end":{"line":48,"column":3}}],"line":35},"4":{"loc":{"start":{"line":37,"column":6},"end":{"line":45,"column":7}},"type":"if","locations":[{"start":{"line":37,"column":6},"end":{"line":45,"column":7}},{"start":{"line":37,"column":6},"end":{"line":45,"column":7}}],"line":37},"5":{"loc":{"start":{"line":40,"column":13},"end":{"line":45,"column":7}},"type":"if","locations":[{"start":{"line":40,"column":13},"end":{"line":45,"column":7}},{"start":{"line":40,"column":13},"end":{"line":45,"column":7}}],"line":40},"6":{"loc":{"start":{"line":40,"column":17},"end":{"line":40,"column":54}},"type":"binary-expr","locations":[{"start":{"line":40,"column":17},"end":{"line":40,"column":39}},{"start":{"line":40,"column":43},"end":{"line":40,"column":54}}],"line":40},"7":{"loc":{"start":{"line":54,"column":2},"end":{"line":60,"column":3}},"type":"if","locations":[{"start":{"line":54,"column":2},"end":{"line":60,"column":3}},{"start":{"line":54,"column":2},"end":{"line":60,"column":3}}],"line":54},"8":{"loc":{"start":{"line":55,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":55,"column":4},"end":{"line":59,"column":5}},{"start":{"line":55,"column":4},"end":{"line":59,"column":5}}],"line":55},"9":{"loc":{"start":{"line":57,"column":11},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":57,"column":11},"end":{"line":59,"column":5}},{"start":{"line":57,"column":11},"end":{"line":59,"column":5}}],"line":57},"10":{"loc":{"start":{"line":61,"column":2},"end":{"line":64,"column":3}},"type":"if","locations":[{"start":{"line":61,"column":2},"end":{"line":64,"column":3}},{"start":{"line":61,"column":2},"end":{"line":64,"column":3}}],"line":61},"11":{"loc":{"start":{"line":70,"column":2},"end":{"line":81,"column":3}},"type":"if","locations":[{"start":{"line":70,"column":2},"end":{"line":81,"column":3}},{"start":{"line":70,"column":2},"end":{"line":81,"column":3}}],"line":70},"12":{"loc":{"start":{"line":70,"column":6},"end":{"line":70,"column":41}},"type":"binary-expr","locations":[{"start":{"line":70,"column":6},"end":{"line":70,"column":14}},{"start":{"line":70,"column":18},"end":{"line":70,"column":41}}],"line":70},"13":{"loc":{"start":{"line":73,"column":6},"end":{"line":77,"column":7}},"type":"if","locations":[{"start":{"line":73,"column":6},"end":{"line":77,"column":7}},{"start":{"line":73,"column":6},"end":{"line":77,"column":7}}],"line":73},"14":{"loc":{"start":{"line":87,"column":2},"end":{"line":96,"column":3}},"type":"if","locations":[{"start":{"line":87,"column":2},"end":{"line":96,"column":3}},{"start":{"line":87,"column":2},"end":{"line":96,"column":3}}],"line":87},"15":{"loc":{"start":{"line":87,"column":6},"end":{"line":87,"column":41}},"type":"binary-expr","locations":[{"start":{"line":87,"column":6},"end":{"line":87,"column":14}},{"start":{"line":87,"column":18},"end":{"line":87,"column":41}}],"line":87},"16":{"loc":{"start":{"line":90,"column":6},"end":{"line":92,"column":7}},"type":"if","locations":[{"start":{"line":90,"column":6},"end":{"line":92,"column":7}},{"start":{"line":90,"column":6},"end":{"line":92,"column":7}}],"line":90},"17":{"loc":{"start":{"line":90,"column":10},"end":{"line":90,"column":53}},"type":"binary-expr","locations":[{"start":{"line":90,"column":10},"end":{"line":90,"column":16}},{"start":{"line":90,"column":20},"end":{"line":90,"column":53}}],"line":90}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":22,"6":22,"7":110,"8":44,"9":44,"10":44,"11":0,"12":22,"13":22,"14":22,"15":0,"16":22,"17":22,"18":22,"19":22,"20":264,"21":66,"22":66,"23":198,"24":0,"25":0,"26":198,"27":22,"28":22,"29":22,"30":22,"31":22,"32":0,"33":0,"34":22,"35":0,"36":0,"37":4,"38":4,"39":4,"40":4,"41":8,"42":8,"43":8,"44":0,"45":0,"46":4,"47":4,"48":4,"49":4,"50":4,"51":8,"52":8,"53":8,"54":0,"55":4,"56":1},"f":{"0":22,"1":110,"2":22,"3":22,"4":4,"5":8,"6":4,"7":8},"b":{"0":[44,66],"1":[44,0],"2":[0,22],"3":[22,0],"4":[66,198],"5":[0,198],"6":[198,0],"7":[22,0],"8":[22,0],"9":[0,0],"10":[0,22],"11":[4,0],"12":[4,4],"13":[8,0],"14":[4,0],"15":[4,4],"16":[8,0],"17":[8,8]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"005b030d187628d83b5177ff700b323ed21443c9"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\snowflake\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\snowflake\\transform.js","statementMap":{"0":{"start":{"line":1,"column":36},"end":{"line":1,"column":65}},"1":{"start":{"line":3,"column":18},"end":{"line":3,"column":29}},"2":{"start":{"line":6,"column":2},"end":{"line":6,"column":51}},"3":{"start":{"line":10,"column":2},"end":{"line":12,"column":3}},"4":{"start":{"line":11,"column":4},"end":{"line":11,"column":18}},"5":{"start":{"line":13,"column":2},"end":{"line":13,"column":18}},"6":{"start":{"line":17,"column":26},"end":{"line":17,"column":69}},"7":{"start":{"line":18,"column":22},"end":{"line":18,"column":73}},"8":{"start":{"line":19,"column":23},"end":{"line":19,"column":71}},"9":{"start":{"line":20,"column":19},"end":{"line":20,"column":28}},"10":{"start":{"line":21,"column":2},"end":{"line":29,"column":5}},"11":{"start":{"line":32,"column":0},"end":{"line":35,"column":2}}},"fnMap":{"0":{"name":"processSingleMessage","decl":{"start":{"line":5,"column":9},"end":{"line":5,"column":29}},"loc":{"start":{"line":5,"column":48},"end":{"line":7,"column":1}},"line":5},"1":{"name":"getDataTypeOverride","decl":{"start":{"line":9,"column":9},"end":{"line":9,"column":28}},"loc":{"start":{"line":9,"column":48},"end":{"line":14,"column":1}},"line":9},"2":{"name":"process","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":16}},"loc":{"start":{"line":16,"column":24},"end":{"line":30,"column":1}},"line":16}},"branchMap":{"0":{"loc":{"start":{"line":10,"column":2},"end":{"line":12,"column":3}},"type":"if","locations":[{"start":{"line":10,"column":2},"end":{"line":12,"column":3}},{"start":{"line":10,"column":2},"end":{"line":12,"column":3}}],"line":10},"1":{"loc":{"start":{"line":17,"column":26},"end":{"line":17,"column":69}},"type":"binary-expr","locations":[{"start":{"line":17,"column":26},"end":{"line":17,"column":61}},{"start":{"line":17,"column":65},"end":{"line":17,"column":69}}],"line":17},"2":{"loc":{"start":{"line":18,"column":22},"end":{"line":18,"column":73}},"type":"binary-expr","locations":[{"start":{"line":18,"column":22},"end":{"line":18,"column":64}},{"start":{"line":18,"column":68},"end":{"line":18,"column":73}}],"line":18},"3":{"loc":{"start":{"line":28,"column":20},"end":{"line":28,"column":73}},"type":"cond-expr","locations":[{"start":{"line":28,"column":37},"end":{"line":28,"column":66}},{"start":{"line":28,"column":69},"end":{"line":28,"column":73}}],"line":28}},"s":{"0":3,"1":3,"2":124,"3":2917,"4":1,"5":2916,"6":124,"7":124,"8":124,"9":124,"10":124,"11":3},"f":{"0":124,"1":2917,"2":124},"b":{"0":[1,2916],"1":[124,0],"2":[124,124],"3":[6,118]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0afccdc292e8f8ffafe099909c28d0ece94e981e"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\tiktok_ads\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\tiktok_ads\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":4,"column":2},"end":{"line":4,"column":62}},"2":{"start":{"line":6,"column":2},"end":{"line":6,"column":62}},"3":{"start":{"line":7,"column":23},"end":{"line":7,"column":25}},"4":{"start":{"line":9,"column":23},"end":{"line":14,"column":1}},"5":{"start":{"line":16,"column":25},"end":{"line":31,"column":1}},"6":{"start":{"line":33,"column":22},"end":{"line":33,"column":65}},"7":{"start":{"line":35,"column":0},"end":{"line":41,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"eec237ea6a56f83af9b6e483818638c5024fdb2c"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\tiktok_ads\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\tiktok_ads\\transform.js","statementMap":{"0":{"start":{"line":2,"column":19},"end":{"line":2,"column":39}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":32}},"2":{"start":{"line":4,"column":12},"end":{"line":4,"column":32}},"3":{"start":{"line":5,"column":22},"end":{"line":5,"column":51}},"4":{"start":{"line":18,"column":4},"end":{"line":18,"column":25}},"5":{"start":{"line":25,"column":4},"end":{"line":25,"column":23}},"6":{"start":{"line":31,"column":19},"end":{"line":31,"column":56}},"7":{"start":{"line":33,"column":2},"end":{"line":33,"column":28}},"8":{"start":{"line":36,"column":29},"end":{"line":114,"column":1}},"9":{"start":{"line":37,"column":21},"end":{"line":37,"column":37}},"10":{"start":{"line":39,"column":14},"end":{"line":39,"column":35}},"11":{"start":{"line":40,"column":2},"end":{"line":40,"column":53}},"12":{"start":{"line":41,"column":2},"end":{"line":43,"column":3}},"13":{"start":{"line":42,"column":4},"end":{"line":42,"column":57}},"14":{"start":{"line":45,"column":2},"end":{"line":47,"column":3}},"15":{"start":{"line":46,"column":4},"end":{"line":46,"column":69}},"16":{"start":{"line":48,"column":2},"end":{"line":48,"column":34}},"17":{"start":{"line":50,"column":16},"end":{"line":50,"column":55}},"18":{"start":{"line":52,"column":21},"end":{"line":52,"column":74}},"19":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"20":{"start":{"line":54,"column":4},"end":{"line":54,"column":57}},"21":{"start":{"line":57,"column":17},"end":{"line":57,"column":60}},"22":{"start":{"line":60,"column":14},"end":{"line":60,"column":48}},"23":{"start":{"line":61,"column":2},"end":{"line":63,"column":3}},"24":{"start":{"line":62,"column":4},"end":{"line":62,"column":53}},"25":{"start":{"line":65,"column":21},"end":{"line":65,"column":62}},"26":{"start":{"line":66,"column":2},"end":{"line":68,"column":3}},"27":{"start":{"line":67,"column":4},"end":{"line":67,"column":60}},"28":{"start":{"line":70,"column":2},"end":{"line":70,"column":46}},"29":{"start":{"line":76,"column":2},"end":{"line":102,"column":3}},"30":{"start":{"line":77,"column":24},"end":{"line":77,"column":64}},"31":{"start":{"line":78,"column":4},"end":{"line":80,"column":5}},"32":{"start":{"line":79,"column":6},"end":{"line":79,"column":79}},"33":{"start":{"line":82,"column":4},"end":{"line":82,"column":47}},"34":{"start":{"line":83,"column":4},"end":{"line":87,"column":5}},"35":{"start":{"line":84,"column":6},"end":{"line":86,"column":19}},"36":{"start":{"line":89,"column":4},"end":{"line":89,"column":61}},"37":{"start":{"line":90,"column":4},"end":{"line":101,"column":5}},"38":{"start":{"line":91,"column":6},"end":{"line":100,"column":7}},"39":{"start":{"line":92,"column":8},"end":{"line":94,"column":21}},"40":{"start":{"line":96,"column":8},"end":{"line":99,"column":10}},"41":{"start":{"line":104,"column":19},"end":{"line":104,"column":41}},"42":{"start":{"line":105,"column":2},"end":{"line":108,"column":4}},"43":{"start":{"line":110,"column":2},"end":{"line":110,"column":59}},"44":{"start":{"line":111,"column":2},"end":{"line":111,"column":37}},"45":{"start":{"line":112,"column":2},"end":{"line":112,"column":61}},"46":{"start":{"line":113,"column":2},"end":{"line":113,"column":18}},"47":{"start":{"line":116,"column":16},"end":{"line":145,"column":1}},"48":{"start":{"line":117,"column":35},"end":{"line":117,"column":40}},"49":{"start":{"line":119,"column":2},"end":{"line":121,"column":3}},"50":{"start":{"line":120,"column":4},"end":{"line":120,"column":68}},"51":{"start":{"line":123,"column":2},"end":{"line":125,"column":3}},"52":{"start":{"line":124,"column":4},"end":{"line":124,"column":65}},"53":{"start":{"line":127,"column":2},"end":{"line":132,"column":3}},"54":{"start":{"line":128,"column":4},"end":{"line":131,"column":6}},"55":{"start":{"line":134,"column":22},"end":{"line":134,"column":48}},"56":{"start":{"line":137,"column":2},"end":{"line":143,"column":3}},"57":{"start":{"line":139,"column":6},"end":{"line":139,"column":66}},"58":{"start":{"line":140,"column":6},"end":{"line":140,"column":12}},"59":{"start":{"line":142,"column":6},"end":{"line":142,"column":78}},"60":{"start":{"line":144,"column":2},"end":{"line":144,"column":18}},"61":{"start":{"line":148,"column":30},"end":{"line":148,"column":32}},"62":{"start":{"line":151,"column":2},"end":{"line":194,"column":5}},"63":{"start":{"line":152,"column":30},"end":{"line":152,"column":32}},"64":{"start":{"line":153,"column":21},"end":{"line":153,"column":23}},"65":{"start":{"line":157,"column":28},"end":{"line":157,"column":36}},"66":{"start":{"line":158,"column":39},"end":{"line":158,"column":57}},"67":{"start":{"line":160,"column":29},"end":{"line":160,"column":56}},"68":{"start":{"line":163,"column":4},"end":{"line":169,"column":7}},"69":{"start":{"line":165,"column":6},"end":{"line":165,"column":45}},"70":{"start":{"line":166,"column":6},"end":{"line":166,"column":42}},"71":{"start":{"line":167,"column":6},"end":{"line":167,"column":51}},"72":{"start":{"line":168,"column":6},"end":{"line":168,"column":33}},"73":{"start":{"line":171,"column":4},"end":{"line":174,"column":6}},"74":{"start":{"line":176,"column":4},"end":{"line":176,"column":64}},"75":{"start":{"line":177,"column":4},"end":{"line":180,"column":6}},"76":{"start":{"line":181,"column":4},"end":{"line":185,"column":6}},"77":{"start":{"line":186,"column":4},"end":{"line":193,"column":6}},"78":{"start":{"line":196,"column":2},"end":{"line":196,"column":29}},"79":{"start":{"line":202,"column":2},"end":{"line":227,"column":3}},"80":{"start":{"line":203,"column":47},"end":{"line":203,"column":52}},"81":{"start":{"line":204,"column":21},"end":{"line":204,"column":45}},"82":{"start":{"line":205,"column":4},"end":{"line":205,"column":34}},"83":{"start":{"line":207,"column":28},"end":{"line":207,"column":55}},"84":{"start":{"line":208,"column":4},"end":{"line":208,"column":61}},"85":{"start":{"line":209,"column":4},"end":{"line":209,"column":55}},"86":{"start":{"line":210,"column":4},"end":{"line":210,"column":55}},"87":{"start":{"line":211,"column":4},"end":{"line":211,"column":59}},"88":{"start":{"line":212,"column":4},"end":{"line":213,"column":45}},"89":{"start":{"line":214,"column":4},"end":{"line":214,"column":42}},"90":{"start":{"line":215,"column":4},"end":{"line":215,"column":46}},"91":{"start":{"line":217,"column":4},"end":{"line":223,"column":6}},"92":{"start":{"line":226,"column":4},"end":{"line":226,"column":28}},"93":{"start":{"line":230,"column":26},"end":{"line":293,"column":1}},"94":{"start":{"line":231,"column":2},"end":{"line":234,"column":3}},"95":{"start":{"line":232,"column":23},"end":{"line":232,"column":75}},"96":{"start":{"line":233,"column":4},"end":{"line":233,"column":24}},"97":{"start":{"line":236,"column":28},"end":{"line":236,"column":30}},"98":{"start":{"line":237,"column":20},"end":{"line":237,"column":22}},"99":{"start":{"line":238,"column":22},"end":{"line":238,"column":24}},"100":{"start":{"line":239,"column":24},"end":{"line":239,"column":26}},"101":{"start":{"line":240,"column":2},"end":{"line":286,"column":4}},"102":{"start":{"line":242,"column":6},"end":{"line":284,"column":7}},"103":{"start":{"line":243,"column":8},"end":{"line":275,"column":9}},"104":{"start":{"line":245,"column":10},"end":{"line":245,"column":64}},"105":{"start":{"line":247,"column":10},"end":{"line":254,"column":11}},"106":{"start":{"line":252,"column":12},"end":{"line":252,"column":42}},"107":{"start":{"line":253,"column":12},"end":{"line":253,"column":29}},"108":{"start":{"line":257,"column":10},"end":{"line":265,"column":12}},"109":{"start":{"line":267,"column":10},"end":{"line":274,"column":11}},"110":{"start":{"line":272,"column":12},"end":{"line":272,"column":42}},"111":{"start":{"line":273,"column":12},"end":{"line":273,"column":29}},"112":{"start":{"line":277,"column":8},"end":{"line":283,"column":10}},"113":{"start":{"line":288,"column":28},"end":{"line":288,"column":30}},"114":{"start":{"line":289,"column":2},"end":{"line":291,"column":3}},"115":{"start":{"line":290,"column":4},"end":{"line":290,"column":57}},"116":{"start":{"line":292,"column":2},"end":{"line":292,"column":78}},"117":{"start":{"line":295,"column":0},"end":{"line":295,"column":48}}},"fnMap":{"0":{"name":"checkIfValidPhoneNumber","decl":{"start":{"line":27,"column":9},"end":{"line":27,"column":32}},"loc":{"start":{"line":27,"column":38},"end":{"line":34,"column":1}},"line":27},"1":{"name":"(anonymous_1)","decl":{"start":{"line":36,"column":29},"end":{"line":36,"column":30}},"loc":{"start":{"line":36,"column":60},"end":{"line":114,"column":1}},"line":36},"2":{"name":"(anonymous_2)","decl":{"start":{"line":116,"column":16},"end":{"line":116,"column":17}},"loc":{"start":{"line":116,"column":31},"end":{"line":145,"column":1}},"line":116},"3":{"name":"batchEvents","decl":{"start":{"line":147,"column":9},"end":{"line":147,"column":20}},"loc":{"start":{"line":147,"column":34},"end":{"line":197,"column":1}},"line":147},"4":{"name":"(anonymous_4)","decl":{"start":{"line":151,"column":22},"end":{"line":151,"column":23}},"loc":{"start":{"line":151,"column":31},"end":{"line":194,"column":3}},"line":151},"5":{"name":"(anonymous_5)","decl":{"start":{"line":163,"column":18},"end":{"line":163,"column":19}},"loc":{"start":{"line":163,"column":24},"end":{"line":169,"column":5}},"line":163},"6":{"name":"getEventChunks","decl":{"start":{"line":199,"column":9},"end":{"line":199,"column":23}},"loc":{"start":{"line":199,"column":63},"end":{"line":228,"column":1}},"line":199},"7":{"name":"(anonymous_7)","decl":{"start":{"line":230,"column":26},"end":{"line":230,"column":27}},"loc":{"start":{"line":230,"column":42},"end":{"line":293,"column":1}},"line":230},"8":{"name":"(anonymous_8)","decl":{"start":{"line":241,"column":15},"end":{"line":241,"column":16}},"loc":{"start":{"line":241,"column":39},"end":{"line":285,"column":5}},"line":241}},"branchMap":{"0":{"loc":{"start":{"line":40,"column":10},"end":{"line":40,"column":52}},"type":"cond-expr","locations":[{"start":{"line":40,"column":18},"end":{"line":40,"column":44}},{"start":{"line":40,"column":47},"end":{"line":40,"column":52}}],"line":40},"1":{"loc":{"start":{"line":41,"column":2},"end":{"line":43,"column":3}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":43,"column":3}},{"start":{"line":41,"column":2},"end":{"line":43,"column":3}}],"line":41},"2":{"loc":{"start":{"line":45,"column":2},"end":{"line":47,"column":3}},"type":"if","locations":[{"start":{"line":45,"column":2},"end":{"line":47,"column":3}},{"start":{"line":45,"column":2},"end":{"line":47,"column":3}}],"line":45},"3":{"loc":{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":55,"column":3}},{"start":{"line":53,"column":2},"end":{"line":55,"column":3}}],"line":53},"4":{"loc":{"start":{"line":61,"column":2},"end":{"line":63,"column":3}},"type":"if","locations":[{"start":{"line":61,"column":2},"end":{"line":63,"column":3}},{"start":{"line":61,"column":2},"end":{"line":63,"column":3}}],"line":61},"5":{"loc":{"start":{"line":61,"column":6},"end":{"line":61,"column":61}},"type":"binary-expr","locations":[{"start":{"line":61,"column":6},"end":{"line":61,"column":44}},{"start":{"line":61,"column":48},"end":{"line":61,"column":61}}],"line":61},"6":{"loc":{"start":{"line":66,"column":2},"end":{"line":68,"column":3}},"type":"if","locations":[{"start":{"line":66,"column":2},"end":{"line":68,"column":3}},{"start":{"line":66,"column":2},"end":{"line":68,"column":3}}],"line":66},"7":{"loc":{"start":{"line":66,"column":6},"end":{"line":66,"column":68}},"type":"binary-expr","locations":[{"start":{"line":66,"column":6},"end":{"line":66,"column":51}},{"start":{"line":66,"column":55},"end":{"line":66,"column":68}}],"line":66},"8":{"loc":{"start":{"line":76,"column":2},"end":{"line":102,"column":3}},"type":"if","locations":[{"start":{"line":76,"column":2},"end":{"line":102,"column":3}},{"start":{"line":76,"column":2},"end":{"line":102,"column":3}}],"line":76},"9":{"loc":{"start":{"line":78,"column":4},"end":{"line":80,"column":5}},"type":"if","locations":[{"start":{"line":78,"column":4},"end":{"line":80,"column":5}},{"start":{"line":78,"column":4},"end":{"line":80,"column":5}}],"line":78},"10":{"loc":{"start":{"line":83,"column":4},"end":{"line":87,"column":5}},"type":"if","locations":[{"start":{"line":83,"column":4},"end":{"line":87,"column":5}},{"start":{"line":83,"column":4},"end":{"line":87,"column":5}}],"line":83},"11":{"loc":{"start":{"line":90,"column":4},"end":{"line":101,"column":5}},"type":"if","locations":[{"start":{"line":90,"column":4},"end":{"line":101,"column":5}},{"start":{"line":90,"column":4},"end":{"line":101,"column":5}}],"line":90},"12":{"loc":{"start":{"line":91,"column":6},"end":{"line":100,"column":7}},"type":"if","locations":[{"start":{"line":91,"column":6},"end":{"line":100,"column":7}},{"start":{"line":91,"column":6},"end":{"line":100,"column":7}}],"line":91},"13":{"loc":{"start":{"line":119,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":119,"column":2},"end":{"line":121,"column":3}},{"start":{"line":119,"column":2},"end":{"line":121,"column":3}}],"line":119},"14":{"loc":{"start":{"line":123,"column":2},"end":{"line":125,"column":3}},"type":"if","locations":[{"start":{"line":123,"column":2},"end":{"line":125,"column":3}},{"start":{"line":123,"column":2},"end":{"line":125,"column":3}}],"line":123},"15":{"loc":{"start":{"line":127,"column":2},"end":{"line":132,"column":3}},"type":"if","locations":[{"start":{"line":127,"column":2},"end":{"line":132,"column":3}},{"start":{"line":127,"column":2},"end":{"line":132,"column":3}}],"line":127},"16":{"loc":{"start":{"line":137,"column":2},"end":{"line":143,"column":3}},"type":"switch","locations":[{"start":{"line":138,"column":4},"end":{"line":140,"column":12}},{"start":{"line":141,"column":4},"end":{"line":142,"column":78}}],"line":137},"17":{"loc":{"start":{"line":202,"column":2},"end":{"line":227,"column":3}},"type":"if","locations":[{"start":{"line":202,"column":2},"end":{"line":227,"column":3}},{"start":{"line":202,"column":2},"end":{"line":227,"column":3}}],"line":202},"18":{"loc":{"start":{"line":231,"column":2},"end":{"line":234,"column":3}},"type":"if","locations":[{"start":{"line":231,"column":2},"end":{"line":234,"column":3}},{"start":{"line":231,"column":2},"end":{"line":234,"column":3}}],"line":231},"19":{"loc":{"start":{"line":231,"column":6},"end":{"line":231,"column":50}},"type":"binary-expr","locations":[{"start":{"line":231,"column":6},"end":{"line":231,"column":28}},{"start":{"line":231,"column":32},"end":{"line":231,"column":50}}],"line":231},"20":{"loc":{"start":{"line":243,"column":8},"end":{"line":275,"column":9}},"type":"if","locations":[{"start":{"line":243,"column":8},"end":{"line":275,"column":9}},{"start":{"line":243,"column":8},"end":{"line":275,"column":9}}],"line":243},"21":{"loc":{"start":{"line":247,"column":10},"end":{"line":254,"column":11}},"type":"if","locations":[{"start":{"line":247,"column":10},"end":{"line":254,"column":11}},{"start":{"line":247,"column":10},"end":{"line":254,"column":11}}],"line":247},"22":{"loc":{"start":{"line":248,"column":12},"end":{"line":250,"column":42}},"type":"binary-expr","locations":[{"start":{"line":248,"column":12},"end":{"line":248,"column":30}},{"start":{"line":249,"column":13},"end":{"line":249,"column":49}},{"start":{"line":250,"column":14},"end":{"line":250,"column":41}}],"line":248},"23":{"loc":{"start":{"line":267,"column":10},"end":{"line":274,"column":11}},"type":"if","locations":[{"start":{"line":267,"column":10},"end":{"line":274,"column":11}},{"start":{"line":267,"column":10},"end":{"line":274,"column":11}}],"line":267},"24":{"loc":{"start":{"line":268,"column":12},"end":{"line":270,"column":42}},"type":"binary-expr","locations":[{"start":{"line":268,"column":12},"end":{"line":268,"column":30}},{"start":{"line":269,"column":13},"end":{"line":269,"column":49}},{"start":{"line":270,"column":14},"end":{"line":270,"column":41}}],"line":268},"25":{"loc":{"start":{"line":280,"column":12},"end":{"line":280,"column":56}},"type":"cond-expr","locations":[{"start":{"line":280,"column":29},"end":{"line":280,"column":50}},{"start":{"line":280,"column":53},"end":{"line":280,"column":56}}],"line":280},"26":{"loc":{"start":{"line":281,"column":12},"end":{"line":281,"column":71}},"type":"binary-expr","locations":[{"start":{"line":281,"column":12},"end":{"line":281,"column":25}},{"start":{"line":281,"column":29},"end":{"line":281,"column":71}}],"line":281},"27":{"loc":{"start":{"line":289,"column":2},"end":{"line":291,"column":3}},"type":"if","locations":[{"start":{"line":289,"column":2},"end":{"line":291,"column":3}},{"start":{"line":289,"column":2},"end":{"line":291,"column":3}}],"line":289}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":4,"7":4,"8":1,"9":23,"10":23,"11":23,"12":23,"13":1,"14":22,"15":1,"16":21,"17":21,"18":21,"19":21,"20":21,"21":21,"22":21,"23":21,"24":1,"25":21,"26":21,"27":1,"28":21,"29":21,"30":4,"31":4,"32":4,"33":4,"34":4,"35":4,"36":4,"37":4,"38":4,"39":3,"40":1,"41":20,"42":20,"43":20,"44":20,"45":20,"46":20,"47":1,"48":25,"49":25,"50":0,"51":25,"52":0,"53":25,"54":1,"55":24,"56":24,"57":23,"58":20,"59":1,"60":20,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":4,"70":4,"71":4,"72":4,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":5,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":4,"93":1,"94":1,"95":0,"96":0,"97":1,"98":1,"99":1,"100":1,"101":1,"102":5,"103":5,"104":0,"105":0,"106":0,"107":0,"108":5,"109":5,"110":1,"111":1,"112":0,"113":1,"114":1,"115":1,"116":1,"117":1},"f":{"0":4,"1":23,"2":25,"3":1,"4":1,"5":4,"6":5,"7":1,"8":5},"b":{"0":[22,1],"1":[1,22],"2":[1,21],"3":[21,0],"4":[1,20],"5":[21,1],"6":[1,20],"7":[21,1],"8":[4,17],"9":[4,0],"10":[4,0],"11":[4,0],"12":[3,1],"13":[0,25],"14":[0,25],"15":[1,24],"16":[23,1],"17":[1,4],"18":[0,1],"19":[1,1],"20":[0,5],"21":[0,0],"22":[0,0,0],"23":[1,4],"24":[5,5,5],"25":[0,0],"26":[0,0],"27":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ecd4dc6793d27e149b7f3875af2662238092b05e"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\trengo\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\trengo\\config.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":48}},"1":{"start":{"line":3,"column":18},"end":{"line":7,"column":1}},"2":{"start":{"line":9,"column":0},"end":{"line":12,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"42a10390a253c1a6f34cebc608f9e6b578057bdc"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\trengo\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\trengo\\transform.js","statementMap":{"0":{"start":{"line":3,"column":19},"end":{"line":3,"column":40}},"1":{"start":{"line":4,"column":14},"end":{"line":4,"column":30}},"2":{"start":{"line":5,"column":12},"end":{"line":5,"column":32}},"3":{"start":{"line":6,"column":22},"end":{"line":6,"column":51}},"4":{"start":{"line":7,"column":32},"end":{"line":7,"column":51}},"5":{"start":{"line":11,"column":4},"end":{"line":11,"column":25}},"6":{"start":{"line":22,"column":4},"end":{"line":22,"column":25}},"7":{"start":{"line":34,"column":20},"end":{"line":46,"column":1}},"8":{"start":{"line":35,"column":20},"end":{"line":35,"column":27}},"9":{"start":{"line":36,"column":31},"end":{"line":36,"column":49}},"10":{"start":{"line":37,"column":18},"end":{"line":37,"column":73}},"11":{"start":{"line":38,"column":2},"end":{"line":43,"column":3}},"12":{"start":{"line":39,"column":4},"end":{"line":42,"column":6}},"13":{"start":{"line":45,"column":2},"end":{"line":45,"column":55}},"14":{"start":{"line":57,"column":17},"end":{"line":67,"column":1}},"15":{"start":{"line":58,"column":2},"end":{"line":66,"column":3}},"16":{"start":{"line":62,"column":4},"end":{"line":65,"column":6}},"17":{"start":{"line":81,"column":22},"end":{"line":118,"column":1}},"18":{"start":{"line":83,"column":2},"end":{"line":98,"column":3}},"19":{"start":{"line":84,"column":4},"end":{"line":88,"column":7}},"20":{"start":{"line":91,"column":4},"end":{"line":93,"column":5}},"21":{"start":{"line":92,"column":6},"end":{"line":92,"column":74}},"22":{"start":{"line":94,"column":4},"end":{"line":97,"column":6}},"23":{"start":{"line":99,"column":2},"end":{"line":116,"column":3}},"24":{"start":{"line":106,"column":21},"end":{"line":106,"column":29}},"25":{"start":{"line":107,"column":4},"end":{"line":114,"column":5}},"26":{"start":{"line":108,"column":6},"end":{"line":111,"column":8}},"27":{"start":{"line":112,"column":11},"end":{"line":114,"column":5}},"28":{"start":{"line":113,"column":6},"end":{"line":113,"column":24}},"29":{"start":{"line":115,"column":4},"end":{"line":115,"column":14}},"30":{"start":{"line":117,"column":2},"end":{"line":117,"column":14}},"31":{"start":{"line":131,"column":29},"end":{"line":197,"column":1}},"32":{"start":{"line":141,"column":21},"end":{"line":141,"column":46}},"33":{"start":{"line":142,"column":22},"end":{"line":147,"column":58}},"34":{"start":{"line":149,"column":2},"end":{"line":195,"column":3}},"35":{"start":{"line":153,"column":18},"end":{"line":157,"column":5}},"36":{"start":{"line":158,"column":4},"end":{"line":158,"column":52}},"37":{"start":{"line":159,"column":4},"end":{"line":164,"column":6}},"38":{"start":{"line":168,"column":20},"end":{"line":168,"column":44}},"39":{"start":{"line":169,"column":4},"end":{"line":183,"column":5}},"40":{"start":{"line":171,"column":6},"end":{"line":171,"column":63}},"41":{"start":{"line":172,"column":6},"end":{"line":178,"column":7}},"42":{"start":{"line":174,"column":8},"end":{"line":177,"column":10}},"43":{"start":{"line":180,"column":6},"end":{"line":182,"column":7}},"44":{"start":{"line":181,"column":8},"end":{"line":181,"column":18}},"45":{"start":{"line":186,"column":18},"end":{"line":188,"column":5}},"46":{"start":{"line":189,"column":4},"end":{"line":189,"column":52}},"47":{"start":{"line":190,"column":4},"end":{"line":194,"column":6}},"48":{"start":{"line":196,"column":2},"end":{"line":196,"column":16}},"49":{"start":{"line":199,"column":28},"end":{"line":252,"column":1}},"50":{"start":{"line":201,"column":19},"end":{"line":201,"column":52}},"51":{"start":{"line":202,"column":21},"end":{"line":202,"column":46}},"52":{"start":{"line":203,"column":18},"end":{"line":203,"column":42}},"53":{"start":{"line":204,"column":2},"end":{"line":219,"column":3}},"54":{"start":{"line":205,"column":4},"end":{"line":205,"column":60}},"55":{"start":{"line":206,"column":4},"end":{"line":211,"column":5}},"56":{"start":{"line":207,"column":6},"end":{"line":210,"column":8}},"57":{"start":{"line":213,"column":4},"end":{"line":218,"column":5}},"58":{"start":{"line":214,"column":6},"end":{"line":217,"column":8}},"59":{"start":{"line":221,"column":2},"end":{"line":239,"column":3}},"60":{"start":{"line":223,"column":4},"end":{"line":238,"column":5}},"61":{"start":{"line":224,"column":6},"end":{"line":237,"column":7}},"62":{"start":{"line":225,"column":26},"end":{"line":225,"column":61}},"63":{"start":{"line":226,"column":30},"end":{"line":230,"column":9}},"64":{"start":{"line":231,"column":8},"end":{"line":231,"column":54}},"65":{"start":{"line":233,"column":8},"end":{"line":236,"column":10}},"66":{"start":{"line":240,"column":22},"end":{"line":244,"column":3}},"67":{"start":{"line":245,"column":2},"end":{"line":245,"column":62}},"68":{"start":{"line":246,"column":17},"end":{"line":250,"column":3}},"69":{"start":{"line":251,"column":2},"end":{"line":251,"column":16}},"70":{"start":{"line":264,"column":30},"end":{"line":366,"column":1}},"71":{"start":{"line":268,"column":2},"end":{"line":276,"column":3}},"72":{"start":{"line":272,"column":4},"end":{"line":275,"column":6}},"73":{"start":{"line":278,"column":16},"end":{"line":278,"column":58}},"74":{"start":{"line":279,"column":16},"end":{"line":279,"column":58}},"75":{"start":{"line":282,"column":17},"end":{"line":285,"column":3}},"76":{"start":{"line":286,"column":45},"end":{"line":286,"column":63}},"77":{"start":{"line":288,"column":2},"end":{"line":339,"column":3}},"78":{"start":{"line":292,"column":4},"end":{"line":329,"column":5}},"79":{"start":{"line":295,"column":6},"end":{"line":301,"column":8}},"80":{"start":{"line":302,"column":6},"end":{"line":315,"column":7}},"81":{"start":{"line":307,"column":8},"end":{"line":307,"column":50}},"82":{"start":{"line":308,"column":8},"end":{"line":314,"column":10}},"83":{"start":{"line":321,"column":6},"end":{"line":321,"column":48}},"84":{"start":{"line":322,"column":6},"end":{"line":328,"column":8}},"85":{"start":{"line":333,"column":4},"end":{"line":338,"column":6}},"86":{"start":{"line":346,"column":2},"end":{"line":363,"column":3}},"87":{"start":{"line":347,"column":21},"end":{"line":347,"column":43}},"88":{"start":{"line":348,"column":4},"end":{"line":348,"column":47}},"89":{"start":{"line":350,"column":4},"end":{"line":354,"column":5}},"90":{"start":{"line":351,"column":6},"end":{"line":351,"column":62}},"91":{"start":{"line":353,"column":6},"end":{"line":353,"column":63}},"92":{"start":{"line":356,"column":4},"end":{"line":360,"column":6}},"93":{"start":{"line":361,"column":4},"end":{"line":361,"column":47}},"94":{"start":{"line":362,"column":4},"end":{"line":362,"column":20}},"95":{"start":{"line":365,"column":2},"end":{"line":365,"column":65}},"96":{"start":{"line":377,"column":21},"end":{"line":387,"column":1}},"97":{"start":{"line":378,"column":2},"end":{"line":380,"column":3}},"98":{"start":{"line":379,"column":4},"end":{"line":379,"column":77}},"99":{"start":{"line":381,"column":22},"end":{"line":381,"column":48}},"100":{"start":{"line":382,"column":2},"end":{"line":384,"column":3}},"101":{"start":{"line":383,"column":4},"end":{"line":383,"column":61}},"102":{"start":{"line":385,"column":15},"end":{"line":385,"column":77}},"103":{"start":{"line":386,"column":2},"end":{"line":386,"column":14}},"104":{"start":{"line":389,"column":16},"end":{"line":392,"column":1}},"105":{"start":{"line":390,"column":19},"end":{"line":390,"column":71}},"106":{"start":{"line":391,"column":2},"end":{"line":391,"column":18}},"107":{"start":{"line":394,"column":26},"end":{"line":431,"column":1}},"108":{"start":{"line":395,"column":2},"end":{"line":398,"column":3}},"109":{"start":{"line":396,"column":23},"end":{"line":396,"column":75}},"110":{"start":{"line":397,"column":4},"end":{"line":397,"column":24}},"111":{"start":{"line":400,"column":19},"end":{"line":429,"column":3}},"112":{"start":{"line":402,"column":6},"end":{"line":427,"column":7}},"113":{"start":{"line":403,"column":8},"end":{"line":410,"column":9}},"114":{"start":{"line":405,"column":10},"end":{"line":409,"column":12}},"115":{"start":{"line":412,"column":8},"end":{"line":416,"column":10}},"116":{"start":{"line":418,"column":8},"end":{"line":426,"column":10}},"117":{"start":{"line":430,"column":2},"end":{"line":430,"column":18}},"118":{"start":{"line":433,"column":0},"end":{"line":433,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":34,"column":20},"end":{"line":34,"column":21}},"loc":{"start":{"line":34,"column":46},"end":{"line":46,"column":1}},"line":34},"1":{"name":"(anonymous_1)","decl":{"start":{"line":57,"column":17},"end":{"line":57,"column":18}},"loc":{"start":{"line":57,"column":54},"end":{"line":67,"column":1}},"line":57},"2":{"name":"(anonymous_2)","decl":{"start":{"line":81,"column":22},"end":{"line":81,"column":23}},"loc":{"start":{"line":81,"column":51},"end":{"line":118,"column":1}},"line":81},"3":{"name":"(anonymous_3)","decl":{"start":{"line":131,"column":29},"end":{"line":131,"column":30}},"loc":{"start":{"line":137,"column":5},"end":{"line":197,"column":1}},"line":137},"4":{"name":"(anonymous_4)","decl":{"start":{"line":199,"column":28},"end":{"line":199,"column":29}},"loc":{"start":{"line":199,"column":79},"end":{"line":252,"column":1}},"line":199},"5":{"name":"(anonymous_5)","decl":{"start":{"line":264,"column":30},"end":{"line":264,"column":31}},"loc":{"start":{"line":264,"column":75},"end":{"line":366,"column":1}},"line":264},"6":{"name":"(anonymous_6)","decl":{"start":{"line":377,"column":21},"end":{"line":377,"column":22}},"loc":{"start":{"line":377,"column":53},"end":{"line":387,"column":1}},"line":377},"7":{"name":"(anonymous_7)","decl":{"start":{"line":389,"column":16},"end":{"line":389,"column":17}},"loc":{"start":{"line":389,"column":31},"end":{"line":392,"column":1}},"line":389},"8":{"name":"(anonymous_8)","decl":{"start":{"line":394,"column":26},"end":{"line":394,"column":27}},"loc":{"start":{"line":394,"column":42},"end":{"line":431,"column":1}},"line":394},"9":{"name":"(anonymous_9)","decl":{"start":{"line":401,"column":15},"end":{"line":401,"column":16}},"loc":{"start":{"line":401,"column":30},"end":{"line":428,"column":5}},"line":401}},"branchMap":{"0":{"loc":{"start":{"line":38,"column":2},"end":{"line":43,"column":3}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":43,"column":3}},{"start":{"line":38,"column":2},"end":{"line":43,"column":3}}],"line":38},"1":{"loc":{"start":{"line":45,"column":9},"end":{"line":45,"column":54}},"type":"cond-expr","locations":[{"start":{"line":45,"column":25},"end":{"line":45,"column":47}},{"start":{"line":45,"column":50},"end":{"line":45,"column":54}}],"line":45},"2":{"loc":{"start":{"line":58,"column":2},"end":{"line":66,"column":3}},"type":"if","locations":[{"start":{"line":58,"column":2},"end":{"line":66,"column":3}},{"start":{"line":58,"column":2},"end":{"line":66,"column":3}}],"line":58},"3":{"loc":{"start":{"line":59,"column":4},"end":{"line":60,"column":45}},"type":"binary-expr","locations":[{"start":{"line":59,"column":5},"end":{"line":59,"column":34}},{"start":{"line":59,"column":38},"end":{"line":59,"column":44}},{"start":{"line":60,"column":5},"end":{"line":60,"column":34}},{"start":{"line":60,"column":38},"end":{"line":60,"column":44}}],"line":59},"4":{"loc":{"start":{"line":91,"column":4},"end":{"line":93,"column":5}},"type":"if","locations":[{"start":{"line":91,"column":4},"end":{"line":93,"column":5}},{"start":{"line":91,"column":4},"end":{"line":93,"column":5}}],"line":91},"5":{"loc":{"start":{"line":91,"column":8},"end":{"line":91,"column":43}},"type":"binary-expr","locations":[{"start":{"line":91,"column":8},"end":{"line":91,"column":20}},{"start":{"line":91,"column":24},"end":{"line":91,"column":43}}],"line":91},"6":{"loc":{"start":{"line":99,"column":2},"end":{"line":116,"column":3}},"type":"if","locations":[{"start":{"line":99,"column":2},"end":{"line":116,"column":3}},{"start":{"line":99,"column":2},"end":{"line":116,"column":3}}],"line":99},"7":{"loc":{"start":{"line":100,"column":4},"end":{"line":104,"column":32}},"type":"binary-expr","locations":[{"start":{"line":100,"column":4},"end":{"line":100,"column":7}},{"start":{"line":101,"column":4},"end":{"line":101,"column":22}},{"start":{"line":102,"column":4},"end":{"line":102,"column":12}},{"start":{"line":103,"column":4},"end":{"line":103,"column":17}},{"start":{"line":104,"column":4},"end":{"line":104,"column":32}}],"line":100},"8":{"loc":{"start":{"line":107,"column":4},"end":{"line":114,"column":5}},"type":"if","locations":[{"start":{"line":107,"column":4},"end":{"line":114,"column":5}},{"start":{"line":107,"column":4},"end":{"line":114,"column":5}}],"line":107},"9":{"loc":{"start":{"line":112,"column":11},"end":{"line":114,"column":5}},"type":"if","locations":[{"start":{"line":112,"column":11},"end":{"line":114,"column":5}},{"start":{"line":112,"column":11},"end":{"line":114,"column":5}}],"line":112},"10":{"loc":{"start":{"line":136,"column":2},"end":{"line":136,"column":20}},"type":"default-arg","locations":[{"start":{"line":136,"column":16},"end":{"line":136,"column":20}}],"line":136},"11":{"loc":{"start":{"line":142,"column":22},"end":{"line":147,"column":58}},"type":"cond-expr","locations":[{"start":{"line":143,"column":6},"end":{"line":143,"column":47}},{"start":{"line":144,"column":6},"end":{"line":147,"column":58}}],"line":142},"12":{"loc":{"start":{"line":149,"column":2},"end":{"line":195,"column":3}},"type":"if","locations":[{"start":{"line":149,"column":2},"end":{"line":195,"column":3}},{"start":{"line":149,"column":2},"end":{"line":195,"column":3}}],"line":149},"13":{"loc":{"start":{"line":156,"column":18},"end":{"line":156,"column":60}},"type":"binary-expr","locations":[{"start":{"line":156,"column":18},"end":{"line":156,"column":28}},{"start":{"line":156,"column":32},"end":{"line":156,"column":60}}],"line":156},"14":{"loc":{"start":{"line":161,"column":40},"end":{"line":162,"column":36}},"type":"binary-expr","locations":[{"start":{"line":161,"column":40},"end":{"line":161,"column":50}},{"start":{"line":162,"column":8},"end":{"line":162,"column":36}}],"line":161},"15":{"loc":{"start":{"line":169,"column":4},"end":{"line":183,"column":5}},"type":"if","locations":[{"start":{"line":169,"column":4},"end":{"line":183,"column":5}},{"start":{"line":169,"column":4},"end":{"line":183,"column":5}}],"line":169},"16":{"loc":{"start":{"line":172,"column":6},"end":{"line":178,"column":7}},"type":"if","locations":[{"start":{"line":172,"column":6},"end":{"line":178,"column":7}},{"start":{"line":172,"column":6},"end":{"line":178,"column":7}}],"line":172},"17":{"loc":{"start":{"line":180,"column":6},"end":{"line":182,"column":7}},"type":"if","locations":[{"start":{"line":180,"column":6},"end":{"line":182,"column":7}},{"start":{"line":180,"column":6},"end":{"line":182,"column":7}}],"line":180},"18":{"loc":{"start":{"line":204,"column":2},"end":{"line":219,"column":3}},"type":"if","locations":[{"start":{"line":204,"column":2},"end":{"line":219,"column":3}},{"start":{"line":204,"column":2},"end":{"line":219,"column":3}}],"line":204},"19":{"loc":{"start":{"line":206,"column":4},"end":{"line":211,"column":5}},"type":"if","locations":[{"start":{"line":206,"column":4},"end":{"line":211,"column":5}},{"start":{"line":206,"column":4},"end":{"line":211,"column":5}}],"line":206},"20":{"loc":{"start":{"line":213,"column":4},"end":{"line":218,"column":5}},"type":"if","locations":[{"start":{"line":213,"column":4},"end":{"line":218,"column":5}},{"start":{"line":213,"column":4},"end":{"line":218,"column":5}}],"line":213},"21":{"loc":{"start":{"line":221,"column":2},"end":{"line":239,"column":3}},"type":"if","locations":[{"start":{"line":221,"column":2},"end":{"line":239,"column":3}},{"start":{"line":221,"column":2},"end":{"line":239,"column":3}}],"line":221},"22":{"loc":{"start":{"line":223,"column":4},"end":{"line":238,"column":5}},"type":"if","locations":[{"start":{"line":223,"column":4},"end":{"line":238,"column":5}},{"start":{"line":223,"column":4},"end":{"line":238,"column":5}}],"line":223},"23":{"loc":{"start":{"line":223,"column":8},"end":{"line":223,"column":39}},"type":"binary-expr","locations":[{"start":{"line":223,"column":8},"end":{"line":223,"column":16}},{"start":{"line":223,"column":20},"end":{"line":223,"column":39}}],"line":223},"24":{"loc":{"start":{"line":242,"column":16},"end":{"line":242,"column":58}},"type":"binary-expr","locations":[{"start":{"line":242,"column":16},"end":{"line":242,"column":26}},{"start":{"line":242,"column":30},"end":{"line":242,"column":58}}],"line":242},"25":{"loc":{"start":{"line":268,"column":2},"end":{"line":276,"column":3}},"type":"if","locations":[{"start":{"line":268,"column":2},"end":{"line":276,"column":3}},{"start":{"line":268,"column":2},"end":{"line":276,"column":3}}],"line":268},"26":{"loc":{"start":{"line":269,"column":4},"end":{"line":270,"column":45}},"type":"binary-expr","locations":[{"start":{"line":269,"column":4},"end":{"line":269,"column":33}},{"start":{"line":270,"column":4},"end":{"line":270,"column":45}}],"line":269},"27":{"loc":{"start":{"line":288,"column":2},"end":{"line":339,"column":3}},"type":"if","locations":[{"start":{"line":288,"column":2},"end":{"line":339,"column":3}},{"start":{"line":288,"column":2},"end":{"line":339,"column":3}}],"line":288},"28":{"loc":{"start":{"line":292,"column":4},"end":{"line":329,"column":5}},"type":"if","locations":[{"start":{"line":292,"column":4},"end":{"line":329,"column":5}},{"start":{"line":292,"column":4},"end":{"line":329,"column":5}}],"line":292},"29":{"loc":{"start":{"line":298,"column":8},"end":{"line":298,"column":53}},"type":"cond-expr","locations":[{"start":{"line":298,"column":40},"end":{"line":298,"column":45}},{"start":{"line":298,"column":48},"end":{"line":298,"column":53}}],"line":298},"30":{"loc":{"start":{"line":302,"column":6},"end":{"line":315,"column":7}},"type":"if","locations":[{"start":{"line":302,"column":6},"end":{"line":315,"column":7}},{"start":{"line":302,"column":6},"end":{"line":315,"column":7}}],"line":302},"31":{"loc":{"start":{"line":311,"column":10},"end":{"line":311,"column":55}},"type":"cond-expr","locations":[{"start":{"line":311,"column":42},"end":{"line":311,"column":47}},{"start":{"line":311,"column":50},"end":{"line":311,"column":55}}],"line":311},"32":{"loc":{"start":{"line":325,"column":8},"end":{"line":325,"column":53}},"type":"cond-expr","locations":[{"start":{"line":325,"column":40},"end":{"line":325,"column":45}},{"start":{"line":325,"column":48},"end":{"line":325,"column":53}}],"line":325},"33":{"loc":{"start":{"line":336,"column":6},"end":{"line":336,"column":51}},"type":"cond-expr","locations":[{"start":{"line":336,"column":38},"end":{"line":336,"column":43}},{"start":{"line":336,"column":46},"end":{"line":336,"column":51}}],"line":336},"34":{"loc":{"start":{"line":346,"column":2},"end":{"line":363,"column":3}},"type":"if","locations":[{"start":{"line":346,"column":2},"end":{"line":363,"column":3}},{"start":{"line":346,"column":2},"end":{"line":363,"column":3}}],"line":346},"35":{"loc":{"start":{"line":350,"column":4},"end":{"line":354,"column":5}},"type":"if","locations":[{"start":{"line":350,"column":4},"end":{"line":354,"column":5}},{"start":{"line":350,"column":4},"end":{"line":354,"column":5}}],"line":350},"36":{"loc":{"start":{"line":378,"column":2},"end":{"line":380,"column":3}},"type":"if","locations":[{"start":{"line":378,"column":2},"end":{"line":380,"column":3}},{"start":{"line":378,"column":2},"end":{"line":380,"column":3}}],"line":378},"37":{"loc":{"start":{"line":382,"column":2},"end":{"line":384,"column":3}},"type":"if","locations":[{"start":{"line":382,"column":2},"end":{"line":384,"column":3}},{"start":{"line":382,"column":2},"end":{"line":384,"column":3}}],"line":382},"38":{"loc":{"start":{"line":382,"column":6},"end":{"line":382,"column":75}},"type":"binary-expr","locations":[{"start":{"line":382,"column":6},"end":{"line":382,"column":40}},{"start":{"line":382,"column":44},"end":{"line":382,"column":75}}],"line":382},"39":{"loc":{"start":{"line":395,"column":2},"end":{"line":398,"column":3}},"type":"if","locations":[{"start":{"line":395,"column":2},"end":{"line":398,"column":3}},{"start":{"line":395,"column":2},"end":{"line":398,"column":3}}],"line":395},"40":{"loc":{"start":{"line":395,"column":6},"end":{"line":395,"column":50}},"type":"binary-expr","locations":[{"start":{"line":395,"column":6},"end":{"line":395,"column":28}},{"start":{"line":395,"column":32},"end":{"line":395,"column":50}}],"line":395},"41":{"loc":{"start":{"line":403,"column":8},"end":{"line":410,"column":9}},"type":"if","locations":[{"start":{"line":403,"column":8},"end":{"line":410,"column":9}},{"start":{"line":403,"column":8},"end":{"line":410,"column":9}}],"line":403},"42":{"loc":{"start":{"line":420,"column":10},"end":{"line":424,"column":17}},"type":"cond-expr","locations":[{"start":{"line":421,"column":14},"end":{"line":421,"column":35}},{"start":{"line":422,"column":14},"end":{"line":424,"column":17}}],"line":420},"43":{"loc":{"start":{"line":422,"column":14},"end":{"line":424,"column":17}},"type":"cond-expr","locations":[{"start":{"line":423,"column":14},"end":{"line":423,"column":24}},{"start":{"line":424,"column":14},"end":{"line":424,"column":17}}],"line":422},"44":{"loc":{"start":{"line":425,"column":10},"end":{"line":425,"column":69}},"type":"binary-expr","locations":[{"start":{"line":425,"column":10},"end":{"line":425,"column":23}},{"start":{"line":425,"column":27},"end":{"line":425,"column":69}}],"line":425}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":10,"9":10,"10":10,"11":10,"12":1,"13":9,"14":1,"15":4,"16":0,"17":1,"18":15,"19":15,"20":0,"21":0,"22":0,"23":15,"24":13,"25":13,"26":2,"27":11,"28":8,"29":3,"30":2,"31":1,"32":11,"33":11,"34":11,"35":4,"36":4,"37":4,"38":7,"39":7,"40":7,"41":6,"42":2,"43":4,"44":3,"45":1,"46":1,"47":1,"48":5,"49":1,"50":10,"51":9,"52":9,"53":9,"54":8,"55":7,"56":0,"57":7,"58":0,"59":8,"60":7,"61":4,"62":4,"63":4,"64":4,"65":0,"66":8,"67":8,"68":8,"69":8,"70":1,"71":18,"72":0,"73":18,"74":18,"75":18,"76":18,"77":18,"78":8,"79":7,"80":4,"81":3,"82":3,"83":1,"84":1,"85":10,"86":13,"87":13,"88":13,"89":13,"90":1,"91":12,"92":13,"93":13,"94":13,"95":0,"96":1,"97":18,"98":0,"99":18,"100":18,"101":0,"102":18,"103":13,"104":1,"105":18,"106":13,"107":1,"108":1,"109":0,"110":0,"111":1,"112":2,"113":2,"114":0,"115":2,"116":0,"117":1,"118":1},"f":{"0":10,"1":4,"2":15,"3":11,"4":10,"5":18,"6":18,"7":18,"8":1,"9":2},"b":{"0":[1,9],"1":[9,0],"2":[0,4],"3":[4,2,4,2],"4":[0,0],"5":[0,0],"6":[13,2],"7":[15,15,13,13,13],"8":[2,11],"9":[8,3],"10":[0],"11":[11,0],"12":[4,7],"13":[4,4],"14":[4,4],"15":[7,0],"16":[2,4],"17":[3,1],"18":[8,1],"19":[0,7],"20":[0,7],"21":[7,1],"22":[4,3],"23":[7,4],"24":[8,3],"25":[0,18],"26":[18,18],"27":[8,10],"28":[7,1],"29":[2,5],"30":[3,1],"31":[2,1],"32":[0,1],"33":[8,2],"34":[13,0],"35":[1,12],"36":[0,18],"37":[0,18],"38":[18,10],"39":[0,1],"40":[1,1],"41":[0,2],"42":[0,0],"43":[0,0],"44":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f612adf0b7fcfe3fc76d119889d506473643e606"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\webhook\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\webhook\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"3":{"start":{"line":16,"column":22},"end":{"line":16,"column":51}},"4":{"start":{"line":18,"column":26},"end":{"line":23,"column":1}},"5":{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},"6":{"start":{"line":20,"column":4},"end":{"line":20,"column":68}},"7":{"start":{"line":22,"column":2},"end":{"line":22,"column":41}},"8":{"start":{"line":26,"column":2},"end":{"line":127,"column":3}},"9":{"start":{"line":27,"column":37},"end":{"line":27,"column":42}},"10":{"start":{"line":29,"column":4},"end":{"line":34,"column":5}},"11":{"start":{"line":33,"column":6},"end":{"line":33,"column":53}},"12":{"start":{"line":35,"column":21},"end":{"line":35,"column":43}},"13":{"start":{"line":36,"column":16},"end":{"line":36,"column":45}},"14":{"start":{"line":37,"column":19},"end":{"line":37,"column":51}},"15":{"start":{"line":38,"column":24},"end":{"line":38,"column":42}},"16":{"start":{"line":40,"column":4},"end":{"line":120,"column":5}},"17":{"start":{"line":41,"column":6},"end":{"line":55,"column":7}},"18":{"start":{"line":42,"column":8},"end":{"line":42,"column":64}},"19":{"start":{"line":44,"column":8},"end":{"line":44,"column":53}},"20":{"start":{"line":46,"column":8},"end":{"line":50,"column":9}},"21":{"start":{"line":47,"column":10},"end":{"line":47,"column":66}},"22":{"start":{"line":49,"column":10},"end":{"line":49,"column":67}},"23":{"start":{"line":51,"column":8},"end":{"line":51,"column":37}},"24":{"start":{"line":52,"column":8},"end":{"line":54,"column":10}},"25":{"start":{"line":57,"column":6},"end":{"line":57,"column":65}},"26":{"start":{"line":74,"column":25},"end":{"line":74,"column":32}},"27":{"start":{"line":75,"column":6},"end":{"line":88,"column":7}},"28":{"start":{"line":76,"column":8},"end":{"line":83,"column":9}},"29":{"start":{"line":77,"column":10},"end":{"line":82,"column":13}},"30":{"start":{"line":78,"column":24},"end":{"line":78,"column":35}},"31":{"start":{"line":79,"column":12},"end":{"line":81,"column":13}},"32":{"start":{"line":80,"column":14},"end":{"line":80,"column":42}},"33":{"start":{"line":85,"column":8},"end":{"line":87,"column":9}},"34":{"start":{"line":86,"column":10},"end":{"line":86,"column":43}},"35":{"start":{"line":90,"column":6},"end":{"line":90,"column":44}},"36":{"start":{"line":91,"column":6},"end":{"line":91,"column":30}},"37":{"start":{"line":101,"column":6},"end":{"line":104,"column":7}},"38":{"start":{"line":102,"column":8},"end":{"line":102,"column":45}},"39":{"start":{"line":103,"column":8},"end":{"line":103,"column":31}},"40":{"start":{"line":114,"column":6},"end":{"line":117,"column":7}},"41":{"start":{"line":115,"column":8},"end":{"line":115,"column":48}},"42":{"start":{"line":116,"column":8},"end":{"line":116,"column":33}},"43":{"start":{"line":119,"column":6},"end":{"line":119,"column":22}},"44":{"start":{"line":121,"column":4},"end":{"line":121,"column":68}},"45":{"start":{"line":123,"column":4},"end":{"line":126,"column":6}},"46":{"start":{"line":130,"column":26},"end":{"line":167,"column":1}},"47":{"start":{"line":131,"column":2},"end":{"line":134,"column":3}},"48":{"start":{"line":132,"column":23},"end":{"line":132,"column":75}},"49":{"start":{"line":133,"column":4},"end":{"line":133,"column":24}},"50":{"start":{"line":136,"column":19},"end":{"line":165,"column":3}},"51":{"start":{"line":138,"column":6},"end":{"line":163,"column":7}},"52":{"start":{"line":139,"column":8},"end":{"line":146,"column":9}},"53":{"start":{"line":141,"column":10},"end":{"line":145,"column":12}},"54":{"start":{"line":148,"column":8},"end":{"line":152,"column":10}},"55":{"start":{"line":154,"column":8},"end":{"line":162,"column":10}},"56":{"start":{"line":166,"column":2},"end":{"line":166,"column":18}},"57":{"start":{"line":169,"column":0},"end":{"line":169,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":18,"column":26},"end":{"line":18,"column":27}},"loc":{"start":{"line":18,"column":37},"end":{"line":23,"column":1}},"line":18},"1":{"name":"process","decl":{"start":{"line":25,"column":9},"end":{"line":25,"column":16}},"loc":{"start":{"line":25,"column":24},"end":{"line":128,"column":1}},"line":25},"2":{"name":"(anonymous_2)","decl":{"start":{"line":77,"column":38},"end":{"line":77,"column":39}},"loc":{"start":{"line":77,"column":45},"end":{"line":82,"column":11}},"line":77},"3":{"name":"(anonymous_3)","decl":{"start":{"line":130,"column":26},"end":{"line":130,"column":27}},"loc":{"start":{"line":130,"column":42},"end":{"line":167,"column":1}},"line":130},"4":{"name":"(anonymous_4)","decl":{"start":{"line":137,"column":15},"end":{"line":137,"column":16}},"loc":{"start":{"line":137,"column":30},"end":{"line":164,"column":5}},"line":137}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},"type":"if","locations":[{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},{"start":{"line":19,"column":2},"end":{"line":21,"column":3}}],"line":19},"1":{"loc":{"start":{"line":29,"column":4},"end":{"line":34,"column":5}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":34,"column":5}},{"start":{"line":29,"column":4},"end":{"line":34,"column":5}}],"line":29},"2":{"loc":{"start":{"line":30,"column":6},"end":{"line":31,"column":45}},"type":"binary-expr","locations":[{"start":{"line":30,"column":6},"end":{"line":30,"column":33}},{"start":{"line":31,"column":6},"end":{"line":31,"column":45}}],"line":30},"3":{"loc":{"start":{"line":40,"column":4},"end":{"line":120,"column":5}},"type":"if","locations":[{"start":{"line":40,"column":4},"end":{"line":120,"column":5}},{"start":{"line":40,"column":4},"end":{"line":120,"column":5}}],"line":40},"4":{"loc":{"start":{"line":41,"column":6},"end":{"line":55,"column":7}},"type":"if","locations":[{"start":{"line":41,"column":6},"end":{"line":55,"column":7}},{"start":{"line":41,"column":6},"end":{"line":55,"column":7}}],"line":41},"5":{"loc":{"start":{"line":46,"column":8},"end":{"line":50,"column":9}},"type":"if","locations":[{"start":{"line":46,"column":8},"end":{"line":50,"column":9}},{"start":{"line":46,"column":8},"end":{"line":50,"column":9}}],"line":46},"6":{"loc":{"start":{"line":75,"column":6},"end":{"line":88,"column":7}},"type":"if","locations":[{"start":{"line":75,"column":6},"end":{"line":88,"column":7}},{"start":{"line":75,"column":6},"end":{"line":88,"column":7}}],"line":75},"7":{"loc":{"start":{"line":76,"column":8},"end":{"line":83,"column":9}},"type":"if","locations":[{"start":{"line":76,"column":8},"end":{"line":83,"column":9}},{"start":{"line":76,"column":8},"end":{"line":83,"column":9}}],"line":76},"8":{"loc":{"start":{"line":79,"column":12},"end":{"line":81,"column":13}},"type":"if","locations":[{"start":{"line":79,"column":12},"end":{"line":81,"column":13}},{"start":{"line":79,"column":12},"end":{"line":81,"column":13}}],"line":79},"9":{"loc":{"start":{"line":79,"column":16},"end":{"line":79,"column":46}},"type":"binary-expr","locations":[{"start":{"line":79,"column":16},"end":{"line":79,"column":19}},{"start":{"line":79,"column":23},"end":{"line":79,"column":46}}],"line":79},"10":{"loc":{"start":{"line":85,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":85,"column":8},"end":{"line":87,"column":9}},{"start":{"line":85,"column":8},"end":{"line":87,"column":9}}],"line":85},"11":{"loc":{"start":{"line":101,"column":6},"end":{"line":104,"column":7}},"type":"if","locations":[{"start":{"line":101,"column":6},"end":{"line":104,"column":7}},{"start":{"line":101,"column":6},"end":{"line":104,"column":7}}],"line":101},"12":{"loc":{"start":{"line":101,"column":10},"end":{"line":101,"column":66}},"type":"binary-expr","locations":[{"start":{"line":101,"column":10},"end":{"line":101,"column":26}},{"start":{"line":101,"column":30},"end":{"line":101,"column":66}}],"line":101},"13":{"loc":{"start":{"line":114,"column":6},"end":{"line":117,"column":7}},"type":"if","locations":[{"start":{"line":114,"column":6},"end":{"line":117,"column":7}},{"start":{"line":114,"column":6},"end":{"line":117,"column":7}}],"line":114},"14":{"loc":{"start":{"line":114,"column":10},"end":{"line":114,"column":70}},"type":"binary-expr","locations":[{"start":{"line":114,"column":10},"end":{"line":114,"column":28}},{"start":{"line":114,"column":32},"end":{"line":114,"column":70}}],"line":114},"15":{"loc":{"start":{"line":124,"column":6},"end":{"line":124,"column":58}},"type":"binary-expr","locations":[{"start":{"line":124,"column":6},"end":{"line":124,"column":17}},{"start":{"line":124,"column":21},"end":{"line":124,"column":58}}],"line":124},"16":{"loc":{"start":{"line":125,"column":6},"end":{"line":125,"column":23}},"type":"binary-expr","locations":[{"start":{"line":125,"column":6},"end":{"line":125,"column":16}},{"start":{"line":125,"column":20},"end":{"line":125,"column":23}}],"line":125},"17":{"loc":{"start":{"line":131,"column":2},"end":{"line":134,"column":3}},"type":"if","locations":[{"start":{"line":131,"column":2},"end":{"line":134,"column":3}},{"start":{"line":131,"column":2},"end":{"line":134,"column":3}}],"line":131},"18":{"loc":{"start":{"line":131,"column":6},"end":{"line":131,"column":50}},"type":"binary-expr","locations":[{"start":{"line":131,"column":6},"end":{"line":131,"column":28}},{"start":{"line":131,"column":32},"end":{"line":131,"column":50}}],"line":131},"19":{"loc":{"start":{"line":139,"column":8},"end":{"line":146,"column":9}},"type":"if","locations":[{"start":{"line":139,"column":8},"end":{"line":146,"column":9}},{"start":{"line":139,"column":8},"end":{"line":146,"column":9}}],"line":139},"20":{"loc":{"start":{"line":156,"column":10},"end":{"line":160,"column":17}},"type":"cond-expr","locations":[{"start":{"line":157,"column":14},"end":{"line":157,"column":35}},{"start":{"line":158,"column":14},"end":{"line":160,"column":17}}],"line":156},"21":{"loc":{"start":{"line":158,"column":14},"end":{"line":160,"column":17}},"type":"cond-expr","locations":[{"start":{"line":159,"column":14},"end":{"line":159,"column":24}},{"start":{"line":160,"column":14},"end":{"line":160,"column":17}}],"line":158},"22":{"loc":{"start":{"line":161,"column":10},"end":{"line":161,"column":69}},"type":"binary-expr","locations":[{"start":{"line":161,"column":10},"end":{"line":161,"column":23}},{"start":{"line":161,"column":27},"end":{"line":161,"column":69}}],"line":161}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":2,"6":0,"7":2,"8":14,"9":14,"10":14,"11":2,"12":14,"13":14,"14":14,"15":14,"16":14,"17":14,"18":2,"19":2,"20":12,"21":1,"22":11,"23":12,"24":12,"25":14,"26":14,"27":14,"28":1,"29":1,"30":3,"31":3,"32":1,"33":1,"34":1,"35":14,"36":14,"37":14,"38":3,"39":3,"40":14,"41":3,"42":3,"43":14,"44":0,"45":0,"46":1,"47":1,"48":0,"49":0,"50":1,"51":2,"52":2,"53":0,"54":2,"55":0,"56":1,"57":1},"f":{"0":2,"1":14,"2":3,"3":1,"4":2},"b":{"0":[0,2],"1":[2,12],"2":[14,14],"3":[14,0],"4":[2,12],"5":[1,11],"6":[1,13],"7":[1,0],"8":[1,2],"9":[3,3],"10":[1,0],"11":[3,11],"12":[14,3],"13":[3,11],"14":[14,3],"15":[0,0],"16":[0,0],"17":[0,1],"18":[1,1],"19":[0,2],"20":[0,0],"21":[0,0],"22":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"42ef87e356eb4b2bdb3eec322d18a1cfc476ac2a"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\zendesk\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\zendesk\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":50}},"1":{"start":{"line":3,"column":23},"end":{"line":19,"column":1}},"2":{"start":{"line":21,"column":22},"end":{"line":39,"column":1}},"3":{"start":{"line":41,"column":22},"end":{"line":41,"column":65}},"4":{"start":{"line":43,"column":34},"end":{"line":43,"column":47}},"5":{"start":{"line":44,"column":36},"end":{"line":44,"column":42}},"6":{"start":{"line":45,"column":36},"end":{"line":45,"column":44}},"7":{"start":{"line":47,"column":0},"end":{"line":54,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"83177af61f158f1316dfa608ef50404cb84d75dd"} +,"D:\\WIP\\rudder-transformer\\v0\\destinations\\zendesk\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\destinations\\zendesk\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":14},"end":{"line":3,"column":30}},"3":{"start":{"line":5,"column":22},"end":{"line":5,"column":51}},"4":{"start":{"line":13,"column":4},"end":{"line":13,"column":23}},"5":{"start":{"line":24,"column":4},"end":{"line":24,"column":25}},"6":{"start":{"line":25,"column":15},"end":{"line":25,"column":41}},"7":{"start":{"line":30,"column":19},"end":{"line":30,"column":41}},"8":{"start":{"line":32,"column":25},"end":{"line":37,"column":3}},"9":{"start":{"line":39,"column":2},"end":{"line":39,"column":31}},"10":{"start":{"line":40,"column":2},"end":{"line":40,"column":59}},"11":{"start":{"line":41,"column":2},"end":{"line":41,"column":36}},"12":{"start":{"line":42,"column":2},"end":{"line":42,"column":40}},"13":{"start":{"line":43,"column":2},"end":{"line":43,"column":31}},"14":{"start":{"line":45,"column":2},"end":{"line":45,"column":18}},"15":{"start":{"line":51,"column":2},"end":{"line":51,"column":37}},"16":{"start":{"line":52,"column":2},"end":{"line":73,"column":5}},"17":{"start":{"line":54,"column":4},"end":{"line":61,"column":6}},"18":{"start":{"line":63,"column":4},"end":{"line":72,"column":5}},"19":{"start":{"line":64,"column":23},"end":{"line":64,"column":63}},"20":{"start":{"line":65,"column":6},"end":{"line":67,"column":7}},"21":{"start":{"line":66,"column":8},"end":{"line":66,"column":62}},"22":{"start":{"line":69,"column":6},"end":{"line":71,"column":7}},"23":{"start":{"line":70,"column":8},"end":{"line":70,"column":64}},"24":{"start":{"line":82,"column":18},"end":{"line":82,"column":20}},"25":{"start":{"line":84,"column":14},"end":{"line":84,"column":41}},"26":{"start":{"line":85,"column":17},"end":{"line":85,"column":28}},"27":{"start":{"line":87,"column":2},"end":{"line":107,"column":3}},"28":{"start":{"line":88,"column":21},"end":{"line":88,"column":49}},"29":{"start":{"line":89,"column":19},"end":{"line":89,"column":48}},"30":{"start":{"line":90,"column":4},"end":{"line":104,"column":5}},"31":{"start":{"line":92,"column":25},"end":{"line":92,"column":55}},"32":{"start":{"line":92,"column":45},"end":{"line":92,"column":54}},"33":{"start":{"line":93,"column":6},"end":{"line":93,"column":67}},"34":{"start":{"line":96,"column":24},"end":{"line":96,"column":43}},"35":{"start":{"line":97,"column":6},"end":{"line":99,"column":8}},"36":{"start":{"line":98,"column":15},"end":{"line":98,"column":79}},"37":{"start":{"line":101,"column":6},"end":{"line":103,"column":7}},"38":{"start":{"line":102,"column":8},"end":{"line":102,"column":66}},"39":{"start":{"line":106,"column":4},"end":{"line":106,"column":74}},"40":{"start":{"line":111,"column":22},"end":{"line":111,"column":50}},"41":{"start":{"line":114,"column":4},"end":{"line":116,"column":51}},"42":{"start":{"line":118,"column":18},"end":{"line":118,"column":55}},"43":{"start":{"line":119,"column":2},"end":{"line":121,"column":3}},"44":{"start":{"line":120,"column":4},"end":{"line":120,"column":22}},"45":{"start":{"line":122,"column":2},"end":{"line":123,"column":65}},"46":{"start":{"line":125,"column":21},"end":{"line":125,"column":74}},"47":{"start":{"line":127,"column":2},"end":{"line":129,"column":3}},"48":{"start":{"line":128,"column":4},"end":{"line":128,"column":66}},"49":{"start":{"line":132,"column":21},"end":{"line":134,"column":3}},"50":{"start":{"line":133,"column":13},"end":{"line":133,"column":79}},"51":{"start":{"line":135,"column":2},"end":{"line":137,"column":5}},"52":{"start":{"line":136,"column":4},"end":{"line":136,"column":66}},"53":{"start":{"line":139,"column":2},"end":{"line":139,"column":53}},"54":{"start":{"line":141,"column":2},"end":{"line":143,"column":3}},"55":{"start":{"line":142,"column":4},"end":{"line":142,"column":40}},"56":{"start":{"line":145,"column":2},"end":{"line":145,"column":17}},"57":{"start":{"line":150,"column":4},"end":{"line":152,"column":51}},"58":{"start":{"line":153,"column":20},"end":{"line":153,"column":32}},"59":{"start":{"line":154,"column":14},"end":{"line":154,"column":63}},"60":{"start":{"line":156,"column":17},"end":{"line":156,"column":28}},"61":{"start":{"line":158,"column":2},"end":{"line":173,"column":3}},"62":{"start":{"line":159,"column":17},"end":{"line":159,"column":45}},"63":{"start":{"line":160,"column":4},"end":{"line":163,"column":5}},"64":{"start":{"line":161,"column":6},"end":{"line":161,"column":37}},"65":{"start":{"line":162,"column":6},"end":{"line":162,"column":23}},"66":{"start":{"line":165,"column":26},"end":{"line":165,"column":47}},"67":{"start":{"line":166,"column":4},"end":{"line":166,"column":25}},"68":{"start":{"line":172,"column":4},"end":{"line":172,"column":21}},"69":{"start":{"line":177,"column":14},"end":{"line":177,"column":73}},"70":{"start":{"line":178,"column":17},"end":{"line":178,"column":28}},"71":{"start":{"line":179,"column":19},"end":{"line":179,"column":47}},"72":{"start":{"line":180,"column":2},"end":{"line":186,"column":3}},"73":{"start":{"line":185,"column":4},"end":{"line":185,"column":16}},"74":{"start":{"line":187,"column":2},"end":{"line":187,"column":15}},"75":{"start":{"line":192,"column":4},"end":{"line":194,"column":51}},"76":{"start":{"line":195,"column":26},"end":{"line":195,"column":32}},"77":{"start":{"line":196,"column":17},"end":{"line":196,"column":60}},"78":{"start":{"line":198,"column":21},"end":{"line":198,"column":57}},"79":{"start":{"line":199,"column":2},"end":{"line":201,"column":3}},"80":{"start":{"line":200,"column":4},"end":{"line":200,"column":31}},"81":{"start":{"line":202,"column":19},"end":{"line":202,"column":42}},"82":{"start":{"line":203,"column":14},"end":{"line":203,"column":60}},"83":{"start":{"line":204,"column":17},"end":{"line":204,"column":28}},"84":{"start":{"line":205,"column":18},"end":{"line":205,"column":38}},"85":{"start":{"line":207,"column":2},"end":{"line":225,"column":3}},"86":{"start":{"line":208,"column":17},"end":{"line":208,"column":55}},"87":{"start":{"line":210,"column":4},"end":{"line":216,"column":5}},"88":{"start":{"line":211,"column":6},"end":{"line":211,"column":52}},"89":{"start":{"line":212,"column":6},"end":{"line":215,"column":8}},"90":{"start":{"line":218,"column":19},"end":{"line":218,"column":36}},"91":{"start":{"line":219,"column":22},"end":{"line":219,"column":42}},"92":{"start":{"line":220,"column":4},"end":{"line":220,"column":55}},"93":{"start":{"line":222,"column":4},"end":{"line":222,"column":24}},"94":{"start":{"line":223,"column":4},"end":{"line":223,"column":48}},"95":{"start":{"line":224,"column":4},"end":{"line":224,"column":78}},"96":{"start":{"line":235,"column":22},"end":{"line":235,"column":64}},"97":{"start":{"line":236,"column":17},"end":{"line":236,"column":47}},"98":{"start":{"line":237,"column":2},"end":{"line":249,"column":3}},"99":{"start":{"line":238,"column":4},"end":{"line":248,"column":5}},"100":{"start":{"line":239,"column":32},"end":{"line":244,"column":7}},"101":{"start":{"line":245,"column":6},"end":{"line":245,"column":36}},"102":{"start":{"line":247,"column":6},"end":{"line":247,"column":51}},"103":{"start":{"line":250,"column":18},"end":{"line":255,"column":3}},"104":{"start":{"line":257,"column":2},"end":{"line":257,"column":17}},"105":{"start":{"line":266,"column":2},"end":{"line":271,"column":4}},"106":{"start":{"line":272,"column":22},"end":{"line":272,"column":50}},"107":{"start":{"line":273,"column":18},"end":{"line":273,"column":56}},"108":{"start":{"line":274,"column":21},"end":{"line":274,"column":79}},"109":{"start":{"line":276,"column":2},"end":{"line":282,"column":3}},"110":{"start":{"line":277,"column":4},"end":{"line":281,"column":6}},"111":{"start":{"line":283,"column":20},"end":{"line":283,"column":47}},"112":{"start":{"line":284,"column":29},"end":{"line":287,"column":3}},"113":{"start":{"line":286,"column":6},"end":{"line":286,"column":80}},"114":{"start":{"line":288,"column":2},"end":{"line":294,"column":5}},"115":{"start":{"line":289,"column":4},"end":{"line":293,"column":6}},"116":{"start":{"line":296,"column":2},"end":{"line":296,"column":69}},"117":{"start":{"line":298,"column":2},"end":{"line":300,"column":3}},"118":{"start":{"line":299,"column":4},"end":{"line":299,"column":19}},"119":{"start":{"line":302,"column":14},"end":{"line":302,"column":48}},"120":{"start":{"line":303,"column":17},"end":{"line":303,"column":28}},"121":{"start":{"line":305,"column":2},"end":{"line":318,"column":3}},"122":{"start":{"line":306,"column":17},"end":{"line":306,"column":55}},"123":{"start":{"line":308,"column":4},"end":{"line":311,"column":5}},"124":{"start":{"line":309,"column":6},"end":{"line":309,"column":75}},"125":{"start":{"line":310,"column":6},"end":{"line":310,"column":23}},"126":{"start":{"line":313,"column":18},"end":{"line":313,"column":43}},"127":{"start":{"line":314,"column":4},"end":{"line":314,"column":17}},"128":{"start":{"line":316,"column":4},"end":{"line":316,"column":73}},"129":{"start":{"line":317,"column":4},"end":{"line":317,"column":21}},"130":{"start":{"line":322,"column":2},"end":{"line":327,"column":3}},"131":{"start":{"line":323,"column":4},"end":{"line":326,"column":6}},"132":{"start":{"line":331,"column":2},"end":{"line":331,"column":26}},"133":{"start":{"line":332,"column":19},"end":{"line":332,"column":42}},"134":{"start":{"line":334,"column":2},"end":{"line":339,"column":4}},"135":{"start":{"line":341,"column":18},"end":{"line":346,"column":3}},"136":{"start":{"line":347,"column":14},"end":{"line":347,"column":60}},"137":{"start":{"line":348,"column":21},"end":{"line":348,"column":23}},"138":{"start":{"line":350,"column":17},"end":{"line":350,"column":60}},"139":{"start":{"line":351,"column":2},"end":{"line":391,"column":3}},"140":{"start":{"line":357,"column":18},"end":{"line":357,"column":35}},"141":{"start":{"line":358,"column":19},"end":{"line":358,"column":52}},"142":{"start":{"line":359,"column":4},"end":{"line":390,"column":5}},"143":{"start":{"line":360,"column":28},"end":{"line":360,"column":86}},"144":{"start":{"line":361,"column":6},"end":{"line":389,"column":7}},"145":{"start":{"line":362,"column":23},"end":{"line":362,"column":34}},"146":{"start":{"line":363,"column":25},"end":{"line":363,"column":63}},"147":{"start":{"line":364,"column":8},"end":{"line":386,"column":9}},"148":{"start":{"line":369,"column":10},"end":{"line":385,"column":11}},"149":{"start":{"line":372,"column":33},"end":{"line":372,"column":77}},"150":{"start":{"line":373,"column":35},"end":{"line":373,"column":57}},"151":{"start":{"line":375,"column":12},"end":{"line":375,"column":113}},"152":{"start":{"line":376,"column":12},"end":{"line":376,"column":77}},"153":{"start":{"line":377,"column":12},"end":{"line":382,"column":14}},"154":{"start":{"line":383,"column":12},"end":{"line":383,"column":56}},"155":{"start":{"line":384,"column":12},"end":{"line":384,"column":44}},"156":{"start":{"line":388,"column":8},"end":{"line":388,"column":28}},"157":{"start":{"line":393,"column":2},"end":{"line":393,"column":67}},"158":{"start":{"line":394,"column":2},"end":{"line":394,"column":20}},"159":{"start":{"line":398,"column":2},"end":{"line":398,"column":26}},"160":{"start":{"line":399,"column":17},"end":{"line":399,"column":60}},"161":{"start":{"line":401,"column":2},"end":{"line":403,"column":3}},"162":{"start":{"line":402,"column":4},"end":{"line":402,"column":51}},"163":{"start":{"line":404,"column":2},"end":{"line":406,"column":3}},"164":{"start":{"line":405,"column":4},"end":{"line":405,"column":61}},"165":{"start":{"line":409,"column":12},"end":{"line":409,"column":61}},"166":{"start":{"line":410,"column":17},"end":{"line":410,"column":28}},"167":{"start":{"line":411,"column":23},"end":{"line":411,"column":51}},"168":{"start":{"line":412,"column":2},"end":{"line":426,"column":3}},"169":{"start":{"line":413,"column":37},"end":{"line":417,"column":5}},"170":{"start":{"line":418,"column":4},"end":{"line":420,"column":5}},"171":{"start":{"line":419,"column":6},"end":{"line":419,"column":51}},"172":{"start":{"line":421,"column":4},"end":{"line":423,"column":5}},"173":{"start":{"line":422,"column":6},"end":{"line":422,"column":57}},"174":{"start":{"line":424,"column":4},"end":{"line":424,"column":34}},"175":{"start":{"line":425,"column":4},"end":{"line":425,"column":22}},"176":{"start":{"line":427,"column":2},"end":{"line":427,"column":65}},"177":{"start":{"line":428,"column":2},"end":{"line":428,"column":60}},"178":{"start":{"line":430,"column":22},"end":{"line":430,"column":24}},"179":{"start":{"line":431,"column":2},"end":{"line":431,"column":42}},"180":{"start":{"line":432,"column":2},"end":{"line":432,"column":35}},"181":{"start":{"line":433,"column":2},"end":{"line":433,"column":32}},"182":{"start":{"line":434,"column":2},"end":{"line":434,"column":46}},"183":{"start":{"line":436,"column":24},"end":{"line":436,"column":26}},"184":{"start":{"line":437,"column":2},"end":{"line":437,"column":37}},"185":{"start":{"line":438,"column":2},"end":{"line":438,"column":34}},"186":{"start":{"line":439,"column":2},"end":{"line":439,"column":68}},"187":{"start":{"line":441,"column":23},"end":{"line":441,"column":69}},"188":{"start":{"line":442,"column":2},"end":{"line":442,"column":51}},"189":{"start":{"line":444,"column":19},"end":{"line":444,"column":71}},"190":{"start":{"line":445,"column":2},"end":{"line":445,"column":18}},"191":{"start":{"line":449,"column":2},"end":{"line":449,"column":26}},"192":{"start":{"line":450,"column":19},"end":{"line":450,"column":39}},"193":{"start":{"line":454,"column":2},"end":{"line":492,"column":3}},"194":{"start":{"line":455,"column":4},"end":{"line":460,"column":6}},"195":{"start":{"line":461,"column":4},"end":{"line":461,"column":45}},"196":{"start":{"line":463,"column":18},"end":{"line":468,"column":5}},"197":{"start":{"line":469,"column":4},"end":{"line":474,"column":5}},"198":{"start":{"line":470,"column":6},"end":{"line":473,"column":8}},"199":{"start":{"line":477,"column":4},"end":{"line":482,"column":6}},"200":{"start":{"line":483,"column":4},"end":{"line":483,"column":53}},"201":{"start":{"line":485,"column":19},"end":{"line":485,"column":58}},"202":{"start":{"line":486,"column":4},"end":{"line":491,"column":5}},"203":{"start":{"line":487,"column":6},"end":{"line":490,"column":8}},"204":{"start":{"line":503,"column":2},"end":{"line":503,"column":57}},"205":{"start":{"line":507,"column":22},"end":{"line":507,"column":27}},"206":{"start":{"line":508,"column":28},"end":{"line":508,"column":52}},"207":{"start":{"line":509,"column":22},"end":{"line":509,"column":48}},"208":{"start":{"line":510,"column":29},"end":{"line":510,"column":93}},"209":{"start":{"line":511,"column":18},"end":{"line":516,"column":3}},"210":{"start":{"line":518,"column":2},"end":{"line":527,"column":3}},"211":{"start":{"line":520,"column":6},"end":{"line":520,"column":66}},"212":{"start":{"line":522,"column":6},"end":{"line":522,"column":63}},"213":{"start":{"line":524,"column":6},"end":{"line":524,"column":63}},"214":{"start":{"line":526,"column":6},"end":{"line":526,"column":63}},"215":{"start":{"line":531,"column":2},"end":{"line":531,"column":78}},"216":{"start":{"line":532,"column":15},"end":{"line":532,"column":48}},"217":{"start":{"line":533,"column":2},"end":{"line":533,"column":14}},"218":{"start":{"line":536,"column":26},"end":{"line":574,"column":1}},"219":{"start":{"line":537,"column":2},"end":{"line":540,"column":3}},"220":{"start":{"line":538,"column":23},"end":{"line":538,"column":75}},"221":{"start":{"line":539,"column":4},"end":{"line":539,"column":24}},"222":{"start":{"line":542,"column":19},"end":{"line":572,"column":3}},"223":{"start":{"line":544,"column":6},"end":{"line":570,"column":7}},"224":{"start":{"line":545,"column":8},"end":{"line":552,"column":9}},"225":{"start":{"line":547,"column":10},"end":{"line":551,"column":12}},"226":{"start":{"line":554,"column":8},"end":{"line":558,"column":10}},"227":{"start":{"line":560,"column":8},"end":{"line":569,"column":10}},"228":{"start":{"line":573,"column":2},"end":{"line":573,"column":18}},"229":{"start":{"line":576,"column":0},"end":{"line":576,"column":48}}},"fnMap":{"0":{"name":"responseBuilder","decl":{"start":{"line":29,"column":9},"end":{"line":29,"column":24}},"loc":{"start":{"line":29,"column":62},"end":{"line":46,"column":1}},"line":29},"1":{"name":"createUserFields","decl":{"start":{"line":48,"column":15},"end":{"line":48,"column":31}},"loc":{"start":{"line":48,"column":67},"end":{"line":74,"column":1}},"line":48},"2":{"name":"(anonymous_2)","decl":{"start":{"line":52,"column":20},"end":{"line":52,"column":21}},"loc":{"start":{"line":52,"column":35},"end":{"line":73,"column":3}},"line":52},"3":{"name":"checkAndCreateUserFields","decl":{"start":{"line":76,"column":15},"end":{"line":76,"column":39}},"loc":{"start":{"line":81,"column":2},"end":{"line":108,"column":1}},"line":81},"4":{"name":"(anonymous_4)","decl":{"start":{"line":92,"column":36},"end":{"line":92,"column":37}},"loc":{"start":{"line":92,"column":45},"end":{"line":92,"column":54}},"line":92},"5":{"name":"(anonymous_5)","decl":{"start":{"line":98,"column":8},"end":{"line":98,"column":9}},"loc":{"start":{"line":98,"column":15},"end":{"line":98,"column":79}},"line":98},"6":{"name":"getIdentifyPayload","decl":{"start":{"line":110,"column":9},"end":{"line":110,"column":27}},"loc":{"start":{"line":110,"column":72},"end":{"line":146,"column":1}},"line":110},"7":{"name":"(anonymous_7)","decl":{"start":{"line":133,"column":4},"end":{"line":133,"column":5}},"loc":{"start":{"line":133,"column":13},"end":{"line":133,"column":79}},"line":133},"8":{"name":"(anonymous_8)","decl":{"start":{"line":135,"column":21},"end":{"line":135,"column":22}},"loc":{"start":{"line":135,"column":30},"end":{"line":137,"column":3}},"line":135},"9":{"name":"getUserId","decl":{"start":{"line":148,"column":15},"end":{"line":148,"column":24}},"loc":{"start":{"line":148,"column":49},"end":{"line":174,"column":1}},"line":148},"10":{"name":"isUserAlreadyAssociated","decl":{"start":{"line":176,"column":15},"end":{"line":176,"column":38}},"loc":{"start":{"line":176,"column":63},"end":{"line":188,"column":1}},"line":176},"11":{"name":"createUser","decl":{"start":{"line":190,"column":15},"end":{"line":190,"column":25}},"loc":{"start":{"line":190,"column":69},"end":{"line":226,"column":1}},"line":190},"12":{"name":"getUserMembershipPayload","decl":{"start":{"line":228,"column":15},"end":{"line":228,"column":39}},"loc":{"start":{"line":233,"column":2},"end":{"line":258,"column":1}},"line":233},"13":{"name":"createOrganization","decl":{"start":{"line":260,"column":15},"end":{"line":260,"column":33}},"loc":{"start":{"line":265,"column":2},"end":{"line":319,"column":1}},"line":265},"14":{"name":"(anonymous_14)","decl":{"start":{"line":285,"column":4},"end":{"line":285,"column":5}},"loc":{"start":{"line":286,"column":6},"end":{"line":286,"column":80}},"line":286},"15":{"name":"(anonymous_15)","decl":{"start":{"line":288,"column":29},"end":{"line":288,"column":30}},"loc":{"start":{"line":288,"column":38},"end":{"line":294,"column":3}},"line":288},"16":{"name":"validateUserId","decl":{"start":{"line":321,"column":9},"end":{"line":321,"column":23}},"loc":{"start":{"line":321,"column":33},"end":{"line":328,"column":1}},"line":321},"17":{"name":"processIdentify","decl":{"start":{"line":330,"column":15},"end":{"line":330,"column":30}},"loc":{"start":{"line":330,"column":68},"end":{"line":395,"column":1}},"line":330},"18":{"name":"processTrack","decl":{"start":{"line":397,"column":15},"end":{"line":397,"column":27}},"loc":{"start":{"line":397,"column":65},"end":{"line":446,"column":1}},"line":397},"19":{"name":"processGroup","decl":{"start":{"line":448,"column":15},"end":{"line":448,"column":27}},"loc":{"start":{"line":448,"column":65},"end":{"line":504,"column":1}},"line":448},"20":{"name":"processSingleMessage","decl":{"start":{"line":506,"column":15},"end":{"line":506,"column":35}},"loc":{"start":{"line":506,"column":43},"end":{"line":528,"column":1}},"line":506},"21":{"name":"process","decl":{"start":{"line":530,"column":15},"end":{"line":530,"column":22}},"loc":{"start":{"line":530,"column":30},"end":{"line":534,"column":1}},"line":530},"22":{"name":"(anonymous_22)","decl":{"start":{"line":536,"column":26},"end":{"line":536,"column":27}},"loc":{"start":{"line":536,"column":42},"end":{"line":574,"column":1}},"line":536},"23":{"name":"(anonymous_23)","decl":{"start":{"line":543,"column":15},"end":{"line":543,"column":16}},"loc":{"start":{"line":543,"column":30},"end":{"line":571,"column":5}},"line":543}},"branchMap":{"0":{"loc":{"start":{"line":65,"column":6},"end":{"line":67,"column":7}},"type":"if","locations":[{"start":{"line":65,"column":6},"end":{"line":67,"column":7}},{"start":{"line":65,"column":6},"end":{"line":67,"column":7}}],"line":65},"1":{"loc":{"start":{"line":69,"column":6},"end":{"line":71,"column":7}},"type":"if","locations":[{"start":{"line":69,"column":6},"end":{"line":71,"column":7}},{"start":{"line":69,"column":6},"end":{"line":71,"column":7}}],"line":69},"2":{"loc":{"start":{"line":69,"column":10},"end":{"line":69,"column":57}},"type":"binary-expr","locations":[{"start":{"line":69,"column":10},"end":{"line":69,"column":24}},{"start":{"line":69,"column":28},"end":{"line":69,"column":57}}],"line":69},"3":{"loc":{"start":{"line":90,"column":4},"end":{"line":104,"column":5}},"type":"if","locations":[{"start":{"line":90,"column":4},"end":{"line":104,"column":5}},{"start":{"line":90,"column":4},"end":{"line":104,"column":5}}],"line":90},"4":{"loc":{"start":{"line":90,"column":8},"end":{"line":90,"column":31}},"type":"binary-expr","locations":[{"start":{"line":90,"column":8},"end":{"line":90,"column":21}},{"start":{"line":90,"column":25},"end":{"line":90,"column":31}}],"line":90},"5":{"loc":{"start":{"line":98,"column":17},"end":{"line":98,"column":78}},"type":"binary-expr","locations":[{"start":{"line":98,"column":17},"end":{"line":98,"column":43}},{"start":{"line":98,"column":47},"end":{"line":98,"column":78}}],"line":98},"6":{"loc":{"start":{"line":101,"column":6},"end":{"line":103,"column":7}},"type":"if","locations":[{"start":{"line":101,"column":6},"end":{"line":103,"column":7}},{"start":{"line":101,"column":6},"end":{"line":103,"column":7}}],"line":101},"7":{"loc":{"start":{"line":106,"column":28},"end":{"line":106,"column":72}},"type":"cond-expr","locations":[{"start":{"line":106,"column":45},"end":{"line":106,"column":64}},{"start":{"line":106,"column":67},"end":{"line":106,"column":72}}],"line":106},"8":{"loc":{"start":{"line":114,"column":4},"end":{"line":116,"column":51}},"type":"cond-expr","locations":[{"start":{"line":115,"column":8},"end":{"line":115,"column":38}},{"start":{"line":116,"column":8},"end":{"line":116,"column":51}}],"line":114},"9":{"loc":{"start":{"line":119,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":119,"column":2},"end":{"line":121,"column":3}},{"start":{"line":119,"column":2},"end":{"line":121,"column":3}}],"line":119},"10":{"loc":{"start":{"line":123,"column":4},"end":{"line":123,"column":64}},"type":"binary-expr","locations":[{"start":{"line":123,"column":4},"end":{"line":123,"column":25}},{"start":{"line":123,"column":29},"end":{"line":123,"column":46}},{"start":{"line":123,"column":50},"end":{"line":123,"column":64}}],"line":123},"11":{"loc":{"start":{"line":127,"column":2},"end":{"line":129,"column":3}},"type":"if","locations":[{"start":{"line":127,"column":2},"end":{"line":129,"column":3}},{"start":{"line":127,"column":2},"end":{"line":129,"column":3}}],"line":127},"12":{"loc":{"start":{"line":133,"column":15},"end":{"line":133,"column":78}},"type":"binary-expr","locations":[{"start":{"line":133,"column":15},"end":{"line":133,"column":41}},{"start":{"line":133,"column":45},"end":{"line":133,"column":78}}],"line":133},"13":{"loc":{"start":{"line":141,"column":2},"end":{"line":143,"column":3}},"type":"if","locations":[{"start":{"line":141,"column":2},"end":{"line":143,"column":3}},{"start":{"line":141,"column":2},"end":{"line":143,"column":3}}],"line":141},"14":{"loc":{"start":{"line":150,"column":4},"end":{"line":152,"column":51}},"type":"cond-expr","locations":[{"start":{"line":151,"column":8},"end":{"line":151,"column":38}},{"start":{"line":152,"column":8},"end":{"line":152,"column":51}}],"line":150},"15":{"loc":{"start":{"line":160,"column":4},"end":{"line":163,"column":5}},"type":"if","locations":[{"start":{"line":160,"column":4},"end":{"line":163,"column":5}},{"start":{"line":160,"column":4},"end":{"line":163,"column":5}}],"line":160},"16":{"loc":{"start":{"line":160,"column":8},"end":{"line":160,"column":52}},"type":"binary-expr","locations":[{"start":{"line":160,"column":8},"end":{"line":160,"column":13}},{"start":{"line":160,"column":17},"end":{"line":160,"column":27}},{"start":{"line":160,"column":31},"end":{"line":160,"column":52}}],"line":160},"17":{"loc":{"start":{"line":180,"column":2},"end":{"line":186,"column":3}},"type":"if","locations":[{"start":{"line":180,"column":2},"end":{"line":186,"column":3}},{"start":{"line":180,"column":2},"end":{"line":186,"column":3}}],"line":180},"18":{"loc":{"start":{"line":181,"column":4},"end":{"line":183,"column":71}},"type":"binary-expr","locations":[{"start":{"line":181,"column":4},"end":{"line":181,"column":17}},{"start":{"line":182,"column":4},"end":{"line":182,"column":53}},{"start":{"line":183,"column":4},"end":{"line":183,"column":71}}],"line":181},"19":{"loc":{"start":{"line":192,"column":4},"end":{"line":194,"column":51}},"type":"cond-expr","locations":[{"start":{"line":193,"column":8},"end":{"line":193,"column":38}},{"start":{"line":194,"column":8},"end":{"line":194,"column":51}}],"line":192},"20":{"loc":{"start":{"line":199,"column":2},"end":{"line":201,"column":3}},"type":"if","locations":[{"start":{"line":199,"column":2},"end":{"line":201,"column":3}},{"start":{"line":199,"column":2},"end":{"line":201,"column":3}}],"line":199},"21":{"loc":{"start":{"line":210,"column":4},"end":{"line":216,"column":5}},"type":"if","locations":[{"start":{"line":210,"column":4},"end":{"line":216,"column":5}},{"start":{"line":210,"column":4},"end":{"line":216,"column":5}}],"line":210},"22":{"loc":{"start":{"line":210,"column":8},"end":{"line":210,"column":59}},"type":"binary-expr","locations":[{"start":{"line":210,"column":8},"end":{"line":210,"column":18}},{"start":{"line":210,"column":22},"end":{"line":210,"column":37}},{"start":{"line":210,"column":41},"end":{"line":210,"column":59}}],"line":210},"23":{"loc":{"start":{"line":214,"column":8},"end":{"line":214,"column":46}},"type":"binary-expr","locations":[{"start":{"line":214,"column":8},"end":{"line":214,"column":19}},{"start":{"line":214,"column":23},"end":{"line":214,"column":39}},{"start":{"line":214,"column":43},"end":{"line":214,"column":46}}],"line":214},"24":{"loc":{"start":{"line":224,"column":57},"end":{"line":224,"column":76}},"type":"binary-expr","locations":[{"start":{"line":224,"column":57},"end":{"line":224,"column":69}},{"start":{"line":224,"column":73},"end":{"line":224,"column":76}}],"line":224},"25":{"loc":{"start":{"line":237,"column":2},"end":{"line":249,"column":3}},"type":"if","locations":[{"start":{"line":237,"column":2},"end":{"line":249,"column":3}},{"start":{"line":237,"column":2},"end":{"line":249,"column":3}}],"line":237},"26":{"loc":{"start":{"line":238,"column":4},"end":{"line":248,"column":5}},"type":"if","locations":[{"start":{"line":238,"column":4},"end":{"line":248,"column":5}},{"start":{"line":238,"column":4},"end":{"line":248,"column":5}}],"line":238},"27":{"loc":{"start":{"line":238,"column":8},"end":{"line":238,"column":35}},"type":"binary-expr","locations":[{"start":{"line":238,"column":8},"end":{"line":238,"column":19}},{"start":{"line":238,"column":23},"end":{"line":238,"column":35}}],"line":238},"28":{"loc":{"start":{"line":276,"column":2},"end":{"line":282,"column":3}},"type":"if","locations":[{"start":{"line":276,"column":2},"end":{"line":282,"column":3}},{"start":{"line":276,"column":2},"end":{"line":282,"column":3}}],"line":276},"29":{"loc":{"start":{"line":286,"column":8},"end":{"line":286,"column":79}},"type":"binary-expr","locations":[{"start":{"line":286,"column":8},"end":{"line":286,"column":34}},{"start":{"line":286,"column":38},"end":{"line":286,"column":79}}],"line":286},"30":{"loc":{"start":{"line":298,"column":2},"end":{"line":300,"column":3}},"type":"if","locations":[{"start":{"line":298,"column":2},"end":{"line":300,"column":3}},{"start":{"line":298,"column":2},"end":{"line":300,"column":3}}],"line":298},"31":{"loc":{"start":{"line":298,"column":6},"end":{"line":298,"column":70}},"type":"binary-expr","locations":[{"start":{"line":298,"column":6},"end":{"line":298,"column":51}},{"start":{"line":298,"column":55},"end":{"line":298,"column":70}}],"line":298},"32":{"loc":{"start":{"line":308,"column":4},"end":{"line":311,"column":5}},"type":"if","locations":[{"start":{"line":308,"column":4},"end":{"line":311,"column":5}},{"start":{"line":308,"column":4},"end":{"line":311,"column":5}}],"line":308},"33":{"loc":{"start":{"line":308,"column":8},"end":{"line":308,"column":45}},"type":"binary-expr","locations":[{"start":{"line":308,"column":8},"end":{"line":308,"column":18}},{"start":{"line":308,"column":22},"end":{"line":308,"column":45}}],"line":308},"34":{"loc":{"start":{"line":322,"column":2},"end":{"line":327,"column":3}},"type":"if","locations":[{"start":{"line":322,"column":2},"end":{"line":327,"column":3}},{"start":{"line":322,"column":2},"end":{"line":327,"column":3}}],"line":322},"35":{"loc":{"start":{"line":351,"column":2},"end":{"line":391,"column":3}},"type":"if","locations":[{"start":{"line":351,"column":2},"end":{"line":391,"column":3}},{"start":{"line":351,"column":2},"end":{"line":391,"column":3}}],"line":351},"36":{"loc":{"start":{"line":352,"column":4},"end":{"line":355,"column":21}},"type":"binary-expr","locations":[{"start":{"line":352,"column":4},"end":{"line":352,"column":18}},{"start":{"line":353,"column":4},"end":{"line":353,"column":25}},{"start":{"line":354,"column":4},"end":{"line":354,"column":49}},{"start":{"line":355,"column":4},"end":{"line":355,"column":21}}],"line":352},"37":{"loc":{"start":{"line":359,"column":4},"end":{"line":390,"column":5}},"type":"if","locations":[{"start":{"line":359,"column":4},"end":{"line":390,"column":5}},{"start":{"line":359,"column":4},"end":{"line":390,"column":5}}],"line":359},"38":{"loc":{"start":{"line":364,"column":8},"end":{"line":386,"column":9}},"type":"if","locations":[{"start":{"line":364,"column":8},"end":{"line":386,"column":9}},{"start":{"line":364,"column":8},"end":{"line":386,"column":9}}],"line":364},"39":{"loc":{"start":{"line":365,"column":10},"end":{"line":367,"column":59}},"type":"binary-expr","locations":[{"start":{"line":365,"column":10},"end":{"line":365,"column":23}},{"start":{"line":366,"column":10},"end":{"line":366,"column":48}},{"start":{"line":367,"column":10},"end":{"line":367,"column":59}}],"line":365},"40":{"loc":{"start":{"line":369,"column":10},"end":{"line":385,"column":11}},"type":"if","locations":[{"start":{"line":369,"column":10},"end":{"line":385,"column":11}},{"start":{"line":369,"column":10},"end":{"line":385,"column":11}}],"line":369},"41":{"loc":{"start":{"line":401,"column":2},"end":{"line":403,"column":3}},"type":"if","locations":[{"start":{"line":401,"column":2},"end":{"line":403,"column":3}},{"start":{"line":401,"column":2},"end":{"line":403,"column":3}}],"line":401},"42":{"loc":{"start":{"line":402,"column":16},"end":{"line":402,"column":50}},"type":"cond-expr","locations":[{"start":{"line":402,"column":31},"end":{"line":402,"column":43}},{"start":{"line":402,"column":46},"end":{"line":402,"column":50}}],"line":402},"43":{"loc":{"start":{"line":404,"column":2},"end":{"line":406,"column":3}},"type":"if","locations":[{"start":{"line":404,"column":2},"end":{"line":406,"column":3}},{"start":{"line":404,"column":2},"end":{"line":406,"column":3}}],"line":404},"44":{"loc":{"start":{"line":412,"column":2},"end":{"line":426,"column":3}},"type":"if","locations":[{"start":{"line":412,"column":2},"end":{"line":426,"column":3}},{"start":{"line":412,"column":2},"end":{"line":426,"column":3}}],"line":412},"45":{"loc":{"start":{"line":412,"column":6},"end":{"line":412,"column":74}},"type":"binary-expr","locations":[{"start":{"line":412,"column":6},"end":{"line":412,"column":19}},{"start":{"line":412,"column":23},"end":{"line":412,"column":41}},{"start":{"line":412,"column":45},"end":{"line":412,"column":74}}],"line":412},"46":{"loc":{"start":{"line":418,"column":4},"end":{"line":420,"column":5}},"type":"if","locations":[{"start":{"line":418,"column":4},"end":{"line":420,"column":5}},{"start":{"line":418,"column":4},"end":{"line":420,"column":5}}],"line":418},"47":{"loc":{"start":{"line":421,"column":4},"end":{"line":423,"column":5}},"type":"if","locations":[{"start":{"line":421,"column":4},"end":{"line":423,"column":5}},{"start":{"line":421,"column":4},"end":{"line":423,"column":5}}],"line":421},"48":{"loc":{"start":{"line":427,"column":18},"end":{"line":427,"column":64}},"type":"binary-expr","locations":[{"start":{"line":427,"column":18},"end":{"line":427,"column":31}},{"start":{"line":427,"column":35},"end":{"line":427,"column":64}}],"line":427},"49":{"loc":{"start":{"line":428,"column":14},"end":{"line":428,"column":59}},"type":"binary-expr","locations":[{"start":{"line":428,"column":14},"end":{"line":428,"column":23}},{"start":{"line":428,"column":27},"end":{"line":428,"column":59}}],"line":428},"50":{"loc":{"start":{"line":454,"column":2},"end":{"line":492,"column":3}},"type":"if","locations":[{"start":{"line":454,"column":2},"end":{"line":492,"column":3}},{"start":{"line":454,"column":2},"end":{"line":492,"column":3}}],"line":454},"51":{"loc":{"start":{"line":454,"column":6},"end":{"line":454,"column":70}},"type":"binary-expr","locations":[{"start":{"line":454,"column":6},"end":{"line":454,"column":51}},{"start":{"line":454,"column":55},"end":{"line":454,"column":70}}],"line":454},"52":{"loc":{"start":{"line":469,"column":4},"end":{"line":474,"column":5}},"type":"if","locations":[{"start":{"line":469,"column":4},"end":{"line":474,"column":5}},{"start":{"line":469,"column":4},"end":{"line":474,"column":5}}],"line":469},"53":{"loc":{"start":{"line":486,"column":4},"end":{"line":491,"column":5}},"type":"if","locations":[{"start":{"line":486,"column":4},"end":{"line":491,"column":5}},{"start":{"line":486,"column":4},"end":{"line":491,"column":5}}],"line":486},"54":{"loc":{"start":{"line":518,"column":2},"end":{"line":527,"column":3}},"type":"switch","locations":[{"start":{"line":519,"column":4},"end":{"line":520,"column":66}},{"start":{"line":521,"column":4},"end":{"line":522,"column":63}},{"start":{"line":523,"column":4},"end":{"line":524,"column":63}},{"start":{"line":525,"column":4},"end":{"line":526,"column":63}}],"line":518},"55":{"loc":{"start":{"line":537,"column":2},"end":{"line":540,"column":3}},"type":"if","locations":[{"start":{"line":537,"column":2},"end":{"line":540,"column":3}},{"start":{"line":537,"column":2},"end":{"line":540,"column":3}}],"line":537},"56":{"loc":{"start":{"line":537,"column":6},"end":{"line":537,"column":50}},"type":"binary-expr","locations":[{"start":{"line":537,"column":6},"end":{"line":537,"column":28}},{"start":{"line":537,"column":32},"end":{"line":537,"column":50}}],"line":537},"57":{"loc":{"start":{"line":545,"column":8},"end":{"line":552,"column":9}},"type":"if","locations":[{"start":{"line":545,"column":8},"end":{"line":552,"column":9}},{"start":{"line":545,"column":8},"end":{"line":552,"column":9}}],"line":545},"58":{"loc":{"start":{"line":563,"column":10},"end":{"line":567,"column":17}},"type":"cond-expr","locations":[{"start":{"line":564,"column":14},"end":{"line":564,"column":35}},{"start":{"line":565,"column":14},"end":{"line":567,"column":17}}],"line":563},"59":{"loc":{"start":{"line":565,"column":14},"end":{"line":567,"column":17}},"type":"cond-expr","locations":[{"start":{"line":566,"column":14},"end":{"line":566,"column":24}},{"start":{"line":567,"column":14},"end":{"line":567,"column":17}}],"line":565},"60":{"loc":{"start":{"line":568,"column":10},"end":{"line":568,"column":69}},"type":"binary-expr","locations":[{"start":{"line":568,"column":10},"end":{"line":568,"column":23}},{"start":{"line":568,"column":27},"end":{"line":568,"column":69}}],"line":568}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":12,"8":12,"9":12,"10":12,"11":12,"12":12,"13":12,"14":12,"15":3,"16":3,"17":3,"18":3,"19":3,"20":3,"21":3,"22":0,"23":0,"24":10,"25":10,"26":10,"27":10,"28":10,"29":10,"30":10,"31":10,"32":26,"33":10,"34":10,"35":10,"36":30,"37":10,"38":3,"39":0,"40":8,"41":8,"42":8,"43":7,"44":0,"45":7,"46":7,"47":7,"48":7,"49":7,"50":24,"51":7,"52":3,"53":7,"54":7,"55":5,"56":7,"57":5,"58":5,"59":5,"60":5,"61":5,"62":5,"63":5,"64":1,"65":1,"66":4,"67":4,"68":0,"69":2,"70":2,"71":2,"72":2,"73":0,"74":2,"75":2,"76":2,"77":2,"78":2,"79":2,"80":2,"81":2,"82":2,"83":2,"84":2,"85":2,"86":2,"87":2,"88":0,"89":0,"90":2,"91":2,"92":2,"93":0,"94":0,"95":0,"96":2,"97":2,"98":2,"99":0,"100":0,"101":0,"102":0,"103":2,"104":2,"105":2,"106":2,"107":2,"108":2,"109":2,"110":2,"111":2,"112":2,"113":6,"114":2,"115":2,"116":2,"117":2,"118":0,"119":2,"120":2,"121":2,"122":2,"123":2,"124":0,"125":0,"126":2,"127":2,"128":0,"129":0,"130":15,"131":1,"132":8,"133":8,"134":8,"135":8,"136":7,"137":7,"138":7,"139":7,"140":3,"141":3,"142":3,"143":2,"144":2,"145":2,"146":2,"147":2,"148":2,"149":2,"150":2,"151":2,"152":2,"153":2,"154":2,"155":2,"156":0,"157":7,"158":7,"159":4,"160":4,"161":4,"162":4,"163":4,"164":1,"165":3,"166":3,"167":3,"168":3,"169":2,"170":2,"171":0,"172":2,"173":0,"174":2,"175":2,"176":3,"177":3,"178":3,"179":3,"180":3,"181":3,"182":3,"183":3,"184":3,"185":3,"186":3,"187":3,"188":3,"189":3,"190":3,"191":3,"192":2,"193":2,"194":0,"195":0,"196":2,"197":2,"198":0,"199":2,"200":2,"201":2,"202":2,"203":0,"204":2,"205":16,"206":16,"207":16,"208":16,"209":16,"210":16,"211":8,"212":3,"213":4,"214":1,"215":16,"216":16,"217":12,"218":1,"219":1,"220":0,"221":0,"222":1,"223":2,"224":2,"225":0,"226":2,"227":0,"228":1,"229":1},"f":{"0":12,"1":3,"2":3,"3":10,"4":26,"5":30,"6":8,"7":24,"8":3,"9":5,"10":2,"11":2,"12":2,"13":2,"14":6,"15":2,"16":15,"17":8,"18":4,"19":3,"20":16,"21":16,"22":1,"23":2},"b":{"0":[3,0],"1":[0,0],"2":[0,0],"3":[10,0],"4":[10,10],"5":[30,7],"6":[3,7],"7":[0,0],"8":[0,8],"9":[0,7],"10":[7,4,4],"11":[7,0],"12":[24,7],"13":[5,2],"14":[2,3],"15":[1,4],"16":[5,5,4],"17":[0,2],"18":[2,0,0],"19":[0,2],"20":[2,0],"21":[0,2],"22":[2,2,2],"23":[0,0,0],"24":[0,0],"25":[0,2],"26":[0,0],"27":[0,0],"28":[2,0],"29":[6,2],"30":[0,2],"31":[2,2],"32":[0,2],"33":[2,2],"34":[1,14],"35":[3,4],"36":[7,4,4,3],"37":[2,1],"38":[2,0],"39":[2,2,2],"40":[2,0],"41":[4,0],"42":[3,1],"43":[1,3],"44":[2,1],"45":[3,3,1],"46":[0,2],"47":[0,2],"48":[3,1],"49":[3,0],"50":[0,2],"51":[2,2],"52":[0,2],"53":[0,2],"54":[8,3,4,1],"55":[0,1],"56":[1,1],"57":[0,2],"58":[0,0],"59":[0,0],"60":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"36f2ca9d389518df13fd9f7f7d41cf89080ce233"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\message.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\message.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":4,"column":32},"end":{"line":4,"column":50}},"3":{"start":{"line":6,"column":16},"end":{"line":16,"column":1}},"4":{"start":{"line":7,"column":2},"end":{"line":15,"column":4}},"5":{"start":{"line":20,"column":4},"end":{"line":20,"column":40}},"6":{"start":{"line":21,"column":4},"end":{"line":23,"column":6}},"7":{"start":{"line":27,"column":4},"end":{"line":27,"column":22}},"8":{"start":{"line":31,"column":4},"end":{"line":31,"column":21}},"9":{"start":{"line":35,"column":4},"end":{"line":35,"column":27}},"10":{"start":{"line":39,"column":4},"end":{"line":57,"column":7}},"11":{"start":{"line":40,"column":21},"end":{"line":40,"column":36}},"12":{"start":{"line":41,"column":21},"end":{"line":41,"column":33}},"13":{"start":{"line":42,"column":6},"end":{"line":44,"column":7}},"14":{"start":{"line":43,"column":8},"end":{"line":43,"column":30}},"15":{"start":{"line":45,"column":6},"end":{"line":56,"column":9}},"16":{"start":{"line":46,"column":28},"end":{"line":46,"column":46}},"17":{"start":{"line":49,"column":8},"end":{"line":55,"column":9}},"18":{"start":{"line":54,"column":10},"end":{"line":54,"column":37}},"19":{"start":{"line":61,"column":4},"end":{"line":80,"column":7}},"20":{"start":{"line":62,"column":29},"end":{"line":62,"column":36}},"21":{"start":{"line":63,"column":25},"end":{"line":63,"column":32}},"22":{"start":{"line":64,"column":21},"end":{"line":64,"column":59}},"23":{"start":{"line":65,"column":6},"end":{"line":67,"column":7}},"24":{"start":{"line":66,"column":8},"end":{"line":66,"column":30}},"25":{"start":{"line":68,"column":6},"end":{"line":79,"column":9}},"26":{"start":{"line":69,"column":28},"end":{"line":69,"column":46}},"27":{"start":{"line":72,"column":8},"end":{"line":78,"column":9}},"28":{"start":{"line":77,"column":10},"end":{"line":77,"column":37}},"29":{"start":{"line":84,"column":4},"end":{"line":84,"column":31}},"30":{"start":{"line":88,"column":0},"end":{"line":88,"column":25}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":16},"end":{"line":6,"column":17}},"loc":{"start":{"line":6,"column":31},"end":{"line":16,"column":1}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":2},"end":{"line":19,"column":3}},"loc":{"start":{"line":19,"column":27},"end":{"line":24,"column":3}},"line":19},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":2},"end":{"line":26,"column":3}},"loc":{"start":{"line":26,"column":21},"end":{"line":28,"column":3}},"line":26},"3":{"name":"(anonymous_3)","decl":{"start":{"line":30,"column":2},"end":{"line":30,"column":3}},"loc":{"start":{"line":30,"column":21},"end":{"line":32,"column":3}},"line":30},"4":{"name":"(anonymous_4)","decl":{"start":{"line":34,"column":2},"end":{"line":34,"column":3}},"loc":{"start":{"line":34,"column":27},"end":{"line":36,"column":3}},"line":34},"5":{"name":"(anonymous_5)","decl":{"start":{"line":38,"column":2},"end":{"line":38,"column":3}},"loc":{"start":{"line":38,"column":32},"end":{"line":58,"column":3}},"line":38},"6":{"name":"(anonymous_6)","decl":{"start":{"line":39,"column":33},"end":{"line":39,"column":34}},"loc":{"start":{"line":39,"column":40},"end":{"line":57,"column":5}},"line":39},"7":{"name":"(anonymous_7)","decl":{"start":{"line":45,"column":23},"end":{"line":45,"column":24}},"loc":{"start":{"line":45,"column":34},"end":{"line":56,"column":7}},"line":45},"8":{"name":"(anonymous_8)","decl":{"start":{"line":60,"column":2},"end":{"line":60,"column":3}},"loc":{"start":{"line":60,"column":38},"end":{"line":81,"column":3}},"line":60},"9":{"name":"(anonymous_9)","decl":{"start":{"line":61,"column":24},"end":{"line":61,"column":25}},"loc":{"start":{"line":61,"column":35},"end":{"line":80,"column":5}},"line":61},"10":{"name":"(anonymous_10)","decl":{"start":{"line":68,"column":23},"end":{"line":68,"column":24}},"loc":{"start":{"line":68,"column":34},"end":{"line":79,"column":7}},"line":68},"11":{"name":"(anonymous_11)","decl":{"start":{"line":83,"column":2},"end":{"line":83,"column":3}},"loc":{"start":{"line":83,"column":26},"end":{"line":85,"column":3}},"line":83}},"branchMap":{"0":{"loc":{"start":{"line":42,"column":6},"end":{"line":44,"column":7}},"type":"if","locations":[{"start":{"line":42,"column":6},"end":{"line":44,"column":7}},{"start":{"line":42,"column":6},"end":{"line":44,"column":7}}],"line":42},"1":{"loc":{"start":{"line":49,"column":8},"end":{"line":55,"column":9}},"type":"if","locations":[{"start":{"line":49,"column":8},"end":{"line":55,"column":9}},{"start":{"line":49,"column":8},"end":{"line":55,"column":9}}],"line":49},"2":{"loc":{"start":{"line":50,"column":10},"end":{"line":52,"column":61}},"type":"binary-expr","locations":[{"start":{"line":50,"column":10},"end":{"line":50,"column":25}},{"start":{"line":51,"column":10},"end":{"line":51,"column":30}},{"start":{"line":52,"column":11},"end":{"line":52,"column":31}},{"start":{"line":52,"column":35},"end":{"line":52,"column":60}}],"line":50},"3":{"loc":{"start":{"line":65,"column":6},"end":{"line":67,"column":7}},"type":"if","locations":[{"start":{"line":65,"column":6},"end":{"line":67,"column":7}},{"start":{"line":65,"column":6},"end":{"line":67,"column":7}}],"line":65},"4":{"loc":{"start":{"line":72,"column":8},"end":{"line":78,"column":9}},"type":"if","locations":[{"start":{"line":72,"column":8},"end":{"line":78,"column":9}},{"start":{"line":72,"column":8},"end":{"line":78,"column":9}}],"line":72},"5":{"loc":{"start":{"line":73,"column":10},"end":{"line":75,"column":61}},"type":"binary-expr","locations":[{"start":{"line":73,"column":10},"end":{"line":73,"column":25}},{"start":{"line":74,"column":10},"end":{"line":74,"column":30}},{"start":{"line":75,"column":11},"end":{"line":75,"column":31}},{"start":{"line":75,"column":35},"end":{"line":75,"column":60}}],"line":73}},"s":{"0":7,"1":7,"2":7,"3":7,"4":72,"5":72,"6":72,"7":71,"8":72,"9":185,"10":40,"11":807,"12":807,"13":807,"14":765,"15":807,"16":849,"17":849,"18":370,"19":32,"20":184,"21":184,"22":184,"23":184,"24":184,"25":184,"26":184,"27":184,"28":95,"29":2,"30":7},"f":{"0":72,"1":72,"2":71,"3":72,"4":185,"5":40,"6":807,"7":849,"8":32,"9":184,"10":184,"11":2},"b":{"0":[765,42],"1":[370,479],"2":[849,842,389,389],"3":[184,0],"4":[95,89],"5":[184,173,111,111]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ae34566113fdc3faa6b84dd76527783449264561"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\appcenter\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\appcenter\\transform.js","statementMap":{"0":{"start":{"line":1,"column":13},"end":{"line":1,"column":28}},"1":{"start":{"line":2,"column":11},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":16},"end":{"line":3,"column":37}},"3":{"start":{"line":5,"column":20},"end":{"line":7,"column":1}},"4":{"start":{"line":9,"column":41},"end":{"line":9,"column":62}},"5":{"start":{"line":12,"column":13},"end":{"line":14,"column":67}},"6":{"start":{"line":14,"column":4},"end":{"line":14,"column":67}},"7":{"start":{"line":15,"column":2},"end":{"line":15,"column":72}},"8":{"start":{"line":19,"column":18},"end":{"line":19,"column":42}},"9":{"start":{"line":20,"column":2},"end":{"line":20,"column":32}},"10":{"start":{"line":22,"column":2},"end":{"line":42,"column":3}},"11":{"start":{"line":23,"column":4},"end":{"line":23,"column":44}},"12":{"start":{"line":24,"column":9},"end":{"line":42,"column":3}},"13":{"start":{"line":25,"column":4},"end":{"line":25,"column":41}},"14":{"start":{"line":26,"column":9},"end":{"line":42,"column":3}},"15":{"start":{"line":32,"column":4},"end":{"line":32,"column":68}},"16":{"start":{"line":33,"column":9},"end":{"line":42,"column":3}},"17":{"start":{"line":39,"column":4},"end":{"line":39,"column":40}},"18":{"start":{"line":41,"column":4},"end":{"line":41,"column":57}},"19":{"start":{"line":43,"column":21},"end":{"line":43,"column":33}},"20":{"start":{"line":44,"column":2},"end":{"line":44,"column":48}},"21":{"start":{"line":47,"column":2},"end":{"line":47,"column":46}},"22":{"start":{"line":50,"column":2},"end":{"line":50,"column":40}},"23":{"start":{"line":51,"column":2},"end":{"line":51,"column":17}},"24":{"start":{"line":55,"column":19},"end":{"line":55,"column":38}},"25":{"start":{"line":56,"column":22},"end":{"line":56,"column":60}},"26":{"start":{"line":59,"column":2},"end":{"line":59,"column":21}},"27":{"start":{"line":62,"column":0},"end":{"line":62,"column":26}}},"fnMap":{"0":{"name":"guidGenerator","decl":{"start":{"line":11,"column":9},"end":{"line":11,"column":22}},"loc":{"start":{"line":11,"column":25},"end":{"line":16,"column":1}},"line":11},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":13},"end":{"line":12,"column":14}},"loc":{"start":{"line":14,"column":4},"end":{"line":14,"column":67}},"line":14},"2":{"name":"processEvent","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":21}},"loc":{"start":{"line":18,"column":29},"end":{"line":52,"column":1}},"line":18},"3":{"name":"process","decl":{"start":{"line":54,"column":9},"end":{"line":54,"column":16}},"loc":{"start":{"line":54,"column":24},"end":{"line":60,"column":1}},"line":54}},"branchMap":{"0":{"loc":{"start":{"line":22,"column":2},"end":{"line":42,"column":3}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":42,"column":3}},{"start":{"line":22,"column":2},"end":{"line":42,"column":3}}],"line":22},"1":{"loc":{"start":{"line":22,"column":6},"end":{"line":22,"column":62}},"type":"binary-expr","locations":[{"start":{"line":22,"column":6},"end":{"line":22,"column":24}},{"start":{"line":22,"column":28},"end":{"line":22,"column":62}}],"line":22},"2":{"loc":{"start":{"line":24,"column":9},"end":{"line":42,"column":3}},"type":"if","locations":[{"start":{"line":24,"column":9},"end":{"line":42,"column":3}},{"start":{"line":24,"column":9},"end":{"line":42,"column":3}}],"line":24},"3":{"loc":{"start":{"line":24,"column":13},"end":{"line":24,"column":66}},"type":"binary-expr","locations":[{"start":{"line":24,"column":13},"end":{"line":24,"column":31}},{"start":{"line":24,"column":35},"end":{"line":24,"column":66}}],"line":24},"4":{"loc":{"start":{"line":26,"column":9},"end":{"line":42,"column":3}},"type":"if","locations":[{"start":{"line":26,"column":9},"end":{"line":42,"column":3}},{"start":{"line":26,"column":9},"end":{"line":42,"column":3}}],"line":26},"5":{"loc":{"start":{"line":27,"column":4},"end":{"line":30,"column":30}},"type":"binary-expr","locations":[{"start":{"line":27,"column":4},"end":{"line":27,"column":20}},{"start":{"line":28,"column":4},"end":{"line":28,"column":27}},{"start":{"line":29,"column":4},"end":{"line":29,"column":23}},{"start":{"line":30,"column":4},"end":{"line":30,"column":30}}],"line":27},"6":{"loc":{"start":{"line":33,"column":9},"end":{"line":42,"column":3}},"type":"if","locations":[{"start":{"line":33,"column":9},"end":{"line":42,"column":3}},{"start":{"line":33,"column":9},"end":{"line":42,"column":3}}],"line":33},"7":{"loc":{"start":{"line":34,"column":4},"end":{"line":37,"column":23}},"type":"binary-expr","locations":[{"start":{"line":34,"column":4},"end":{"line":34,"column":12}},{"start":{"line":35,"column":4},"end":{"line":35,"column":19}},{"start":{"line":36,"column":4},"end":{"line":36,"column":16}},{"start":{"line":37,"column":4},"end":{"line":37,"column":23}}],"line":34}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":1},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0,0,0],"6":[0,0],"7":[0,0,0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3133ad1b92cac4fc9c4aca9aacae8fa01c6b1efd"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\appsflyer\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\appsflyer\\transform.js","statementMap":{"0":{"start":{"line":1,"column":13},"end":{"line":1,"column":28}},"1":{"start":{"line":2,"column":11},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":16},"end":{"line":3,"column":37}},"3":{"start":{"line":4,"column":25},"end":{"line":4,"column":46}},"4":{"start":{"line":6,"column":20},"end":{"line":8,"column":1}},"5":{"start":{"line":14,"column":4},"end":{"line":14,"column":25}},"6":{"start":{"line":17,"column":22},"end":{"line":17,"column":29}},"7":{"start":{"line":19,"column":2},"end":{"line":78,"column":3}},"8":{"start":{"line":20,"column":22},"end":{"line":20,"column":38}},"9":{"start":{"line":21,"column":20},"end":{"line":21,"column":37}},"10":{"start":{"line":23,"column":4},"end":{"line":23,"column":38}},"11":{"start":{"line":25,"column":4},"end":{"line":25,"column":36}},"12":{"start":{"line":27,"column":23},"end":{"line":27,"column":35}},"13":{"start":{"line":28,"column":4},"end":{"line":28,"column":50}},"14":{"start":{"line":31,"column":4},"end":{"line":31,"column":46}},"15":{"start":{"line":34,"column":4},"end":{"line":38,"column":7}},"16":{"start":{"line":35,"column":6},"end":{"line":37,"column":7}},"17":{"start":{"line":36,"column":8},"end":{"line":36,"column":39}},"18":{"start":{"line":40,"column":4},"end":{"line":42,"column":5}},"19":{"start":{"line":41,"column":6},"end":{"line":41,"column":34}},"20":{"start":{"line":44,"column":4},"end":{"line":58,"column":5}},"21":{"start":{"line":45,"column":6},"end":{"line":49,"column":7}},"22":{"start":{"line":46,"column":8},"end":{"line":46,"column":58}},"23":{"start":{"line":47,"column":13},"end":{"line":49,"column":7}},"24":{"start":{"line":48,"column":8},"end":{"line":48,"column":64}},"25":{"start":{"line":51,"column":6},"end":{"line":53,"column":7}},"26":{"start":{"line":52,"column":8},"end":{"line":52,"column":39}},"27":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"28":{"start":{"line":56,"column":8},"end":{"line":56,"column":45}},"29":{"start":{"line":59,"column":4},"end":{"line":61,"column":5}},"30":{"start":{"line":60,"column":6},"end":{"line":60,"column":54}},"31":{"start":{"line":63,"column":4},"end":{"line":74,"column":5}},"32":{"start":{"line":64,"column":6},"end":{"line":69,"column":8}},"33":{"start":{"line":71,"column":6},"end":{"line":73,"column":7}},"34":{"start":{"line":72,"column":8},"end":{"line":72,"column":47}},"35":{"start":{"line":75,"column":4},"end":{"line":75,"column":55}},"36":{"start":{"line":77,"column":4},"end":{"line":77,"column":19}},"37":{"start":{"line":79,"column":2},"end":{"line":79,"column":55}},"38":{"start":{"line":83,"column":19},"end":{"line":83,"column":38}},"39":{"start":{"line":84,"column":22},"end":{"line":84,"column":60}},"40":{"start":{"line":85,"column":2},"end":{"line":85,"column":21}},"41":{"start":{"line":88,"column":0},"end":{"line":88,"column":26}}},"fnMap":{"0":{"name":"processEvent","decl":{"start":{"line":16,"column":9},"end":{"line":16,"column":21}},"loc":{"start":{"line":16,"column":29},"end":{"line":80,"column":1}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":34,"column":37},"end":{"line":34,"column":38}},"loc":{"start":{"line":34,"column":44},"end":{"line":38,"column":5}},"line":34},"2":{"name":"process","decl":{"start":{"line":82,"column":9},"end":{"line":82,"column":16}},"loc":{"start":{"line":82,"column":24},"end":{"line":86,"column":1}},"line":82}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":2},"end":{"line":78,"column":3}},"type":"if","locations":[{"start":{"line":19,"column":2},"end":{"line":78,"column":3}},{"start":{"line":19,"column":2},"end":{"line":78,"column":3}}],"line":19},"1":{"loc":{"start":{"line":35,"column":6},"end":{"line":37,"column":7}},"type":"if","locations":[{"start":{"line":35,"column":6},"end":{"line":37,"column":7}},{"start":{"line":35,"column":6},"end":{"line":37,"column":7}}],"line":35},"2":{"loc":{"start":{"line":35,"column":10},"end":{"line":35,"column":69}},"type":"binary-expr","locations":[{"start":{"line":35,"column":10},"end":{"line":35,"column":28}},{"start":{"line":35,"column":32},"end":{"line":35,"column":69}}],"line":35},"3":{"loc":{"start":{"line":40,"column":4},"end":{"line":42,"column":5}},"type":"if","locations":[{"start":{"line":40,"column":4},"end":{"line":42,"column":5}},{"start":{"line":40,"column":4},"end":{"line":42,"column":5}}],"line":40},"4":{"loc":{"start":{"line":44,"column":4},"end":{"line":58,"column":5}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":58,"column":5}},{"start":{"line":44,"column":4},"end":{"line":58,"column":5}}],"line":44},"5":{"loc":{"start":{"line":45,"column":6},"end":{"line":49,"column":7}},"type":"if","locations":[{"start":{"line":45,"column":6},"end":{"line":49,"column":7}},{"start":{"line":45,"column":6},"end":{"line":49,"column":7}}],"line":45},"6":{"loc":{"start":{"line":47,"column":13},"end":{"line":49,"column":7}},"type":"if","locations":[{"start":{"line":47,"column":13},"end":{"line":49,"column":7}},{"start":{"line":47,"column":13},"end":{"line":49,"column":7}}],"line":47},"7":{"loc":{"start":{"line":51,"column":6},"end":{"line":53,"column":7}},"type":"if","locations":[{"start":{"line":51,"column":6},"end":{"line":53,"column":7}},{"start":{"line":51,"column":6},"end":{"line":53,"column":7}}],"line":51},"8":{"loc":{"start":{"line":51,"column":10},"end":{"line":51,"column":69}},"type":"binary-expr","locations":[{"start":{"line":51,"column":10},"end":{"line":51,"column":28}},{"start":{"line":51,"column":32},"end":{"line":51,"column":69}}],"line":51},"9":{"loc":{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},"type":"if","locations":[{"start":{"line":55,"column":6},"end":{"line":57,"column":7}},{"start":{"line":55,"column":6},"end":{"line":57,"column":7}}],"line":55},"10":{"loc":{"start":{"line":55,"column":10},"end":{"line":55,"column":75}},"type":"binary-expr","locations":[{"start":{"line":55,"column":10},"end":{"line":55,"column":28}},{"start":{"line":55,"column":32},"end":{"line":55,"column":75}}],"line":55},"11":{"loc":{"start":{"line":59,"column":4},"end":{"line":61,"column":5}},"type":"if","locations":[{"start":{"line":59,"column":4},"end":{"line":61,"column":5}},{"start":{"line":59,"column":4},"end":{"line":61,"column":5}}],"line":59},"12":{"loc":{"start":{"line":63,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":63,"column":4},"end":{"line":74,"column":5}},{"start":{"line":63,"column":4},"end":{"line":74,"column":5}}],"line":63},"13":{"loc":{"start":{"line":71,"column":6},"end":{"line":73,"column":7}},"type":"if","locations":[{"start":{"line":71,"column":6},"end":{"line":73,"column":7}},{"start":{"line":71,"column":6},"end":{"line":73,"column":7}}],"line":71},"14":{"loc":{"start":{"line":71,"column":10},"end":{"line":71,"column":77}},"type":"binary-expr","locations":[{"start":{"line":71,"column":10},"end":{"line":71,"column":28}},{"start":{"line":71,"column":32},"end":{"line":71,"column":77}}],"line":71}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":8,"7":8,"8":7,"9":7,"10":7,"11":7,"12":7,"13":7,"14":7,"15":7,"16":112,"17":107,"18":7,"19":4,"20":7,"21":7,"22":6,"23":1,"24":1,"25":7,"26":7,"27":7,"28":7,"29":7,"30":7,"31":7,"32":7,"33":7,"34":7,"35":7,"36":7,"37":1,"38":8,"39":7,"40":7,"41":1},"f":{"0":8,"1":112,"2":8},"b":{"0":[7,1],"1":[107,5],"2":[112,112],"3":[4,3],"4":[7,0],"5":[6,1],"6":[1,0],"7":[7,0],"8":[7,7],"9":[7,0],"10":[7,7],"11":[7,0],"12":[7,0],"13":[7,0],"14":[7,7]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1084a443f9e4e21500fa86090af100595a206e70"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\auth0\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\auth0\\transform.js","statementMap":{"0":{"start":{"line":1,"column":13},"end":{"line":1,"column":28}},"1":{"start":{"line":2,"column":11},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":10},"end":{"line":3,"column":27}},"3":{"start":{"line":5,"column":16},"end":{"line":7,"column":1}},"4":{"start":{"line":8,"column":16},"end":{"line":8,"column":37}},"5":{"start":{"line":11,"column":21},"end":{"line":13,"column":1}},"6":{"start":{"line":19,"column":18},"end":{"line":19,"column":40}},"7":{"start":{"line":19,"column":23},"end":{"line":19,"column":40}},"8":{"start":{"line":20,"column":18},"end":{"line":20,"column":32}},"9":{"start":{"line":20,"column":23},"end":{"line":20,"column":32}},"10":{"start":{"line":21,"column":28},"end":{"line":21,"column":61}},"11":{"start":{"line":21,"column":33},"end":{"line":21,"column":61}},"12":{"start":{"line":22,"column":37},"end":{"line":22,"column":78}},"13":{"start":{"line":22,"column":44},"end":{"line":22,"column":78}},"14":{"start":{"line":25,"column":22},"end":{"line":25,"column":29}},"15":{"start":{"line":27,"column":2},"end":{"line":52,"column":3}},"16":{"start":{"line":28,"column":22},"end":{"line":28,"column":32}},"17":{"start":{"line":29,"column":20},"end":{"line":29,"column":40}},"18":{"start":{"line":32,"column":4},"end":{"line":32,"column":38}},"19":{"start":{"line":34,"column":22},"end":{"line":34,"column":58}},"20":{"start":{"line":35,"column":4},"end":{"line":35,"column":36}},"21":{"start":{"line":37,"column":4},"end":{"line":37,"column":42}},"22":{"start":{"line":39,"column":4},"end":{"line":42,"column":5}},"23":{"start":{"line":40,"column":6},"end":{"line":40,"column":59}},"24":{"start":{"line":41,"column":6},"end":{"line":41,"column":48}},"25":{"start":{"line":44,"column":4},"end":{"line":46,"column":5}},"26":{"start":{"line":45,"column":6},"end":{"line":45,"column":53}},"27":{"start":{"line":48,"column":4},"end":{"line":50,"column":5}},"28":{"start":{"line":49,"column":6},"end":{"line":49,"column":21}},"29":{"start":{"line":51,"column":4},"end":{"line":51,"column":16}},"30":{"start":{"line":53,"column":2},"end":{"line":53,"column":51}},"31":{"start":{"line":57,"column":20},"end":{"line":57,"column":22}},"32":{"start":{"line":58,"column":18},"end":{"line":58,"column":24}},"33":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"34":{"start":{"line":60,"column":4},"end":{"line":60,"column":25}},"35":{"start":{"line":62,"column":2},"end":{"line":75,"column":5}},"36":{"start":{"line":63,"column":4},"end":{"line":74,"column":5}},"37":{"start":{"line":64,"column":19},"end":{"line":64,"column":38}},"38":{"start":{"line":65,"column":6},"end":{"line":67,"column":7}},"39":{"start":{"line":66,"column":8},"end":{"line":66,"column":59}},"40":{"start":{"line":76,"column":2},"end":{"line":80,"column":3}},"41":{"start":{"line":77,"column":4},"end":{"line":77,"column":56}},"42":{"start":{"line":79,"column":4},"end":{"line":79,"column":21}},"43":{"start":{"line":83,"column":0},"end":{"line":83,"column":26}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":19,"column":18},"end":{"line":19,"column":19}},"loc":{"start":{"line":19,"column":23},"end":{"line":19,"column":40}},"line":19},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":18},"end":{"line":20,"column":19}},"loc":{"start":{"line":20,"column":23},"end":{"line":20,"column":32}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":21,"column":28},"end":{"line":21,"column":29}},"loc":{"start":{"line":21,"column":33},"end":{"line":21,"column":61}},"line":21},"3":{"name":"(anonymous_3)","decl":{"start":{"line":22,"column":37},"end":{"line":22,"column":38}},"loc":{"start":{"line":22,"column":44},"end":{"line":22,"column":78}},"line":22},"4":{"name":"processEvent","decl":{"start":{"line":24,"column":9},"end":{"line":24,"column":21}},"loc":{"start":{"line":24,"column":29},"end":{"line":54,"column":1}},"line":24},"5":{"name":"process","decl":{"start":{"line":56,"column":9},"end":{"line":56,"column":16}},"loc":{"start":{"line":56,"column":25},"end":{"line":81,"column":1}},"line":56},"6":{"name":"(anonymous_6)","decl":{"start":{"line":62,"column":20},"end":{"line":62,"column":21}},"loc":{"start":{"line":62,"column":29},"end":{"line":75,"column":3}},"line":62}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":33},"end":{"line":21,"column":61}},"type":"binary-expr","locations":[{"start":{"line":21,"column":33},"end":{"line":21,"column":45}},{"start":{"line":21,"column":49},"end":{"line":21,"column":61}}],"line":21},"1":{"loc":{"start":{"line":27,"column":2},"end":{"line":52,"column":3}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":52,"column":3}},{"start":{"line":27,"column":2},"end":{"line":52,"column":3}}],"line":27},"2":{"loc":{"start":{"line":34,"column":22},"end":{"line":34,"column":58}},"type":"binary-expr","locations":[{"start":{"line":34,"column":22},"end":{"line":34,"column":45}},{"start":{"line":34,"column":49},"end":{"line":34,"column":58}}],"line":34},"3":{"loc":{"start":{"line":39,"column":4},"end":{"line":42,"column":5}},"type":"if","locations":[{"start":{"line":39,"column":4},"end":{"line":42,"column":5}},{"start":{"line":39,"column":4},"end":{"line":42,"column":5}}],"line":39},"4":{"loc":{"start":{"line":44,"column":4},"end":{"line":46,"column":5}},"type":"if","locations":[{"start":{"line":44,"column":4},"end":{"line":46,"column":5}},{"start":{"line":44,"column":4},"end":{"line":46,"column":5}}],"line":44},"5":{"loc":{"start":{"line":44,"column":8},"end":{"line":44,"column":49}},"type":"binary-expr","locations":[{"start":{"line":44,"column":8},"end":{"line":44,"column":23}},{"start":{"line":44,"column":27},"end":{"line":44,"column":49}}],"line":44},"6":{"loc":{"start":{"line":48,"column":4},"end":{"line":50,"column":5}},"type":"if","locations":[{"start":{"line":48,"column":4},"end":{"line":50,"column":5}},{"start":{"line":48,"column":4},"end":{"line":50,"column":5}}],"line":48},"7":{"loc":{"start":{"line":48,"column":8},"end":{"line":48,"column":47}},"type":"binary-expr","locations":[{"start":{"line":48,"column":8},"end":{"line":48,"column":22}},{"start":{"line":48,"column":26},"end":{"line":48,"column":47}}],"line":48},"8":{"loc":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},{"start":{"line":59,"column":2},"end":{"line":61,"column":3}}],"line":59},"9":{"loc":{"start":{"line":65,"column":6},"end":{"line":67,"column":7}},"type":"if","locations":[{"start":{"line":65,"column":6},"end":{"line":67,"column":7}},{"start":{"line":65,"column":6},"end":{"line":67,"column":7}}],"line":65},"10":{"loc":{"start":{"line":76,"column":2},"end":{"line":80,"column":3}},"type":"if","locations":[{"start":{"line":76,"column":2},"end":{"line":80,"column":3}},{"start":{"line":76,"column":2},"end":{"line":80,"column":3}}],"line":76}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":22,"8":1,"9":22,"10":1,"11":22,"12":1,"13":3,"14":4,"15":4,"16":3,"17":3,"18":3,"19":3,"20":3,"21":3,"22":3,"23":2,"24":2,"25":3,"26":3,"27":3,"28":3,"29":0,"30":1,"31":1,"32":1,"33":1,"34":0,"35":1,"36":4,"37":4,"38":3,"39":3,"40":1,"41":0,"42":1,"43":1},"f":{"0":22,"1":22,"2":22,"3":3,"4":4,"5":1,"6":4},"b":{"0":[22,22],"1":[3,1],"2":[3,0],"3":[2,1],"4":[3,0],"5":[3,3],"6":[3,0],"7":[3,3],"8":[0,1],"9":[3,0],"10":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c261c9fd599e7aa2970aef9b3dd3bacf2188630a"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\braze\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\braze\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":3,"column":13},"end":{"line":3,"column":28}},"3":{"start":{"line":4,"column":11},"end":{"line":4,"column":24}},"4":{"start":{"line":5,"column":58},"end":{"line":5,"column":79}},"5":{"start":{"line":6,"column":16},"end":{"line":6,"column":37}},"6":{"start":{"line":9,"column":16},"end":{"line":11,"column":1}},"7":{"start":{"line":14,"column":21},"end":{"line":16,"column":1}},"8":{"start":{"line":21,"column":26},"end":{"line":23,"column":1}},"9":{"start":{"line":25,"column":21},"end":{"line":70,"column":1}},"10":{"start":{"line":26,"column":22},"end":{"line":26,"column":29}},"11":{"start":{"line":28,"column":2},"end":{"line":68,"column":3}},"12":{"start":{"line":29,"column":22},"end":{"line":29,"column":38}},"13":{"start":{"line":30,"column":20},"end":{"line":30,"column":40}},"14":{"start":{"line":33,"column":4},"end":{"line":33,"column":38}},"15":{"start":{"line":36,"column":22},"end":{"line":36,"column":58}},"16":{"start":{"line":37,"column":4},"end":{"line":37,"column":36}},"17":{"start":{"line":40,"column":4},"end":{"line":40,"column":42}},"18":{"start":{"line":43,"column":4},"end":{"line":48,"column":5}},"19":{"start":{"line":44,"column":6},"end":{"line":47,"column":8}},"20":{"start":{"line":52,"column":4},"end":{"line":59,"column":5}},"21":{"start":{"line":53,"column":6},"end":{"line":58,"column":9}},"22":{"start":{"line":54,"column":8},"end":{"line":57,"column":9}},"23":{"start":{"line":56,"column":10},"end":{"line":56,"column":77}},"24":{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},"25":{"start":{"line":63,"column":6},"end":{"line":63,"column":21}},"26":{"start":{"line":67,"column":4},"end":{"line":67,"column":16}},"27":{"start":{"line":69,"column":2},"end":{"line":69,"column":51}},"28":{"start":{"line":72,"column":16},"end":{"line":99,"column":1}},"29":{"start":{"line":73,"column":20},"end":{"line":73,"column":22}},"30":{"start":{"line":77,"column":4},"end":{"line":79,"column":21}},"31":{"start":{"line":80,"column":2},"end":{"line":93,"column":5}},"32":{"start":{"line":81,"column":4},"end":{"line":92,"column":5}},"33":{"start":{"line":82,"column":19},"end":{"line":82,"column":38}},"34":{"start":{"line":83,"column":6},"end":{"line":85,"column":7}},"35":{"start":{"line":84,"column":8},"end":{"line":84,"column":59}},"36":{"start":{"line":94,"column":2},"end":{"line":98,"column":3}},"37":{"start":{"line":95,"column":4},"end":{"line":95,"column":56}},"38":{"start":{"line":97,"column":4},"end":{"line":97,"column":21}},"39":{"start":{"line":101,"column":0},"end":{"line":101,"column":26}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":25,"column":21},"end":{"line":25,"column":22}},"loc":{"start":{"line":25,"column":30},"end":{"line":70,"column":1}},"line":25},"1":{"name":"(anonymous_1)","decl":{"start":{"line":53,"column":44},"end":{"line":53,"column":45}},"loc":{"start":{"line":53,"column":51},"end":{"line":58,"column":7}},"line":53},"2":{"name":"(anonymous_2)","decl":{"start":{"line":72,"column":16},"end":{"line":72,"column":17}},"loc":{"start":{"line":72,"column":26},"end":{"line":99,"column":1}},"line":72},"3":{"name":"(anonymous_3)","decl":{"start":{"line":80,"column":20},"end":{"line":80,"column":21}},"loc":{"start":{"line":80,"column":29},"end":{"line":93,"column":3}},"line":80}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":2},"end":{"line":68,"column":3}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":68,"column":3}},{"start":{"line":28,"column":2},"end":{"line":68,"column":3}}],"line":28},"1":{"loc":{"start":{"line":36,"column":22},"end":{"line":36,"column":58}},"type":"binary-expr","locations":[{"start":{"line":36,"column":22},"end":{"line":36,"column":45}},{"start":{"line":36,"column":49},"end":{"line":36,"column":58}}],"line":36},"2":{"loc":{"start":{"line":43,"column":4},"end":{"line":48,"column":5}},"type":"if","locations":[{"start":{"line":43,"column":4},"end":{"line":48,"column":5}},{"start":{"line":43,"column":4},"end":{"line":48,"column":5}}],"line":43},"3":{"loc":{"start":{"line":52,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":52,"column":4},"end":{"line":59,"column":5}},{"start":{"line":52,"column":4},"end":{"line":59,"column":5}}],"line":52},"4":{"loc":{"start":{"line":54,"column":8},"end":{"line":57,"column":9}},"type":"if","locations":[{"start":{"line":54,"column":8},"end":{"line":57,"column":9}},{"start":{"line":54,"column":8},"end":{"line":57,"column":9}}],"line":54},"5":{"loc":{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},"type":"if","locations":[{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},{"start":{"line":62,"column":4},"end":{"line":64,"column":5}}],"line":62},"6":{"loc":{"start":{"line":62,"column":8},"end":{"line":62,"column":45}},"type":"binary-expr","locations":[{"start":{"line":62,"column":8},"end":{"line":62,"column":22}},{"start":{"line":62,"column":26},"end":{"line":62,"column":45}}],"line":62},"7":{"loc":{"start":{"line":77,"column":4},"end":{"line":79,"column":21}},"type":"cond-expr","locations":[{"start":{"line":78,"column":8},"end":{"line":78,"column":24}},{"start":{"line":79,"column":8},"end":{"line":79,"column":21}}],"line":77},"8":{"loc":{"start":{"line":77,"column":4},"end":{"line":77,"column":46}},"type":"binary-expr","locations":[{"start":{"line":77,"column":4},"end":{"line":77,"column":25}},{"start":{"line":77,"column":29},"end":{"line":77,"column":46}}],"line":77},"9":{"loc":{"start":{"line":83,"column":6},"end":{"line":85,"column":7}},"type":"if","locations":[{"start":{"line":83,"column":6},"end":{"line":85,"column":7}},{"start":{"line":83,"column":6},"end":{"line":85,"column":7}}],"line":83},"10":{"loc":{"start":{"line":94,"column":2},"end":{"line":98,"column":3}},"type":"if","locations":[{"start":{"line":94,"column":2},"end":{"line":98,"column":3}},{"start":{"line":94,"column":2},"end":{"line":98,"column":3}}],"line":94}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":11,"11":11,"12":11,"13":11,"14":11,"15":11,"16":11,"17":11,"18":11,"19":11,"20":11,"21":11,"22":89,"23":62,"24":11,"25":11,"26":0,"27":0,"28":1,"29":1,"30":1,"31":1,"32":11,"33":11,"34":11,"35":11,"36":1,"37":0,"38":1,"39":1},"f":{"0":11,"1":89,"2":1,"3":11},"b":{"0":[11,0],"1":[11,11],"2":[11,0],"3":[11,0],"4":[62,27],"5":[11,0],"6":[11,0],"7":[1,0],"8":[1,1],"9":[11,0],"10":[0,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"d82f158910361e135b4e1e0cc6af0c93a6269f7d"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\customerio\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\customerio\\config.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":4,"column":1}},"1":{"start":{"line":6,"column":26},"end":{"line":19,"column":1}},"2":{"start":{"line":21,"column":24},"end":{"line":30,"column":1}},"3":{"start":{"line":32,"column":25},"end":{"line":42,"column":1}},"4":{"start":{"line":44,"column":26},"end":{"line":50,"column":1}},"5":{"start":{"line":52,"column":28},"end":{"line":58,"column":1}},"6":{"start":{"line":60,"column":22},"end":{"line":67,"column":1}},"7":{"start":{"line":69,"column":0},"end":{"line":77,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"77abc7ba49b926ba756fd7f9935763ba4c8d9694"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\customerio\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\customerio\\transform.js","statementMap":{"0":{"start":{"line":1,"column":13},"end":{"line":1,"column":28}},"1":{"start":{"line":2,"column":11},"end":{"line":2,"column":24}},"2":{"start":{"line":4,"column":16},"end":{"line":6,"column":1}},"3":{"start":{"line":7,"column":16},"end":{"line":7,"column":37}},"4":{"start":{"line":8,"column":26},"end":{"line":8,"column":45}},"5":{"start":{"line":11,"column":18},"end":{"line":11,"column":44}},"6":{"start":{"line":15,"column":20},"end":{"line":15,"column":27}},"7":{"start":{"line":16,"column":2},"end":{"line":16,"column":34}},"8":{"start":{"line":18,"column":18},"end":{"line":18,"column":78}},"9":{"start":{"line":19,"column":2},"end":{"line":22,"column":3}},"10":{"start":{"line":21,"column":4},"end":{"line":21,"column":32}},"11":{"start":{"line":23,"column":2},"end":{"line":23,"column":34}},"12":{"start":{"line":25,"column":2},"end":{"line":25,"column":40}},"13":{"start":{"line":27,"column":2},"end":{"line":31,"column":3}},"14":{"start":{"line":28,"column":15},"end":{"line":28,"column":61}},"15":{"start":{"line":29,"column":4},"end":{"line":29,"column":49}},"16":{"start":{"line":30,"column":4},"end":{"line":30,"column":38}},"17":{"start":{"line":34,"column":2},"end":{"line":42,"column":3}},"18":{"start":{"line":35,"column":4},"end":{"line":41,"column":5}},"19":{"start":{"line":40,"column":6},"end":{"line":40,"column":57}},"20":{"start":{"line":44,"column":2},"end":{"line":44,"column":17}},"21":{"start":{"line":47,"column":0},"end":{"line":47,"column":29}}},"fnMap":{"0":{"name":"process","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":16}},"loc":{"start":{"line":10,"column":24},"end":{"line":45,"column":1}},"line":10}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":2},"end":{"line":22,"column":3}},"type":"if","locations":[{"start":{"line":19,"column":2},"end":{"line":22,"column":3}},{"start":{"line":19,"column":2},"end":{"line":22,"column":3}}],"line":19},"1":{"loc":{"start":{"line":27,"column":2},"end":{"line":31,"column":3}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":31,"column":3}},{"start":{"line":27,"column":2},"end":{"line":31,"column":3}}],"line":27},"2":{"loc":{"start":{"line":34,"column":2},"end":{"line":42,"column":3}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":42,"column":3}},{"start":{"line":34,"column":2},"end":{"line":42,"column":3}}],"line":34},"3":{"loc":{"start":{"line":34,"column":6},"end":{"line":34,"column":61}},"type":"binary-expr","locations":[{"start":{"line":34,"column":6},"end":{"line":34,"column":29}},{"start":{"line":34,"column":33},"end":{"line":34,"column":61}}],"line":34},"4":{"loc":{"start":{"line":35,"column":4},"end":{"line":41,"column":5}},"type":"if","locations":[{"start":{"line":35,"column":4},"end":{"line":41,"column":5}},{"start":{"line":35,"column":4},"end":{"line":41,"column":5}}],"line":35},"5":{"loc":{"start":{"line":36,"column":6},"end":{"line":38,"column":34}},"type":"binary-expr","locations":[{"start":{"line":36,"column":6},"end":{"line":36,"column":21}},{"start":{"line":37,"column":6},"end":{"line":37,"column":28}},{"start":{"line":38,"column":6},"end":{"line":38,"column":34}}],"line":36}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":19,"6":19,"7":19,"8":19,"9":19,"10":0,"11":19,"12":19,"13":19,"14":19,"15":19,"16":19,"17":19,"18":0,"19":0,"20":19,"21":1},"f":{"0":19},"b":{"0":[0,19],"1":[19,0],"2":[0,19],"3":[19,19],"4":[0,0],"5":[0,0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ad086f68209f124ae3c11b9efe2cfb7100cfa51a"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\iterable\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\iterable\\transform.js","statementMap":{"0":{"start":{"line":1,"column":13},"end":{"line":1,"column":28}},"1":{"start":{"line":2,"column":11},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":12},"end":{"line":3,"column":26}},"3":{"start":{"line":4,"column":16},"end":{"line":4,"column":37}},"4":{"start":{"line":7,"column":16},"end":{"line":9,"column":1}},"5":{"start":{"line":13,"column":2},"end":{"line":15,"column":3}},"6":{"start":{"line":14,"column":4},"end":{"line":14,"column":56}},"7":{"start":{"line":16,"column":18},"end":{"line":16,"column":41}},"8":{"start":{"line":19,"column":20},"end":{"line":19,"column":27}},"9":{"start":{"line":21,"column":2},"end":{"line":21,"column":34}},"10":{"start":{"line":23,"column":2},"end":{"line":23,"column":40}},"11":{"start":{"line":25,"column":2},"end":{"line":25,"column":42}},"12":{"start":{"line":27,"column":2},"end":{"line":27,"column":48}},"13":{"start":{"line":29,"column":2},"end":{"line":33,"column":3}},"14":{"start":{"line":30,"column":15},"end":{"line":30,"column":65}},"15":{"start":{"line":31,"column":4},"end":{"line":31,"column":28}},"16":{"start":{"line":32,"column":4},"end":{"line":32,"column":27}},"17":{"start":{"line":36,"column":2},"end":{"line":36,"column":34}},"18":{"start":{"line":40,"column":2},"end":{"line":42,"column":3}},"19":{"start":{"line":41,"column":4},"end":{"line":41,"column":38}},"20":{"start":{"line":44,"column":2},"end":{"line":44,"column":17}},"21":{"start":{"line":47,"column":0},"end":{"line":47,"column":29}}},"fnMap":{"0":{"name":"process","decl":{"start":{"line":11,"column":9},"end":{"line":11,"column":16}},"loc":{"start":{"line":11,"column":24},"end":{"line":45,"column":1}},"line":11}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":2},"end":{"line":15,"column":3}},"type":"if","locations":[{"start":{"line":13,"column":2},"end":{"line":15,"column":3}},{"start":{"line":13,"column":2},"end":{"line":15,"column":3}}],"line":13},"1":{"loc":{"start":{"line":13,"column":8},"end":{"line":13,"column":38}},"type":"binary-expr","locations":[{"start":{"line":13,"column":8},"end":{"line":13,"column":19}},{"start":{"line":13,"column":23},"end":{"line":13,"column":38}}],"line":13},"2":{"loc":{"start":{"line":29,"column":2},"end":{"line":33,"column":3}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":33,"column":3}},{"start":{"line":29,"column":2},"end":{"line":33,"column":3}}],"line":29},"3":{"loc":{"start":{"line":40,"column":2},"end":{"line":42,"column":3}},"type":"if","locations":[{"start":{"line":40,"column":2},"end":{"line":42,"column":3}},{"start":{"line":40,"column":2},"end":{"line":42,"column":3}}],"line":40},"4":{"loc":{"start":{"line":40,"column":6},"end":{"line":40,"column":61}},"type":"binary-expr","locations":[{"start":{"line":40,"column":6},"end":{"line":40,"column":29}},{"start":{"line":40,"column":33},"end":{"line":40,"column":61}}],"line":40}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":30,"6":2,"7":28,"8":28,"9":28,"10":28,"11":28,"12":28,"13":28,"14":27,"15":27,"16":27,"17":27,"18":27,"19":26,"20":27,"21":1},"f":{"0":30},"b":{"0":[2,28],"1":[30,29],"2":[27,0],"3":[26,1],"4":[27,27]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0fb3cd2863c65260b2893374db53553954a8f322"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\segment\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\segment\\transform.js","statementMap":{"0":{"start":{"line":2,"column":2},"end":{"line":2,"column":16}},"1":{"start":{"line":5,"column":0},"end":{"line":5,"column":26}}},"fnMap":{"0":{"name":"process","decl":{"start":{"line":1,"column":9},"end":{"line":1,"column":16}},"loc":{"start":{"line":1,"column":25},"end":{"line":3,"column":1}},"line":1}},"branchMap":{},"s":{"0":1,"1":1},"f":{"0":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4f0a8042918276f157c6fa4aa4bdb99aea44e468"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\shopify\\config.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\shopify\\config.js","statementMap":{"0":{"start":{"line":1,"column":13},"end":{"line":1,"column":28}},"1":{"start":{"line":2,"column":11},"end":{"line":2,"column":24}},"2":{"start":{"line":3,"column":22},"end":{"line":3,"column":51}},"3":{"start":{"line":5,"column":24},"end":{"line":8,"column":1}},"4":{"start":{"line":11,"column":20},"end":{"line":16,"column":1}},"5":{"start":{"line":18,"column":24},"end":{"line":23,"column":1}},"6":{"start":{"line":25,"column":26},"end":{"line":37,"column":1}},"7":{"start":{"line":39,"column":28},"end":{"line":41,"column":1}},"8":{"start":{"line":43,"column":27},"end":{"line":45,"column":1}},"9":{"start":{"line":47,"column":29},"end":{"line":49,"column":1}},"10":{"start":{"line":51,"column":21},"end":{"line":51,"column":30}},"11":{"start":{"line":53,"column":27},"end":{"line":56,"column":1}},"12":{"start":{"line":58,"column":35},"end":{"line":68,"column":1}},"13":{"start":{"line":70,"column":41},"end":{"line":79,"column":1}},"14":{"start":{"line":86,"column":31},"end":{"line":102,"column":1}},"15":{"start":{"line":104,"column":0},"end":{"line":116,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e159a966a0be3d2df8b9cd522c158386bd79210a"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\shopify\\transform.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\shopify\\transform.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":32}},"1":{"start":{"line":7,"column":4},"end":{"line":7,"column":21}},"2":{"start":{"line":12,"column":4},"end":{"line":12,"column":25}},"3":{"start":{"line":13,"column":16},"end":{"line":13,"column":37}},"4":{"start":{"line":14,"column":22},"end":{"line":14,"column":51}},"5":{"start":{"line":22,"column":4},"end":{"line":22,"column":23}},"6":{"start":{"line":24,"column":31},"end":{"line":33,"column":1}},"7":{"start":{"line":25,"column":18},"end":{"line":25,"column":43}},"8":{"start":{"line":26,"column":2},"end":{"line":26,"column":43}},"9":{"start":{"line":27,"column":2},"end":{"line":27,"column":73}},"10":{"start":{"line":28,"column":2},"end":{"line":31,"column":3}},"11":{"start":{"line":30,"column":4},"end":{"line":30,"column":67}},"12":{"start":{"line":32,"column":2},"end":{"line":32,"column":17}},"13":{"start":{"line":35,"column":27},"end":{"line":75,"column":1}},"14":{"start":{"line":36,"column":18},"end":{"line":36,"column":43}},"15":{"start":{"line":37,"column":2},"end":{"line":37,"column":40}},"16":{"start":{"line":38,"column":2},"end":{"line":38,"column":54}},"17":{"start":{"line":40,"column":19},"end":{"line":40,"column":54}},"18":{"start":{"line":41,"column":2},"end":{"line":41,"column":56}},"19":{"start":{"line":42,"column":2},"end":{"line":44,"column":4}},"20":{"start":{"line":43,"column":4},"end":{"line":43,"column":61}},"21":{"start":{"line":46,"column":26},"end":{"line":46,"column":48}},"22":{"start":{"line":47,"column":2},"end":{"line":52,"column":3}},"23":{"start":{"line":48,"column":4},"end":{"line":51,"column":6}},"24":{"start":{"line":53,"column":2},"end":{"line":57,"column":3}},"25":{"start":{"line":56,"column":4},"end":{"line":56,"column":67}},"26":{"start":{"line":58,"column":2},"end":{"line":63,"column":3}},"27":{"start":{"line":59,"column":4},"end":{"line":62,"column":6}},"28":{"start":{"line":64,"column":2},"end":{"line":66,"column":3}},"29":{"start":{"line":65,"column":4},"end":{"line":65,"column":74}},"30":{"start":{"line":67,"column":2},"end":{"line":69,"column":3}},"31":{"start":{"line":68,"column":4},"end":{"line":68,"column":72}},"32":{"start":{"line":70,"column":2},"end":{"line":72,"column":3}},"33":{"start":{"line":71,"column":4},"end":{"line":71,"column":49}},"34":{"start":{"line":74,"column":2},"end":{"line":74,"column":17}},"35":{"start":{"line":77,"column":28},"end":{"line":115,"column":1}},"36":{"start":{"line":78,"column":18},"end":{"line":78,"column":43}},"37":{"start":{"line":79,"column":2},"end":{"line":79,"column":40}},"38":{"start":{"line":80,"column":2},"end":{"line":80,"column":37}},"39":{"start":{"line":81,"column":2},"end":{"line":95,"column":7}},"40":{"start":{"line":84,"column":8},"end":{"line":91,"column":23}},"41":{"start":{"line":94,"column":6},"end":{"line":94,"column":59}},"42":{"start":{"line":96,"column":36},"end":{"line":96,"column":41}},"43":{"start":{"line":97,"column":23},"end":{"line":97,"column":62}},"44":{"start":{"line":98,"column":2},"end":{"line":98,"column":59}},"45":{"start":{"line":99,"column":2},"end":{"line":104,"column":3}},"46":{"start":{"line":100,"column":4},"end":{"line":103,"column":6}},"47":{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},"48":{"start":{"line":106,"column":4},"end":{"line":106,"column":74}},"49":{"start":{"line":108,"column":2},"end":{"line":110,"column":3}},"50":{"start":{"line":109,"column":4},"end":{"line":109,"column":72}},"51":{"start":{"line":111,"column":2},"end":{"line":113,"column":3}},"52":{"start":{"line":112,"column":4},"end":{"line":112,"column":49}},"53":{"start":{"line":114,"column":2},"end":{"line":114,"column":17}},"54":{"start":{"line":117,"column":21},"end":{"line":158,"column":1}},"55":{"start":{"line":119,"column":23},"end":{"line":119,"column":45}},"56":{"start":{"line":120,"column":2},"end":{"line":120,"column":32}},"57":{"start":{"line":122,"column":2},"end":{"line":139,"column":3}},"58":{"start":{"line":125,"column":6},"end":{"line":125,"column":46}},"59":{"start":{"line":126,"column":6},"end":{"line":126,"column":12}},"60":{"start":{"line":131,"column":6},"end":{"line":131,"column":56}},"61":{"start":{"line":132,"column":6},"end":{"line":132,"column":12}},"62":{"start":{"line":134,"column":6},"end":{"line":136,"column":7}},"63":{"start":{"line":135,"column":8},"end":{"line":135,"column":79}},"64":{"start":{"line":137,"column":6},"end":{"line":137,"column":57}},"65":{"start":{"line":138,"column":6},"end":{"line":138,"column":12}},"66":{"start":{"line":141,"column":2},"end":{"line":143,"column":3}},"67":{"start":{"line":142,"column":4},"end":{"line":142,"column":44}},"68":{"start":{"line":144,"column":2},"end":{"line":149,"column":3}},"69":{"start":{"line":145,"column":18},"end":{"line":145,"column":48}},"70":{"start":{"line":146,"column":4},"end":{"line":148,"column":5}},"71":{"start":{"line":147,"column":6},"end":{"line":147,"column":49}},"72":{"start":{"line":150,"column":2},"end":{"line":150,"column":53}},"73":{"start":{"line":151,"column":2},"end":{"line":151,"column":60}},"74":{"start":{"line":152,"column":2},"end":{"line":155,"column":5}},"75":{"start":{"line":156,"column":2},"end":{"line":156,"column":50}},"76":{"start":{"line":157,"column":2},"end":{"line":157,"column":17}},"77":{"start":{"line":160,"column":16},"end":{"line":163,"column":1}},"78":{"start":{"line":161,"column":19},"end":{"line":161,"column":38}},"79":{"start":{"line":162,"column":2},"end":{"line":162,"column":18}},"80":{"start":{"line":165,"column":0},"end":{"line":165,"column":26}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":24,"column":31},"end":{"line":24,"column":32}},"loc":{"start":{"line":24,"column":40},"end":{"line":33,"column":1}},"line":24},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":27},"end":{"line":35,"column":28}},"loc":{"start":{"line":35,"column":52},"end":{"line":75,"column":1}},"line":35},"2":{"name":"(anonymous_2)","decl":{"start":{"line":42,"column":34},"end":{"line":42,"column":35}},"loc":{"start":{"line":43,"column":4},"end":{"line":43,"column":61}},"line":43},"3":{"name":"(anonymous_3)","decl":{"start":{"line":77,"column":28},"end":{"line":77,"column":29}},"loc":{"start":{"line":77,"column":53},"end":{"line":115,"column":1}},"line":77},"4":{"name":"(anonymous_4)","decl":{"start":{"line":83,"column":6},"end":{"line":83,"column":7}},"loc":{"start":{"line":84,"column":8},"end":{"line":91,"column":23}},"line":84},"5":{"name":"(anonymous_5)","decl":{"start":{"line":93,"column":13},"end":{"line":93,"column":14}},"loc":{"start":{"line":93,"column":20},"end":{"line":95,"column":5}},"line":93},"6":{"name":"(anonymous_6)","decl":{"start":{"line":117,"column":21},"end":{"line":117,"column":22}},"loc":{"start":{"line":117,"column":30},"end":{"line":158,"column":1}},"line":117},"7":{"name":"(anonymous_7)","decl":{"start":{"line":160,"column":16},"end":{"line":160,"column":17}},"loc":{"start":{"line":160,"column":25},"end":{"line":163,"column":1}},"line":160}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":2},"end":{"line":31,"column":3}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":31,"column":3}},{"start":{"line":28,"column":2},"end":{"line":31,"column":3}}],"line":28},"1":{"loc":{"start":{"line":47,"column":2},"end":{"line":52,"column":3}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":52,"column":3}},{"start":{"line":47,"column":2},"end":{"line":52,"column":3}}],"line":47},"2":{"loc":{"start":{"line":53,"column":2},"end":{"line":57,"column":3}},"type":"if","locations":[{"start":{"line":53,"column":2},"end":{"line":57,"column":3}},{"start":{"line":53,"column":2},"end":{"line":57,"column":3}}],"line":53},"3":{"loc":{"start":{"line":58,"column":2},"end":{"line":63,"column":3}},"type":"if","locations":[{"start":{"line":58,"column":2},"end":{"line":63,"column":3}},{"start":{"line":58,"column":2},"end":{"line":63,"column":3}}],"line":58},"4":{"loc":{"start":{"line":64,"column":2},"end":{"line":66,"column":3}},"type":"if","locations":[{"start":{"line":64,"column":2},"end":{"line":66,"column":3}},{"start":{"line":64,"column":2},"end":{"line":66,"column":3}}],"line":64},"5":{"loc":{"start":{"line":67,"column":2},"end":{"line":69,"column":3}},"type":"if","locations":[{"start":{"line":67,"column":2},"end":{"line":69,"column":3}},{"start":{"line":67,"column":2},"end":{"line":69,"column":3}}],"line":67},"6":{"loc":{"start":{"line":70,"column":2},"end":{"line":72,"column":3}},"type":"if","locations":[{"start":{"line":70,"column":2},"end":{"line":72,"column":3}},{"start":{"line":70,"column":2},"end":{"line":72,"column":3}}],"line":70},"7":{"loc":{"start":{"line":70,"column":6},"end":{"line":70,"column":38}},"type":"binary-expr","locations":[{"start":{"line":70,"column":6},"end":{"line":70,"column":21}},{"start":{"line":70,"column":25},"end":{"line":70,"column":38}}],"line":70},"8":{"loc":{"start":{"line":99,"column":2},"end":{"line":104,"column":3}},"type":"if","locations":[{"start":{"line":99,"column":2},"end":{"line":104,"column":3}},{"start":{"line":99,"column":2},"end":{"line":104,"column":3}}],"line":99},"9":{"loc":{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},{"start":{"line":105,"column":2},"end":{"line":107,"column":3}}],"line":105},"10":{"loc":{"start":{"line":108,"column":2},"end":{"line":110,"column":3}},"type":"if","locations":[{"start":{"line":108,"column":2},"end":{"line":110,"column":3}},{"start":{"line":108,"column":2},"end":{"line":110,"column":3}}],"line":108},"11":{"loc":{"start":{"line":111,"column":2},"end":{"line":113,"column":3}},"type":"if","locations":[{"start":{"line":111,"column":2},"end":{"line":113,"column":3}},{"start":{"line":111,"column":2},"end":{"line":113,"column":3}}],"line":111},"12":{"loc":{"start":{"line":111,"column":6},"end":{"line":111,"column":38}},"type":"binary-expr","locations":[{"start":{"line":111,"column":6},"end":{"line":111,"column":21}},{"start":{"line":111,"column":25},"end":{"line":111,"column":38}}],"line":111},"13":{"loc":{"start":{"line":122,"column":2},"end":{"line":139,"column":3}},"type":"switch","locations":[{"start":{"line":123,"column":4},"end":{"line":123,"column":42}},{"start":{"line":124,"column":4},"end":{"line":126,"column":12}},{"start":{"line":127,"column":4},"end":{"line":127,"column":35}},{"start":{"line":128,"column":4},"end":{"line":128,"column":35}},{"start":{"line":129,"column":4},"end":{"line":129,"column":38}},{"start":{"line":130,"column":4},"end":{"line":132,"column":12}},{"start":{"line":133,"column":4},"end":{"line":138,"column":12}}],"line":122},"14":{"loc":{"start":{"line":134,"column":6},"end":{"line":136,"column":7}},"type":"if","locations":[{"start":{"line":134,"column":6},"end":{"line":136,"column":7}},{"start":{"line":134,"column":6},"end":{"line":136,"column":7}}],"line":134},"15":{"loc":{"start":{"line":141,"column":2},"end":{"line":143,"column":3}},"type":"if","locations":[{"start":{"line":141,"column":2},"end":{"line":143,"column":3}},{"start":{"line":141,"column":2},"end":{"line":143,"column":3}}],"line":141},"16":{"loc":{"start":{"line":144,"column":2},"end":{"line":149,"column":3}},"type":"if","locations":[{"start":{"line":144,"column":2},"end":{"line":149,"column":3}},{"start":{"line":144,"column":2},"end":{"line":149,"column":3}}],"line":144},"17":{"loc":{"start":{"line":146,"column":4},"end":{"line":148,"column":5}},"type":"if","locations":[{"start":{"line":146,"column":4},"end":{"line":148,"column":5}},{"start":{"line":146,"column":4},"end":{"line":148,"column":5}}],"line":146}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":64,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":0,"30":1,"31":0,"32":1,"33":0,"34":1,"35":1,"36":2,"37":2,"38":2,"39":2,"40":42,"41":37,"42":2,"43":2,"44":2,"45":2,"46":1,"47":2,"48":1,"49":2,"50":1,"51":2,"52":0,"53":2,"54":1,"55":5,"56":5,"57":5,"58":1,"59":1,"60":1,"61":1,"62":3,"63":1,"64":2,"65":2,"66":4,"67":2,"68":4,"69":1,"70":1,"71":1,"72":4,"73":4,"74":4,"75":4,"76":4,"77":1,"78":5,"79":4,"80":1},"f":{"0":1,"1":1,"2":64,"3":2,"4":42,"5":37,"6":5,"7":5},"b":{"0":[1,0],"1":[1,0],"2":[1,0],"3":[1,0],"4":[0,1],"5":[0,1],"6":[0,1],"7":[1,0],"8":[1,1],"9":[1,1],"10":[1,1],"11":[0,2],"12":[2,2],"13":[1,1,0,1,1,1,3],"14":[1,2],"15":[2,2],"16":[1,3],"17":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1fe9b628a8381823c78d1c4fdd4f02b3eb44b4cf"} +,"D:\\WIP\\rudder-transformer\\v0\\sources\\shopify\\util.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\sources\\shopify\\util.js","statementMap":{"0":{"start":{"line":7,"column":4},"end":{"line":7,"column":25}},"1":{"start":{"line":13,"column":4},"end":{"line":13,"column":23}},"2":{"start":{"line":21,"column":24},"end":{"line":39,"column":1}},"3":{"start":{"line":22,"column":40},"end":{"line":22,"column":45}},"4":{"start":{"line":23,"column":2},"end":{"line":23,"column":39}},"5":{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},"6":{"start":{"line":25,"column":4},"end":{"line":25,"column":79}},"7":{"start":{"line":27,"column":20},"end":{"line":27,"column":27}},"8":{"start":{"line":28,"column":2},"end":{"line":33,"column":3}},"9":{"start":{"line":29,"column":4},"end":{"line":32,"column":6}},"10":{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},"11":{"start":{"line":36,"column":4},"end":{"line":36,"column":67}},"12":{"start":{"line":38,"column":2},"end":{"line":38,"column":18}},"13":{"start":{"line":41,"column":25},"end":{"line":44,"column":1}},"14":{"start":{"line":42,"column":55},"end":{"line":42,"column":63}},"15":{"start":{"line":43,"column":2},"end":{"line":43,"column":77}},"16":{"start":{"line":46,"column":37},"end":{"line":58,"column":1}},"17":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"18":{"start":{"line":48,"column":4},"end":{"line":48,"column":14}},"19":{"start":{"line":50,"column":19},"end":{"line":50,"column":21}},"20":{"start":{"line":51,"column":2},"end":{"line":56,"column":5}},"21":{"start":{"line":52,"column":20},"end":{"line":52,"column":68}},"22":{"start":{"line":53,"column":4},"end":{"line":53,"column":79}},"23":{"start":{"line":54,"column":4},"end":{"line":54,"column":49}},"24":{"start":{"line":55,"column":4},"end":{"line":55,"column":27}},"25":{"start":{"line":57,"column":2},"end":{"line":57,"column":18}},"26":{"start":{"line":60,"column":37},"end":{"line":72,"column":1}},"27":{"start":{"line":61,"column":36},"end":{"line":61,"column":43}},"28":{"start":{"line":62,"column":23},"end":{"line":62,"column":62}},"29":{"start":{"line":63,"column":24},"end":{"line":63,"column":69}},"30":{"start":{"line":64,"column":2},"end":{"line":69,"column":4}},"31":{"start":{"line":70,"column":2},"end":{"line":70,"column":40}},"32":{"start":{"line":71,"column":2},"end":{"line":71,"column":23}},"33":{"start":{"line":74,"column":32},"end":{"line":86,"column":1}},"34":{"start":{"line":75,"column":27},"end":{"line":75,"column":45}},"35":{"start":{"line":77,"column":22},"end":{"line":77,"column":52}},"36":{"start":{"line":78,"column":2},"end":{"line":84,"column":5}},"37":{"start":{"line":79,"column":4},"end":{"line":82,"column":5}},"38":{"start":{"line":80,"column":6},"end":{"line":80,"column":20}},"39":{"start":{"line":81,"column":6},"end":{"line":81,"column":18}},"40":{"start":{"line":83,"column":4},"end":{"line":83,"column":17}},"41":{"start":{"line":85,"column":2},"end":{"line":85,"column":15}},"42":{"start":{"line":88,"column":0},"end":{"line":93,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":21,"column":24},"end":{"line":21,"column":25}},"loc":{"start":{"line":21,"column":33},"end":{"line":39,"column":1}},"line":21},"1":{"name":"(anonymous_1)","decl":{"start":{"line":41,"column":25},"end":{"line":41,"column":26}},"loc":{"start":{"line":41,"column":37},"end":{"line":44,"column":1}},"line":41},"2":{"name":"(anonymous_2)","decl":{"start":{"line":46,"column":37},"end":{"line":46,"column":38}},"loc":{"start":{"line":46,"column":50},"end":{"line":58,"column":1}},"line":46},"3":{"name":"(anonymous_3)","decl":{"start":{"line":51,"column":20},"end":{"line":51,"column":21}},"loc":{"start":{"line":51,"column":32},"end":{"line":56,"column":3}},"line":51},"4":{"name":"(anonymous_4)","decl":{"start":{"line":60,"column":37},"end":{"line":60,"column":38}},"loc":{"start":{"line":60,"column":48},"end":{"line":72,"column":1}},"line":60},"5":{"name":"(anonymous_5)","decl":{"start":{"line":74,"column":32},"end":{"line":74,"column":33}},"loc":{"start":{"line":74,"column":41},"end":{"line":86,"column":1}},"line":74},"6":{"name":"(anonymous_6)","decl":{"start":{"line":78,"column":40},"end":{"line":78,"column":41}},"loc":{"start":{"line":78,"column":58},"end":{"line":84,"column":3}},"line":78}},"branchMap":{"0":{"loc":{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},"type":"if","locations":[{"start":{"line":24,"column":2},"end":{"line":26,"column":3}},{"start":{"line":24,"column":2},"end":{"line":26,"column":3}}],"line":24},"1":{"loc":{"start":{"line":28,"column":2},"end":{"line":33,"column":3}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":33,"column":3}},{"start":{"line":28,"column":2},"end":{"line":33,"column":3}}],"line":28},"2":{"loc":{"start":{"line":28,"column":6},"end":{"line":28,"column":37}},"type":"binary-expr","locations":[{"start":{"line":28,"column":6},"end":{"line":28,"column":12}},{"start":{"line":28,"column":16},"end":{"line":28,"column":37}}],"line":28},"3":{"loc":{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},"type":"if","locations":[{"start":{"line":35,"column":2},"end":{"line":37,"column":3}},{"start":{"line":35,"column":2},"end":{"line":37,"column":3}}],"line":35},"4":{"loc":{"start":{"line":43,"column":12},"end":{"line":43,"column":28}},"type":"binary-expr","locations":[{"start":{"line":43,"column":12},"end":{"line":43,"column":22}},{"start":{"line":43,"column":26},"end":{"line":43,"column":28}}],"line":43},"5":{"loc":{"start":{"line":43,"column":32},"end":{"line":43,"column":51}},"type":"binary-expr","locations":[{"start":{"line":43,"column":32},"end":{"line":43,"column":45}},{"start":{"line":43,"column":49},"end":{"line":43,"column":51}}],"line":43},"6":{"loc":{"start":{"line":43,"column":55},"end":{"line":43,"column":74}},"type":"binary-expr","locations":[{"start":{"line":43,"column":55},"end":{"line":43,"column":68}},{"start":{"line":43,"column":72},"end":{"line":43,"column":74}}],"line":43},"7":{"loc":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},{"start":{"line":47,"column":2},"end":{"line":49,"column":3}}],"line":47},"8":{"loc":{"start":{"line":47,"column":6},"end":{"line":47,"column":42}},"type":"binary-expr","locations":[{"start":{"line":47,"column":6},"end":{"line":47,"column":16}},{"start":{"line":47,"column":20},"end":{"line":47,"column":42}}],"line":47},"9":{"loc":{"start":{"line":79,"column":4},"end":{"line":82,"column":5}},"type":"if","locations":[{"start":{"line":79,"column":4},"end":{"line":82,"column":5}},{"start":{"line":79,"column":4},"end":{"line":82,"column":5}}],"line":79}},"s":{"0":1,"1":1,"2":1,"3":5,"4":5,"5":5,"6":0,"7":5,"8":5,"9":0,"10":5,"11":0,"12":5,"13":1,"14":3,"15":3,"16":1,"17":3,"18":0,"19":3,"20":3,"21":3,"22":3,"23":3,"24":3,"25":3,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":4,"38":1,"39":1,"40":3,"41":1,"42":1},"f":{"0":5,"1":3,"2":3,"3":3,"4":1,"5":1,"6":4},"b":{"0":[0,5],"1":[0,5],"2":[5,5],"3":[0,5],"4":[3,0],"5":[3,3],"6":[3,3],"7":[0,3],"8":[3,3],"9":[1,3]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"cee0e2669f882c97be8700cb7e2efffa69d8368a"} +,"D:\\WIP\\rudder-transformer\\v0\\util\\cache.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\util\\cache.js","statementMap":{"0":{"start":{"line":1,"column":18},"end":{"line":1,"column":39}},"1":{"start":{"line":5,"column":4},"end":{"line":9,"column":7}},"2":{"start":{"line":13,"column":18},"end":{"line":13,"column":37}},"3":{"start":{"line":14,"column":4},"end":{"line":16,"column":5}},"4":{"start":{"line":15,"column":6},"end":{"line":15,"column":36}},"5":{"start":{"line":18,"column":4},"end":{"line":24,"column":7}},"6":{"start":{"line":20,"column":6},"end":{"line":22,"column":7}},"7":{"start":{"line":21,"column":8},"end":{"line":21,"column":36}},"8":{"start":{"line":23,"column":6},"end":{"line":23,"column":20}},"9":{"start":{"line":28,"column":0},"end":{"line":28,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":2},"end":{"line":4,"column":3}},"loc":{"start":{"line":4,"column":26},"end":{"line":10,"column":3}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":2},"end":{"line":12,"column":3}},"loc":{"start":{"line":12,"column":26},"end":{"line":25,"column":3}},"line":12},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":32},"end":{"line":18,"column":33}},"loc":{"start":{"line":18,"column":42},"end":{"line":24,"column":5}},"line":18}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":4},"end":{"line":16,"column":5}},"type":"if","locations":[{"start":{"line":14,"column":4},"end":{"line":16,"column":5}},{"start":{"line":14,"column":4},"end":{"line":16,"column":5}}],"line":14},"1":{"loc":{"start":{"line":20,"column":6},"end":{"line":22,"column":7}},"type":"if","locations":[{"start":{"line":20,"column":6},"end":{"line":22,"column":7}},{"start":{"line":20,"column":6},"end":{"line":22,"column":7}}],"line":20}},"s":{"0":2,"1":6,"2":21,"3":21,"4":13,"5":8,"6":7,"7":7,"8":7,"9":2},"f":{"0":6,"1":21,"2":7},"b":{"0":[13,8],"1":[7,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"7e6bc3f30d5ec0d89c804d1496b5032e57919013"} +,"D:\\WIP\\rudder-transformer\\v0\\util\\constant.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\util\\constant.js","statementMap":{"0":{"start":{"line":1,"column":28},"end":{"line":3,"column":16}},"1":{"start":{"line":5,"column":23},"end":{"line":7,"column":11}},"2":{"start":{"line":9,"column":17},"end":{"line":9,"column":33}},"3":{"start":{"line":11,"column":27},"end":{"line":48,"column":1}},"4":{"start":{"line":50,"column":0},"end":{"line":55,"column":2}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":1,"column":28},"end":{"line":3,"column":16}},"type":"cond-expr","locations":[{"start":{"line":2,"column":4},"end":{"line":2,"column":52}},{"start":{"line":3,"column":4},"end":{"line":3,"column":16}}],"line":1},"1":{"loc":{"start":{"line":5,"column":23},"end":{"line":7,"column":11}},"type":"cond-expr","locations":[{"start":{"line":6,"column":4},"end":{"line":6,"column":52}},{"start":{"line":7,"column":4},"end":{"line":7,"column":11}}],"line":5}},"s":{"0":70,"1":70,"2":70,"3":70,"4":70},"f":{},"b":{"0":[0,70],"1":[0,70]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"5efc2324f136aecd4c90c0df0d7940a81631349c"} +,"D:\\WIP\\rudder-transformer\\v0\\util\\error.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\util\\error.js","statementMap":{"0":{"start":{"line":3,"column":2},"end":{"line":3,"column":25}},"1":{"start":{"line":4,"column":2},"end":{"line":4,"column":29}},"2":{"start":{"line":6,"column":2},"end":{"line":9,"column":4}},"3":{"start":{"line":7,"column":4},"end":{"line":7,"column":31}},"4":{"start":{"line":8,"column":4},"end":{"line":8,"column":16}},"5":{"start":{"line":10,"column":2},"end":{"line":13,"column":4}},"6":{"start":{"line":11,"column":4},"end":{"line":11,"column":29}},"7":{"start":{"line":12,"column":4},"end":{"line":12,"column":16}},"8":{"start":{"line":15,"column":2},"end":{"line":18,"column":4}},"9":{"start":{"line":16,"column":4},"end":{"line":16,"column":55}},"10":{"start":{"line":17,"column":4},"end":{"line":17,"column":16}},"11":{"start":{"line":20,"column":2},"end":{"line":23,"column":4}},"12":{"start":{"line":21,"column":4},"end":{"line":21,"column":44}},"13":{"start":{"line":22,"column":4},"end":{"line":22,"column":16}},"14":{"start":{"line":25,"column":2},"end":{"line":31,"column":4}},"15":{"start":{"line":26,"column":4},"end":{"line":29,"column":6}},"16":{"start":{"line":30,"column":4},"end":{"line":30,"column":16}},"17":{"start":{"line":33,"column":2},"end":{"line":36,"column":4}},"18":{"start":{"line":34,"column":4},"end":{"line":34,"column":28}},"19":{"start":{"line":35,"column":4},"end":{"line":35,"column":16}},"20":{"start":{"line":39,"column":2},"end":{"line":42,"column":4}},"21":{"start":{"line":40,"column":4},"end":{"line":40,"column":42}},"22":{"start":{"line":41,"column":4},"end":{"line":41,"column":16}},"23":{"start":{"line":44,"column":2},"end":{"line":44,"column":30}},"24":{"start":{"line":44,"column":21},"end":{"line":44,"column":29}},"25":{"start":{"line":47,"column":0},"end":{"line":47,"column":30}}},"fnMap":{"0":{"name":"ErrorBuilder","decl":{"start":{"line":2,"column":9},"end":{"line":2,"column":21}},"loc":{"start":{"line":2,"column":24},"end":{"line":45,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":20},"end":{"line":6,"column":21}},"loc":{"start":{"line":6,"column":31},"end":{"line":9,"column":3}},"line":6},"2":{"name":"(anonymous_2)","decl":{"start":{"line":10,"column":19},"end":{"line":10,"column":20}},"loc":{"start":{"line":10,"column":29},"end":{"line":13,"column":3}},"line":10},"3":{"name":"(anonymous_3)","decl":{"start":{"line":15,"column":32},"end":{"line":15,"column":33}},"loc":{"start":{"line":15,"column":55},"end":{"line":18,"column":3}},"line":15},"4":{"name":"(anonymous_4)","decl":{"start":{"line":20,"column":36},"end":{"line":20,"column":37}},"loc":{"start":{"line":20,"column":43},"end":{"line":23,"column":3}},"line":20},"5":{"name":"(anonymous_5)","decl":{"start":{"line":25,"column":26},"end":{"line":25,"column":27}},"loc":{"start":{"line":25,"column":32},"end":{"line":31,"column":3}},"line":25},"6":{"name":"(anonymous_6)","decl":{"start":{"line":33,"column":21},"end":{"line":33,"column":22}},"loc":{"start":{"line":33,"column":28},"end":{"line":36,"column":3}},"line":33},"7":{"name":"(anonymous_7)","decl":{"start":{"line":39,"column":30},"end":{"line":39,"column":31}},"loc":{"start":{"line":39,"column":42},"end":{"line":42,"column":3}},"line":39},"8":{"name":"(anonymous_8)","decl":{"start":{"line":44,"column":15},"end":{"line":44,"column":16}},"loc":{"start":{"line":44,"column":21},"end":{"line":44,"column":29}},"line":44}},"branchMap":{},"s":{"0":28,"1":28,"2":28,"3":28,"4":28,"5":28,"6":28,"7":28,"8":28,"9":1,"10":1,"11":28,"12":1,"13":1,"14":28,"15":0,"16":0,"17":28,"18":12,"19":12,"20":28,"21":0,"22":0,"23":28,"24":28,"25":14},"f":{"0":28,"1":28,"2":28,"3":1,"4":1,"5":0,"6":12,"7":0,"8":28},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"96ca84257a52032f9f8e47181ec7c25b9bd971ea"} +,"D:\\WIP\\rudder-transformer\\v0\\util\\index.js": {"path":"D:\\WIP\\rudder-transformer\\v0\\util\\index.js","statementMap":{"0":{"start":{"line":8,"column":19},"end":{"line":8,"column":40}},"1":{"start":{"line":10,"column":11},"end":{"line":10,"column":24}},"2":{"start":{"line":11,"column":13},"end":{"line":11,"column":28}},"3":{"start":{"line":12,"column":10},"end":{"line":12,"column":27}},"4":{"start":{"line":13,"column":12},"end":{"line":13,"column":32}},"5":{"start":{"line":14,"column":12},"end":{"line":14,"column":32}},"6":{"start":{"line":15,"column":17},"end":{"line":15,"column":40}},"7":{"start":{"line":16,"column":15},"end":{"line":16,"column":41}},"8":{"start":{"line":17,"column":15},"end":{"line":17,"column":32}},"9":{"start":{"line":18,"column":15},"end":{"line":18,"column":38}},"10":{"start":{"line":19,"column":14},"end":{"line":19,"column":41}},"11":{"start":{"line":22,"column":4},"end":{"line":22,"column":56}},"12":{"start":{"line":23,"column":31},"end":{"line":23,"column":52}},"13":{"start":{"line":24,"column":23},"end":{"line":24,"column":53}},"14":{"start":{"line":29,"column":18},"end":{"line":29,"column":40}},"15":{"start":{"line":29,"column":23},"end":{"line":29,"column":40}},"16":{"start":{"line":30,"column":19},"end":{"line":30,"column":37}},"17":{"start":{"line":30,"column":24},"end":{"line":30,"column":37}},"18":{"start":{"line":31,"column":18},"end":{"line":31,"column":32}},"19":{"start":{"line":31,"column":23},"end":{"line":31,"column":32}},"20":{"start":{"line":32,"column":28},"end":{"line":32,"column":61}},"21":{"start":{"line":32,"column":33},"end":{"line":32,"column":61}},"22":{"start":{"line":33,"column":39},"end":{"line":34,"column":47}},"23":{"start":{"line":34,"column":2},"end":{"line":34,"column":47}},"24":{"start":{"line":35,"column":30},"end":{"line":35,"column":61}},"25":{"start":{"line":35,"column":37},"end":{"line":35,"column":61}},"26":{"start":{"line":36,"column":25},"end":{"line":36,"column":56}},"27":{"start":{"line":36,"column":32},"end":{"line":36,"column":56}},"28":{"start":{"line":37,"column":37},"end":{"line":37,"column":78}},"29":{"start":{"line":37,"column":44},"end":{"line":37,"column":78}},"30":{"start":{"line":38,"column":45},"end":{"line":39,"column":47}},"31":{"start":{"line":39,"column":2},"end":{"line":39,"column":47}},"32":{"start":{"line":40,"column":16},"end":{"line":40,"column":53}},"33":{"start":{"line":40,"column":25},"end":{"line":40,"column":53}},"34":{"start":{"line":41,"column":19},"end":{"line":41,"column":62}},"35":{"start":{"line":41,"column":33},"end":{"line":41,"column":62}},"36":{"start":{"line":41,"column":60},"end":{"line":41,"column":61}},"37":{"start":{"line":47,"column":19},"end":{"line":53,"column":1}},"38":{"start":{"line":48,"column":2},"end":{"line":52,"column":3}},"39":{"start":{"line":49,"column":4},"end":{"line":49,"column":24}},"40":{"start":{"line":51,"column":4},"end":{"line":51,"column":16}},"41":{"start":{"line":55,"column":27},"end":{"line":57,"column":1}},"42":{"start":{"line":56,"column":2},"end":{"line":56,"column":59}},"43":{"start":{"line":59,"column":20},"end":{"line":62,"column":1}},"44":{"start":{"line":60,"column":15},"end":{"line":60,"column":25}},"45":{"start":{"line":61,"column":2},"end":{"line":61,"column":67}},"46":{"start":{"line":73,"column":16},"end":{"line":82,"column":1}},"47":{"start":{"line":74,"column":15},"end":{"line":74,"column":25}},"48":{"start":{"line":75,"column":2},"end":{"line":77,"column":3}},"49":{"start":{"line":76,"column":4},"end":{"line":76,"column":18}},"50":{"start":{"line":78,"column":2},"end":{"line":80,"column":3}},"51":{"start":{"line":79,"column":4},"end":{"line":79,"column":19}},"52":{"start":{"line":81,"column":2},"end":{"line":81,"column":14}},"53":{"start":{"line":84,"column":20},"end":{"line":87,"column":1}},"54":{"start":{"line":85,"column":2},"end":{"line":85,"column":39}},"55":{"start":{"line":85,"column":27},"end":{"line":85,"column":39}},"56":{"start":{"line":86,"column":2},"end":{"line":86,"column":27}},"57":{"start":{"line":90,"column":2},"end":{"line":90,"column":45}},"58":{"start":{"line":99,"column":2},"end":{"line":102,"column":3}},"59":{"start":{"line":100,"column":4},"end":{"line":100,"column":46}},"60":{"start":{"line":101,"column":4},"end":{"line":101,"column":16}},"61":{"start":{"line":103,"column":2},"end":{"line":103,"column":39}},"62":{"start":{"line":107,"column":25},"end":{"line":122,"column":1}},"63":{"start":{"line":113,"column":18},"end":{"line":113,"column":20}},"64":{"start":{"line":114,"column":2},"end":{"line":120,"column":3}},"65":{"start":{"line":115,"column":4},"end":{"line":119,"column":7}},"66":{"start":{"line":116,"column":6},"end":{"line":116,"column":42}},"67":{"start":{"line":116,"column":35},"end":{"line":116,"column":42}},"68":{"start":{"line":117,"column":6},"end":{"line":118,"column":21}},"69":{"start":{"line":121,"column":2},"end":{"line":121,"column":17}},"70":{"start":{"line":126,"column":18},"end":{"line":151,"column":1}},"71":{"start":{"line":127,"column":2},"end":{"line":149,"column":3}},"72":{"start":{"line":130,"column":4},"end":{"line":148,"column":7}},"73":{"start":{"line":131,"column":6},"end":{"line":131,"column":22}},"74":{"start":{"line":132,"column":6},"end":{"line":132,"column":38}},"75":{"start":{"line":133,"column":6},"end":{"line":147,"column":7}},"76":{"start":{"line":134,"column":8},"end":{"line":139,"column":9}},"77":{"start":{"line":134,"column":25},"end":{"line":134,"column":26}},"78":{"start":{"line":135,"column":10},"end":{"line":135,"column":48}},"79":{"start":{"line":136,"column":10},"end":{"line":138,"column":11}},"80":{"start":{"line":137,"column":12},"end":{"line":137,"column":18}},"81":{"start":{"line":140,"column":8},"end":{"line":146,"column":9}},"82":{"start":{"line":141,"column":10},"end":{"line":141,"column":45}},"83":{"start":{"line":142,"column":15},"end":{"line":146,"column":9}},"84":{"start":{"line":143,"column":10},"end":{"line":145,"column":12}},"85":{"start":{"line":150,"column":2},"end":{"line":150,"column":17}},"86":{"start":{"line":155,"column":17},"end":{"line":155,"column":19}},"87":{"start":{"line":161,"column":4},"end":{"line":177,"column":5}},"88":{"start":{"line":162,"column":6},"end":{"line":162,"column":25}},"89":{"start":{"line":163,"column":11},"end":{"line":177,"column":5}},"90":{"start":{"line":164,"column":6},"end":{"line":166,"column":7}},"91":{"start":{"line":165,"column":8},"end":{"line":165,"column":41}},"92":{"start":{"line":167,"column":6},"end":{"line":169,"column":7}},"93":{"start":{"line":168,"column":8},"end":{"line":168,"column":26}},"94":{"start":{"line":171,"column":24},"end":{"line":171,"column":28}},"95":{"start":{"line":172,"column":6},"end":{"line":175,"column":9}},"96":{"start":{"line":173,"column":8},"end":{"line":173,"column":28}},"97":{"start":{"line":174,"column":8},"end":{"line":174,"column":57}},"98":{"start":{"line":176,"column":6},"end":{"line":176,"column":49}},"99":{"start":{"line":176,"column":31},"end":{"line":176,"column":49}},"100":{"start":{"line":180,"column":2},"end":{"line":180,"column":20}},"101":{"start":{"line":181,"column":2},"end":{"line":181,"column":16}},"102":{"start":{"line":186,"column":23},"end":{"line":201,"column":1}},"103":{"start":{"line":187,"column":15},"end":{"line":187,"column":36}},"104":{"start":{"line":188,"column":2},"end":{"line":199,"column":3}},"105":{"start":{"line":189,"column":14},"end":{"line":191,"column":18}},"106":{"start":{"line":192,"column":18},"end":{"line":192,"column":30}},"107":{"start":{"line":193,"column":17},"end":{"line":193,"column":33}},"108":{"start":{"line":194,"column":16},"end":{"line":194,"column":32}},"109":{"start":{"line":195,"column":14},"end":{"line":195,"column":15}},"110":{"start":{"line":196,"column":4},"end":{"line":197,"column":79}},"111":{"start":{"line":198,"column":4},"end":{"line":198,"column":15}},"112":{"start":{"line":200,"column":2},"end":{"line":200,"column":19}},"113":{"start":{"line":205,"column":24},"end":{"line":214,"column":1}},"114":{"start":{"line":206,"column":12},"end":{"line":206,"column":26}},"115":{"start":{"line":207,"column":12},"end":{"line":207,"column":38}},"116":{"start":{"line":208,"column":10},"end":{"line":208,"column":39}},"117":{"start":{"line":209,"column":10},"end":{"line":209,"column":32}},"118":{"start":{"line":210,"column":2},"end":{"line":210,"column":35}},"119":{"start":{"line":211,"column":2},"end":{"line":211,"column":35}},"120":{"start":{"line":212,"column":19},"end":{"line":212,"column":28}},"121":{"start":{"line":213,"column":2},"end":{"line":213,"column":18}},"122":{"start":{"line":218,"column":24},"end":{"line":227,"column":1}},"123":{"start":{"line":219,"column":15},"end":{"line":219,"column":32}},"124":{"start":{"line":221,"column":2},"end":{"line":223,"column":3}},"125":{"start":{"line":222,"column":4},"end":{"line":222,"column":43}},"126":{"start":{"line":226,"column":2},"end":{"line":226,"column":24}},"127":{"start":{"line":229,"column":21},"end":{"line":231,"column":1}},"128":{"start":{"line":230,"column":2},"end":{"line":230,"column":23}},"129":{"start":{"line":234,"column":23},"end":{"line":250,"column":1}},"130":{"start":{"line":235,"column":2},"end":{"line":241,"column":3}},"131":{"start":{"line":240,"column":4},"end":{"line":240,"column":29}},"132":{"start":{"line":242,"column":2},"end":{"line":248,"column":3}},"133":{"start":{"line":247,"column":4},"end":{"line":247,"column":29}},"134":{"start":{"line":249,"column":2},"end":{"line":249,"column":14}},"135":{"start":{"line":257,"column":32},"end":{"line":260,"column":1}},"136":{"start":{"line":263,"column":33},"end":{"line":266,"column":1}},"137":{"start":{"line":269,"column":35},"end":{"line":272,"column":1}},"138":{"start":{"line":275,"column":32},"end":{"line":278,"column":1}},"139":{"start":{"line":284,"column":29},"end":{"line":300,"column":1}},"140":{"start":{"line":285,"column":2},"end":{"line":299,"column":4}},"141":{"start":{"line":303,"column":34},"end":{"line":321,"column":1}},"142":{"start":{"line":304,"column":2},"end":{"line":320,"column":4}},"143":{"start":{"line":325,"column":29},"end":{"line":338,"column":1}},"144":{"start":{"line":331,"column":2},"end":{"line":337,"column":4}},"145":{"start":{"line":342,"column":27},"end":{"line":350,"column":1}},"146":{"start":{"line":349,"column":2},"end":{"line":349,"column":60}},"147":{"start":{"line":355,"column":21},"end":{"line":359,"column":1}},"148":{"start":{"line":364,"column":24},"end":{"line":366,"column":1}},"149":{"start":{"line":370,"column":20},"end":{"line":375,"column":1}},"150":{"start":{"line":371,"column":2},"end":{"line":373,"column":3}},"151":{"start":{"line":372,"column":4},"end":{"line":372,"column":30}},"152":{"start":{"line":374,"column":2},"end":{"line":374,"column":28}},"153":{"start":{"line":379,"column":25},"end":{"line":389,"column":1}},"154":{"start":{"line":380,"column":24},"end":{"line":380,"column":26}},"155":{"start":{"line":381,"column":23},"end":{"line":381,"column":42}},"156":{"start":{"line":382,"column":2},"end":{"line":387,"column":5}},"157":{"start":{"line":383,"column":21},"end":{"line":383,"column":40}},"158":{"start":{"line":384,"column":4},"end":{"line":386,"column":6}},"159":{"start":{"line":388,"column":2},"end":{"line":388,"column":23}},"160":{"start":{"line":393,"column":22},"end":{"line":400,"column":1}},"161":{"start":{"line":394,"column":2},"end":{"line":398,"column":5}},"162":{"start":{"line":395,"column":4},"end":{"line":397,"column":5}},"163":{"start":{"line":396,"column":6},"end":{"line":396,"column":43}},"164":{"start":{"line":399,"column":2},"end":{"line":399,"column":17}},"165":{"start":{"line":402,"column":28},"end":{"line":428,"column":1}},"166":{"start":{"line":403,"column":2},"end":{"line":426,"column":3}},"167":{"start":{"line":404,"column":4},"end":{"line":408,"column":5}},"168":{"start":{"line":405,"column":6},"end":{"line":407,"column":8}},"169":{"start":{"line":410,"column":4},"end":{"line":417,"column":5}},"170":{"start":{"line":410,"column":21},"end":{"line":410,"column":22}},"171":{"start":{"line":411,"column":18},"end":{"line":411,"column":48}},"172":{"start":{"line":412,"column":6},"end":{"line":416,"column":7}},"173":{"start":{"line":415,"column":8},"end":{"line":415,"column":19}},"174":{"start":{"line":418,"column":9},"end":{"line":426,"column":3}},"175":{"start":{"line":421,"column":4},"end":{"line":421,"column":35}},"176":{"start":{"line":425,"column":4},"end":{"line":425,"column":69}},"177":{"start":{"line":427,"column":2},"end":{"line":427,"column":14}},"178":{"start":{"line":436,"column":33},"end":{"line":442,"column":1}},"179":{"start":{"line":437,"column":23},"end":{"line":437,"column":49}},"180":{"start":{"line":438,"column":2},"end":{"line":440,"column":3}},"181":{"start":{"line":439,"column":4},"end":{"line":439,"column":54}},"182":{"start":{"line":441,"column":2},"end":{"line":441,"column":14}},"183":{"start":{"line":450,"column":31},"end":{"line":634,"column":1}},"184":{"start":{"line":451,"column":2},"end":{"line":453,"column":3}},"185":{"start":{"line":452,"column":4},"end":{"line":452,"column":17}},"186":{"start":{"line":464,"column":6},"end":{"line":464,"column":14}},"187":{"start":{"line":467,"column":2},"end":{"line":469,"column":3}},"188":{"start":{"line":468,"column":4},"end":{"line":468,"column":33}},"189":{"start":{"line":471,"column":21},"end":{"line":471,"column":26}},"190":{"start":{"line":474,"column":2},"end":{"line":553,"column":3}},"191":{"start":{"line":475,"column":4},"end":{"line":552,"column":5}},"192":{"start":{"line":477,"column":8},"end":{"line":477,"column":65}},"193":{"start":{"line":478,"column":8},"end":{"line":478,"column":14}},"194":{"start":{"line":480,"column":8},"end":{"line":482,"column":10}},"195":{"start":{"line":483,"column":8},"end":{"line":483,"column":14}},"196":{"start":{"line":485,"column":8},"end":{"line":485,"column":49}},"197":{"start":{"line":486,"column":8},"end":{"line":486,"column":14}},"198":{"start":{"line":488,"column":8},"end":{"line":488,"column":72}},"199":{"start":{"line":489,"column":8},"end":{"line":489,"column":14}},"200":{"start":{"line":491,"column":8},"end":{"line":491,"column":52}},"201":{"start":{"line":492,"column":8},"end":{"line":492,"column":14}},"202":{"start":{"line":494,"column":8},"end":{"line":494,"column":65}},"203":{"start":{"line":495,"column":8},"end":{"line":495,"column":14}},"204":{"start":{"line":499,"column":8},"end":{"line":501,"column":9}},"205":{"start":{"line":500,"column":10},"end":{"line":500,"column":54}},"206":{"start":{"line":502,"column":8},"end":{"line":502,"column":14}},"207":{"start":{"line":504,"column":8},"end":{"line":510,"column":9}},"208":{"start":{"line":509,"column":10},"end":{"line":509,"column":51}},"209":{"start":{"line":511,"column":8},"end":{"line":511,"column":79}},"210":{"start":{"line":512,"column":8},"end":{"line":514,"column":9}},"211":{"start":{"line":513,"column":10},"end":{"line":513,"column":66}},"212":{"start":{"line":515,"column":8},"end":{"line":515,"column":14}},"213":{"start":{"line":517,"column":8},"end":{"line":517,"column":44}},"214":{"start":{"line":518,"column":8},"end":{"line":518,"column":14}},"215":{"start":{"line":520,"column":8},"end":{"line":520,"column":44}},"216":{"start":{"line":521,"column":8},"end":{"line":521,"column":14}},"217":{"start":{"line":523,"column":8},"end":{"line":523,"column":48}},"218":{"start":{"line":524,"column":8},"end":{"line":524,"column":14}},"219":{"start":{"line":526,"column":8},"end":{"line":526,"column":50}},"220":{"start":{"line":527,"column":8},"end":{"line":527,"column":14}},"221":{"start":{"line":529,"column":8},"end":{"line":532,"column":49}},"222":{"start":{"line":533,"column":8},"end":{"line":533,"column":14}},"223":{"start":{"line":535,"column":8},"end":{"line":535,"column":52}},"224":{"start":{"line":536,"column":8},"end":{"line":536,"column":14}},"225":{"start":{"line":538,"column":8},"end":{"line":538,"column":52}},"226":{"start":{"line":539,"column":8},"end":{"line":539,"column":14}},"227":{"start":{"line":541,"column":8},"end":{"line":543,"column":34}},"228":{"start":{"line":544,"column":8},"end":{"line":544,"column":14}},"229":{"start":{"line":546,"column":8},"end":{"line":548,"column":9}},"230":{"start":{"line":547,"column":10},"end":{"line":547,"column":64}},"231":{"start":{"line":549,"column":8},"end":{"line":549,"column":14}},"232":{"start":{"line":551,"column":8},"end":{"line":551,"column":14}},"233":{"start":{"line":556,"column":2},"end":{"line":559,"column":3}},"234":{"start":{"line":557,"column":22},"end":{"line":557,"column":57}},"235":{"start":{"line":558,"column":4},"end":{"line":558,"column":47}},"236":{"start":{"line":562,"column":2},"end":{"line":573,"column":3}},"237":{"start":{"line":563,"column":4},"end":{"line":572,"column":5}},"238":{"start":{"line":565,"column":6},"end":{"line":567,"column":9}},"239":{"start":{"line":566,"column":8},"end":{"line":566,"column":33}},"240":{"start":{"line":569,"column":6},"end":{"line":571,"column":8}},"241":{"start":{"line":590,"column":2},"end":{"line":616,"column":3}},"242":{"start":{"line":591,"column":19},"end":{"line":591,"column":24}},"243":{"start":{"line":592,"column":4},"end":{"line":614,"column":5}},"244":{"start":{"line":593,"column":6},"end":{"line":611,"column":9}},"245":{"start":{"line":594,"column":8},"end":{"line":604,"column":9}},"246":{"start":{"line":599,"column":10},"end":{"line":601,"column":12}},"247":{"start":{"line":602,"column":10},"end":{"line":602,"column":26}},"248":{"start":{"line":603,"column":10},"end":{"line":603,"column":22}},"249":{"start":{"line":606,"column":8},"end":{"line":610,"column":9}},"250":{"start":{"line":607,"column":10},"end":{"line":607,"column":37}},"251":{"start":{"line":608,"column":10},"end":{"line":608,"column":26}},"252":{"start":{"line":609,"column":10},"end":{"line":609,"column":22}},"253":{"start":{"line":613,"column":6},"end":{"line":613,"column":71}},"254":{"start":{"line":615,"column":4},"end":{"line":615,"column":44}},"255":{"start":{"line":615,"column":19},"end":{"line":615,"column":44}},"256":{"start":{"line":618,"column":2},"end":{"line":631,"column":3}},"257":{"start":{"line":619,"column":19},"end":{"line":619,"column":24}},"258":{"start":{"line":620,"column":4},"end":{"line":627,"column":5}},"259":{"start":{"line":621,"column":6},"end":{"line":626,"column":9}},"260":{"start":{"line":622,"column":8},"end":{"line":625,"column":9}},"261":{"start":{"line":623,"column":10},"end":{"line":623,"column":26}},"262":{"start":{"line":624,"column":10},"end":{"line":624,"column":22}},"263":{"start":{"line":628,"column":4},"end":{"line":630,"column":5}},"264":{"start":{"line":629,"column":6},"end":{"line":629,"column":31}},"265":{"start":{"line":633,"column":2},"end":{"line":633,"column":22}},"266":{"start":{"line":639,"column":27},"end":{"line":653,"column":1}},"267":{"start":{"line":640,"column":2},"end":{"line":651,"column":3}},"268":{"start":{"line":641,"column":27},"end":{"line":641,"column":62}},"269":{"start":{"line":642,"column":4},"end":{"line":650,"column":5}},"270":{"start":{"line":642,"column":21},"end":{"line":642,"column":22}},"271":{"start":{"line":643,"column":30},"end":{"line":646,"column":7}},"272":{"start":{"line":647,"column":6},"end":{"line":649,"column":7}},"273":{"start":{"line":648,"column":8},"end":{"line":648,"column":31}},"274":{"start":{"line":652,"column":2},"end":{"line":652,"column":14}},"275":{"start":{"line":656,"column":25},"end":{"line":739,"column":1}},"276":{"start":{"line":658,"column":2},"end":{"line":735,"column":3}},"277":{"start":{"line":663,"column":20},"end":{"line":663,"column":22}},"278":{"start":{"line":697,"column":4},"end":{"line":732,"column":7}},"279":{"start":{"line":704,"column":10},"end":{"line":704,"column":17}},"280":{"start":{"line":707,"column":30},"end":{"line":709,"column":14}},"281":{"start":{"line":710,"column":20},"end":{"line":716,"column":7}},"282":{"start":{"line":718,"column":6},"end":{"line":731,"column":7}},"283":{"start":{"line":719,"column":8},"end":{"line":725,"column":9}},"284":{"start":{"line":721,"column":10},"end":{"line":721,"column":41}},"285":{"start":{"line":724,"column":10},"end":{"line":724,"column":30}},"286":{"start":{"line":726,"column":13},"end":{"line":731,"column":7}},"287":{"start":{"line":728,"column":8},"end":{"line":730,"column":10}},"288":{"start":{"line":734,"column":4},"end":{"line":734,"column":19}},"289":{"start":{"line":738,"column":2},"end":{"line":738,"column":14}},"290":{"start":{"line":754,"column":24},"end":{"line":754,"column":28}},"291":{"start":{"line":755,"column":30},"end":{"line":755,"column":34}},"292":{"start":{"line":756,"column":2},"end":{"line":758,"column":3}},"293":{"start":{"line":757,"column":4},"end":{"line":757,"column":49}},"294":{"start":{"line":759,"column":2},"end":{"line":765,"column":3}},"295":{"start":{"line":760,"column":4},"end":{"line":764,"column":7}},"296":{"start":{"line":761,"column":6},"end":{"line":763,"column":7}},"297":{"start":{"line":762,"column":8},"end":{"line":762,"column":44}},"298":{"start":{"line":766,"column":2},"end":{"line":766,"column":31}},"299":{"start":{"line":771,"column":44},"end":{"line":788,"column":1}},"300":{"start":{"line":772,"column":24},"end":{"line":772,"column":26}},"301":{"start":{"line":773,"column":30},"end":{"line":773,"column":34}},"302":{"start":{"line":774,"column":19},"end":{"line":774,"column":23}},"303":{"start":{"line":775,"column":2},"end":{"line":777,"column":3}},"304":{"start":{"line":776,"column":4},"end":{"line":776,"column":49}},"305":{"start":{"line":778,"column":2},"end":{"line":786,"column":3}},"306":{"start":{"line":779,"column":4},"end":{"line":785,"column":7}},"307":{"start":{"line":780,"column":23},"end":{"line":780,"column":31}},"308":{"start":{"line":781,"column":6},"end":{"line":784,"column":7}},"309":{"start":{"line":782,"column":8},"end":{"line":782,"column":44}},"310":{"start":{"line":783,"column":8},"end":{"line":783,"column":57}},"311":{"start":{"line":787,"column":2},"end":{"line":787,"column":47}},"312":{"start":{"line":790,"column":17},"end":{"line":797,"column":1}},"313":{"start":{"line":791,"column":15},"end":{"line":791,"column":27}},"314":{"start":{"line":792,"column":2},"end":{"line":796,"column":4}},"315":{"start":{"line":799,"column":24},"end":{"line":802,"column":1}},"316":{"start":{"line":800,"column":15},"end":{"line":800,"column":27}},"317":{"start":{"line":801,"column":2},"end":{"line":801,"column":69}},"318":{"start":{"line":805,"column":13},"end":{"line":805,"column":32}},"319":{"start":{"line":806,"column":2},"end":{"line":806,"column":64}},"320":{"start":{"line":810,"column":13},"end":{"line":810,"column":46}},"321":{"start":{"line":811,"column":18},"end":{"line":811,"column":40}},"322":{"start":{"line":812,"column":2},"end":{"line":812,"column":42}},"323":{"start":{"line":816,"column":21},"end":{"line":816,"column":44}},"324":{"start":{"line":818,"column":2},"end":{"line":820,"column":3}},"325":{"start":{"line":819,"column":4},"end":{"line":819,"column":57}},"326":{"start":{"line":821,"column":2},"end":{"line":821,"column":20}},"327":{"start":{"line":840,"column":22},"end":{"line":840,"column":24}},"328":{"start":{"line":841,"column":2},"end":{"line":849,"column":3}},"329":{"start":{"line":843,"column":4},"end":{"line":848,"column":7}},"330":{"start":{"line":844,"column":6},"end":{"line":844,"column":27}},"331":{"start":{"line":845,"column":6},"end":{"line":847,"column":7}},"332":{"start":{"line":846,"column":8},"end":{"line":846,"column":32}},"333":{"start":{"line":850,"column":2},"end":{"line":850,"column":21}},"334":{"start":{"line":855,"column":15},"end":{"line":855,"column":34}},"335":{"start":{"line":856,"column":24},"end":{"line":856,"column":57}},"336":{"start":{"line":857,"column":2},"end":{"line":857,"column":23}},"337":{"start":{"line":862,"column":22},"end":{"line":862,"column":32}},"338":{"start":{"line":863,"column":20},"end":{"line":863,"column":39}},"339":{"start":{"line":864,"column":19},"end":{"line":864,"column":79}},"340":{"start":{"line":865,"column":15},"end":{"line":865,"column":32}},"341":{"start":{"line":866,"column":16},"end":{"line":866,"column":34}},"342":{"start":{"line":867,"column":17},"end":{"line":867,"column":36}},"343":{"start":{"line":868,"column":16},"end":{"line":868,"column":34}},"344":{"start":{"line":869,"column":18},"end":{"line":869,"column":38}},"345":{"start":{"line":870,"column":18},"end":{"line":870,"column":38}},"346":{"start":{"line":871,"column":2},"end":{"line":871,"column":58}},"347":{"start":{"line":879,"column":2},"end":{"line":881,"column":3}},"348":{"start":{"line":880,"column":4},"end":{"line":880,"column":39}},"349":{"start":{"line":882,"column":2},"end":{"line":891,"column":4}},"350":{"start":{"line":899,"column":20},"end":{"line":899,"column":66}},"351":{"start":{"line":900,"column":19},"end":{"line":900,"column":64}},"352":{"start":{"line":901,"column":15},"end":{"line":901,"column":56}},"353":{"start":{"line":902,"column":2},"end":{"line":904,"column":3}},"354":{"start":{"line":903,"column":4},"end":{"line":903,"column":42}},"355":{"start":{"line":905,"column":2},"end":{"line":905,"column":18}},"356":{"start":{"line":938,"column":22},"end":{"line":938,"column":24}},"357":{"start":{"line":939,"column":2},"end":{"line":964,"column":3}},"358":{"start":{"line":940,"column":4},"end":{"line":952,"column":7}},"359":{"start":{"line":941,"column":29},"end":{"line":941,"column":46}},"360":{"start":{"line":942,"column":6},"end":{"line":951,"column":7}},"361":{"start":{"line":943,"column":8},"end":{"line":945,"column":11}},"362":{"start":{"line":944,"column":10},"end":{"line":944,"column":64}},"363":{"start":{"line":944,"column":44},"end":{"line":944,"column":64}},"364":{"start":{"line":946,"column":8},"end":{"line":950,"column":11}},"365":{"start":{"line":947,"column":10},"end":{"line":949,"column":11}},"366":{"start":{"line":948,"column":12},"end":{"line":948,"column":74}},"367":{"start":{"line":953,"column":9},"end":{"line":964,"column":3}},"368":{"start":{"line":954,"column":4},"end":{"line":956,"column":7}},"369":{"start":{"line":955,"column":6},"end":{"line":955,"column":60}},"370":{"start":{"line":955,"column":40},"end":{"line":955,"column":60}},"371":{"start":{"line":957,"column":4},"end":{"line":961,"column":7}},"372":{"start":{"line":958,"column":6},"end":{"line":960,"column":7}},"373":{"start":{"line":959,"column":8},"end":{"line":959,"column":63}},"374":{"start":{"line":963,"column":4},"end":{"line":963,"column":41}},"375":{"start":{"line":966,"column":2},"end":{"line":966,"column":21}},"376":{"start":{"line":972,"column":2},"end":{"line":974,"column":3}},"377":{"start":{"line":973,"column":4},"end":{"line":973,"column":11}},"378":{"start":{"line":975,"column":2},"end":{"line":977,"column":3}},"379":{"start":{"line":976,"column":4},"end":{"line":976,"column":43}},"380":{"start":{"line":978,"column":2},"end":{"line":984,"column":3}},"381":{"start":{"line":979,"column":4},"end":{"line":979,"column":37}},"382":{"start":{"line":981,"column":4},"end":{"line":983,"column":5}},"383":{"start":{"line":982,"column":6},"end":{"line":982,"column":13}},"384":{"start":{"line":986,"column":2},"end":{"line":986,"column":36}},"385":{"start":{"line":992,"column":21},"end":{"line":992,"column":28}},"386":{"start":{"line":993,"column":2},"end":{"line":1007,"column":5}},"387":{"start":{"line":994,"column":18},"end":{"line":994,"column":33}},"388":{"start":{"line":995,"column":4},"end":{"line":995,"column":27}},"389":{"start":{"line":996,"column":19},"end":{"line":1005,"column":8}},"390":{"start":{"line":1004,"column":8},"end":{"line":1004,"column":35}},"391":{"start":{"line":1006,"column":4},"end":{"line":1006,"column":31}},"392":{"start":{"line":1008,"column":2},"end":{"line":1008,"column":20}},"393":{"start":{"line":1014,"column":17},"end":{"line":1014,"column":63}},"394":{"start":{"line":1014,"column":38},"end":{"line":1014,"column":49}},"395":{"start":{"line":1015,"column":2},"end":{"line":1015,"column":16}},"396":{"start":{"line":1019,"column":15},"end":{"line":1019,"column":17}},"397":{"start":{"line":1020,"column":2},"end":{"line":1025,"column":5}},"398":{"start":{"line":1022,"column":4},"end":{"line":1024,"column":5}},"399":{"start":{"line":1023,"column":6},"end":{"line":1023,"column":40}},"400":{"start":{"line":1026,"column":2},"end":{"line":1026,"column":16}},"401":{"start":{"line":1029,"column":20},"end":{"line":1035,"column":1}},"402":{"start":{"line":1030,"column":2},"end":{"line":1034,"column":4}},"403":{"start":{"line":1038,"column":17},"end":{"line":1038,"column":58}},"404":{"start":{"line":1038,"column":37},"end":{"line":1038,"column":57}},"405":{"start":{"line":1039,"column":2},"end":{"line":1039,"column":16}},"406":{"start":{"line":1044,"column":17},"end":{"line":1044,"column":19}},"407":{"start":{"line":1045,"column":10},"end":{"line":1045,"column":11}},"408":{"start":{"line":1046,"column":12},"end":{"line":1046,"column":22}},"409":{"start":{"line":1047,"column":2},"end":{"line":1049,"column":3}},"410":{"start":{"line":1048,"column":4},"end":{"line":1048,"column":42}},"411":{"start":{"line":1050,"column":2},"end":{"line":1050,"column":16}},"412":{"start":{"line":1056,"column":25},"end":{"line":1056,"column":76}},"413":{"start":{"line":1057,"column":26},"end":{"line":1057,"column":65}},"414":{"start":{"line":1058,"column":2},"end":{"line":1062,"column":4}},"415":{"start":{"line":1064,"column":32},"end":{"line":1069,"column":1}},"416":{"start":{"line":1065,"column":21},"end":{"line":1065,"column":60}},"417":{"start":{"line":1066,"column":2},"end":{"line":1068,"column":3}},"418":{"start":{"line":1067,"column":4},"end":{"line":1067,"column":32}},"419":{"start":{"line":1072,"column":4},"end":{"line":1072,"column":19}},"420":{"start":{"line":1073,"column":4},"end":{"line":1073,"column":53}},"421":{"start":{"line":1086,"column":2},"end":{"line":1088,"column":3}},"422":{"start":{"line":1087,"column":4},"end":{"line":1087,"column":17}},"423":{"start":{"line":1089,"column":51},"end":{"line":1089,"column":56}},"424":{"start":{"line":1090,"column":21},"end":{"line":1090,"column":26}},"425":{"start":{"line":1091,"column":2},"end":{"line":1097,"column":3}},"426":{"start":{"line":1092,"column":4},"end":{"line":1096,"column":6}},"427":{"start":{"line":1098,"column":19},"end":{"line":1103,"column":3}},"428":{"start":{"line":1105,"column":2},"end":{"line":1107,"column":3}},"429":{"start":{"line":1106,"column":4},"end":{"line":1106,"column":63}},"430":{"start":{"line":1108,"column":2},"end":{"line":1108,"column":18}},"431":{"start":{"line":1116,"column":2},"end":{"line":1116,"column":39}},"432":{"start":{"line":1125,"column":2},"end":{"line":1125,"column":39}},"433":{"start":{"line":1134,"column":10},"end":{"line":1134,"column":30}},"434":{"start":{"line":1135,"column":2},"end":{"line":1140,"column":3}},"435":{"start":{"line":1139,"column":4},"end":{"line":1139,"column":27}},"436":{"start":{"line":1141,"column":2},"end":{"line":1145,"column":5}},"437":{"start":{"line":1142,"column":14},"end":{"line":1142,"column":47}},"438":{"start":{"line":1143,"column":4},"end":{"line":1143,"column":27}},"439":{"start":{"line":1144,"column":4},"end":{"line":1144,"column":58}},"440":{"start":{"line":1148,"column":27},"end":{"line":1151,"column":1}},"441":{"start":{"line":1149,"column":31},"end":{"line":1149,"column":64}},"442":{"start":{"line":1150,"column":2},"end":{"line":1150,"column":69}},"443":{"start":{"line":1153,"column":25},"end":{"line":1159,"column":1}},"444":{"start":{"line":1154,"column":2},"end":{"line":1158,"column":4}},"445":{"start":{"line":1162,"column":23},"end":{"line":1162,"column":59}},"446":{"start":{"line":1163,"column":2},"end":{"line":1163,"column":55}},"447":{"start":{"line":1167,"column":2},"end":{"line":1167,"column":31}},"448":{"start":{"line":1172,"column":2},"end":{"line":1177,"column":4}},"449":{"start":{"line":1215,"column":14},"end":{"line":1220,"column":4}},"450":{"start":{"line":1216,"column":4},"end":{"line":1219,"column":6}},"451":{"start":{"line":1221,"column":2},"end":{"line":1226,"column":3}},"452":{"start":{"line":1222,"column":4},"end":{"line":1225,"column":7}},"453":{"start":{"line":1227,"column":2},"end":{"line":1227,"column":13}},"454":{"start":{"line":1234,"column":0},"end":{"line":1304,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":29,"column":18},"end":{"line":29,"column":19}},"loc":{"start":{"line":29,"column":23},"end":{"line":29,"column":40}},"line":29},"1":{"name":"(anonymous_1)","decl":{"start":{"line":30,"column":19},"end":{"line":30,"column":20}},"loc":{"start":{"line":30,"column":24},"end":{"line":30,"column":37}},"line":30},"2":{"name":"(anonymous_2)","decl":{"start":{"line":31,"column":18},"end":{"line":31,"column":19}},"loc":{"start":{"line":31,"column":23},"end":{"line":31,"column":32}},"line":31},"3":{"name":"(anonymous_3)","decl":{"start":{"line":32,"column":28},"end":{"line":32,"column":29}},"loc":{"start":{"line":32,"column":33},"end":{"line":32,"column":61}},"line":32},"4":{"name":"(anonymous_4)","decl":{"start":{"line":33,"column":39},"end":{"line":33,"column":40}},"loc":{"start":{"line":34,"column":2},"end":{"line":34,"column":47}},"line":34},"5":{"name":"(anonymous_5)","decl":{"start":{"line":35,"column":30},"end":{"line":35,"column":31}},"loc":{"start":{"line":35,"column":37},"end":{"line":35,"column":61}},"line":35},"6":{"name":"(anonymous_6)","decl":{"start":{"line":36,"column":25},"end":{"line":36,"column":26}},"loc":{"start":{"line":36,"column":32},"end":{"line":36,"column":56}},"line":36},"7":{"name":"(anonymous_7)","decl":{"start":{"line":37,"column":37},"end":{"line":37,"column":38}},"loc":{"start":{"line":37,"column":44},"end":{"line":37,"column":78}},"line":37},"8":{"name":"(anonymous_8)","decl":{"start":{"line":38,"column":45},"end":{"line":38,"column":46}},"loc":{"start":{"line":39,"column":2},"end":{"line":39,"column":47}},"line":39},"9":{"name":"(anonymous_9)","decl":{"start":{"line":40,"column":16},"end":{"line":40,"column":17}},"loc":{"start":{"line":40,"column":25},"end":{"line":40,"column":53}},"line":40},"10":{"name":"(anonymous_10)","decl":{"start":{"line":41,"column":19},"end":{"line":41,"column":20}},"loc":{"start":{"line":41,"column":33},"end":{"line":41,"column":62}},"line":41},"11":{"name":"(anonymous_11)","decl":{"start":{"line":41,"column":55},"end":{"line":41,"column":56}},"loc":{"start":{"line":41,"column":60},"end":{"line":41,"column":61}},"line":41},"12":{"name":"(anonymous_12)","decl":{"start":{"line":47,"column":19},"end":{"line":47,"column":20}},"loc":{"start":{"line":47,"column":26},"end":{"line":53,"column":1}},"line":47},"13":{"name":"(anonymous_13)","decl":{"start":{"line":55,"column":27},"end":{"line":55,"column":28}},"loc":{"start":{"line":55,"column":34},"end":{"line":57,"column":1}},"line":55},"14":{"name":"(anonymous_14)","decl":{"start":{"line":59,"column":20},"end":{"line":59,"column":21}},"loc":{"start":{"line":59,"column":27},"end":{"line":62,"column":1}},"line":59},"15":{"name":"(anonymous_15)","decl":{"start":{"line":73,"column":16},"end":{"line":73,"column":17}},"loc":{"start":{"line":73,"column":23},"end":{"line":82,"column":1}},"line":73},"16":{"name":"(anonymous_16)","decl":{"start":{"line":84,"column":20},"end":{"line":84,"column":21}},"loc":{"start":{"line":84,"column":29},"end":{"line":87,"column":1}},"line":84},"17":{"name":"isEmpty","decl":{"start":{"line":89,"column":9},"end":{"line":89,"column":16}},"loc":{"start":{"line":89,"column":24},"end":{"line":91,"column":1}},"line":89},"18":{"name":"isEmptyObject","decl":{"start":{"line":98,"column":9},"end":{"line":98,"column":22}},"loc":{"start":{"line":98,"column":28},"end":{"line":104,"column":1}},"line":98},"19":{"name":"(anonymous_19)","decl":{"start":{"line":107,"column":25},"end":{"line":107,"column":26}},"loc":{"start":{"line":112,"column":5},"end":{"line":122,"column":1}},"line":112},"20":{"name":"(anonymous_20)","decl":{"start":{"line":115,"column":19},"end":{"line":115,"column":20}},"loc":{"start":{"line":115,"column":28},"end":{"line":119,"column":5}},"line":115},"21":{"name":"(anonymous_21)","decl":{"start":{"line":126,"column":18},"end":{"line":126,"column":19}},"loc":{"start":{"line":126,"column":53},"end":{"line":151,"column":1}},"line":126},"22":{"name":"(anonymous_22)","decl":{"start":{"line":130,"column":24},"end":{"line":130,"column":25}},"loc":{"start":{"line":130,"column":35},"end":{"line":148,"column":5}},"line":130},"23":{"name":"flattenJson","decl":{"start":{"line":154,"column":9},"end":{"line":154,"column":20}},"loc":{"start":{"line":154,"column":27},"end":{"line":182,"column":1}},"line":154},"24":{"name":"recurse","decl":{"start":{"line":159,"column":11},"end":{"line":159,"column":18}},"loc":{"start":{"line":159,"column":30},"end":{"line":178,"column":3}},"line":159},"25":{"name":"(anonymous_25)","decl":{"start":{"line":172,"column":31},"end":{"line":172,"column":32}},"loc":{"start":{"line":172,"column":38},"end":{"line":175,"column":7}},"line":172},"26":{"name":"(anonymous_26)","decl":{"start":{"line":186,"column":23},"end":{"line":186,"column":24}},"loc":{"start":{"line":186,"column":32},"end":{"line":201,"column":1}},"line":186},"27":{"name":"(anonymous_27)","decl":{"start":{"line":205,"column":24},"end":{"line":205,"column":25}},"loc":{"start":{"line":205,"column":32},"end":{"line":214,"column":1}},"line":205},"28":{"name":"(anonymous_28)","decl":{"start":{"line":218,"column":24},"end":{"line":218,"column":25}},"loc":{"start":{"line":218,"column":45},"end":{"line":227,"column":1}},"line":218},"29":{"name":"(anonymous_29)","decl":{"start":{"line":229,"column":21},"end":{"line":229,"column":22}},"loc":{"start":{"line":229,"column":30},"end":{"line":231,"column":1}},"line":229},"30":{"name":"(anonymous_30)","decl":{"start":{"line":234,"column":23},"end":{"line":234,"column":24}},"loc":{"start":{"line":234,"column":33},"end":{"line":250,"column":1}},"line":234},"31":{"name":"(anonymous_31)","decl":{"start":{"line":284,"column":29},"end":{"line":284,"column":30}},"loc":{"start":{"line":284,"column":35},"end":{"line":300,"column":1}},"line":284},"32":{"name":"(anonymous_32)","decl":{"start":{"line":303,"column":34},"end":{"line":303,"column":35}},"loc":{"start":{"line":303,"column":40},"end":{"line":321,"column":1}},"line":303},"33":{"name":"(anonymous_33)","decl":{"start":{"line":325,"column":29},"end":{"line":325,"column":30}},"loc":{"start":{"line":330,"column":5},"end":{"line":338,"column":1}},"line":330},"34":{"name":"(anonymous_34)","decl":{"start":{"line":342,"column":27},"end":{"line":342,"column":28}},"loc":{"start":{"line":348,"column":5},"end":{"line":350,"column":1}},"line":348},"35":{"name":"(anonymous_35)","decl":{"start":{"line":370,"column":20},"end":{"line":370,"column":21}},"loc":{"start":{"line":370,"column":31},"end":{"line":375,"column":1}},"line":370},"36":{"name":"(anonymous_36)","decl":{"start":{"line":379,"column":25},"end":{"line":379,"column":26}},"loc":{"start":{"line":379,"column":42},"end":{"line":389,"column":1}},"line":379},"37":{"name":"(anonymous_37)","decl":{"start":{"line":382,"column":23},"end":{"line":382,"column":24}},"loc":{"start":{"line":382,"column":38},"end":{"line":387,"column":3}},"line":382},"38":{"name":"(anonymous_38)","decl":{"start":{"line":393,"column":22},"end":{"line":393,"column":23}},"loc":{"start":{"line":393,"column":71},"end":{"line":400,"column":1}},"line":393},"39":{"name":"(anonymous_39)","decl":{"start":{"line":394,"column":26},"end":{"line":394,"column":27}},"loc":{"start":{"line":394,"column":33},"end":{"line":398,"column":3}},"line":394},"40":{"name":"(anonymous_40)","decl":{"start":{"line":402,"column":28},"end":{"line":402,"column":29}},"loc":{"start":{"line":402,"column":52},"end":{"line":428,"column":1}},"line":402},"41":{"name":"(anonymous_41)","decl":{"start":{"line":436,"column":33},"end":{"line":436,"column":34}},"loc":{"start":{"line":436,"column":57},"end":{"line":442,"column":1}},"line":436},"42":{"name":"(anonymous_42)","decl":{"start":{"line":450,"column":31},"end":{"line":450,"column":32}},"loc":{"start":{"line":450,"column":76},"end":{"line":634,"column":1}},"line":450},"43":{"name":"(anonymous_43)","decl":{"start":{"line":565,"column":23},"end":{"line":565,"column":24}},"loc":{"start":{"line":565,"column":30},"end":{"line":567,"column":7}},"line":565},"44":{"name":"(anonymous_44)","decl":{"start":{"line":593,"column":23},"end":{"line":593,"column":24}},"loc":{"start":{"line":593,"column":30},"end":{"line":611,"column":7}},"line":593},"45":{"name":"(anonymous_45)","decl":{"start":{"line":621,"column":27},"end":{"line":621,"column":28}},"loc":{"start":{"line":621,"column":34},"end":{"line":626,"column":7}},"line":621},"46":{"name":"(anonymous_46)","decl":{"start":{"line":639,"column":27},"end":{"line":639,"column":28}},"loc":{"start":{"line":639,"column":64},"end":{"line":653,"column":1}},"line":639},"47":{"name":"(anonymous_47)","decl":{"start":{"line":656,"column":25},"end":{"line":656,"column":26}},"loc":{"start":{"line":656,"column":75},"end":{"line":739,"column":1}},"line":656},"48":{"name":"(anonymous_48)","decl":{"start":{"line":697,"column":24},"end":{"line":697,"column":25}},"loc":{"start":{"line":697,"column":35},"end":{"line":732,"column":5}},"line":697},"49":{"name":"getDestinationExternalID","decl":{"start":{"line":753,"column":9},"end":{"line":753,"column":33}},"loc":{"start":{"line":753,"column":49},"end":{"line":767,"column":1}},"line":753},"50":{"name":"(anonymous_50)","decl":{"start":{"line":760,"column":28},"end":{"line":760,"column":29}},"loc":{"start":{"line":760,"column":40},"end":{"line":764,"column":5}},"line":760},"51":{"name":"(anonymous_51)","decl":{"start":{"line":771,"column":44},"end":{"line":771,"column":45}},"loc":{"start":{"line":771,"column":70},"end":{"line":788,"column":1}},"line":771},"52":{"name":"(anonymous_52)","decl":{"start":{"line":779,"column":28},"end":{"line":779,"column":29}},"loc":{"start":{"line":779,"column":40},"end":{"line":785,"column":5}},"line":779},"53":{"name":"(anonymous_53)","decl":{"start":{"line":790,"column":17},"end":{"line":790,"column":18}},"loc":{"start":{"line":790,"column":26},"end":{"line":797,"column":1}},"line":790},"54":{"name":"(anonymous_54)","decl":{"start":{"line":799,"column":24},"end":{"line":799,"column":25}},"loc":{"start":{"line":799,"column":33},"end":{"line":802,"column":1}},"line":799},"55":{"name":"getBrowserInfo","decl":{"start":{"line":804,"column":9},"end":{"line":804,"column":23}},"loc":{"start":{"line":804,"column":35},"end":{"line":807,"column":1}},"line":804},"56":{"name":"getInfoFromUA","decl":{"start":{"line":809,"column":9},"end":{"line":809,"column":22}},"loc":{"start":{"line":809,"column":50},"end":{"line":813,"column":1}},"line":809},"57":{"name":"getDeviceModel","decl":{"start":{"line":815,"column":9},"end":{"line":815,"column":23}},"loc":{"start":{"line":815,"column":44},"end":{"line":822,"column":1}},"line":815},"58":{"name":"getValuesAsArrayFromConfig","decl":{"start":{"line":839,"column":9},"end":{"line":839,"column":35}},"loc":{"start":{"line":839,"column":55},"end":{"line":851,"column":1}},"line":839},"59":{"name":"(anonymous_59)","decl":{"start":{"line":843,"column":25},"end":{"line":843,"column":26}},"loc":{"start":{"line":843,"column":36},"end":{"line":848,"column":5}},"line":843},"60":{"name":"toUnixTimestamp","decl":{"start":{"line":854,"column":9},"end":{"line":854,"column":24}},"loc":{"start":{"line":854,"column":36},"end":{"line":858,"column":1}},"line":854},"61":{"name":"getTimeDifference","decl":{"start":{"line":861,"column":9},"end":{"line":861,"column":26}},"loc":{"start":{"line":861,"column":38},"end":{"line":872,"column":1}},"line":861},"62":{"name":"getFirstAndLastName","decl":{"start":{"line":877,"column":9},"end":{"line":877,"column":28}},"loc":{"start":{"line":877,"column":62},"end":{"line":892,"column":1}},"line":877},"63":{"name":"getFullName","decl":{"start":{"line":897,"column":9},"end":{"line":897,"column":20}},"loc":{"start":{"line":897,"column":30},"end":{"line":906,"column":1}},"line":897},"64":{"name":"extractCustomFields","decl":{"start":{"line":937,"column":9},"end":{"line":937,"column":28}},"loc":{"start":{"line":937,"column":74},"end":{"line":967,"column":1}},"line":937},"65":{"name":"(anonymous_65)","decl":{"start":{"line":940,"column":13},"end":{"line":940,"column":14}},"loc":{"start":{"line":940,"column":20},"end":{"line":952,"column":5}},"line":940},"66":{"name":"(anonymous_66)","decl":{"start":{"line":943,"column":40},"end":{"line":943,"column":41}},"loc":{"start":{"line":943,"column":45},"end":{"line":945,"column":9}},"line":943},"67":{"name":"(anonymous_67)","decl":{"start":{"line":946,"column":24},"end":{"line":946,"column":25}},"loc":{"start":{"line":946,"column":38},"end":{"line":950,"column":9}},"line":946},"68":{"name":"(anonymous_68)","decl":{"start":{"line":954,"column":29},"end":{"line":954,"column":30}},"loc":{"start":{"line":954,"column":34},"end":{"line":956,"column":5}},"line":954},"69":{"name":"(anonymous_69)","decl":{"start":{"line":957,"column":20},"end":{"line":957,"column":21}},"loc":{"start":{"line":957,"column":34},"end":{"line":961,"column":5}},"line":957},"70":{"name":"deleteObjectProperty","decl":{"start":{"line":970,"column":9},"end":{"line":970,"column":29}},"loc":{"start":{"line":970,"column":52},"end":{"line":987,"column":1}},"line":970},"71":{"name":"toTitleCase","decl":{"start":{"line":991,"column":9},"end":{"line":991,"column":20}},"loc":{"start":{"line":991,"column":30},"end":{"line":1009,"column":1}},"line":991},"72":{"name":"(anonymous_72)","decl":{"start":{"line":993,"column":31},"end":{"line":993,"column":32}},"loc":{"start":{"line":993,"column":38},"end":{"line":1007,"column":3}},"line":993},"73":{"name":"(anonymous_73)","decl":{"start":{"line":1003,"column":39},"end":{"line":1003,"column":40}},"loc":{"start":{"line":1003,"column":48},"end":{"line":1005,"column":7}},"line":1003},"74":{"name":"checkEmptyStringInarray","decl":{"start":{"line":1013,"column":9},"end":{"line":1013,"column":32}},"loc":{"start":{"line":1013,"column":40},"end":{"line":1016,"column":1}},"line":1013},"75":{"name":"(anonymous_75)","decl":{"start":{"line":1014,"column":30},"end":{"line":1014,"column":31}},"loc":{"start":{"line":1014,"column":38},"end":{"line":1014,"column":49}},"line":1014},"76":{"name":"getStringValueOfJSON","decl":{"start":{"line":1018,"column":9},"end":{"line":1018,"column":29}},"loc":{"start":{"line":1018,"column":36},"end":{"line":1027,"column":1}},"line":1018},"77":{"name":"(anonymous_77)","decl":{"start":{"line":1020,"column":28},"end":{"line":1020,"column":29}},"loc":{"start":{"line":1020,"column":35},"end":{"line":1025,"column":3}},"line":1020},"78":{"name":"(anonymous_78)","decl":{"start":{"line":1029,"column":20},"end":{"line":1029,"column":21}},"loc":{"start":{"line":1029,"column":32},"end":{"line":1035,"column":1}},"line":1029},"79":{"name":"checkSubsetOfArray","decl":{"start":{"line":1037,"column":9},"end":{"line":1037,"column":27}},"loc":{"start":{"line":1037,"column":44},"end":{"line":1040,"column":1}},"line":1037},"80":{"name":"(anonymous_80)","decl":{"start":{"line":1038,"column":30},"end":{"line":1038,"column":31}},"loc":{"start":{"line":1038,"column":37},"end":{"line":1038,"column":57}},"line":1038},"81":{"name":"returnArrayOfSubarrays","decl":{"start":{"line":1043,"column":9},"end":{"line":1043,"column":31}},"loc":{"start":{"line":1043,"column":42},"end":{"line":1051,"column":1}},"line":1043},"82":{"name":"addExternalIdToTraits","decl":{"start":{"line":1055,"column":9},"end":{"line":1055,"column":30}},"loc":{"start":{"line":1055,"column":40},"end":{"line":1063,"column":1}},"line":1055},"83":{"name":"(anonymous_83)","decl":{"start":{"line":1064,"column":32},"end":{"line":1064,"column":33}},"loc":{"start":{"line":1064,"column":43},"end":{"line":1069,"column":1}},"line":1064},"84":{"name":"(anonymous_84)","decl":{"start":{"line":1071,"column":2},"end":{"line":1071,"column":3}},"loc":{"start":{"line":1071,"column":45},"end":{"line":1074,"column":3}},"line":1071},"85":{"name":"generateErrorObject","decl":{"start":{"line":1083,"column":9},"end":{"line":1083,"column":28}},"loc":{"start":{"line":1083,"column":65},"end":{"line":1109,"column":1}},"line":1083},"86":{"name":"isHttpStatusSuccess","decl":{"start":{"line":1115,"column":9},"end":{"line":1115,"column":28}},"loc":{"start":{"line":1115,"column":37},"end":{"line":1117,"column":1}},"line":1115},"87":{"name":"isHttpStatusRetryable","decl":{"start":{"line":1124,"column":9},"end":{"line":1124,"column":30}},"loc":{"start":{"line":1124,"column":39},"end":{"line":1126,"column":1}},"line":1124},"88":{"name":"generateUUID","decl":{"start":{"line":1132,"column":9},"end":{"line":1132,"column":21}},"loc":{"start":{"line":1132,"column":24},"end":{"line":1146,"column":1}},"line":1132},"89":{"name":"(anonymous_89)","decl":{"start":{"line":1141,"column":65},"end":{"line":1141,"column":66}},"loc":{"start":{"line":1141,"column":77},"end":{"line":1145,"column":3}},"line":1141},"90":{"name":"(anonymous_90)","decl":{"start":{"line":1148,"column":27},"end":{"line":1148,"column":28}},"loc":{"start":{"line":1148,"column":42},"end":{"line":1151,"column":1}},"line":1148},"91":{"name":"(anonymous_91)","decl":{"start":{"line":1153,"column":25},"end":{"line":1153,"column":26}},"loc":{"start":{"line":1153,"column":55},"end":{"line":1159,"column":1}},"line":1153},"92":{"name":"isAppleFamily","decl":{"start":{"line":1161,"column":9},"end":{"line":1161,"column":22}},"loc":{"start":{"line":1161,"column":33},"end":{"line":1164,"column":1}},"line":1161},"93":{"name":"removeHyphens","decl":{"start":{"line":1166,"column":9},"end":{"line":1166,"column":22}},"loc":{"start":{"line":1166,"column":28},"end":{"line":1168,"column":1}},"line":1166},"94":{"name":"isCdkDestination","decl":{"start":{"line":1170,"column":9},"end":{"line":1170,"column":25}},"loc":{"start":{"line":1170,"column":33},"end":{"line":1178,"column":1}},"line":1170},"95":{"name":"getValidDynamicFormConfig","decl":{"start":{"line":1208,"column":9},"end":{"line":1208,"column":34}},"loc":{"start":{"line":1214,"column":2},"end":{"line":1228,"column":1}},"line":1214},"96":{"name":"(anonymous_96)","decl":{"start":{"line":1215,"column":36},"end":{"line":1215,"column":37}},"loc":{"start":{"line":1215,"column":47},"end":{"line":1220,"column":3}},"line":1215}},"branchMap":{"0":{"loc":{"start":{"line":32,"column":33},"end":{"line":32,"column":61}},"type":"binary-expr","locations":[{"start":{"line":32,"column":33},"end":{"line":32,"column":45}},{"start":{"line":32,"column":49},"end":{"line":32,"column":61}}],"line":32},"1":{"loc":{"start":{"line":34,"column":2},"end":{"line":34,"column":47}},"type":"binary-expr","locations":[{"start":{"line":34,"column":2},"end":{"line":34,"column":14}},{"start":{"line":34,"column":18},"end":{"line":34,"column":30}},{"start":{"line":34,"column":34},"end":{"line":34,"column":47}}],"line":34},"2":{"loc":{"start":{"line":56,"column":9},"end":{"line":56,"column":58}},"type":"cond-expr","locations":[{"start":{"line":56,"column":36},"end":{"line":56,"column":52}},{"start":{"line":56,"column":55},"end":{"line":56,"column":58}}],"line":56},"3":{"loc":{"start":{"line":56,"column":9},"end":{"line":56,"column":33}},"type":"binary-expr","locations":[{"start":{"line":56,"column":9},"end":{"line":56,"column":12}},{"start":{"line":56,"column":16},"end":{"line":56,"column":33}}],"line":56},"4":{"loc":{"start":{"line":61,"column":9},"end":{"line":61,"column":66}},"type":"binary-expr","locations":[{"start":{"line":61,"column":9},"end":{"line":61,"column":20}},{"start":{"line":61,"column":25},"end":{"line":61,"column":42}},{"start":{"line":61,"column":46},"end":{"line":61,"column":65}}],"line":61},"5":{"loc":{"start":{"line":75,"column":2},"end":{"line":77,"column":3}},"type":"if","locations":[{"start":{"line":75,"column":2},"end":{"line":77,"column":3}},{"start":{"line":75,"column":2},"end":{"line":77,"column":3}}],"line":75},"6":{"loc":{"start":{"line":78,"column":2},"end":{"line":80,"column":3}},"type":"if","locations":[{"start":{"line":78,"column":2},"end":{"line":80,"column":3}},{"start":{"line":78,"column":2},"end":{"line":80,"column":3}}],"line":78},"7":{"loc":{"start":{"line":85,"column":2},"end":{"line":85,"column":39}},"type":"if","locations":[{"start":{"line":85,"column":2},"end":{"line":85,"column":39}},{"start":{"line":85,"column":2},"end":{"line":85,"column":39}}],"line":85},"8":{"loc":{"start":{"line":85,"column":6},"end":{"line":85,"column":25}},"type":"binary-expr","locations":[{"start":{"line":85,"column":6},"end":{"line":85,"column":12}},{"start":{"line":85,"column":16},"end":{"line":85,"column":25}}],"line":85},"9":{"loc":{"start":{"line":99,"column":2},"end":{"line":102,"column":3}},"type":"if","locations":[{"start":{"line":99,"column":2},"end":{"line":102,"column":3}},{"start":{"line":99,"column":2},"end":{"line":102,"column":3}}],"line":99},"10":{"loc":{"start":{"line":109,"column":2},"end":{"line":109,"column":18}},"type":"default-arg","locations":[{"start":{"line":109,"column":12},"end":{"line":109,"column":18}}],"line":109},"11":{"loc":{"start":{"line":110,"column":2},"end":{"line":110,"column":14}},"type":"default-arg","locations":[{"start":{"line":110,"column":10},"end":{"line":110,"column":14}}],"line":110},"12":{"loc":{"start":{"line":111,"column":2},"end":{"line":111,"column":20}},"type":"default-arg","locations":[{"start":{"line":111,"column":16},"end":{"line":111,"column":20}}],"line":111},"13":{"loc":{"start":{"line":114,"column":2},"end":{"line":120,"column":3}},"type":"if","locations":[{"start":{"line":114,"column":2},"end":{"line":120,"column":3}},{"start":{"line":114,"column":2},"end":{"line":120,"column":3}}],"line":114},"14":{"loc":{"start":{"line":116,"column":6},"end":{"line":116,"column":42}},"type":"if","locations":[{"start":{"line":116,"column":6},"end":{"line":116,"column":42}},{"start":{"line":116,"column":6},"end":{"line":116,"column":42}}],"line":116},"15":{"loc":{"start":{"line":117,"column":14},"end":{"line":117,"column":73}},"type":"cond-expr","locations":[{"start":{"line":117,"column":28},"end":{"line":117,"column":56}},{"start":{"line":117,"column":59},"end":{"line":117,"column":73}}],"line":117},"16":{"loc":{"start":{"line":127,"column":2},"end":{"line":149,"column":3}},"type":"if","locations":[{"start":{"line":127,"column":2},"end":{"line":149,"column":3}},{"start":{"line":127,"column":2},"end":{"line":149,"column":3}}],"line":127},"17":{"loc":{"start":{"line":133,"column":6},"end":{"line":147,"column":7}},"type":"if","locations":[{"start":{"line":133,"column":6},"end":{"line":147,"column":7}},{"start":{"line":133,"column":6},"end":{"line":147,"column":7}}],"line":133},"18":{"loc":{"start":{"line":133,"column":10},"end":{"line":133,"column":60}},"type":"binary-expr","locations":[{"start":{"line":133,"column":10},"end":{"line":133,"column":35}},{"start":{"line":133,"column":39},"end":{"line":133,"column":60}}],"line":133},"19":{"loc":{"start":{"line":136,"column":10},"end":{"line":138,"column":11}},"type":"if","locations":[{"start":{"line":136,"column":10},"end":{"line":138,"column":11}},{"start":{"line":136,"column":10},"end":{"line":138,"column":11}}],"line":136},"20":{"loc":{"start":{"line":140,"column":8},"end":{"line":146,"column":9}},"type":"if","locations":[{"start":{"line":140,"column":8},"end":{"line":146,"column":9}},{"start":{"line":140,"column":8},"end":{"line":146,"column":9}}],"line":140},"21":{"loc":{"start":{"line":142,"column":15},"end":{"line":146,"column":9}},"type":"if","locations":[{"start":{"line":142,"column":15},"end":{"line":146,"column":9}},{"start":{"line":142,"column":15},"end":{"line":146,"column":9}}],"line":142},"22":{"loc":{"start":{"line":161,"column":4},"end":{"line":177,"column":5}},"type":"if","locations":[{"start":{"line":161,"column":4},"end":{"line":177,"column":5}},{"start":{"line":161,"column":4},"end":{"line":177,"column":5}}],"line":161},"23":{"loc":{"start":{"line":163,"column":11},"end":{"line":177,"column":5}},"type":"if","locations":[{"start":{"line":163,"column":11},"end":{"line":177,"column":5}},{"start":{"line":163,"column":11},"end":{"line":177,"column":5}}],"line":163},"24":{"loc":{"start":{"line":167,"column":6},"end":{"line":169,"column":7}},"type":"if","locations":[{"start":{"line":167,"column":6},"end":{"line":169,"column":7}},{"start":{"line":167,"column":6},"end":{"line":169,"column":7}}],"line":167},"25":{"loc":{"start":{"line":174,"column":26},"end":{"line":174,"column":55}},"type":"cond-expr","locations":[{"start":{"line":174,"column":33},"end":{"line":174,"column":49}},{"start":{"line":174,"column":52},"end":{"line":174,"column":55}}],"line":174},"26":{"loc":{"start":{"line":176,"column":6},"end":{"line":176,"column":49}},"type":"if","locations":[{"start":{"line":176,"column":6},"end":{"line":176,"column":49}},{"start":{"line":176,"column":6},"end":{"line":176,"column":49}}],"line":176},"27":{"loc":{"start":{"line":176,"column":10},"end":{"line":176,"column":29}},"type":"binary-expr","locations":[{"start":{"line":176,"column":10},"end":{"line":176,"column":21}},{"start":{"line":176,"column":25},"end":{"line":176,"column":29}}],"line":176},"28":{"loc":{"start":{"line":188,"column":2},"end":{"line":199,"column":3}},"type":"if","locations":[{"start":{"line":188,"column":2},"end":{"line":199,"column":3}},{"start":{"line":188,"column":2},"end":{"line":199,"column":3}}],"line":188},"29":{"loc":{"start":{"line":197,"column":6},"end":{"line":197,"column":78}},"type":"cond-expr","locations":[{"start":{"line":197,"column":17},"end":{"line":197,"column":50}},{"start":{"line":197,"column":53},"end":{"line":197,"column":78}}],"line":197},"30":{"loc":{"start":{"line":210,"column":6},"end":{"line":210,"column":34}},"type":"cond-expr","locations":[{"start":{"line":210,"column":23},"end":{"line":210,"column":24}},{"start":{"line":210,"column":27},"end":{"line":210,"column":34}}],"line":210},"31":{"loc":{"start":{"line":211,"column":6},"end":{"line":211,"column":34}},"type":"cond-expr","locations":[{"start":{"line":211,"column":23},"end":{"line":211,"column":24}},{"start":{"line":211,"column":27},"end":{"line":211,"column":34}}],"line":211},"32":{"loc":{"start":{"line":221,"column":2},"end":{"line":223,"column":3}},"type":"if","locations":[{"start":{"line":221,"column":2},"end":{"line":223,"column":3}},{"start":{"line":221,"column":2},"end":{"line":223,"column":3}}],"line":221},"33":{"loc":{"start":{"line":235,"column":2},"end":{"line":241,"column":3}},"type":"if","locations":[{"start":{"line":235,"column":2},"end":{"line":241,"column":3}},{"start":{"line":235,"column":2},"end":{"line":241,"column":3}}],"line":235},"34":{"loc":{"start":{"line":236,"column":4},"end":{"line":238,"column":36}},"type":"binary-expr","locations":[{"start":{"line":236,"column":4},"end":{"line":236,"column":37}},{"start":{"line":237,"column":4},"end":{"line":237,"column":32}},{"start":{"line":238,"column":4},"end":{"line":238,"column":36}}],"line":236},"35":{"loc":{"start":{"line":242,"column":2},"end":{"line":248,"column":3}},"type":"if","locations":[{"start":{"line":242,"column":2},"end":{"line":248,"column":3}},{"start":{"line":242,"column":2},"end":{"line":248,"column":3}}],"line":242},"36":{"loc":{"start":{"line":243,"column":4},"end":{"line":245,"column":34}},"type":"binary-expr","locations":[{"start":{"line":243,"column":4},"end":{"line":243,"column":35}},{"start":{"line":244,"column":4},"end":{"line":244,"column":32}},{"start":{"line":245,"column":4},"end":{"line":245,"column":34}}],"line":243},"37":{"loc":{"start":{"line":329,"column":2},"end":{"line":329,"column":17}},"type":"default-arg","locations":[{"start":{"line":329,"column":12},"end":{"line":329,"column":17}}],"line":329},"38":{"loc":{"start":{"line":347,"column":2},"end":{"line":347,"column":17}},"type":"default-arg","locations":[{"start":{"line":347,"column":12},"end":{"line":347,"column":17}}],"line":347},"39":{"loc":{"start":{"line":371,"column":2},"end":{"line":373,"column":3}},"type":"if","locations":[{"start":{"line":371,"column":2},"end":{"line":373,"column":3}},{"start":{"line":371,"column":2},"end":{"line":373,"column":3}}],"line":371},"40":{"loc":{"start":{"line":371,"column":6},"end":{"line":371,"column":43}},"type":"binary-expr","locations":[{"start":{"line":371,"column":6},"end":{"line":371,"column":21}},{"start":{"line":371,"column":25},"end":{"line":371,"column":43}}],"line":371},"41":{"loc":{"start":{"line":395,"column":4},"end":{"line":397,"column":5}},"type":"if","locations":[{"start":{"line":395,"column":4},"end":{"line":397,"column":5}},{"start":{"line":395,"column":4},"end":{"line":397,"column":5}}],"line":395},"42":{"loc":{"start":{"line":403,"column":2},"end":{"line":426,"column":3}},"type":"if","locations":[{"start":{"line":403,"column":2},"end":{"line":426,"column":3}},{"start":{"line":403,"column":2},"end":{"line":426,"column":3}}],"line":403},"43":{"loc":{"start":{"line":403,"column":6},"end":{"line":403,"column":54}},"type":"binary-expr","locations":[{"start":{"line":403,"column":6},"end":{"line":403,"column":30}},{"start":{"line":403,"column":34},"end":{"line":403,"column":54}}],"line":403},"44":{"loc":{"start":{"line":404,"column":4},"end":{"line":408,"column":5}},"type":"if","locations":[{"start":{"line":404,"column":4},"end":{"line":408,"column":5}},{"start":{"line":404,"column":4},"end":{"line":408,"column":5}}],"line":404},"45":{"loc":{"start":{"line":412,"column":6},"end":{"line":416,"column":7}},"type":"if","locations":[{"start":{"line":412,"column":6},"end":{"line":416,"column":7}},{"start":{"line":412,"column":6},"end":{"line":416,"column":7}}],"line":412},"46":{"loc":{"start":{"line":412,"column":10},"end":{"line":412,"column":43}},"type":"binary-expr","locations":[{"start":{"line":412,"column":10},"end":{"line":412,"column":13}},{"start":{"line":412,"column":17},"end":{"line":412,"column":30}},{"start":{"line":412,"column":34},"end":{"line":412,"column":43}}],"line":412},"47":{"loc":{"start":{"line":418,"column":9},"end":{"line":426,"column":3}},"type":"if","locations":[{"start":{"line":418,"column":9},"end":{"line":426,"column":3}},{"start":{"line":418,"column":9},"end":{"line":426,"column":3}}],"line":418},"48":{"loc":{"start":{"line":438,"column":2},"end":{"line":440,"column":3}},"type":"if","locations":[{"start":{"line":438,"column":2},"end":{"line":440,"column":3}},{"start":{"line":438,"column":2},"end":{"line":440,"column":3}}],"line":438},"49":{"loc":{"start":{"line":450,"column":49},"end":{"line":450,"column":71}},"type":"default-arg","locations":[{"start":{"line":450,"column":67},"end":{"line":450,"column":71}}],"line":450},"50":{"loc":{"start":{"line":451,"column":2},"end":{"line":453,"column":3}},"type":"if","locations":[{"start":{"line":451,"column":2},"end":{"line":453,"column":3}},{"start":{"line":451,"column":2},"end":{"line":453,"column":3}}],"line":451},"51":{"loc":{"start":{"line":467,"column":2},"end":{"line":469,"column":3}},"type":"if","locations":[{"start":{"line":467,"column":2},"end":{"line":469,"column":3}},{"start":{"line":467,"column":2},"end":{"line":469,"column":3}}],"line":467},"52":{"loc":{"start":{"line":468,"column":11},"end":{"line":468,"column":32}},"type":"binary-expr","locations":[{"start":{"line":468,"column":11},"end":{"line":468,"column":23}},{"start":{"line":468,"column":27},"end":{"line":468,"column":32}}],"line":468},"53":{"loc":{"start":{"line":474,"column":2},"end":{"line":553,"column":3}},"type":"if","locations":[{"start":{"line":474,"column":2},"end":{"line":553,"column":3}},{"start":{"line":474,"column":2},"end":{"line":553,"column":3}}],"line":474},"54":{"loc":{"start":{"line":475,"column":4},"end":{"line":552,"column":5}},"type":"switch","locations":[{"start":{"line":476,"column":6},"end":{"line":478,"column":14}},{"start":{"line":479,"column":6},"end":{"line":483,"column":14}},{"start":{"line":484,"column":6},"end":{"line":486,"column":14}},{"start":{"line":487,"column":6},"end":{"line":489,"column":14}},{"start":{"line":490,"column":6},"end":{"line":492,"column":14}},{"start":{"line":493,"column":6},"end":{"line":495,"column":14}},{"start":{"line":496,"column":6},"end":{"line":502,"column":14}},{"start":{"line":503,"column":6},"end":{"line":515,"column":14}},{"start":{"line":516,"column":6},"end":{"line":518,"column":14}},{"start":{"line":519,"column":6},"end":{"line":521,"column":14}},{"start":{"line":522,"column":6},"end":{"line":524,"column":14}},{"start":{"line":525,"column":6},"end":{"line":527,"column":14}},{"start":{"line":528,"column":6},"end":{"line":533,"column":14}},{"start":{"line":534,"column":6},"end":{"line":536,"column":14}},{"start":{"line":537,"column":6},"end":{"line":539,"column":14}},{"start":{"line":540,"column":6},"end":{"line":544,"column":14}},{"start":{"line":545,"column":6},"end":{"line":549,"column":14}},{"start":{"line":550,"column":6},"end":{"line":551,"column":14}}],"line":475},"55":{"loc":{"start":{"line":499,"column":8},"end":{"line":501,"column":9}},"type":"if","locations":[{"start":{"line":499,"column":8},"end":{"line":501,"column":9}},{"start":{"line":499,"column":8},"end":{"line":501,"column":9}}],"line":499},"56":{"loc":{"start":{"line":504,"column":8},"end":{"line":510,"column":9}},"type":"if","locations":[{"start":{"line":504,"column":8},"end":{"line":510,"column":9}},{"start":{"line":504,"column":8},"end":{"line":510,"column":9}}],"line":504},"57":{"loc":{"start":{"line":505,"column":10},"end":{"line":507,"column":40}},"type":"binary-expr","locations":[{"start":{"line":505,"column":11},"end":{"line":505,"column":43}},{"start":{"line":506,"column":12},"end":{"line":506,"column":42}},{"start":{"line":507,"column":10},"end":{"line":507,"column":40}}],"line":505},"58":{"loc":{"start":{"line":511,"column":48},"end":{"line":511,"column":65}},"type":"binary-expr","locations":[{"start":{"line":511,"column":48},"end":{"line":511,"column":60}},{"start":{"line":511,"column":64},"end":{"line":511,"column":65}}],"line":511},"59":{"loc":{"start":{"line":512,"column":8},"end":{"line":514,"column":9}},"type":"if","locations":[{"start":{"line":512,"column":8},"end":{"line":514,"column":9}},{"start":{"line":512,"column":8},"end":{"line":514,"column":9}}],"line":512},"60":{"loc":{"start":{"line":530,"column":10},"end":{"line":532,"column":48}},"type":"cond-expr","locations":[{"start":{"line":531,"column":14},"end":{"line":531,"column":34}},{"start":{"line":532,"column":14},"end":{"line":532,"column":48}}],"line":530},"61":{"loc":{"start":{"line":530,"column":10},"end":{"line":530,"column":51}},"type":"binary-expr","locations":[{"start":{"line":530,"column":10},"end":{"line":530,"column":25}},{"start":{"line":530,"column":29},"end":{"line":530,"column":51}}],"line":530},"62":{"loc":{"start":{"line":546,"column":8},"end":{"line":548,"column":9}},"type":"if","locations":[{"start":{"line":546,"column":8},"end":{"line":548,"column":9}},{"start":{"line":546,"column":8},"end":{"line":548,"column":9}}],"line":546},"63":{"loc":{"start":{"line":556,"column":2},"end":{"line":559,"column":3}},"type":"if","locations":[{"start":{"line":556,"column":2},"end":{"line":559,"column":3}},{"start":{"line":556,"column":2},"end":{"line":559,"column":3}}],"line":556},"64":{"loc":{"start":{"line":562,"column":2},"end":{"line":573,"column":3}},"type":"if","locations":[{"start":{"line":562,"column":2},"end":{"line":573,"column":3}},{"start":{"line":562,"column":2},"end":{"line":573,"column":3}}],"line":562},"65":{"loc":{"start":{"line":563,"column":4},"end":{"line":572,"column":5}},"type":"if","locations":[{"start":{"line":563,"column":4},"end":{"line":572,"column":5}},{"start":{"line":563,"column":4},"end":{"line":572,"column":5}}],"line":563},"66":{"loc":{"start":{"line":590,"column":2},"end":{"line":616,"column":3}},"type":"if","locations":[{"start":{"line":590,"column":2},"end":{"line":616,"column":3}},{"start":{"line":590,"column":2},"end":{"line":616,"column":3}}],"line":590},"67":{"loc":{"start":{"line":592,"column":4},"end":{"line":614,"column":5}},"type":"if","locations":[{"start":{"line":592,"column":4},"end":{"line":614,"column":5}},{"start":{"line":592,"column":4},"end":{"line":614,"column":5}}],"line":592},"68":{"loc":{"start":{"line":594,"column":8},"end":{"line":604,"column":9}},"type":"if","locations":[{"start":{"line":594,"column":8},"end":{"line":604,"column":9}},{"start":{"line":594,"column":8},"end":{"line":604,"column":9}}],"line":594},"69":{"loc":{"start":{"line":595,"column":10},"end":{"line":597,"column":39}},"type":"binary-expr","locations":[{"start":{"line":595,"column":10},"end":{"line":595,"column":24}},{"start":{"line":596,"column":10},"end":{"line":596,"column":43}},{"start":{"line":597,"column":10},"end":{"line":597,"column":39}}],"line":595},"70":{"loc":{"start":{"line":606,"column":8},"end":{"line":610,"column":9}},"type":"if","locations":[{"start":{"line":606,"column":8},"end":{"line":610,"column":9}},{"start":{"line":606,"column":8},"end":{"line":610,"column":9}}],"line":606},"71":{"loc":{"start":{"line":615,"column":4},"end":{"line":615,"column":44}},"type":"if","locations":[{"start":{"line":615,"column":4},"end":{"line":615,"column":44}},{"start":{"line":615,"column":4},"end":{"line":615,"column":44}}],"line":615},"72":{"loc":{"start":{"line":618,"column":2},"end":{"line":631,"column":3}},"type":"if","locations":[{"start":{"line":618,"column":2},"end":{"line":631,"column":3}},{"start":{"line":618,"column":2},"end":{"line":631,"column":3}}],"line":618},"73":{"loc":{"start":{"line":620,"column":4},"end":{"line":627,"column":5}},"type":"if","locations":[{"start":{"line":620,"column":4},"end":{"line":627,"column":5}},{"start":{"line":620,"column":4},"end":{"line":627,"column":5}}],"line":620},"74":{"loc":{"start":{"line":622,"column":8},"end":{"line":625,"column":9}},"type":"if","locations":[{"start":{"line":622,"column":8},"end":{"line":625,"column":9}},{"start":{"line":622,"column":8},"end":{"line":625,"column":9}}],"line":622},"75":{"loc":{"start":{"line":628,"column":4},"end":{"line":630,"column":5}},"type":"if","locations":[{"start":{"line":628,"column":4},"end":{"line":630,"column":5}},{"start":{"line":628,"column":4},"end":{"line":630,"column":5}}],"line":628},"76":{"loc":{"start":{"line":639,"column":37},"end":{"line":639,"column":59}},"type":"default-arg","locations":[{"start":{"line":639,"column":55},"end":{"line":639,"column":59}}],"line":639},"77":{"loc":{"start":{"line":640,"column":2},"end":{"line":651,"column":3}},"type":"if","locations":[{"start":{"line":640,"column":2},"end":{"line":651,"column":3}},{"start":{"line":640,"column":2},"end":{"line":651,"column":3}}],"line":640},"78":{"loc":{"start":{"line":647,"column":6},"end":{"line":649,"column":7}},"type":"if","locations":[{"start":{"line":647,"column":6},"end":{"line":649,"column":7}},{"start":{"line":647,"column":6},"end":{"line":649,"column":7}}],"line":647},"79":{"loc":{"start":{"line":656,"column":48},"end":{"line":656,"column":70}},"type":"default-arg","locations":[{"start":{"line":656,"column":66},"end":{"line":656,"column":70}}],"line":656},"80":{"loc":{"start":{"line":658,"column":2},"end":{"line":735,"column":3}},"type":"if","locations":[{"start":{"line":658,"column":2},"end":{"line":735,"column":3}},{"start":{"line":658,"column":2},"end":{"line":735,"column":3}}],"line":658},"81":{"loc":{"start":{"line":658,"column":6},"end":{"line":658,"column":58}},"type":"binary-expr","locations":[{"start":{"line":658,"column":6},"end":{"line":658,"column":32}},{"start":{"line":658,"column":36},"end":{"line":658,"column":58}}],"line":658},"82":{"loc":{"start":{"line":707,"column":30},"end":{"line":709,"column":14}},"type":"cond-expr","locations":[{"start":{"line":708,"column":10},"end":{"line":708,"column":54}},{"start":{"line":709,"column":10},"end":{"line":709,"column":14}}],"line":707},"83":{"loc":{"start":{"line":711,"column":8},"end":{"line":713,"column":52}},"type":"cond-expr","locations":[{"start":{"line":712,"column":12},"end":{"line":712,"column":57}},{"start":{"line":713,"column":12},"end":{"line":713,"column":52}}],"line":711},"84":{"loc":{"start":{"line":718,"column":6},"end":{"line":731,"column":7}},"type":"if","locations":[{"start":{"line":718,"column":6},"end":{"line":731,"column":7}},{"start":{"line":718,"column":6},"end":{"line":731,"column":7}}],"line":718},"85":{"loc":{"start":{"line":718,"column":10},"end":{"line":718,"column":49}},"type":"binary-expr","locations":[{"start":{"line":718,"column":10},"end":{"line":718,"column":15}},{"start":{"line":718,"column":19},"end":{"line":718,"column":30}},{"start":{"line":718,"column":34},"end":{"line":718,"column":49}}],"line":718},"86":{"loc":{"start":{"line":719,"column":8},"end":{"line":725,"column":9}},"type":"if","locations":[{"start":{"line":719,"column":8},"end":{"line":725,"column":9}},{"start":{"line":719,"column":8},"end":{"line":725,"column":9}}],"line":719},"87":{"loc":{"start":{"line":726,"column":13},"end":{"line":731,"column":7}},"type":"if","locations":[{"start":{"line":726,"column":13},"end":{"line":731,"column":7}},{"start":{"line":726,"column":13},"end":{"line":731,"column":7}}],"line":726},"88":{"loc":{"start":{"line":756,"column":2},"end":{"line":758,"column":3}},"type":"if","locations":[{"start":{"line":756,"column":2},"end":{"line":758,"column":3}},{"start":{"line":756,"column":2},"end":{"line":758,"column":3}}],"line":756},"89":{"loc":{"start":{"line":756,"column":6},"end":{"line":756,"column":51}},"type":"binary-expr","locations":[{"start":{"line":756,"column":6},"end":{"line":756,"column":21}},{"start":{"line":756,"column":25},"end":{"line":756,"column":51}}],"line":756},"90":{"loc":{"start":{"line":759,"column":2},"end":{"line":765,"column":3}},"type":"if","locations":[{"start":{"line":759,"column":2},"end":{"line":765,"column":3}},{"start":{"line":759,"column":2},"end":{"line":765,"column":3}}],"line":759},"91":{"loc":{"start":{"line":761,"column":6},"end":{"line":763,"column":7}},"type":"if","locations":[{"start":{"line":761,"column":6},"end":{"line":763,"column":7}},{"start":{"line":761,"column":6},"end":{"line":763,"column":7}}],"line":761},"92":{"loc":{"start":{"line":775,"column":2},"end":{"line":777,"column":3}},"type":"if","locations":[{"start":{"line":775,"column":2},"end":{"line":777,"column":3}},{"start":{"line":775,"column":2},"end":{"line":777,"column":3}}],"line":775},"93":{"loc":{"start":{"line":775,"column":6},"end":{"line":775,"column":51}},"type":"binary-expr","locations":[{"start":{"line":775,"column":6},"end":{"line":775,"column":21}},{"start":{"line":775,"column":25},"end":{"line":775,"column":51}}],"line":775},"94":{"loc":{"start":{"line":778,"column":2},"end":{"line":786,"column":3}},"type":"if","locations":[{"start":{"line":778,"column":2},"end":{"line":786,"column":3}},{"start":{"line":778,"column":2},"end":{"line":786,"column":3}}],"line":778},"95":{"loc":{"start":{"line":781,"column":6},"end":{"line":784,"column":7}},"type":"if","locations":[{"start":{"line":781,"column":6},"end":{"line":784,"column":7}},{"start":{"line":781,"column":6},"end":{"line":784,"column":7}}],"line":781},"96":{"loc":{"start":{"line":793,"column":4},"end":{"line":795,"column":25}},"type":"binary-expr","locations":[{"start":{"line":793,"column":4},"end":{"line":793,"column":17}},{"start":{"line":794,"column":5},"end":{"line":794,"column":22}},{"start":{"line":794,"column":26},"end":{"line":794,"column":45}},{"start":{"line":795,"column":4},"end":{"line":795,"column":25}}],"line":793},"97":{"loc":{"start":{"line":801,"column":9},"end":{"line":801,"column":68}},"type":"binary-expr","locations":[{"start":{"line":801,"column":9},"end":{"line":801,"column":22}},{"start":{"line":801,"column":26},"end":{"line":801,"column":43}},{"start":{"line":801,"column":47},"end":{"line":801,"column":68}}],"line":801},"98":{"loc":{"start":{"line":811,"column":18},"end":{"line":811,"column":40}},"type":"cond-expr","locations":[{"start":{"line":811,"column":23},"end":{"line":811,"column":35}},{"start":{"line":811,"column":38},"end":{"line":811,"column":40}}],"line":811},"99":{"loc":{"start":{"line":812,"column":9},"end":{"line":812,"column":41}},"type":"binary-expr","locations":[{"start":{"line":812,"column":9},"end":{"line":812,"column":27}},{"start":{"line":812,"column":31},"end":{"line":812,"column":41}}],"line":812},"100":{"loc":{"start":{"line":818,"column":2},"end":{"line":820,"column":3}},"type":"if","locations":[{"start":{"line":818,"column":2},"end":{"line":820,"column":3}},{"start":{"line":818,"column":2},"end":{"line":820,"column":3}}],"line":818},"101":{"loc":{"start":{"line":818,"column":6},"end":{"line":818,"column":64}},"type":"binary-expr","locations":[{"start":{"line":818,"column":6},"end":{"line":818,"column":21}},{"start":{"line":818,"column":25},"end":{"line":818,"column":64}}],"line":818},"102":{"loc":{"start":{"line":841,"column":2},"end":{"line":849,"column":3}},"type":"if","locations":[{"start":{"line":841,"column":2},"end":{"line":849,"column":3}},{"start":{"line":841,"column":2},"end":{"line":849,"column":3}}],"line":841},"103":{"loc":{"start":{"line":841,"column":6},"end":{"line":841,"column":76}},"type":"binary-expr","locations":[{"start":{"line":841,"column":6},"end":{"line":841,"column":18}},{"start":{"line":841,"column":22},"end":{"line":841,"column":49}},{"start":{"line":841,"column":53},"end":{"line":841,"column":76}}],"line":841},"104":{"loc":{"start":{"line":845,"column":6},"end":{"line":847,"column":7}},"type":"if","locations":[{"start":{"line":845,"column":6},"end":{"line":847,"column":7}},{"start":{"line":845,"column":6},"end":{"line":847,"column":7}}],"line":845},"105":{"loc":{"start":{"line":877,"column":37},"end":{"line":877,"column":60}},"type":"default-arg","locations":[{"start":{"line":877,"column":55},"end":{"line":877,"column":60}}],"line":877},"106":{"loc":{"start":{"line":879,"column":2},"end":{"line":881,"column":3}},"type":"if","locations":[{"start":{"line":879,"column":2},"end":{"line":881,"column":3}},{"start":{"line":879,"column":2},"end":{"line":881,"column":3}}],"line":879},"107":{"loc":{"start":{"line":884,"column":6},"end":{"line":885,"column":61}},"type":"binary-expr","locations":[{"start":{"line":884,"column":6},"end":{"line":884,"column":22}},{"start":{"line":885,"column":7},"end":{"line":885,"column":60}}],"line":884},"108":{"loc":{"start":{"line":885,"column":7},"end":{"line":885,"column":60}},"type":"cond-expr","locations":[{"start":{"line":885,"column":43},"end":{"line":885,"column":55}},{"start":{"line":885,"column":58},"end":{"line":885,"column":60}}],"line":885},"109":{"loc":{"start":{"line":885,"column":7},"end":{"line":885,"column":40}},"type":"binary-expr","locations":[{"start":{"line":885,"column":7},"end":{"line":885,"column":16}},{"start":{"line":885,"column":20},"end":{"line":885,"column":40}}],"line":885},"110":{"loc":{"start":{"line":887,"column":6},"end":{"line":890,"column":26}},"type":"binary-expr","locations":[{"start":{"line":887,"column":6},"end":{"line":887,"column":21}},{"start":{"line":888,"column":7},"end":{"line":890,"column":25}}],"line":887},"111":{"loc":{"start":{"line":888,"column":7},"end":{"line":890,"column":25}},"type":"cond-expr","locations":[{"start":{"line":889,"column":10},"end":{"line":889,"column":41}},{"start":{"line":890,"column":10},"end":{"line":890,"column":25}}],"line":888},"112":{"loc":{"start":{"line":888,"column":7},"end":{"line":888,"column":40}},"type":"binary-expr","locations":[{"start":{"line":888,"column":7},"end":{"line":888,"column":16}},{"start":{"line":888,"column":20},"end":{"line":888,"column":40}}],"line":888},"113":{"loc":{"start":{"line":902,"column":2},"end":{"line":904,"column":3}},"type":"if","locations":[{"start":{"line":902,"column":2},"end":{"line":904,"column":3}},{"start":{"line":902,"column":2},"end":{"line":904,"column":3}}],"line":902},"114":{"loc":{"start":{"line":902,"column":6},"end":{"line":902,"column":36}},"type":"binary-expr","locations":[{"start":{"line":902,"column":6},"end":{"line":902,"column":11}},{"start":{"line":902,"column":15},"end":{"line":902,"column":24}},{"start":{"line":902,"column":28},"end":{"line":902,"column":36}}],"line":902},"115":{"loc":{"start":{"line":939,"column":2},"end":{"line":964,"column":3}},"type":"if","locations":[{"start":{"line":939,"column":2},"end":{"line":964,"column":3}},{"start":{"line":939,"column":2},"end":{"line":964,"column":3}}],"line":939},"116":{"loc":{"start":{"line":942,"column":6},"end":{"line":951,"column":7}},"type":"if","locations":[{"start":{"line":942,"column":6},"end":{"line":951,"column":7}},{"start":{"line":942,"column":6},"end":{"line":951,"column":7}}],"line":942},"117":{"loc":{"start":{"line":944,"column":10},"end":{"line":944,"column":64}},"type":"if","locations":[{"start":{"line":944,"column":10},"end":{"line":944,"column":64}},{"start":{"line":944,"column":10},"end":{"line":944,"column":64}}],"line":944},"118":{"loc":{"start":{"line":947,"column":10},"end":{"line":949,"column":11}},"type":"if","locations":[{"start":{"line":947,"column":10},"end":{"line":949,"column":11}},{"start":{"line":947,"column":10},"end":{"line":949,"column":11}}],"line":947},"119":{"loc":{"start":{"line":953,"column":9},"end":{"line":964,"column":3}},"type":"if","locations":[{"start":{"line":953,"column":9},"end":{"line":964,"column":3}},{"start":{"line":953,"column":9},"end":{"line":964,"column":3}}],"line":953},"120":{"loc":{"start":{"line":955,"column":6},"end":{"line":955,"column":60}},"type":"if","locations":[{"start":{"line":955,"column":6},"end":{"line":955,"column":60}},{"start":{"line":955,"column":6},"end":{"line":955,"column":60}}],"line":955},"121":{"loc":{"start":{"line":958,"column":6},"end":{"line":960,"column":7}},"type":"if","locations":[{"start":{"line":958,"column":6},"end":{"line":960,"column":7}},{"start":{"line":958,"column":6},"end":{"line":960,"column":7}}],"line":958},"122":{"loc":{"start":{"line":972,"column":2},"end":{"line":974,"column":3}},"type":"if","locations":[{"start":{"line":972,"column":2},"end":{"line":974,"column":3}},{"start":{"line":972,"column":2},"end":{"line":974,"column":3}}],"line":972},"123":{"loc":{"start":{"line":972,"column":6},"end":{"line":972,"column":30}},"type":"binary-expr","locations":[{"start":{"line":972,"column":6},"end":{"line":972,"column":13}},{"start":{"line":972,"column":17},"end":{"line":972,"column":30}}],"line":972},"124":{"loc":{"start":{"line":975,"column":2},"end":{"line":977,"column":3}},"type":"if","locations":[{"start":{"line":975,"column":2},"end":{"line":977,"column":3}},{"start":{"line":975,"column":2},"end":{"line":977,"column":3}}],"line":975},"125":{"loc":{"start":{"line":981,"column":4},"end":{"line":983,"column":5}},"type":"if","locations":[{"start":{"line":981,"column":4},"end":{"line":983,"column":5}},{"start":{"line":981,"column":4},"end":{"line":983,"column":5}}],"line":981},"126":{"loc":{"start":{"line":1022,"column":4},"end":{"line":1024,"column":5}},"type":"if","locations":[{"start":{"line":1022,"column":4},"end":{"line":1024,"column":5}},{"start":{"line":1022,"column":4},"end":{"line":1024,"column":5}}],"line":1022},"127":{"loc":{"start":{"line":1066,"column":2},"end":{"line":1068,"column":3}},"type":"if","locations":[{"start":{"line":1066,"column":2},"end":{"line":1068,"column":3}},{"start":{"line":1066,"column":2},"end":{"line":1068,"column":3}}],"line":1066},"128":{"loc":{"start":{"line":1086,"column":2},"end":{"line":1088,"column":3}},"type":"if","locations":[{"start":{"line":1086,"column":2},"end":{"line":1088,"column":3}},{"start":{"line":1086,"column":2},"end":{"line":1088,"column":3}}],"line":1086},"129":{"loc":{"start":{"line":1091,"column":2},"end":{"line":1097,"column":3}},"type":"if","locations":[{"start":{"line":1091,"column":2},"end":{"line":1097,"column":3}},{"start":{"line":1091,"column":2},"end":{"line":1097,"column":3}}],"line":1091},"130":{"loc":{"start":{"line":1099,"column":12},"end":{"line":1099,"column":25}},"type":"binary-expr","locations":[{"start":{"line":1099,"column":12},"end":{"line":1099,"column":18}},{"start":{"line":1099,"column":22},"end":{"line":1099,"column":25}}],"line":1099},"131":{"loc":{"start":{"line":1105,"column":2},"end":{"line":1107,"column":3}},"type":"if","locations":[{"start":{"line":1105,"column":2},"end":{"line":1107,"column":3}},{"start":{"line":1105,"column":2},"end":{"line":1107,"column":3}}],"line":1105},"132":{"loc":{"start":{"line":1106,"column":33},"end":{"line":1106,"column":62}},"type":"binary-expr","locations":[{"start":{"line":1106,"column":33},"end":{"line":1106,"column":56}},{"start":{"line":1106,"column":60},"end":{"line":1106,"column":62}}],"line":1106},"133":{"loc":{"start":{"line":1116,"column":9},"end":{"line":1116,"column":38}},"type":"binary-expr","locations":[{"start":{"line":1116,"column":9},"end":{"line":1116,"column":22}},{"start":{"line":1116,"column":26},"end":{"line":1116,"column":38}}],"line":1116},"134":{"loc":{"start":{"line":1125,"column":9},"end":{"line":1125,"column":38}},"type":"binary-expr","locations":[{"start":{"line":1125,"column":9},"end":{"line":1125,"column":22}},{"start":{"line":1125,"column":26},"end":{"line":1125,"column":38}}],"line":1125},"135":{"loc":{"start":{"line":1135,"column":2},"end":{"line":1140,"column":3}},"type":"if","locations":[{"start":{"line":1135,"column":2},"end":{"line":1140,"column":3}},{"start":{"line":1135,"column":2},"end":{"line":1140,"column":3}}],"line":1135},"136":{"loc":{"start":{"line":1136,"column":4},"end":{"line":1137,"column":41}},"type":"binary-expr","locations":[{"start":{"line":1136,"column":4},"end":{"line":1136,"column":38}},{"start":{"line":1137,"column":4},"end":{"line":1137,"column":41}}],"line":1136},"137":{"loc":{"start":{"line":1144,"column":12},"end":{"line":1144,"column":43}},"type":"cond-expr","locations":[{"start":{"line":1144,"column":24},"end":{"line":1144,"column":25}},{"start":{"line":1144,"column":28},"end":{"line":1144,"column":43}}],"line":1144},"138":{"loc":{"start":{"line":1150,"column":9},"end":{"line":1150,"column":68}},"type":"binary-expr","locations":[{"start":{"line":1150,"column":9},"end":{"line":1150,"column":17}},{"start":{"line":1150,"column":21},"end":{"line":1150,"column":34}},{"start":{"line":1150,"column":38},"end":{"line":1150,"column":68}}],"line":1150},"139":{"loc":{"start":{"line":1155,"column":4},"end":{"line":1157,"column":49}},"type":"binary-expr","locations":[{"start":{"line":1155,"column":4},"end":{"line":1155,"column":35}},{"start":{"line":1156,"column":4},"end":{"line":1156,"column":27}},{"start":{"line":1157,"column":4},"end":{"line":1157,"column":49}}],"line":1155},"140":{"loc":{"start":{"line":1173,"column":4},"end":{"line":1176,"column":61}},"type":"binary-expr","locations":[{"start":{"line":1173,"column":4},"end":{"line":1173,"column":21}},{"start":{"line":1174,"column":4},"end":{"line":1174,"column":43}},{"start":{"line":1175,"column":4},"end":{"line":1175,"column":50}},{"start":{"line":1176,"column":4},"end":{"line":1176,"column":61}}],"line":1173},"141":{"loc":{"start":{"line":1217,"column":6},"end":{"line":1218,"column":53}},"type":"binary-expr","locations":[{"start":{"line":1217,"column":7},"end":{"line":1217,"column":23}},{"start":{"line":1217,"column":27},"end":{"line":1217,"column":50}},{"start":{"line":1218,"column":7},"end":{"line":1218,"column":24}},{"start":{"line":1218,"column":28},"end":{"line":1218,"column":52}}],"line":1217},"142":{"loc":{"start":{"line":1221,"column":2},"end":{"line":1226,"column":3}},"type":"if","locations":[{"start":{"line":1221,"column":2},"end":{"line":1226,"column":3}},{"start":{"line":1221,"column":2},"end":{"line":1226,"column":3}}],"line":1221}},"s":{"0":70,"1":70,"2":70,"3":70,"4":70,"5":70,"6":70,"7":70,"8":70,"9":70,"10":70,"11":70,"12":70,"13":70,"14":70,"15":15595,"16":70,"17":576,"18":70,"19":9274,"20":70,"21":13028,"22":70,"23":584,"24":70,"25":311,"26":70,"27":0,"28":70,"29":1368,"30":70,"31":7,"32":70,"33":22,"34":70,"35":1,"36":2,"37":70,"38":11,"39":11,"40":6,"41":70,"42":11,"43":70,"44":0,"45":0,"46":70,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":70,"54":81,"55":57,"56":24,"57":371,"58":243,"59":5,"60":5,"61":238,"62":70,"63":242,"64":242,"65":216,"66":333,"67":8,"68":325,"69":242,"70":70,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":101,"87":1364,"88":1097,"89":267,"90":40,"91":69,"92":40,"93":3,"94":227,"95":227,"96":1194,"97":1194,"98":227,"99":1,"100":101,"101":101,"102":70,"103":4,"104":4,"105":3,"106":3,"107":3,"108":3,"109":3,"110":3,"111":3,"112":1,"113":70,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":70,"123":93,"124":93,"125":11,"126":82,"127":70,"128":87,"129":70,"130":3,"131":3,"132":0,"133":0,"134":0,"135":70,"136":70,"137":70,"138":70,"139":70,"140":1080,"141":70,"142":30,"143":70,"144":100,"145":70,"146":6,"147":70,"148":70,"149":70,"150":174,"151":39,"152":135,"153":70,"154":46,"155":46,"156":46,"157":232,"158":232,"159":46,"160":70,"161":0,"162":0,"163":0,"164":0,"165":70,"166":11475,"167":5828,"168":0,"169":5828,"170":5828,"171":11996,"172":11996,"173":3726,"174":5647,"175":5647,"176":0,"177":2102,"178":70,"179":2160,"180":2160,"181":2156,"182":4,"183":70,"184":8694,"185":7740,"186":954,"187":954,"188":455,"189":499,"190":499,"191":380,"192":38,"193":38,"194":44,"195":44,"196":4,"197":4,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":8,"205":0,"206":8,"207":13,"208":3,"209":13,"210":13,"211":1,"212":12,"213":70,"214":70,"215":108,"216":108,"217":0,"218":0,"219":2,"220":2,"221":84,"222":84,"223":3,"224":3,"225":4,"226":4,"227":2,"228":2,"229":0,"230":0,"231":0,"232":0,"233":498,"234":12,"235":12,"236":498,"237":22,"238":22,"239":167,"240":0,"241":498,"242":71,"243":71,"244":71,"245":141,"246":0,"247":0,"248":0,"249":141,"250":70,"251":70,"252":70,"253":0,"254":71,"255":1,"256":498,"257":0,"258":0,"259":0,"260":0,"261":0,"262":0,"263":0,"264":0,"265":498,"266":70,"267":891,"268":891,"269":891,"270":891,"271":4427,"272":4427,"273":7,"274":884,"275":70,"276":1087,"277":1087,"278":1087,"279":8694,"280":8694,"281":8694,"282":8693,"283":4700,"284":4687,"285":13,"286":3993,"287":11,"288":1075,"289":0,"290":370,"291":370,"292":370,"293":67,"294":370,"295":67,"296":79,"297":51,"298":370,"299":70,"300":9,"301":9,"302":9,"303":9,"304":2,"305":9,"306":9,"307":2,"308":2,"309":2,"310":2,"311":9,"312":70,"313":80,"314":80,"315":70,"316":0,"317":0,"318":31,"319":31,"320":5,"321":5,"322":5,"323":5,"324":5,"325":5,"326":0,"327":3,"328":3,"329":2,"330":2,"331":2,"332":2,"333":3,"334":38,"335":38,"336":38,"337":18,"338":18,"339":18,"340":18,"341":18,"342":18,"343":18,"344":18,"345":18,"346":18,"347":8,"348":7,"349":8,"350":14,"351":14,"352":14,"353":14,"354":7,"355":14,"356":219,"357":219,"358":211,"359":267,"360":267,"361":157,"362":1202,"363":616,"364":157,"365":616,"366":616,"367":8,"368":8,"369":184,"370":137,"371":8,"372":137,"373":137,"374":0,"375":219,"376":16,"377":6,"378":10,"379":10,"380":10,"381":0,"382":0,"383":0,"384":10,"385":7,"386":7,"387":131,"388":131,"389":131,"390":245,"391":131,"392":7,"393":0,"394":0,"395":0,"396":4,"397":4,"398":14,"399":14,"400":4,"401":70,"402":0,"403":10,"404":100,"405":10,"406":43,"407":43,"408":43,"409":43,"410":88,"411":43,"412":16,"413":16,"414":16,"415":70,"416":4,"417":4,"418":4,"419":188,"420":188,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":8,"432":0,"433":11,"434":11,"435":0,"436":11,"437":341,"438":341,"439":341,"440":70,"441":0,"442":0,"443":70,"444":0,"445":48,"446":48,"447":36,"448":0,"449":46,"450":47,"451":46,"452":1,"453":46,"454":70},"f":{"0":15595,"1":576,"2":9274,"3":13028,"4":584,"5":311,"6":0,"7":1368,"8":7,"9":22,"10":1,"11":2,"12":11,"13":11,"14":0,"15":0,"16":81,"17":371,"18":243,"19":242,"20":333,"21":0,"22":0,"23":101,"24":1364,"25":1194,"26":4,"27":0,"28":93,"29":87,"30":3,"31":1080,"32":30,"33":100,"34":6,"35":174,"36":46,"37":232,"38":0,"39":0,"40":11475,"41":2160,"42":8694,"43":167,"44":141,"45":0,"46":891,"47":1087,"48":8694,"49":370,"50":79,"51":9,"52":2,"53":80,"54":0,"55":31,"56":5,"57":5,"58":3,"59":2,"60":38,"61":18,"62":8,"63":14,"64":219,"65":267,"66":1202,"67":616,"68":184,"69":137,"70":16,"71":7,"72":131,"73":245,"74":0,"75":0,"76":4,"77":14,"78":0,"79":10,"80":100,"81":43,"82":16,"83":4,"84":188,"85":0,"86":8,"87":0,"88":11,"89":341,"90":0,"91":0,"92":48,"93":36,"94":0,"95":46,"96":47},"b":{"0":[13028,8698],"1":[584,576,576],"2":[6,5],"3":[11,9],"4":[0,0,0],"5":[0,0],"6":[0,0],"7":[57,24],"8":[81,24],"9":[5,238],"10":[14],"11":[14],"12":[69],"13":[216,26],"14":[8,325],"15":[57,268],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[1097,267],"23":[40,227],"24":[3,37],"25":[434,760],"26":[1,226],"27":[227,3],"28":[3,1],"29":[0,3],"30":[0,0],"31":[0,0],"32":[11,82],"33":[3,0],"34":[3,0,0],"35":[0,0],"36":[0,0,0],"37":[93],"38":[6],"39":[39,135],"40":[174,174],"41":[0,0],"42":[5828,5647],"43":[11475,5828],"44":[0,5828],"45":[3726,8270],"46":[11996,8270,8270],"47":[5647,0],"48":[2156,4],"49":[0],"50":[7740,954],"51":[455,499],"52":[455,452],"53":[380,119],"54":[38,44,4,0,0,0,8,13,70,108,0,2,84,3,4,2,0,0],"55":[0,8],"56":[3,10],"57":[13,8,5],"58":[13,0],"59":[1,12],"60":[0,84],"61":[84,0],"62":[0,0],"63":[12,486],"64":[22,476],"65":[22,0],"66":[71,427],"67":[71,0],"68":[0,141],"69":[141,141,141],"70":[70,71],"71":[1,70],"72":[0,498],"73":[0,0],"74":[0,0],"75":[0,0],"76":[0],"77":[891,0],"78":[7,4420],"79":[1019],"80":[1087,0],"81":[1087,1087],"82":[850,7844],"83":[537,8157],"84":[4700,3993],"85":[8693,4063,4057],"86":[4687,13],"87":[11,3982],"88":[67,303],"89":[370,370],"90":[67,303],"91":[51,28],"92":[2,7],"93":[9,9],"94":[9,0],"95":[2,0],"96":[80,73,43,30],"97":[0,0,0],"98":[5,0],"99":[5,0],"100":[5,0],"101":[5,5],"102":[2,1],"103":[3,2,2],"104":[2,0],"105":[0],"106":[7,1],"107":[8,8],"108":[7,1],"109":[8,7],"110":[8,8],"111":[7,1],"112":[8,7],"113":[7,7],"114":[14,14,11],"115":[211,8],"116":[157,110],"117":[616,586],"118":[616,0],"119":[8,0],"120":[137,47],"121":[137,0],"122":[6,10],"123":[16,16],"124":[10,0],"125":[0,0],"126":[14,0],"127":[4,0],"128":[0,0],"129":[0,0],"130":[0,0],"131":[0,0],"132":[0,0],"133":[8,8],"134":[0,0],"135":[0,11],"136":[11,0],"137":[330,11],"138":[0,0,0],"139":[0,0,0],"140":[0,0,0,0],"141":[47,33,46,32],"142":[1,45]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a0c2242f3f6cce612b416cc0281ef159b42495e1"} +,"D:\\WIP\\rudder-transformer\\warehouse\\identity.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\identity.js","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":1,"column":27}},"1":{"start":{"line":2,"column":30},"end":{"line":2,"column":47}},"2":{"start":{"line":4,"column":34},"end":{"line":4,"column":53}},"3":{"start":{"line":5,"column":34},"end":{"line":5,"column":36}},"4":{"start":{"line":6,"column":37},"end":{"line":6,"column":39}},"5":{"start":{"line":11,"column":23},"end":{"line":11,"column":30}},"6":{"start":{"line":12,"column":2},"end":{"line":17,"column":3}},"7":{"start":{"line":16,"column":4},"end":{"line":16,"column":56}},"8":{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},"9":{"start":{"line":20,"column":4},"end":{"line":20,"column":44}},"10":{"start":{"line":23,"column":16},"end":{"line":23,"column":42}},"11":{"start":{"line":24,"column":2},"end":{"line":29,"column":4}},"12":{"start":{"line":30,"column":2},"end":{"line":30,"column":54}},"13":{"start":{"line":36,"column":23},"end":{"line":36,"column":30}},"14":{"start":{"line":37,"column":2},"end":{"line":42,"column":3}},"15":{"start":{"line":41,"column":4},"end":{"line":41,"column":59}},"16":{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},"17":{"start":{"line":45,"column":4},"end":{"line":45,"column":47}},"18":{"start":{"line":47,"column":16},"end":{"line":47,"column":42}},"19":{"start":{"line":48,"column":2},"end":{"line":51,"column":4}},"20":{"start":{"line":52,"column":2},"end":{"line":52,"column":57}},"21":{"start":{"line":57,"column":53},"end":{"line":57,"column":60}},"22":{"start":{"line":58,"column":2},"end":{"line":60,"column":3}},"23":{"start":{"line":59,"column":4},"end":{"line":59,"column":16}},"24":{"start":{"line":62,"column":2},"end":{"line":64,"column":3}},"25":{"start":{"line":63,"column":4},"end":{"line":63,"column":16}},"26":{"start":{"line":65,"column":19},"end":{"line":65,"column":21}},"27":{"start":{"line":66,"column":19},"end":{"line":66,"column":21}},"28":{"start":{"line":67,"column":2},"end":{"line":103,"column":3}},"29":{"start":{"line":68,"column":4},"end":{"line":73,"column":5}},"30":{"start":{"line":72,"column":6},"end":{"line":72,"column":79}},"31":{"start":{"line":75,"column":4},"end":{"line":84,"column":5}},"32":{"start":{"line":81,"column":6},"end":{"line":83,"column":8}},"33":{"start":{"line":86,"column":4},"end":{"line":89,"column":6}},"34":{"start":{"line":90,"column":4},"end":{"line":93,"column":6}},"35":{"start":{"line":94,"column":9},"end":{"line":103,"column":3}},"36":{"start":{"line":95,"column":4},"end":{"line":95,"column":60}},"37":{"start":{"line":96,"column":4},"end":{"line":96,"column":64}},"38":{"start":{"line":97,"column":9},"end":{"line":103,"column":3}},"39":{"start":{"line":99,"column":4},"end":{"line":99,"column":60}},"40":{"start":{"line":101,"column":4},"end":{"line":101,"column":70}},"41":{"start":{"line":102,"column":4},"end":{"line":102,"column":60}},"42":{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},"43":{"start":{"line":106,"column":4},"end":{"line":106,"column":16}},"44":{"start":{"line":109,"column":27},"end":{"line":109,"column":72}},"45":{"start":{"line":112,"column":20},"end":{"line":115,"column":3}},"46":{"start":{"line":116,"column":27},"end":{"line":119,"column":3}},"47":{"start":{"line":122,"column":2},"end":{"line":127,"column":3}},"48":{"start":{"line":123,"column":4},"end":{"line":123,"column":60}},"49":{"start":{"line":124,"column":4},"end":{"line":124,"column":73}},"50":{"start":{"line":125,"column":4},"end":{"line":125,"column":60}},"51":{"start":{"line":126,"column":4},"end":{"line":126,"column":61}},"52":{"start":{"line":129,"column":29},"end":{"line":136,"column":3}},"53":{"start":{"line":137,"column":2},"end":{"line":137,"column":59}},"54":{"start":{"line":140,"column":0},"end":{"line":142,"column":2}}},"fnMap":{"0":{"name":"getMergePropColumns","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":28}},"loc":{"start":{"line":10,"column":47},"end":{"line":31,"column":1}},"line":10},"1":{"name":"getMergeRulesTableName","decl":{"start":{"line":35,"column":9},"end":{"line":35,"column":31}},"loc":{"start":{"line":35,"column":50},"end":{"line":53,"column":1}},"line":35},"2":{"name":"getMergeRuleEvent","decl":{"start":{"line":56,"column":9},"end":{"line":56,"column":26}},"loc":{"start":{"line":56,"column":61},"end":{"line":138,"column":1}},"line":56}},"branchMap":{"0":{"loc":{"start":{"line":12,"column":2},"end":{"line":17,"column":3}},"type":"if","locations":[{"start":{"line":12,"column":2},"end":{"line":17,"column":3}},{"start":{"line":12,"column":2},"end":{"line":17,"column":3}}],"line":12},"1":{"loc":{"start":{"line":13,"column":4},"end":{"line":14,"column":62}},"type":"binary-expr","locations":[{"start":{"line":13,"column":4},"end":{"line":13,"column":52}},{"start":{"line":14,"column":4},"end":{"line":14,"column":62}}],"line":13},"2":{"loc":{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},"type":"if","locations":[{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},{"start":{"line":19,"column":2},"end":{"line":21,"column":3}}],"line":19},"3":{"loc":{"start":{"line":37,"column":2},"end":{"line":42,"column":3}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":42,"column":3}},{"start":{"line":37,"column":2},"end":{"line":42,"column":3}}],"line":37},"4":{"loc":{"start":{"line":38,"column":4},"end":{"line":39,"column":65}},"type":"binary-expr","locations":[{"start":{"line":38,"column":4},"end":{"line":38,"column":55}},{"start":{"line":39,"column":4},"end":{"line":39,"column":65}}],"line":38},"5":{"loc":{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},"type":"if","locations":[{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},{"start":{"line":44,"column":2},"end":{"line":46,"column":3}}],"line":44},"6":{"loc":{"start":{"line":56,"column":27},"end":{"line":56,"column":39}},"type":"default-arg","locations":[{"start":{"line":56,"column":37},"end":{"line":56,"column":39}}],"line":56},"7":{"loc":{"start":{"line":58,"column":2},"end":{"line":60,"column":3}},"type":"if","locations":[{"start":{"line":58,"column":2},"end":{"line":60,"column":3}},{"start":{"line":58,"column":2},"end":{"line":60,"column":3}}],"line":58},"8":{"loc":{"start":{"line":62,"column":2},"end":{"line":64,"column":3}},"type":"if","locations":[{"start":{"line":62,"column":2},"end":{"line":64,"column":3}},{"start":{"line":62,"column":2},"end":{"line":64,"column":3}}],"line":62},"9":{"loc":{"start":{"line":67,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":67,"column":2},"end":{"line":103,"column":3}},{"start":{"line":67,"column":2},"end":{"line":103,"column":3}}],"line":67},"10":{"loc":{"start":{"line":68,"column":4},"end":{"line":73,"column":5}},"type":"if","locations":[{"start":{"line":68,"column":4},"end":{"line":73,"column":5}},{"start":{"line":68,"column":4},"end":{"line":73,"column":5}}],"line":68},"11":{"loc":{"start":{"line":69,"column":6},"end":{"line":70,"column":43}},"type":"binary-expr","locations":[{"start":{"line":69,"column":6},"end":{"line":69,"column":43}},{"start":{"line":70,"column":6},"end":{"line":70,"column":43}}],"line":69},"12":{"loc":{"start":{"line":75,"column":4},"end":{"line":84,"column":5}},"type":"if","locations":[{"start":{"line":75,"column":4},"end":{"line":84,"column":5}},{"start":{"line":75,"column":4},"end":{"line":84,"column":5}}],"line":75},"13":{"loc":{"start":{"line":76,"column":6},"end":{"line":79,"column":61}},"type":"binary-expr","locations":[{"start":{"line":76,"column":6},"end":{"line":76,"column":60}},{"start":{"line":77,"column":6},"end":{"line":77,"column":61}},{"start":{"line":78,"column":6},"end":{"line":78,"column":60}},{"start":{"line":79,"column":6},"end":{"line":79,"column":61}}],"line":76},"14":{"loc":{"start":{"line":94,"column":9},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":94,"column":9},"end":{"line":103,"column":3}},{"start":{"line":94,"column":9},"end":{"line":103,"column":3}}],"line":94},"15":{"loc":{"start":{"line":97,"column":9},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":97,"column":9},"end":{"line":103,"column":3}},{"start":{"line":97,"column":9},"end":{"line":103,"column":3}}],"line":97},"16":{"loc":{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},"type":"if","locations":[{"start":{"line":105,"column":2},"end":{"line":107,"column":3}},{"start":{"line":105,"column":2},"end":{"line":107,"column":3}}],"line":105},"17":{"loc":{"start":{"line":122,"column":2},"end":{"line":127,"column":3}},"type":"if","locations":[{"start":{"line":122,"column":2},"end":{"line":127,"column":3}},{"start":{"line":122,"column":2},"end":{"line":127,"column":3}}],"line":122},"18":{"loc":{"start":{"line":135,"column":18},"end":{"line":135,"column":65}},"type":"binary-expr","locations":[{"start":{"line":135,"column":18},"end":{"line":135,"column":34}},{"start":{"line":135,"column":38},"end":{"line":135,"column":65}}],"line":135}},"s":{"0":10,"1":10,"2":10,"3":10,"4":10,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":952,"22":952,"23":952,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":10},"f":{"0":0,"1":0,"2":952},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0],"7":[952,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0,0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ca36e06e87fb50002fa7092ed226fc49c4940f21"} +,"D:\\WIP\\rudder-transformer\\warehouse\\index.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\index.js","statementMap":{"0":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"1":{"start":{"line":3,"column":10},"end":{"line":3,"column":27}},"2":{"start":{"line":4,"column":23},"end":{"line":4,"column":38}},"3":{"start":{"line":12,"column":4},"end":{"line":12,"column":21}},"4":{"start":{"line":13,"column":30},"end":{"line":13,"column":51}},"5":{"start":{"line":15,"column":36},"end":{"line":15,"column":74}},"6":{"start":{"line":16,"column":34},"end":{"line":16,"column":70}},"7":{"start":{"line":17,"column":40},"end":{"line":17,"column":82}},"8":{"start":{"line":18,"column":44},"end":{"line":18,"column":90}},"9":{"start":{"line":19,"column":33},"end":{"line":19,"column":68}},"10":{"start":{"line":20,"column":33},"end":{"line":20,"column":68}},"11":{"start":{"line":21,"column":35},"end":{"line":21,"column":72}},"12":{"start":{"line":22,"column":34},"end":{"line":22,"column":70}},"13":{"start":{"line":23,"column":34},"end":{"line":23,"column":70}},"14":{"start":{"line":24,"column":31},"end":{"line":24,"column":58}},"15":{"start":{"line":26,"column":26},"end":{"line":29,"column":1}},"16":{"start":{"line":32,"column":2},"end":{"line":32,"column":58}},"17":{"start":{"line":34,"column":20},"end":{"line":54,"column":1}},"18":{"start":{"line":35,"column":15},"end":{"line":35,"column":25}},"19":{"start":{"line":36,"column":2},"end":{"line":43,"column":3}},"20":{"start":{"line":38,"column":6},"end":{"line":38,"column":53}},"21":{"start":{"line":40,"column":6},"end":{"line":40,"column":23}},"22":{"start":{"line":42,"column":6},"end":{"line":42,"column":12}},"23":{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},"24":{"start":{"line":45,"column":4},"end":{"line":45,"column":22}},"25":{"start":{"line":47,"column":2},"end":{"line":52,"column":3}},"26":{"start":{"line":51,"column":4},"end":{"line":51,"column":70}},"27":{"start":{"line":53,"column":2},"end":{"line":53,"column":18}},"28":{"start":{"line":56,"column":28},"end":{"line":63,"column":1}},"29":{"start":{"line":65,"column":29},"end":{"line":65,"column":52}},"30":{"start":{"line":67,"column":29},"end":{"line":79,"column":1}},"31":{"start":{"line":85,"column":2},"end":{"line":91,"column":3}},"32":{"start":{"line":90,"column":4},"end":{"line":90,"column":22}},"33":{"start":{"line":92,"column":2},"end":{"line":92,"column":14}},"34":{"start":{"line":126,"column":2},"end":{"line":126,"column":39}},"35":{"start":{"line":126,"column":32},"end":{"line":126,"column":39}},"36":{"start":{"line":127,"column":2},"end":{"line":155,"column":5}},"37":{"start":{"line":128,"column":21},"end":{"line":128,"column":39}},"38":{"start":{"line":130,"column":4},"end":{"line":134,"column":5}},"39":{"start":{"line":131,"column":6},"end":{"line":131,"column":37}},"40":{"start":{"line":133,"column":6},"end":{"line":133,"column":33}},"41":{"start":{"line":136,"column":23},"end":{"line":136,"column":57}},"42":{"start":{"line":138,"column":4},"end":{"line":146,"column":5}},"43":{"start":{"line":142,"column":6},"end":{"line":142,"column":32}},"44":{"start":{"line":144,"column":6},"end":{"line":144,"column":37}},"45":{"start":{"line":145,"column":6},"end":{"line":145,"column":13}},"46":{"start":{"line":147,"column":21},"end":{"line":147,"column":51}},"47":{"start":{"line":148,"column":4},"end":{"line":150,"column":5}},"48":{"start":{"line":149,"column":6},"end":{"line":149,"column":40}},"49":{"start":{"line":152,"column":4},"end":{"line":152,"column":29}},"50":{"start":{"line":154,"column":4},"end":{"line":154,"column":39}},"51":{"start":{"line":191,"column":2},"end":{"line":191,"column":41}},"52":{"start":{"line":191,"column":34},"end":{"line":191,"column":41}},"53":{"start":{"line":192,"column":2},"end":{"line":241,"column":5}},"54":{"start":{"line":193,"column":4},"end":{"line":240,"column":5}},"55":{"start":{"line":197,"column":6},"end":{"line":206,"column":8}},"56":{"start":{"line":208,"column":16},"end":{"line":208,"column":26}},"57":{"start":{"line":210,"column":6},"end":{"line":212,"column":7}},"58":{"start":{"line":211,"column":8},"end":{"line":211,"column":15}},"59":{"start":{"line":213,"column":6},"end":{"line":219,"column":7}},"60":{"start":{"line":218,"column":8},"end":{"line":218,"column":34}},"61":{"start":{"line":221,"column":23},"end":{"line":221,"column":53}},"62":{"start":{"line":222,"column":6},"end":{"line":224,"column":7}},"63":{"start":{"line":223,"column":8},"end":{"line":223,"column":42}},"64":{"start":{"line":225,"column":20},"end":{"line":225,"column":68}},"65":{"start":{"line":226,"column":6},"end":{"line":239,"column":7}},"66":{"start":{"line":227,"column":8},"end":{"line":227,"column":57}},"67":{"start":{"line":229,"column":8},"end":{"line":234,"column":9}},"68":{"start":{"line":233,"column":10},"end":{"line":233,"column":17}},"69":{"start":{"line":236,"column":8},"end":{"line":236,"column":30}},"70":{"start":{"line":238,"column":8},"end":{"line":238,"column":40}},"71":{"start":{"line":249,"column":18},"end":{"line":249,"column":20}},"72":{"start":{"line":250,"column":17},"end":{"line":250,"column":73}},"73":{"start":{"line":251,"column":2},"end":{"line":251,"column":31}},"74":{"start":{"line":253,"column":2},"end":{"line":256,"column":3}},"75":{"start":{"line":254,"column":21},"end":{"line":254,"column":32}},"76":{"start":{"line":255,"column":4},"end":{"line":255,"column":35}},"77":{"start":{"line":257,"column":2},"end":{"line":259,"column":5}},"78":{"start":{"line":258,"column":4},"end":{"line":258,"column":77}},"79":{"start":{"line":264,"column":2},"end":{"line":272,"column":3}},"80":{"start":{"line":269,"column":4},"end":{"line":271,"column":6}},"81":{"start":{"line":273,"column":2},"end":{"line":273,"column":17}},"82":{"start":{"line":276,"column":38},"end":{"line":288,"column":1}},"83":{"start":{"line":291,"column":2},"end":{"line":297,"column":3}},"84":{"start":{"line":292,"column":20},"end":{"line":292,"column":65}},"85":{"start":{"line":294,"column":4},"end":{"line":294,"column":46}},"86":{"start":{"line":296,"column":4},"end":{"line":296,"column":75}},"87":{"start":{"line":485,"column":2},"end":{"line":487,"column":3}},"88":{"start":{"line":486,"column":4},"end":{"line":486,"column":11}},"89":{"start":{"line":488,"column":2},"end":{"line":490,"column":3}},"90":{"start":{"line":489,"column":4},"end":{"line":489,"column":11}},"91":{"start":{"line":491,"column":18},"end":{"line":491,"column":39}},"92":{"start":{"line":492,"column":2},"end":{"line":492,"column":39}},"93":{"start":{"line":493,"column":2},"end":{"line":493,"column":43}},"94":{"start":{"line":494,"column":2},"end":{"line":494,"column":49}},"95":{"start":{"line":495,"column":2},"end":{"line":495,"column":53}},"96":{"start":{"line":497,"column":2},"end":{"line":497,"column":28}},"97":{"start":{"line":501,"column":16},"end":{"line":501,"column":58}},"98":{"start":{"line":502,"column":2},"end":{"line":502,"column":24}},"99":{"start":{"line":515,"column":2},"end":{"line":518,"column":11}},"100":{"start":{"line":519,"column":20},"end":{"line":519,"column":22}},"101":{"start":{"line":520,"column":20},"end":{"line":520,"column":46}},"102":{"start":{"line":521,"column":26},"end":{"line":521,"column":77}},"103":{"start":{"line":523,"column":4},"end":{"line":523,"column":68}},"104":{"start":{"line":525,"column":2},"end":{"line":528,"column":3}},"105":{"start":{"line":526,"column":21},"end":{"line":526,"column":29}},"106":{"start":{"line":527,"column":4},"end":{"line":527,"column":43}},"107":{"start":{"line":531,"column":2},"end":{"line":531,"column":62}},"108":{"start":{"line":533,"column":2},"end":{"line":538,"column":3}},"109":{"start":{"line":534,"column":4},"end":{"line":537,"column":35}},"110":{"start":{"line":541,"column":2},"end":{"line":1006,"column":3}},"111":{"start":{"line":544,"column":26},"end":{"line":544,"column":28}},"112":{"start":{"line":545,"column":32},"end":{"line":545,"column":34}},"113":{"start":{"line":547,"column":6},"end":{"line":555,"column":8}},"114":{"start":{"line":556,"column":6},"end":{"line":563,"column":8}},"115":{"start":{"line":564,"column":6},"end":{"line":571,"column":8}},"116":{"start":{"line":574,"column":27},"end":{"line":574,"column":65}},"117":{"start":{"line":575,"column":6},"end":{"line":578,"column":8}},"118":{"start":{"line":579,"column":6},"end":{"line":579,"column":49}},"119":{"start":{"line":582,"column":6},"end":{"line":614,"column":7}},"120":{"start":{"line":583,"column":34},"end":{"line":583,"column":36}},"121":{"start":{"line":585,"column":28},"end":{"line":585,"column":46}},"122":{"start":{"line":587,"column":8},"end":{"line":594,"column":10}},"123":{"start":{"line":595,"column":8},"end":{"line":601,"column":10}},"124":{"start":{"line":602,"column":31},"end":{"line":609,"column":9}},"125":{"start":{"line":610,"column":8},"end":{"line":613,"column":11}},"126":{"start":{"line":621,"column":6},"end":{"line":623,"column":7}},"127":{"start":{"line":622,"column":8},"end":{"line":622,"column":14}},"128":{"start":{"line":624,"column":25},"end":{"line":624,"column":27}},"129":{"start":{"line":625,"column":36},"end":{"line":625,"column":38}},"130":{"start":{"line":627,"column":6},"end":{"line":634,"column":8}},"131":{"start":{"line":635,"column":6},"end":{"line":642,"column":8}},"132":{"start":{"line":643,"column":6},"end":{"line":650,"column":8}},"133":{"start":{"line":653,"column":30},"end":{"line":656,"column":7}},"134":{"start":{"line":657,"column":33},"end":{"line":670,"column":7}},"135":{"start":{"line":671,"column":6},"end":{"line":674,"column":9}},"136":{"start":{"line":677,"column":29},"end":{"line":677,"column":75}},"137":{"start":{"line":678,"column":6},"end":{"line":680,"column":7}},"138":{"start":{"line":679,"column":8},"end":{"line":679,"column":39}},"139":{"start":{"line":683,"column":6},"end":{"line":683,"column":12}},"140":{"start":{"line":687,"column":26},"end":{"line":687,"column":28}},"141":{"start":{"line":688,"column":32},"end":{"line":688,"column":34}},"142":{"start":{"line":689,"column":6},"end":{"line":696,"column":8}},"143":{"start":{"line":697,"column":6},"end":{"line":704,"column":8}},"144":{"start":{"line":705,"column":6},"end":{"line":713,"column":8}},"145":{"start":{"line":716,"column":6},"end":{"line":724,"column":8}},"146":{"start":{"line":727,"column":27},"end":{"line":727,"column":67}},"147":{"start":{"line":728,"column":6},"end":{"line":734,"column":7}},"148":{"start":{"line":729,"column":32},"end":{"line":729,"column":50}},"149":{"start":{"line":730,"column":8},"end":{"line":730,"column":65}},"150":{"start":{"line":731,"column":8},"end":{"line":731,"column":41}},"151":{"start":{"line":732,"column":8},"end":{"line":732,"column":77}},"152":{"start":{"line":733,"column":8},"end":{"line":733,"column":47}},"153":{"start":{"line":737,"column":30},"end":{"line":737,"column":48}},"154":{"start":{"line":738,"column":36},"end":{"line":738,"column":38}},"155":{"start":{"line":739,"column":6},"end":{"line":746,"column":8}},"156":{"start":{"line":747,"column":6},"end":{"line":753,"column":8}},"157":{"start":{"line":754,"column":33},"end":{"line":761,"column":7}},"158":{"start":{"line":762,"column":6},"end":{"line":765,"column":9}},"159":{"start":{"line":769,"column":29},"end":{"line":769,"column":75}},"160":{"start":{"line":770,"column":6},"end":{"line":772,"column":7}},"161":{"start":{"line":771,"column":8},"end":{"line":771,"column":39}},"162":{"start":{"line":777,"column":6},"end":{"line":779,"column":7}},"163":{"start":{"line":778,"column":8},"end":{"line":778,"column":14}},"164":{"start":{"line":780,"column":25},"end":{"line":780,"column":43}},"165":{"start":{"line":781,"column":31},"end":{"line":781,"column":33}},"166":{"start":{"line":782,"column":6},"end":{"line":789,"column":8}},"167":{"start":{"line":791,"column":6},"end":{"line":791,"column":71}},"168":{"start":{"line":792,"column":6},"end":{"line":796,"column":8}},"169":{"start":{"line":798,"column":6},"end":{"line":802,"column":35}},"170":{"start":{"line":803,"column":6},"end":{"line":804,"column":19}},"171":{"start":{"line":806,"column":28},"end":{"line":813,"column":7}},"172":{"start":{"line":814,"column":6},"end":{"line":817,"column":9}},"173":{"start":{"line":819,"column":6},"end":{"line":819,"column":12}},"174":{"start":{"line":823,"column":20},"end":{"line":823,"column":22}},"175":{"start":{"line":824,"column":26},"end":{"line":824,"column":28}},"176":{"start":{"line":825,"column":6},"end":{"line":832,"column":8}},"177":{"start":{"line":834,"column":6},"end":{"line":842,"column":8}},"178":{"start":{"line":843,"column":6},"end":{"line":850,"column":8}},"179":{"start":{"line":851,"column":6},"end":{"line":851,"column":68}},"180":{"start":{"line":853,"column":6},"end":{"line":871,"column":7}},"181":{"start":{"line":854,"column":8},"end":{"line":861,"column":10}},"182":{"start":{"line":862,"column":13},"end":{"line":871,"column":7}},"183":{"start":{"line":863,"column":8},"end":{"line":870,"column":10}},"184":{"start":{"line":873,"column":23},"end":{"line":877,"column":7}},"185":{"start":{"line":878,"column":6},"end":{"line":878,"column":48}},"186":{"start":{"line":881,"column":29},"end":{"line":881,"column":75}},"187":{"start":{"line":882,"column":6},"end":{"line":884,"column":7}},"188":{"start":{"line":883,"column":8},"end":{"line":883,"column":39}},"189":{"start":{"line":887,"column":6},"end":{"line":887,"column":12}},"190":{"start":{"line":890,"column":20},"end":{"line":890,"column":22}},"191":{"start":{"line":891,"column":26},"end":{"line":891,"column":28}},"192":{"start":{"line":892,"column":6},"end":{"line":899,"column":8}},"193":{"start":{"line":900,"column":6},"end":{"line":908,"column":8}},"194":{"start":{"line":909,"column":6},"end":{"line":916,"column":8}},"195":{"start":{"line":917,"column":6},"end":{"line":924,"column":8}},"196":{"start":{"line":925,"column":6},"end":{"line":925,"column":68}},"197":{"start":{"line":927,"column":23},"end":{"line":931,"column":7}},"198":{"start":{"line":932,"column":6},"end":{"line":932,"column":48}},"199":{"start":{"line":935,"column":29},"end":{"line":935,"column":75}},"200":{"start":{"line":936,"column":6},"end":{"line":938,"column":7}},"201":{"start":{"line":937,"column":8},"end":{"line":937,"column":39}},"202":{"start":{"line":941,"column":6},"end":{"line":941,"column":12}},"203":{"start":{"line":944,"column":20},"end":{"line":944,"column":22}},"204":{"start":{"line":945,"column":26},"end":{"line":945,"column":28}},"205":{"start":{"line":946,"column":6},"end":{"line":953,"column":8}},"206":{"start":{"line":954,"column":6},"end":{"line":962,"column":8}},"207":{"start":{"line":963,"column":6},"end":{"line":970,"column":8}},"208":{"start":{"line":971,"column":6},"end":{"line":978,"column":8}},"209":{"start":{"line":979,"column":6},"end":{"line":979,"column":68}},"210":{"start":{"line":981,"column":23},"end":{"line":985,"column":7}},"211":{"start":{"line":986,"column":6},"end":{"line":986,"column":48}},"212":{"start":{"line":989,"column":29},"end":{"line":989,"column":75}},"213":{"start":{"line":990,"column":6},"end":{"line":992,"column":7}},"214":{"start":{"line":991,"column":8},"end":{"line":991,"column":39}},"215":{"start":{"line":995,"column":6},"end":{"line":995,"column":12}},"216":{"start":{"line":998,"column":29},"end":{"line":998,"column":75}},"217":{"start":{"line":999,"column":6},"end":{"line":1001,"column":7}},"218":{"start":{"line":1000,"column":8},"end":{"line":1000,"column":39}},"219":{"start":{"line":1002,"column":6},"end":{"line":1002,"column":12}},"220":{"start":{"line":1005,"column":6},"end":{"line":1005,"column":55}},"221":{"start":{"line":1007,"column":2},"end":{"line":1007,"column":19}},"222":{"start":{"line":1010,"column":0},"end":{"line":1014,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":34,"column":20},"end":{"line":34,"column":21}},"loc":{"start":{"line":34,"column":43},"end":{"line":54,"column":1}},"line":34},"1":{"name":"excludeRudderCreatedTableNames","decl":{"start":{"line":81,"column":9},"end":{"line":81,"column":39}},"loc":{"start":{"line":84,"column":2},"end":{"line":93,"column":1}},"line":84},"2":{"name":"setDataFromColumnMappingAndComputeColumnTypes","decl":{"start":{"line":118,"column":9},"end":{"line":118,"column":54}},"loc":{"start":{"line":125,"column":2},"end":{"line":156,"column":1}},"line":125},"3":{"name":"(anonymous_3)","decl":{"start":{"line":127,"column":37},"end":{"line":127,"column":38}},"loc":{"start":{"line":127,"column":44},"end":{"line":155,"column":3}},"line":127},"4":{"name":"setDataFromInputAndComputeColumnTypes","decl":{"start":{"line":181,"column":9},"end":{"line":181,"column":46}},"loc":{"start":{"line":190,"column":2},"end":{"line":242,"column":1}},"line":190},"5":{"name":"(anonymous_5)","decl":{"start":{"line":192,"column":29},"end":{"line":192,"column":30}},"loc":{"start":{"line":192,"column":36},"end":{"line":241,"column":3}},"line":192},"6":{"name":"getColumns","decl":{"start":{"line":248,"column":9},"end":{"line":248,"column":19}},"loc":{"start":{"line":248,"column":49},"end":{"line":274,"column":1}},"line":248},"7":{"name":"(anonymous_7)","decl":{"start":{"line":257,"column":29},"end":{"line":257,"column":30}},"loc":{"start":{"line":257,"column":36},"end":{"line":259,"column":3}},"line":257},"8":{"name":"storeRudderEvent","decl":{"start":{"line":290,"column":9},"end":{"line":290,"column":25}},"loc":{"start":{"line":290,"column":72},"end":{"line":298,"column":1}},"line":290},"9":{"name":"enhanceContextWithSourceDestInfo","decl":{"start":{"line":484,"column":9},"end":{"line":484,"column":41}},"loc":{"start":{"line":484,"column":61},"end":{"line":498,"column":1}},"line":484},"10":{"name":"processWarehouseMessage","decl":{"start":{"line":500,"column":9},"end":{"line":500,"column":32}},"loc":{"start":{"line":500,"column":51},"end":{"line":1008,"column":1}},"line":500}},"branchMap":{"0":{"loc":{"start":{"line":27,"column":2},"end":{"line":27,"column":46}},"type":"binary-expr","locations":[{"start":{"line":27,"column":2},"end":{"line":27,"column":37}},{"start":{"line":27,"column":41},"end":{"line":27,"column":46}}],"line":27},"1":{"loc":{"start":{"line":32,"column":2},"end":{"line":32,"column":58}},"type":"binary-expr","locations":[{"start":{"line":32,"column":2},"end":{"line":32,"column":50}},{"start":{"line":32,"column":54},"end":{"line":32,"column":58}}],"line":32},"2":{"loc":{"start":{"line":36,"column":2},"end":{"line":43,"column":3}},"type":"switch","locations":[{"start":{"line":37,"column":4},"end":{"line":38,"column":53}},{"start":{"line":39,"column":4},"end":{"line":40,"column":23}},{"start":{"line":41,"column":4},"end":{"line":42,"column":12}}],"line":36},"3":{"loc":{"start":{"line":38,"column":13},"end":{"line":38,"column":52}},"type":"cond-expr","locations":[{"start":{"line":38,"column":37},"end":{"line":38,"column":42}},{"start":{"line":38,"column":45},"end":{"line":38,"column":52}}],"line":38},"4":{"loc":{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},"type":"if","locations":[{"start":{"line":44,"column":2},"end":{"line":46,"column":3}},{"start":{"line":44,"column":2},"end":{"line":46,"column":3}}],"line":44},"5":{"loc":{"start":{"line":47,"column":2},"end":{"line":52,"column":3}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":52,"column":3}},{"start":{"line":47,"column":2},"end":{"line":52,"column":3}}],"line":47},"6":{"loc":{"start":{"line":48,"column":4},"end":{"line":49,"column":53}},"type":"binary-expr","locations":[{"start":{"line":48,"column":4},"end":{"line":48,"column":31}},{"start":{"line":49,"column":4},"end":{"line":49,"column":53}}],"line":48},"7":{"loc":{"start":{"line":51,"column":11},"end":{"line":51,"column":69}},"type":"binary-expr","locations":[{"start":{"line":51,"column":11},"end":{"line":51,"column":57}},{"start":{"line":51,"column":61},"end":{"line":51,"column":69}}],"line":51},"8":{"loc":{"start":{"line":83,"column":2},"end":{"line":83,"column":38}},"type":"default-arg","locations":[{"start":{"line":83,"column":33},"end":{"line":83,"column":38}}],"line":83},"9":{"loc":{"start":{"line":85,"column":2},"end":{"line":91,"column":3}},"type":"if","locations":[{"start":{"line":85,"column":2},"end":{"line":91,"column":3}},{"start":{"line":85,"column":2},"end":{"line":91,"column":3}}],"line":85},"10":{"loc":{"start":{"line":86,"column":4},"end":{"line":88,"column":36}},"type":"binary-expr","locations":[{"start":{"line":86,"column":4},"end":{"line":86,"column":53}},{"start":{"line":87,"column":5},"end":{"line":87,"column":53}},{"start":{"line":88,"column":6},"end":{"line":88,"column":35}}],"line":86},"11":{"loc":{"start":{"line":126,"column":2},"end":{"line":126,"column":39}},"type":"if","locations":[{"start":{"line":126,"column":2},"end":{"line":126,"column":39}},{"start":{"line":126,"column":2},"end":{"line":126,"column":39}}],"line":126},"12":{"loc":{"start":{"line":130,"column":4},"end":{"line":134,"column":5}},"type":"if","locations":[{"start":{"line":130,"column":4},"end":{"line":134,"column":5}},{"start":{"line":130,"column":4},"end":{"line":134,"column":5}}],"line":130},"13":{"loc":{"start":{"line":138,"column":4},"end":{"line":146,"column":5}},"type":"if","locations":[{"start":{"line":138,"column":4},"end":{"line":146,"column":5}},{"start":{"line":138,"column":4},"end":{"line":146,"column":5}}],"line":138},"14":{"loc":{"start":{"line":138,"column":8},"end":{"line":138,"column":47}},"type":"binary-expr","locations":[{"start":{"line":138,"column":8},"end":{"line":138,"column":31}},{"start":{"line":138,"column":35},"end":{"line":138,"column":47}}],"line":138},"15":{"loc":{"start":{"line":148,"column":4},"end":{"line":150,"column":5}},"type":"if","locations":[{"start":{"line":148,"column":4},"end":{"line":150,"column":5}},{"start":{"line":148,"column":4},"end":{"line":150,"column":5}}],"line":148},"16":{"loc":{"start":{"line":188,"column":2},"end":{"line":188,"column":13}},"type":"default-arg","locations":[{"start":{"line":188,"column":11},"end":{"line":188,"column":13}}],"line":188},"17":{"loc":{"start":{"line":189,"column":2},"end":{"line":189,"column":11}},"type":"default-arg","locations":[{"start":{"line":189,"column":10},"end":{"line":189,"column":11}}],"line":189},"18":{"loc":{"start":{"line":191,"column":2},"end":{"line":191,"column":41}},"type":"if","locations":[{"start":{"line":191,"column":2},"end":{"line":191,"column":41}},{"start":{"line":191,"column":2},"end":{"line":191,"column":41}}],"line":191},"19":{"loc":{"start":{"line":191,"column":6},"end":{"line":191,"column":32}},"type":"binary-expr","locations":[{"start":{"line":191,"column":6},"end":{"line":191,"column":12}},{"start":{"line":191,"column":16},"end":{"line":191,"column":32}}],"line":191},"20":{"loc":{"start":{"line":193,"column":4},"end":{"line":240,"column":5}},"type":"if","locations":[{"start":{"line":193,"column":4},"end":{"line":240,"column":5}},{"start":{"line":193,"column":4},"end":{"line":240,"column":5}}],"line":193},"21":{"loc":{"start":{"line":194,"column":6},"end":{"line":195,"column":55}},"type":"binary-expr","locations":[{"start":{"line":194,"column":6},"end":{"line":194,"column":26}},{"start":{"line":195,"column":7},"end":{"line":195,"column":41}},{"start":{"line":195,"column":45},"end":{"line":195,"column":54}}],"line":194},"22":{"loc":{"start":{"line":210,"column":6},"end":{"line":212,"column":7}},"type":"if","locations":[{"start":{"line":210,"column":6},"end":{"line":212,"column":7}},{"start":{"line":210,"column":6},"end":{"line":212,"column":7}}],"line":210},"23":{"loc":{"start":{"line":213,"column":6},"end":{"line":219,"column":7}},"type":"if","locations":[{"start":{"line":213,"column":6},"end":{"line":219,"column":7}},{"start":{"line":213,"column":6},"end":{"line":219,"column":7}}],"line":213},"24":{"loc":{"start":{"line":214,"column":8},"end":{"line":216,"column":28}},"type":"binary-expr","locations":[{"start":{"line":214,"column":8},"end":{"line":214,"column":42}},{"start":{"line":215,"column":8},"end":{"line":215,"column":18}},{"start":{"line":216,"column":8},"end":{"line":216,"column":28}}],"line":214},"25":{"loc":{"start":{"line":222,"column":6},"end":{"line":224,"column":7}},"type":"if","locations":[{"start":{"line":222,"column":6},"end":{"line":224,"column":7}},{"start":{"line":222,"column":6},"end":{"line":224,"column":7}}],"line":222},"26":{"loc":{"start":{"line":226,"column":6},"end":{"line":239,"column":7}},"type":"if","locations":[{"start":{"line":226,"column":6},"end":{"line":239,"column":7}},{"start":{"line":226,"column":6},"end":{"line":239,"column":7}}],"line":226},"27":{"loc":{"start":{"line":229,"column":8},"end":{"line":234,"column":9}},"type":"if","locations":[{"start":{"line":229,"column":8},"end":{"line":234,"column":9}},{"start":{"line":229,"column":8},"end":{"line":234,"column":9}}],"line":229},"28":{"loc":{"start":{"line":230,"column":10},"end":{"line":231,"column":64}},"type":"binary-expr","locations":[{"start":{"line":230,"column":10},"end":{"line":230,"column":41}},{"start":{"line":231,"column":10},"end":{"line":231,"column":64}}],"line":230},"29":{"loc":{"start":{"line":250,"column":17},"end":{"line":250,"column":73}},"type":"cond-expr","locations":[{"start":{"line":250,"column":52},"end":{"line":250,"column":61}},{"start":{"line":250,"column":64},"end":{"line":250,"column":73}}],"line":250},"30":{"loc":{"start":{"line":253,"column":2},"end":{"line":256,"column":3}},"type":"if","locations":[{"start":{"line":253,"column":2},"end":{"line":256,"column":3}},{"start":{"line":253,"column":2},"end":{"line":256,"column":3}}],"line":253},"31":{"loc":{"start":{"line":258,"column":19},"end":{"line":258,"column":76}},"type":"binary-expr","locations":[{"start":{"line":258,"column":19},"end":{"line":258,"column":35}},{"start":{"line":258,"column":39},"end":{"line":258,"column":76}}],"line":258},"32":{"loc":{"start":{"line":264,"column":2},"end":{"line":272,"column":3}},"type":"if","locations":[{"start":{"line":264,"column":2},"end":{"line":272,"column":3}},{"start":{"line":264,"column":2},"end":{"line":272,"column":3}}],"line":264},"33":{"loc":{"start":{"line":265,"column":4},"end":{"line":267,"column":41}},"type":"binary-expr","locations":[{"start":{"line":265,"column":4},"end":{"line":265,"column":51}},{"start":{"line":266,"column":4},"end":{"line":266,"column":32}},{"start":{"line":267,"column":4},"end":{"line":267,"column":41}}],"line":265},"34":{"loc":{"start":{"line":291,"column":2},"end":{"line":297,"column":3}},"type":"if","locations":[{"start":{"line":291,"column":2},"end":{"line":297,"column":3}},{"start":{"line":291,"column":2},"end":{"line":297,"column":3}}],"line":291},"35":{"loc":{"start":{"line":485,"column":2},"end":{"line":487,"column":3}},"type":"if","locations":[{"start":{"line":485,"column":2},"end":{"line":487,"column":3}},{"start":{"line":485,"column":2},"end":{"line":487,"column":3}}],"line":485},"36":{"loc":{"start":{"line":488,"column":2},"end":{"line":490,"column":3}},"type":"if","locations":[{"start":{"line":488,"column":2},"end":{"line":490,"column":3}},{"start":{"line":488,"column":2},"end":{"line":490,"column":3}}],"line":488},"37":{"loc":{"start":{"line":491,"column":18},"end":{"line":491,"column":39}},"type":"binary-expr","locations":[{"start":{"line":491,"column":18},"end":{"line":491,"column":33}},{"start":{"line":491,"column":37},"end":{"line":491,"column":39}}],"line":491},"38":{"loc":{"start":{"line":516,"column":4},"end":{"line":518,"column":10}},"type":"cond-expr","locations":[{"start":{"line":517,"column":8},"end":{"line":517,"column":68}},{"start":{"line":518,"column":8},"end":{"line":518,"column":10}}],"line":516},"39":{"loc":{"start":{"line":516,"column":4},"end":{"line":516,"column":80}},"type":"binary-expr","locations":[{"start":{"line":516,"column":4},"end":{"line":516,"column":24}},{"start":{"line":516,"column":28},"end":{"line":516,"column":80}}],"line":516},"40":{"loc":{"start":{"line":521,"column":26},"end":{"line":521,"column":77}},"type":"binary-expr","locations":[{"start":{"line":521,"column":26},"end":{"line":521,"column":68}},{"start":{"line":521,"column":72},"end":{"line":521,"column":77}}],"line":521},"41":{"loc":{"start":{"line":523,"column":4},"end":{"line":523,"column":68}},"type":"binary-expr","locations":[{"start":{"line":523,"column":4},"end":{"line":523,"column":59}},{"start":{"line":523,"column":63},"end":{"line":523,"column":68}}],"line":523},"42":{"loc":{"start":{"line":525,"column":2},"end":{"line":528,"column":3}},"type":"if","locations":[{"start":{"line":525,"column":2},"end":{"line":528,"column":3}},{"start":{"line":525,"column":2},"end":{"line":528,"column":3}}],"line":525},"43":{"loc":{"start":{"line":533,"column":2},"end":{"line":538,"column":3}},"type":"if","locations":[{"start":{"line":533,"column":2},"end":{"line":538,"column":3}},{"start":{"line":533,"column":2},"end":{"line":538,"column":3}}],"line":533},"44":{"loc":{"start":{"line":533,"column":6},"end":{"line":533,"column":72}},"type":"binary-expr","locations":[{"start":{"line":533,"column":6},"end":{"line":533,"column":33}},{"start":{"line":533,"column":37},"end":{"line":533,"column":72}}],"line":533},"45":{"loc":{"start":{"line":535,"column":6},"end":{"line":537,"column":34}},"type":"cond-expr","locations":[{"start":{"line":536,"column":10},"end":{"line":536,"column":37}},{"start":{"line":537,"column":10},"end":{"line":537,"column":34}}],"line":535},"46":{"loc":{"start":{"line":535,"column":6},"end":{"line":535,"column":53}},"type":"binary-expr","locations":[{"start":{"line":535,"column":6},"end":{"line":535,"column":22}},{"start":{"line":535,"column":26},"end":{"line":535,"column":53}}],"line":535},"47":{"loc":{"start":{"line":541,"column":2},"end":{"line":1006,"column":3}},"type":"switch","locations":[{"start":{"line":542,"column":4},"end":{"line":684,"column":5}},{"start":{"line":685,"column":4},"end":{"line":820,"column":5}},{"start":{"line":821,"column":4},"end":{"line":821,"column":16}},{"start":{"line":822,"column":4},"end":{"line":888,"column":5}},{"start":{"line":889,"column":4},"end":{"line":942,"column":5}},{"start":{"line":943,"column":4},"end":{"line":996,"column":5}},{"start":{"line":997,"column":4},"end":{"line":1003,"column":5}},{"start":{"line":1004,"column":4},"end":{"line":1005,"column":55}}],"line":541},"48":{"loc":{"start":{"line":582,"column":6},"end":{"line":614,"column":7}},"type":"if","locations":[{"start":{"line":582,"column":6},"end":{"line":614,"column":7}},{"start":{"line":582,"column":6},"end":{"line":614,"column":7}}],"line":582},"49":{"loc":{"start":{"line":621,"column":6},"end":{"line":623,"column":7}},"type":"if","locations":[{"start":{"line":621,"column":6},"end":{"line":623,"column":7}},{"start":{"line":621,"column":6},"end":{"line":623,"column":7}}],"line":621},"50":{"loc":{"start":{"line":678,"column":6},"end":{"line":680,"column":7}},"type":"if","locations":[{"start":{"line":678,"column":6},"end":{"line":680,"column":7}},{"start":{"line":678,"column":6},"end":{"line":680,"column":7}}],"line":678},"51":{"loc":{"start":{"line":701,"column":8},"end":{"line":701,"column":53}},"type":"cond-expr","locations":[{"start":{"line":701,"column":26},"end":{"line":701,"column":48}},{"start":{"line":701,"column":51},"end":{"line":701,"column":53}}],"line":701},"52":{"loc":{"start":{"line":728,"column":6},"end":{"line":734,"column":7}},"type":"if","locations":[{"start":{"line":728,"column":6},"end":{"line":734,"column":7}},{"start":{"line":728,"column":6},"end":{"line":734,"column":7}}],"line":728},"53":{"loc":{"start":{"line":770,"column":6},"end":{"line":772,"column":7}},"type":"if","locations":[{"start":{"line":770,"column":6},"end":{"line":772,"column":7}},{"start":{"line":770,"column":6},"end":{"line":772,"column":7}}],"line":770},"54":{"loc":{"start":{"line":777,"column":6},"end":{"line":779,"column":7}},"type":"if","locations":[{"start":{"line":777,"column":6},"end":{"line":779,"column":7}},{"start":{"line":777,"column":6},"end":{"line":779,"column":7}}],"line":777},"55":{"loc":{"start":{"line":800,"column":10},"end":{"line":802,"column":34}},"type":"cond-expr","locations":[{"start":{"line":801,"column":10},"end":{"line":801,"column":52}},{"start":{"line":802,"column":10},"end":{"line":802,"column":34}}],"line":800},"56":{"loc":{"start":{"line":853,"column":6},"end":{"line":871,"column":7}},"type":"if","locations":[{"start":{"line":853,"column":6},"end":{"line":871,"column":7}},{"start":{"line":853,"column":6},"end":{"line":871,"column":7}}],"line":853},"57":{"loc":{"start":{"line":862,"column":13},"end":{"line":871,"column":7}},"type":"if","locations":[{"start":{"line":862,"column":13},"end":{"line":871,"column":7}},{"start":{"line":862,"column":13},"end":{"line":871,"column":7}}],"line":862},"58":{"loc":{"start":{"line":882,"column":6},"end":{"line":884,"column":7}},"type":"if","locations":[{"start":{"line":882,"column":6},"end":{"line":884,"column":7}},{"start":{"line":882,"column":6},"end":{"line":884,"column":7}}],"line":882},"59":{"loc":{"start":{"line":936,"column":6},"end":{"line":938,"column":7}},"type":"if","locations":[{"start":{"line":936,"column":6},"end":{"line":938,"column":7}},{"start":{"line":936,"column":6},"end":{"line":938,"column":7}}],"line":936},"60":{"loc":{"start":{"line":990,"column":6},"end":{"line":992,"column":7}},"type":"if","locations":[{"start":{"line":990,"column":6},"end":{"line":992,"column":7}},{"start":{"line":990,"column":6},"end":{"line":992,"column":7}}],"line":990},"61":{"loc":{"start":{"line":999,"column":6},"end":{"line":1001,"column":7}},"type":"if","locations":[{"start":{"line":999,"column":6},"end":{"line":1001,"column":7}},{"start":{"line":999,"column":6},"end":{"line":1001,"column":7}}],"line":999}},"s":{"0":10,"1":10,"2":10,"3":10,"4":10,"5":10,"6":10,"7":10,"8":10,"9":10,"10":10,"11":10,"12":10,"13":10,"14":10,"15":10,"16":10,"17":10,"18":49089,"19":49089,"20":5815,"21":16066,"22":27208,"23":27208,"24":3871,"25":23337,"26":23328,"27":9,"28":10,"29":10,"30":10,"31":287,"32":5,"33":282,"34":2586,"35":0,"36":2586,"37":12784,"38":12784,"39":2019,"40":10765,"41":12776,"42":12776,"43":997,"44":997,"45":997,"46":11779,"47":11779,"48":3868,"49":11779,"50":11779,"51":7328,"52":639,"53":6689,"54":44899,"55":4803,"56":40096,"57":40096,"58":3022,"59":37074,"60":8,"61":37074,"62":37074,"63":0,"64":37074,"65":37074,"66":37074,"67":37074,"68":1699,"69":35375,"70":35375,"71":1412,"72":1412,"73":1412,"74":1412,"75":177,"76":177,"77":1412,"78":59434,"79":1412,"80":7,"81":1405,"82":10,"83":981,"84":48,"85":48,"86":48,"87":991,"88":0,"89":991,"90":943,"91":48,"92":48,"93":48,"94":48,"95":48,"96":48,"97":991,"98":991,"99":991,"100":991,"101":991,"102":991,"103":991,"104":991,"105":6,"106":6,"107":991,"108":991,"109":6,"110":991,"111":319,"112":319,"113":319,"114":319,"115":319,"116":319,"117":319,"118":319,"119":319,"120":317,"121":317,"122":317,"123":309,"124":309,"125":309,"126":311,"127":24,"128":287,"129":287,"130":287,"131":287,"132":287,"133":287,"134":287,"135":280,"136":280,"137":280,"138":0,"139":280,"140":144,"141":144,"142":144,"143":144,"144":144,"145":144,"146":144,"147":144,"148":0,"149":0,"150":0,"151":0,"152":0,"153":144,"154":144,"155":144,"156":144,"157":144,"158":144,"159":144,"160":144,"161":0,"162":144,"163":0,"164":144,"165":144,"166":144,"167":144,"168":144,"169":144,"170":144,"171":144,"172":144,"173":144,"174":280,"175":280,"176":280,"177":280,"178":280,"179":280,"180":280,"181":144,"182":136,"183":136,"184":280,"185":280,"186":280,"187":280,"188":0,"189":280,"190":120,"191":120,"192":120,"193":120,"194":120,"195":120,"196":120,"197":120,"198":120,"199":120,"200":120,"201":0,"202":120,"203":128,"204":128,"205":128,"206":128,"207":128,"208":128,"209":128,"210":128,"211":128,"212":128,"213":128,"214":0,"215":128,"216":0,"217":0,"218":0,"219":0,"220":0,"221":976,"222":10},"f":{"0":49089,"1":287,"2":2586,"3":12784,"4":7328,"5":44899,"6":1412,"7":59434,"8":981,"9":991,"10":991},"b":{"0":[10,9],"1":[10,10],"2":[5815,16066,27208],"3":[5758,57],"4":[3871,23337],"5":[23328,9],"6":[23337,23328],"7":[23328,11646],"8":[0],"9":[5,282],"10":[287,287,7],"11":[0,2586],"12":[2019,10765],"13":[997,11779],"14":[12776,12331],"15":[3868,7911],"16":[1390],"17":[2525],"18":[639,6689],"19":[7328,6737],"20":[4803,40096],"21":[44899,4811,248],"22":[3022,37074],"23":[8,37066],"24":[37074,648,16],"25":[0,37074],"26":[37074,0],"27":[1699,35375],"28":[37074,37074],"29":[176,1236],"30":[177,1235],"31":[59434,0],"32":[7,1405],"33":[1412,22,14],"34":[48,933],"35":[0,991],"36":[943,48],"37":[48,0],"38":[3,988],"39":[991,991],"40":[991,989],"41":[991,989],"42":[6,985],"43":[6,985],"44":[991,985],"45":[0,6],"46":[6,0],"47":[319,144,144,280,120,128,0,0],"48":[317,2],"49":[24,287],"50":[0,280],"51":[144,0],"52":[0,144],"53":[0,144],"54":[0,144],"55":[144,0],"56":[144,136],"57":[136,0],"58":[0,280],"59":[0,120],"60":[0,128],"61":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"5ceaf4d1c14251c6f2082890bba79b1b3a11dd8d"} +,"D:\\WIP\\rudder-transformer\\warehouse\\util.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\util.js","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":1,"column":27}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":4,"column":11},"end":{"line":4,"column":31}},"3":{"start":{"line":5,"column":11},"end":{"line":5,"column":31}},"4":{"start":{"line":7,"column":20},"end":{"line":7,"column":54}},"5":{"start":{"line":8,"column":20},"end":{"line":8,"column":58}},"6":{"start":{"line":10,"column":38},"end":{"line":10,"column":66}},"7":{"start":{"line":12,"column":17},"end":{"line":19,"column":1}},"8":{"start":{"line":13,"column":15},"end":{"line":13,"column":27}},"9":{"start":{"line":14,"column":2},"end":{"line":18,"column":4}},"10":{"start":{"line":21,"column":16},"end":{"line":23,"column":1}},"11":{"start":{"line":22,"column":2},"end":{"line":22,"column":38}},"12":{"start":{"line":28,"column":23},"end":{"line":31,"column":1}},"13":{"start":{"line":34,"column":2},"end":{"line":40,"column":3}},"14":{"start":{"line":36,"column":21},"end":{"line":36,"column":62}},"15":{"start":{"line":37,"column":4},"end":{"line":39,"column":5}},"16":{"start":{"line":38,"column":6},"end":{"line":38,"column":18}},"17":{"start":{"line":41,"column":2},"end":{"line":41,"column":15}},"18":{"start":{"line":45,"column":2},"end":{"line":52,"column":3}},"19":{"start":{"line":47,"column":6},"end":{"line":47,"column":16}},"20":{"start":{"line":49,"column":6},"end":{"line":49,"column":16}},"21":{"start":{"line":51,"column":6},"end":{"line":51,"column":16}},"22":{"start":{"line":56,"column":2},"end":{"line":56,"column":68}},"23":{"start":{"line":59,"column":25},"end":{"line":68,"column":1}},"24":{"start":{"line":60,"column":2},"end":{"line":66,"column":3}},"25":{"start":{"line":61,"column":25},"end":{"line":61,"column":32}},"26":{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},"27":{"start":{"line":63,"column":6},"end":{"line":63,"column":75}},"28":{"start":{"line":65,"column":4},"end":{"line":65,"column":20}},"29":{"start":{"line":67,"column":2},"end":{"line":67,"column":31}},"30":{"start":{"line":70,"column":0},"end":{"line":79,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":12,"column":17},"end":{"line":12,"column":18}},"loc":{"start":{"line":12,"column":26},"end":{"line":19,"column":1}},"line":12},"1":{"name":"(anonymous_1)","decl":{"start":{"line":21,"column":16},"end":{"line":21,"column":17}},"loc":{"start":{"line":21,"column":25},"end":{"line":23,"column":1}},"line":21},"2":{"name":"validTimestamp","decl":{"start":{"line":33,"column":9},"end":{"line":33,"column":23}},"loc":{"start":{"line":33,"column":31},"end":{"line":42,"column":1}},"line":33},"3":{"name":"getVersionedUtils","decl":{"start":{"line":44,"column":9},"end":{"line":44,"column":26}},"loc":{"start":{"line":44,"column":42},"end":{"line":53,"column":1}},"line":44},"4":{"name":"isRudderSourcesEvent","decl":{"start":{"line":55,"column":9},"end":{"line":55,"column":29}},"loc":{"start":{"line":55,"column":37},"end":{"line":57,"column":1}},"line":55},"5":{"name":"(anonymous_5)","decl":{"start":{"line":59,"column":25},"end":{"line":59,"column":26}},"loc":{"start":{"line":59,"column":53},"end":{"line":68,"column":1}},"line":59}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":4},"end":{"line":17,"column":25}},"type":"binary-expr","locations":[{"start":{"line":15,"column":4},"end":{"line":15,"column":17}},{"start":{"line":16,"column":5},"end":{"line":16,"column":22}},{"start":{"line":16,"column":26},"end":{"line":16,"column":45}},{"start":{"line":17,"column":4},"end":{"line":17,"column":25}}],"line":15},"1":{"loc":{"start":{"line":34,"column":2},"end":{"line":40,"column":3}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":40,"column":3}},{"start":{"line":34,"column":2},"end":{"line":40,"column":3}}],"line":34},"2":{"loc":{"start":{"line":37,"column":4},"end":{"line":39,"column":5}},"type":"if","locations":[{"start":{"line":37,"column":4},"end":{"line":39,"column":5}},{"start":{"line":37,"column":4},"end":{"line":39,"column":5}}],"line":37},"3":{"loc":{"start":{"line":37,"column":8},"end":{"line":37,"column":58}},"type":"binary-expr","locations":[{"start":{"line":37,"column":8},"end":{"line":37,"column":31}},{"start":{"line":37,"column":35},"end":{"line":37,"column":58}}],"line":37},"4":{"loc":{"start":{"line":45,"column":2},"end":{"line":52,"column":3}},"type":"switch","locations":[{"start":{"line":46,"column":4},"end":{"line":47,"column":16}},{"start":{"line":48,"column":4},"end":{"line":49,"column":16}},{"start":{"line":50,"column":4},"end":{"line":51,"column":16}}],"line":45},"5":{"loc":{"start":{"line":56,"column":9},"end":{"line":56,"column":67}},"type":"binary-expr","locations":[{"start":{"line":56,"column":9},"end":{"line":56,"column":36}},{"start":{"line":56,"column":40},"end":{"line":56,"column":67}}],"line":56},"6":{"loc":{"start":{"line":60,"column":2},"end":{"line":66,"column":3}},"type":"if","locations":[{"start":{"line":60,"column":2},"end":{"line":66,"column":3}},{"start":{"line":60,"column":2},"end":{"line":66,"column":3}}],"line":60},"7":{"loc":{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},"type":"if","locations":[{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},{"start":{"line":62,"column":4},"end":{"line":64,"column":5}}],"line":62},"8":{"loc":{"start":{"line":62,"column":8},"end":{"line":62,"column":57}},"type":"binary-expr","locations":[{"start":{"line":62,"column":8},"end":{"line":62,"column":36}},{"start":{"line":62,"column":40},"end":{"line":62,"column":57}}],"line":62},"9":{"loc":{"start":{"line":67,"column":9},"end":{"line":67,"column":30}},"type":"binary-expr","locations":[{"start":{"line":67,"column":9},"end":{"line":67,"column":22}},{"start":{"line":67,"column":26},"end":{"line":67,"column":30}}],"line":67}},"s":{"0":10,"1":10,"2":10,"3":10,"4":10,"5":10,"6":10,"7":10,"8":54238,"9":54238,"10":10,"11":54449,"12":10,"13":28193,"14":4856,"15":4856,"16":4856,"17":23337,"18":991,"19":0,"20":991,"21":0,"22":22,"23":10,"24":72,"25":40,"26":40,"27":8,"28":32,"29":32,"30":10},"f":{"0":54238,"1":54449,"2":28193,"3":991,"4":22,"5":72},"b":{"0":[54238,53950,39808,14142],"1":[4856,23337],"2":[4856,0],"3":[4856,4856],"4":[0,991,0],"5":[22,15],"6":[40,32],"7":[8,32],"8":[40,40],"9":[32,16]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"adb30b3a48cfb785294ba27c62f47443e10f9f33"} +,"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHAliasConfig.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHAliasConfig.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":3,"column":1}},"1":{"start":{"line":5,"column":0},"end":{"line":5,"column":23}}},"fnMap":{},"branchMap":{},"s":{"0":10,"1":10},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a69576aa6fd2871ebd72a8176c8386f5f8861bc2"} +,"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHDefaultConfig.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHDefaultConfig.js","statementMap":{"0":{"start":{"line":1,"column":31},"end":{"line":1,"column":51}},"1":{"start":{"line":3,"column":14},"end":{"line":16,"column":1}},"2":{"start":{"line":13,"column":4},"end":{"line":13,"column":61}},"3":{"start":{"line":18,"column":0},"end":{"line":18,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":12,"column":14},"end":{"line":12,"column":15}},"loc":{"start":{"line":13,"column":4},"end":{"line":13,"column":61}},"line":13}},"branchMap":{},"s":{"0":10,"1":10,"2":991,"3":10},"f":{"0":991},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"7364cccab8a2d5471874410d52552a60c850df9a"} +,"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHGroupConfig.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHGroupConfig.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":3,"column":1}},"1":{"start":{"line":5,"column":0},"end":{"line":5,"column":23}}},"fnMap":{},"branchMap":{},"s":{"0":10,"1":10},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"ce41e51ec63a26e26cf6997c6464215c1f7d7d37"} +,"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHPageConfig.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHPageConfig.js","statementMap":{"0":{"start":{"line":1,"column":31},"end":{"line":1,"column":51}},"1":{"start":{"line":3,"column":14},"end":{"line":5,"column":1}},"2":{"start":{"line":4,"column":19},"end":{"line":4,"column":75}},"3":{"start":{"line":7,"column":0},"end":{"line":7,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":8},"end":{"line":4,"column":9}},"loc":{"start":{"line":4,"column":19},"end":{"line":4,"column":75}},"line":4}},"branchMap":{},"s":{"0":10,"1":10,"2":144,"3":10},"f":{"0":144},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3f8a7823ac357be0e7901db34e138d723cd2be7a"} +,"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHScreenConfig.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHScreenConfig.js","statementMap":{"0":{"start":{"line":1,"column":31},"end":{"line":1,"column":51}},"1":{"start":{"line":3,"column":14},"end":{"line":5,"column":1}},"2":{"start":{"line":4,"column":19},"end":{"line":4,"column":75}},"3":{"start":{"line":7,"column":0},"end":{"line":7,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":8},"end":{"line":4,"column":9}},"loc":{"start":{"line":4,"column":19},"end":{"line":4,"column":75}},"line":4}},"branchMap":{},"s":{"0":10,"1":10,"2":136,"3":10},"f":{"0":136},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"e9b3093573e053e6d7a29473d497c159ce41b062"} +,"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHTrackConfig.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHTrackConfig.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":3,"column":1}},"1":{"start":{"line":5,"column":0},"end":{"line":5,"column":23}}},"fnMap":{},"branchMap":{},"s":{"0":10,"1":10},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"201f5f0649315f5b78dbc4200064414ad7604745"} +,"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHTrackEventTableConfig.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHTrackEventTableConfig.js","statementMap":{"0":{"start":{"line":1,"column":60},"end":{"line":1,"column":78}},"1":{"start":{"line":3,"column":14},"end":{"line":10,"column":1}},"2":{"start":{"line":5,"column":4},"end":{"line":8,"column":26}},"3":{"start":{"line":12,"column":0},"end":{"line":12,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":6},"end":{"line":4,"column":7}},"loc":{"start":{"line":4,"column":28},"end":{"line":9,"column":3}},"line":4}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":11},"end":{"line":8,"column":25}},"type":"cond-expr","locations":[{"start":{"line":7,"column":8},"end":{"line":7,"column":52}},{"start":{"line":8,"column":8},"end":{"line":8,"column":25}}],"line":5},"1":{"loc":{"start":{"line":5,"column":11},"end":{"line":6,"column":68}},"type":"binary-expr","locations":[{"start":{"line":5,"column":11},"end":{"line":5,"column":35}},{"start":{"line":6,"column":6},"end":{"line":6,"column":68}}],"line":5}},"s":{"0":10,"1":10,"2":287,"3":10},"f":{"0":287},"b":{"0":[32,255],"1":[287,287]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1823882f2c4c9b72f7daf8143adabc21f0cbeb8d"} +,"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHTracksTableConfig.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHTracksTableConfig.js","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":1,"column":27}},"1":{"start":{"line":2,"column":60},"end":{"line":2,"column":78}},"2":{"start":{"line":4,"column":14},"end":{"line":10,"column":1}},"3":{"start":{"line":6,"column":4},"end":{"line":9,"column":12}},"4":{"start":{"line":12,"column":0},"end":{"line":12,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":13},"end":{"line":5,"column":14}},"loc":{"start":{"line":6,"column":4},"end":{"line":9,"column":12}},"line":6}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":4},"end":{"line":9,"column":12}},"type":"cond-expr","locations":[{"start":{"line":8,"column":8},"end":{"line":8,"column":45}},{"start":{"line":9,"column":8},"end":{"line":9,"column":12}}],"line":6},"1":{"loc":{"start":{"line":6,"column":4},"end":{"line":7,"column":66}},"type":"binary-expr","locations":[{"start":{"line":6,"column":4},"end":{"line":6,"column":28}},{"start":{"line":7,"column":4},"end":{"line":7,"column":66}}],"line":6}},"s":{"0":10,"1":10,"2":10,"3":317,"4":10},"f":{"0":317},"b":{"0":[40,277],"1":[317,317]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"0102d5db619013d36179dce0a2482ab96c883e1c"} +,"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHUserConfig.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\config\\WHUserConfig.js","statementMap":{"0":{"start":{"line":1,"column":31},"end":{"line":1,"column":51}},"1":{"start":{"line":3,"column":14},"end":{"line":8,"column":1}},"2":{"start":{"line":5,"column":4},"end":{"line":5,"column":61}},"3":{"start":{"line":10,"column":0},"end":{"line":10,"column":23}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":14},"end":{"line":4,"column":15}},"loc":{"start":{"line":5,"column":4},"end":{"line":5,"column":61}},"line":5}},"branchMap":{},"s":{"0":10,"1":10,"2":144,"3":10},"f":{"0":144},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"956494efcd0bc97f98e3959b9c48e1898af8e143"} +,"D:\\WIP\\rudder-transformer\\warehouse\\config\\helpers.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\config\\helpers.js","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":1,"column":27}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":32}},"2":{"start":{"line":4,"column":15},"end":{"line":6,"column":1}},"3":{"start":{"line":5,"column":2},"end":{"line":5,"column":39}},"4":{"start":{"line":8,"column":16},"end":{"line":10,"column":1}},"5":{"start":{"line":9,"column":2},"end":{"line":9,"column":38}},"6":{"start":{"line":12,"column":27},"end":{"line":22,"column":1}},"7":{"start":{"line":13,"column":16},"end":{"line":13,"column":20}},"8":{"start":{"line":14,"column":2},"end":{"line":19,"column":3}},"9":{"start":{"line":14,"column":19},"end":{"line":14,"column":20}},"10":{"start":{"line":15,"column":4},"end":{"line":15,"column":41}},"11":{"start":{"line":16,"column":4},"end":{"line":18,"column":5}},"12":{"start":{"line":17,"column":6},"end":{"line":17,"column":12}},"13":{"start":{"line":21,"column":2},"end":{"line":21,"column":17}},"14":{"start":{"line":25,"column":2},"end":{"line":29,"column":4}},"15":{"start":{"line":32,"column":0},"end":{"line":36,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":15},"end":{"line":4,"column":16}},"loc":{"start":{"line":4,"column":20},"end":{"line":6,"column":1}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":16},"end":{"line":8,"column":17}},"loc":{"start":{"line":8,"column":25},"end":{"line":10,"column":1}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":12,"column":27},"end":{"line":12,"column":28}},"loc":{"start":{"line":12,"column":47},"end":{"line":22,"column":1}},"line":12},"3":{"name":"isDataLakeProvider","decl":{"start":{"line":24,"column":9},"end":{"line":24,"column":27}},"loc":{"start":{"line":24,"column":38},"end":{"line":30,"column":1}},"line":24}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":9},"end":{"line":5,"column":38}},"type":"binary-expr","locations":[{"start":{"line":5,"column":9},"end":{"line":5,"column":19}},{"start":{"line":5,"column":23},"end":{"line":5,"column":38}}],"line":5},"1":{"loc":{"start":{"line":16,"column":4},"end":{"line":18,"column":5}},"type":"if","locations":[{"start":{"line":16,"column":4},"end":{"line":18,"column":5}},{"start":{"line":16,"column":4},"end":{"line":18,"column":5}}],"line":16},"2":{"loc":{"start":{"line":26,"column":4},"end":{"line":28,"column":33}},"type":"binary-expr","locations":[{"start":{"line":26,"column":4},"end":{"line":26,"column":30}},{"start":{"line":27,"column":4},"end":{"line":27,"column":31}},{"start":{"line":28,"column":4},"end":{"line":28,"column":33}}],"line":26}},"s":{"0":10,"1":10,"2":10,"3":0,"4":10,"5":1599,"6":10,"7":1415,"8":1415,"9":1415,"10":1599,"11":1599,"12":1351,"13":1415,"14":52826,"15":10},"f":{"0":0,"1":1599,"2":1415,"3":52826},"b":{"0":[0,0],"1":[1351,248],"2":[52826,45021,45021]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"347ad6c9308f4a27ed2a7676b5957f9d6d3d7a76"} +,"D:\\WIP\\rudder-transformer\\warehouse\\v1\\util.js": {"path":"D:\\WIP\\rudder-transformer\\warehouse\\v1\\util.js","statementMap":{"0":{"start":{"line":1,"column":10},"end":{"line":1,"column":27}},"1":{"start":{"line":3,"column":32},"end":{"line":3,"column":74}},"2":{"start":{"line":4,"column":31},"end":{"line":4,"column":59}},"3":{"start":{"line":7,"column":23},"end":{"line":7,"column":30}},"4":{"start":{"line":9,"column":4},"end":{"line":9,"column":68}},"5":{"start":{"line":10,"column":18},"end":{"line":10,"column":22}},"6":{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},"7":{"start":{"line":12,"column":4},"end":{"line":12,"column":51}},"8":{"start":{"line":14,"column":2},"end":{"line":21,"column":3}},"9":{"start":{"line":15,"column":4},"end":{"line":15,"column":40}},"10":{"start":{"line":16,"column":9},"end":{"line":21,"column":3}},"11":{"start":{"line":17,"column":4},"end":{"line":17,"column":40}},"12":{"start":{"line":18,"column":4},"end":{"line":18,"column":40}},"13":{"start":{"line":20,"column":4},"end":{"line":20,"column":40}},"14":{"start":{"line":22,"column":2},"end":{"line":27,"column":3}},"15":{"start":{"line":26,"column":4},"end":{"line":26,"column":32}},"16":{"start":{"line":28,"column":2},"end":{"line":31,"column":3}},"17":{"start":{"line":30,"column":4},"end":{"line":30,"column":21}},"18":{"start":{"line":33,"column":2},"end":{"line":33,"column":34}},"19":{"start":{"line":37,"column":23},"end":{"line":37,"column":30}},"20":{"start":{"line":39,"column":4},"end":{"line":39,"column":68}},"21":{"start":{"line":40,"column":19},"end":{"line":40,"column":23}},"22":{"start":{"line":41,"column":2},"end":{"line":43,"column":3}},"23":{"start":{"line":42,"column":4},"end":{"line":42,"column":52}},"24":{"start":{"line":44,"column":2},"end":{"line":51,"column":3}},"25":{"start":{"line":45,"column":4},"end":{"line":45,"column":42}},"26":{"start":{"line":46,"column":9},"end":{"line":51,"column":3}},"27":{"start":{"line":47,"column":4},"end":{"line":47,"column":42}},"28":{"start":{"line":48,"column":4},"end":{"line":48,"column":42}},"29":{"start":{"line":50,"column":4},"end":{"line":50,"column":42}},"30":{"start":{"line":52,"column":2},"end":{"line":57,"column":3}},"31":{"start":{"line":56,"column":4},"end":{"line":56,"column":34}},"32":{"start":{"line":58,"column":2},"end":{"line":61,"column":3}},"33":{"start":{"line":60,"column":4},"end":{"line":60,"column":22}},"34":{"start":{"line":62,"column":2},"end":{"line":62,"column":35}},"35":{"start":{"line":85,"column":26},"end":{"line":85,"column":28}},"36":{"start":{"line":86,"column":23},"end":{"line":86,"column":25}},"37":{"start":{"line":87,"column":2},"end":{"line":102,"column":3}},"38":{"start":{"line":87,"column":15},"end":{"line":87,"column":16}},"39":{"start":{"line":88,"column":14},"end":{"line":88,"column":21}},"40":{"start":{"line":89,"column":23},"end":{"line":89,"column":38}},"41":{"start":{"line":90,"column":4},"end":{"line":101,"column":5}},"42":{"start":{"line":95,"column":6},"end":{"line":95,"column":26}},"43":{"start":{"line":97,"column":6},"end":{"line":99,"column":7}},"44":{"start":{"line":98,"column":8},"end":{"line":98,"column":45}},"45":{"start":{"line":100,"column":6},"end":{"line":100,"column":26}},"46":{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},"47":{"start":{"line":104,"column":4},"end":{"line":104,"column":41}},"48":{"start":{"line":106,"column":12},"end":{"line":106,"column":37}},"49":{"start":{"line":107,"column":2},"end":{"line":114,"column":3}},"50":{"start":{"line":111,"column":4},"end":{"line":111,"column":69}},"51":{"start":{"line":113,"column":4},"end":{"line":113,"column":27}},"52":{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},"53":{"start":{"line":117,"column":4},"end":{"line":117,"column":20}},"54":{"start":{"line":119,"column":2},"end":{"line":121,"column":3}},"55":{"start":{"line":120,"column":4},"end":{"line":120,"column":28}},"56":{"start":{"line":122,"column":2},"end":{"line":122,"column":13}},"57":{"start":{"line":134,"column":12},"end":{"line":134,"column":49}},"58":{"start":{"line":136,"column":13},"end":{"line":136,"column":27}},"59":{"start":{"line":137,"column":2},"end":{"line":139,"column":3}},"60":{"start":{"line":138,"column":4},"end":{"line":138,"column":20}},"61":{"start":{"line":140,"column":2},"end":{"line":142,"column":3}},"62":{"start":{"line":141,"column":4},"end":{"line":141,"column":28}},"63":{"start":{"line":143,"column":2},"end":{"line":143,"column":27}},"64":{"start":{"line":147,"column":2},"end":{"line":147,"column":35}},"65":{"start":{"line":151,"column":26},"end":{"line":151,"column":77}},"66":{"start":{"line":152,"column":2},"end":{"line":152,"column":72}},"67":{"start":{"line":156,"column":23},"end":{"line":156,"column":30}},"68":{"start":{"line":157,"column":26},"end":{"line":157,"column":77}},"69":{"start":{"line":158,"column":2},"end":{"line":160,"column":36}},"70":{"start":{"line":163,"column":0},"end":{"line":168,"column":2}}},"fnMap":{"0":{"name":"safeTableName","decl":{"start":{"line":6,"column":9},"end":{"line":6,"column":22}},"loc":{"start":{"line":6,"column":43},"end":{"line":34,"column":1}},"line":6},"1":{"name":"safeColumnName","decl":{"start":{"line":36,"column":9},"end":{"line":36,"column":23}},"loc":{"start":{"line":36,"column":44},"end":{"line":63,"column":1}},"line":36},"2":{"name":"transformName","decl":{"start":{"line":84,"column":9},"end":{"line":84,"column":22}},"loc":{"start":{"line":84,"column":44},"end":{"line":123,"column":1}},"line":84},"3":{"name":"transformNameToBlendoCase","decl":{"start":{"line":133,"column":9},"end":{"line":133,"column":34}},"loc":{"start":{"line":133,"column":56},"end":{"line":144,"column":1}},"line":133},"4":{"name":"toBlendoCase","decl":{"start":{"line":146,"column":9},"end":{"line":146,"column":21}},"loc":{"start":{"line":146,"column":33},"end":{"line":148,"column":1}},"line":146},"5":{"name":"transformTableName","decl":{"start":{"line":150,"column":9},"end":{"line":150,"column":27}},"loc":{"start":{"line":150,"column":48},"end":{"line":153,"column":1}},"line":150},"6":{"name":"transformColumnName","decl":{"start":{"line":155,"column":9},"end":{"line":155,"column":28}},"loc":{"start":{"line":155,"column":49},"end":{"line":161,"column":1}},"line":155}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":32},"end":{"line":6,"column":41}},"type":"default-arg","locations":[{"start":{"line":6,"column":39},"end":{"line":6,"column":41}}],"line":6},"1":{"loc":{"start":{"line":9,"column":4},"end":{"line":9,"column":68}},"type":"binary-expr","locations":[{"start":{"line":9,"column":4},"end":{"line":9,"column":59}},{"start":{"line":9,"column":63},"end":{"line":9,"column":68}}],"line":9},"2":{"loc":{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},{"start":{"line":11,"column":2},"end":{"line":13,"column":3}}],"line":11},"3":{"loc":{"start":{"line":14,"column":2},"end":{"line":21,"column":3}},"type":"if","locations":[{"start":{"line":14,"column":2},"end":{"line":21,"column":3}},{"start":{"line":14,"column":2},"end":{"line":21,"column":3}}],"line":14},"4":{"loc":{"start":{"line":16,"column":9},"end":{"line":21,"column":3}},"type":"if","locations":[{"start":{"line":16,"column":9},"end":{"line":21,"column":3}},{"start":{"line":16,"column":9},"end":{"line":21,"column":3}}],"line":16},"5":{"loc":{"start":{"line":22,"column":2},"end":{"line":27,"column":3}},"type":"if","locations":[{"start":{"line":22,"column":2},"end":{"line":27,"column":3}},{"start":{"line":22,"column":2},"end":{"line":27,"column":3}}],"line":22},"6":{"loc":{"start":{"line":23,"column":4},"end":{"line":24,"column":76}},"type":"binary-expr","locations":[{"start":{"line":23,"column":4},"end":{"line":23,"column":33}},{"start":{"line":24,"column":4},"end":{"line":24,"column":76}}],"line":23},"7":{"loc":{"start":{"line":28,"column":2},"end":{"line":31,"column":3}},"type":"if","locations":[{"start":{"line":28,"column":2},"end":{"line":31,"column":3}},{"start":{"line":28,"column":2},"end":{"line":31,"column":3}}],"line":28},"8":{"loc":{"start":{"line":36,"column":33},"end":{"line":36,"column":42}},"type":"default-arg","locations":[{"start":{"line":36,"column":40},"end":{"line":36,"column":42}}],"line":36},"9":{"loc":{"start":{"line":39,"column":4},"end":{"line":39,"column":68}},"type":"binary-expr","locations":[{"start":{"line":39,"column":4},"end":{"line":39,"column":59}},{"start":{"line":39,"column":63},"end":{"line":39,"column":68}}],"line":39},"10":{"loc":{"start":{"line":41,"column":2},"end":{"line":43,"column":3}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":43,"column":3}},{"start":{"line":41,"column":2},"end":{"line":43,"column":3}}],"line":41},"11":{"loc":{"start":{"line":44,"column":2},"end":{"line":51,"column":3}},"type":"if","locations":[{"start":{"line":44,"column":2},"end":{"line":51,"column":3}},{"start":{"line":44,"column":2},"end":{"line":51,"column":3}}],"line":44},"12":{"loc":{"start":{"line":46,"column":9},"end":{"line":51,"column":3}},"type":"if","locations":[{"start":{"line":46,"column":9},"end":{"line":51,"column":3}},{"start":{"line":46,"column":9},"end":{"line":51,"column":3}}],"line":46},"13":{"loc":{"start":{"line":52,"column":2},"end":{"line":57,"column":3}},"type":"if","locations":[{"start":{"line":52,"column":2},"end":{"line":57,"column":3}},{"start":{"line":52,"column":2},"end":{"line":57,"column":3}}],"line":52},"14":{"loc":{"start":{"line":53,"column":4},"end":{"line":54,"column":77}},"type":"binary-expr","locations":[{"start":{"line":53,"column":4},"end":{"line":53,"column":33}},{"start":{"line":54,"column":4},"end":{"line":54,"column":77}}],"line":53},"15":{"loc":{"start":{"line":58,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":58,"column":2},"end":{"line":61,"column":3}},{"start":{"line":58,"column":2},"end":{"line":61,"column":3}}],"line":58},"16":{"loc":{"start":{"line":84,"column":33},"end":{"line":84,"column":42}},"type":"default-arg","locations":[{"start":{"line":84,"column":40},"end":{"line":84,"column":42}}],"line":84},"17":{"loc":{"start":{"line":90,"column":4},"end":{"line":101,"column":5}},"type":"if","locations":[{"start":{"line":90,"column":4},"end":{"line":101,"column":5}},{"start":{"line":90,"column":4},"end":{"line":101,"column":5}}],"line":90},"18":{"loc":{"start":{"line":91,"column":6},"end":{"line":93,"column":44}},"type":"binary-expr","locations":[{"start":{"line":91,"column":7},"end":{"line":91,"column":23}},{"start":{"line":91,"column":27},"end":{"line":91,"column":43}},{"start":{"line":92,"column":7},"end":{"line":92,"column":23}},{"start":{"line":92,"column":27},"end":{"line":92,"column":44}},{"start":{"line":93,"column":7},"end":{"line":93,"column":23}},{"start":{"line":93,"column":27},"end":{"line":93,"column":43}}],"line":91},"19":{"loc":{"start":{"line":97,"column":6},"end":{"line":99,"column":7}},"type":"if","locations":[{"start":{"line":97,"column":6},"end":{"line":99,"column":7}},{"start":{"line":97,"column":6},"end":{"line":99,"column":7}}],"line":97},"20":{"loc":{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":105,"column":3}},{"start":{"line":103,"column":2},"end":{"line":105,"column":3}}],"line":103},"21":{"loc":{"start":{"line":107,"column":2},"end":{"line":114,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":114,"column":3}},{"start":{"line":107,"column":2},"end":{"line":114,"column":3}}],"line":107},"22":{"loc":{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":118,"column":3}},{"start":{"line":116,"column":2},"end":{"line":118,"column":3}}],"line":116},"23":{"loc":{"start":{"line":116,"column":6},"end":{"line":116,"column":70}},"type":"binary-expr","locations":[{"start":{"line":116,"column":6},"end":{"line":116,"column":16}},{"start":{"line":116,"column":20},"end":{"line":116,"column":43}},{"start":{"line":116,"column":47},"end":{"line":116,"column":70}}],"line":116},"24":{"loc":{"start":{"line":119,"column":2},"end":{"line":121,"column":3}},"type":"if","locations":[{"start":{"line":119,"column":2},"end":{"line":121,"column":3}},{"start":{"line":119,"column":2},"end":{"line":121,"column":3}}],"line":119},"25":{"loc":{"start":{"line":133,"column":45},"end":{"line":133,"column":54}},"type":"default-arg","locations":[{"start":{"line":133,"column":52},"end":{"line":133,"column":54}}],"line":133},"26":{"loc":{"start":{"line":137,"column":2},"end":{"line":139,"column":3}},"type":"if","locations":[{"start":{"line":137,"column":2},"end":{"line":139,"column":3}},{"start":{"line":137,"column":2},"end":{"line":139,"column":3}}],"line":137},"27":{"loc":{"start":{"line":140,"column":2},"end":{"line":142,"column":3}},"type":"if","locations":[{"start":{"line":140,"column":2},"end":{"line":142,"column":3}},{"start":{"line":140,"column":2},"end":{"line":142,"column":3}}],"line":140},"28":{"loc":{"start":{"line":146,"column":22},"end":{"line":146,"column":31}},"type":"default-arg","locations":[{"start":{"line":146,"column":29},"end":{"line":146,"column":31}}],"line":146},"29":{"loc":{"start":{"line":150,"column":37},"end":{"line":150,"column":46}},"type":"default-arg","locations":[{"start":{"line":150,"column":44},"end":{"line":150,"column":46}}],"line":150},"30":{"loc":{"start":{"line":151,"column":26},"end":{"line":151,"column":77}},"type":"binary-expr","locations":[{"start":{"line":151,"column":26},"end":{"line":151,"column":68}},{"start":{"line":151,"column":72},"end":{"line":151,"column":77}}],"line":151},"31":{"loc":{"start":{"line":152,"column":9},"end":{"line":152,"column":71}},"type":"cond-expr","locations":[{"start":{"line":152,"column":27},"end":{"line":152,"column":45}},{"start":{"line":152,"column":48},"end":{"line":152,"column":71}}],"line":152},"32":{"loc":{"start":{"line":155,"column":38},"end":{"line":155,"column":47}},"type":"default-arg","locations":[{"start":{"line":155,"column":45},"end":{"line":155,"column":47}}],"line":155},"33":{"loc":{"start":{"line":157,"column":26},"end":{"line":157,"column":77}},"type":"binary-expr","locations":[{"start":{"line":157,"column":26},"end":{"line":157,"column":68}},{"start":{"line":157,"column":72},"end":{"line":157,"column":77}}],"line":157},"34":{"loc":{"start":{"line":158,"column":9},"end":{"line":160,"column":35}},"type":"cond-expr","locations":[{"start":{"line":159,"column":6},"end":{"line":159,"column":47}},{"start":{"line":160,"column":6},"end":{"line":160,"column":35}}],"line":158}},"s":{"0":10,"1":10,"2":10,"3":1412,"4":1412,"5":1412,"6":1412,"7":0,"8":1412,"9":176,"10":1236,"11":177,"12":177,"13":1059,"14":1412,"15":16,"16":1412,"17":175,"18":1237,"19":51400,"20":51400,"21":51400,"22":51400,"23":0,"24":51400,"25":5798,"26":45602,"27":5637,"28":5637,"29":39965,"30":51400,"31":9200,"32":51400,"33":7623,"34":43777,"35":37638,"36":37638,"37":37638,"38":37638,"39":424941,"40":424941,"41":424941,"42":396381,"43":28560,"44":26387,"45":28560,"46":37638,"47":37182,"48":37638,"49":37638,"50":55,"51":37583,"52":37638,"53":349,"54":37638,"55":3880,"56":37638,"57":40,"58":40,"59":40,"60":2,"61":40,"62":0,"63":40,"64":2,"65":319,"66":319,"67":37361,"68":37361,"69":37361,"70":10},"f":{"0":1412,"1":51400,"2":37638,"3":40,"4":2,"5":319,"6":37361},"b":{"0":[0],"1":[1412,1409],"2":[0,1412],"3":[176,1236],"4":[177,1059],"5":[16,1396],"6":[1412,1409],"7":[175,1237],"8":[0],"9":[51400,51331],"10":[0,51400],"11":[5798,45602],"12":[5637,39965],"13":[9200,42200],"14":[51400,51331],"15":[7623,43777],"16":[0],"17":[396381,28560],"18":[424941,406409,316270,270594,45900,44708],"19":[26387,2173],"20":[37182,456],"21":[55,37583],"22":[349,37289],"23":[37638,37614,37614],"24":[3880,33758],"25":[0],"26":[2,38],"27":[0,40],"28":[0],"29":[24],"30":[319,317],"31":[2,317],"32":[0],"33":[37361,37321],"34":[40,37321]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"557ffd0525b1797bc03bed488db169c981f67ec8"} +} diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 00000000000..f418035b469 --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 00000000000..c7ff5a5cac8 --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,79 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png new file mode 100644 index 00000000000..6691817834a Binary files /dev/null and b/coverage/lcov-report/favicon.png differ diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 00000000000..ad5694e7537 --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,1476 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 85.98% + Statements + 9187/10685 +
+ + +
+ 69.6% + Branches + 4656/6690 +
+ + +
+ 90.2% + Functions + 985/1092 +
+ + +
+ 86% + Lines + 9137/10624 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
rudder-transformer +
+
47.24%60/12725%15/6052.94%9/1747.24%60/127
rudder-transformer/adapters +
+
34.72%25/7233.33%4/1225%2/834.72%25/72
rudder-transformer/adapters/utils +
+
34.21%13/388.82%3/3425%1/434.21%13/38
rudder-transformer/cdk/heap +
+
100%7/775%3/4100%1/1100%7/7
rudder-transformer/constants +
+
100%10/10100%0/0100%0/0100%10/10
rudder-transformer/util +
+
61.9%13/2128.57%6/2120%1/561.9%13/21
rudder-transformer/v0/destinations/active_campaign +
+
79.25%210/26548.36%59/12287.5%28/3279.69%208/261
rudder-transformer/v0/destinations/adj +
+
92.54%62/6778.57%33/42100%6/692.54%62/67
rudder-transformer/v0/destinations/airship +
+
94.86%166/17583.72%72/86100%8/895.38%165/173
rudder-transformer/v0/destinations/algolia +
+
83.33%140/16872%90/125100%12/1283.33%140/168
rudder-transformer/v0/destinations/am +
+
93.56%407/43585.61%238/27895.45%42/4493.56%407/435
rudder-transformer/v0/destinations/appcues +
+
92%46/5061.9%13/21100%7/792%46/50
rudder-transformer/v0/destinations/azure_event_hub +
+
100%3/350%1/2100%1/1100%3/3
rudder-transformer/v0/destinations/azure_synapse +
+
100%8/875%3/4100%3/3100%8/8
rudder-transformer/v0/destinations/blueshift +
+
92.16%94/10272.09%31/43100%8/892.16%94/102
rudder-transformer/v0/destinations/bq +
+
100%9/983.33%5/6100%3/3100%9/9
rudder-transformer/v0/destinations/bqstream +
+
90%18/2085.71%12/14100%2/290%18/20
rudder-transformer/v0/destinations/branch +
+
83.72%108/12979.1%53/6786.67%13/1584.25%107/127
rudder-transformer/v0/destinations/branch/data +
+
100%6/6100%0/0100%0/0100%6/6
rudder-transformer/v0/destinations/braze +
+
89.34%243/27274.53%120/161100%26/2689.34%243/272
rudder-transformer/v0/destinations/candu +
+
91.84%45/4961.9%13/21100%5/591.84%45/49
rudder-transformer/v0/destinations/clevertap +
+
93.28%111/11980%64/80100%12/1293.28%111/119
rudder-transformer/v0/destinations/clickhouse +
+
93.55%29/3187.5%21/24100%3/393.33%28/30
rudder-transformer/v0/destinations/confluent_cloud +
+
100%3/350%1/2100%1/1100%3/3
rudder-transformer/v0/destinations/customerio +
+
87.5%133/15269.7%69/99100%11/1187.5%133/152
rudder-transformer/v0/destinations/delighted +
+
82.32%149/18163.56%75/118100%12/1282.32%149/181
rudder-transformer/v0/destinations/drip +
+
84.29%161/19165.42%70/10791.67%11/1284.29%161/191
rudder-transformer/v0/destinations/eventbridge +
+
62.96%17/2742.31%11/2660%3/562.96%17/27
rudder-transformer/v0/destinations/facebook_pixel +
+
93.95%264/28174.71%195/261100%18/1893.86%260/277
rudder-transformer/v0/destinations/fb +
+
87.36%159/18270.9%95/134100%13/1387.29%158/181
rudder-transformer/v0/destinations/fb_custom_audience +
+
84.75%150/17767.35%66/9888.89%16/1885.23%150/176
rudder-transformer/v0/destinations/firehose +
+
52.38%11/2131.58%6/1950%2/452.38%11/21
rudder-transformer/v0/destinations/ga +
+
90%396/44076.85%259/33794.29%33/3589.95%394/438
rudder-transformer/v0/destinations/ga360 +
+
90.58%375/41475.26%219/29193.75%30/3290.53%373/412
rudder-transformer/v0/destinations/ga4 +
+
94.87%259/27392%115/12588.24%15/1794.87%259/273
rudder-transformer/v0/destinations/gainsight +
+
82.61%152/18457.14%52/91100%23/2382.42%150/182
rudder-transformer/v0/destinations/gainsight_px +
+
86.31%145/16865.82%52/7992.86%13/1486.31%145/168
rudder-transformer/v0/destinations/google_adwords_enhanced_conversions +
+
95.35%82/8678.05%32/41100%11/1195.24%80/84
rudder-transformer/v0/destinations/google_adwords_remarketing_lists +
+
95.76%113/11872.73%40/55100%16/1695.76%113/118
rudder-transformer/v0/destinations/googlepubsub +
+
83.82%57/6866.67%36/5481.82%9/1183.82%57/68
rudder-transformer/v0/destinations/googlesheets +
+
77.78%35/4553.57%15/2871.43%5/777.78%35/45
rudder-transformer/v0/destinations/hs +
+
92.66%164/17776.47%52/6896%24/2592.61%163/176
rudder-transformer/v0/destinations/indicative +
+
95.05%96/10182.14%46/56100%12/1295.05%96/101
rudder-transformer/v0/destinations/intercom +
+
92.63%88/9582.61%57/69100%11/1192.63%88/95
rudder-transformer/v0/destinations/iterable +
+
92%230/25076.67%115/150100%14/1492%230/250
rudder-transformer/v0/destinations/kafka +
+
100%11/1150%1/2100%3/3100%11/11
rudder-transformer/v0/destinations/keen +
+
89.86%62/6960.78%31/51100%7/789.86%62/69
rudder-transformer/v0/destinations/kinesis +
+
100%3/350%1/2100%1/1100%3/3
rudder-transformer/v0/destinations/kissmetrics +
+
68.42%143/20942.61%49/11584.21%16/1968.45%141/206
rudder-transformer/v0/destinations/klaviyo +
+
87.27%144/16566.67%52/78100%10/1087.27%144/165
rudder-transformer/v0/destinations/kustomer +
+
67.04%120/17956.45%70/12444.44%8/1867.42%120/178
rudder-transformer/v0/destinations/leanplum +
+
89.06%57/6457.58%19/33100%7/789.06%57/64
rudder-transformer/v0/destinations/mailchimp +
+
90.84%119/13170.49%43/61100%20/2090.84%119/131
rudder-transformer/v0/destinations/marketo +
+
75.44%172/22860.48%75/12466.67%18/2775.44%172/228
rudder-transformer/v0/destinations/moengage +
+
91.55%65/7170.59%24/34100%5/591.55%65/71
rudder-transformer/v0/destinations/monetate +
+
93.25%152/16381.33%122/150100%21/2193.21%151/162
rudder-transformer/v0/destinations/mp +
+
96.64%144/14988.29%98/111100%15/1596.64%144/149
rudder-transformer/v0/destinations/mssql +
+
100%8/875%3/4100%3/3100%8/8
rudder-transformer/v0/destinations/ometria +
+
85.65%185/21662.16%92/148100%15/1585.65%185/216
rudder-transformer/v0/destinations/pardot +
+
88.89%72/8170.73%29/41100%9/988.89%72/81
rudder-transformer/v0/destinations/personalize +
+
88.24%105/11980.58%83/10381.82%9/1188.24%105/119
rudder-transformer/v0/destinations/postgres +
+
100%11/1183.33%5/6100%3/3100%11/11
rudder-transformer/v0/destinations/posthog +
+
89.71%61/6873.33%33/45100%6/689.71%61/68
rudder-transformer/v0/destinations/profitwell +
+
80.45%107/13367.24%78/116100%8/880.45%107/133
rudder-transformer/v0/destinations/redis +
+
93.55%29/3186.96%20/23100%3/393.55%29/31
rudder-transformer/v0/destinations/rs +
+
80%12/1550%7/14100%3/380%12/15
rudder-transformer/v0/destinations/s3 +
+
100%2/2100%0/0100%1/1100%2/2
rudder-transformer/v0/destinations/s3_datalake +
+
100%8/875%3/4100%3/3100%8/8
rudder-transformer/v0/destinations/salesforce +
+
71.43%85/11953.25%41/7778.57%11/1471.43%85/119
rudder-transformer/v0/destinations/segment +
+
95.12%39/4180%8/10100%6/695.12%39/41
rudder-transformer/v0/destinations/sendgrid +
+
79.62%211/26565.24%152/23391.67%22/2479.62%211/265
rudder-transformer/v0/destinations/sfmc +
+
92.08%93/10185.48%53/62100%9/992.08%93/101
rudder-transformer/v0/destinations/slack +
+
87.02%114/13152.59%71/13581.25%13/1687.02%114/131
rudder-transformer/v0/destinations/snapchat_conversion +
+
88.58%194/21968.07%81/119100%16/1688.53%193/218
rudder-transformer/v0/destinations/snowflake +
+
100%12/1287.5%7/8100%3/3100%12/12
rudder-transformer/v0/destinations/tiktok_ads +
+
92.86%117/12668.97%40/58100%9/992.86%117/126
rudder-transformer/v0/destinations/trengo +
+
87.7%107/12274.47%70/94100%10/1087.7%107/122
rudder-transformer/v0/destinations/webhook +
+
87.93%51/5865.22%30/46100%5/587.93%51/58
rudder-transformer/v0/destinations/zendesk +
+
86.97%207/23864.66%86/133100%24/2486.92%206/237
rudder-transformer/v0/sources +
+
100%31/3193.75%15/16100%12/12100%31/31
rudder-transformer/v0/sources/appcenter +
+
21.43%6/280%0/200%0/421.43%6/28
rudder-transformer/v0/sources/appsflyer +
+
100%42/4276.67%23/30100%3/3100%42/42
rudder-transformer/v0/sources/auth0 +
+
93.18%41/4472.73%16/22100%7/792.5%37/40
rudder-transformer/v0/sources/braze +
+
92.5%37/4063.64%14/22100%4/492.5%37/40
rudder-transformer/v0/sources/customerio +
+
90%27/3038.46%5/13100%1/190%27/30
rudder-transformer/v0/sources/iterable +
+
100%22/2290%9/10100%1/1100%22/22
rudder-transformer/v0/sources/segment +
+
100%2/2100%0/0100%1/1100%2/2
rudder-transformer/v0/sources/shopify +
+
94.29%132/14073.77%45/61100%15/1594.29%132/140
rudder-transformer/v0/util +
+
80.04%397/49666.56%213/32081.65%89/10979.75%378/474
rudder-transformer/warehouse +
+
78.32%242/30967.01%130/19490%18/2078.5%241/307
rudder-transformer/warehouse/config +
+
97.87%46/4786.67%13/1590%9/1097.83%45/46
rudder-transformer/warehouse/v1 +
+
95.77%68/7186.76%59/68100%7/795.71%67/70
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 00000000000..b317a7cda31 --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 00000000000..b3225238f26 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/rudder-transformer/adapters/index.html b/coverage/lcov-report/rudder-transformer/adapters/index.html new file mode 100644 index 00000000000..4eb35d7c4c3 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/adapters/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/adapters + + + + + + + + + +
+
+

All files rudder-transformer/adapters

+
+ +
+ 34.72% + Statements + 25/72 +
+ + +
+ 33.33% + Branches + 4/12 +
+ + +
+ 25% + Functions + 2/8 +
+ + +
+ 34.72% + Lines + 25/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
network.js +
+
34.72%25/7233.33%4/1225%2/834.72%25/72
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/adapters/network.js.html b/coverage/lcov-report/rudder-transformer/adapters/network.js.html new file mode 100644 index 00000000000..a90c0eafb9b --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/adapters/network.js.html @@ -0,0 +1,770 @@ + + + + + + Code coverage report for rudder-transformer/adapters/network.js + + + + + + + + + +
+
+

All files / rudder-transformer/adapters network.js

+
+ +
+ 34.72% + Statements + 25/72 +
+ + +
+ 33.33% + Branches + 4/12 +
+ + +
+ 25% + Functions + 2/8 +
+ + +
+ 34.72% + Lines + 25/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231  +  +  +7x +7x +7x +7x +7x +  +  +7x +7x +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +27x +27x +22x +  +5x +  +27x +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +26x +26x +26x +  +  +  +26x +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +  + 
/* eslint-disable no-restricted-syntax */
+/* eslint-disable no-undef */
+ 
+const _ = require("lodash");
+const http = require("http");
+const https = require("https");
+const axios = require("axios");
+const log = require("../logger");
+ 
+const MAX_CONTENT_LENGTH =
+  parseInt(process.env.MAX_CONTENT_LENGTH, 10) || 100000000;
+const MAX_BODY_LENGTH = parseInt(process.env.MAX_BODY_LENGTH, 10) || 100000000;
+// (httpsAgent, httpsAgent) ,these are deployment specific configs not request specific
+const networkClientConfigs = {
+  // `method` is the request method to be used when making the request
+  method: "get",
+ 
+  // `timeout` specifies the number of milliseconds before the request times out. If the request takes longer than `timeout`, the request will be aborted.
+  timeout: 1000 * 60,
+ 
+  // `withCredentials` indicates whether or not cross-site Access-Control requests should be made using credentials
+  withCredentials: false,
+ 
+  // `responseType` indicates the type of data that the server will respond with options are: 'arraybuffer', 'document', 'json', 'text', 'stream'
+  responseType: "json",
+ 
+  // `responseEncoding` indicates encoding to use for decoding responses (Node.js only),
+  responseEncoding: "utf8",
+ 
+  // `maxBodyLength` (Node only option) defines the max size of the http request content in bytes allowed,
+  maxBodyLength: 1000 * 1000 * 10,
+ 
+  // `maxRedirects` defines the maximum number of redirects to follow in node.js,
+  maxRedirects: 5,
+ 
+  // `httpAgent` and `httpsAgent` define a custom agent to be used when performing http
+  httpAgent: new http.Agent({ keepAlive: true }),
+ 
+  // and https requests, respectively, in node.js. This allows options to be added like `keepAlive` that are not enabled by default.
+  httpsAgent: new https.Agent({ keepAlive: true })
+};
+ 
+/**
+ * sends an http request with underlying client, expects request options
+ * @param {*} options
+ * @returns
+ */
+const httpSend = async options => {
+  let clientResponse;
+  // here the options argument K-Vs will take priority over requestOptions
+  const requestOptions = {
+    ...networkClientConfigs,
+    ...options,
+    maxContentLength: MAX_CONTENT_LENGTH,
+    maxBodyLength: MAX_BODY_LENGTH
+  };
+  try {
+    const response = await axios(requestOptions);
+    clientResponse = { success: true, response };
+  } catch (err) {
+    clientResponse = { success: false, response: err };
+  }
+  return clientResponse;
+};
+ 
+/**
+ *
+ * @param {*} url
+ * @param {*} options
+ * @returns
+ *
+ * handles http GET requests returns promise as a response throws error in case of non 2XX statuses
+ */
+const httpGET = async (url, options) => {
+  let clientResponse;
+  try {
+    const response = await axios.get(url, options);
+    clientResponse = { success: true, response };
+  } catch (err) {
+    clientResponse = { success: false, response: err };
+  }
+  return clientResponse;
+};
+ 
+/**
+ *
+ * @param {*} url
+ * @param {*} options
+ * @returns
+ *
+ * handles http DELETE requests returns promise as a response throws error in case of non 2XX statuses
+ */
+const httpDELETE = async (url, options) => {
+  let clientResponse;
+  try {
+    const response = await axios.delete(url, options);
+    clientResponse = { success: true, response };
+  } catch (err) {
+    clientResponse = { success: false, response: err };
+  }
+  return clientResponse;
+};
+ 
+/**
+ *
+ * @param {*} url
+ * @param {*} data
+ * @param {*} options
+ * @returns
+ *
+ * handles http POST requests returns promise as a response throws error in case of non 2XX statuses
+ */
+const httpPOST = async (url, data, options) => {
+  let clientResponse;
+  try {
+    const response = await axios.post(url, data, options);
+    clientResponse = { success: true, response };
+  } catch (err) {
+    clientResponse = { success: false, response: err };
+  }
+  return clientResponse;
+};
+ 
+/**
+ *
+ * @param {*} url
+ * @param {*} data
+ * @param {*} options
+ * @returns
+ *
+ * handles http PUT requests returns promise as a response throws error in case of non 2XX statuses
+ */
+const httpPUT = async (url, data, options) => {
+  let clientResponse;
+  try {
+    const response = await axios.put(url, data, options);
+    clientResponse = { success: true, response };
+  } catch (err) {
+    clientResponse = { success: false, response: err };
+  }
+  return clientResponse;
+};
+ 
+/**
+ *
+ * @param {*} url
+ * @param {*} data
+ * @param {*} options
+ * @returns
+ *
+ * handles http PATCH requests returns promise as a response throws error in case of non 2XX statuses
+ */
+const httpPATCH = async (url, data, options) => {
+  let clientResponse;
+  try {
+    const response = await axios.patch(url, data, options);
+    clientResponse = { success: true, response };
+  } catch (err) {
+    clientResponse = { success: false, response: err };
+  }
+  return clientResponse;
+};
+ 
+/**
+ * depricating: handles proxying requests to destinations from server, expects requsts in "defaultRequestConfig"
+ * note: needed for test api
+ * @param {*} request
+ * @returns
+ */
+const proxyRequest = async request => {
+  const { body, method, params, endpoint } = request;
+  let { headers } = request;
+  let data;
+  let payload;
+  let payloadFormat;
+  for (const [key, value] of Object.entries(body)) {
+    if (!_.isEmpty(value)) {
+      payload = value;
+      payloadFormat = key;
+    }
+  }
+ 
+  switch (payloadFormat) {
+    case "JSON_ARRAY":
+      data = payload.batch;
+      // TODO: add headers
+      break;
+    case "JSON":
+      data = payload;
+      headers = { ...headers, "Content-Type": "application/json" };
+      break;
+    case "XML":
+      data = `${payload}`;
+      headers = { ...headers, "Content-Type": "application/xml" };
+      break;
+    case "FORM":
+      data = new URLSearchParams();
+      Object.keys(payload).forEach(key => {
+        data.append(`${key}`, `${payload[key]}`);
+      });
+      headers = {
+        ...headers,
+        "Content-Type": "application/x-www-form-urlencoded"
+      };
+      break;
+    case "MULTIPART-FORM":
+      // TODO:
+      break;
+    default:
+      log.debug(`body format ${payloadFormat} not supported`);
+  }
+  const requestOptions = {
+    url: endpoint,
+    data,
+    params,
+    headers,
+    method
+  };
+  const response = await httpSend(requestOptions);
+  return response;
+};
+module.exports = {
+  httpSend,
+  httpGET,
+  httpDELETE,
+  httpPOST,
+  httpPUT,
+  httpPATCH,
+  proxyRequest
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/adapters/utils/index.html b/coverage/lcov-report/rudder-transformer/adapters/utils/index.html new file mode 100644 index 00000000000..ad23a2b30f4 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/adapters/utils/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/adapters/utils + + + + + + + + + +
+
+

All files rudder-transformer/adapters/utils

+
+ +
+ 34.21% + Statements + 13/38 +
+ + +
+ 8.82% + Branches + 3/34 +
+ + +
+ 25% + Functions + 1/4 +
+ + +
+ 34.21% + Lines + 13/38 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
networkUtils.js +
+
34.21%13/388.82%3/3425%1/434.21%13/38
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/adapters/utils/networkUtils.js.html b/coverage/lcov-report/rudder-transformer/adapters/utils/networkUtils.js.html new file mode 100644 index 00000000000..a6869a5f5b5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/adapters/utils/networkUtils.js.html @@ -0,0 +1,611 @@ + + + + + + Code coverage report for rudder-transformer/adapters/utils/networkUtils.js + + + + + + + + + +
+
+

All files / rudder-transformer/adapters/utils networkUtils.js

+
+ +
+ 34.21% + Statements + 13/38 +
+ + +
+ 8.82% + Branches + 3/34 +
+ + +
+ 25% + Functions + 1/4 +
+ + +
+ 34.21% + Lines + 13/38 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178  +6x +6x +  +  +  +  +  +6x +6x +6x +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +8x +  +  +  +  +  +6x +  +  +  +  +  + 
/* eslint-disable eqeqeq */
+const _ = require("lodash");
+const { isEmpty } = require("lodash");
+const {
+  isHttpStatusRetryable,
+  isDefinedAndNotNullAndNotEmpty,
+  isNonFuncObject,
+  isDefinedAndNotNull
+} = require("../../v0/util");
+const { TRANSFORMER_METRIC } = require("../../v0/util/constant");
+const ErrorBuilder = require("../../v0/util/error");
+ 
+const nodeSysErrorToStatus = code => {
+  const sysErrorToStatusMap = {
+    EACCES: {
+      status: 400,
+      message: "[EACCES] :: Permission denied"
+    },
+    EADDRINUSE: {
+      status: 400,
+      message: "[EADDRINUSE] :: Address already in use"
+    },
+    ECONNREFUSED: {
+      status: 500,
+      message: "[ECONNREFUSED] :: Connection refused"
+    },
+    ECONNRESET: {
+      status: 500,
+      message: "[ECONNRESET] :: Connection reset by peer"
+    },
+    EEXIST: {
+      status: 400,
+      message: "[EEXIST] :: File exists"
+    },
+    EISDIR: {
+      status: 400,
+      message: "[EEXIST] :: Is a directory"
+    },
+    EMFILE: {
+      status: 400,
+      message: "[EMFILE] :: Too many open files in system"
+    },
+    ENOENT: {
+      status: 400,
+      message: "[ENOENT] :: No such file or directory"
+    },
+    ENOTDIR: {
+      status: 400,
+      message: "[ENOTDIR] :: Not a directory"
+    },
+    ENOTEMPTY: {
+      status: 400,
+      message: "[ENOTEMPTY] :: Directory not empty)"
+    },
+    ENOTFOUND: {
+      status: 400,
+      message: "[ENOTFOUND] :: DNS lookup failed"
+    },
+    EPERM: {
+      status: 400,
+      message: "[EPERM] :: Operation not permitted"
+    },
+    EPIPE: {
+      status: 400,
+      message: "[EPIPE] :: Broken pipe"
+    },
+    ETIMEDOUT: {
+      status: 500,
+      message: "[ETIMEDOUT] :: Operation timed out"
+    }
+  };
+  return sysErrorToStatusMap[code] || { status: 400, message: `[${code}]` };
+};
+ 
+// Returns dynamic Meta based on Status Code as Input
+const getDynamicMeta = statusCode => {
+  if (isHttpStatusRetryable(statusCode)) {
+    return TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.META.RETRYABLE;
+  }
+  switch (statusCode) {
+    case 429:
+      return TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.META.THROTTLED;
+    default:
+      return TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.META.ABORTABLE;
+  }
+};
+ 
+const parseDestResponse = (destResponse, destination) => {
+  const statTags = {
+    destination,
+    stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.RESPONSE_TRANSFORM,
+    scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.EXCEPTION.SCOPE
+  };
+  // validity of destResponse
+  if (
+    !isDefinedAndNotNullAndNotEmpty(destResponse) ||
+    !isNonFuncObject(destResponse)
+  ) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage(
+        `[ResponseTransform]: Destination Response Invalid, for destination: ${destination}`
+      )
+      .setDestinationResponse(destResponse)
+      .setStatTags(statTags)
+      .build();
+  }
+  const { responseBody, status } = destResponse;
+  // validity of responseBody and status
+  if (
+    !isDefinedAndNotNull(responseBody) ||
+    !isDefinedAndNotNull(status) ||
+    !_.isNumber(status) ||
+    status === 0
+  ) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage(
+        `[ResponseTransform]: Destination Response Body and(or) Status Inavlid, for destination: ${destination}`
+      )
+      .setDestinationResponse(destResponse)
+      .setStatTags(statTags)
+      .build();
+  }
+  let parsedDestResponseBody;
+  try {
+    parsedDestResponseBody = JSON.parse(responseBody);
+  } catch (err) {
+    parsedDestResponseBody = !isEmpty(responseBody) ? responseBody : "";
+  }
+  return {
+    responseBody: parsedDestResponseBody,
+    status,
+    payload: destResponse.payload
+  };
+};
+ 
+// Function to process wrapped axioss response from internal http client compatible for response handlers
+const processAxiosResponse = clientResponse => {
+  Iif (!clientResponse.success) {
+    const { response, code } = clientResponse.response;
+    // node internal http client failure cases
+    if (!response && code) {
+      const nodeClientError = nodeSysErrorToStatus(code);
+      return {
+        response: nodeClientError.message,
+        status: nodeClientError.status
+      };
+    }
+    // non 2xx status handling for axios response
+    if (response) {
+      const { data, status } = response;
+      return {
+        response: data || "",
+        status: status || 500
+      };
+    }
+    // (edge case) response and code is not present
+    return {
+      response: "",
+      status: 500
+    };
+  }
+  // success(2xx) axios response
+  const { data, status } = clientResponse.response;
+  return {
+    response: data || "",
+    status: status || 500
+  };
+};
+ 
+module.exports = {
+  nodeSysErrorToStatus,
+  getDynamicMeta,
+  parseDestResponse,
+  processAxiosResponse
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/cdk/heap/index.html b/coverage/lcov-report/rudder-transformer/cdk/heap/index.html new file mode 100644 index 00000000000..df83900d406 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/cdk/heap/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/cdk/heap + + + + + + + + + +
+
+

All files rudder-transformer/cdk/heap

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%7/775%3/4100%1/1100%7/7
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/cdk/heap/transform.js.html b/coverage/lcov-report/rudder-transformer/cdk/heap/transform.js.html new file mode 100644 index 00000000000..b7266d6116c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/cdk/heap/transform.js.html @@ -0,0 +1,125 @@ + + + + + + Code coverage report for rudder-transformer/cdk/heap/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/cdk/heap transform.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16  +2x +2x +2x +2x +  +2x +  +  +  +  +2x +  +  +1x + 
function commonPostMapper(event, mappedPayload, rudderContext) {
+  const { destination } = event;
+  const payload = mappedPayload;
+  Eif (payload.properties && payload.properties.idempotencyKey) {
+    delete payload.properties.idempotencyKey;
+  }
+  const responseBody = {
+    ...payload,
+    app_id: destination.Config.appId
+  };
+ 
+  return responseBody; // this flows onto the next stage in the yaml
+}
+ 
+module.exports = { commonPostMapper };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/constants/destinationCanonicalNames.js.html b/coverage/lcov-report/rudder-transformer/constants/destinationCanonicalNames.js.html new file mode 100644 index 00000000000..3bc4413b742 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/constants/destinationCanonicalNames.js.html @@ -0,0 +1,179 @@ + + + + + + Code coverage report for rudder-transformer/constants/destinationCanonicalNames.js + + + + + + + + + +
+
+

All files / rudder-transformer/constants destinationCanonicalNames.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +3470x +  +  +  +70x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +70x + 
const DestHandlerMap = {
+  ga360: "ga"
+};
+ 
+const DestCanonicalNames = {
+  fb_pixel: [
+    "fb_pixel",
+    "fb pixel",
+    "FacebookPixel",
+    "Facebook Pixel",
+    "FB Pixel"
+  ],
+  ometria: ["Ometria", "ometria", "OMETRIA"],
+  sendgrid: ["sendgrid", "Sendgrid", "SENDGRID"],
+  dcm_floodlight: [
+    "dcm floodlight",
+    "dcm_floodlight",
+    "DCM Floodlight",
+    "DCM_Floodlight",
+    "DCMFloodlight",
+    "dcmfloodlight"
+  ],
+  new_relic: [
+    "new relic",
+    "new_relic",
+    "New Relic",
+    "New_Relic",
+    "NewRelic",
+    "newrelic"
+  ]
+};
+ 
+module.exports = { DestHandlerMap, DestCanonicalNames };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/constants/index.html b/coverage/lcov-report/rudder-transformer/constants/index.html new file mode 100644 index 00000000000..a42780fb79f --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/constants/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/constants + + + + + + + + + +
+
+

All files rudder-transformer/constants

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
destinationCanonicalNames.js +
+
100%3/3100%0/0100%0/0100%3/3
index.js +
+
100%7/7100%0/0100%0/0100%7/7
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/constants/index.js.html b/coverage/lcov-report/rudder-transformer/constants/index.js.html new file mode 100644 index 00000000000..b070bf42300 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/constants/index.js.html @@ -0,0 +1,251 @@ + + + + + + Code coverage report for rudder-transformer/constants/index.js + + + + + + + + + +
+
+

All files / rudder-transformer/constants index.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +5856x +  +  +  +  +  +  +  +  +  +  +56x +  +  +  +  +  +  +  +56x +  +  +  +56x +  +56x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +56x +  +56x +  +  +  +  +  +  + 
const EventType = {
+  PAGE: "page",
+  SCREEN: "screen",
+  TRACK: "track",
+  IDENTIFY: "identify",
+  ALIAS: "alias",
+  GROUP: "group",
+  RESET: "reset",
+  IDENTIFY_AM: "$identify"
+};
+ 
+const Address = {
+  city: "address.city",
+  country: "address.country",
+  postalCode: "address.postalCode",
+  state: "address.state",
+  street: "address.street"
+};
+ 
+const TraitsMapping = {
+  address: Address
+};
+ 
+const SpecedTraits = ["address"];
+ 
+const WhiteListedTraits = [
+  "email",
+  "firstName",
+  "firstname",
+  "first_name",
+  "lastName",
+  "lastname",
+  "last_name",
+  "phone",
+  "title",
+  "organization",
+  "city",
+  "region",
+  "country",
+  "zip",
+  "image",
+  "timezone",
+  "id",
+  "anonymousId",
+  "userId",
+  "properties"
+];
+ 
+const MappedToDestinationKey = "context.mappedToDestination";
+ 
+module.exports = {
+  EventType,
+  SpecedTraits,
+  TraitsMapping,
+  WhiteListedTraits,
+  MappedToDestinationKey
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/index.html b/coverage/lcov-report/rudder-transformer/index.html new file mode 100644 index 00000000000..3646c57c77d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer + + + + + + + + + +
+
+

All files rudder-transformer

+
+ +
+ 47.24% + Statements + 60/127 +
+ + +
+ 25% + Branches + 15/60 +
+ + +
+ 52.94% + Functions + 9/17 +
+ + +
+ 47.24% + Lines + 60/127 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
routerUtils.js +
+
28%7/250%0/140%0/328%7/25
testRouter.js +
+
51.96%53/10232.61%15/4664.29%9/1451.96%53/102
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/routerUtils.js.html b/coverage/lcov-report/rudder-transformer/routerUtils.js.html new file mode 100644 index 00000000000..25f06b1852e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/routerUtils.js.html @@ -0,0 +1,263 @@ + + + + + + Code coverage report for rudder-transformer/routerUtils.js + + + + + + + + + +
+
+

All files / rudder-transformer routerUtils.js

+
+ +
+ 28% + Statements + 7/25 +
+ + +
+ 0% + Branches + 0/14 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 28% + Lines + 7/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62  +  +1x +1x +1x +  +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  + 
/* eslint-disable global-require */
+/* eslint-disable import/no-dynamic-require */
+const logger = require("./logger");
+const { proxyRequest } = require("./adapters/network");
+const { nodeSysErrorToStatus } = require("./adapters/utils/networkUtils");
+ 
+let areFunctionsEnabled = -1;
+const functionsEnabled = () => {
+  if (areFunctionsEnabled === -1) {
+    areFunctionsEnabled = process.env.ENABLE_FUNCTIONS === "false" ? 0 : 1;
+  }
+  return areFunctionsEnabled === 1;
+};
+ 
+const userTransformHandler = () => {
+  if (functionsEnabled()) {
+    return require("./util/customTransformer").userTransformHandler;
+  }
+  throw new Error("Functions are not enabled");
+};
+ 
+async function sendToDestination(destination, payload) {
+  let parsedResponse;
+  logger.info("Request recieved for destination", destination);
+  const resp = await proxyRequest(payload);
+ 
+  if (resp.success) {
+    const { response } = resp;
+    parsedResponse = {
+      headers: response.headers,
+      response: response.data,
+      status: response.status
+    };
+    return parsedResponse;
+  }
+ 
+  const { response: error } = resp;
+  // handling axios error case
+  if (!error.response && error.code) {
+    const nodeSysErr = nodeSysErrorToStatus(error.code);
+    parsedResponse = {
+      headers: null,
+      networkFailure: true,
+      response: nodeSysErr.message,
+      status: nodeSysErr.status
+    };
+  } else {
+    parsedResponse = {
+      headers: error.response.headers,
+      status: error.response.status,
+      response:
+        error.response.data || "Error occurred while processing payload."
+    };
+  }
+  return parsedResponse;
+}
+ 
+module.exports = {
+  sendToDestination,
+  userTransformHandler
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/testRouter.js.html b/coverage/lcov-report/rudder-transformer/testRouter.js.html new file mode 100644 index 00000000000..fdaf96b8fd7 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/testRouter.js.html @@ -0,0 +1,743 @@ + + + + + + Code coverage report for rudder-transformer/testRouter.js + + + + + + + + + +
+
+

All files / rudder-transformer testRouter.js

+
+ +
+ 51.96% + Statements + 53/102 +
+ + +
+ 32.61% + Branches + 15/46 +
+ + +
+ 64.29% + Functions + 9/14 +
+ + +
+ 51.96% + Lines + 53/102 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222  +  +  +  +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +2x +  +  +1x +1x +  +  +1x +  +40x +  +  +  +2x +2x +2x +22x +  +  +2x +2x +18x +  +2x +2x +  +  +1x +3x +3x +3x +1x +  +2x +2x +2x +  +2x +2x +  +  +  +  +  +2x +2x +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +2x +2x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +2x +  +  +1x +  +  +1x +  +  +  +1x +91x +  +  +  +  +  +1x +  +  +  +1x + 
/* eslint-disable camelcase */
+/* eslint-disable import/no-dynamic-require */
+/* eslint-disable global-require */
+/* eslint-disable no-shadow */
+const fs = require("fs");
+const path = require("path");
+const Router = require("koa-router");
+const { sendToDestination, userTransformHandler } = require("./routerUtils");
+ 
+const version = "v0";
+const API_VERSION = "1";
+ 
+const isSupportedContentType = contentType => {
+  let supported = false;
+  const SUPPORTED_CONTENT_TYPES = [
+    "application/xml",
+    "application/json",
+    "text"
+  ];
+  if (contentType) {
+    SUPPORTED_CONTENT_TYPES.some(type => {
+      if (contentType.toLowerCase().includes(type)) {
+        supported = true;
+        return true;
+      }
+      return false;
+    });
+  }
+  return supported;
+};
+ 
+const testRouter = new Router({ prefix: "/test-router" });
+ 
+const getDestHandler = (version, destination) => {
+  return require(`./${version}/destinations/${destination}/transform`);
+};
+ 
+const getDestinations = () => {
+  return fs.readdirSync(path.resolve(__dirname, version, "destinations"));
+};
+ 
+const transformDestination = dest => {
+  function capitalize(s) {
+    return s === "id"
+      ? s.toUpperCase()
+      : s.charAt(0).toUpperCase() + s.slice(1);
+  }
+  const transformedObj = {};
+  const { destinationDefinition } = dest;
+  Object.keys(dest).forEach(key => {
+    transformedObj[capitalize(key)] = dest[key];
+  });
+ 
+  const destDef = {};
+  Object.keys(destinationDefinition).forEach(key => {
+    destDef[capitalize(key)] = destinationDefinition[key];
+  });
+  transformedObj.DestinationDefinition = destDef;
+  return transformedObj;
+};
+ 
+const handleTestEvent = async (ctx, dest) => {
+  try {
+    const { events } = ctx.request.body;
+    if (!events || !Array.isArray(events)) {
+      throw new Error("events array is required in payload");
+    }
+    const respList = [];
+    ctx.set("apiVersion", API_VERSION);
+    await Promise.all(
+      events.map(async event => {
+        const { message, destination, stage, libraries } = event;
+        const ev = {
+          message,
+          destination: transformDestination(destination),
+          libraries
+        };
+ 
+        let response = {};
+        let errorFound = false;
+ 
+        Iif (stage.user_transform) {
+          let librariesVersionIDs = [];
+          if (event.libraries) {
+            librariesVersionIDs = events[0].libraries.map(
+              library => library.versionId
+            );
+          }
+          const transformationVersionId =
+            ev.destination &&
+            ev.destination.Transformations &&
+            ev.destination.Transformations[0] &&
+            ev.destination.Transformations[0].versionId;
+ 
+          if (transformationVersionId) {
+            try {
+              const destTransformedEvents = await userTransformHandler()(
+                [ev],
+                transformationVersionId,
+                librariesVersionIDs
+              );
+              const userTransformedEvent = destTransformedEvents[0];
+              if (userTransformedEvent.error) {
+                throw new Error(userTransformedEvent.error);
+              }
+ 
+              response.user_transformed_payload =
+                userTransformedEvent.transformedEvent;
+              ev.message = userTransformedEvent.transformedEvent;
+            } catch (err) {
+              errorFound = true;
+              response.user_transformed_payload = {
+                error: err.message || JSON.stringify(err)
+              };
+            }
+          } else {
+            response.user_transformed_payload = {
+              error: "Transformation VersionID not found"
+            };
+          }
+        }
+ 
+        Eif (stage.dest_transform) {
+          Eif (!errorFound) {
+            try {
+              const desthandler = getDestHandler(version, dest);
+              const transformedOutput = await desthandler.process(ev);
+              if (Array.isArray(transformedOutput)) {
+                response.dest_transformed_payload = transformedOutput;
+              } else {
+                response.dest_transformed_payload = [transformedOutput];
+              }
+            } catch (err) {
+              errorFound = true;
+              response.dest_transformed_payload = {
+                error: err.message || JSON.stringify(err)
+              };
+            }
+          } else {
+            response.dest_transformed_payload = {
+              error: "error encountered in user_transformation stage. Aborting."
+            };
+          }
+        }
+        // const transformerStatuses = [];
+        Iif (stage.dest_transform && stage.send_to_destination) {
+          // send event to destination only after transformation
+          if (!errorFound) {
+            const destResponses = [];
+            const destResponseStatuses = [];
+ 
+            const transformedPayloads = response.dest_transformed_payload;
+            // eslint-disable-next-line no-restricted-syntax
+            for (const payload of transformedPayloads) {
+              // eslint-disable-next-line no-await-in-loop
+              const parsedResponse = await sendToDestination(dest, payload);
+ 
+              let contentType = "";
+              let response = "";
+              if (parsedResponse.headers) {
+                contentType = parsedResponse.headers["content-type"];
+                if (isSupportedContentType(contentType)) {
+                  response = parsedResponse.response;
+                }
+              } else if (parsedResponse.networkFailure) {
+                response = parsedResponse.response;
+              }
+ 
+              destResponses.push(response);
+              destResponseStatuses.push(parsedResponse.status);
+ 
+              // TODO: Use updated handleResponseTransform function
+              // Removing the below part, because transformerStatus is not
+              // currently being returned by test api response
+ 
+              // call response transform here
+              // const ctxMock = {
+              //   request: {
+              //     body: parsedResponse
+              //   }
+              // };
+              // handleResponseTransform(version, dest, ctxMock);
+              // const { output } = ctxMock.body;
+              // transformerStatuses.push(output.status);
+            }
+            response = {
+              ...response,
+              destination_response: destResponses,
+              destination_response_status: destResponseStatuses
+            };
+          } else {
+            response.destination_response = {
+              error: "error encountered in dest_transformation stage. Aborting."
+            };
+          }
+        }
+        respList.push(response);
+      })
+    );
+    ctx.body = respList;
+  } catch (err) {
+    // fail-safety error response
+    ctx.body = {
+      error: err.message || JSON.stringify(err)
+    };
+    ctx.status = 400;
+  }
+};
+ 
+getDestinations().forEach(async destination => {
+  testRouter.post(`/${version}/${destination}`, async ctx => {
+    await handleTestEvent(ctx, destination);
+    return ctx;
+  });
+});
+ 
+testRouter.get(`/${version}/health`, ctx => {
+  ctx.body = "OK";
+});
+ 
+module.exports = { testRouter, handleTestEvent };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/util/index.html b/coverage/lcov-report/rudder-transformer/util/index.html new file mode 100644 index 00000000000..1529159732a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/util/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/util + + + + + + + + + +
+
+

All files rudder-transformer/util

+
+ +
+ 61.9% + Statements + 13/21 +
+ + +
+ 28.57% + Branches + 6/21 +
+ + +
+ 20% + Functions + 1/5 +
+ + +
+ 61.9% + Lines + 13/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
stats.js +
+
61.9%13/2128.57%6/2120%1/561.9%13/21
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/util/stats.js.html b/coverage/lcov-report/rudder-transformer/util/stats.js.html new file mode 100644 index 00000000000..fc20c31bd63 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/util/stats.js.html @@ -0,0 +1,215 @@ + + + + + + Code coverage report for rudder-transformer/util/stats.js + + + + + + + + + +
+
+

All files / rudder-transformer/util stats.js

+
+ +
+ 61.9% + Statements + 13/21 +
+ + +
+ 28.57% + Branches + 6/21 +
+ + +
+ 20% + Functions + 1/5 +
+ + +
+ 61.9% + Lines + 13/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +4670x +  +70x +70x +70x +  +70x +  +  +  +  +  +  +  +70x +  +  +  +  +  +70x +16x +16x +  +  +  +70x +  +  +  +  +  +70x +  +  +  +  +  +70x +  +  +  +  +  +70x + 
const SDC = require("statsd-client");
+ 
+const enableStats = process.env.ENABLE_STATS !== "false";
+const statsServerHost = process.env.STATSD_SERVER_HOST || "localhost";
+const statsServerPort = parseInt(process.env.STATSD_SERVER_PORT || "8125", 10);
+ 
+const statsdClient = new SDC({
+  host: statsServerHost,
+  port: statsServerPort,
+  prefix: "transformer",
+  tags: {}
+});
+ 
+// Sends the diff between current time and start as the stat
+const timing = (name, start, tags = {}) => {
+  if (enableStats) {
+    statsdClient.timing(name, start, tags);
+  }
+};
+ 
+const increment = (name, delta = 1, tags = {}) => {
+  Eif (enableStats) {
+    statsdClient.increment(name, delta, tags);
+  }
+};
+ 
+const decrement = (name, delta = -1, tags = {}) => {
+  if (enableStats) {
+    statsdClient.decrement(name, delta, tags);
+  }
+};
+ 
+const counter = (name, delta, tags = {}) => {
+  if (enableStats) {
+    statsdClient.counter(name, delta, tags);
+  }
+};
+ 
+const gauge = (name, value, tags = {}) => {
+  if (enableStats) {
+    statsdClient.gauge(name, value, tags);
+  }
+};
+ 
+module.exports = { timing, increment, decrement, counter, gauge };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/config.js.html new file mode 100644 index 00000000000..6771c74adbe --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/config.js.html @@ -0,0 +1,245 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/active_campaign/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/active_campaign config.js

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +561x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+// For IDENTIFY
+// https://developers.activecampaign.com/reference/create-or-update-contact-new
+// https://developers.activecampaign.com/reference/retrieve-all-tags
+// https://developers.activecampaign.com/reference/create-a-new-tag
+// https://developers.activecampaign.com/reference/contact-tags
+// https://developers.activecampaign.com/reference/update-list-status-for-contact
+ 
+// For PAGE
+// https://developers.activecampaign.com/reference/site-tracking
+ 
+// For SCREEN
+// https://developers.activecampaign.com/reference/list-all-event-types
+// https://developers.activecampaign.com/reference/create-a-new-event-name-only
+// https://developers.activecampaign.com/reference/track-event
+ 
+// For TRACK
+// https://developers.activecampaign.com/reference/list-all-event-types
+// https://developers.activecampaign.com/reference/create-a-new-event-name-only
+// https://developers.activecampaign.com/reference/track-event
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: {
+    name: "ACIdentify",
+    // default api-url for creating contact
+    endPoint: "/api/3/contact/sync",
+    tagEndPoint: "/api/3/tags",
+    fieldEndPoint: "/api/3/fields",
+    mergeTagWithContactUrl: "/api/3/contactTags",
+    mergeFieldValueWithContactUrl: "/api/3/fieldValues",
+    mergeListWithContactUrl: "/api/3/contactLists"
+  },
+ 
+  PAGE: { name: "ACPage", endPoint: "/api/3/siteTrackingDomains" },
+ 
+  SCREEN: {
+    name: "ACScreen",
+    endPoint: "https://trackcmp.net/event",
+    getEventEndPoint: "/api/3/eventTrackingEvents"
+  },
+ 
+  TRACK: {
+    name: "ACTrack",
+    endPoint: "https://trackcmp.net/event",
+    getEventEndPoint: "/api/3/eventTrackingEvents"
+  }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/index.html new file mode 100644 index 00000000000..43adf83f5c5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/active_campaign + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/active_campaign

+
+ +
+ 79.25% + Statements + 210/265 +
+ + +
+ 48.36% + Branches + 59/122 +
+ + +
+ 87.5% + Functions + 28/32 +
+ + +
+ 79.69% + Lines + 208/261 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%4/4100%0/0100%0/0100%4/4
transform.js +
+
79.84%202/25350%59/11890.32%28/3180.32%200/249
util.js +
+
50%4/80%0/40%0/150%4/8
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/transform.js.html new file mode 100644 index 00000000000..78d955fd2e9 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/transform.js.html @@ -0,0 +1,1985 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/active_campaign/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/active_campaign transform.js

+
+ +
+ 79.84% + Statements + 202/253 +
+ + +
+ 50% + Branches + 59/118 +
+ + +
+ 90.32% + Functions + 28/31 +
+ + +
+ 80.32% + Lines + 200/249 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +1x +7x +7x +7x +  +  +5x +5x +5x +  +  +  +5x +5x +  +  +2x +2x +2x +  +  +  +2x +2x +  +  +  +7x +  +  +  +  +  +1x +3x +3x +  +  +3x +  +  +  +  +  +3x +3x +  +  +3x +3x +  +  +3x +  +  +1x +  +  +  +  +  +3x +3x +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +3x +3x +  +  +  +3x +3x +  +  +  +3x +15x +  +  +  +  +  +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +9x +3x +  +  +  +  +  +  +3x +3x +  +6x +6x +  +  +  +  +  +  +6x +  +  +  +  +  +6x +6x +  +  +  +6x +  +  +  +  +  +  +  +3x +  +9x +9x +  +  +  +  +  +9x +  +  +  +  +  +9x +9x +  +  +3x +9x +  +  +  +  +  +  +  +1x +3x +  +  +  +3x +  +  +  +3x +  +  +3x +  +  +  +3x +  +  +3x +  +  +  +  +3x +3x +  +  +3x +  +  +  +3x +3x +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +3x +3x +15x +  +  +  +3x +3x +3x +  +12x +12x +  +  +  +  +  +  +  +  +  +3x +3x +  +12x +3x +3x +6x +  +  +9x +  +12x +  +  +  +  +  +3x +  +  +1x +  +  +  +  +  +  +3x +  +  +3x +  +  +  +3x +3x +3x +9x +  +  +  +  +  +  +  +3x +3x +9x +6x +6x +  +  +  +  +  +  +6x +  +  +  +  +  +6x +6x +  +  +3x +3x +6x +  +  +  +  +  +  +  +  +  +  +  +1x +  +3x +3x +  +3x +  +3x +  +3x +  +3x +  +  +  +  +3x +3x +3x +  +  +  +3x +  +  +  +  +1x +2x +  +  +2x +  +  +1x +  +  +  +  +1x +1x +  +  +  +  +  +1x +1x +  +  +  +1x +  +  +1x +1x +1x +2x +  +  +  +1x +  +1x +1x +  +  +  +  +1x +  +  +  +  +  +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +1x +1x +  +  +1x +  +  +  +1x +1x +  +  +  +  +1x +  +1x +  +  +  +1x +  +  +  +  +  +1x +1x +1x +2x +  +  +  +1x +  +1x +1x +  +  +  +  +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +1x +  +1x +  +  +  +  +  +1x +7x +  +  +  +  +  +7x +  +  +7x +  +3x +3x +3x +  +2x +2x +2x +  +1x +1x +1x +  +1x +1x +1x +  +  +  +7x +  +  +1x +7x +7x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable  array-callback-return */
+/* eslint-disable  no-empty */
+const get = require("get-value");
+const { EventType } = require("../../../constants");
+const { CONFIG_CATEGORIES, MAPPING_CONFIG } = require("./config");
+const {
+  defaultRequestConfig,
+  constructPayload,
+  defaultPostRequestConfig,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  removeUndefinedAndNullValues,
+  CustomError
+} = require("../../util");
+const { errorHandler } = require("./util");
+const { httpGET, httpPOST } = require("../../../adapters/network");
+ 
+// The Final data is both application/url-encoded FORM and POST JSON depending on type of event
+// Creating a switch case for final request building
+const responseBuilderSimple = (payload, category, destination) => {
+  Eif (payload) {
+    const response = defaultRequestConfig();
+    switch (category.name) {
+      case "ACIdentify":
+      case "ACPage":
+        response.endpoint = `${destination.Config.apiUrl}${category.endPoint}`;
+        response.method = defaultPostRequestConfig.requestMethod;
+        response.headers = {
+          "Content-Type": "application/json",
+          "Api-Token": destination.Config.apiKey
+        };
+        response.body.JSON = payload;
+        break;
+      case "ACScreen":
+      case "ACTrack":
+        response.endpoint = `${category.endPoint}`;
+        response.method = defaultPostRequestConfig.requestMethod;
+        response.headers = {
+          "Content-Type": "application/x-www-form-urlencoded",
+          "Api-Token": destination.Config.apiKey
+        };
+        response.body.FORM = payload;
+        break;
+      default:
+        throw new CustomError("Message format type not supported", 400);
+    }
+    return response;
+  }
+  // fail-safety for developer error
+  throw new CustomError("Payload could not be constructed", 400);
+};
+ 
+const syncContact = async (contactPayload, category, destination) => {
+  const endpoint = `${destination.Config.apiUrl}${category.endPoint}`;
+  const requestData = {
+    contact: contactPayload
+  };
+  const requestOptions = {
+    headers: {
+      "Content-Type": "application/json",
+      "Api-Token": destination.Config.apiKey
+    }
+  };
+  const res = await httpPOST(endpoint, requestData, requestOptions);
+  Iif (res.success === false) {
+    errorHandler(res.response, "Failed to create new contact");
+  }
+  const createdContact = get(res, "response.data.contact"); // null safe
+  Iif (!createdContact) {
+    throw CustomError("Unable to Create Contact", 400);
+  }
+  return createdContact.id;
+};
+ 
+const customTagProcessor = async (
+  message,
+  category,
+  destination,
+  contactId
+) => {
+  const tagsToBeCreated = [];
+  const tagIds = [];
+  let res;
+  let endpoint;
+  let requestOptions;
+  let requestData;
+  // Here we extract the tags which are to be mapped to the created contact from the message
+  const tags =
+    get(message.context.traits, "tags") || get(message.traits, "tags");
+ 
+  // If no tags are sent in message return the contact from the method
+  Iif (!tags && !Array.isArray(tags)) {
+    return;
+  }
+ 
+  // Step - 1
+  // Fetch already created tags from dest, so that we avoid duplicate tag creation request
+  // Ref - https://developers.activecampaign.com/reference/retrieve-all-tags
+  endpoint = `${
+    destination.Config.apiUrl
+  }${`${category.tagEndPoint}?limit=100`}`;
+  requestOptions = {
+    headers: {
+      "Content-Type": "application/json",
+      "Api-Token": destination.Config.apiKey
+    }
+  };
+  res = await httpGET(endpoint, requestOptions);
+  Iif (res.success === false) {
+    errorHandler(res.response, "Failed to fetch already created tags");
+  }
+ 
+  const storedTags = {};
+  Eif (res.response.status === 200) {
+    // For easily checking if the tag which is sent is already present
+    // creating K-V Map [tag_name] -> tag_id
+ 
+    res.response.data.tags.map(t => {
+      storedTags[t.tag] = t.id;
+    });
+ 
+    // utilized limit and offset query parameters to fetch more than the default limit which is 20.
+    // We are retrieving 100 tags which is the maximum limit, in each iteration, until all tags are retrieved.
+    // Ref - https://developers.activecampaign.com/reference/pagination
+    const promises = [];
+    Iif (parseInt(get(res, "response.data.meta.total"), 10) > 100) {
+      const limit = Math.floor(
+        parseInt(get(res, "response.data.meta.total"), 10) / 100
+      );
+      for (let i = 0; i < limit; i += 1) {
+        endpoint = `${destination.Config.apiUrl}${
+          category.tagEndPoint
+        }?limit=100&offset=${100 * (i + 1)}`;
+        requestOptions = {
+          headers: {
+            "Content-Type": "application/json",
+            "Api-Token": destination.Config.apiKey
+          }
+        };
+        const resp = httpGET(endpoint, requestOptions);
+        promises.push(resp);
+      }
+      const results = await Promise.all(promises);
+      results.forEach(resp => {
+        if (resp.success === true && resp.response.status === 200) {
+          resp.response.data.tags.map(t => {
+            storedTags[t.tag] = t.id;
+          });
+        }
+      });
+    }
+ 
+    // Step - 2
+    // Check if tags already present then we push it to tagIds
+    // the ones which are not stored we push it to tagsToBeCreated
+    tags.map(tag => {
+      if (!storedTags[tag]) tagsToBeCreated.push(tag);
+      else tagIds.push(storedTags[tag]);
+    });
+  }
+ 
+  // Step - 3
+  // Create tags if required - from tagsToBeCreated
+  // Ref - https://developers.activecampaign.com/reference/create-a-new-tag
+  Eif (tagsToBeCreated.length > 0) {
+    await Promise.all(
+      tagsToBeCreated.map(async tag => {
+        endpoint = `${destination.Config.apiUrl}${category.tagEndPoint}`;
+        requestData = {
+          tag: {
+            tag,
+            tagType: "contact",
+            description: ""
+          }
+        };
+        requestOptions = {
+          headers: {
+            "Content-Type": "application/json",
+            "Api-Token": destination.Config.apiKey
+          }
+        };
+        res = await httpPOST(endpoint, requestData, requestOptions);
+        Iif (res.success === false) {
+          errorHandler(res.response, "Failed to create new tag");
+          // For each tags successfully created the response id is pushed to tagIds
+        }
+        Eif (res.response.status === 201) tagIds.push(res.response.data.tag.id);
+      })
+    );
+  }
+ 
+  // Step - 4
+  // Merge Created contact with created tags, tagIds array is used
+  // Ref - https://developers.activecampaign.com/reference/create-contact-tag
+  const responsesArr = await Promise.all(
+    tagIds.map(async tagId => {
+      endpoint = `${destination.Config.apiUrl}${category.mergeTagWithContactUrl}`;
+      requestData = {
+        contactTag: {
+          contact: contactId,
+          tag: tagId
+        }
+      };
+      requestOptions = {
+        headers: {
+          "Content-Type": "application/json",
+          "Api-Token": destination.Config.apiKey
+        }
+      };
+      res = httpPOST(endpoint, requestData, requestOptions);
+      return res;
+    })
+  );
+  responsesArr.forEach(respItem => {
+    Iif (respItem.success === false)
+      errorHandler(
+        respItem.response,
+        "Failed to merge created contact with created tags"
+      );
+  });
+};
+ 
+const customFieldProcessor = async (message, category, destination) => {
+  const responseStaging = [];
+  // Step - 1
+  // Extract the custom field info from the message
+  const fieldInfo =
+    get(message.context.traits, "fieldInfo") ||
+    get(message.traits, "fieldInfo");
+ 
+  // If no field info is passed return from method with empty array
+  Iif (!fieldInfo) {
+    return [];
+  }
+  const fieldKeys = Object.keys(fieldInfo);
+  // Step - 2
+  // Get the existing field data from dest and store it in responseStaging
+  // Ref - https://developers.activecampaign.com/reference/retrieve-fields
+  let endpoint = `${
+    destination.Config.apiUrl
+  }${`${category.fieldEndPoint}?limit=100`}`;
+  const requestOptions = {
+    headers: {
+      "Api-Token": destination.Config.apiKey
+    }
+  };
+  const res = await httpGET(endpoint, requestOptions);
+  Iif (res.success === false) {
+    errorHandler(res.response, "Failed to get existing field data");
+  }
+  responseStaging.push(
+    res.response.status === 200 ? res.response.data.fields : []
+  );
+ 
+  const promises = [];
+  const limit = Math.floor(
+    parseInt(get(res, "response.data.meta.total"), 10) / 100
+  );
+  Iif (parseInt(get(res, "response.data.meta.total"), 10) > 100) {
+    for (let i = 0; i < limit; i += 1) {
+      endpoint = `${destination.Config.apiUrl}${
+        category.fieldEndPoint
+      }?limit=100&offset=${100 * (i + 1)}`;
+      const requestOpt = {
+        headers: {
+          "Api-Token": destination.Config.apiKey
+        }
+      };
+      const resp = httpGET(endpoint, requestOpt);
+      promises.push(resp);
+    }
+    const results = await Promise.all(promises);
+    results.forEach(resp => {
+      if (resp.success === true && resp.response.status === 200) {
+        responseStaging.push(resp.response.data.fields);
+      } else {
+        errorHandler(resp.response, "Failed to get existing field data");
+      }
+    });
+  }
+ 
+  // From the responseStaging we store the stored field information in K-V struct iin fieldMap
+  // In order for easy comparison and retrieval.
+  const fieldMap = {};
+ 
+  responseStaging.forEach(respStag => {
+    respStag.map(field => {
+      fieldMap[field.title] = field.id;
+    });
+  });
+ 
+  const storedFields = Object.keys(fieldMap);
+  const filteredFieldKeys = [];
+  fieldKeys.map(fieldKey => {
+    // If the field is present in fieldMap push it to filteredFieldKeys else ignore
+    Eif (storedFields.includes(fieldKey)) {
+      filteredFieldKeys.push(fieldKey);
+    }
+  });
+ 
+  // fieldmap has all the field info in K/V  pair => [title] = id
+  // Using the keys we get the value fromMap and fieldinfo
+ 
+  // Step - 3
+  // Creating a field array list conating field id and field value which will be merged to the contact
+  // Ref: https://developers.activecampaign.com/reference/sync-a-contacts-data
+  const fieldsArrValues = [];
+  filteredFieldKeys.map(key => {
+    let fPayload;
+    if (Array.isArray(fieldInfo[key])) {
+      fPayload = "||";
+      fieldInfo[key].map(fv => {
+        fPayload = `${fPayload}${fv}||`;
+      });
+    } else {
+      fPayload = fieldInfo[key];
+    }
+    fieldsArrValues.push({
+      field: fieldMap[key],
+      value: fPayload
+    });
+  });
+ 
+  return fieldsArrValues;
+};
+ 
+const customListProcessor = async (
+  message,
+  category,
+  destination,
+  contactId
+) => {
+  // Here we extract the list info from the message
+  const listInfo = get(message.context.traits, "lists")
+    ? get(message.context.traits, "lists")
+    : get(message.traits, "lists");
+  Iif (!listInfo) {
+    return;
+  }
+  // The list info is pushed into a list object array
+  const listArr = [];
+  Eif (Array.isArray(listInfo)) {
+    listInfo.map(list => {
+      listArr.push(list);
+    });
+  } else {
+    listArr.push(listInfo);
+  }
+  // For each list object we are mapping the createdcontact with the list along with the
+  // status information
+  // Ref: https://developers.activecampaign.com/reference/update-list-status-for-contact/
+  const promises = [];
+  listArr.map(async li => {
+    if (li.status === "subscribe" || li.status === "unsubscribe") {
+      const endpoint = `${destination.Config.apiUrl}${category.mergeListWithContactUrl}`;
+      const requestData = {
+        contactList: {
+          list: li.id,
+          contact: contactId,
+          status: li.status === "subscribe" ? "1" : "2"
+        }
+      };
+      const requestOptions = {
+        headers: {
+          "Content-Type": "application/json",
+          "Api-Token": destination.Config.apiKey
+        }
+      };
+      const res = httpPOST(endpoint, requestData, requestOptions);
+      promises.push(res);
+    }
+  });
+  const responses = await Promise.all(promises);
+  responses.forEach(respItem => {
+    Iif (respItem.success === false) {
+      errorHandler(
+        respItem.response,
+        "Failed to map created contact with the list"
+      );
+    }
+  });
+};
+ 
+// This the handler func for identify type of events here before we transform the event
+// and return to rudder server we process the message by calling specific destination apis
+// for handling tag information and custom field information.
+const identifyRequestHandler = async (message, category, destination) => {
+  // create skeleton contact payload
+  let contactPayload = constructPayload(message, MAPPING_CONFIG[category.name]);
+  contactPayload = removeUndefinedAndNullValues(contactPayload);
+  // sync to Active Campaign
+  const contactId = await syncContact(contactPayload, category, destination);
+  // create, and merge tags
+  await customTagProcessor(message, category, destination, contactId);
+  // add the contact to lists if applicabale
+  await customListProcessor(message, category, destination, contactId);
+  // extract fieldValues to merge with contact
+  const fieldValues = await customFieldProcessor(
+    message,
+    category,
+    destination
+  );
+  contactPayload.fieldValues = fieldValues;
+  contactPayload = removeUndefinedAndNullValues(contactPayload);
+  const payload = {
+    contact: contactPayload
+  };
+  // sync the enriched payload
+  return responseBuilderSimple(payload, category, destination);
+};
+// This method handles any page request
+// Creates the payload as per API spec and returns to rudder-server
+// Ref - https://developers.activecampaign.com/reference/site-tracking
+const pageRequestHandler = (message, category, destination) => {
+  const payload = {
+    siteTrackingDomain: constructPayload(message, MAPPING_CONFIG[category.name])
+  };
+  return responseBuilderSimple(payload, category, destination);
+};
+ 
+const screenRequestHandler = async (message, category, destination) => {
+  // Need to check if the event with same name already exists if not need to create
+  // Retrieve All events from destination
+  // https://developers.activecampaign.com/reference/list-all-event-types
+  let res;
+  let endpoint = `${destination.Config.apiUrl}${category.getEventEndPoint}`;
+  const requestOptions = {
+    headers: {
+      "Content-Type": "application/json",
+      "Api-Token": destination.Config.apiKey
+    }
+  };
+  res = await httpGET(endpoint, requestOptions);
+  Iif (res.success === false) {
+    errorHandler(res.response, "Failed to retrieve events");
+  }
+ 
+  Iif (res.response.status !== 200)
+    throw new CustomError("Unable to create event", res.response.status || 400);
+ 
+  const storedEventsArr = res.response.data.eventTrackingEvents;
+  const storedEvents = [];
+  storedEventsArr.map(ev => {
+    storedEvents.push(ev.name);
+  });
+  // Check if the source event is already present if not we make a create request
+  // Ref - https://developers.activecampaign.com/reference/create-a-new-event-name-only
+  Eif (!storedEvents.includes(message.event)) {
+    // Create the event
+    endpoint = `${destination.Config.apiUrl}${category.getEventEndPoint}`;
+    const requestData = {
+      eventTrackingEvent: {
+        name: message.event
+      }
+    };
+    const requestOpt = {
+      headers: {
+        "Content-Type": "application/json",
+        "Api-Token": destination.Config.apiKey
+      }
+    };
+    res = await httpPOST(endpoint, requestData, requestOpt);
+    Iif (res.success === false) {
+      errorHandler(res.response, "Failed to create event");
+    }
+ 
+    Iif (res.response.status !== 201) {
+      throw new CustomError(
+        "Unable to create event",
+        res.response.status || 400
+      );
+    }
+  }
+  // Previous operations successfull then
+  // Mapping the Event payloads
+  // Create the payload and send the ent to end point using rudder server
+  // Ref - https://developers.activecampaign.com/reference/track-event
+  const payload = constructPayload(message, MAPPING_CONFIG[category.name]);
+  payload.actid = destination.Config.actid;
+  payload.key = destination.Config.eventKey;
+  Iif (get(message, "properties.eventData")) {
+    payload.eventdata = get(message, "properties.eventData");
+  }
+  payload.visit = `{"email":"${get(message, "context.traits.email")}"}`;
+  return responseBuilderSimple(payload, category, destination);
+};
+ 
+const trackRequestHandler = async (message, category, destination) => {
+  // Need to check if the event with same name already exists if not need to create
+  // Retrieve All events from destination
+  // https://developers.activecampaign.com/reference/list-all-event-types
+  let endpoint = `${destination.Config.apiUrl}${category.getEventEndPoint}`;
+  const requestOptions = {
+    headers: {
+      "Api-Token": destination.Config.apiKey
+    }
+  };
+  let res = await httpGET(endpoint, requestOptions);
+ 
+  Iif (res.success === false) {
+    errorHandler(res.response, "Failed to retrieve events");
+  }
+ 
+  Iif (res.response.status !== 200)
+    throw new CustomError(
+      "Unable to fetch events. Aborting",
+      res.response.status || 400
+    );
+ 
+  const storedEventsArr = res.response.data.eventTrackingEvents;
+  const storedEvents = [];
+  storedEventsArr.map(ev => {
+    storedEvents.push(ev.name);
+  });
+  // Check if the source event is already present if not we make a create request
+  // Ref - https://developers.activecampaign.com/reference/create-a-new-event-name-only
+  Eif (!storedEvents.includes(message.event)) {
+    // Create the event
+    endpoint = `${destination.Config.apiUrl}${category.getEventEndPoint}`;
+    const requestData = {
+      eventTrackingEvent: {
+        name: message.event
+      }
+    };
+    const requestOpt = {
+      headers: {
+        "Content-Type": "application/json",
+        "Api-Token": destination.Config.apiKey
+      }
+    };
+    res = await httpPOST(endpoint, requestData, requestOpt);
+    Iif (res.response.status !== 201) {
+      throw new CustomError(
+        "Unable to create event. Aborting",
+        res.response.status || 400
+      );
+    }
+  }
+ 
+  // Previous operations successfull then
+  // Mapping the Event payloads
+  // Create the payload and send the ent to end point using rudder server
+  // Ref - https://developers.activecampaign.com/reference/track-event
+  const payload = constructPayload(message, MAPPING_CONFIG[category.name]);
+  payload.actid = destination.Config.actid;
+  payload.key = destination.Config.eventKey;
+  Iif (get(message, "properties.eventData")) {
+    payload.eventdata = get(message, "properties.eventData");
+  }
+  payload.visit = `{"email":"${get(message, "context.traits.email")}"}`;
+ 
+  return responseBuilderSimple(payload, category, destination);
+};
+ 
+// The main entry point where the message is processed based on what type of event
+// each scenario is resolved by using specific handler function which does
+// subsquent processing and transformations and the response is sent to rudder-server
+const processEvent = async (message, destination) => {
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const messageType = message.type.toLowerCase();
+  let response;
+  let category;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      category = CONFIG_CATEGORIES.IDENTIFY;
+      response = await identifyRequestHandler(message, category, destination);
+      break;
+    case EventType.PAGE:
+      category = CONFIG_CATEGORIES.PAGE;
+      response = pageRequestHandler(message, category, destination);
+      break;
+    case EventType.SCREEN:
+      category = CONFIG_CATEGORIES.SCREEN;
+      response = await screenRequestHandler(message, category, destination);
+      break;
+    case EventType.TRACK:
+      category = CONFIG_CATEGORIES.TRACK;
+      response = await trackRequestHandler(message, category, destination);
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+  return response;
+};
+ 
+const process = async event => {
+  const result = await processEvent(event.message, event.destination);
+  return result;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/util.js.html new file mode 100644 index 00000000000..11ccd7347f1 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/active_campaign/util.js.html @@ -0,0 +1,140 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/active_campaign/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/active_campaign util.js

+
+ +
+ 50% + Statements + 4/8 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 50% + Lines + 4/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21  +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
const {
+  nodeSysErrorToStatus
+} = require("../../../adapters/utils/networkUtils");
+const { CustomError } = require("../../util");
+ 
+const errorHandler = (err, message) => {
+  if (err.response) {
+    throw new CustomError(
+      `${message} (${err.response?.statusText},${JSON.stringify(
+        err.response?.data
+      )})`,
+      err.response.status || 400
+    );
+  } else {
+    const httpError = nodeSysErrorToStatus(err.code);
+    throw new CustomError(`${message} ${httpError.message}`, httpError.status);
+  }
+};
+ 
+module.exports = { errorHandler };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/adj/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/adj/config.js.html new file mode 100644 index 00000000000..db8cef2b00f --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/adj/config.js.html @@ -0,0 +1,122 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/adj/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/adj config.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +151x +  +1x +  +1x +  +  +1x +  +1x +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const baseEndpoint = "https://s2s.adjust.com/event";
+ 
+const CONFIG_CATEGORIES = {
+  TRACK: { name: "ADJUSTTrackConfig" }
+};
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  MAPPING_CONFIG,
+  CONFIG_CATEGORIES,
+  baseEndpoint
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/adj/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/adj/index.html new file mode 100644 index 00000000000..8e941b5ee5c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/adj/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/adj + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/adj

+
+ +
+ 92.54% + Statements + 62/67 +
+ + +
+ 78.57% + Branches + 33/42 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 92.54% + Lines + 62/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%5/5100%0/0100%0/0100%5/5
transform.js +
+
91.94%57/6278.57%33/42100%6/691.94%57/62
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/adj/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/adj/transform.js.html new file mode 100644 index 00000000000..a828f627248 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/adj/transform.js.html @@ -0,0 +1,497 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/adj/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/adj transform.js

+
+ +
+ 91.94% + Statements + 57/62 +
+ + +
+ 78.57% + Branches + 33/42 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 91.94% + Lines + 57/62 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +1401x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +16x +15x +15x +15x +  +  +  +  +1x +  +14x +7x +7x +7x +6x +6x +  +1x +  +13x +10x +  +13x +13x +12x +12x +  +  +12x +9x +18x +  +9x +  +  +  +3x +  +  +12x +12x +12x +12x +12x +12x +12x +12x +12x +  +  +1x +1x +  +  +  +  +  +1x +18x +1x +  +  +  +  +17x +  +17x +  +16x +16x +  +1x +  +  +  +16x +  +  +1x +18x +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const { EventType } = require("../../../constants");
+const { CONFIG_CATEGORIES, MAPPING_CONFIG, baseEndpoint } = require("./config");
+const {
+  constructPayload,
+  getHashFromArray,
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  removeUndefinedAndNullValues,
+  flattenJson,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  isAppleFamily
+} = require("../../util");
+ 
+const rejectParams = ["revenue", "currency"];
+ 
+function responseBuilderSimple(message, category, destination) {
+  const payload = constructPayload(message, MAPPING_CONFIG[category.name]);
+  const { appToken, customMappings, environment } = destination.Config;
+  const platform = message.context.device.type;
+  if (
+    !message.context.device ||
+    !message.context.device.type ||
+    !message.context.device.id
+  ) {
+    throw new CustomError("Device type/id  not present", 400);
+  }
+  if (platform.toLowerCase() === "android") {
+    delete payload.idfv;
+    delete payload.idfa;
+  } else if (isAppleFamily(platform)) {
+    delete payload.android_id;
+    delete payload.gps_adid;
+  } else {
+    throw new CustomError("Device type not valid", 400);
+  }
+  if (payload.revenue) {
+    payload.currency = message.properties.currency || "USD";
+  }
+  const hashMap = getHashFromArray(customMappings, "from", "to", false);
+  if (payload && message.event && hashMap[message.event]) {
+    const response = defaultRequestConfig();
+    response.headers = {
+      Accept: "*/*"
+    };
+    if (payload.callback_params) {
+      rejectParams.forEach(rejectParam => {
+        delete payload.callback_params[rejectParam];
+      });
+      payload.callback_params = JSON.stringify(
+        flattenJson(payload.callback_params)
+      );
+    } else {
+      payload.callback_params = null;
+    }
+ 
+    response.endpoint = baseEndpoint;
+    response.method = defaultPostRequestConfig.requestMethod;
+    response.userId = message.anonymousId;
+    payload.s2s = 1;
+    payload.app_token = appToken;
+    payload.event_token = hashMap[message.event];
+    payload.environment = environment ? "production" : "sandbox";
+    response.params = removeUndefinedAndNullValues(payload);
+    return response;
+  }
+  // fail-safety for developer error
+  Eif (!message.event || !hashMap[message.event]) {
+    throw new CustomError("No event token mapped for this event", 400);
+  } else {
+    throw new CustomError("Payload could not be constructed", 400);
+  }
+}
+ 
+const processEvent = (message, destination) => {
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const messageType = message.type.toLowerCase();
+  let category;
+  switch (messageType) {
+    case EventType.TRACK:
+      category = CONFIG_CATEGORIES.TRACK;
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+ 
+  // build the response
+  return responseBuilderSimple(message, category, destination);
+};
+ 
+const process = event => {
+  return processEvent(event.message, event.destination);
+};
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/airship/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/airship/config.js.html new file mode 100644 index 00000000000..9c6d9fdd1c7 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/airship/config.js.html @@ -0,0 +1,248 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/airship/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/airship config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +571x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_URL_US = "https://go.urbanairship.com";
+const BASE_URL_EU = "https://go.airship.eu";
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: {
+    name: "airshipIdentifyConfig",
+    type: "identify"
+  },
+  TRACK: {
+    name: "airshipTrackConfig",
+    type: "track"
+  },
+  GROUP: {
+    name: "airshipGroupConfig",
+    type: "group"
+  }
+};
+ 
+const AIRSHIP_TRACK_EXCLUSION = [
+  "interaction_id",
+  "interactionId",
+  "interaction_type",
+  "interactionType",
+  "value",
+  "session_id",
+  "sessionId",
+  "transaction"
+];
+ 
+const RESERVED_TRAITS_MAPPING = {
+  "address.city": "city",
+  "address.country": "country",
+  "address.postalcode": "zipcode",
+  "address.state": "region",
+  createdAt: "account_creation",
+  firstName: "first_name",
+  lastName: "last_name",
+  name: "full_name",
+  phone: "mobile_phone"
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  CONFIG_CATEGORIES,
+  identifyMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY.name],
+  trackMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK.name],
+  groupMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.GROUP.name],
+  MAPPING_CONFIG,
+  BASE_URL_EU,
+  BASE_URL_US,
+  RESERVED_TRAITS_MAPPING,
+  AIRSHIP_TRACK_EXCLUSION
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/airship/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/airship/index.html new file mode 100644 index 00000000000..cc5777f8223 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/airship/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/airship + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/airship

+
+ +
+ 94.86% + Statements + 166/175 +
+ + +
+ 83.72% + Branches + 72/86 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 95.38% + Lines + 165/173 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%0/0100%8/8
transform.js +
+
94.61%158/16783.72%72/86100%8/895.15%157/165
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/airship/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/airship/transform.js.html new file mode 100644 index 00000000000..8639c4a4d15 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/airship/transform.js.html @@ -0,0 +1,1154 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/airship/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/airship transform.js

+
+ +
+ 94.61% + Statements + 158/167 +
+ + +
+ 83.72% + Branches + 72/86 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 95.15% + Lines + 157/165 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +3591x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +7x +7x +  +7x +1x +  +  +  +  +6x +  +6x +  +6x +6x +1x +  +  +  +  +  +  +5x +5x +5x +5x +  +  +5x +5x +5x +  +52x +12x +12x +8x +  +12x +4x +  +  +  +52x +40x +40x +40x +40x +20x +  +20x +  +40x +40x +40x +  +  +  +  +  +5x +  +5x +  +  +  +4x +4x +  +4x +4x +4x +  +  +  +  +4x +4x +4x +  +  +5x +4x +4x +  +  +  +4x +  +  +  +  +4x +4x +  +  +4x +  +  +5x +  +  +1x +9x +9x +1x +  +  +8x +8x +8x +8x +  +  +  +  +  +8x +5x +  +  +8x +8x +1x +  +8x +  +8x +2x +1x +  +  +  +  +1x +  +  +  +  +6x +  +6x +  +6x +6x +6x +6x +6x +6x +  +  +  +  +  +  +6x +6x +6x +6x +6x +  +  +1x +8x +8x +  +8x +1x +  +  +  +  +7x +  +7x +  +7x +7x +1x +  +  +  +  +  +6x +6x +6x +6x +  +6x +6x +6x +  +65x +15x +15x +10x +  +15x +5x +  +  +  +65x +50x +50x +50x +50x +25x +  +25x +  +50x +50x +50x +  +  +  +  +  +6x +  +6x +  +  +  +5x +  +5x +  +  +5x +5x +5x +  +  +  +  +5x +5x +5x +  +  +6x +5x +5x +  +  +  +5x +  +  +  +  +5x +5x +  +  +5x +  +6x +  +  +1x +25x +25x +  +  +  +  +  +  +25x +  +  +25x +  +7x +5x +  +9x +6x +  +8x +6x +  +1x +  +17x +  +  +1x +1x +  +  +  +  +1x +  +3x +3x +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const { EventType } = require("../../../constants");
+ 
+const {
+  identifyMapping,
+  trackMapping,
+  groupMapping,
+  BASE_URL_EU,
+  BASE_URL_US,
+  RESERVED_TRAITS_MAPPING,
+  AIRSHIP_TRACK_EXCLUSION
+} = require("./config");
+ 
+const {
+  constructPayload,
+  getFieldValueFromMessage,
+  defaultPostRequestConfig,
+  removeUndefinedAndNullValues,
+  defaultRequestConfig,
+  CustomError,
+  flattenJson,
+  isDefinedAndNotNullAndNotEmpty,
+  extractCustomFields,
+  getErrorRespEvents,
+  getSuccessRespEvents,
+  isEmptyObject
+} = require("../../util");
+ 
+const identifyResponseBuilder = (message, { Config }) => {
+  const tagPayload = constructPayload(message, identifyMapping);
+  const { apiKey, dataCenter } = Config;
+ 
+  if (!apiKey)
+    throw new CustomError(
+      "[Airship] :: API Key is required for authorization for Identify events",
+      400
+    );
+ 
+  let BASE_URL = BASE_URL_US;
+  // check the region and which api end point should be used
+  BASE_URL = dataCenter ? BASE_URL_EU : BASE_URL;
+ 
+  const traits = flattenJson(getFieldValueFromMessage(message, "traits"));
+  if (!isDefinedAndNotNullAndNotEmpty(traits)) {
+    throw new CustomError(
+      "[Airship]:: for identify, tags or attributes properties are required under traits",
+      400
+    );
+  }
+ 
+  // Creating tags and attribute payload
+  tagPayload.add = { rudderstack_integration: [] };
+  tagPayload.remove = { rudderstack_integration: [] };
+  let timestamp = getFieldValueFromMessage(message, "timestamp");
+  timestamp = new Date(timestamp).toISOString().replace(/\.[0-9]{3}/, "");
+ 
+  // Creating attribute payload
+  const attributePayload = {};
+  attributePayload.attributes = [];
+  Object.keys(traits).forEach(key => {
+    // tags
+    if (typeof traits[key] === "boolean") {
+      const tag = key.toLowerCase().replace(/\./g, "_");
+      if (traits[key] === true) {
+        tagPayload.add.rudderstack_integration.push(tag);
+      }
+      if (traits[key] === false) {
+        tagPayload.remove.rudderstack_integration.push(tag);
+      }
+    }
+    // attribute
+    if (typeof traits[key] !== "boolean") {
+      const attribute = {};
+      attribute.action = "set";
+      const keyMapped = RESERVED_TRAITS_MAPPING[key.toLowerCase()];
+      if (keyMapped) {
+        attribute.key = keyMapped;
+      } else {
+        attribute.key = key.replace(/\./g, "_");
+      }
+      attribute.value = traits[key];
+      attribute.timestamp = timestamp;
+      attributePayload.attributes.push(attribute);
+    }
+  });
+ 
+  let tagResponse;
+  let attributeResponse;
+  const arrayPayload = [];
+  // Creating tag response
+  if (
+    tagPayload.add.rudderstack_integration.length ||
+    tagPayload.remove.rudderstack_integration.length
+  ) {
+    Iif (!tagPayload.add.rudderstack_integration.length) delete tagPayload.add;
+    Iif (!tagPayload.remove.rudderstack_integration.length)
+      delete tagPayload.remove;
+    tagResponse = defaultRequestConfig();
+    tagResponse.endpoint = `${BASE_URL}/api/named_users/tags`;
+    tagResponse.headers = {
+      "Content-Type": "application/json",
+      Accept: "application/vnd.urbanairship+json; version=3",
+      Authorization: `Bearer ${apiKey}`
+    };
+    tagResponse.method = defaultPostRequestConfig.requestMethod;
+    tagResponse.body.JSON = removeUndefinedAndNullValues(tagPayload);
+    arrayPayload.push(tagResponse);
+  }
+  // Creating attribute response
+  if (attributePayload.attributes.length) {
+    attributeResponse = defaultRequestConfig();
+    attributeResponse.endpoint = `${BASE_URL}/api/named_users/${getFieldValueFromMessage(
+      message,
+      "userId"
+    )}/attributes`;
+    attributeResponse.headers = {
+      "Content-Type": "application/json",
+      Accept: "application/vnd.urbanairship+json; version=3",
+      Authorization: `Bearer ${apiKey}`
+    };
+    attributeResponse.method = defaultPostRequestConfig.requestMethod;
+    attributeResponse.body.JSON = removeUndefinedAndNullValues(
+      attributePayload
+    );
+    arrayPayload.push(attributeResponse);
+  }
+ 
+  return arrayPayload;
+};
+ 
+const trackResponseBuilder = async (message, { Config }) => {
+  let name = message.event;
+  if (!name) {
+    throw new CustomError("event name is required for track", 400);
+  }
+ 
+  name = name.toLowerCase();
+  const payload = constructPayload(message, trackMapping);
+  let properties = {};
+  properties = extractCustomFields(
+    message,
+    properties,
+    ["properties"],
+    AIRSHIP_TRACK_EXCLUSION
+  );
+  if (!isEmptyObject(properties)) {
+    payload.properties = properties;
+  }
+ 
+  payload.name = name.replace(/\s+/g, "_");
+  if (payload.value) {
+    payload.value.replace(/\s+/g, "_");
+  }
+  const { appKey, dataCenter, apiKey } = Config;
+ 
+  if (!appKey || !apiKey) {
+    if (!appKey)
+      throw new CustomError(
+        "[Airship] :: App Key is required for authorization for track events",
+        400
+      );
+    else
+      throw new CustomError(
+        "[Airship] :: API Key is required for authorization for track events",
+        400
+      );
+  }
+  let BASE_URL = BASE_URL_US;
+  // check the region and which api end point should be used
+  BASE_URL = dataCenter ? BASE_URL_EU : BASE_URL;
+ 
+  const response = defaultRequestConfig();
+  const timestamp = getFieldValueFromMessage(message, "timestamp");
+  Eif (timestamp) response.body.JSON.occured = timestamp;
+  response.body.JSON.user = {};
+  response.body.JSON.user.named_user_id = message.userId;
+  response.headers = {
+    "Content-Type": "application/json",
+    Accept: "application/vnd.urbanairship+json; version=3",
+    "X-UA-Appkey": `${appKey}`,
+    Authorization: `Bearer ${apiKey}`
+  };
+ 
+  response.endpoint = `${BASE_URL}/api/custom-events`;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.body.JSON.body = {};
+  response.body.JSON.body = payload;
+  return response;
+};
+ 
+const groupResponseBuilder = (message, { Config }) => {
+  const tagPayload = constructPayload(message, groupMapping);
+  const { apiKey, dataCenter } = Config;
+ 
+  if (!apiKey)
+    throw new CustomError(
+      "[Airship] :: API Key is required for authorization for group events",
+      400
+    );
+ 
+  let BASE_URL = BASE_URL_US;
+  // check the region and which api end point should be used
+  BASE_URL = dataCenter ? BASE_URL_EU : BASE_URL;
+ 
+  const traits = flattenJson(getFieldValueFromMessage(message, "traits"));
+  if (!isDefinedAndNotNullAndNotEmpty(traits)) {
+    throw new CustomError(
+      "[Airship]:: for group, tags or attributes properties are required under traits",
+      400
+    );
+  }
+ 
+  tagPayload.add = { rudderstack_integration_group: [] };
+  tagPayload.remove = { rudderstack_integration_group: [] };
+  let timestamp = getFieldValueFromMessage(message, "timestamp");
+  timestamp = new Date(timestamp).toISOString().replace(/\.[0-9]{3}/, "");
+ 
+  const attributePayload = {};
+  attributePayload.attributes = [];
+  Object.keys(traits).forEach(key => {
+    // tags
+    if (typeof traits[key] === "boolean") {
+      const tag = key.toLowerCase().replace(/\./g, "_");
+      if (traits[key] === true) {
+        tagPayload.add.rudderstack_integration_group.push(tag);
+      }
+      if (traits[key] === false) {
+        tagPayload.remove.rudderstack_integration_group.push(tag);
+      }
+    }
+    // attribute
+    if (typeof traits[key] !== "boolean") {
+      const attribute = {};
+      attribute.action = "set";
+      const keyMapped = RESERVED_TRAITS_MAPPING[key.toLowerCase()];
+      if (keyMapped) {
+        attribute.key = keyMapped;
+      } else {
+        attribute.key = key.replace(/\./g, "_");
+      }
+      attribute.value = traits[key];
+      attribute.timestamp = timestamp;
+      attributePayload.attributes.push(attribute);
+    }
+  });
+ 
+  let tagResponse;
+  let attributeResponse;
+  const arrayPayload = [];
+  // Creating tag response
+  if (
+    tagPayload.add.rudderstack_integration_group.length ||
+    tagPayload.remove.rudderstack_integration_group.length
+  ) {
+    Iif (!tagPayload.add.rudderstack_integration_group.length)
+      delete tagPayload.add;
+    Iif (!tagPayload.remove.rudderstack_integration_group.length)
+      delete tagPayload.remove;
+ 
+    tagResponse = defaultRequestConfig();
+    tagResponse.endpoint = `${BASE_URL}/api/named_users/tags`;
+    tagResponse.headers = {
+      "Content-Type": "application/json",
+      Accept: "application/vnd.urbanairship+json; version=3",
+      Authorization: `Bearer ${apiKey}`
+    };
+    tagResponse.method = defaultPostRequestConfig.requestMethod;
+    tagResponse.body.JSON = removeUndefinedAndNullValues(tagPayload);
+    arrayPayload.push(tagResponse);
+  }
+  // Creating attribute response
+  if (attributePayload.attributes.length) {
+    attributeResponse = defaultRequestConfig();
+    attributeResponse.endpoint = `${BASE_URL}/api/named_users/${getFieldValueFromMessage(
+      message,
+      "userId"
+    )}/attributes`;
+    attributeResponse.headers = {
+      "Content-Type": "application/json",
+      Accept: "application/vnd.urbanairship+json; version=3",
+      Authorization: `Bearer ${apiKey}`
+    };
+    attributeResponse.method = defaultPostRequestConfig.requestMethod;
+    attributeResponse.body.JSON = removeUndefinedAndNullValues(
+      attributePayload
+    );
+    arrayPayload.push(attributeResponse);
+  }
+  return arrayPayload;
+};
+ 
+const process = async event => {
+  const { message, destination } = event;
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  const messageType = message.type.toLowerCase();
+ 
+  let response;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      response = await identifyResponseBuilder(message, destination);
+      break;
+    case EventType.TRACK:
+      response = await trackResponseBuilder(message, destination);
+      break;
+    case EventType.GROUP:
+      response = await groupResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`message type ${messageType} not supported`, 400);
+  }
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/config.js.html new file mode 100644 index 00000000000..9984d4034ac --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/config.js.html @@ -0,0 +1,125 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/algolia/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/algolia config.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +  +1x +1x +  +  +1x +1x +1x +1x +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ENDPOINT = "https://insights.algolia.io/1/events";
+const CONFIG_CATEGORIES = {
+  TRACK: { type: "track", name: "AlgoliaTrack" }
+};
+const EVENT_TYPES = ["click", "view", "conversion"];
+const MAX_BATCH_SIZE = 1000;
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+module.exports = {
+  ENDPOINT,
+  MAX_BATCH_SIZE,
+  EVENT_TYPES,
+  trackMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK.name]
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/index.html new file mode 100644 index 00000000000..e2ca551ef95 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/algolia + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/algolia

+
+ +
+ 83.33% + Statements + 140/168 +
+ + +
+ 72% + Branches + 90/125 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 83.33% + Lines + 140/168 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%7/7100%0/0100%0/0100%7/7
transform.js +
+
87.95%73/8366.67%34/51100%5/587.95%73/83
util.js +
+
76.92%60/7875.68%56/74100%7/776.92%60/78
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/transform.js.html new file mode 100644 index 00000000000..0379304362a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/transform.js.html @@ -0,0 +1,605 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/algolia/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/algolia transform.js

+
+ +
+ 87.95% + Statements + 73/83 +
+ + +
+ 66.67% + Branches + 34/51 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 87.95% + Lines + 73/83 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +1761x +1x +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +1x +  +1x +10x +10x +  +  +10x +10x +10x +10x +10x +  +  +10x +1x +  +9x +  +8x +5x +5x +5x +  +  +  +5x +5x +5x +5x +5x +  +5x +3x +3x +  +  +5x +  +  +  +  +  +  +  +  +8x +1x +  +7x +  +  +  +  +  +7x +5x +  +5x +5x +5x +5x +5x +  +  +  +5x +  +  +1x +10x +10x +  +  +  +  +  +  +10x +  +  +10x +  +  +10x +  +  +10x +  +10x +5x +  +  +  +5x +  +  +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +2x +2x +  +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +1x +  +  +  +1x +  +1x +  +  +  +  +1x +  +  +1x + 
const set = require("set-value");
+const { EventType } = require("../../../constants");
+const {
+  CustomError,
+  getValueFromMessage,
+  constructPayload,
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  removeUndefinedAndNullValues,
+  returnArrayOfSubarrays,
+  getErrorRespEvents,
+  getSuccessRespEvents
+} = require("../../util/index");
+ 
+const { ENDPOINT, MAX_BATCH_SIZE, trackMapping } = require("./config");
+ 
+const {
+  genericpayloadValidator,
+  createObjectArray,
+  eventTypeMapping,
+  clickPayloadValidator
+} = require("./util");
+ 
+const trackResponseBuilder = (message, { Config }) => {
+  let event = getValueFromMessage(message, "event");
+  Iif (!event) {
+    throw new CustomError("event is required for track call", 400);
+  }
+  event = event.trim().toLowerCase();
+  let payload = constructPayload(message, trackMapping);
+  const eventMapping = eventTypeMapping(Config);
+  payload.eventName = event;
+  payload.eventType =
+    getValueFromMessage(message, "properties.eventType") || eventMapping[event];
+ 
+  if (!payload.eventType) {
+    throw new CustomError("eventType is mandatory for track call", 400);
+  }
+  payload = genericpayloadValidator(payload);
+ 
+  if (event === "product list viewed" || event === "order completed") {
+    const products = getValueFromMessage(message, "properties.products");
+    Eif (products) {
+      const { objectList, positionList } = createObjectArray(
+        products,
+        payload.eventType
+      );
+      const objLen = objectList.length;
+      const posLen = positionList.length;
+      Eif (objLen > 0) {
+        payload.objectIDs = objectList;
+        payload.objectIDs.splice(20);
+      }
+      if (posLen > 0) {
+        payload.positions = positionList;
+        payload.positions.splice(20);
+      }
+      // making size of object list and position list equal
+      Iif (posLen > 0 && objLen > 0 && posLen !== objLen) {
+        throw new CustomError(
+          "length of objectId and position should be equal",
+          400
+        );
+      }
+    }
+  }
+  // for all events either filter or objectID should be there
+  if (!payload.filters && !payload.objectIDs) {
+    throw new CustomError("Either filters or  objectIds is required.", 400);
+  }
+  Iif (payload.filters && payload.objectIDs) {
+    throw new CustomError(
+      "event can’t have both objectIds and filters at the same time.",
+      400
+    );
+  }
+  if (payload.eventType === "click") {
+    payload = clickPayloadValidator(payload); // click event validator
+  }
+  const response = defaultRequestConfig();
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.body.JSON = { events: [removeUndefinedAndNullValues(payload)] };
+  response.endpoint = ENDPOINT;
+  response.headers = {
+    "X-Algolia-Application-Id": Config.applicationId,
+    "X-Algolia-API-Key": Config.apiKey
+  };
+  return response;
+};
+ 
+const process = event => {
+  const { message, destination } = event;
+  Iif (!message.type) {
+    throw new CustomError(
+      "message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  Iif (!destination.Config.apiKey) {
+    throw new CustomError("Invalid Api Key", 400);
+  }
+  Iif (!destination.Config.applicationId) {
+    throw new CustomError("Invalid Application Id", 400);
+  }
+  const messageType = message.type.toLowerCase();
+ 
+  let response;
+  switch (messageType) {
+    case EventType.TRACK:
+      response = trackResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`message type ${messageType} not supported`, 400);
+  }
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const inputChunks = returnArrayOfSubarrays(inputs, MAX_BATCH_SIZE);
+  const successList = [];
+  const errorList = [];
+  inputChunks.forEach(chunk => {
+    const eventsList = [];
+    const metadataList = [];
+ 
+    // using the first destination Config in chunk for
+    // transforming the events in one chunk into a batch
+    const { destination } = chunk[0];
+    chunk.forEach(async input => {
+      try {
+        set(input, "destination", destination);
+        // input.destination = destination;
+        const transformedEvent = process(input);
+        eventsList.push(...transformedEvent.body.JSON.events);
+        metadataList.push(input.metadata);
+      } catch (error) {
+        errorList.push(
+          getErrorRespEvents(
+            [input.metadata],
+            error.response
+              ? error.response.status
+              : error.code
+              ? error.code
+              : 400,
+            error.message || "Error occurred while processing payload."
+          )
+        );
+      }
+    });
+ 
+    Eif (eventsList.length !== 0) {
+      // setting up the batched request json here
+      const batchedRequest = defaultRequestConfig();
+      batchedRequest.endpoint = ENDPOINT;
+      batchedRequest.headers = {
+        "X-Algolia-Application-Id": destination.Config.applicationId,
+        "X-Algolia-API-Key": destination.Config.apiKey
+      };
+      batchedRequest.body.JSON = { events: eventsList };
+ 
+      successList.push(
+        getSuccessRespEvents(batchedRequest, metadataList, destination, true)
+      );
+    }
+  });
+  return [...errorList, ...successList];
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/util.js.html new file mode 100644 index 00000000000..78899b19f5f --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/algolia/util.js.html @@ -0,0 +1,494 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/algolia/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/algolia util.js

+
+ +
+ 76.92% + Statements + 60/78 +
+ + +
+ 75.68% + Branches + 56/74 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 76.92% + Lines + 60/78 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +1391x +1x +1x +  +1x +10x +10x +10x +8x +10x +10x +10x +10x +  +  +  +  +10x +  +  +1x +9x +9x +9x +1x +  +  +  +  +8x +  +  +  +8x +5x +5x +  +  +  +  +8x +  +  +  +8x +  +  +8x +  +  +  +  +  +  +8x +  +  +8x +  +  +8x +  +1x +5x +5x +5x +5x +10x +10x +6x +6x +6x +  +  +  +  +  +  +4x +  +  +  +  +  +  +5x +  +  +1x +5x +5x +3x +  +  +  +3x +6x +5x +  +1x +1x +  +  +  +5x +3x +  +5x +2x +  +5x +2x +  +  +  +  +  +  +5x +3x +  +  +  +2x +  +  +  +  +  +3x +  +  +1x +  +  +  +  +  + 
const logger = require("../../../logger");
+const { CustomError } = require("../../util");
+const { EVENT_TYPES } = require("./config");
+ 
+const eventTypeMapping = Config => {
+  const eventMap = {};
+  let eventName = "";
+  if (Config.eventTypeSettings.length > 0) {
+    Config.eventTypeSettings.forEach(event => {
+      Eif (event.from && event.to) {
+        eventName = event.from.trim().toLowerCase();
+        Eif (!eventMap[eventName]) {
+          eventMap[eventName] = event.to.trim().toLowerCase();
+        }
+      }
+    });
+  }
+  return eventMap;
+};
+ 
+const genericpayloadValidator = payload => {
+  const updatedPayload = payload;
+  updatedPayload.eventType = payload.eventType.trim().toLowerCase();
+  if (!EVENT_TYPES.includes(payload.eventType)) {
+    throw new CustomError(
+      "eventType can be either click, view or conversion",
+      400
+    );
+  }
+  Iif (payload.filters && !Array.isArray(payload.filters)) {
+    updatedPayload.filters = null;
+    logger.error("filters should be an array of strings.");
+  }
+  if (payload.queryID) {
+    const re = /[0-9A-Fa-f]{6}/;
+    Iif (payload.queryID.length !== 32 || !re.test(String(payload.queryID))) {
+      updatedPayload.queryID = null;
+      logger.error("queryId must be 32 characters hexadecimal string.");
+    }
+  }
+  Iif (payload.objectIDs && !Array.isArray(payload.objectIDs)) {
+    updatedPayload.objectIDs = null;
+    logger.error("objectIds must be an array of strings");
+  }
+  Iif (payload.objectIDs && payload.objectIDs.length > 20) {
+    updatedPayload.objectIDs.splice(20);
+  }
+  Iif (payload.timestamp) {
+    const diff = Date.now() - payload.timestamp;
+    if (diff > 345600000) {
+      updatedPayload.timestamp = null;
+      logger.error("timestamp must be max 4 days old.");
+    }
+  }
+  Iif (payload.eventType !== "click" && payload.positions) {
+    updatedPayload.positions = null;
+  }
+  Iif (payload.filters && payload.filters.length > 10) {
+    updatedPayload.filters.splice(10);
+  }
+  return updatedPayload;
+};
+const createObjectArray = (objects, eventType) => {
+  const objectList = [];
+  const positionList = [];
+  Eif (objects.length > 0) {
+    objects.forEach((object, index) => {
+      Eif (object.objectId) {
+        if (eventType === "click") {
+          Eif (object.position) {
+            objectList.push(object.objectId);
+            positionList.push(object.position);
+          } else {
+            logger.info(
+              `object at index ${index} dropped. position is required if eventType is click`
+            );
+          }
+        } else {
+          objectList.push(object.objectId);
+        }
+      } else {
+        logger.error(`object at index ${index} dropped. objectId is required.`);
+      }
+    });
+  }
+  return { objectList, positionList };
+};
+ 
+const clickPayloadValidator = payload => {
+  const updatedPayload = payload;
+  if (payload.positions) {
+    Iif (!Array.isArray(payload.positions)) {
+      updatedPayload.positions = null;
+      logger.error("positions should be an array of integers.");
+    }
+    updatedPayload.positions.some((num, index) => {
+      if (!isNaN(Number(num)) && Number.isInteger(Number(num))) {
+        updatedPayload.positions[index] = Number(num);
+      } else {
+        updatedPayload.positions = null;
+        return false;
+      }
+    });
+  }
+  if (payload.objectIDs) {
+    updatedPayload.objectIDs.splice(20);
+  }
+  if (payload.positions) {
+    updatedPayload.positions.splice(20);
+  }
+  if (payload.objectIDs && payload.positions) {
+    Iif (payload.objectIDs.length !== payload.positions.length) {
+      throw new CustomError(
+        "length of objectId and position should be equal",
+        400
+      );
+    }
+  }
+  if (!payload.filters) {
+    if (
+      (payload.positions && !payload.queryID) ||
+      (!payload.positions && payload.queryID)
+    ) {
+      throw new CustomError(
+        "for click eventType either both positions and queryId should be present or none",
+        400
+      );
+    }
+  }
+  return updatedPayload;
+};
+ 
+module.exports = {
+  genericpayloadValidator,
+  createObjectArray,
+  eventTypeMapping,
+  clickPayloadValidator
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/am/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/am/config.js.html new file mode 100644 index 00000000000..7bea5ebdc77 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/am/config.js.html @@ -0,0 +1,476 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/am/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/am config.js

+
+ +
+ 100% + Statements + 13/13 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 13/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +1333x +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +  +3x +  +3x +3x +3x +3x +51x +  +3x +  +3x +  +  +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ConfigCategory = {
+  IDENTIFY: {
+    name: "AmplitudeIdentifyConfig"
+  },
+  PAGE: {
+    name: "AmplitudePageConfig"
+  },
+  SCREEN: {
+    name: "AmplitudeScreenConfig"
+  },
+  GROUP: {
+    name: "AmplitudeGroupConfig"
+  },
+  ALIAS: {
+    name: "AmplitudeAliasConfig"
+  },
+  PROMOTION_VIEWED: {
+    name: "AmplitudePromotionViewedConfig"
+  },
+  PROMOTION_CLICKED: {
+    name: "AmplitudePromotionClickedConfig"
+  },
+  PRODUCT: {
+    name: "AmplitudeProductActionsConfig"
+  },
+  REVENUE: {
+    name: "AmplitudeRevenueConfig"
+  },
+  DEFAULT: {
+    name: "AmplitudeDefaultConfig"
+  },
+  COMMON_CONFIG: {
+    name: "AmplitudeCommonConfig"
+  }
+};
+ 
+const Event = {
+  PRODUCT_LIST_VIEWED: {
+    name: "product list viewed",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_LIST_FILTERED: {
+    name: "product list filtered",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_LIST_CLICKED: {
+    name: "product list clicked",
+    category: ConfigCategory.PRODUCT
+  },
+  PROMOTION_VIEWED: {
+    name: "promotion viewed",
+    category: ConfigCategory.PROMOTION_VIEWED
+  },
+  PROMOTION_CLICKED: {
+    name: "promotion clicked",
+    category: ConfigCategory.PROMOTION_CLICKED
+  },
+  PRODUCT_CLICKED: {
+    name: "product clicked",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_VIEWED: {
+    name: "product viewed",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_ADDED: {
+    name: "product added",
+    category: ConfigCategory.PRODUCT
+  },
+  WISHLIST_PRODUCT_ADDED_TO_CART: {
+    name: "wishlist product added to cart",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_REMOVED: {
+    name: "product removed",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_REMOVED_FROM_WISHLIST: {
+    name: "product removed from wishlist",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_ADDED_TO_WISHLIST: {
+    name: "product added to wishlist",
+    category: ConfigCategory.PRODUCT
+  },
+  CHECKOUT_STARTED: {
+    name: "checkout started",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_UPDATED: {
+    name: "order updated",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_COMPLETED: {
+    name: "order completed",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_CANCELLED: {
+    name: "order cancelled",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_REFUNDED: {
+    name: "order refunded",
+    category: ConfigCategory.REFUND
+  }
+};
+ 
+const BASE_URL = "https://api.amplitude.com";
+const BASE_URL_EU = "https://api.eu.amplitude.com";
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+const batchEventsWithUserIdLengthLowerThanFive =
+  process.env.BATCH_NOT_MET_CRITERIA_USER === "true" || false;
+const nameToEventMap = {};
+const events = Object.keys(Event);
+events.forEach(event => {
+  nameToEventMap[Event[event].name] = Event[event];
+});
+const DESTINATION = "amplitude";
+ 
+module.exports = {
+  DESTINATION,
+  Event,
+  BASE_URL,
+  BASE_URL_EU,
+  ConfigCategory,
+  mappingConfig,
+  nameToEventMap,
+  batchEventsWithUserIdLengthLowerThanFive
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/am/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/am/index.html new file mode 100644 index 00000000000..8eac22e8f8c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/am/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/am + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/am

+
+ +
+ 93.56% + Statements + 407/435 +
+ + +
+ 85.61% + Branches + 238/278 +
+ + +
+ 95.45% + Functions + 42/44 +
+ + +
+ 93.56% + Lines + 407/435 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%13/13100%2/2100%1/1100%13/13
transform.js +
+
92.75%358/38684.15%207/24694.29%33/3592.75%358/386
utils.js +
+
100%36/3696.67%29/30100%8/8100%36/36
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/am/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/am/transform.js.html new file mode 100644 index 00000000000..9259e25f58e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/am/transform.js.html @@ -0,0 +1,3029 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/am/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/am transform.js

+
+ +
+ 92.75% + Statements + 358/386 +
+ + +
+ 84.15% + Branches + 207/246 +
+ + +
+ 94.29% + Functions + 33/35 +
+ + +
+ 92.75% + Lines + 358/386 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984  +  +  +3x +3x +  +  +  +  +  +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +  +  +  +  +  +  +  +3x +  +3x +  +3x +  +3x +3x +  +3x +  +123x +  +8x +8x +  +  +115x +  +123x +  +  +3x +90x +90x +  +  +3x +  +  +  +  +3x +22x +22x +  +  +3x +3x +3x +  +  +3x +8x +8x +  +  +  +65x +65x +14x +13x +  +1x +  +51x +  +  +  +65x +  +  +  +  +  +15x +15x +15x +  +  +  +  +15x +15x +15x +15x +  +  +  +15x +15x +  +  +  +15x +15x +  +  +  +16x +16x +16x +16x +  +  +  +8x +8x +16x +16x +  +8x +  +  +  +17x +  +17x +2x +2x +  +  +  +  +  +17x +2x +2x +  +  +  +  +  +17x +2x +2x +  +  +  +  +  +17x +2x +2x +  +  +  +  +  +17x +  +  +  +  +  +  +  +  +  +134x +134x +  +1702x +434x +434x +434x +  +  +  +  +  +  +  +  +434x +  +  +434x +4x +4x +  +  +430x +  +  +  +  +  +1268x +  +650x +650x +12x +  +638x +638x +600x +600x +78x +  +  +  +  +618x +618x +9x +  +609x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +69x +69x +69x +69x +69x +69x +  +  +  +69x +  +  +69x +  +69x +4x +4x +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +69x +  +  +  +  +  +  +  +  +69x +69x +  +  +  +  +  +  +69x +  +69x +42x +42x +  +  +  +  +  +69x +69x +  +  +  +  +  +69x +  +  +21x +  +21x +  +21x +  +  +18x +18x +17x +  +18x +  +  +  +18x +17x +101x +8x +8x +40x +  +  +40x +36x +  +  +  +  +  +  +  +93x +  +  +  +  +  +21x +  +  +3x +3x +3x +3x +  +  +  +  +  +  +21x +  +4x +4x +  +44x +44x +  +44x +41x +  +  +  +  +  +44x +44x +44x +  +15x +  +15x +15x +15x +15x +15x +  +  +44x +  +  +  +  +  +69x +69x +  +69x +  +  +  +  +4x +4x +1x +1x +1x +  +4x +4x +4x +4x +4x +  +  +  +4x +4x +  +65x +15x +14x +  +  +  +  +  +  +15x +15x +15x +  +15x +13x +5x +5x +8x +8x +  +  +  +  +65x +  +  +  +  +65x +  +  +  +  +  +51x +  +65x +  +65x +  +  +  +  +  +  +  +  +  +  +  +  +65x +65x +65x +65x +22x +22x +  +  +65x +65x +65x +65x +65x +65x +  +  +65x +65x +  +  +  +  +65x +  +  +  +65x +3x +3x +3x +3x +3x +3x +  +  +  +3x +  +65x +  +  +69x +  +  +  +  +  +70x +  +  +  +  +  +  +70x +70x +  +70x +70x +  +18x +18x +18x +18x +  +4x +  +  +4x +  +  +  +4x +4x +  +5x +  +  +  +5x +  +  +  +  +5x +5x +  +4x +4x +4x +  +  +  +4x +  +  +4x +4x +4x +4x +4x +  +  +  +  +4x +  +  +  +  +  +  +3x +3x +3x +  +3x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +4x +  +  +4x +4x +4x +  +35x +35x +  +  +  +  +  +  +  +  +  +  +  +  +35x +  +  +  +  +  +  +  +  +  +  +35x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +69x +  +  +  +  +  +  +  +  +  +  +10x +  +10x +  +10x +  +10x +8x +  +  +10x +10x +  +  +  +  +19x +  +  +19x +  +  +  +8x +8x +5x +  +  +5x +10x +10x +  +  +  +  +  +10x +  +  +8x +  +  +  +11x +11x +  +11x +5x +  +3x +  +  +2x +  +6x +  +  +  +2x +  +  +11x +5x +  +  +11x +  +11x +  +  +  +8x +  +  +  +8x +5x +  +  +11x +  +  +  +60x +60x +60x +60x +60x +25x +25x +11x +11x +21x +  +  +14x +  +  +35x +  +  +60x +70x +  +59x +  +  +  +22x +  +22x +22x +  +22x +22x +22x +  +  +22x +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +1x +  +  +22x +  +22x +22x +5x +5x +5x +  +  +  +5x +5x +  +  +  +17x +  +  +  +  +  +17x +17x +17x +  +  +  +  +17x +  +  +  +  +  +  +22x +  +  +  +5x +5x +  +  +  +  +  +  +  +5x +33x +33x +33x +33x +33x +  +  +  +  +  +33x +  +  +  +  +  +  +  +33x +  +  +  +  +  +33x +  +  +  +  +  +  +  +  +  +11x +11x +11x +11x +11x +  +  +22x +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +5x +5x +  +5x +  +  +3x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +3x +  +  +  +  +  +  +  +3x + 
/* eslint-disable no-lonely-if */
+/* eslint-disable no-nested-ternary */
+/* eslint-disable no-param-reassign */
+const get = require("get-value");
+const set = require("set-value");
+const {
+  EventType,
+  SpecedTraits,
+  TraitsMapping,
+  MappedToDestinationKey
+} = require("../../../constants");
+const { TRANSFORMER_METRIC } = require("../../util/constant");
+const {
+  addExternalIdToTraits,
+  adduserIdFromExternalId,
+  removeUndefinedValues,
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  defaultBatchRequestConfig,
+  getParsedIP,
+  getFieldValueFromMessage,
+  getValueFromMessage,
+  deleteObjectProperty,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  generateErrorObject,
+  removeUndefinedAndNullValues,
+  isDefinedAndNotNull,
+  isAppleFamily,
+  isDefinedAndNotNullAndNotEmpty
+} = require("../../util");
+const ErrorBuilder = require("../../util/error");
+const {
+  DESTINATION,
+  BASE_URL,
+  BASE_URL_EU,
+  ConfigCategory,
+  mappingConfig,
+  batchEventsWithUserIdLengthLowerThanFive
+} = require("./config");
+ 
+const AMUtils = require("./utils");
+ 
+const logger = require("../../../logger");
+ 
+const AMBatchSizeLimit = 20 * 1024 * 1024; // 20 MB
+const AMBatchEventLimit = 500; // event size limit from sdk is 32KB => 15MB
+ 
+const baseEndpoint = destConfig => {
+  let retVal;
+  switch (destConfig.residencyServer) {
+    case "EU":
+      retVal = BASE_URL_EU;
+      break;
+    default:
+      // "US" or when it is not specified
+      retVal = BASE_URL;
+  }
+  return retVal;
+};
+ 
+const defaultEndpoint = destConfig => {
+  const retVal = `${baseEndpoint(destConfig)}/2/httpapi`;
+  return retVal;
+};
+ 
+const identifyEndpoint = destConfig => {
+  const retVal = `${baseEndpoint(destConfig)}/identify`;
+  return retVal;
+};
+ 
+const batchEndpoint = destConfig => {
+  const retVal = `${baseEndpoint(destConfig)}/batch`;
+  return retVal;
+};
+ 
+const groupEndpoint = destConfig => {
+  const retVal = `${baseEndpoint(destConfig)}/groupidentify`;
+  return retVal;
+};
+ 
+const aliasEndpoint = destConfig => {
+  const retVal = `${baseEndpoint(destConfig)}/usermap`;
+  return retVal;
+};
+ 
+function getSessionId(payload) {
+  const sessionId = payload.session_id;
+  if (sessionId) {
+    if (typeof sessionId === "string") {
+      return sessionId.substr(sessionId.lastIndexOf(":") + 1, sessionId.length);
+    }
+    return sessionId;
+  }
+  return -1;
+}
+ 
+function addMinIdlength() {
+  return { min_id_length: 1 };
+}
+ 
+function setPriceQuanityInPayload(message, rawPayload) {
+  let price;
+  let quantity;
+  Eif (isDefinedAndNotNull(message.properties.price)) {
+    price = message.properties.price;
+    quantity = message.properties.quantity || 1;
+  } else {
+    price = message.properties.revenue;
+    quantity = 1;
+  }
+  rawPayload.price = price;
+  rawPayload.quantity = quantity;
+  rawPayload.revenue = message.properties.revenue;
+  return rawPayload;
+}
+ 
+function createRevenuePayload(message, rawPayload) {
+  rawPayload.productId = message.properties.product_id;
+  rawPayload.revenueType =
+    message.properties.revenueType ||
+    message.properties.revenue_type ||
+    "Purchased";
+  rawPayload = setPriceQuanityInPayload(message, rawPayload);
+  return rawPayload;
+}
+ 
+function updateTraitsObject(property, traitsObject, actionKey) {
+  const propertyToUpdate = getValueFromMessage(traitsObject, property);
+  traitsObject[actionKey][property] = propertyToUpdate;
+  deleteObjectProperty(traitsObject, property);
+  return traitsObject;
+}
+ 
+function prepareTraitsConfig(configPropertyTrait, actionKey, traitsObject) {
+  traitsObject[actionKey] = {};
+  configPropertyTrait.forEach(traitsElement => {
+    const property = traitsElement.traits;
+    traitsObject = updateTraitsObject(property, traitsObject, actionKey);
+  });
+  return traitsObject;
+}
+ 
+function handleTraits(messageTrait, destination) {
+  let traitsObject = JSON.parse(JSON.stringify(messageTrait));
+ 
+  if (destination.Config.traitsToIncrement) {
+    const actionKey = "$add";
+    traitsObject = prepareTraitsConfig(
+      destination.Config.traitsToIncrement,
+      actionKey,
+      traitsObject
+    );
+  }
+  if (destination.Config.traitsToSetOnce) {
+    const actionKey = "$setOnce";
+    traitsObject = prepareTraitsConfig(
+      destination.Config.traitsToSetOnce,
+      actionKey,
+      traitsObject
+    );
+  }
+  if (destination.Config.traitsToAppend) {
+    const actionKey = "$append";
+    traitsObject = prepareTraitsConfig(
+      destination.Config.traitsToAppend,
+      actionKey,
+      traitsObject
+    );
+  }
+  if (destination.Config.traitsToPrepend) {
+    const actionKey = "$prepend";
+    traitsObject = prepareTraitsConfig(
+      destination.Config.traitsToPrepend,
+      actionKey,
+      traitsObject
+    );
+  }
+  return traitsObject;
+}
+ 
+function updateConfigProperty(
+  message,
+  payload,
+  mappingJson,
+  validatePayload,
+  Config
+) {
+  const sourceKeys = Object.keys(mappingJson);
+  sourceKeys.forEach(sourceKey => {
+    // check if custom processing is required on the payload sourceKey ==> destKey
+    if (typeof mappingJson[sourceKey] === "object") {
+      const { isFunc, funcName, outKey } = mappingJson[sourceKey];
+      Eif (isFunc) {
+        Iif (validatePayload) {
+          const data = get(payload, outKey);
+          if (!isDefinedAndNotNull(data)) {
+            const val = AMUtils[funcName](message, sourceKey, Config);
+            if (val || val === false || val === 0) {
+              set(payload, outKey, val);
+            }
+          }
+        } else {
+          const data = get(message.traits, outKey); // when in identify(or any other call) it checks whether outKey is present in traits
+          // then that value is assigned else function is applied.
+          // that key (outKey) will be a default key for reverse ETL and thus removed from the payload.
+          if (isDefinedAndNotNull(data)) {
+            set(payload, outKey, data);
+            delete message.traits[outKey];
+          } else {
+            // get the destKey/outKey value from calling the util function
+            set(payload, outKey, AMUtils[funcName](message, sourceKey, Config));
+          }
+        }
+      }
+    } else {
+      // For common config
+      if (validatePayload) {
+        // if data is present in traits assign
+        const messageData = get(message.traits, mappingJson[sourceKey]);
+        if (isDefinedAndNotNull(messageData)) {
+          set(payload, mappingJson[sourceKey], messageData);
+        } else {
+          const data = get(payload, mappingJson[sourceKey]);
+          if (!isDefinedAndNotNull(data)) {
+            const val = get(message, sourceKey);
+            if (val || val === false || val === 0) {
+              set(payload, mappingJson[sourceKey], val);
+            }
+          }
+        }
+      } else {
+        const data = get(message.traits, mappingJson[sourceKey]);
+        if (isDefinedAndNotNull(data)) {
+          set(payload, mappingJson[sourceKey], data);
+        } else {
+          set(payload, mappingJson[sourceKey], get(message, sourceKey));
+        }
+      }
+    }
+  });
+}
+ 
+function responseBuilderSimple(
+  groupInfo,
+  rootElementName,
+  message,
+  evType,
+  mappingJson,
+  destination
+) {
+  let rawPayload = {};
+  const addOptions = "options";
+  const respList = [];
+  const response = defaultRequestConfig();
+  const groupResponse = defaultRequestConfig();
+  const aliasResponse = defaultRequestConfig();
+ 
+  let groups;
+ 
+  let endpoint = defaultEndpoint(destination.Config);
+  let traits;
+ 
+  Eif (EventType.IDENTIFY) {
+    // If mapped to destination, Add externalId to traits
+    if (get(message, MappedToDestinationKey)) {
+      addExternalIdToTraits(message);
+      const identifierType = get(
+        message,
+        "context.externalId.0.identifierType"
+      );
+      Iif (identifierType === "user_id") {
+        // this can be either device_id / user_id
+        adduserIdFromExternalId(message);
+      }
+    }
+  }
+ 
+  // 1. first populate the dest keys from the config files.
+  // Group config file is similar to Identify config file
+  // because we need to make an identify call too along with group entity update
+  // to link the user to the partuclar group name/value. (pass in "groups" key to https://api.amplitude.com/2/httpapi where event_type: $identify)
+  // Additionally, we will update the user_properties with groupName:groupValue
+  updateConfigProperty(
+    message,
+    rawPayload,
+    mappingJson,
+    false,
+    destination.Config
+  );
+ 
+  // 2. get campaign info (only present for JS sdk and http calls)
+  const campaign = get(message, "context.campaign") || {};
+  const initialRef = {
+    initial_referrer: get(message, "context.page.initial_referrer"),
+    initial_referring_domain: get(
+      message,
+      "context.page.initial_referring_domain"
+    )
+  };
+  const oldKeys = Object.keys(campaign);
+  // appends utm_ prefix to all the keys of campaign object. For example the `name` key in campaign object will be changed to `utm_name`
+  oldKeys.forEach(oldKey => {
+    Object.assign(campaign, { [`utm_${oldKey}`]: campaign[oldKey] });
+    delete campaign[oldKey];
+  });
+ 
+  // append campaign info extracted above(2.) to user_properties.
+  // AM sdk's have a flag that captures the UTM params(https://amplitude.github.io/Amplitude-JavaScript/#amplitudeclientinit)
+  // but http api docs don't have any such specific keys to send the UTMs, so attaching to user_properties
+  rawPayload.user_properties = rawPayload.user_properties || {};
+  rawPayload.user_properties = {
+    ...rawPayload.user_properties,
+    ...initialRef,
+    ...campaign
+  };
+ 
+  switch (evType) {
+    case EventType.IDENTIFY:
+    case EventType.GROUP:
+      endpoint = defaultEndpoint(destination.Config);
+      // event_type for identify event is $identify
+      rawPayload.event_type = EventType.IDENTIFY_AM;
+ 
+      if (evType === EventType.IDENTIFY) {
+        // update payload user_properties from userProperties/traits/context.traits/nested traits of Rudder message
+        // traits like address converted to top level useproperties (think we can skip this extra processing as AM supports nesting upto 40 levels)
+        traits = getFieldValueFromMessage(message, "traits");
+        if (traits) {
+          traits = handleTraits(traits, destination);
+        }
+        rawPayload.user_properties = {
+          ...rawPayload.user_properties,
+          ...message.userProperties
+        };
+        if (traits) {
+          Object.keys(traits).forEach(trait => {
+            if (SpecedTraits.includes(trait)) {
+              const mapping = TraitsMapping[trait];
+              Object.keys(mapping).forEach(key => {
+                const checkKey = get(rawPayload.user_properties, key);
+                // this is done only if we want to add default values under address to the user_properties
+                // these values are also sent to the destination at the top level.
+                if (!isDefinedAndNotNull(checkKey)) {
+                  set(
+                    rawPayload,
+                    `user_properties.${key}`,
+                    get(traits, mapping[key])
+                  );
+                }
+              });
+            } else {
+              set(rawPayload, `user_properties.${trait}`, get(traits, trait));
+            }
+          });
+        }
+      }
+ 
+      if (evType === EventType.GROUP) {
+        // for Rudder group call, update the user_properties with group info
+        // Refer (1.)
+        Eif (groupInfo && groupInfo.group_type && groupInfo.group_value) {
+          groups = {};
+          groups[groupInfo.group_type] = groupInfo.group_value;
+          set(
+            rawPayload,
+            `user_properties.${[groupInfo.group_type]}`,
+            groupInfo.group_value
+          );
+        }
+      }
+      break;
+    case EventType.ALIAS:
+      endpoint = aliasEndpoint(destination.Config);
+      break;
+    default:
+      traits = getFieldValueFromMessage(message, "traits");
+      set(rawPayload, "event_properties", message.properties);
+ 
+      if (traits) {
+        rawPayload.user_properties = {
+          ...rawPayload.user_properties,
+          ...traits
+        };
+      }
+ 
+      rawPayload.event_type = evType;
+      rawPayload.user_id = message.userId;
+      if (message.isRevenue) {
+        // making the revenue payload
+        rawPayload = createRevenuePayload(message, rawPayload);
+        // deleting the properties price, product_id, quantity and revenue from evemt_properties since it is already in root
+        Eif (rawPayload.event_properties) {
+          delete rawPayload.event_properties.price;
+          delete rawPayload.event_properties.product_id;
+          delete rawPayload.event_properties.quantity;
+          delete rawPayload.event_properties.revenue;
+        }
+      }
+      groups = groupInfo && Object.assign(groupInfo);
+  }
+ 
+  // for  https://api.amplitude.com/2/httpapi , pass the "groups" key
+  // refer (1.) for passing "groups" for Rudder group call
+  // https://developers.amplitude.com/docs/http-api-v2#schemaevent
+  set(rawPayload, "groups", groups);
+  let payload = removeUndefinedValues(rawPayload);
+  let unmapUserId;
+  switch (evType) {
+    case EventType.ALIAS:
+      // By default (1.), Alias config file populates user_id and global_user_id
+      // if the alias Rudder call has unmap set, delete the global_user_id key from AM event payload
+      // https://help.amplitude.com/hc/en-us/articles/360002750712-Portfolio-Cross-Project-Analysis#h_76557c8b-54cd-4e28-8c82-2f6778f65cd4
+      unmapUserId = get(message, "integrations.Amplitude.unmap");
+      if (unmapUserId) {
+        payload.user_id = unmapUserId;
+        delete payload.global_user_id;
+        payload.unmap = true;
+      }
+      aliasResponse.method = defaultPostRequestConfig.requestMethod;
+      aliasResponse.endpoint = aliasEndpoint(destination.Config);
+      aliasResponse.userId = message.anonymousId;
+      payload = removeUndefinedValues(payload);
+      aliasResponse.body.FORM = {
+        api_key: destination.Config.apiKey,
+        [rootElementName]: [JSON.stringify(payload)]
+      };
+      respList.push(aliasResponse);
+      break;
+    default:
+      if (message.channel === "mobile") {
+        if (!destination.Config.mapDeviceBrand) {
+          set(
+            payload,
+            "device_brand",
+            get(message, "context.device.manufacturer")
+          );
+        }
+ 
+        const deviceId = get(message, "context.device.id");
+        const platform = get(message, "context.device.type");
+        const advertId = get(message, "context.device.advertisingId");
+ 
+        if (platform) {
+          if (isAppleFamily(platform)) {
+            set(payload, "idfa", advertId);
+            set(payload, "idfv", deviceId);
+          } else Eif (platform.toLowerCase() === "android") {
+            set(payload, "adid", advertId);
+          }
+        }
+      }
+ 
+      payload.time = new Date(
+        getFieldValueFromMessage(message, "timestamp")
+      ).getTime();
+ 
+      // send user_id only when present, for anonymous users not required
+      if (
+        message.userId &&
+        message.userId !== "" &&
+        message.userId !== "null" &&
+        message.userId !== null
+      ) {
+        payload.user_id = message.userId;
+      }
+      payload.session_id = getSessionId(payload);
+ 
+      updateConfigProperty(
+        message,
+        payload,
+        mappingConfig[ConfigCategory.COMMON_CONFIG.name],
+        true,
+        destination.Config
+      );
+ 
+      // we are not fixing the verson for android specifically any more because we've put a fix in iOS SDK
+      // for correct versionName
+      // ====================
+      // fixVersion(payload, message);
+ 
+      Eif (payload.user_properties) {
+        delete payload.user_properties.city;
+        delete payload.user_properties.country;
+        if (payload.user_properties.address) {
+          delete payload.user_properties.address.city;
+          delete payload.user_properties.address.country;
+        }
+      }
+      payload.ip = getParsedIP(message);
+      payload.library = "rudderstack";
+      payload = removeUndefinedAndNullValues(payload);
+      response.endpoint = endpoint;
+      response.method = defaultPostRequestConfig.requestMethod;
+      response.headers = {
+        "Content-Type": "application/json"
+      };
+      response.userId = message.anonymousId;
+      response.body.JSON = {
+        api_key: destination.Config.apiKey,
+        [rootElementName]: [payload],
+        [addOptions]: addMinIdlength()
+      };
+      respList.push(response);
+ 
+      // https://developers.amplitude.com/docs/group-identify-api
+      // Refer (1.), Rudder group call updates group propertiees.
+      if (evType === EventType.GROUP && groupInfo) {
+        groupResponse.method = defaultPostRequestConfig.requestMethod;
+        groupResponse.endpoint = groupEndpoint(destination.Config);
+        let groupPayload = Object.assign(groupInfo);
+        groupResponse.userId = message.anonymousId;
+        groupPayload = removeUndefinedValues(groupPayload);
+        groupResponse.body.FORM = {
+          api_key: destination.Config.apiKey,
+          identification: [JSON.stringify(groupPayload)]
+        };
+        respList.push(groupResponse);
+      }
+      break;
+  }
+ 
+  return respList;
+}
+ 
+// Generic process function which invokes specific handler functions depending on message type
+// and event type where applicable
+function processSingleMessage(message, destination) {
+  let payloadObjectName = "events";
+  let evType;
+  let groupTraits;
+  let groupTypeTrait;
+  let groupValueTrait;
+  // It is expected that Rudder alias. identify group calls won't have this set
+  // To be used for track/page calls to associate the event to a group in AM
+  let groupInfo = get(message, "integrations.Amplitude.groups") || undefined;
+  let category = ConfigCategory.DEFAULT;
+ 
+  const messageType = message.type.toLowerCase();
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      payloadObjectName = "events"; // identify same as events
+      evType = "identify";
+      category = ConfigCategory.IDENTIFY;
+      break;
+    case EventType.PAGE:
+      evType = `Viewed ${message.name ||
+        get(message, "properties.category") ||
+        ""} Page`;
+      message.properties = {
+        ...message.properties,
+        name: message.name || get(message, "properties.category")
+      };
+      category = ConfigCategory.PAGE;
+      break;
+    case EventType.SCREEN:
+      evType = `Viewed ${message.name ||
+        message.event ||
+        get(message, "properties.category") ||
+        ""} Screen`;
+      message.properties = {
+        ...message.properties,
+        name:
+          message.name || message.event || get(message, "properties.category")
+      };
+      category = ConfigCategory.SCREEN;
+      break;
+    case EventType.GROUP:
+      evType = "group";
+      payloadObjectName = "events";
+      category = ConfigCategory.GROUP;
+      // read from group traits from message
+      // groupTraits => top level "traits" for JS SDK
+      // groupTraits => "context.traits" for mobile SDKs
+      groupTraits = getFieldValueFromMessage(message, "groupTraits");
+      // read destination config related group settings
+      // https://developers.amplitude.com/docs/group-identify-api
+      groupTypeTrait = get(destination, "Config.groupTypeTrait");
+      groupValueTrait = get(destination, "Config.groupValueTrait");
+      Eif (groupTypeTrait && groupValueTrait) {
+        const groupTypeValue = get(groupTraits, groupTypeTrait);
+        const groupNameValue = get(groupTraits, groupValueTrait);
+        // since the property updates on group at https://api2.amplitude.com/groupidentify
+        // expects a string group name and value , so error out if the keys are not primitive
+        // Note: This different for groups object at https://api.amplitude.com/2/httpapi where the
+        // group value can be array of strings as well.
+        if (
+          groupTypeValue &&
+          typeof groupTypeValue === "string" &&
+          groupNameValue &&
+          (typeof groupNameValue === "string" ||
+            typeof groupNameValue === "number")
+        ) {
+          groupInfo = {};
+          groupInfo.group_type = groupTypeValue;
+          groupInfo.group_value = groupNameValue;
+          // passing the entire group traits without deleting the above keys
+          groupInfo.group_properties = groupTraits;
+        } else {
+          logger.debug("Group call parameters are not valid");
+          throw new ErrorBuilder()
+            .setStatus(400)
+            .setMessage("Group call parameters are not valid")
+            .setStatTags({
+              destination: DESTINATION,
+              stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+              scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+              meta:
+                TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META
+                  .INSTRUMENTATION
+            })
+            .build();
+        }
+      }
+      break;
+    case EventType.ALIAS:
+      evType = "alias";
+      // the alias call params end up under "mapping" params
+      // https://help.amplitude.com/hc/en-us/articles/360002750712-Portfolio-Cross-Project-Analysis#h_76557c8b-54cd-4e28-8c82-2f6778f65cd4
+      payloadObjectName = "mapping";
+      category = ConfigCategory.ALIAS;
+      break;
+    case EventType.TRACK:
+      evType = message.event;
+      Iif (!isDefinedAndNotNullAndNotEmpty(evType)) {
+        throw new ErrorBuilder()
+          .setStatus(400)
+          .setMessage("message type not defined")
+          .setStatTags({
+            destination: DESTINATION,
+            stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+            scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+            meta:
+              TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_EVENT
+          })
+          .build();
+      }
+      Iif (
+        message.properties &&
+        isDefinedAndNotNull(message.properties.revenue) &&
+        isDefinedAndNotNull(message.properties.revenue_type)
+      ) {
+        // if properties has revenue and revenue_type fields
+        // consider the event as revenue event directly
+        category = ConfigCategory.REVENUE;
+        break;
+      }
+ 
+      break;
+    default:
+      logger.debug("could not determine type");
+      throw new ErrorBuilder()
+        .setStatus(400)
+        .setMessage("message type not supported")
+        .setStatTags({
+          destination: DESTINATION,
+          stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+          scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+          meta:
+            TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_EVENT
+        })
+        .build();
+  }
+  return responseBuilderSimple(
+    groupInfo,
+    payloadObjectName,
+    message,
+    evType,
+    mappingConfig[category.name],
+    destination
+  );
+}
+ 
+function createProductPurchasedEvent(message, destination, product, counter) {
+  const eventClonePurchaseProduct = JSON.parse(JSON.stringify(message));
+ 
+  eventClonePurchaseProduct.event = "Product Purchased";
+  // In product purchased event event properties consists of the details of each product
+  eventClonePurchaseProduct.properties = product;
+ 
+  if (destination.Config.trackRevenuePerProduct === true) {
+    eventClonePurchaseProduct.isRevenue = true;
+  }
+  // need to modify the message id of each newly created event, as it is mapped to insert_id and that is used by Amplitude for dedup.
+  eventClonePurchaseProduct.messageId = `${message.messageId}-${counter}`;
+  return eventClonePurchaseProduct;
+}
+ 
+function isProductArrayInPayload(message) {
+  const isProductArray =
+    (message.properties.products &&
+      Array.isArray(message.properties.products) &&
+      message.properties.products.length > 0) === true;
+  return isProductArray;
+}
+ 
+function getProductPurchasedEvents(message, destination) {
+  const productPurchasedEvents = [];
+  if (isProductArrayInPayload(message)) {
+    let counter = 0;
+ 
+    // Create product purchased event for each product in products array.
+    message.properties.products.forEach(product => {
+      counter += 1;
+      const productPurchasedEvent = createProductPurchasedEvent(
+        message,
+        destination,
+        product,
+        counter
+      );
+      productPurchasedEvents.push(productPurchasedEvent);
+    });
+  }
+  return productPurchasedEvents;
+}
+ 
+function trackRevenueEvent(message, destination) {
+  let sendEvents = [];
+  const originalEvent = JSON.parse(JSON.stringify(message));
+ 
+  if (destination.Config.trackProductsOnce === false) {
+    if (isProductArrayInPayload(message)) {
+      // when trackProductsOnce false no product array present
+      delete originalEvent.properties.products;
+    } else {
+      // when product array is not there in payload, will track the revenue of the original event.
+      originalEvent.isRevenue = true;
+    }
+  } else if (!isProductArrayInPayload(message)) {
+    // when the user enables both trackProductsOnce and trackRevenuePerProduct, we will track revenue on each product level.
+    // So, if trackProductsOnce is true and there is no products array in payload, we will track the revenue of original event.
+    // when trackRevenuePerProduct is false, track the revenue of original event - that is handled in next if block.
+    originalEvent.isRevenue = true;
+  }
+  // when trackRevenuePerProduct is false, track the revenue of original event.
+  if (destination.Config.trackRevenuePerProduct === false) {
+    originalEvent.isRevenue = true;
+  }
+ 
+  sendEvents.push(originalEvent);
+ 
+  if (
+    destination.Config.trackRevenuePerProduct === true ||
+    destination.Config.trackProductsOnce === false
+  ) {
+    const productPurchasedEvents = getProductPurchasedEvents(
+      message,
+      destination
+    );
+    if (productPurchasedEvents.length > 0) {
+      sendEvents = [...sendEvents, ...productPurchasedEvents];
+    }
+  }
+  return sendEvents;
+}
+ 
+function process(event) {
+  const respList = [];
+  const { message, destination } = event;
+  const messageType = message.type.toLowerCase();
+  const toSendEvents = [];
+  if (messageType === EventType.TRACK) {
+    const { properties } = message;
+    if (properties && isDefinedAndNotNull(properties.revenue)) {
+      const revenueEvents = trackRevenueEvent(message, destination);
+      revenueEvents.forEach(revenueEvent => {
+        toSendEvents.push(revenueEvent);
+      });
+    } else {
+      toSendEvents.push(message);
+    }
+  } else {
+    toSendEvents.push(message);
+  }
+ 
+  toSendEvents.forEach(sendEvent => {
+    respList.push(...processSingleMessage(sendEvent, destination));
+  });
+  return respList;
+}
+ 
+function getBatchEvents(message, destination, metadata, batchEventResponse) {
+  let batchComplete = false;
+  const batchEventArray =
+    get(batchEventResponse, "batchedRequest.body.JSON.events") || [];
+  const batchEventJobs = get(batchEventResponse, "metadata") || [];
+  const batchPayloadJSON =
+    get(batchEventResponse, "batchedRequest.body.JSON") || {};
+  const incomingMessageJSON = get(message, "body.JSON");
+  let incomingMessageEvent = get(message, "body.JSON.events");
+  // check if the incoming singular event is an array or not
+  // and set it back to array
+  incomingMessageEvent = Array.isArray(incomingMessageEvent)
+    ? incomingMessageEvent[0]
+    : incomingMessageEvent;
+  const userId = incomingMessageEvent.user_id;
+ 
+  // delete the userId as it is less than 5 as AM is giving 400
+  // that is not a documented behviour where it states if either deviceid or userid is present
+  // batch request won't return 400
+  //   {
+  //     "code": 400,
+  //     "events_with_invalid_id_lengths": {
+  //         "user_id": [
+  //             0
+  //         ]
+  //     },
+  //     "error": "Invalid id length for user_id or device_id"
+  // }
+  if (batchEventsWithUserIdLengthLowerThanFive && userId && userId.length < 5) {
+    delete incomingMessageEvent.user_id;
+  }
+ 
+  set(message, "body.JSON.events", [incomingMessageEvent]);
+  // if this is the first event, push to batch and return
+  const BATCH_ENDPOINT = batchEndpoint(destination.Config);
+  if (batchEventArray.length === 0) {
+    Eif (JSON.stringify(incomingMessageJSON).length < AMBatchSizeLimit) {
+      delete message.body.JSON.options;
+      batchEventResponse = Object.assign(batchEventResponse, {
+        batchedRequest: message
+      });
+ 
+      set(batchEventResponse, "batchedRequest.endpoint", BATCH_ENDPOINT);
+      batchEventResponse.metadata = [metadata];
+    }
+  } else {
+    // https://developers.amplitude.com/docs/batch-event-upload-api#feature-comparison-between-httpapi-2httpapi--batch
+    Eif (
+      batchEventArray.length < AMBatchEventLimit &&
+      JSON.stringify(batchPayloadJSON).length +
+        JSON.stringify(incomingMessageEvent).length <
+        AMBatchSizeLimit
+    ) {
+      batchEventArray.push(incomingMessageEvent); // set value
+      batchEventJobs.push(metadata);
+      set(
+        batchEventResponse,
+        "batchedRequest.body.JSON.events",
+        batchEventArray
+      );
+      set(batchEventResponse, "metadata", batchEventJobs);
+    } else {
+      // event could not be pushed
+      // it will be pushed again by a call from the caller of this method
+      batchComplete = true;
+    }
+  }
+  return batchComplete;
+}
+ 
+function batch(destEvents) {
+  const respList = [];
+  let batchEventResponse = defaultBatchRequestConfig();
+  let response;
+  let isBatchComplete;
+  let jsonBody;
+  let userId;
+  let deviceId;
+  let messageEvent;
+  let destinationObject;
+  destEvents.forEach(ev => {
+    const { message, metadata, destination } = ev;
+    destinationObject = { ...destination };
+    jsonBody = get(message, "body.JSON");
+    messageEvent = get(message, "body.JSON.events");
+    userId =
+      messageEvent && Array.isArray(messageEvent)
+        ? messageEvent[0].user_id
+        : messageEvent
+        ? messageEvent.user_id
+        : undefined;
+    deviceId =
+      messageEvent && Array.isArray(messageEvent)
+        ? messageEvent[0].device_id
+        : messageEvent
+        ? messageEvent.device_id
+        : undefined;
+    // this case shold not happen and should be filtered already
+    // by the first pass of single event transformation
+    Iif (messageEvent && !userId && !deviceId) {
+      return;
+    }
+    // check if not a JSON body or (userId length < 5 && batchEventsWithUserIdLengthLowerThanFive is false) or
+    // (batchEventsWithUserIdLengthLowerThanFive is true and userId is less than 5 but deviceId not present)
+    // , send the event as is after batching
+    if (
+      Object.keys(jsonBody).length === 0 ||
+      (!batchEventsWithUserIdLengthLowerThanFive &&
+        userId &&
+        userId.length < 5) ||
+      (batchEventsWithUserIdLengthLowerThanFive &&
+        userId &&
+        userId.length < 5 &&
+        !deviceId)
+    ) {
+      response = defaultBatchRequestConfig();
+      response = Object.assign(response, { batchedRequest: message });
+      response.metadata = [metadata];
+      response.destination = destinationObject;
+      respList.push(response);
+    } else {
+      // check if the event can be pushed to an existing batch
+      isBatchComplete = getBatchEvents(
+        message,
+        destination,
+        metadata,
+        batchEventResponse
+      );
+      Iif (isBatchComplete) {
+        // if the batch is already complete, push it to response list
+        // and push the event to a new batch
+        batchEventResponse.destination = destinationObject;
+        respList.push({ ...batchEventResponse });
+        batchEventResponse = defaultBatchRequestConfig();
+        batchEventResponse.destination = destinationObject;
+        isBatchComplete = getBatchEvents(
+          message,
+          destination,
+          metadata,
+          batchEventResponse
+        );
+      }
+    }
+  });
+  // if there is some unfinished batch push it to response list
+  Eif (isBatchComplete !== undefined && isBatchComplete === false) {
+    batchEventResponse.destination = destinationObject;
+    respList.push(batchEventResponse);
+  }
+  return respList;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        const errRes = generateErrorObject(
+          error,
+          DESTINATION,
+          TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM
+        );
+        return getErrorRespEvents(
+          [input.metadata],
+          error.status || 400,
+          error.message || "Error occurred while processing payload.",
+          errRes.statTags
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+const responseTransform = input => {
+  return {
+    status: 200,
+    destination: { ...input },
+    message: "Processed Successfully"
+  };
+};
+ 
+module.exports = { process, processRouterDest, batch, responseTransform };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/am/utils.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/am/utils.js.html new file mode 100644 index 00000000000..3d7661876e2 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/am/utils.js.html @@ -0,0 +1,359 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/am/utils.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/am utils.js

+
+ +
+ 100% + Statements + 36/36 +
+ + +
+ 96.67% + Branches + 29/30 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 100% + Lines + 36/36 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94  +  +  +  +  +  +  +  +  +  +3x +3x +3x +3x +  +  +84x +84x +84x +  +  +  +60x +60x +22x +  +38x +  +  +  +56x +  +56x +18x +  +38x +  +  +  +60x +  +60x +22x +  +38x +  +  +  +60x +  +60x +22x +  +38x +  +  +  +60x +60x +  +  +  +  +  +  +  +65x +3x +3x +  +62x +  +  +  +69x +  +69x +9x +1x +8x +  +61x +  +  +3x +  +  +  +  +  +  +  +  + 
/* eslint-disable no-nested-ternary */
+// We want to send the following kind of device properties from web platform
+// which is not readily available, so have to parse the user-agent
+// using similar  ua parsing logic used by AM native web sdk
+// "platform": "Web",
+// "os_name": "Chrome",
+// "os_version": "85",
+// "device_model": "Mac"
+// Note: for http source still the direct mapping from payload sourceKeys is used to
+// populate these dest keys
+const logger = require("../../../logger");
+const get = require("get-value");
+const uaParser = require("@amplitude/ua-parser-js");
+const { isDefined, isDefinedAndNotNull } = require("../../util");
+ 
+function getInfoFromUA(path, payload, defaultVal) {
+  const ua = get(payload, "context.userAgent");
+  const devInfo = ua ? uaParser(ua) : {};
+  return get(devInfo, path) || defaultVal;
+}
+ 
+function getOSName(payload, sourceKey) {
+  const payloadVal = get(payload, sourceKey);
+  if (payload.channel && payload.channel.toLowerCase() === "web") {
+    return getInfoFromUA("browser.name", payload, payloadVal);
+  }
+  return payloadVal;
+}
+ 
+function getOSVersion(payload, sourceKey) {
+  const payloadVal = get(payload, sourceKey);
+ 
+  if (payload.channel && payload.channel.toLowerCase() === "web") {
+    return getInfoFromUA("browser.version", payload, payloadVal);
+  }
+  return payloadVal;
+}
+ 
+function getDeviceModel(payload, sourceKey) {
+  const payloadVal = get(payload, sourceKey);
+ 
+  if (payload.channel && payload.channel.toLowerCase() === "web") {
+    return getInfoFromUA("os.name", payload, payloadVal);
+  }
+  return payloadVal;
+}
+ 
+function getDeviceManufacturer(payload, sourceKey) {
+  const payloadVal = get(payload, sourceKey);
+ 
+  if (payload.channel && payload.channel.toLowerCase() === "web") {
+    return getInfoFromUA("device.vendor", payload, payloadVal);
+  }
+  return payloadVal;
+}
+ 
+function getPlatform(payload, sourceKey) {
+  const payloadVal = get(payload, sourceKey);
+  return payload.channel
+    ? payload.channel.toLowerCase() === "web"
+      ? "Web"
+      : payloadVal
+    : payloadVal;
+}
+ 
+function getBrand(payload, sourceKey, Config) {
+  if (Config.mapDeviceBrand) {
+    const payloadVal = get(payload, sourceKey);
+    return payloadVal;
+  }
+  return undefined;
+}
+ 
+function getEventId(payload, sourceKey) {
+  const eventId = get(payload, sourceKey);
+ 
+  if (isDefinedAndNotNull(eventId)) {
+    if (typeof eventId === "string") {
+      logger.info(`event_id should be integer only`);
+    } else return eventId;
+  }
+  return undefined;
+}
+ 
+module.exports = {
+  getOSName,
+  getOSVersion,
+  getDeviceModel,
+  getDeviceManufacturer,
+  getPlatform,
+  getBrand,
+  getEventId
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/appcues/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/appcues/config.js.html new file mode 100644 index 00000000000..a422c0d0e36 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/appcues/config.js.html @@ -0,0 +1,173 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/appcues/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/appcues config.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +321x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +  +  +1x +  +1x +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ConfigCategory = {
+  IDENTIFY: {
+    name: "AppcuesIdentifyConfig"
+  },
+  TRACK: {
+    name: "AppcuesTrackConfig"
+  },
+  PAGETRACK: {
+    name: "AppcuesPageTrack"
+  },
+  PAGEPROFILE: {
+    name: "AppcuesPageProfile"
+  },
+  DEFAULT: {
+    name: "AppcuesDefaultConfig"
+  }
+};
+ 
+function getEndpoint(accountId, userId) {
+  return `https://api.appcues.com/v1/accounts/${accountId}/users/${userId}/activity`;
+}
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+module.exports = {
+  ConfigCategory,
+  mappingConfig,
+  getEndpoint
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/appcues/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/appcues/index.html new file mode 100644 index 00000000000..21e85f778b6 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/appcues/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/appcues + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/appcues

+
+ +
+ 92% + Statements + 46/50 +
+ + +
+ 61.9% + Branches + 13/21 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 92% + Lines + 46/50 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%5/5100%0/0100%1/1100%5/5
transform.js +
+
91.11%41/4561.9%13/21100%6/691.11%41/45
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/appcues/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/appcues/transform.js.html new file mode 100644 index 00000000000..3b215e1a02d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/appcues/transform.js.html @@ -0,0 +1,557 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/appcues/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/appcues transform.js

+
+ +
+ 91.11% + Statements + 41/45 +
+ + +
+ 61.9% + Branches + 13/21 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 91.11% + Lines + 41/45 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160  +1x +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +11x +11x +11x +11x +  +  +  +  +  +  +  +  +3x +  +  +  +  +3x +3x +  +3x +  +  +  +  +  +  +4x +  +  +  +  +  +4x +4x +4x +  +  +4x +  +4x +  +  +  +4x +  +4x +  +  +  +  +  +  +14x +  +14x +1x +  +  +  +  +  +13x +1x +  +  +  +  +  +12x +  +12x +  +2x +  +  +  +  +  +4x +4x +  +  +  +  +  +  +1x +1x +  +  +  +  +  +4x +  +  +  +  +1x +  +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-underscore-dangle */
+const { EventType } = require("../../../constants");
+ 
+const {
+  constructPayload,
+  defaultRequestConfig,
+  removeUndefinedAndNullValues,
+  removeUndefinedAndNullAndEmptyValues,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+const { ConfigCategory, mappingConfig, getEndpoint } = require("./config");
+ 
+function buildResponse(payload, endpoint) {
+  const response = defaultRequestConfig();
+  response.endpoint = endpoint;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  return {
+    ...response,
+    headers: {
+      "Content-Type": "application/json"
+    }
+  };
+}
+ 
+function processTrackEvent(message, destination, mappingJson) {
+  const requestJson = constructPayload(
+    message,
+    mappingConfig[ConfigCategory.DEFAULT.name]
+  );
+ 
+  const eventJson = constructPayload(message, mappingJson);
+  requestJson.events = [eventJson];
+ 
+  return buildResponse(
+    requestJson,
+    getEndpoint(destination.Config.accountId, message.userId)
+  );
+}
+ 
+function processPage(message, destination, pageTrackJson, pageProfileJson) {
+  const requestJson = constructPayload(
+    message,
+    mappingConfig[ConfigCategory.DEFAULT.name]
+  );
+ 
+  // generating profile part of the payload
+  const profileJson = constructPayload(message, pageProfileJson);
+  profileJson._appcuesId = destination.Config.accountId;
+  requestJson.profile_update = profileJson;
+ 
+  // generating event part of the payload
+  const eventJson = constructPayload(message, pageTrackJson);
+ 
+  eventJson.attributes = removeUndefinedAndNullAndEmptyValues(
+    eventJson.attributes
+  );
+ 
+  requestJson.events = [eventJson];
+ 
+  return buildResponse(
+    requestJson,
+    getEndpoint(destination.Config.accountId, message.userId)
+  );
+}
+ 
+function process(event) {
+  const { message, destination } = event;
+ 
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  if (!message.userId) {
+    throw new CustomError(
+      "User id is absent. Aborting event as userId is mandatory for Appcues",
+      400
+    );
+  }
+ 
+  const messageType = message.type.toLowerCase();
+ 
+  switch (messageType) {
+    case EventType.TRACK:
+      return processTrackEvent(
+        message,
+        destination,
+        mappingConfig[ConfigCategory.TRACK.name]
+      );
+    case EventType.PAGE:
+      message.event = "Visited a Page";
+      return processPage(
+        message,
+        destination,
+        mappingConfig[ConfigCategory.PAGETRACK.name],
+        mappingConfig[ConfigCategory.PAGEPROFILE.name]
+      );
+    case EventType.SCREEN:
+      message.event = "Viewed a Screen";
+      return processTrackEvent(
+        message,
+        destination,
+        mappingConfig[ConfigCategory.TRACK.name]
+      );
+    case EventType.IDENTIFY:
+      return buildResponse(
+        constructPayload(message, mappingConfig[ConfigCategory.IDENTIFY.name]),
+        getEndpoint(destination.Config.accountId, message.userId)
+      );
+    default:
+      throw new CustomError("Message type is not supported", 400);
+  }
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/azure_event_hub/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/azure_event_hub/index.html new file mode 100644 index 00000000000..a3ee8342b78 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/azure_event_hub/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/azure_event_hub + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/azure_event_hub

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%3/350%1/2100%1/1100%3/3
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/azure_event_hub/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/azure_event_hub/transform.js.html new file mode 100644 index 00000000000..1c7894b3e04 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/azure_event_hub/transform.js.html @@ -0,0 +1,107 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/azure_event_hub/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/azure_event_hub transform.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10  +5x +  +  +  +5x +  +  +1x + 
function process(event) {
+  const result = {
+    message: event.message,
+    userId: event.message.userId || event.message.anonymousId
+  };
+  return result;
+}
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/azure_synapse/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/azure_synapse/index.html new file mode 100644 index 00000000000..67a079882a6 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/azure_synapse/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/azure_synapse + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/azure_synapse

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%8/875%3/4100%3/3100%8/8
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/azure_synapse/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/azure_synapse/transform.js.html new file mode 100644 index 00000000000..7741c526d3a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/azure_synapse/transform.js.html @@ -0,0 +1,164 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/azure_synapse/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/azure_synapse transform.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +293x +  +3x +  +  +124x +  +  +  +  +  +124x +124x +124x +124x +  +  +  +  +  +  +  +  +  +3x +  +  +  + 
const { processWarehouseMessage } = require("../../../warehouse");
+ 
+const azureSynapse = "azure_synapse";
+ 
+function processSingleMessage(message, options) {
+  return processWarehouseMessage(message, options);
+}
+ 
+function getDataTypeOverride(key, val, options) {}
+ 
+function process(event) {
+  const whSchemaVersion = event.request.query.whSchemaVersion || "v1";
+  const whStoreEvent = event.destination.Config.storeFullEvent === true;
+  const provider = azureSynapse;
+  return processSingleMessage(event.message, {
+    metadata: event.metadata,
+    whSchemaVersion,
+    whStoreEvent,
+    getDataTypeOverride,
+    provider,
+    sourceCategory: event.metadata ? event.metadata.sourceCategory : null
+  });
+}
+ 
+module.exports = {
+  process,
+  getDataTypeOverride
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/blueshift/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/blueshift/config.js.html new file mode 100644 index 00000000000..260ef00f58e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/blueshift/config.js.html @@ -0,0 +1,245 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/blueshift/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/blueshift config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +561x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_URL = "https://api.getblueshift.com";
+const BASE_URL_EU = "https://api.eu.getblueshift.com";
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: {
+    name: "blueshiftIdentifyConfig",
+    type: "identify"
+  },
+  TRACK: {
+    name: "blueshiftTrackConfig",
+    type: "track"
+  },
+  GROUP: {
+    name: "blueshiftGroupConfig",
+    type: "group"
+  }
+};
+const EVENT_NAME_MAPPING = {
+  "Product Viewed": "view",
+  "Product Added": "add_to_cart",
+  "Order Completed": "purchase",
+  "Products Searched": "search",
+  "Checkout Step Viewed": "checkout",
+  "Product Removed": "remove_from_cart",
+  "Subscribe Interest": "subscribe_interest",
+  "Unsubscribe Interest": "unsubscribe_interest",
+  Identify: "identify"
+};
+ 
+const BLUESHIFT_IDENTIFY_EXCLUSION = [
+  "email",
+  "event",
+  "phone",
+  "phoneNumber",
+  "phone_number",
+  "firstName",
+  "firstname",
+  "first_name",
+  "lastName",
+  "lastname",
+  "last_name",
+  "gender"
+];
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+module.exports = {
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG,
+  EVENT_NAME_MAPPING,
+  BLUESHIFT_IDENTIFY_EXCLUSION,
+  BASE_URL_EU,
+  BASE_URL
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/blueshift/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/blueshift/index.html new file mode 100644 index 00000000000..c8e83915cf5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/blueshift/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/blueshift + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/blueshift

+
+ +
+ 92.16% + Statements + 94/102 +
+ + +
+ 72.09% + Branches + 31/43 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 92.16% + Lines + 94/102 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%0/0100%8/8
transform.js +
+
91.49%86/9472.09%31/43100%8/891.49%86/94
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/blueshift/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/blueshift/transform.js.html new file mode 100644 index 00000000000..1162079e169 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/blueshift/transform.js.html @@ -0,0 +1,749 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/blueshift/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/blueshift transform.js

+
+ +
+ 91.49% + Statements + 86/94 +
+ + +
+ 72.09% + Branches + 31/43 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 91.49% + Lines + 86/94 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +2241x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +8x +2x +6x +  +  +1x +  +12x +  +4x +4x +  +8x +  +12x +  +  +1x +9x +9x +  +  +  +  +  +  +9x +1x +  +  +  +  +8x +  +8x +  +  +  +  +8x +8x +3x +  +8x +8x +2x +  +  +  +  +6x +  +6x +6x +6x +  +6x +6x +6x +  +  +  +6x +6x +  +  +1x +5x +1x +  +  +  +  +4x +  +3x +  +  +  +  +3x +  +  +  +  +  +3x +3x +3x +  +3x +3x +3x +  +  +  +3x +3x +  +  +1x +5x +1x +  +  +  +  +  +4x +  +3x +  +  +  +3x +3x +  +3x +3x +3x +  +3x +3x +3x +  +  +  +3x +3x +  +  +1x +21x +21x +1x +  +  +  +  +  +20x +20x +  +20x +  +9x +6x +  +5x +3x +  +5x +3x +  +1x +  +12x +  +  +1x +1x +  +  +  +  +1x +  +3x +3x +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const { EventType } = require("../../../constants");
+const {
+  CustomError,
+  constructPayload,
+  ErrorMessage,
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  getValueFromMessage,
+  isDefinedAndNotNull,
+  extractCustomFields,
+  getErrorRespEvents,
+  getSuccessRespEvents
+} = require("../../util");
+ 
+const {
+  MAPPING_CONFIG,
+  CONFIG_CATEGORIES,
+  BASE_URL_EU,
+  BASE_URL,
+  EVENT_NAME_MAPPING,
+  BLUESHIFT_IDENTIFY_EXCLUSION
+} = require("./config");
+ 
+function checkValidEventName(str) {
+  if (str.indexOf(".") !== -1 || /[0-9]/.test(str) || str.length > 64)
+    return true;
+  return false;
+}
+ 
+const getBaseURL = config => {
+  let urlValue;
+  switch (config.dataCenter) {
+    case "eu":
+      urlValue = BASE_URL_EU;
+      break;
+    default:
+      urlValue = BASE_URL;
+  }
+  return urlValue;
+};
+ 
+const trackResponseBuilder = async (message, category, { Config }) => {
+  let event = getValueFromMessage(message, "event");
+  Iif (!event) {
+    throw new CustomError(
+      "[Blueshift] property:: event is required for track call",
+      400
+    );
+  }
+ 
+  if (!Config.eventApiKey) {
+    throw new CustomError(
+      "[BLUESHIFT] event Api Keys required for Authentication.",
+      400
+    );
+  }
+  let payload = constructPayload(message, MAPPING_CONFIG[category.name]);
+ 
+  Iif (!payload) {
+    // fail-safety for developer error
+    throw new CustomError(ErrorMessage.FailedToConstructPayload, 400);
+  }
+ 
+  event = event.trim();
+  if (isDefinedAndNotNull(EVENT_NAME_MAPPING[event])) {
+    payload.event = EVENT_NAME_MAPPING[event];
+  }
+  payload.event = payload.event.replace(/\s+/g, "_");
+  if (checkValidEventName(payload.event)) {
+    throw new CustomError(
+      "[Blueshift] Event shouldn't contain period(.), numeric value and contains not more than 64 characters",
+      400
+    );
+  }
+  payload = extractCustomFields(message, payload, ["properties"], []);
+ 
+  const response = defaultRequestConfig();
+  const baseURL = getBaseURL(Config);
+  response.endpoint = `${baseURL}/api/v1/event`;
+ 
+  response.method = defaultPostRequestConfig.requestMethod;
+  const basicAuth = Buffer.from(Config.eventApiKey).toString("base64");
+  response.headers = {
+    Authorization: `Basic ${basicAuth}`,
+    "Content-Type": "application/json"
+  };
+  response.body.JSON = payload;
+  return response;
+};
+ 
+const identifyResponseBuilder = async (message, category, { Config }) => {
+  if (!Config.usersApiKey) {
+    throw new CustomError(
+      "[BLUESHIFT] User API Key required for Authentication.",
+      400
+    );
+  }
+  let payload = constructPayload(message, MAPPING_CONFIG[category.name]);
+ 
+  Iif (!payload) {
+    // fail-safety for developer error
+    throw new CustomError(ErrorMessage.FailedToConstructPayload, 400);
+  }
+ 
+  payload = extractCustomFields(
+    message,
+    payload,
+    ["traits", "context.traits"],
+    BLUESHIFT_IDENTIFY_EXCLUSION
+  );
+  const response = defaultRequestConfig();
+  const baseURL = getBaseURL(Config);
+  response.endpoint = `${baseURL}/api/v1/customers`;
+ 
+  response.method = defaultPostRequestConfig.requestMethod;
+  const basicAuth = Buffer.from(Config.usersApiKey).toString("base64");
+  response.headers = {
+    Authorization: `Basic ${basicAuth}`,
+    "Content-Type": "application/json"
+  };
+  response.body.JSON = payload;
+  return response;
+};
+ 
+const groupResponseBuilder = async (message, category, { Config }) => {
+  if (!Config.eventApiKey) {
+    throw new CustomError(
+      "[BLUESHIFT] event API Key required for Authentication.",
+      400
+    );
+  }
+ 
+  let payload = constructPayload(message, MAPPING_CONFIG[category.name]);
+ 
+  Iif (!payload) {
+    // fail-safety for developer error
+    throw new CustomError(ErrorMessage.FailedToConstructPayload, 400);
+  }
+  payload.event = "identify";
+  payload = extractCustomFields(message, payload, ["traits"], []);
+ 
+  const baseURL = getBaseURL(Config);
+  const response = defaultRequestConfig();
+  response.endpoint = `${baseURL}/api/v1/event`;
+ 
+  response.method = defaultPostRequestConfig.requestMethod;
+  const basicAuth = Buffer.from(Config.eventApiKey).toString("base64");
+  response.headers = {
+    Authorization: `Basic ${basicAuth}`,
+    "Content-Type": "application/json"
+  };
+  response.body.JSON = payload;
+  return response;
+};
+ 
+const process = async event => {
+  const { message, destination } = event;
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  const messageType = message.type.toLowerCase();
+  const category = CONFIG_CATEGORIES[message.type.toUpperCase()];
+  let response;
+  switch (messageType) {
+    case EventType.TRACK:
+      response = await trackResponseBuilder(message, category, destination);
+      break;
+    case EventType.IDENTIFY:
+      response = await identifyResponseBuilder(message, category, destination);
+      break;
+    case EventType.GROUP:
+      response = await groupResponseBuilder(message, category, destination);
+      break;
+    default:
+      throw new CustomError(`Message type ${messageType} not supported`, 400);
+  }
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/bq/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/bq/index.html new file mode 100644 index 00000000000..5eafb60d2c9 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/bq/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/bq + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/bq

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 83.33% + Branches + 5/6 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%9/983.33%5/6100%3/3100%9/9
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/bq/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/bq/transform.js.html new file mode 100644 index 00000000000..f46afea2cb5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/bq/transform.js.html @@ -0,0 +1,170 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/bq/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/bq transform.js

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 83.33% + Branches + 5/6 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +313x +  +3x +  +  +124x +  +  +  +  +  +124x +124x +124x +124x +124x +  +  +  +  +  +  +  +  +  +  +3x +  +  +  + 
const { processWarehouseMessage } = require("../../../warehouse");
+ 
+const bigquery = "bq";
+ 
+function processSingleMessage(message, options) {
+  return processWarehouseMessage(message, options);
+}
+ 
+function getDataTypeOverride(key, val, options) {}
+ 
+function process(event) {
+  const whSchemaVersion = event.request.query.whSchemaVersion || "v1";
+  const whIDResolve = event.request.query.whIDResolve === "true" || false;
+  const whStoreEvent = event.destination.Config.storeFullEvent === true;
+  const provider = bigquery;
+  return processSingleMessage(event.message, {
+    metadata: event.metadata,
+    whSchemaVersion,
+    whStoreEvent,
+    whIDResolve,
+    getDataTypeOverride,
+    provider,
+    sourceCategory: event.metadata ? event.metadata.sourceCategory : null
+  });
+}
+ 
+module.exports = {
+  process,
+  getDataTypeOverride
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/bqstream/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/bqstream/index.html new file mode 100644 index 00000000000..6078a77aa89 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/bqstream/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/bqstream + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/bqstream

+
+ +
+ 90% + Statements + 18/20 +
+ + +
+ 85.71% + Branches + 12/14 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 90% + Lines + 18/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
90%18/2085.71%12/14100%2/290%18/20
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/bqstream/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/bqstream/transform.js.html new file mode 100644 index 00000000000..33b0837325b --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/bqstream/transform.js.html @@ -0,0 +1,215 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/bqstream/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/bqstream transform.js

+
+ +
+ 90% + Statements + 18/20 +
+ + +
+ 85.71% + Branches + 12/14 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 90% + Lines + 18/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46  +1x +1x +  +1x +2x +  +  +  +  +  +1x +  +1x +  +  +1x +2x +2x +  +2x +  +  +2x +  +  +  +  +  +  +2x +2x +2x +2x +1x +  +2x +  +  +  +  +  +  +  +1x + 
/* eslint-disable no-console */
+const { EventType } = require("../../../constants");
+const { CustomError } = require("../../util");
+ 
+const getInsertIdColValue = (properties, insertIdCol) => {
+  if (
+    insertIdCol &&
+    properties[insertIdCol] &&
+    (typeof properties[insertIdCol] === "string" ||
+      typeof properties[insertIdCol] === "number")
+  ) {
+    return `${properties[insertIdCol]}`;
+  }
+  return null;
+};
+ 
+const process = async event => {
+  const { message } = event;
+  const { properties, type } = message;
+  // EventType validation
+  Iif (type !== EventType.TRACK) {
+    throw new CustomError(`Message Type not supported: ${type}`, 400);
+  }
+  Iif (!properties || typeof properties !== "object") {
+    throw new CustomError("Invalid payload for the destination", 400);
+  }
+  const {
+    destination: {
+      Config: { datasetId, tableId, projectId, insertId: insertIdColumn }
+    }
+  } = event;
+  const propInsertId = getInsertIdColValue(properties, insertIdColumn);
+  const props = { ...properties };
+  if (propInsertId) {
+    props.insertId = propInsertId;
+  }
+  return {
+    datasetId,
+    tableId,
+    projectId,
+    properties: { ...props }
+  };
+};
+ 
+module.exports = { process };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/branch/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/branch/config.js.html new file mode 100644 index 00000000000..0b2aed610c1 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/branch/config.js.html @@ -0,0 +1,107 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/branch/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/branch config.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +101x +1x +  +  +  +  +1x +  +  + 
const baseEndpoint = "https://api2.branch.io";
+const endpoints = {
+  standardEventUrl: `${baseEndpoint}/v2/event/standard`,
+  customEventUrl: `${baseEndpoint}/v2/event/custom`
+};
+ 
+module.exports = {
+  endpoints
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/branch/data/eventMapping.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/branch/data/eventMapping.js.html new file mode 100644 index 00000000000..7cc79df4e14 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/branch/data/eventMapping.js.html @@ -0,0 +1,365 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/branch/data/eventMapping.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/branch/data eventMapping.js

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +961x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  + 
const product = {
+  title: "$og_title",
+  description: "$og_description",
+  image_url: "$og_image_url",
+  canonical_identifier: "$canonical_identifier",
+  publicly_indexable: "$publicly_indexable",
+  price: "$price",
+  locally_indexable: "$locally_indexable",
+  quantity: "$quantity",
+  sku: "$sku",
+  name: "$product_name",
+  brand: "$product_brand",
+  category: "$product_category",
+  variant: "$product_variant",
+  rating_average: "$rating_average",
+  rating_count: "$rating_count",
+  rating_max: "$rating_max",
+  creating_timestamp: "$creation_timestamp",
+  exp_date: "$exp_date",
+  keywords: "$keywords",
+  address_street: "$address_street",
+  address_city: "$address_city",
+  address_region: "$address_region",
+  address_country: "$address_country",
+  address_postal_code: "$address_postal_code",
+  latitude: "$latitude",
+  longitude: "$longitude",
+  image_captions: "$image_captions",
+  condition: "$condition"
+};
+ 
+const CommerceEventConfig = {
+  name: {
+    "Product Added": "ADD_TO_CART",
+    "Product Added to Wishlist": "ADD_TO_WISHLIST",
+    "Cart Viewed": "VIEW_CART",
+    "Checkout Started": "INITIATE_PURCHASE",
+    "Payment Info Entered": "ADD_PAYMENT_INFO",
+    "Order Completed": "ADD_PAYMENT_INFO",
+    "Spend Credits": "SPEND_CREDITS",
+    "Promotion Viewed": "VIEW_AD",
+    "Promotion Clicked": "CLICK_AD",
+    "Checkout Started": "PURCHASE",
+    "Order Completed": "PURCHASE",
+    "Reserve": "RESERVE"
+  },
+  event_data: [
+    "transaction_id",
+    "currency",
+    "revenue",
+    "shipping",
+    "tax",
+    "coupon",
+    "description"
+  ],
+  content_items: product
+};
+ 
+const ContentEventConfig = {
+  name: {
+    "Products Searched": "SEARCH",
+    "Product Viewed": "VIEW_ITEM",
+    "Product List Viewed": "VIEW_ITEMS",
+    "Product Reviewed": "RATE",
+    "Product Shared": "SHARE",
+    "Initiate Stream": "INITIATE_STREAM",
+    "Complete Stream": "COMPLETE_STREAM"
+  },
+  event_data: ["search_query", "description"],
+  content_items: product
+};
+ 
+const LifecycleEventConfig = {
+  name: {
+    "Complete Registration": "COMPLETE_REGISTRATION",
+    "Complete Tutorial": "COMPLETE_TUTORIAL",
+    "Achieve Level": "ACHIEVE_LEVEL",
+    "Unlock Achievement": "UNLOCK_ACHIEVEMENT",
+    "Invite": "INVITE",
+    "Login": "LOGIN",
+    "Start Trial": "START_TRIAL",
+    "Subscribe": "SUBSCRIBE"
+  },
+  event_data: ["description"]
+};
+ 
+const categoriesList = [
+  CommerceEventConfig,
+  ContentEventConfig,
+  LifecycleEventConfig
+];
+ 
+module.exports = {
+  categoriesList
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/branch/data/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/branch/data/index.html new file mode 100644 index 00000000000..0d3b049f491 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/branch/data/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/branch/data + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/branch/data

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
eventMapping.js +
+
100%6/6100%0/0100%0/0100%6/6
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/branch/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/branch/index.html new file mode 100644 index 00000000000..d6853ec8255 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/branch/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/branch + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/branch

+
+ +
+ 83.72% + Statements + 108/129 +
+ + +
+ 79.1% + Branches + 53/67 +
+ + +
+ 86.67% + Functions + 13/15 +
+ + +
+ 84.25% + Lines + 107/127 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%3/3100%0/0100%0/0100%3/3
transform.js +
+
83.33%105/12679.1%53/6786.67%13/1583.87%104/124
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/branch/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/branch/transform.js.html new file mode 100644 index 00000000000..ed8ec7c95ea --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/branch/transform.js.html @@ -0,0 +1,947 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/branch/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/branch transform.js

+
+ +
+ 83.33% + Statements + 105/126 +
+ + +
+ 79.1% + Branches + 53/67 +
+ + +
+ 86.67% + Functions + 13/15 +
+ + +
+ 83.87% + Lines + 104/124 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +2901x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +12x +  +12x +4x +  +8x +  +12x +  +12x +  +  +  +  +12x +  +  +  +  +  +  +  +  +  +  +12x +20x +20x +20x +  +20x +180x +8x +8x +  +  +20x +8x +  +  +4x +  +  +  +  +  +12x +  +12x +  +  +  +  +  +  +  +  +  +  +  +  +12x +11x +9x +  +  +  +9x +  +2x +2x +  +2x +  +  +  +  +  +12x +12x +10x +7x +3x +3x +  +  +  +12x +  +12x +  +  +  +13x +13x +13x +  +13x +13x +5x +50x +5x +5x +5x +5x +  +45x +  +  +  +13x +8x +  +  +  +  +  +  +  +  +  +  +  +13x +8x +  +13x +  +  +  +  +  +  +  +12x +  +12x +12x +12x +12x +  +  +12x +  +8x +  +  +8x +  +4x +4x +  +  +12x +9x +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +13x +  +  +  +  +13x +13x +13x +  +  +9x +9x +9x +9x +  +9x +27x +14x +  +  +  +12x +12x +  +12x +  +  +  +  +  +  +  +  +  +  +  +14x +  +9x +1x +  +8x +8x +  +4x +4x +  +1x +  +12x +12x +  +  +  +14x +14x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const { EventType } = require("../../../constants");
+const { endpoints } = require("./config");
+const { categoriesList } = require("./data/eventMapping");
+const {
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  removeUndefinedAndNullValues,
+  getFieldValueFromMessage,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  isDefinedAndNotNull,
+  isAppleFamily
+} = require("../../util");
+ 
+function responseBuilder(payload, message, destination, category) {
+  const response = defaultRequestConfig();
+ 
+  if (category === "custom") {
+    response.endpoint = endpoints.customEventUrl;
+  } else {
+    response.endpoint = endpoints.standardEventUrl;
+  }
+  response.method = defaultPostRequestConfig.requestMethod;
+ 
+  response.body.JSON = removeUndefinedAndNullValues({
+    ...payload,
+    branch_key: destination.Config.branchKey
+  });
+ 
+  return {
+    ...response,
+    headers: {
+      "Content-Type": "application/json",
+      Accept: "application/json"
+    },
+    userId: message.anonymousId
+  };
+}
+ 
+function getCategoryAndName(rudderEventName) {
+  for (let i = 0; i < categoriesList.length; i += 1) {
+    const category = categoriesList[i];
+    let requiredName = null;
+    let requiredCategory = null;
+    // eslint-disable-next-line array-callback-return
+    Object.keys(category.name).find(branchKey => {
+      if (branchKey.toLowerCase() === rudderEventName.toLowerCase()) {
+        requiredName = category.name[branchKey];
+        requiredCategory = category;
+      }
+    });
+    if (requiredName != null && requiredCategory != null) {
+      return { evName: requiredName, category: requiredCategory };
+    }
+  }
+  return { evName: rudderEventName, category: "custom" };
+}
+ 
+function getUserData(message) {
+  // os field is not mandatory as based on device type it can be one of
+  // "Android" or "iOS" but it does not apply & is not valid in case of web events
+  const os = get(message, "context.os.name");
+ 
+  let userData = {
+    os,
+    os_version: get(message, "context.os.version"),
+    app_version: get(message, "context.app.version"),
+    model: get(message, "context.device.model"),
+    brand: get(message, "context.device.brand"),
+    screen_dpi: get(message, "context.screen.density"),
+    screen_height: get(message, "context.screen.height"),
+    screen_width: get(message, "context.screen.width"),
+    developer_identity: getFieldValueFromMessage(message, "userId"),
+    user_agent: get(message, "context.userAgent")
+  };
+ 
+  if (isDefinedAndNotNull(os)) {
+    if (isAppleFamily(os)) {
+      userData.idfa =
+        get(message, "context.idfa") ||
+        get(message, "context.device.advertisingId");
+ 
+      userData.idfv =
+        get(message, "context.idfv") || get(message, "context.device.id");
+    } else Eif (os.toLowerCase() === "android") {
+      userData.android_id =
+        get(message, "context.android_id") || get(message, "context.device.id");
+      userData.aaid =
+        get(message, "context.aaid") ||
+        get(message, "context.device.advertisingId");
+    }
+  }
+ 
+  const att = get(message, "context.device.attTrackingStatus");
+  if (isDefinedAndNotNull(att)) {
+    if (att === 3) {
+      userData.limit_ad_tracking = false;
+    } else Eif (att === 2) {
+      userData.limit_ad_tracking = true;
+    }
+  }
+ 
+  userData = removeUndefinedAndNullValues(userData);
+ 
+  return userData;
+}
+ 
+function mapPayload(category, rudderProperty, rudderPropertiesObj) {
+  const contentItems = {};
+  const eventData = {};
+  const customData = {};
+ 
+  let valFound = false;
+  if (category.content_items) {
+    Object.keys(category.content_items).find(branchMappingProperty => {
+      if (branchMappingProperty === rudderProperty) {
+        const tmpKeyName = category.content_items[branchMappingProperty];
+        contentItems[tmpKeyName] = rudderPropertiesObj[rudderProperty];
+        valFound = true;
+        return true;
+      }
+      return false;
+    });
+  }
+ 
+  if (!valFound) {
+    Iif (category.event_data) {
+      category.event_data.find(branchMappingProperty => {
+        if (branchMappingProperty === rudderProperty) {
+          eventData[rudderProperty] = rudderPropertiesObj[rudderProperty];
+          valFound = true;
+          return true;
+        }
+        return false;
+      });
+    }
+  }
+ 
+  if (!valFound) {
+    customData[rudderProperty] = rudderPropertiesObj[rudderProperty];
+  }
+  return {
+    contentItemsObj: contentItems,
+    eventDataObj: eventData,
+    customDataObj: customData
+  };
+}
+ 
+function getCommonPayload(message, category, evName) {
+  const rawPayload = {};
+  let rudderPropertiesObj;
+  const contentItems = [];
+  const eventData = {};
+  const customData = {};
+  let productObj = {};
+ 
+  // eslint-disable-next-line default-case
+  switch (message.type) {
+    case EventType.TRACK:
+      rudderPropertiesObj = get(message, "properties")
+        ? message.properties
+        : null;
+      break;
+    case EventType.IDENTIFY:
+      rudderPropertiesObj = getFieldValueFromMessage(message, "traits");
+      break;
+  }
+ 
+  if (rudderPropertiesObj != null) {
+    Object.keys(rudderPropertiesObj).map(rudderProperty => {
+      Iif (rudderProperty === "products") {
+        productObj = {};
+        for (let i = 0; i < rudderPropertiesObj.products.length; i++) {
+          const product = rudderPropertiesObj.products[i];
+          // eslint-disable-next-line no-loop-func
+          Object.keys(product).map(productProp => {
+            const { contentItemsObj, eventDataObj, customDataObj } = mapPayload(
+              category,
+              productProp,
+              product
+            );
+            Object.assign(productObj, contentItemsObj);
+            Object.assign(eventData, eventDataObj);
+            Object.assign(customData, customDataObj);
+          });
+          contentItems.push(productObj);
+          productObj = {};
+        }
+      } else {
+        const { contentItemsObj, eventDataObj, customDataObj } = mapPayload(
+          category,
+          rudderProperty,
+          rudderPropertiesObj
+        );
+        Object.assign(productObj, contentItemsObj);
+        Object.assign(eventData, eventDataObj);
+        Object.assign(customData, customDataObj);
+      }
+    });
+    contentItems.push(productObj);
+    rawPayload.custom_data = customData;
+    rawPayload.content_items = contentItems;
+    rawPayload.event_data = eventData;
+ 
+    Object.keys(rawPayload).map(key => {
+      if (Object.keys(rawPayload[key]).length === 0) {
+        rawPayload[key] = null;
+      }
+    });
+  }
+  rawPayload.user_data = getUserData(message);
+  rawPayload.name = evName;
+ 
+  return rawPayload;
+}
+ 
+// function getTrackPayload(message) {
+//   const rawPayload = {};
+//   const { name, category } = getCategoryAndName(message.event);
+//   rawPayload.name = name;
+//
+//   return commonPayload(message, rawPayload, category);
+// }
+ 
+function processMessage(message, destination) {
+  switch (message.type) {
+    case EventType.TRACK:
+      if (!message.event) {
+        throw new CustomError("Event name is required", 400);
+      }
+      var { evName, category } = getCategoryAndName(message.event);
+      break;
+    case EventType.IDENTIFY:
+      var { evName, category } = getCategoryAndName(message.userId);
+      break;
+    default:
+      throw new CustomError("Message type is not supported", 400);
+  }
+  const rawPayload = getCommonPayload(message, category, evName);
+  return responseBuilder(rawPayload, message, destination, category);
+}
+ 
+function process(event) {
+  const { message, destination } = event;
+  return processMessage(message, destination);
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/braze/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/braze/config.js.html new file mode 100644 index 00000000000..285ba1aef8d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/braze/config.js.html @@ -0,0 +1,200 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/braze/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/braze config.js

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +412x +  +2x +  +  +  +  +  +  +  +  +  +6x +  +  +  +14x +  +  +2x +  +2x +  +  +  +2x +2x +  +2x +  +2x +  +  +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ConfigCategory = {
+  IDENTIFY: {
+    name: "BrazeUserAttributesConfig"
+  },
+  DEFAULT: {
+    name: "BrazeUserAttributesConfig"
+  }
+};
+ 
+function getIdentifyEndpoint(endPoint) {
+  return `${endPoint}/users/identify`;
+}
+ 
+function getTrackEndPoint(endPoint) {
+  return `${endPoint}/users/track`;
+}
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+const BRAZE_PARTNER_NAME = "RudderStack";
+ 
+// max requests per batch
+// Ref: https://www.braze.com/docs/api/endpoints/user_data/post_user_track/
+const TRACK_BRAZE_MAX_REQ_COUNT = 75;
+const IDENTIFY_BRAZE_MAX_REQ_COUNT = 50;
+ 
+const DESTINATION = "braze";
+ 
+module.exports = {
+  ConfigCategory,
+  mappingConfig,
+  getIdentifyEndpoint,
+  getTrackEndPoint,
+  BRAZE_PARTNER_NAME,
+  TRACK_BRAZE_MAX_REQ_COUNT,
+  IDENTIFY_BRAZE_MAX_REQ_COUNT,
+  DESTINATION
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/braze/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/braze/index.html new file mode 100644 index 00000000000..742e6d5ea2c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/braze/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/braze + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/braze

+
+ +
+ 89.34% + Statements + 243/272 +
+ + +
+ 74.53% + Branches + 120/161 +
+ + +
+ 100% + Functions + 26/26 +
+ + +
+ 89.34% + Lines + 243/272 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%10/10100%0/0100%2/2100%10/10
transform.js +
+
88.93%233/26274.53%120/161100%24/2488.93%233/262
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/braze/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/braze/transform.js.html new file mode 100644 index 00000000000..20f8500b0c5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/braze/transform.js.html @@ -0,0 +1,2207 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/braze/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/braze transform.js

+
+ +
+ 88.93% + Statements + 233/262 +
+ + +
+ 74.53% + Branches + 120/161 +
+ + +
+ 100% + Functions + 24/24 +
+ + +
+ 88.93% + Lines + 233/262 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710  +2x +  +2x +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +20x +20x +20x +20x +20x +  +  +  +  +  +  +  +  +  +  +  +23x +23x +  +  +  +  +23x +  +  +  +  +13x +13x +10x +  +13x +  +  +  +23x +23x +6x +  +  +17x +17x +  +  +  +6x +6x +6x +6x +  +  +  +  +  +15x +  +15x +  +  +15x +1x +  +  +  +14x +126x +126x +  +12x +1x +  +12x +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +14x +  +12x +  +36x +24x +24x +24x +  +  +  +  +  +14x +  +  +  +  +6x +6x +1x +  +  +6x +  +  +  +  +  +  +  +  +6x +6x +5x +5x +  +  +  +  +  +  +1x +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +6x +36x +  +6x +  +  +  +6x +6x +6x +  +  +  +  +  +  +  +  +  +5x +4x +  +  +  +  +  +  +  +1x +  +  +  +3x +3x +  +3x +  +3x +  +3x +6x +6x +6x +5x +  +  +5x +  +  +  +  +  +  +5x +4x +4x +  +  +  +  +  +3x +  +  +  +9x +  +9x +  +  +9x +9x +  +  +  +9x +9x +6x +6x +  +  +9x +  +  +  +3x +  +3x +  +2x +2x +  +2x +2x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +6x +6x +  +  +6x +6x +  +6x +6x +6x +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +16x +  +16x +16x +  +  +16x +  +16x +8x +8x +2x +  +6x +  +  +  +16x +16x +  +7x +  +  +  +  +  +6x +6x +  +2x +  +2x +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +6x +6x +6x +6x +  +  +6x +  +  +  +  +  +6x +5x +  +6x +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +15x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +6x +6x +6x +6x +  +  +  +3x +  +  +  +  +  +3x +3x +3x +3x +3x +3x +3x +  +3x +  +181x +181x +  +  +181x +  +  +181x +181x +  +181x +  +  +  +181x +  +160x +3x +  +  +  +160x +  +  +160x +  +  +  +  +  +160x +1x +  +  +  +  +1x +1x +1x +1x +  +  +1x +1x +  +1x +1x +  +1x +  +  +1x +  +1x +1x +  +  +  +  +1x +1x +1x +1x +  +  +  +  +160x +159x +  +  +160x +114x +  +  +160x +1x +  +  +  +160x +  +  +21x +2x +  +21x +  +21x +  +21x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +21x +21x +  +  +21x +  +  +  +  +3x +3x +3x +2x +2x +2x +  +  +2x +2x +  +2x +2x +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +3x +3x +3x +3x +  +  +3x +3x +  +3x +3x +  +3x +1x +  +3x +  +3x +3x +  +  +  +  +3x +  +  +2x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +2x + 
/* eslint-disable no-nested-ternary */
+const get = require("get-value");
+ 
+const { EventType, MappedToDestinationKey } = require("../../../constants");
+const {
+  adduserIdFromExternalId,
+  defaultBatchRequestConfig,
+  defaultRequestConfig,
+  getDestinationExternalID,
+  getFieldValueFromMessage,
+  removeUndefinedValues,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  generateErrorObject,
+  isDefinedAndNotNull
+} = require("../../util");
+const { TRANSFORMER_METRIC } = require("../../util/constant");
+const ErrorBuilder = require("../../util/error");
+ 
+const {
+  ConfigCategory,
+  mappingConfig,
+  getIdentifyEndpoint,
+  getTrackEndPoint,
+  BRAZE_PARTNER_NAME,
+  TRACK_BRAZE_MAX_REQ_COUNT,
+  IDENTIFY_BRAZE_MAX_REQ_COUNT,
+  DESTINATION
+} = require("./config");
+ 
+function formatGender(gender) {
+  // few possible cases of woman
+  Eif (["woman", "female", "w", "f"].indexOf(gender.toLowerCase()) > -1) {
+    return "F";
+  }
+ 
+  // few possible cases of man
+  if (["man", "male", "m"].indexOf(gender.toLowerCase()) > -1) {
+    return "M";
+  }
+ 
+  // few possible cases of other
+  if (["other", "o"].indexOf(gender.toLowerCase()) > -1) {
+    return "O";
+  }
+ 
+  return null;
+}
+ 
+function buildResponse(message, destination, properties, endpoint) {
+  const response = defaultRequestConfig();
+  response.endpoint = endpoint;
+  response.userId = message.userId || message.anonymousId;
+  response.body.JSON = removeUndefinedValues(properties);
+  return {
+    ...response,
+    headers: {
+      "Content-Type": "application/json",
+      Accept: "application/json",
+      Authorization: `Bearer ${destination.Config.restApiKey}`
+    },
+    userId: message.userId || message.anonymousId
+  };
+}
+ 
+function setAliasObjectWithAnonId(payload, message) {
+  Eif (message.anonymousId) {
+    payload.user_alias = {
+      alias_name: message.anonymousId,
+      alias_label: "rudder_id"
+    };
+  }
+  return payload;
+}
+ 
+function setExternalId(payload, message) {
+  const externalId =
+    getDestinationExternalID(message, "brazeExternalId") || message.userId;
+  if (externalId) {
+    payload.external_id = externalId;
+  }
+  return payload;
+}
+ 
+function setExternalIdOrAliasObject(payload, message) {
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  if (userId || getDestinationExternalID(message, "brazeExternalId")) {
+    return setExternalId(payload, message);
+  }
+ 
+  payload._update_existing_only = false;
+  return setAliasObjectWithAnonId(payload, message);
+}
+ 
+function getIdentifyPayload(message) {
+  let payload = {};
+  payload = setAliasObjectWithAnonId(payload, message);
+  payload = setExternalId(payload, message);
+  return { aliases_to_identify: [payload] };
+}
+ 
+// Ref: https://www.braze.com/docs/api/objects_filters/user_attributes_object/
+function getUserAttributesObject(message, mappingJson) {
+  // blank output object
+  const data = {};
+  // get traits from message
+  const traits = getFieldValueFromMessage(message, "traits");
+ 
+  // return the traits as-is if message is mapped to destination
+  if (get(message, MappedToDestinationKey)) {
+    return traits;
+  }
+ 
+  // iterate over the destKeys and set the value if present
+  Object.keys(mappingJson).forEach(destKey => {
+    let value = get(traits, mappingJson[destKey]);
+    if (value) {
+      // handle gender special case
+      if (destKey === "gender") {
+        value = formatGender(value);
+      }
+      data[destKey] = value;
+    }
+  });
+ 
+  // reserved keys : already mapped through mappingJson
+  const reservedKeys = [
+    "address",
+    "birthday",
+    "email",
+    "firstName",
+    "gender",
+    "avatar",
+    "lastName",
+    "phone"
+  ];
+ 
+  if (traits) {
+    // iterate over rest of the traits properties
+    Object.keys(traits).forEach(traitKey => {
+      // if traitKey is not reserved add the value to final output
+      if (reservedKeys.indexOf(traitKey) === -1) {
+        const value = get(traits, traitKey);
+        Eif (value !== undefined) {
+          data[traitKey] = value;
+        }
+      }
+    });
+  }
+ 
+  return data;
+}
+ 
+function processIdentify(message, destination) {
+  // override userId with externalId in context(if present) and event is mapped to destination
+  const mappedToDestination = get(message, MappedToDestinationKey);
+  if (mappedToDestination) {
+    adduserIdFromExternalId(message);
+  }
+ 
+  return buildResponse(
+    message,
+    destination,
+    getIdentifyPayload(message),
+    getIdentifyEndpoint(destination.Config.endPoint)
+  );
+}
+ 
+function processTrackWithUserAttributes(message, destination, mappingJson) {
+  let payload = getUserAttributesObject(message, mappingJson);
+  if (payload && Object.keys(payload).length > 0) {
+    payload = setExternalIdOrAliasObject(payload, message);
+    return buildResponse(
+      message,
+      destination,
+      { attributes: [payload] },
+      getTrackEndPoint(destination.Config.endPoint)
+    );
+  }
+  return null;
+}
+ 
+function handleReservedProperties(props) {
+  // remove reserved keys from custom event properties
+  // https://www.appboy.com/documentation/Platform_Wide/#reserved-keys
+  const reserved = [
+    "time",
+    "product_id",
+    "quantity",
+    "event_name",
+    "price",
+    "currency"
+  ];
+ 
+  reserved.forEach(element => {
+    delete props[element];
+  });
+  return props;
+}
+ 
+function addMandatoryEventProperties(payload, message) {
+  payload.name = message.event;
+  payload.time = message.timestamp;
+  return payload;
+}
+ 
+function addMandatoryPurchaseProperties(
+  productId,
+  price,
+  currencyCode,
+  quantity,
+  timestamp
+) {
+  if (currencyCode) {
+    return {
+      product_id: productId,
+      price,
+      currency: currencyCode,
+      quantity,
+      time: timestamp
+    };
+  }
+  return null;
+}
+ 
+function getPurchaseObjs(message) {
+  const { products } = message.properties;
+  const currencyCode = message.properties.currency;
+ 
+  const purchaseObjs = [];
+ 
+  Eif (products) {
+    // we have to make a separate call to appboy for each product
+    products.forEach(product => {
+      const productId = product.product_id || product.sku;
+      const { price, quantity, currency } = product;
+      if (productId && isDefinedAndNotNull(price) && quantity) {
+        Iif (Number.isNaN(price) || Number.isNaN(quantity)) {
+          return;
+        }
+        let purchaseObj = addMandatoryPurchaseProperties(
+          productId,
+          price,
+          currencyCode || currency,
+          quantity,
+          message.timestamp
+        );
+        if (purchaseObj) {
+          purchaseObj = setExternalIdOrAliasObject(purchaseObj, message);
+          purchaseObjs.push(purchaseObj);
+        }
+      }
+    });
+  }
+ 
+  return purchaseObjs.length === 0 ? null : purchaseObjs;
+}
+ 
+function processTrackEvent(messageType, message, destination, mappingJson) {
+  const eventName = message.event;
+ 
+  Iif (!message.properties) {
+    message.properties = {};
+  }
+  let { properties } = message;
+  const requestJson = {
+    partner: BRAZE_PARTNER_NAME
+  };
+ 
+  let attributePayload = getUserAttributesObject(message, mappingJson);
+  if (attributePayload && Object.keys(attributePayload).length > 0) {
+    attributePayload = setExternalIdOrAliasObject(attributePayload, message);
+    requestJson.attributes = [attributePayload];
+  }
+ 
+  if (
+    messageType === EventType.TRACK &&
+    eventName.toLowerCase() === "order completed"
+  ) {
+    const purchaseObjs = getPurchaseObjs(message);
+ 
+    if (purchaseObjs) {
+      // del used properties
+      delete properties.products;
+      delete properties.currency;
+ 
+      let payload = {};
+      payload.properties = properties;
+ 
+      payload = setExternalIdOrAliasObject(payload, message);
+      return buildResponse(
+        message,
+        destination,
+        {
+          attributes: [attributePayload],
+          purchases: purchaseObjs,
+          partner: BRAZE_PARTNER_NAME
+        },
+        getTrackEndPoint(destination.Config.endPoint)
+      );
+    }
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("Invalid Order Completed event")
+      .setStatTags({
+        destination: DESTINATION,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        meta: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_PARAM
+      })
+      .build();
+  }
+  properties = handleReservedProperties(properties);
+  let payload = {};
+ 
+  // mandatory fields
+  payload = addMandatoryEventProperties(payload, message);
+  payload.properties = properties;
+ 
+  payload = setExternalIdOrAliasObject(payload, message);
+  Eif (payload) {
+    requestJson.events = [payload];
+  }
+  return buildResponse(
+    message,
+    destination,
+    requestJson,
+    getTrackEndPoint(destination.Config.endPoint)
+  );
+}
+ 
+// For group call we will add a user attribute with the groupId attribute
+// with the value as true
+//
+// Ex: If the groupId is 1234, we'll add a attribute to the user object with the
+// key `ab_rudder_group_1234` with the value `true`
+function processGroup(message, destination) {
+  const groupAttribute = {};
+  const groupId = getFieldValueFromMessage(message, "groupId");
+  Iif (!groupId) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("Invalid groupId")
+      .setStatTags({
+        destination: DESTINATION,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        meta: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_PARAM
+      })
+      .build();
+  }
+  groupAttribute[`ab_rudder_group_${groupId}`] = true;
+  setExternalId(groupAttribute, message);
+  return buildResponse(
+    message,
+    destination,
+    {
+      attributes: [groupAttribute],
+      partner: BRAZE_PARTNER_NAME
+    },
+    getTrackEndPoint(destination.Config.endPoint)
+  );
+}
+ 
+function process(event) {
+  const respList = [];
+  let response;
+  const { message, destination } = event;
+  const messageType = message.type.toLowerCase();
+ 
+  // Init -- mostly for test cases
+  destination.Config.endPoint = "https://rest.fra-01.braze.eu";
+ 
+  if (destination.Config.dataCenter) {
+    const dataCenterArr = destination.Config.dataCenter.trim().split("-");
+    if (dataCenterArr[0].toLowerCase() === "eu") {
+      destination.Config.endPoint = "https://rest.fra-01.braze.eu";
+    } else {
+      destination.Config.endPoint = `https://rest.iad-${dataCenterArr[1]}.braze.com`;
+    }
+  }
+ 
+  let category = ConfigCategory.DEFAULT;
+  switch (messageType) {
+    case EventType.TRACK:
+      response = processTrackEvent(
+        messageType,
+        message,
+        destination,
+        mappingConfig[category.name]
+      );
+      respList.push(response);
+      break;
+    case EventType.PAGE:
+      message.event =
+        message.name || get(message, "properties.name") || "Page Viewed";
+      response = processTrackEvent(
+        messageType,
+        message,
+        destination,
+        mappingConfig[category.name]
+      );
+      respList.push(response);
+      break;
+    case EventType.SCREEN:
+      message.event =
+        message.name || get(message, "properties.name") || "Screen Viewed";
+      response = processTrackEvent(
+        messageType,
+        message,
+        destination,
+        mappingConfig[category.name]
+      );
+      respList.push(response);
+      break;
+    case EventType.IDENTIFY:
+      category = ConfigCategory.IDENTIFY;
+      Eif (message.anonymousId) {
+        response = processIdentify(message, destination);
+        respList.push(response);
+      }
+ 
+      response = processTrackWithUserAttributes(
+        message,
+        destination,
+        mappingConfig[category.name]
+      );
+ 
+      if (response) {
+        respList.push(response);
+      }
+      break;
+    case EventType.GROUP:
+      response = processGroup(message, destination);
+      respList.push(response);
+      break;
+    default:
+      throw new ErrorBuilder()
+        .setStatus(400)
+        .setMessage("Message type is not supported")
+        .setStatTags({
+          destination: DESTINATION,
+          scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+          stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+          meta:
+            TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_EVENT
+        })
+        .build();
+  }
+ 
+  return respList;
+}
+ 
+/*
+ *
+  input: [
+   { "message": {"id": "m1"}, "metadata": {"job_id": 1}, "destination": {"ID": "a", "url": "a"} },
+   { "message": {"id": "m2"}, "metadata": {"job_id": 2}, "destination": {"ID": "a", "url": "a"} },
+   { "message": {"id": "m3"}, "metadata": {"job_id": 3}, "destination": {"ID": "a", "url": "a"} },
+   { "message": {"id": "m4"}, "metadata": {"job_id": 4}, "destination": {"ID": "a", "url": "a"} }
+  ]
+  output: [
+    { batchedRequest: {}, jobs: [1, 3]},
+    { batchedRequest: {}, jobs: [2, 4]},
+  ]
+  */
+ 
+function formatBatchResponse(batchPayload, metadataList, destination) {
+  const response = defaultBatchRequestConfig();
+  response.batchedRequest = batchPayload;
+  response.metadata = metadataList;
+  response.destination = destination;
+  return response;
+}
+ 
+function batch(destEvents) {
+  const respList = [];
+  let trackEndpoint;
+  let identifyEndpoint;
+  let jsonBody;
+  let endPoint;
+  let type;
+  let attributesBatch = [];
+  let eventsBatch = [];
+  let purchasesBatch = [];
+  let trackMetadataBatch = [];
+  let identifyMetadataBatch = [];
+  let aliasBatch = [];
+  let index = 0;
+ 
+  while (index < destEvents.length) {
+    // take out a single event
+    const ev = destEvents[index];
+    const { message, metadata, destination } = ev;
+ 
+    // get the JSON body
+    jsonBody = get(message, "body.JSON");
+ 
+    // get the type
+    endPoint = get(message, "endpoint");
+    type = endPoint && endPoint.includes("track") ? "track" : "identify";
+ 
+    index += 1;
+ 
+    // if it is a track keep on adding to the existing track list
+    // keep a count of event, attribute, purchases - 75 is the cap
+    if (type === "track") {
+      // keep the trackEndpoint for reuse later
+      if (!trackEndpoint) {
+        trackEndpoint = endPoint;
+      }
+ 
+      // look for events, attributes, purchases
+      const { events, attributes, purchases } = jsonBody;
+ 
+      // if total count = 75 form a new batch
+      const maxCount = Math.max(
+        attributesBatch.length + (attributes ? attributes.length : 0),
+        eventsBatch.length + (events ? events.length : 0),
+        purchasesBatch.length + (purchases ? purchases.length : 0)
+      );
+ 
+      if (maxCount > TRACK_BRAZE_MAX_REQ_COUNT) {
+        Eif (
+          attributesBatch.length > 0 ||
+          eventsBatch.length > 0 ||
+          purchasesBatch.length > 0
+        ) {
+          const batchResponse = defaultRequestConfig();
+          batchResponse.headers = message.headers;
+          batchResponse.endpoint = trackEndpoint;
+          const responseBodyJson = {
+            partner: BRAZE_PARTNER_NAME
+          };
+          Eif (attributesBatch.length > 0) {
+            responseBodyJson.attributes = attributesBatch;
+          }
+          Eif (eventsBatch.length > 0) {
+            responseBodyJson.events = eventsBatch;
+          }
+          Iif (purchasesBatch.length > 0) {
+            responseBodyJson.purchases = purchasesBatch;
+          }
+          batchResponse.body.JSON = responseBodyJson;
+          // modify the endpoint to track endpoint
+          batchResponse.endpoint = trackEndpoint;
+          respList.push(
+            formatBatchResponse(batchResponse, trackMetadataBatch, destination)
+          );
+ 
+          // clear the arrays and reuse
+          attributesBatch = [];
+          eventsBatch = [];
+          purchasesBatch = [];
+          trackMetadataBatch = [];
+        }
+      }
+ 
+      // add only if present
+      if (attributes) {
+        attributesBatch.push(...attributes);
+      }
+ 
+      if (events) {
+        eventsBatch.push(...events);
+      }
+ 
+      if (purchases) {
+        purchasesBatch.push(...purchases);
+      }
+ 
+      // keep the original metadata object. needed later to form the batch
+      trackMetadataBatch.push(metadata);
+    } else {
+      // identify
+      if (!identifyEndpoint) {
+        identifyEndpoint = endPoint;
+      }
+      const aliasObjectArr = get(jsonBody, "aliases_to_identify");
+      const aliasMaxCount =
+        aliasBatch.length + (aliasObjectArr ? aliasObjectArr.length : 0);
+ 
+      Iif (aliasMaxCount > IDENTIFY_BRAZE_MAX_REQ_COUNT) {
+        // form an identify batch and start over
+        const batchResponse = defaultRequestConfig();
+        batchResponse.headers = message.headers;
+        batchResponse.endpoint = identifyEndpoint;
+        const responseBodyJson = {
+          partner: BRAZE_PARTNER_NAME
+        };
+        if (aliasBatch.length > 0) {
+          responseBodyJson.aliases_to_identify = [...aliasBatch];
+        }
+        batchResponse.body.JSON = responseBodyJson;
+        respList.push(
+          formatBatchResponse(batchResponse, identifyMetadataBatch, destination)
+        );
+ 
+        // clear the arrays and reuse
+        aliasBatch = [];
+        identifyMetadataBatch = [];
+      }
+ 
+      // separate out the identify request
+      // respList.push(formatBatchResponse(message, [metadata], destination));
+      Eif (aliasObjectArr.length > 0) {
+        aliasBatch.push(aliasObjectArr[0]);
+      }
+ 
+      identifyMetadataBatch.push(metadata);
+    }
+  }
+ 
+  // process identify events
+  const ev = destEvents[index - 1];
+  const { message, destination } = ev;
+  if (aliasBatch.length > 0) {
+    const identifyBatchResponse = defaultRequestConfig();
+    identifyBatchResponse.headers = message.headers;
+    const identifyResponseBodyJson = {
+      partner: BRAZE_PARTNER_NAME
+    };
+    identifyResponseBodyJson.aliases_to_identify = aliasBatch;
+    identifyBatchResponse.body.JSON = identifyResponseBodyJson;
+    // modify the endpoint to identify endpoint
+    identifyBatchResponse.endpoint = identifyEndpoint;
+    respList.push(
+      formatBatchResponse(
+        identifyBatchResponse,
+        identifyMetadataBatch,
+        destination
+      )
+    );
+  }
+ 
+  // process track events
+  Eif (
+    attributesBatch.length > 0 ||
+    eventsBatch.length > 0 ||
+    purchasesBatch.length > 0
+  ) {
+    const trackBatchResponse = defaultRequestConfig();
+    trackBatchResponse.headers = message.headers;
+    trackBatchResponse.endpoint = trackEndpoint;
+    const trackResponseBodyJson = {
+      partner: BRAZE_PARTNER_NAME
+    };
+    Eif (attributesBatch.length > 0) {
+      trackResponseBodyJson.attributes = attributesBatch;
+    }
+    Eif (eventsBatch.length > 0) {
+      trackResponseBodyJson.events = eventsBatch;
+    }
+    if (purchasesBatch.length > 0) {
+      trackResponseBodyJson.purchases = purchasesBatch;
+    }
+    trackBatchResponse.body.JSON = trackResponseBodyJson;
+    // modify the endpoint to track endpoint
+    trackBatchResponse.endpoint = trackEndpoint;
+    respList.push(
+      formatBatchResponse(trackBatchResponse, trackMetadataBatch, destination)
+    );
+  }
+ 
+  return respList;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        const errObj = generateErrorObject(
+          error,
+          DESTINATION,
+          TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM
+        );
+        return getErrorRespEvents(
+          [input.metadata],
+          error.status || 400,
+          error.message || "Error occurred while processing payload.",
+          errObj.statTags
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest, batch };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/candu/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/candu/config.js.html new file mode 100644 index 00000000000..8aa9a51cee5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/candu/config.js.html @@ -0,0 +1,125 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/candu/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/candu config.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +161x +1x +  +1x +  +  +  +  +1x +  +1x +  +  +  +  + 
const endpoint = "https://api.candu.ai/api/eventWebhook";
+const { getMappingConfig } = require("../../util");
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { type: "identify", name: "CanduIdentify" },
+  TRACK: { type: "track", name: "CanduTrack" }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  endpoint,
+  identifyDataMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY.name],
+  trackDataMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK.name]
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/candu/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/candu/index.html new file mode 100644 index 00000000000..fefdd545a59 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/candu/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/candu + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/candu

+
+ +
+ 91.84% + Statements + 45/49 +
+ + +
+ 61.9% + Branches + 13/21 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 91.84% + Lines + 45/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%5/5100%0/0100%0/0100%5/5
transform.js +
+
90.91%40/4461.9%13/21100%5/590.91%40/44
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/candu/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/candu/transform.js.html new file mode 100644 index 00000000000..b3ee45c30ad --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/candu/transform.js.html @@ -0,0 +1,386 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/candu/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/candu transform.js

+
+ +
+ 90.91% + Statements + 40/44 +
+ + +
+ 61.9% + Branches + 13/21 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 90.91% + Lines + 40/44 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +1031x +  +  +  +  +  +  +  +1x +1x +  +1x +6x +6x +  +  +6x +5x +  +6x +6x +6x +6x +6x +  +  +  +6x +  +  +1x +10x +1x +9x +1x +  +  +  +  +8x +8x +8x +  +3x +3x +3x +  +4x +3x +3x +  +1x +  +  +  +  +6x +  +  +1x +10x +  +1x +1x +  +  +  +  +1x +  +1x +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const { EventType } = require("../../../constants");
+const {
+  CustomError,
+  defaultRequestConfig,
+  constructPayload,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  removeUndefinedAndNullValues
+} = require("../../util");
+const { endpoint, identifyDataMapping, trackDataMapping } = require("./config");
+ 
+const responseBuilder = (body, { Config }) => {
+  const payload = body;
+  payload.context = {
+    source: "RudderStack"
+  };
+  if (payload.userId) {
+    payload.userId = `${payload.userId}`;
+  }
+  const response = defaultRequestConfig();
+  response.endpoint = endpoint;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  const basicAuth = Buffer.from(Config.apiKey).toString("base64");
+  response.headers = {
+    Authorization: `Basic ${basicAuth}`,
+    "Content-Type": "application/json"
+  };
+  return response;
+};
+ 
+const processEvent = (message, destination) => {
+  if (!destination.Config.apiKey.trim())
+    throw new CustomError(`[CANDU]:: apiKey cannot be empty.`, 400);
+  if (!message.type) {
+    throw new CustomError(
+      "[CANDU]:: Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const messageType = message.type.toLowerCase();
+  let payload = {};
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      payload = constructPayload(message, identifyDataMapping);
+      payload.type = "identify";
+      break;
+    case EventType.TRACK:
+      payload = constructPayload(message, trackDataMapping);
+      payload.type = "track";
+      break;
+    default:
+      throw new CustomError(
+        `[CANDU]:: Message type ${messageType} not supported.`,
+        400
+      );
+  }
+  return responseBuilder(payload, destination);
+};
+ 
+const process = event => {
+  return processEvent(event.message, event.destination);
+};
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/clevertap/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/clevertap/config.js.html new file mode 100644 index 00000000000..55cabffbdd7 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/clevertap/config.js.html @@ -0,0 +1,236 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/clevertap/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/clevertap config.js

+
+ +
+ 90% + Statements + 9/10 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 90% + Lines + 9/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +532x +  +2x +18x +18x +  +  +  +18x +  +  +2x +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +2x +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const getEndpoint = destination => {
+  const { region } = destination.Config;
+  Iif (region && region !== "none") {
+    return `https://${region}.api.clevertap.com/1/upload`;
+  }
+ 
+  return "https://api.clevertap.com/1/upload";
+};
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { name: "CleverTapIdentify", type: "identify" },
+  PAGE: { name: "CleverTapPage", type: "page" },
+  SCREEN: { name: "CleverTapScreen", type: "screen" },
+  TRACK: { name: "CleverTapTrack", type: "track" },
+  ECOM: { name: "CleverTapEcom" }
+};
+ 
+// These are clevertap specific properties we are already mapping
+// using our mapping json.
+const CLEVERTAP_DEFAULT_EXCLUSION = [
+  "email",
+  "firstName",
+  "firstname",
+  "first_name",
+  "lastName",
+  "lastname",
+  "last_name",
+  "name",
+  "phone",
+  "gender",
+  "education",
+  "employed",
+  "birthday",
+  "married",
+  "customerType",
+  "anonymousId",
+  "avatar",
+  "userId",
+  "id",
+  "ts"
+];
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  getEndpoint,
+  CLEVERTAP_DEFAULT_EXCLUSION,
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/clevertap/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/clevertap/index.html new file mode 100644 index 00000000000..b3d6c91d635 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/clevertap/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/clevertap + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/clevertap

+
+ +
+ 93.28% + Statements + 111/119 +
+ + +
+ 80% + Branches + 64/80 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 93.28% + Lines + 111/119 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
90%9/1075%3/4100%1/190%9/10
transform.js +
+
93.58%102/10980.26%61/76100%11/1193.58%102/109
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/clevertap/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/clevertap/transform.js.html new file mode 100644 index 00000000000..91b16e0b647 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/clevertap/transform.js.html @@ -0,0 +1,1118 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/clevertap/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/clevertap transform.js

+
+ +
+ 93.58% + Statements + 102/109 +
+ + +
+ 80.26% + Branches + 61/76 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 93.58% + Lines + 102/109 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347  +  +2x +2x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +18x +  +  +  +18x +18x +18x +  +  +  +  +18x +18x +  +  +  +2x +3x +3x +3x +  +  +  +  +  +  +3x +  +  +  +  +3x +2x +  +2x +2x +  +1x +  +1x +  +3x +  +  +  +  +  +2x +5x +  +  +  +  +  +  +  +  +  +  +  +5x +1x +  +5x +  +  +  +2x +2x +2x +2x +  +1x +1x +  +1x +  +  +  +  +2x +  +  +  +2x +6x +6x +  +  +  +  +2x +8x +  +8x +  +  +  +  +2x +  +  +  +  +8x +  +  +  +  +  +  +8x +  +  +2x +  +  +  +  +17x +8x +8x +3x +  +  +  +  +  +3x +3x +3x +3x +  +3x +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +  +  +5x +  +  +  +  +9x +  +  +  +1x +  +  +  +  +  +  +  +  +8x +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +7x +  +8x +  +  +8x +2x +  +6x +  +  +  +8x +1x +  +  +8x +  +  +  +  +14x +14x +  +  +  +  +  +  +2x +19x +1x +  +  +  +  +18x +  +  +18x +  +8x +8x +  +2x +2x +  +1x +1x +  +6x +6x +  +1x +  +17x +  +  +2x +19x +  +  +2x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +2x + 
/* eslint-disable no-param-reassign */
+/* eslint-disable no-nested-ternary */
+const get = require("get-value");
+const { EventType } = require("../../../constants");
+const {
+  getEndpoint,
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG,
+  CLEVERTAP_DEFAULT_EXCLUSION
+} = require("./config");
+ 
+const {
+  defaultRequestConfig,
+  getFieldValueFromMessage,
+  extractCustomFields,
+  constructPayload,
+  defaultPostRequestConfig,
+  removeUndefinedAndNullValues,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  toUnixTimestamp,
+  isAppleFamily
+} = require("../../util");
+ 
+/*
+Following behaviour is expected when "enableObjectIdMapping" is enabled
+ 
+For Identify Events
+---------------RudderStack-----------------             ------------Clevertap-------------
+anonymousId(present?)				userId(present?)	 					objectId(value)			        identity(value)
+true						            true						            anonymousId			              userId
+true						            false					              anonymousId			              -
+false					              true						            (clevertap_generated_uuid)		userId
+ 
+For tracking events
+---------------RudderStack-----------------           ----------Clevertap---------
+anonymousId(present?)				userId(present?)					tracking with
+true						            true						          objectId (value = anonymousId)
+true						            false					            objectId (value = anonymousId)
+false					              true						          identity (value = userId)
+*/
+ 
+// wraps to default request config
+const responseWrapper = (payload, destination) => {
+  const response = defaultRequestConfig();
+  // If the acount belongs to specific regional server,
+  // we need to modify the url endpoint based on dest config.
+  // Source: https://developer.clevertap.com/docs/idc
+  response.endpoint = getEndpoint(destination);
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.headers = {
+    "X-CleverTap-Account-Id": destination.Config.accountId,
+    "X-CleverTap-Passcode": destination.Config.passcode,
+    "Content-Type": "application/json"
+  };
+  response.body.JSON = payload;
+  return response;
+};
+ 
+// generates clevertap identify payload with both objectId and identity
+const mapIdentifyPayloadWithObjectId = (message, profile) => {
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  const anonymousId = get(message, "anonymousId");
+  const payload = {
+    type: "profile",
+    profileData: profile,
+    ts: get(message, "traits.ts") || get(message, "context.traits.ts")
+  };
+ 
+  // If timestamp is not in unix format
+  Iif (payload.ts && !Number(payload.ts)) {
+    payload.ts = toUnixTimestamp(payload.ts);
+  }
+ 
+  // If anonymousId is present prioritising to set it as objectId
+  if (anonymousId) {
+    payload.objectId = anonymousId;
+    // If userId is present we set it as identity inside profiledData
+    Eif (userId) {
+      payload.profileData.identity = userId;
+    }
+  } else Eif (userId) {
+    // If only userId present set it as identity in root of payload
+    payload.identity = userId;
+  }
+  return {
+    d: [payload]
+  };
+};
+ 
+// generates clevertap identify payload with only identity
+const mapIdentifyPayload = (message, profile) => {
+  const payload = {
+    d: [
+      {
+        type: "profile",
+        profileData: profile,
+        ts: get(message, "traits.ts") || get(message, "context.traits.ts"),
+        identity: getFieldValueFromMessage(message, "userId")
+      }
+    ]
+  };
+ 
+  // If timestamp is not in unix format
+  if (payload.d[0].ts && !Number(payload.d[0].ts)) {
+    payload.d[0].ts = toUnixTimestamp(payload.d[0].ts);
+  }
+  return payload;
+};
+ 
+// generates clevertap tracking payload with objectId or identity
+const mapTrackPayloadWithObjectId = (message, eventPayload) => {
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  const anonymousId = get(message, "anonymousId");
+  if (anonymousId) {
+    // If anonymousId is present set it as objectId in root
+    eventPayload.objectId = anonymousId;
+  } else Eif (userId) {
+    // If userId is present set it as identity in root
+    eventPayload.identity = userId;
+  } else {
+    // Flow should not reach here fail safety
+    throw CustomError("Unable to process without anonymousId or userId", 400);
+  }
+  return eventPayload;
+};
+ 
+// generates clevertap tracking payload with only identity
+const mapTrackPayload = (message, eventPayload) => {
+  eventPayload.identity = getFieldValueFromMessage(message, "userId");
+  return eventPayload;
+};
+ 
+// Here we are creating the profileData info for identify calls
+// ---------------------------------------------------------------------
+const getClevertapProfile = (message, category) => {
+  let profile = constructPayload(message, MAPPING_CONFIG[category.name]);
+  // Extract other K-V property from traits about user custom properties
+  if (
+    !get(profile, "Name") &&
+    getFieldValueFromMessage(message, "firstName") &&
+    getFieldValueFromMessage(message, "lastName")
+  ) {
+    profile.Name = `${getFieldValueFromMessage(
+      message,
+      "firstName"
+    )} ${getFieldValueFromMessage(message, "lastName")}`;
+  }
+  profile = extractCustomFields(
+    message,
+    profile,
+    ["traits", "context.traits"],
+    CLEVERTAP_DEFAULT_EXCLUSION
+  );
+ 
+  return removeUndefinedAndNullValues(profile);
+};
+ 
+const responseBuilderSimple = (message, category, destination) => {
+  let payload;
+  // For identify type of events we require a specific type of payload
+  // Source: https://developer.clevertap.com/docs/upload-user-profiles-api
+  // ---------------------------------------------------------------------
+  if (category.type === "identify") {
+    const profile = getClevertapProfile(message, category);
+    if (destination.Config.enableObjectIdMapping) {
+      payload = mapIdentifyPayloadWithObjectId(message, profile);
+      // In case we have device token present we return an array
+      // of response the first object is identify payload and second
+      // object is the upload device token payload
+      // TO use uploadDeviceToken api "enableObjectIdMapping" should be enabled
+      // also anoymousId should be present to map it with objectId
+      const deviceToken = get(message, "context.device.token");
+      let deviceOS = get(message, "context.os.name");
+      Eif (deviceOS) {
+        deviceOS = deviceOS.toLowerCase();
+      }
+      if (
+        get(message, "anonymousId") &&
+        deviceToken &&
+        (deviceOS === "android" || isAppleFamily(deviceOS))
+      ) {
+        const tokenType = deviceOS === "android" ? "fcm" : "apns";
+        const payloadForDeviceToken = {
+          d: [
+            {
+              type: "token",
+              tokenData: {
+                id: deviceToken,
+                type: tokenType
+              },
+              objectId: get(message, "anonymousId")
+            }
+          ]
+        };
+        const respArr = [];
+        respArr.push(responseWrapper(payload, destination)); // identify
+        respArr.push(responseWrapper(payloadForDeviceToken, destination)); // device token
+        return respArr;
+      }
+    } else {
+      payload = mapIdentifyPayload(message, profile);
+    }
+  } else {
+    // If trackAnonymous option is disabled from dashboard then we will check for presence of userId only
+    // if userId is not present we will throw error. If it is enabled we will process the event with anonId.
+    if (
+      !destination.Config.trackAnonymous &&
+      !getFieldValueFromMessage(message, "userIdOnly")
+    ) {
+      throw new CustomError(
+        "userId, not present cannot track anonymous user",
+        400
+      );
+    }
+    let eventPayload;
+    // For 'Order Completed' type of events we are mapping it as 'Charged'
+    // Special event in Clevertap.
+    // Source: https://developer.clevertap.com/docs/concepts-events#recording-customer-purchases
+    if (
+      get(message.event) &&
+      get(message.event).toLowerCase() === "order completed"
+    ) {
+      eventPayload = {
+        evtName: "Charged",
+        evtData: constructPayload(
+          message,
+          MAPPING_CONFIG[CONFIG_CATEGORIES.ECOM.name]
+        ),
+        ts: get(message, "properties.ts")
+      };
+ 
+      eventPayload.evtData = extractCustomFields(
+        message,
+        eventPayload.evtData,
+        ["properties"],
+        ["checkout_id", "revenue", "products", "ts"]
+      );
+    }
+    // For other type of events we need to follow payload for sending events
+    // Source: https://developer.clevertap.com/docs/upload-events-api
+    // ----------------------------------------------------------------------
+    else {
+      eventPayload = constructPayload(message, MAPPING_CONFIG[category.name]);
+    }
+    eventPayload.type = "event";
+ 
+    // setting identification for tracking payload here based on destination config
+    if (destination.Config.enableObjectIdMapping) {
+      eventPayload = mapTrackPayloadWithObjectId(message, eventPayload);
+    } else {
+      eventPayload = mapTrackPayload(message, eventPayload);
+    }
+ 
+    // If timestamp is not in unix format
+    if (eventPayload.ts && !Number(eventPayload.ts)) {
+      eventPayload.ts = toUnixTimestamp(eventPayload.ts);
+    }
+ 
+    payload = {
+      d: [removeUndefinedAndNullValues(eventPayload)]
+    };
+  }
+ 
+  Eif (payload) {
+    return responseWrapper(payload, destination);
+  }
+  // fail-safety for developer error
+  throw new CustomError("Payload could not be constructed", 400);
+};
+// Main Process func for processing events
+// Idnetify, Track, Screen, and Page calls are supported
+const processEvent = (message, destination) => {
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const messageType = message.type.toLowerCase();
+ 
+  let category;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      category = CONFIG_CATEGORIES.IDENTIFY;
+      break;
+    case EventType.PAGE:
+      category = CONFIG_CATEGORIES.PAGE;
+      break;
+    case EventType.SCREEN:
+      category = CONFIG_CATEGORIES.SCREEN;
+      break;
+    case EventType.TRACK:
+      category = CONFIG_CATEGORIES.TRACK;
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+  return responseBuilderSimple(message, category, destination);
+};
+ 
+const process = event => {
+  return processEvent(event.message, event.destination);
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/clickhouse/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/clickhouse/index.html new file mode 100644 index 00000000000..ac388b5d631 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/clickhouse/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/clickhouse + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/clickhouse

+
+ +
+ 93.55% + Statements + 29/31 +
+ + +
+ 87.5% + Branches + 21/24 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 93.33% + Lines + 28/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
93.55%29/3187.5%21/24100%3/393.33%28/30
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/clickhouse/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/clickhouse/transform.js.html new file mode 100644 index 00000000000..b3f36eac4c9 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/clickhouse/transform.js.html @@ -0,0 +1,275 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/clickhouse/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/clickhouse transform.js

+
+ +
+ 93.55% + Statements + 29/31 +
+ + +
+ 87.5% + Branches + 21/24 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 93.33% + Lines + 28/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +663x +3x +  +3x +  +  +124x +  +  +  +2931x +2915x +  +16x +  +14x +  +  +  +14x +14x +14x +24x +24x +10x +  +  +10x +3x +  +3x +  +7x +  +4x +  +3x +  +  +14x +  +2x +  +  +  +124x +124x +124x +  +124x +124x +  +  +  +  +  +  +  +  +  +  +3x +  +  +  + 
const { processWarehouseMessage } = require("../../../warehouse");
+const { getDataType } = require("../../../warehouse/index");
+ 
+const clickhouse = "clickhouse";
+ 
+function processSingleMessage(message, options) {
+  return processWarehouseMessage(message, options);
+}
+ 
+function getDataTypeOverride(key, val, options) {
+  if (options.chEnableArraySupport === "false") {
+    return "string";
+  }
+  if (Array.isArray(val)) {
+    // for now returning it as string. confirm this case
+    Iif (val.length === 0) {
+      return "string";
+    }
+    // check for different data types in the array. if there are different then return array(string)
+    const firstValueDataType = getDataType(key, val[0], {});
+    let finalDataType = firstValueDataType;
+    for (let i = 1; i < val.length; i += 1) {
+      const dataType = getDataType(key, val[i], {});
+      if (finalDataType !== dataType) {
+        Iif (finalDataType === "string") {
+          break;
+        }
+        if (dataType === "float" && finalDataType === "int") {
+          finalDataType = "float";
+          // eslint-disable-next-line no-continue
+          continue;
+        }
+        if (dataType === "int" && finalDataType === "float") {
+          // eslint-disable-next-line no-continue
+          continue;
+        }
+        finalDataType = "string";
+      }
+    }
+    return `array(${finalDataType})`;
+  }
+  return "string";
+}
+ 
+function process(event) {
+  const whSchemaVersion = event.request.query.whSchemaVersion || "v1";
+  const whStoreEvent = event.destination.Config.storeFullEvent === true;
+  const provider = clickhouse;
+  const chEnableArraySupport =
+    event.request.query.chEnableArraySupport || "false";
+  return processSingleMessage(event.message, {
+    metadata: event.metadata,
+    whSchemaVersion,
+    whStoreEvent,
+    getDataTypeOverride,
+    provider,
+    chEnableArraySupport,
+    sourceCategory: event.metadata ? event.metadata.sourceCategory : null
+  });
+}
+ 
+module.exports = {
+  process,
+  getDataTypeOverride
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/confluent_cloud/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/confluent_cloud/index.html new file mode 100644 index 00000000000..a66be7808b2 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/confluent_cloud/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/confluent_cloud + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/confluent_cloud

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%3/350%1/2100%1/1100%3/3
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/confluent_cloud/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/confluent_cloud/transform.js.html new file mode 100644 index 00000000000..ddaf6547fc9 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/confluent_cloud/transform.js.html @@ -0,0 +1,107 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/confluent_cloud/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/confluent_cloud transform.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10  +5x +  +  +  +5x +  +  +1x + 
function process(event) {
+  const result = {
+    message: event.message,
+    userId: event.message.userId || event.message.anonymousId
+  };
+  return result;
+}
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/customerio/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/customerio/config.js.html new file mode 100644 index 00000000000..ffa755bd4df --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/customerio/config.js.html @@ -0,0 +1,149 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/customerio/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/customerio config.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +241x +  +  +1x +  +1x +  +1x +  +  +1x +  +  +1x +  +1x +  +  +  +  +  +  +  + 
const IDENTITY_ENDPOINT = "https://track.customer.io/api/v1/customers/:id";
+ 
+const USER_EVENT_ENDPOINT =
+  "https://track.customer.io/api/v1/customers/:id/events";
+ 
+const MERGE_USER_ENDPOINT = "https://track.customer.io/api/v1/merge_customers";
+ 
+const ANON_EVENT_ENDPOINT = "https://track.customer.io/api/v1/events";
+ 
+const DEVICE_REGISTER_ENDPOINT =
+  "https://track.customer.io/api/v1/customers/:id/devices";
+ 
+const DEVICE_DELETE_ENDPOINT =
+  "https://track.customer.io/api/v1/customers/:id/devices/:device_id";
+ 
+module.exports = {
+  IDENTITY_ENDPOINT,
+  USER_EVENT_ENDPOINT,
+  ANON_EVENT_ENDPOINT,
+  DEVICE_REGISTER_ENDPOINT,
+  DEVICE_DELETE_ENDPOINT,
+  MERGE_USER_ENDPOINT
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/customerio/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/customerio/index.html new file mode 100644 index 00000000000..9cc19a6cc96 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/customerio/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/customerio + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/customerio

+
+ +
+ 87.5% + Statements + 133/152 +
+ + +
+ 69.7% + Branches + 69/99 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 87.5% + Lines + 133/152 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%7/7100%0/0100%0/0100%7/7
transform.js +
+
86.9%126/14569.7%69/99100%11/1186.9%126/145
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/customerio/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/customerio/transform.js.html new file mode 100644 index 00000000000..79f9da69662 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/customerio/transform.js.html @@ -0,0 +1,1157 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/customerio/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/customerio transform.js

+
+ +
+ 86.9% + Statements + 126/145 +
+ + +
+ 69.7% + Branches + 69/99 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 86.9% + Lines + 126/145 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +3601x +1x +1x +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +  +  +  +  +1x +58x +  +  +  +  +  +  +  +1x +  +  +  +1x +6x +6x +6x +6x +6x +30x +  +  +  +  +  +46x +  +  +46x +  +46x +46x +2x +2x +  +  +46x +46x +46x +46x +  +  +  +  +  +46x +  +6x +  +  +  +  +6x +6x +  +6x +6x +6x +6x +  +  +  +19x +  +  +  +  +  +12x +12x +  +  +  +  +  +  +  +  +  +6x +3x +3x +6x +6x +  +  +  +  +6x +  +6x +  +  +  +  +  +  +  +  +6x +6x +  +  +  +  +  +  +  +  +  +  +6x +4x +  +6x +6x +40x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +40x +  +  +  +40x +8x +6x +  +  +  +  +6x +6x +  +6x +  +2x +  +  +  +32x +14x +14x +14x +14x +14x +  +14x +  +  +  +  +14x +14x +  +18x +18x +18x +18x +18x +18x +  +  +  +  +  +  +  +  +  +  +  +32x +26x +14x +  +12x +  +  +6x +  +6x +  +1x +  +  +  +  +5x +  +  +  +6x +6x +  +  +6x +  +6x +  +  +38x +38x +38x +38x +  +38x +  +  +  +46x +  +  +46x +  +6x +6x +  +3x +3x +3x +  +1x +1x +1x +  +36x +36x +36x +  +  +  +  +  +  +  +46x +  +  +  +  +  +  +  +  +44x +14x +  +  +  +  +  +44x +  +  +  +46x +46x +46x +44x +44x +  +44x +  +44x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const set = require("set-value");
+const btoa = require("btoa");
+const truncate = require("truncate-utf8-bytes");
+const {
+  EventType,
+  SpecedTraits,
+  TraitsMapping,
+  MappedToDestinationKey
+} = require("../../../constants");
+const {
+  adduserIdFromExternalId,
+  removeUndefinedValues,
+  defaultPostRequestConfig,
+  defaultPutRequestConfig,
+  defaultRequestConfig,
+  getFieldValueFromMessage,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  addExternalIdToTraits
+} = require("../../util");
+ 
+const {
+  IDENTITY_ENDPOINT,
+  USER_EVENT_ENDPOINT,
+  ANON_EVENT_ENDPOINT,
+  DEVICE_REGISTER_ENDPOINT,
+  DEVICE_DELETE_ENDPOINT,
+  MERGE_USER_ENDPOINT
+} = require("./config");
+const logger = require("../../../logger");
+ 
+const deviceRelatedEventNames = [
+  "Application Installed",
+  "Application Opened",
+  "Application Uninstalled"
+];
+ 
+const isdeviceRelatedEventName = (eventName, destination) => {
+  return (
+    deviceRelatedEventNames.includes(eventName) ||
+    (destination.Config &&
+      destination.Config.deviceTokenEventName &&
+      destination.Config.deviceTokenEventName === eventName)
+  );
+};
+ 
+const deviceDeleteRelatedEventName = "Application Uninstalled";
+ 
+// Get the spec'd traits, for now only address needs treatment as 2 layers.
+// populate the list of spec'd traits in constants.js
+const populateSpecedTraits = (payload, message) => {
+  const pathToTraits = message.traits ? "traits" : "context.traits";
+  SpecedTraits.forEach(trait => {
+    const mapping = TraitsMapping[trait];
+    const keys = Object.keys(mapping);
+    keys.forEach(key => {
+      set(payload, key, get(message, `${pathToTraits}.${mapping[`${key}`]}`));
+    });
+  });
+};
+ 
+function responseBuilder(message, evType, evName, destination, messageType) {
+  const rawPayload = {};
+  let endpoint;
+  let trimmedEvName;
+  let requestConfig = defaultPostRequestConfig;
+  // override userId with externalId in context(if present) and event is mapped to destination
+  const mappedToDestination = get(message, MappedToDestinationKey);
+  if (mappedToDestination) {
+    addExternalIdToTraits(message);
+    adduserIdFromExternalId(message);
+  }
+ 
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  const response = defaultRequestConfig();
+  response.userId = userId || message.anonymousId;
+  response.headers = {
+    Authorization: `Basic ${btoa(
+      `${destination.Config.siteID}:${destination.Config.apiKey}`
+    )}`
+  };
+ 
+  if (evType === EventType.IDENTIFY) {
+    // if userId is not there simply drop the payload
+    Iif (!userId) {
+      throw new CustomError("userId not present", 400);
+    }
+ 
+    // populate speced traits
+    const identityTrailts = getFieldValueFromMessage(message, "traits") || {};
+    populateSpecedTraits(rawPayload, message);
+ 
+    Eif (Object.keys(identityTrailts).length > 0) {
+      const traits = Object.keys(identityTrailts);
+      const pathToTraits = message.traits ? "traits" : "context.traits";
+      traits.forEach(trait => {
+        // populate keys other than speced traits
+        // also don't send anonymousId, userId as we are setting those form the SDK and it's not actually an user property for the customer
+        // discard createdAt as well as we are setting the values at created_at separately
+        if (
+          !SpecedTraits.includes(trait) &&
+          trait !== "createdAt" &&
+          trait !== "userId" &&
+          trait !== "anonymousId"
+        ) {
+          const dotEscapedTrait = trait.replace(".", "\\.");
+          set(
+            rawPayload,
+            dotEscapedTrait,
+            get(message, `${pathToTraits}.${trait}`)
+          );
+        }
+      });
+    }
+ 
+    // populate user_properties (DEPRECATED)
+    if (message.user_properties) {
+      const userProps = Object.keys(message.user_properties);
+      userProps.forEach(prop => {
+        const val = get(message, `user_properties.${prop}`);
+        set(rawPayload, prop, val);
+      });
+    }
+ 
+    // make user creation time
+    const createAt = getFieldValueFromMessage(message, "createdAtOnly");
+    // set the created_at field if traits.createAt or context.traits.createAt is passed
+    Iif (createAt) {
+      set(
+        rawPayload,
+        "created_at",
+        Math.floor(new Date(createAt).getTime() / 1000)
+      );
+    }
+ 
+    // Impportant for historical import
+    Eif (getFieldValueFromMessage(message, "historicalTimestamp")) {
+      set(
+        rawPayload,
+        "_timestamp",
+        Math.floor(
+          new Date(
+            getFieldValueFromMessage(message, "historicalTimestamp")
+          ).getTime() / 1000
+        )
+      );
+    }
+    // anonymous_id needs to be sent for identify calls to merge with any previous anon track calls
+    if (message && message.anonymousId) {
+      set(rawPayload, "anonymous_id", message.anonymousId);
+    }
+    endpoint = IDENTITY_ENDPOINT.replace(":id", userId);
+    requestConfig = defaultPutRequestConfig;
+  } else Iif (evType === EventType.ALIAS) {
+    // ref : https://customer.io/docs/api/#operation/merge
+    if (!userId && !message.previousId) {
+      throw new CustomError(
+        "Both userId and previousId is mandatory for merge operation",
+        400
+      );
+    }
+    endpoint = MERGE_USER_ENDPOINT;
+    requestConfig = defaultPostRequestConfig;
+    rawPayload.primary = {};
+    rawPayload.primary.id = userId;
+    rawPayload.secondary = {};
+    rawPayload.secondary.id = message.previousId;
+  } else {
+    // any other event type except identify
+    const token = get(message, "context.device.token");
+ 
+    // use this if only top level keys are to be sent
+    // DEVICE DELETE from CustomerIO
+    if (deviceDeleteRelatedEventName === evName) {
+      if (userId && token) {
+        endpoint = DEVICE_DELETE_ENDPOINT.replace(":id", userId).replace(
+          ":device_id",
+          token
+        );
+ 
+        response.endpoint = endpoint;
+        response.method = "DELETE";
+ 
+        return response;
+      }
+      throw new CustomError("userId or device_token not present", 400);
+    }
+ 
+    // DEVICE registration
+    if (isdeviceRelatedEventName(evName, destination) && userId && token) {
+      const devProps = message.properties || {};
+      set(devProps, "id", get(message, "context.device.token"));
+      const deviceType = get(message, "context.device.type");
+      Eif (deviceType) {
+        set(devProps, "platform", deviceType.toLowerCase());
+      }
+      set(
+        devProps,
+        "last_used",
+        Math.floor(new Date(message.originalTimestamp).getTime() / 1000)
+      );
+      set(rawPayload, "device", devProps);
+      requestConfig = defaultPutRequestConfig;
+    } else {
+      rawPayload.data = {};
+      set(rawPayload, "data", message.properties);
+      set(rawPayload, "name", evName);
+      set(rawPayload, "type", evType);
+      Eif (getFieldValueFromMessage(message, "historicalTimestamp")) {
+        set(
+          rawPayload,
+          "timestamp",
+          Math.floor(
+            new Date(
+              getFieldValueFromMessage(message, "historicalTimestamp")
+            ).getTime() / 1000
+          )
+        );
+      }
+    }
+ 
+    if (userId) {
+      if (isdeviceRelatedEventName(evName, destination) && token) {
+        endpoint = DEVICE_REGISTER_ENDPOINT.replace(":id", userId);
+      } else {
+        endpoint = USER_EVENT_ENDPOINT.replace(":id", userId);
+      }
+    } else {
+      endpoint = ANON_EVENT_ENDPOINT;
+      // CustomerIO supports 100byte of event name for anonymous users
+      if (messageType === EventType.SCREEN) {
+        // 100 - len(`Viewed  Screen`) = 86
+        trimmedEvName = `Viewed ${truncate(
+          message.event || message.properties.name,
+          86
+        )} Screen`;
+      } else {
+        trimmedEvName = truncate(evName, 100);
+      }
+      // anonymous_id needs to be sent for anon track calls to provide information on which anon user is being tracked
+      // This will help in merging for subsequent calls
+      const anonymousId = message.anonymousId ? message.anonymousId : undefined;
+      Iif (!anonymousId) {
+        throw new Error("Anonymous id/ user id is required");
+      } else {
+        rawPayload.anonymous_id = anonymousId;
+      }
+      set(rawPayload, "name", trimmedEvName);
+    }
+  }
+  const payload = removeUndefinedValues(rawPayload);
+  response.endpoint = endpoint;
+  response.method = requestConfig.requestMethod;
+  response.body.JSON = payload;
+ 
+  return response;
+}
+ 
+function processSingleMessage(message, destination) {
+  const messageType = message.type.toLowerCase();
+  let evType;
+  let evName;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      evType = "identify";
+      break;
+    case EventType.PAGE:
+      evType = "page"; // customerio mandates sending 'page' for pageview events
+      evName = message.name || message.properties.url;
+      break;
+    case EventType.SCREEN:
+      evType = "event";
+      evName = `Viewed ${message.event || message.properties.name} Screen`;
+      break;
+    case EventType.TRACK:
+      evType = "event";
+      evName = message.event;
+      break;
+    case EventType.ALIAS:
+      evType = "alias";
+      break;
+    default:
+      logger.error(`could not determine type ${messageType}`);
+      throw new CustomError(`could not determine type ${messageType}`, 400);
+  }
+  const response = responseBuilder(
+    message,
+    evType,
+    evName,
+    destination,
+    messageType
+  );
+ 
+  // replace default domain with EU data center domainc for EU based account
+  if (destination.Config.datacenterEU) {
+    response.endpoint = response.endpoint.replace(
+      "track.customer.io",
+      "track-eu.customer.io"
+    );
+  }
+ 
+  return response;
+}
+ 
+function process(event) {
+  const respList = [];
+  const { message, destination } = event;
+  const result = processSingleMessage(message, destination);
+  Eif (!result.statusCode) {
+    result.statusCode = 200;
+  }
+  respList.push(result);
+ 
+  return respList;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          // eslint-disable-next-line no-nested-ternary
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/config.js.html new file mode 100644 index 00000000000..f2b4ad10deb --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/config.js.html @@ -0,0 +1,128 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/delighted/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/delighted config.js

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +171x +  +1x +  +1x +  +  +1x +  +1x +  +1x +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ENDPOINT = "https://api.delighted.com/v1/people.json";
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { type: "identify", name: "DelightedIdentify" }
+};
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+const TRACKING_EXCLUSION_FIELDS = ["channel", "delay", "last_sent_at", "send"];
+ 
+module.exports = {
+  ENDPOINT,
+  identifyMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY.name],
+  TRACKING_EXCLUSION_FIELDS
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/index.html new file mode 100644 index 00000000000..c83a753b68d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/delighted + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/delighted

+
+ +
+ 82.32% + Statements + 149/181 +
+ + +
+ 63.56% + Branches + 75/118 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 82.32% + Lines + 149/181 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%6/6100%0/0100%0/0100%6/6
transform.js +
+
87.8%108/12369.62%55/79100%6/687.8%108/123
util.js +
+
67.31%35/5251.28%20/39100%6/667.31%35/52
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/transform.js.html new file mode 100644 index 00000000000..12507e56eb2 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/transform.js.html @@ -0,0 +1,842 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/delighted/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/delighted transform.js

+
+ +
+ 87.8% + Statements + 108/123 +
+ + +
+ 69.62% + Branches + 55/79 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 87.8% + Lines + 108/123 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +2551x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +1x +  +1x +4x +4x +  +  +  +4x +4x +4x +3x +  +3x +  +3x +2x +  +  +  +1x +  +  +  +  +  +  +3x +3x +3x +3x +3x +3x +3x +  +  +3x +3x +  +  +3x +  +  +  +  +3x +3x +3x +  +  +  +3x +3x +3x +3x +  +  +1x +  +4x +4x +1x +  +  +  +  +  +3x +3x +1x +  +  +2x +2x +  +2x +  +  +2x +  +2x +1x +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +1x +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +1x +1x +1x +  +  +  +1x +1x +1x +1x +  +  +1x +  +4x +4x +  +4x +4x +1x +  +3x +3x +3x +  +  +  +3x +3x +2x +2x +  +  +3x +3x +  +  +  +3x +1x +  +  +  +  +2x +2x +2x +2x +2x +  +  +  +2x +2x +  +  +1x +12x +12x +  +  +  +  +  +  +12x +  +  +  +12x +  +  +12x +  +4x +3x +  +4x +1x +  +4x +2x +  +  +  +6x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const { EventType } = require("../../../constants");
+const {
+  getFieldValueFromMessage,
+  CustomError,
+  defaultRequestConfig,
+  extractCustomFields,
+  removeUndefinedAndNullValues,
+  getErrorRespEvents,
+  constructPayload,
+  getSuccessRespEvents,
+  getDestinationExternalID,
+  isEmptyObject,
+  defaultPostRequestConfig,
+  getValueFromMessage
+} = require("../../util");
+const logger = require("../../../logger");
+const {
+  isValidUserIdOrError,
+  eventValidity,
+  isValidEmail,
+  isValidPhone,
+  userValidity
+} = require("./util");
+const {
+  ENDPOINT,
+  TRACKING_EXCLUSION_FIELDS,
+  identifyMapping
+} = require("./config");
+ 
+const identifyResponseBuilder = (message, { Config }) => {
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  Iif (!userId) {
+    throw new CustomError("userId is required for identify", 400);
+  }
+  let channel =
+    getDestinationExternalID(message, "delightedChannelType") || Config.channel;
+  channel = channel.toLowerCase();
+  const { userIdType, userIdValue } = isValidUserIdOrError(channel, userId);
+  const payload = constructPayload(message, identifyMapping);
+ 
+  payload[userIdType] = userIdValue;
+ 
+  if (userIdType === "email" && payload.phone_number) {
+    Iif (!isValidPhone(payload.phone_number)) {
+      payload.phone_number = null;
+      logger.error("Phone number format must be E.164.");
+    }
+  } else Iif (userIdType === "phone_number" && payload.email) {
+    if (!isValidEmail(payload.email)) {
+      payload.email = null;
+      logger.error("Email format is not correct.");
+    }
+  }
+ 
+  payload.send = false;
+  payload.channel = channel;
+  payload.delay = Config.delay || 0;
+  Eif (!payload.name) {
+    const fName = getFieldValueFromMessage(message, "firstName");
+    const lName = getFieldValueFromMessage(message, "lastName");
+    const name = `${fName ? fName.trim() : ""} ${
+      lName ? lName.trim() : ""
+    }`.trim();
+    Eif (name) {
+      payload.name = name;
+    }
+  }
+  payload.last_sent_at = getValueFromMessage(message, [
+    "traits.last_sent_at",
+    "context.traits.last_sent_at"
+  ]);
+ 
+  const basicAuth = Buffer.from(Config.apiKey).toString("base64");
+  const response = defaultRequestConfig();
+  response.headers = {
+    Authorization: `Basic ${basicAuth}`,
+    "Content-Type": "application/json"
+  };
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = ENDPOINT;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  return response;
+};
+ 
+const trackResponseBuilder = async (message, { Config }) => {
+  // checks if the event is valid if not throws error else nothing
+  const isValidEvent = eventValidity(Config, message);
+  if (!isValidEvent) {
+    throw new CustomError(
+      "Event is not configured on your Rudderstack Dashboard",
+      400
+    );
+  }
+ 
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  if (!userId) {
+    throw new CustomError("userId is required.", 400);
+  }
+  let channel =
+    getDestinationExternalID(message, "delightedChannelType") || Config.channel;
+  channel = channel.toLowerCase();
+ 
+  const { userIdType, userIdValue } = isValidUserIdOrError(channel, userId);
+ 
+  // checking if user already exists or not, throw error if it doesn't
+  const check = await userValidity(channel, Config, userId);
+ 
+  if (!check) {
+    throw new CustomError(`user ${userId} doesnot exist`, 400);
+  }
+  let payload = {};
+  payload[userIdType] = userIdValue;
+  payload.send = true;
+  payload.channel = channel;
+  Eif (message.properties) {
+    payload.delay = parseInt(Config.delay || message.properties.delay || 0, 10);
+    payload.last_sent_at = getValueFromMessage(
+      message,
+      "properties.last_sent_at"
+    );
+  }
+  let properties = {};
+  properties = extractCustomFields(
+    message,
+    properties,
+    ["properties"],
+    TRACKING_EXCLUSION_FIELDS
+  );
+  Eif (!isEmptyObject(properties)) {
+    payload = {
+      ...payload,
+      properties
+    };
+  }
+ 
+  const basicAuth = Buffer.from(Config.apiKey).toString("base64");
+  const response = defaultRequestConfig();
+  response.headers = {
+    Authorization: `Basic ${basicAuth}`,
+    "Content-Type": "application/json"
+  };
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = ENDPOINT;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  return response;
+};
+ 
+const aliasResponseBuilder = (message, { Config }) => {
+  let channel =
+    getDestinationExternalID(message, "delightedChannelType") || Config.channel;
+  channel = channel.toLowerCase();
+ 
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  if (!userId) {
+    throw new CustomError("userId is required.", 400);
+  }
+  const payload = {};
+  const { previousId } = message;
+  Iif (!previousId) {
+    throw new CustomError("Previous Id is required for alias.", 400);
+  }
+  const emailType =
+    channel === "email" && isValidEmail(previousId) && isValidEmail(userId);
+  if (emailType) {
+    payload.email = previousId;
+    payload.email_update = userId;
+  }
+  const phoneType =
+    channel === "sms" && isValidPhone(previousId) && isValidPhone(userId);
+  Iif (phoneType) {
+    payload.phone_number = previousId;
+    payload.phone_number_update = userId;
+  }
+  if (!emailType && !phoneType) {
+    throw new CustomError(
+      "User Id and Previous Id should be of same type i.e. phone/sms",
+      400
+    );
+  }
+  const basicAuth = Buffer.from(Config.apiKey).toString("base64");
+  const response = defaultRequestConfig();
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.body.JSON = payload;
+  response.headers = {
+    Authorization: `Basic ${basicAuth}`,
+    "Content-Type": "application/json"
+  };
+  response.endpoint = ENDPOINT;
+  return response;
+};
+ 
+const process = async event => {
+  const { message, destination } = event;
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  Iif (!destination.Config.apiKey) {
+    throw new CustomError("Inavalid API Key. Aborting message.", 400);
+  }
+ 
+  const messageType = message.type.toLowerCase();
+ 
+  let response;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      response = identifyResponseBuilder(message, destination);
+      break;
+    case EventType.TRACK:
+      response = await trackResponseBuilder(message, destination);
+      break;
+    case EventType.ALIAS:
+      response = aliasResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`message type ${messageType} not supported`, 400);
+  }
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/util.js.html new file mode 100644 index 00000000000..072fdf9dac4 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/delighted/util.js.html @@ -0,0 +1,422 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/delighted/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/delighted util.js

+
+ +
+ 67.31% + Statements + 35/52 +
+ + +
+ 51.28% + Branches + 20/39 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 67.31% + Lines + 35/52 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +1151x +1x +1x +  +1x +8x +8x +  +1x +5x +5x +  +  +1x +6x +4x +  +  +  +  +  +2x +2x +1x +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +1x +2x +2x +2x +  +  +  +  +2x +  +2x +2x +  +  +  +  +  +  +2x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +4x +4x +  +  +4x +4x +4x +3x +3x +  +  +  +4x +  +  +1x +  +  +  +  +  +  + 
const axios = require("axios");
+const { CustomError, getValueFromMessage } = require("../../util");
+const { ENDPOINT } = require("./config");
+ 
+const isValidEmail = email => {
+  const re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+  return re.test(String(email).toLowerCase());
+};
+const isValidPhone = phone => {
+  const phoneformat = /^\+[1-9]\d{10,14}$/;
+  return phoneformat.test(String(phone));
+};
+ 
+const isValidUserIdOrError = (channel, userId) => {
+  if (channel === "email") {
+    Iif (!isValidEmail(userId)) {
+      throw new CustomError(
+        "Channel is set to email. Enter correct email.",
+        400
+      );
+    }
+  } else Eif (channel === "sms") {
+    if (!isValidPhone(userId)) {
+      throw new CustomError(
+        "Channel is set to sms. Enter correct phone number i.e. E.164",
+        400
+      );
+    }
+  } else {
+    throw new CustomError("Invalid Channel type", 400);
+  }
+ 
+  return {
+    userIdType: channel === "sms" ? "phone_number" : "email",
+    userIdValue: userId
+  };
+};
+ 
+const userValidity = async (channel, Config, userId) => {
+  const paramsdata = {};
+  Eif (channel === "email") {
+    paramsdata.email = userId;
+  } else if (channel === "sms") {
+    paramsdata.phone_number = userId;
+  }
+ 
+  const basicAuth = Buffer.from(Config.apiKey).toString("base64");
+  let response;
+  try {
+    response = await axios.get(`${ENDPOINT}`, {
+      headers: {
+        Authorization: `Basic ${basicAuth}`,
+        "Content-Type": "application/json"
+      },
+      params: paramsdata
+    });
+    Eif (
+      response &&
+      response.data &&
+      response.status === 200 &&
+      Array.isArray(response.data)
+    ) {
+      return response.data.length !== 0;
+    }
+    throw new Error("Invalid response");
+  } catch (error) {
+    let errMsg = "";
+    let errStatus = 400;
+    if (error.response && error.response.data) {
+      errMsg = JSON.stringify(error.response.data);
+      switch (error.response.status) {
+        case 422:
+        case 401:
+        case 406:
+        case 403:
+          errStatus = 400;
+          break;
+        case 500:
+        case 503:
+          errStatus = 500;
+          break;
+        default:
+          errStatus = 400;
+      }
+    }
+    throw new CustomError(
+      `Error occurred while checking user : ${errMsg}`,
+      errStatus
+    );
+  }
+};
+const eventValidity = (Config, message) => {
+  const event = getValueFromMessage(message, "event");
+  Iif (!event) {
+    throw new CustomError("No event found.", 400);
+  }
+  let flag = false;
+  Config.eventNamesSettings.forEach(eventName => {
+    if (eventName.event && eventName.event.trim().length !== 0) {
+      Eif (eventName.event.trim().toLowerCase() === event.toLowerCase()) {
+        flag = true;
+      }
+    }
+  });
+  return flag;
+};
+ 
+module.exports = {
+  isValidUserIdOrError,
+  eventValidity,
+  userValidity,
+  isValidEmail,
+  isValidPhone
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/drip/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/drip/config.js.html new file mode 100644 index 00000000000..082be51a665 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/drip/config.js.html @@ -0,0 +1,326 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/drip/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/drip config.js

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +831x +  +1x +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ENDPOINT = "https://api.getdrip.com";
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { type: "identify", name: "DripIdentify" },
+  TRACK: { type: "track", name: "DripTrack" },
+  CAMPAIGN: { type: "campaign", name: "DripCampaign" },
+  ECOM: { type: "ecom", name: "DripEcom" },
+  PRODUCT: { type: "product", name: "DripProduct" }
+};
+ 
+const IDENTIFY_EXCLUSION_FIELDS = [
+  "email",
+  "firstName",
+  "firstname",
+  "first_name",
+  "lastName",
+  "lastname",
+  "last_name",
+  "name",
+  "phone",
+  "userId",
+  "anonymousId",
+  "id",
+  "status",
+  "initial_status",
+  "time_zone",
+  "country",
+  "city",
+  "zip",
+  "ip_address",
+  "euConsentMessage",
+  "euConsent",
+  "address",
+  "tags",
+  "removeTags",
+  "newEmail"
+];
+ 
+const TRACKING_EXLCUSION_FIELDS = [
+  "action",
+  "email",
+  "prospect",
+  "occurred_at",
+  "properties",
+  "id"
+];
+ 
+const ecomEvents = [
+  "order updated",
+  "order completed",
+  "order refunded",
+  "order cancelled",
+  "checkout started",
+  "fulfilled",
+  "order fulfilled"
+];
+ 
+const eventNameMapping = {
+  fulfilled: "fulfilled",
+  "order fulfilled": "fulfilled",
+  "order updated": "updated",
+  "order completed": "paid",
+  "order refunded": "refunded",
+  "order cancelled": "canceled",
+  "checkout started": "placed"
+};
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  ENDPOINT,
+  identifyMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY.name],
+  trackMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK.name],
+  campaignMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.CAMPAIGN.name],
+  ecomMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.ECOM.name],
+  productMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.PRODUCT.name],
+  IDENTIFY_EXCLUSION_FIELDS,
+  TRACKING_EXLCUSION_FIELDS,
+  ecomEvents,
+  eventNameMapping
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/drip/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/drip/index.html new file mode 100644 index 00000000000..7936615b7af --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/drip/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/drip + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/drip

+
+ +
+ 84.29% + Statements + 161/191 +
+ + +
+ 65.42% + Branches + 70/107 +
+ + +
+ 91.67% + Functions + 11/12 +
+ + +
+ 84.29% + Lines + 161/191 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%9/9100%0/0100%0/0100%9/9
transform.js +
+
85.51%118/13872.29%60/8383.33%5/685.51%118/138
util.js +
+
77.27%34/4441.67%10/24100%6/677.27%34/44
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/drip/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/drip/transform.js.html new file mode 100644 index 00000000000..c431d7dfcea --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/drip/transform.js.html @@ -0,0 +1,926 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/drip/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/drip transform.js

+
+ +
+ 85.51% + Statements + 118/138 +
+ + +
+ 72.29% + Branches + 60/83 +
+ + +
+ 83.33% + Functions + 5/6 +
+ + +
+ 85.51% + Lines + 118/138 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +2831x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +1x +5x +  +5x +5x +1x +1x +  +  +5x +5x +1x +  +  +4x +4x +  +  +  +  +  +  +  +4x +4x +4x +  +4x +2x +2x +2x +2x +2x +  +  +4x +2x +2x +  +  +  +  +  +2x +2x +  +  +  +4x +4x +  +  +4x +4x +4x +  +  +  +4x +  +4x +4x +1x +1x +  +  +  +1x +1x +  +1x +1x +  +  +  +1x +1x +1x +  +3x +3x +3x +  +  +1x +9x +  +9x +  +  +  +  +9x +  +  +  +9x +  +  +  +9x +9x +1x +  +8x +  +8x +6x +5x +  +  +  +  +  +  +7x +2x +2x +2x +  +2x +  +  +  +2x +2x +1x +1x +1x +  +  +2x +2x +2x +2x +  +  +  +2x +2x +2x +2x +  +  +5x +5x +5x +5x +5x +  +  +  +  +5x +1x +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +5x +5x +  +  +5x +5x +5x +  +  +  +5x +5x +5x +5x +  +  +1x +14x +14x +  +  +  +  +  +14x +  +  +14x +  +  +  +14x +  +  +14x +  +5x +4x +  +9x +7x +  +  +  +11x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const { EventType } = require("../../../constants");
+const {
+  getDestinationExternalID,
+  getFieldValueFromMessage,
+  constructPayload,
+  extractCustomFields,
+  isEmptyObject,
+  CustomError,
+  removeUndefinedAndNullValues,
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  getErrorRespEvents,
+  getSuccessRespEvents,
+  getValueFromMessage,
+  isObject
+} = require("../../util");
+const logger = require("../../../logger");
+const {
+  ENDPOINT,
+  identifyMapping,
+  trackMapping,
+  campaignMapping,
+  IDENTIFY_EXCLUSION_FIELDS,
+  TRACKING_EXLCUSION_FIELDS,
+  ecomEvents,
+  ecomMapping,
+  eventNameMapping
+} = require("./config");
+const {
+  userExists,
+  isValidEmail,
+  isValidTimestamp,
+  createUpdateUser,
+  createList
+} = require("./util");
+ 
+const identifyResponseBuilder = async (message, { Config }) => {
+  const id = getDestinationExternalID(message, "dripId");
+ 
+  let email = getFieldValueFromMessage(message, "email");
+  if (!isValidEmail(email)) {
+    email = null;
+    logger.error("Email format is incorrect");
+  }
+ 
+  const userId = getFieldValueFromMessage(message, "userId");
+  if (!(id || email)) {
+    throw new CustomError("dripId or email is required for the call", 400);
+  }
+ 
+  let payload = constructPayload(message, identifyMapping);
+  Iif (payload.address1 && isObject(payload.address1)) {
+    let addressString = "";
+    Object.keys(payload.address1).forEach(key => {
+      addressString = addressString.concat(` ${payload.address1[key]}`);
+    });
+    payload.address1 = addressString.trim();
+  }
+ 
+  payload.id = id;
+  payload.email = email;
+  payload.user_id = userId;
+ 
+  if (!payload.first_name && !payload.last_name) {
+    const name = getFieldValueFromMessage(message, "name");
+    Eif (name && typeof name === "string") {
+      const [fname, lname] = name.trim().split(" ");
+      payload.first_name = fname;
+      payload.last_name = lname;
+    }
+  }
+  if (!payload.custom_fields) {
+    let customFields = {};
+    customFields = extractCustomFields(
+      message,
+      customFields,
+      ["traits", "context.traits"],
+      IDENTIFY_EXCLUSION_FIELDS
+    );
+    Eif (!isEmptyObject(customFields)) {
+      payload.custom_fields = customFields;
+    }
+  }
+ 
+  payload = removeUndefinedAndNullValues(payload);
+  const finalpayload = {
+    subscribers: [payload]
+  };
+  const basicAuth = Buffer.from(Config.apiKey).toString("base64");
+  const response = defaultRequestConfig();
+  response.headers = {
+    Authorization: `Basic ${basicAuth}`,
+    "Content-Type": "application/json"
+  };
+  response.method = defaultPostRequestConfig.requestMethod;
+  const campaignId =
+    getDestinationExternalID(message, "dripCampaignId") || Config.campaignId;
+  if (campaignId && email) {
+    const check = await createUpdateUser(finalpayload, Config, basicAuth);
+    Iif (!check) {
+      throw new CustomError("Unable to create/update user.", 400);
+    }
+ 
+    let campaignPayload = constructPayload(message, campaignMapping);
+    campaignPayload.email = email;
+ 
+    campaignPayload = removeUndefinedAndNullValues(campaignPayload);
+    const finalCampaignPayload = {
+      subscribers: [campaignPayload]
+    };
+ 
+    response.endpoint = `${ENDPOINT}/v2/${Config.accountId}/campaigns/${campaignId}/subscribers`;
+    response.body.JSON = finalCampaignPayload;
+    return response;
+  }
+  response.endpoint = `${ENDPOINT}/v2/${Config.accountId}/subscribers`;
+  response.body.JSON = finalpayload;
+  return response;
+};
+ 
+const trackResponseBuilder = async (message, { Config }) => {
+  const id = getDestinationExternalID(message, "dripId");
+ 
+  let email = getValueFromMessage(message, [
+    "properties.email",
+    "traits.email",
+    "context.traits.email"
+  ]);
+  Iif (!isValidEmail(email)) {
+    email = null;
+    logger.error("Enter correct email format.");
+  }
+  Iif (!id && !email) {
+    throw new CustomError("Drip Id or email is required.", 400);
+  }
+ 
+  let event = getValueFromMessage(message, "event");
+  if (!event) {
+    throw new CustomError("Event name is required", 400);
+  }
+  event = event.trim().toLowerCase();
+ 
+  if (!Config.enableUserCreation && !id) {
+    const check = await userExists(Config, email);
+    Iif (!check) {
+      throw new CustomError(
+        "User creation mode is disabled and user does not exist. Track call aborted.",
+        400
+      );
+    }
+  }
+  if (ecomEvents.includes(event)) {
+    const payload = constructPayload(message, ecomMapping);
+    payload.email = email;
+    payload.person_id = id;
+ 
+    Iif (payload.occurred_at && !isValidTimestamp(payload.occurred_at)) {
+      payload.occurred_at = null;
+      logger.error("Timestamp format must be ISO-8601.");
+    }
+    const productList = getValueFromMessage(message, "properties.products");
+    if (productList) {
+      const itemList = createList(productList);
+      Eif (itemList && itemList.length > 0) {
+        payload.items = itemList;
+      }
+    }
+    payload.action = eventNameMapping[event];
+    const basicAuth = Buffer.from(Config.apiKey).toString("base64");
+    const response = defaultRequestConfig();
+    response.headers = {
+      Authorization: `Basic ${basicAuth}`,
+      "Content-Type": "application/json"
+    };
+    response.method = defaultPostRequestConfig.requestMethod;
+    response.endpoint = `${ENDPOINT}/v3/${Config.accountId}/shopper_activity/order`;
+    response.body.JSON = removeUndefinedAndNullValues(payload);
+    return response;
+  }
+ 
+  let payload = constructPayload(message, trackMapping);
+  payload.action = event;
+  payload.id = id;
+  payload.email = email;
+  Iif (payload.occurred_at && !isValidTimestamp(payload.occurred_at)) {
+    payload.occurred_at = null;
+    logger.error("Timestamp format must be ISO-8601.");
+  }
+ 
+  if (!payload.properties) {
+    let properties = {};
+    properties = extractCustomFields(
+      message,
+      properties,
+      ["properties"],
+      TRACKING_EXLCUSION_FIELDS
+    );
+    Eif (!isEmptyObject(properties)) {
+      payload = {
+        ...payload,
+        properties
+      };
+    }
+  }
+  payload = removeUndefinedAndNullValues(payload);
+  const finalpayload = {
+    events: [payload]
+  };
+  const basicAuth = Buffer.from(Config.apiKey).toString("base64");
+  const response = defaultRequestConfig();
+  response.headers = {
+    Authorization: `Basic ${basicAuth}`,
+    "Content-Type": "application/json"
+  };
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = `${ENDPOINT}/v2/${Config.accountId}/events`;
+  response.body.JSON = finalpayload;
+  return response;
+};
+ 
+const process = async event => {
+  const { message, destination } = event;
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  Iif (!destination.Config.accountId) {
+    throw new CustomError("Invalid Account Id. Aborting message.", 400);
+  }
+  Iif (!destination.Config.apiKey) {
+    throw new CustomError("Inavalid API Key. Aborting message.", 400);
+  }
+ 
+  const messageType = message.type.toLowerCase();
+ 
+  let response;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      response = await identifyResponseBuilder(message, destination);
+      break;
+    case EventType.TRACK:
+      response = await trackResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`message type ${messageType} not supported`, 400);
+  }
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/drip/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/drip/util.js.html new file mode 100644 index 00000000000..3f45efa9e2b --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/drip/util.js.html @@ -0,0 +1,395 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/drip/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/drip util.js

+
+ +
+ 77.27% + Statements + 34/44 +
+ + +
+ 41.67% + Branches + 10/24 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 77.27% + Lines + 34/44 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +1061x +1x +  +  +  +  +1x +1x +  +1x +14x +14x +  +  +1x +7x +7x +  +  +1x +6x +  +6x +6x +  +  +  +  +  +  +  +  +5x +5x +  +  +  +1x +1x +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  + 
const axios = require("axios");
+const logger = require("../../../logger");
+const {
+  CustomError,
+  constructPayload,
+  isDefinedAndNotNull
+} = require("../../util");
+const { ENDPOINT, productMapping } = require("./config");
+ 
+const isValidEmail = email => {
+  const re = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+  return re.test(String(email).toLowerCase());
+};
+ 
+const isValidTimestamp = timestamp => {
+  const re = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/;
+  return re.test(String(timestamp));
+};
+ 
+const userExists = async (Config, id) => {
+  const basicAuth = Buffer.from(Config.apiKey).toString("base64");
+  let response;
+  try {
+    response = await axios.get(
+      `${ENDPOINT}/v2/${Config.accountId}/subscribers/${id}`,
+      {
+        headers: {
+          Authorization: `Basic ${basicAuth}`,
+          "Content-Type": "application/json"
+        }
+      }
+    );
+    Eif (response && response.status) {
+      return response.status === 200;
+    }
+    throw new Error("Invalid response.");
+  } catch (error) {
+    let errMsg = "";
+    let errStatus = 400;
+    Iif (error.response) {
+      errStatus = error.response.status || 400;
+      errMsg = error.response.data
+        ? JSON.stringify(error.response.data)
+        : "error response not found";
+    }
+    throw new CustomError(
+      `Error occurred while checking user : ${errMsg}`,
+      errStatus
+    );
+  }
+};
+ 
+const createUpdateUser = async (finalpayload, Config, basicAuth) => {
+  try {
+    const response = await axios.post(
+      `${ENDPOINT}/v2/${Config.accountId}/subscribers`,
+      finalpayload,
+      {
+        headers: {
+          Authorization: `Basic ${basicAuth}`,
+          "Content-Type": "application/json"
+        }
+      }
+    );
+    Eif (response) {
+      return response.status === 200 || response.status === 201;
+    }
+    throw new Error("Invalid response.");
+  } catch (error) {
+    let errMsg = "";
+    const errStatus = 400;
+    if (error.response && error.response.data) {
+      errMsg = JSON.stringify(error.response.data);
+    }
+    throw new CustomError(
+      `Error occurred while creating or updating user : ${errMsg}`,
+      errStatus
+    );
+  }
+};
+ 
+const createList = productList => {
+  const itemList = [];
+  Eif (productList.length > 0) {
+    productList.forEach((product, index) => {
+      const itemPayload = constructPayload(product, productMapping);
+      Eif (itemPayload.name && isDefinedAndNotNull(itemPayload.price)) {
+        itemList.push(itemPayload);
+      } else {
+        logger.error(
+          `Item at index ${index} dropped. Name and price is required`
+        );
+      }
+    });
+  }
+  return itemList;
+};
+ 
+module.exports = {
+  userExists,
+  isValidEmail,
+  isValidTimestamp,
+  createUpdateUser,
+  createList
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/eventbridge/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/eventbridge/index.html new file mode 100644 index 00000000000..c91842f4ad8 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/eventbridge/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/eventbridge + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/eventbridge

+
+ +
+ 62.96% + Statements + 17/27 +
+ + +
+ 42.31% + Branches + 11/26 +
+ + +
+ 60% + Functions + 3/5 +
+ + +
+ 62.96% + Lines + 17/27 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
62.96%17/2742.31%11/2660%3/562.96%17/27
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/eventbridge/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/eventbridge/transform.js.html new file mode 100644 index 00000000000..2d7009a46af --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/eventbridge/transform.js.html @@ -0,0 +1,353 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/eventbridge/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/eventbridge transform.js

+
+ +
+ 62.96% + Statements + 17/27 +
+ + +
+ 42.31% + Branches + 11/26 +
+ + +
+ 60% + Functions + 3/5 +
+ + +
+ 62.96% + Lines + 17/27 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92  +  +  +  +  +1x +  +  +  +2x +2x +2x +2x +4x +4x +4x +  +  +  +2x +  +  +  +  +  +3x +3x +2x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +2x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
const {
+  removeUndefinedAndNullValues,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+function getResouceList(config) {
+  let resource;
+  const resourceList = [];
+  const key = "arn";
+  Eif (config) {
+    config.forEach(obj => {
+      resource = obj[key];
+      Eif (resource) {
+        resourceList.push(resource);
+      }
+    });
+  }
+  return resourceList;
+}
+ 
+function process(event) {
+  // TODO: Use JSON mapping
+  let response;
+  try {
+    if (event.destination && event.destination.Config) {
+      response = {
+        DetailType: event.destination.Config.detailType,
+        Detail: JSON.stringify(event.message),
+        EventBusName: event.destination.Config.eventBusName,
+        Resources: getResouceList(event.destination.Config.resourceID),
+        Source: "rudderstack",
+        userId: event.message.userId || event.message.anonymousId
+      };
+    } else {
+      // drop event if config is empty
+      throw new CustomError(
+        "EventBridge: received empty config, dropping event",
+        400
+      );
+    }
+  } catch (error) {
+    throw new Error(
+      error.message || "EventBridge: Unknown error",
+      error.status || 400
+    );
+  }
+  return removeUndefinedAndNullValues(response);
+}
+ 
+const processRouterDest = async inputs => {
+  if (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        if (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/facebook_pixel/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/facebook_pixel/config.js.html new file mode 100644 index 00000000000..cae54434c06 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/facebook_pixel/config.js.html @@ -0,0 +1,335 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/facebook_pixel/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/facebook_pixel config.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +861x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const CONFIG_CATEGORIES = {
+  USERDATA: {
+    standard: false,
+    type: "identify",
+    name: "FBPIXELUserDataConfig"
+  },
+  COMMON: { name: "FBPIXELCommonConfig" },
+  SIMPLE_TRACK: {
+    standard: false,
+    type: "simple track",
+    name: "FBPIXELPSimpleCustomConfig"
+  },
+  PRODUCT_LIST_VIEWED: {
+    standard: true,
+    type: "product list viewed",
+    name: "FBPIXELPSimpleCustomConfig"
+  },
+  PRODUCT_VIEWED: {
+    standard: true,
+    type: "product viewed",
+    name: "FBPIXELPSimpleCustomConfig"
+  },
+  PRODUCT_ADDED: {
+    standard: true,
+    type: "product added",
+    name: "FBPIXELPSimpleCustomConfig"
+  },
+  ORDER_COMPLETED: {
+    standard: true,
+    type: "order completed",
+    name: "FBPIXELPSimpleCustomConfig"
+  },
+  PRODUCTS_SEARCHED: {
+    standard: true,
+    type: "products searched",
+    name: "FBPIXELPSimpleCustomConfig"
+  },
+  CHECKOUT_STARTED: {
+    standard: true,
+    type: "checkout started",
+    name: "FBPIXELPSimpleCustomConfig"
+  },
+  OTHER_STANDARD: {
+    standard: true,
+    type: "otherStandard",
+    name: "FBPIXELPSimpleCustomConfig"
+  },
+  PAGE_VIEW: {
+    standard: true,
+    type: "page_view",
+    name: "FBPIXELPSimpleCustomConfig"
+  },
+  PAGE: { standard: false, type: "page", name: "FBPIXELPSimpleCustomConfig" }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+const ACTION_SOURCES_VALUES = [
+  "email",
+  "website",
+  "phone_call",
+  "chat",
+  "physical_store",
+  "system_generated",
+  "other"
+];
+ 
+const FB_PIXEL_DEFAULT_EXCLUSION = ["opt_out", "event_id", "action_source"];
+const STANDARD_ECOMM_EVENTS_TYPE = [
+  CONFIG_CATEGORIES.PRODUCT_LIST_VIEWED.type,
+  CONFIG_CATEGORIES.PRODUCT_VIEWED.type,
+  CONFIG_CATEGORIES.PRODUCT_ADDED.type,
+  CONFIG_CATEGORIES.ORDER_COMPLETED.type,
+  CONFIG_CATEGORIES.PRODUCTS_SEARCHED.type,
+  CONFIG_CATEGORIES.CHECKOUT_STARTED.type
+];
+ 
+module.exports = {
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG,
+  ACTION_SOURCES_VALUES,
+  FB_PIXEL_DEFAULT_EXCLUSION,
+  STANDARD_ECOMM_EVENTS_TYPE
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/facebook_pixel/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/facebook_pixel/index.html new file mode 100644 index 00000000000..302354504a5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/facebook_pixel/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/facebook_pixel + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/facebook_pixel

+
+ +
+ 93.95% + Statements + 264/281 +
+ + +
+ 74.71% + Branches + 195/261 +
+ + +
+ 100% + Functions + 18/18 +
+ + +
+ 93.86% + Lines + 260/277 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%7/7100%0/0100%0/0100%7/7
transform.js +
+
93.8%257/27474.71%195/261100%18/1893.7%253/270
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/facebook_pixel/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/facebook_pixel/transform.js.html new file mode 100644 index 00000000000..a29bb81f3ae --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/facebook_pixel/transform.js.html @@ -0,0 +1,2420 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/facebook_pixel/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/facebook_pixel transform.js

+
+ +
+ 93.8% + Statements + 257/274 +
+ + +
+ 74.71% + Branches + 195/261 +
+ + +
+ 100% + Functions + 18/18 +
+ + +
+ 93.7% + Lines + 253/270 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781  +1x +1x +1x +1x +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +11x +11x +10x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +15x +15x +  +  +  +  +  +  +  +  +15x +15x +2x +2x +2x +2x +  +  +  +13x +8x +  +13x +13x +5x +2x +  +5x +  +13x +2x +  +  +13x +  +  +  +  +  +  +  +  +  +1x +6x +6x +6x +6x +6x +6x +6x +6x +  +12x +12x +  +  +12x +  +  +  +  +12x +  +6x +11x +1x +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +4x +4x +4x +4x +2x +4x +4x +4x +4x +4x +  +  +  +  +  +  +  +  +  +  +  +4x +2x +  +2x +2x +  +  +  +2x +  +4x +6x +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +1x +5x +5x +  +  +  +  +  +5x +  +5x +5x +5x +5x +  +  +4x +  +  +  +  +  +  +  +  +  +  +4x +4x +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +31x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +31x +31x +31x +31x +31x +31x +31x +31x +31x +  +  +  +31x +31x +31x +  +  +  +31x +31x +31x +  +31x +255x +  +255x +255x +9x +  +  +255x +  +  +  +  +  +3x +2x +  +  +  +  +1x +  +  +255x +255x +212x +  +  +  +31x +  +  +1x +  +  +  +  +  +34x +34x +  +  +  +  +  +  +  +  +  +34x +34x +  +34x +  +34x +  +  +  +  +34x +34x +34x +3x +  +3x +  +  +34x +  +  +34x +34x +  +34x +  +  +  +  +  +34x +  +  +  +  +  +  +34x +31x +  +  +  +  +  +  +  +31x +1x +  +31x +  +  +  +  +  +31x +  +  +  +  +  +  +  +  +31x +31x +21x +  +4x +  +  +  +4x +4x +  +1x +  +  +  +1x +1x +  +4x +  +  +  +3x +3x +  +5x +  +  +  +4x +4x +  +2x +  +  +  +2x +2x +  +1x +  +  +  +1x +1x +  +  +2x +2x +2x +  +2x +2x +2x +  +  +  +19x +  +  +  +10x +10x +2x +  +  +  +10x +8x +  +  +8x +  +  +  +3x +  +32x +1x +1x +1x +  +  +  +  +  +  +  +  +  +32x +  +  +  +  +3x +1x +  +  +2x +1x +  +1x +  +  +  +  +31x +31x +31x +31x +31x +  +  +  +  +31x +  +  +  +  +  +31x +1x +  +31x +31x +  +  +  +  +  +1x +38x +  +  +  +  +  +  +38x +38x +38x +38x +  +38x +  +38x +  +  +38x +  +2x +  +  +2x +  +  +  +  +  +  +  +36x +36x +  +  +  +  +  +  +  +36x +10x +  +  +  +  +  +  +36x +  +36x +  +36x +  +36x +  +4x +3x +3x +  +1x +  +  +  +  +  +  +3x +3x +  +29x +1x +  +28x +28x +28x +28x +4x +  +28x +  +  +28x +  +28x +  +  +4x +4x +  +1x +1x +  +  +4x +4x +  +  +5x +5x +  +  +2x +2x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +  +1x +1x +  +8x +8x +  +28x +  +  +  +  +34x +  +  +  +  +  +  +  +1x +38x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-param-reassign */
+const sha256 = require("sha256");
+const get = require("get-value");
+const moment = require("moment");
+const stats = require("../../../util/stats");
+const {
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG,
+  ACTION_SOURCES_VALUES,
+  FB_PIXEL_DEFAULT_EXCLUSION,
+  STANDARD_ECOMM_EVENTS_TYPE
+} = require("./config");
+const { EventType } = require("../../../constants");
+ 
+const {
+  CustomError,
+  constructPayload,
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  extractCustomFields,
+  flattenJson,
+  getErrorRespEvents,
+  getIntegrationsObj,
+  getSuccessRespEvents,
+  isObject,
+  getValidDynamicFormConfig
+} = require("../../util");
+ 
+/**  format revenue according to fb standards with max two decimal places.
+ * @param revenue
+ * @return number
+ */
+ 
+const formatRevenue = revenue => {
+  const formattedRevenue = parseFloat(parseFloat(revenue || 0).toFixed(2));
+  if (!isNaN(formattedRevenue)) {
+    return formattedRevenue;
+  }
+  throw new CustomError("Revenue could not be converted to number", 400);
+};
+/**
+ *
+ * @param {*} message Rudder Payload
+ * @param {*} defaultValue product / product_group
+ * @param {*} categoryToContent [ { from: 'clothing', to: 'product' } ]
+ *
+ * We will be mapping properties.category to user provided content else taking the default value as per ecomm spec
+ * If category is clothing it will be set to ["product"]
+ * @return Content Type array as defined in:
+ * - https://developers.facebook.com/docs/facebook-pixel/reference/#object-properties
+ */
+const getContentType = (message, defaultValue, categoryToContent) => {
+  const { integrations } = message;
+  Iif (
+    integrations &&
+    integrations.FacebookPixel &&
+    isObject(integrations.FacebookPixel) &&
+    integrations.FacebookPixel.contentType
+  ) {
+    return integrations.FacebookPixel.contentType;
+  }
+ 
+  let { category } = message.properties;
+  if (!category) {
+    const { products } = message.properties;
+    Eif (products && products.length > 0 && Array.isArray(products)) {
+      Eif (isObject(products[0])) {
+        category = products[0].category;
+      }
+    }
+  } else {
+    if (categoryToContent === undefined) {
+      categoryToContent = [];
+    }
+    const mapped = categoryToContent;
+    const mappedTo = mapped.reduce((filtered, map) => {
+      if (map.from === category) {
+        filtered = map.to;
+      }
+      return filtered;
+    }, "");
+    if (mappedTo.length) {
+      return mappedTo;
+    }
+  }
+  return defaultValue;
+};
+ 
+/**
+ *
+ * @param {*} message Rudder element
+ * @param {*} categoryToContent [ { from: 'clothing', to: 'product' } ]
+ *
+ * Handles order completed and checkout started types of specific events
+ */
+const handleOrder = (message, categoryToContent) => {
+  const { products } = message.properties;
+  const value = formatRevenue(message.properties.revenue);
+  const contentType = getContentType(message, "product", categoryToContent);
+  const contentIds = [];
+  const contents = [];
+  const { category } = message.properties;
+  Eif (products && products.length > 0 && Array.isArray(products)) {
+    for (let i = 0; i < products.length; i += 1) {
+      const pId =
+        products[i].product_id || products[i].sku || products[i].id || "";
+      contentIds.push(pId);
+      // required field for content
+      // ref: https://developers.facebook.com/docs/meta-pixel/reference#object-properties
+      const content = {
+        id: pId,
+        quantity: products[i].quantity || message.properties.quantity || 1,
+        item_price: products[i].price || message.properties.price
+      };
+      contents.push(content);
+    }
+    contents.forEach((content, index) => {
+      if (content.id === "") {
+        throw new CustomError(
+          `Product id is required for product ${index}. Event not sent`,
+          400
+        );
+      }
+    });
+  } else {
+    throw new CustomError("Product is not an object. Event not sent", 400);
+  }
+  return {
+    content_category: category,
+    content_ids: contentIds,
+    content_type: contentType,
+    currency: message.properties.currency || "USD",
+    value,
+    contents,
+    num_items: contentIds.length
+  };
+};
+ 
+/**
+ *
+ * @param {*} message Rudder element
+ * @param {*} categoryToContent [ { from: 'clothing', to: 'product' } ]
+ *
+ * Handles product list viewed
+ */
+const handleProductListViewed = (message, categoryToContent) => {
+  let contentType;
+  const contentIds = [];
+  const contents = [];
+  const { products } = message.properties;
+  if (products && products.length > 0 && Array.isArray(products)) {
+    products.forEach(product => {
+      Eif (isObject(product)) {
+        const productId = product.product_id || product.sku || product.id || "";
+        Eif (productId) {
+          contentIds.push(productId);
+          contents.push({
+            id: productId,
+            quantity: product.quantity || message.properties.quantity || 1,
+            item_price: product.price
+          });
+        }
+      } else {
+        throw new CustomError("Product is not an object. Event not sent", 400);
+      }
+    });
+  }
+ 
+  if (contentIds.length > 0) {
+    contentType = "product";
+  } else {
+    contentIds.push(message.properties.category || "");
+    contents.push({
+      id: message.properties.category || "",
+      quantity: 1
+    });
+    contentType = "product_group";
+  }
+  contents.forEach((content, index) => {
+    Iif (content.id === "") {
+      throw new CustomError(
+        `Product id is required for product ${index}. Event not sent`,
+        400
+      );
+    }
+  });
+  return {
+    content_ids: contentIds,
+    content_type: getContentType(message, contentType, categoryToContent),
+    contents
+  };
+};
+ 
+/**
+ *
+ * @param {*} message Rudder Payload
+ * @param {*} categoryToContent [ { from: 'clothing', to: 'product' } ]
+ * @param {*} valueFieldIdentifier it can be either value or price which will be matched from properties and assigned to value for fb payload
+ */
+const handleProduct = (message, categoryToContent, valueFieldIdentifier) => {
+  const useValue = valueFieldIdentifier === "properties.value";
+  const contentIds = [
+    message.properties.product_id ||
+      message.properties.id ||
+      message.properties.sku ||
+      ""
+  ];
+  const contentType = getContentType(message, "product", categoryToContent);
+  const contentName =
+    message.properties.product_name || message.properties.name || "";
+  const contentCategory = message.properties.category || "";
+  const currency = message.properties.currency || "USD";
+  const value = useValue
+    ? formatRevenue(message.properties.value)
+    : formatRevenue(message.properties.price);
+  const contents = [
+    {
+      id:
+        message.properties.product_id ||
+        message.properties.id ||
+        message.properties.sku ||
+        "",
+      quantity: message.properties.quantity || 1,
+      item_price: message.properties.price
+    }
+  ];
+  contents.forEach((content, index) => {
+    Iif (content.id === "") {
+      throw new CustomError(
+        `Product id is required for product ${index}. Event not sent`,
+        400
+      );
+    }
+  });
+  return {
+    content_ids: contentIds,
+    content_type: contentType,
+    content_name: contentName,
+    content_category: contentCategory,
+    currency,
+    value,
+    contents
+  };
+};
+ 
+/** This function transforms the payloads according to the config settings and adds, removes or hashes pii data.
+ Also checks if it is a standard event and sends properties only if it is mentioned in our configs.
+ @param message --> the rudder payload
+ 
+ {
+      anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1',
+      destination_props: { Fb: { app_id: 'RudderFbApp' } },
+      context: {
+        device: {
+          id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R',
+          manufacturer: 'Xiaomi',
+          model: 'Redmi 6',
+          name: 'xiaomi'
+        },
+        network: { carrier: 'Banglalink' },
+        os: { name: 'android', version: '8.1.0' },
+        screen: { height: '100', density: 50 },
+        traits: {
+          email: 'abc@gmail.com',
+          anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1'
+        }
+      },
+      event: 'spin_result',
+      integrations: {
+        All: true,
+        FacebookPixel: {
+          dataProcessingOptions: [Array],
+          fbc: 'fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz1234567890',
+          fbp: 'fb.1.1554763741205.234567890',
+          fb_login_id: 'fb_id',
+          lead_id: 'lead_id'
+        }
+      },
+      message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8',
+      properties: { revenue: 400, additional_bet_index: 0 },
+      timestamp: '2019-09-01T15:46:51.693229+05:30',
+      type: 'track'
+    }
+ 
+ @param customData --> properties
+ { revenue: 400, additional_bet_index: 0 }
+ 
+ @param blacklistPiiProperties -->
+ [ { blacklistPiiProperties: 'phone', blacklistPiiHash: true } ] // hashes the phone property
+ 
+ @param whitelistPiiProperties -->
+ [ { whitelistPiiProperties: 'email' } ] // sets email
+ 
+ @param isStandard --> is standard if among the ecommerce spec of rudder other wise is not standard for simple track, identify and page calls
+ false
+ 
+ @param eventCustomProperties -->
+ [ { eventCustomProperties: 'leadId' } ] // leadId if present will be set
+ 
+ */
+ 
+const transformedPayloadData = (
+  message,
+  customData,
+  blacklistPiiProperties,
+  whitelistPiiProperties,
+  isStandard,
+  eventCustomProperties,
+  integrationsObj
+) => {
+  const defaultPiiProperties = [
+    "email",
+    "firstName",
+    "lastName",
+    "firstname",
+    "lastname",
+    "first_name",
+    "last_name",
+    "gender",
+    "city",
+    "country",
+    "phone",
+    "state",
+    "zip",
+    "birthday"
+  ];
+  blacklistPiiProperties = blacklistPiiProperties || [];
+  whitelistPiiProperties = whitelistPiiProperties || [];
+  eventCustomProperties = eventCustomProperties || [];
+  const customBlackListedPiiProperties = {};
+  const customWhiteListedProperties = {};
+  const customEventProperties = {};
+  for (let i = 0; i < blacklistPiiProperties.length; i += 1) {
+    const singularConfigInstance = blacklistPiiProperties[i];
+    customBlackListedPiiProperties[
+      singularConfigInstance.blacklistPiiProperties
+    ] = singularConfigInstance.blacklistPiiHash;
+  }
+  for (let i = 0; i < whitelistPiiProperties.length; i += 1) {
+    const singularConfigInstance = whitelistPiiProperties[i];
+    customWhiteListedProperties[
+      singularConfigInstance.whitelistPiiProperties
+    ] = true;
+  }
+  for (let i = 0; i < eventCustomProperties.length; i += 1) {
+    const singularConfigInstance = eventCustomProperties[i];
+    customEventProperties[singularConfigInstance.eventCustomProperties] = true;
+  }
+  Object.keys(customData).forEach(eventProp => {
+    const isDefaultPiiProperty = defaultPiiProperties.indexOf(eventProp) >= 0;
+    const isProperyWhiteListed =
+      customWhiteListedProperties[eventProp] || false;
+    if (isDefaultPiiProperty && !isProperyWhiteListed) {
+      delete customData[eventProp];
+    }
+ 
+    if (
+      Object.prototype.hasOwnProperty.call(
+        customBlackListedPiiProperties,
+        eventProp
+      )
+    ) {
+      if (customBlackListedPiiProperties[eventProp]) {
+        customData[eventProp] =
+          integrationsObj && integrationsObj.hashed
+            ? String(message.properties[eventProp])
+            : sha256(String(message.properties[eventProp]));
+      } else {
+        delete customData[eventProp];
+      }
+    }
+    const isCustomProperty = customEventProperties[eventProp] || false;
+    if (isStandard && !isCustomProperty && !isDefaultPiiProperty) {
+      delete customData[eventProp];
+    }
+  });
+ 
+  return customData;
+};
+ 
+const responseBuilderSimple = (
+  message,
+  category,
+  destination,
+  categoryToContent
+) => {
+  const { Config } = destination;
+  const { pixelId, accessToken } = Config;
+  const {
+    blacklistPiiProperties,
+    eventCustomProperties,
+    valueFieldIdentifier,
+    whitelistPiiProperties,
+    limitedDataUSage,
+    testDestination,
+    testEventCode,
+    standardPageCall
+  } = Config;
+  const integrationsObj = getIntegrationsObj(message, "fb_pixel");
+ 
+  const endpoint = `https://graph.facebook.com/v13.0/${pixelId}/events?access_token=${accessToken}`;
+ 
+  const userData = constructPayload(
+    message,
+    MAPPING_CONFIG[CONFIG_CATEGORIES.USERDATA.name],
+    "fb_pixel"
+  );
+  Eif (userData) {
+    const split = userData.name ? userData.name.split(" ") : null;
+    if (split !== null && Array.isArray(split) && split.length === 2) {
+      userData.fn =
+        integrationsObj && integrationsObj.hashed ? split[0] : sha256(split[0]);
+      userData.ln =
+        integrationsObj && integrationsObj.hashed ? split[1] : sha256(split[1]);
+    }
+    delete userData.name;
+  }
+ 
+  let customData = {};
+  let commonData = {};
+ 
+  commonData = constructPayload(
+    message,
+    MAPPING_CONFIG[CONFIG_CATEGORIES.COMMON.name],
+    "fb_pixel"
+  );
+ 
+  Iif (commonData.action_source) {
+    const isActionSourceValid =
+      ACTION_SOURCES_VALUES.indexOf(commonData.action_source) >= 0;
+    if (!isActionSourceValid) {
+      throw new CustomError("Invalid Action Source type", 400);
+    }
+  }
+  if (category.type !== "identify") {
+    customData = flattenJson(
+      extractCustomFields(
+        message,
+        customData,
+        ["properties"],
+        FB_PIXEL_DEFAULT_EXCLUSION
+      )
+    );
+    if (standardPageCall && category.type === "page") {
+      category.standard = true;
+    }
+    Iif (Object.keys(customData).length === 0 && category.standard) {
+      throw new CustomError(
+        "No properties for the event so the event cannot be sent.",
+        400
+      );
+    }
+    customData = transformedPayloadData(
+      message,
+      customData,
+      blacklistPiiProperties,
+      whitelistPiiProperties,
+      category.standard,
+      eventCustomProperties,
+      integrationsObj
+    );
+    message.properties = message.properties || {};
+    if (category.standard) {
+      switch (category.type) {
+        case "product list viewed":
+          customData = {
+            ...customData,
+            ...handleProductListViewed(message, categoryToContent)
+          };
+          commonData.event_name = "ViewContent";
+          break;
+        case "product viewed":
+          customData = {
+            ...customData,
+            ...handleProduct(message, categoryToContent, valueFieldIdentifier)
+          };
+          commonData.event_name = "ViewContent";
+          break;
+        case "product added":
+          customData = {
+            ...customData,
+            ...handleProduct(message, categoryToContent, valueFieldIdentifier)
+          };
+          commonData.event_name = "AddToCart";
+          break;
+        case "order completed":
+          customData = {
+            ...customData,
+            ...handleOrder(message, categoryToContent, valueFieldIdentifier)
+          };
+          commonData.event_name = "Purchase";
+          break;
+        case "products searched":
+          customData = {
+            ...customData,
+            search_string: message.properties.query
+          };
+          commonData.event_name = "Search";
+          break;
+        case "checkout started":
+          customData = {
+            ...customData,
+            ...handleOrder(message, categoryToContent, valueFieldIdentifier)
+          };
+          commonData.event_name = "InitiateCheckout";
+          break;
+        case "page_view": // executed when sending track calls but with standard type PageView
+        case "page": // executed when page call is done with standard PageView turned on
+          customData = { ...customData };
+          commonData.event_name = "PageView";
+          break;
+        case "otherStandard":
+          customData = { ...customData };
+          commonData.event_name = category.event;
+          break;
+        default:
+          throw new CustomError("This standard event does not exist", 400);
+      }
+      customData.currency = STANDARD_ECOMM_EVENTS_TYPE.includes(category.type)
+        ? message.properties.currency || "USD"
+        : undefined;
+    } else {
+      const { type } = category;
+      if (type === "page" || type === "screen") {
+        commonData.event_name = message.name
+          ? `Viewed ${type} ${message.name}`
+          : `Viewed a ${type}`;
+      }
+      if (category.type === "simple track") {
+        customData.value = message.properties
+          ? message.properties.revenue
+          : undefined;
+        delete customData.revenue;
+      }
+    }
+  } else {
+    customData = undefined;
+  }
+  if (limitedDataUSage) {
+    const dataProcessingOptions = get(message, "context.dataProcessingOptions");
+    Eif (dataProcessingOptions && Array.isArray(dataProcessingOptions)) {
+      [
+        commonData.data_processing_options,
+        commonData.data_processing_options_country,
+        commonData.data_processing_options_state
+      ] = dataProcessingOptions;
+    }
+  }
+ 
+  // content_category should only be a string ref: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/custom-data
+ 
+  if (
+    customData &&
+    customData.content_category &&
+    typeof customData.content_category !== "string"
+  ) {
+    if (Array.isArray(customData.content_category)) {
+      customData.content_category = customData.content_category
+        .map(String)
+        .join(",");
+    } else if (typeof customData.content_category === "object") {
+      throw new CustomError("Category must be must be a string");
+    } else {
+      customData.content_category = String(customData.content_category);
+    }
+    // delete customData.content_category;
+  }
+ 
+  Eif (userData && commonData) {
+    const response = defaultRequestConfig();
+    response.endpoint = endpoint;
+    response.method = defaultPostRequestConfig.requestMethod;
+    const jsonStringify = JSON.stringify({
+      user_data: userData,
+      ...commonData,
+      custom_data: customData
+    });
+    const payload = {
+      data: [jsonStringify]
+    };
+ 
+    // Ref: https://developers.facebook.com/docs/marketing-api/conversions-api/using-the-api/
+    // Section: Test Events Tool
+    if (testDestination) {
+      payload.test_event_code = testEventCode;
+    }
+    response.body.FORM = payload;
+    return response;
+  }
+  // fail-safety for developer error
+  throw new CustomError("Payload could not be constructed", 400);
+};
+ 
+const processEvent = (message, destination) => {
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  const timeStamp = message.originalTimestamp || message.timestamp;
+  Eif (timeStamp) {
+    const start = moment.unix(moment(timeStamp).format("X"));
+    const current = moment.unix(moment().format("X"));
+    // calculates past event in days
+    const deltaDay = Math.ceil(moment.duration(current.diff(start)).asDays());
+    // calculates future event in minutes
+    const deltaMin = Math.ceil(
+      moment.duration(start.diff(current)).asMinutes()
+    );
+    if (deltaDay > 7 || deltaMin > 1) {
+      // TODO: Remove after testing in mirror transformer
+      stats.increment("fb_pixel_timestamp_error", 1, {
+        destinationId: destination.ID
+      });
+      throw new CustomError(
+        "[facebook_pixel]: Events must be sent within seven days of their occurrence or up to one minute in the future.",
+        400
+      );
+    }
+  }
+ 
+  let eventsToEvents;
+  Eif (destination.Config.eventsToEvents)
+    eventsToEvents = getValidDynamicFormConfig(
+      destination.Config.eventsToEvents,
+      "from",
+      "to",
+      "FB_PIXEL",
+      destination.ID
+    );
+  let categoryToContent;
+  if (destination.Config.categoryToContent)
+    categoryToContent = getValidDynamicFormConfig(
+      destination.Config.categoryToContent,
+      "from",
+      "to",
+      "FB_PIXEL",
+      destination.ID
+    );
+  const { advancedMapping } = destination.Config;
+  let standard;
+  let standardTo = "";
+  let checkEvent;
+  const messageType = message.type.toLowerCase();
+  let category;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      if (advancedMapping) {
+        category = CONFIG_CATEGORIES.USERDATA;
+        break;
+      } else {
+        throw new CustomError(
+          "Advanced Mapping is not on Rudder Dashboard. Identify events will not be sent.",
+          400
+        );
+      }
+    case EventType.PAGE:
+    case EventType.SCREEN:
+      category = CONFIG_CATEGORIES.PAGE;
+      break;
+    case EventType.TRACK:
+      if (!message.event) {
+        throw new CustomError("Event name is required", 400);
+      }
+      standard = eventsToEvents;
+      Eif (standard) {
+        standardTo = standard.reduce((filtered, standards) => {
+          if (standards.from.toLowerCase() === message.event.toLowerCase()) {
+            filtered = standards.to;
+          }
+          return filtered;
+        }, "");
+      }
+      checkEvent = standardTo !== "" ? standardTo : message.event.toLowerCase();
+ 
+      switch (checkEvent) {
+        case CONFIG_CATEGORIES.PRODUCT_LIST_VIEWED.type:
+        case "ViewContent":
+          category = CONFIG_CATEGORIES.PRODUCT_LIST_VIEWED;
+          break;
+        case CONFIG_CATEGORIES.PRODUCT_VIEWED.type:
+          category = CONFIG_CATEGORIES.PRODUCT_VIEWED;
+          break;
+        case CONFIG_CATEGORIES.PRODUCT_ADDED.type:
+        case "AddToCart":
+          category = CONFIG_CATEGORIES.PRODUCT_ADDED;
+          break;
+        case CONFIG_CATEGORIES.ORDER_COMPLETED.type:
+        case "Purchase":
+          category = CONFIG_CATEGORIES.ORDER_COMPLETED;
+          break;
+        case CONFIG_CATEGORIES.PRODUCTS_SEARCHED.type:
+        case "Search":
+          category = CONFIG_CATEGORIES.PRODUCTS_SEARCHED;
+          break;
+        case CONFIG_CATEGORIES.CHECKOUT_STARTED.type:
+        case "InitiateCheckout":
+          category = CONFIG_CATEGORIES.CHECKOUT_STARTED;
+          break;
+        case "AddToWishlist":
+        case "AddPaymentInfo":
+        case "Lead":
+        case "CompleteRegistration":
+        case "Contact":
+        case "CustomizeProduct":
+        case "Donate":
+        case "FindLocation":
+        case "Schedule":
+        case "StartTrial":
+        case "SubmitApplication":
+        case "Subscribe":
+          category = CONFIG_CATEGORIES.OTHER_STANDARD;
+          category.event = checkEvent;
+          break;
+        case "PageView":
+          category = CONFIG_CATEGORIES.PAGE_VIEW;
+          break;
+        default:
+          category = CONFIG_CATEGORIES.SIMPLE_TRACK;
+          break;
+      }
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+  // build the response
+  return responseBuilderSimple(
+    message,
+    category,
+    destination,
+    categoryToContent
+  );
+};
+ 
+const process = event => {
+  return processEvent(event.message, event.destination);
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/fb/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/fb/config.js.html new file mode 100644 index 00000000000..e55e36c32bf --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/fb/config.js.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/fb/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/fb config.js

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +331x +1x +  +5x +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  + 
const fs = require("fs");
+const path = require("path");
+ 
+const getPath = file => path.resolve(__dirname, file);
+ 
+const baseMapping = JSON.parse(
+  fs.readFileSync(getPath("./data/FbAppBasicMapping.json"))
+);
+ 
+const eventNameMapping = JSON.parse(
+  fs.readFileSync(getPath("./data/FbAppEventNameMapping.json"))
+);
+ 
+const eventPropsMapping = JSON.parse(
+  fs.readFileSync(getPath("./data/FbAppEventPropsMapping.json"))
+);
+ 
+const eventPropsToPathMapping = JSON.parse(
+  fs.readFileSync(getPath("./data/FbAppEventPropPathMapping.json"))
+);
+ 
+const eventPropToTypeMapping = JSON.parse(
+  fs.readFileSync(getPath("./data/FbAppEventPropToTypeMapping.json"))
+);
+ 
+module.exports = {
+  baseMapping,
+  eventNameMapping,
+  eventPropsMapping,
+  eventPropsToPathMapping,
+  eventPropToTypeMapping
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/fb/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/fb/index.html new file mode 100644 index 00000000000..537389932ec --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/fb/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/fb + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/fb

+
+ +
+ 87.36% + Statements + 159/182 +
+ + +
+ 70.9% + Branches + 95/134 +
+ + +
+ 100% + Functions + 13/13 +
+ + +
+ 87.29% + Lines + 158/181 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%10/10100%0/0100%1/1100%9/9
transform.js +
+
86.63%149/17270.9%95/134100%12/1286.63%149/172
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/fb/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/fb/transform.js.html new file mode 100644 index 00000000000..3bd093a629a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/fb/transform.js.html @@ -0,0 +1,1253 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/fb/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/fb transform.js

+
+ +
+ 86.63% + Statements + 149/172 +
+ + +
+ 70.9% + Branches + 95/134 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 86.63% + Lines + 149/172 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +3921x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +9x +9x +  +9x +9x +9x +9x +  +9x +9x +81x +  +  +  +  +  +36x +15x +15x +  +36x +  +  +18x +3x +  +3x +  +3x +3x +3x +  +  +18x +  +9x +3x +3x +  +  +  +9x +  +9x +  +  +  +9x +  +9x +  +  +  +  +  +9x +  +  +  +  +  +  +9x +9x +  +  +9x +  +  +  +  +  +  +9x +9x +  +  +9x +9x +  +  +  +9x +  +  +  +28x +  +28x +25x +  +  +3x +  +  +  +  +  +  +  +  +  +  +14x +  +  +14x +  +14x +14x +14x +2x +  +  +  +  +12x +202x +202x +  +  +  +  +  +  +  +  +  +  +  +  +  +202x +22x +22x +  +22x +5x +5x +5x +  +5x +5x +5x +11x +11x +  +  +  +  +  +  +9x +9x +  +  +17x +17x +17x +17x +  +  +  +  +  +  +  +180x +  +  +  +9x +  +  +  +9x +  +  +  +9x +  +9x +9x +9x +9x +9x +9x +  +9x +  +  +  +16x +16x +16x +  +16x +16x +16x +13x +3x +2x +  +  +1x +  +  +  +  +  +15x +  +15x +450x +450x +450x +151x +151x +73x +  +73x +  +30x +  +  +  +  +30x +30x +  +30x +  +  +43x +43x +  +73x +  +78x +  +30x +  +48x +  +  +  +15x +  +  +  +  +16x +15x +15x +  +15x +  +9x +9x +1x +  +  +  +  +8x +3x +  +6x +6x +  +5x +  +1x +1x +  +  +  +  +  +  +6x +6x +  +  +  +  +  +  +  +  +  +  +9x +9x +  +  +  +16x +9x +  +  +9x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const set = require("set-value");
+const sha256 = require("sha256");
+const { EventType } = require("../../../constants");
+const {
+  removeUndefinedValues,
+  getDateInFormat,
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  getValueFromMessage,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  isAppleFamily
+} = require("../../util");
+ 
+const {
+  baseMapping,
+  eventNameMapping,
+  eventPropsMapping,
+  eventPropsToPathMapping,
+  eventPropToTypeMapping
+} = require("./config");
+const logger = require("../../../logger");
+ 
+// const funcMap = {
+//   integer: parseInt,
+//   float: parseFloat
+// };
+ 
+const extInfoArray = ["", "", 0, 0, "", "", "", "", "", 0, 0, 0.0, 0, 0, 0];
+const userProps = [
+  "ud[em]",
+  "ud[fn]",
+  "ud[ln]",
+  "ud[ph]",
+  "ud[ge]",
+  "ud[db]",
+  "ud[ct]",
+  "ud[st]",
+  "ud[zp]"
+];
+const eventAndPropRegexPattern = "^[0-9a-zA-Z_][0-9a-zA-Z _-]{0,39}$";
+const eventAndPropRegex = new RegExp(eventAndPropRegexPattern);
+ 
+function sanityCheckPayloadForTypesAndModifications(updatedEvent) {
+  // Conversion required fields
+  const dateTime = new Date(get(updatedEvent.custom_events[0], "_logTime"));
+  set(updatedEvent.custom_events[0], "_logTime", dateTime.getTime());
+ 
+  let num = Number(updatedEvent.advertiser_tracking_enabled);
+  updatedEvent.advertiser_tracking_enabled = isNaN(num) ? "0" : `${num}`;
+  num = Number(updatedEvent.application_tracking_enabled);
+  updatedEvent.application_tracking_enabled = isNaN(num) ? "0" : `${num}`;
+ 
+  let isUDSet = false;
+  userProps.forEach(prop => {
+    switch (prop) {
+      case "ud[em]":
+      case "ud[fn]":
+      case "ud[ln]":
+      case "ud[st]":
+      case "ud[cn]":
+        if (updatedEvent[prop] && updatedEvent[prop] !== "") {
+          isUDSet = true;
+          updatedEvent[prop] = sha256(updatedEvent[prop].toLowerCase());
+        }
+        break;
+      case "ud[zp]":
+      case "ud[ph]":
+        if (updatedEvent[prop] && updatedEvent[prop] !== "") {
+          isUDSet = true;
+          // remove all non-numerical characters
+          let processedVal = updatedEvent[prop].replace(/[^0-9]/g, "");
+          // remove all leading zeros
+          processedVal = processedVal.replace(/^0+/g, "");
+          Eif (processedVal.length) {
+            updatedEvent[prop] = sha256(processedVal);
+          }
+        }
+        break;
+      case "ud[ge]":
+        if (updatedEvent[prop] && updatedEvent[prop] !== "") {
+          isUDSet = true;
+          updatedEvent[prop] = sha256(
+            updatedEvent[prop].toLowerCase() === "female" ? "f" : "m"
+          );
+        }
+        break;
+      case "ud[db]":
+        Iif (updatedEvent[prop] && updatedEvent[prop] !== "") {
+          isUDSet = true;
+          updatedEvent[prop] = sha256(getDateInFormat(updatedEvent[prop]));
+        }
+        break;
+      case "ud[ct]":
+        Iif (updatedEvent[prop] && updatedEvent[prop] !== "") {
+          isUDSet = true;
+          updatedEvent[prop] = sha256(
+            updatedEvent[prop].toLowerCase().replace(/ /g, "")
+          );
+        }
+        break;
+      default:
+        break;
+    }
+  });
+ 
+  // remove anon_id if user data or advertiser_id present
+  Eif (isUDSet || updatedEvent.advertiser_id) {
+    delete updatedEvent.anon_id;
+  }
+ 
+  Iif (!isUDSet && !updatedEvent.advertiser_id && !updatedEvent.anon_id) {
+    throw new CustomError(
+      "Either context.device.advertisingId or traits or anonymousId must be present for all events",
+      400
+    );
+  }
+ 
+  Eif (updatedEvent.custom_events) {
+    updatedEvent.custom_events = JSON.stringify(updatedEvent.custom_events);
+  }
+ 
+  Eif (updatedEvent.extinfo) {
+    updatedEvent.extinfo = JSON.stringify(updatedEvent.extinfo);
+  }
+ 
+  // Event type required by fb
+  updatedEvent.event = "CUSTOM_APP_EVENTS";
+}
+ 
+function getCorrectedTypedValue(pathToKey, value, originalPath) {
+  const type = eventPropToTypeMapping[pathToKey];
+  // TODO: we should remove this eslint rule or comeup with a better way
+  if (typeof value === type) {
+    return value;
+  }
+ 
+  throw new CustomError(
+    `${
+      typeof originalPath === "object"
+        ? JSON.stringify(originalPath)
+        : originalPath
+    } is not of valid type`,
+    400
+  );
+}
+ 
+function processEventTypeGeneric(message, baseEvent, fbEventName) {
+  const updatedEvent = {
+    ...baseEvent
+  };
+  set(updatedEvent.custom_events[0], "_eventName", fbEventName);
+ 
+  const { properties } = message;
+  Eif (properties) {
+    if (properties.revenue && !properties.currency) {
+      throw new Error(
+        "If properties.revenue is present, properties.currency is required."
+      );
+    }
+    let processedKey;
+    Object.keys(properties).forEach(k => {
+      processedKey = k;
+      Iif (!eventAndPropRegex.test(k)) {
+        // replace all non alphanumeric characters with ''
+        processedKey = processedKey.replace(/[^0-9a-z _-]/gi, "");
+        if (k.length > 40) {
+          // trim key if length is greater than 40
+          processedKey = k.substring(0, 40);
+        }
+        if (processedKey.length === 0) {
+          throw new CustomError(
+            `The property key ${k} has only non-alphanumeric characters.A property key must be an alphanumeric string and have atmost 40 characters.`,
+            400
+          );
+        }
+      }
+      if (eventPropsToPathMapping[k]) {
+        let rudderEventPath = eventPropsToPathMapping[k];
+        let fbEventPath = eventPropsMapping[rudderEventPath];
+ 
+        if (rudderEventPath.indexOf("sub") > -1) {
+          const [prefixSlice, suffixSlice] = rudderEventPath.split(".sub.");
+          const parentArray = get(message, prefixSlice);
+          updatedEvent.custom_events[0][fbEventPath] = [];
+ 
+          let length = 0;
+          let count = parentArray.length;
+          while (count > 0) {
+            const intendValue = get(parentArray[length], suffixSlice);
+            updatedEvent.custom_events[0][fbEventPath][length] =
+              getCorrectedTypedValue(
+                fbEventPath,
+                intendValue,
+                parentArray[length]
+              ) || "";
+ 
+            length += 1;
+            count -= 1;
+          }
+        } else {
+          rudderEventPath = eventPropsToPathMapping[k];
+          fbEventPath = eventPropsMapping[rudderEventPath];
+          const intendValue = get(message, rudderEventPath);
+          set(
+            updatedEvent.custom_events[0],
+            fbEventPath,
+            getCorrectedTypedValue(fbEventPath, intendValue, rudderEventPath) ||
+              ""
+          );
+        }
+      } else {
+        set(updatedEvent.custom_events[0], processedKey, properties[k]);
+      }
+    });
+  }
+  return updatedEvent;
+}
+ 
+function responseBuilderSimple(message, payload, destination) {
+  const { appID } = destination.Config;
+ 
+  // "https://graph.facebook.com/v13.0/644748472345539/activities"
+ 
+  const endpoint = `https://graph.facebook.com/v13.0/${appID}/activities`;
+ 
+  const response = defaultRequestConfig();
+  response.endpoint = endpoint;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.userId = message.userId ? message.userId : message.anonymousId;
+  response.body.FORM = removeUndefinedValues(payload);
+  response.statusCode = 200;
+ 
+  return response;
+}
+ 
+function buildBaseEvent(message) {
+  const baseEvent = {};
+  baseEvent.extinfo = extInfoArray;
+  baseEvent.custom_events = [{}];
+ 
+  let sourceSDK = get(message, "context.device.type") || "";
+  sourceSDK = sourceSDK.toLowerCase();
+  if (sourceSDK === "android") {
+    sourceSDK = "a2";
+  } else if (isAppleFamily(sourceSDK)) {
+    sourceSDK = "i2";
+  } else {
+    // if the sourceSDK is not android or ios
+    throw new CustomError(
+      'Extended device information i.e, "context.device.type" is required',
+      400
+    );
+  }
+ 
+  baseEvent.extinfo[0] = sourceSDK;
+  let extInfoIdx;
+  baseMapping.forEach(bm => {
+    const { sourceKeys, destKey } = bm;
+    const inputVal = getValueFromMessage(message, sourceKeys);
+    if (inputVal) {
+      const splits = destKey.split(".");
+      if (splits.length > 1 && splits[0] === "extinfo") {
+        extInfoIdx = splits[1];
+        let outputVal;
+        switch (typeof extInfoArray[extInfoIdx]) {
+          case "number":
+            Iif (extInfoIdx === 11) {
+              // density
+              outputVal = parseFloat(inputVal);
+              outputVal = isNaN(outputVal) ? undefined : outputVal.toFixed(2);
+            } else {
+              outputVal = parseInt(inputVal, 10);
+              outputVal = isNaN(outputVal) ? undefined : outputVal;
+            }
+            break;
+ 
+          default:
+            outputVal = inputVal;
+            break;
+        }
+        baseEvent.extinfo[extInfoIdx] =
+          outputVal || baseEvent.extinfo[extInfoIdx];
+      } else if (splits.length === 3) {
+        // custom event key
+        set(baseEvent.custom_events[0], splits[2], inputVal || "");
+      } else {
+        set(baseEvent, destKey, inputVal || "");
+      }
+    }
+  });
+  return baseEvent;
+}
+ 
+function processSingleMessage(message, destination) {
+  let fbEventName;
+  const baseEvent = buildBaseEvent(message);
+  const eventName = message.event;
+  let updatedEvent = {};
+ 
+  switch (message.type) {
+    case EventType.TRACK:
+      fbEventName = eventNameMapping[eventName] || eventName;
+      if (!eventAndPropRegex.test(fbEventName)) {
+        throw new CustomError(
+          `Event name ${fbEventName} is not a valid FB APP event name.It must match the regex ${eventAndPropRegexPattern}.`,
+          400
+        );
+      }
+      updatedEvent = processEventTypeGeneric(message, baseEvent, fbEventName);
+      break;
+    case EventType.SCREEN: {
+      const { name } = message.properties;
+      if (!name || !eventAndPropRegex.test(name)) {
+        // TODO : log if name does not match regex
+        fbEventName = "Viewed Screen";
+      } else {
+        fbEventName = `Viewed ${name} Screen`;
+        Iif (!eventAndPropRegex.test(fbEventName)) {
+          throw new CustomError(
+            `Event name ${fbEventName} is not a valid FB APP event name.It must match the regex ${eventAndPropRegexPattern}.`,
+            400
+          );
+        }
+      }
+      updatedEvent = processEventTypeGeneric(message, baseEvent, fbEventName);
+      break;
+    }
+    case EventType.PAGE:
+      fbEventName = "Viewed Page";
+      updatedEvent = processEventTypeGeneric(message, baseEvent, fbEventName);
+      break;
+    default:
+      logger.error("could not determine type");
+      throw new CustomError("message type not supported", 400);
+  }
+ 
+  sanityCheckPayloadForTypesAndModifications(updatedEvent);
+  return responseBuilderSimple(message, updatedEvent, destination);
+}
+ 
+function process(event) {
+  const resp = processSingleMessage(event.message, event.destination);
+  Iif (!resp.statusCode) {
+    resp.statusCode = 200;
+  }
+  return resp;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/fb_custom_audience/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/fb_custom_audience/config.js.html new file mode 100644 index 00000000000..b4b3ec3dd96 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/fb_custom_audience/config.js.html @@ -0,0 +1,392 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/fb_custom_audience/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/fb_custom_audience config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +1051x +  +  +17x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +  +  +  +  +  +  + 
const BASE_URL = "https://graph.facebook.com/v13.0";
+ 
+function getEndPoint(audienceId) {
+  return `${BASE_URL}/${audienceId}/users`;
+}
+ 
+const schemaFields = [
+  "EXTERN_ID",
+  "EMAIL",
+  "PHONE",
+  "GEN",
+  "DOBY",
+  "DOBM",
+  "DOBD",
+  "LN",
+  "FN",
+  "FI",
+  "CT",
+  "ST",
+  "ZIP",
+  "MADID",
+  "COUNTRY"
+];
+ 
+const typeFields = [
+  "UNKNOWN",
+  "FILE_IMPORTED",
+  "EVENT_BASED",
+  "SEED_BASED",
+  "THIRD_PARTY_IMPORTED",
+  "COPY_PASTE",
+  "CONTACT_IMPORTER",
+  "HOUSEHOLD_AUDIENCE"
+];
+ 
+const subTypeFields = [
+  "ANYTHING",
+  "NOTHING",
+  "HASHES",
+  "USER_IDS",
+  "HASHES_OR_USER_IDS",
+  "MOBILE_ADVERTISER_IDS",
+  "EXTERNAL_IDS",
+  "MULTI_HASHES",
+  "TOKENS",
+  "EXTERNAL_IDS_MIX",
+  "HOUSEHOLD_EXPANSION",
+  "WEB_PIXEL_HITS",
+  "MOBILE_APP_EVENTS",
+  "MOBILE_APP_COMBINATION_EVENTS",
+  "VIDEO_EVENTS",
+  "WEB_PIXEL_COMBINATION_EVENTS",
+  "PLATFORM",
+  "MULTI_DATA_EVENTS",
+  "IG_BUSINESS_EVENTS",
+  "STORE_VISIT_EVENTS",
+  "INSTANT_ARTICLE_EVENTS",
+  "FB_EVENT_SIGNALS",
+  "ENGAGEMENT_EVENT_USERS",
+  "FACEBOOK_WIFI_EVENTS",
+  "CUSTOM_AUDIENCE_USERS",
+  "PAGE_FANS",
+  "CONVERSION_PIXEL_HITS",
+  "APP_USERS",
+  "S_EXPR",
+  "DYNAMIC_RULE",
+  "CAMPAIGN_CONVERSIONS",
+  "WEB_PIXEL_HITS_CUSTOM_AUDIENCE_USERS",
+  "MOBILE_APP_CUSTOM_AUDIENCE_USERS",
+  "COMBINATION_CUSTOM_AUDIENCE_USERS",
+  "VIDEO_EVENT_USERS",
+  "FB_PIXEL_HITS",
+  "IG_PROMOTED_POST",
+  "PLACE_VISITS",
+  "OFFLINE_EVENT_USERS",
+  "EXPANDED_AUDIENCE",
+  "SEED_LIST",
+  "PARTNER_CATEGORY_USERS",
+  "PAGE_SMART_AUDIENCE",
+  "MULTICOUNTRY_COMBINATION",
+  "PLATFORM_USERS",
+  "MULTI_EVENT_SOURCE",
+  "SMART_AUDIENCE",
+  "LOOKALIKE_PLATFORM",
+  "SIGNAL_SOURCE",
+  "MAIL_CHIMP_EMAIL_HASHES",
+  "CONSTANT_CONTACTS_EMAIL_HASHES",
+  "COPY_PASTE_EMAIL_HASHES",
+  "CONTACT_IMPORTER",
+  "DATA_FILE"
+];
+// as per real time experimentation maximum 500 users can be added at a time
+// const MAX_USER_COUNT = 500; (using from destination definition)
+const USER_ADD = "add";
+const USER_DELETE = "remove";
+ 
+module.exports = {
+  getEndPoint,
+  schemaFields,
+  USER_ADD,
+  USER_DELETE,
+  typeFields,
+  subTypeFields
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/fb_custom_audience/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/fb_custom_audience/index.html new file mode 100644 index 00000000000..a06ec687c13 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/fb_custom_audience/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/fb_custom_audience + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/fb_custom_audience

+
+ +
+ 84.75% + Statements + 150/177 +
+ + +
+ 67.35% + Branches + 66/98 +
+ + +
+ 88.89% + Functions + 16/18 +
+ + +
+ 85.23% + Lines + 150/176 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%1/1100%8/8
transform.js +
+
84.02%142/16967.35%66/9888.24%15/1784.52%142/168
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/fb_custom_audience/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/fb_custom_audience/transform.js.html new file mode 100644 index 00000000000..b2cccaf213c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/fb_custom_audience/transform.js.html @@ -0,0 +1,1403 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/fb_custom_audience/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/fb_custom_audience transform.js

+
+ +
+ 84.02% + Statements + 142/169 +
+ + +
+ 67.35% + Branches + 66/98 +
+ + +
+ 88.24% + Functions + 15/17 +
+ + +
+ 84.52% + Lines + 142/168 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +4421x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +17x +17x +17x +17x +  +17x +9x +  +17x +8x +  +  +17x +17x +  +  +  +  +  +  +  +1x +  +  +37x +37x +  +4x +4x +  +  +3x +  +3x +3x +  +3x +  +  +  +  +3x +  +4x +4x +  +4x +4x +4x +  +  +  +4x +  +4x +4x +  +  +4x +  +4x +  +  +  +3x +  +  +  +  +3x +  +  +  +3x +  +3x +3x +  +3x +3x +  +3x +3x +3x +  +  +3x +  +  +  +3x +  +  +  +  +  +  +  +  +  +37x +  +  +  +  +  +1x +  +  +  +  +  +  +18x +  +  +18x +18x +18x +  +172x +172x +1x +  +172x +171x +59x +  +37x +  +  +  +  +  +22x +  +  +  +112x +  +171x +  +  +  +  +  +54x +54x +  +117x +  +  +1x +  +  +  +  +  +17x +  +  +17x +  +  +  +  +1x +  +  +  +  +  +  +  +18x +18x +18x +  +  +  +  +18x +  +  +  +  +  +  +17x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +18x +  +18x +  +  +18x +  +  +  +  +18x +  +18x +18x +  +18x +  +  +18x +18x +  +  +  +18x +8x +  +  +18x +18x +  +18x +18x +  +18x +  +  +  +  +  +  +  +  +17x +  +  +1x +  +10x +10x +10x +10x +10x +10x +  +  +  +  +  +10x +  +10x +  +  +10x +  +  +10x +  +10x +  +  +  +10x +  +10x +  +  +  +  +10x +1x +  +  +  +10x +  +  +  +  +  +10x +  +  +10x +8x +  +  +  +8x +8x +  +  +  +  +  +  +8x +  +  +  +8x +  +  +  +  +10x +10x +  +  +  +10x +10x +  +  +  +  +  +  +9x +  +  +  +9x +  +  +9x +17x +  +  +9x +  +  +  +  +  +9x +  +  +1x +10x +  +  +1x +1x +  +  +  +1x +2x +2x +  +  +  +  +  +  +  +2x +2x +4x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const sha256 = require("sha256");
+const get = require("get-value");
+ 
+const {
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  defaultDeleteRequestConfig,
+  checkSubsetOfArray,
+  isDefinedAndNotNullAndNotEmpty,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  returnArrayOfSubarrays,
+  CustomError,
+  isDefinedAndNotNull,
+  flattenMap
+} = require("../../util");
+ 
+const {
+  getEndPoint,
+  schemaFields,
+  USER_ADD,
+  USER_DELETE,
+  typeFields,
+  subTypeFields
+} = require("./config");
+ 
+const { MappedToDestinationKey } = require("../../../constants");
+ 
+const getSchemaForEventMappedToDest = message => {
+  const mappedSchema = get(message, "context.destinationFields");
+  if (!mappedSchema) {
+    throw new CustomError(
+      "context.destinationFields is required property for events mapped to destination ",
+      400
+    );
+  }
+  // context.destinationFields has 2 possible values. An Array of fields or Comma seperated string with field names
+  let userSchema = Array.isArray(mappedSchema)
+    ? mappedSchema
+    : mappedSchema.split(",");
+  userSchema = userSchema.map(field => field.trim());
+  return userSchema;
+};
+ 
+const responseBuilderSimple = (payload, audienceId) => {
+  Eif (payload) {
+    const responseParams = payload.responseField;
+    const response = defaultRequestConfig();
+    response.endpoint = getEndPoint(audienceId);
+ 
+    if (payload.operationCategory === "add") {
+      response.method = defaultPostRequestConfig.requestMethod;
+    }
+    if (payload.operationCategory === "remove") {
+      response.method = defaultDeleteRequestConfig.requestMethod;
+    }
+ 
+    response.params = responseParams;
+    return response;
+  }
+  // fail-safety for developer error
+  throw new CustomError(`Payload could not be constructed`, 400);
+};
+ 
+// function responsible to ensure the user inputs are passed according to the allowed format
+ 
+const ensureApplicableFormat = (userProperty, userInformation) => {
+  let updatedProperty;
+  let userInformationTrimmed;
+  userInformation = userInformation.toString();
+  switch (userProperty) {
+    case "EMAIL":
+      updatedProperty = userInformation.trim().toLowerCase();
+      break;
+    case "PHONE":
+      // remove all non-numerical characters
+      updatedProperty = userInformation.replace(/[^0-9]/g, "");
+      // remove all leading zeros
+      updatedProperty = updatedProperty.replace(/^0+/g, "");
+      break;
+    case "GEN":
+      updatedProperty =
+        userInformation.toLowerCase() === "f" ||
+        userInformation.toLowerCase() === "female"
+          ? "f"
+          : "m";
+      break;
+    case "DOBY":
+      updatedProperty = userInformation.trim().replace(/\./g, "");
+      break;
+    case "DOBM":
+      userInformationTrimmed = userInformation.replace(/\./g, "");
+      Eif (userInformationTrimmed.length < 2) {
+        updatedProperty = `0${userInformationTrimmed}`;
+      } else {
+        updatedProperty = userInformationTrimmed;
+      }
+      break;
+    case "DOBD":
+      userInformationTrimmed = userInformation.replace(/\./g, "");
+      Iif (userInformationTrimmed.length < 2) {
+        updatedProperty = `0${userInformationTrimmed}`;
+      } else {
+        updatedProperty = userInformationTrimmed;
+      }
+      break;
+    case "LN":
+    case "FN":
+    case "FI":
+      Iif (userProperty !== "FI") {
+        updatedProperty = userInformation
+          .toLowerCase()
+          .replace(/[^a-zA-Z@#$%&!]/g, "");
+      } else {
+        updatedProperty = userInformation
+          .toLowerCase()
+          .replace(/[^a-zA-Z@#$%&!,.?]/g, "");
+      }
+      break;
+    case "MADID":
+      updatedProperty = userInformation.toLowerCase();
+      break;
+    case "COUNTRY":
+      updatedProperty = userInformation.toLowerCase();
+      break;
+    case "ZIP":
+      userInformationTrimmed = userInformation.replace(/\s/g, "");
+      updatedProperty = userInformationTrimmed.toLowerCase();
+      break;
+    case "ST":
+    case "CT":
+      updatedProperty = userInformation
+        .replace(/[^a-zA-Z ]/g, "")
+        .replace(/\s/g, "")
+        .toLowerCase();
+      break;
+    case "EXTERN_ID":
+      updatedProperty = userInformation;
+      break;
+    default:
+      throw new CustomError(
+        `The property ${userProperty} is not supported`,
+        400
+      );
+  }
+  return updatedProperty;
+};
+ 
+// Function responsible for making the data field without payload object
+// Based on the "isHashRequired" value hashing is explicitly enabled or disabled
+ 
+const prepareDataField = (
+  userSchema,
+  userUpdateList,
+  isHashRequired,
+  disableFormat,
+  skipVerify
+) => {
+  const data = [];
+  let updatedProperty;
+  let dataElement;
+  userUpdateList.forEach(eachUser => {
+    dataElement = [];
+    userSchema.forEach(eachProperty => {
+      // if skip verify is true we replace undefined/null user properties with empty string
+      let userProperty = eachUser[eachProperty];
+      if (skipVerify && !isDefinedAndNotNull(userProperty)) {
+        userProperty = "";
+      }
+      if (isDefinedAndNotNull(userProperty)) {
+        if (isHashRequired) {
+          if (!disableFormat) {
+            // when user requires formatting
+            updatedProperty = ensureApplicableFormat(
+              eachProperty,
+              userProperty
+            );
+          } else {
+            // when user requires hashing but does not require formatting
+            updatedProperty = userProperty;
+          }
+        } else {
+          // when hashing is not required
+          updatedProperty = userProperty;
+        }
+        if (
+          isHashRequired &&
+          eachProperty !== "MADID" &&
+          eachProperty !== "EXTERN_ID"
+        ) {
+          // for MOBILE_ADVERTISER_ID, MADID,EXTERN_ID hashing is not required ref: https://developers.facebook.com/docs/marketing-api/audiences/guides/custom-audiences#hash
+          updatedProperty = `${updatedProperty}`;
+          dataElement.push(sha256(updatedProperty));
+        } else {
+          dataElement.push(updatedProperty);
+        }
+      } else {
+        throw new CustomError(
+          `Configured Schema field ${eachProperty} is missing in one or more user records`,
+          400
+        );
+      }
+    });
+    data.push(dataElement);
+  });
+ 
+  return data;
+};
+ 
+// Function responsible prepare the payload field of every event parameter
+ 
+const preparePayload = (
+  userUpdateList,
+  userSchema,
+  paramsPayload,
+  isHashRequired,
+  disableFormat,
+  skipVerify
+) => {
+  const prepareFinalPayload = paramsPayload;
+  Eif (Array.isArray(userSchema)) {
+    prepareFinalPayload.schema = userSchema;
+  } else {
+    prepareFinalPayload.schema = [userSchema];
+  }
+ 
+  prepareFinalPayload.data = prepareDataField(
+    userSchema,
+    userUpdateList,
+    isHashRequired,
+    disableFormat,
+    skipVerify
+  );
+  return prepareFinalPayload;
+};
+ 
+// Function responsible for building the parameters for each event calls
+ 
+const prepareResponse = (
+  message,
+  destination,
+  isHashRequired = true,
+  allowedAudienceArray,
+  userSchema
+) => {
+  const {
+    accessToken,
+    disableFormat,
+    type,
+    subType,
+    isRaw,
+    skipVerify
+  } = destination.Config;
+ 
+  const mappedToDestination = get(message, MappedToDestinationKey);
+ 
+  // If mapped to destination, use the mapped fields instead of destination userschema
+  Iif (mappedToDestination) {
+    // eslint-disable-next-line no-param-reassign
+    userSchema = getSchemaForEventMappedToDest(message);
+  }
+ 
+  const prepareParams = {};
+  // creating the parameters field
+  const paramsPayload = {};
+  const dataSource = {};
+ 
+  prepareParams.access_token = accessToken;
+ 
+  // creating the payload field for parameters
+  Eif (isRaw) {
+    paramsPayload.is_raw = isRaw;
+  }
+  // creating the data_source block
+ 
+  if (type && type !== "NA" && typeFields.includes(type)) {
+    dataSource.type = type;
+  }
+ 
+  Eif (subType && subType !== "NA" && subTypeFields.includes(subType)) {
+    dataSource.sub_type = subType;
+  }
+  Eif (Object.keys(dataSource).length > 0) {
+    paramsPayload.data_source = dataSource;
+  }
+  prepareParams.payload = preparePayload(
+    allowedAudienceArray,
+    userSchema,
+    paramsPayload,
+    isHashRequired,
+    disableFormat,
+    skipVerify
+  );
+ 
+  return prepareParams;
+};
+ 
+const processEvent = (message, destination) => {
+  let response;
+  const respList = [];
+  const toSendEvents = [];
+  let wrappedResponse = {};
+  let { userSchema } = destination.Config;
+  const { isHashRequired, audienceId, maxUserCount } = destination.Config;
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const maxUserCountNumber = parseInt(maxUserCount, 10);
+ 
+  Iif (Number.isNaN(maxUserCountNumber)) {
+    throw new CustomError("Batch size must be an Integer.", 400);
+  }
+  Iif (message.type.toLowerCase() !== "audiencelist") {
+    throw new CustomError(` ${message.type} call is not supported `, 400);
+  }
+  const operationAudienceId = audienceId;
+ 
+  Iif (!isDefinedAndNotNullAndNotEmpty(operationAudienceId)) {
+    throw new CustomError("Audience ID is a mandatory field", 400);
+  }
+ 
+  const mappedToDestination = get(message, MappedToDestinationKey);
+  // If mapped to destination, use the mapped fields instead of destination userschema
+  Iif (mappedToDestination) {
+    userSchema = getSchemaForEventMappedToDest(message);
+  }
+ 
+  // When one single schema field is added in the webapp, it does not appear to be an array
+  if (!Array.isArray(userSchema)) {
+    userSchema = [userSchema];
+  }
+ 
+  // when configured schema field is different from the allowed fields
+  Iif (!checkSubsetOfArray(schemaFields, userSchema)) {
+    throw new CustomError(
+      "One or more of the schema fields are not supported",
+      400
+    );
+  }
+  const { listData } = message.properties;
+ 
+  // when "remove" is present in the payload
+  if (isDefinedAndNotNullAndNotEmpty(listData[USER_DELETE])) {
+    const audienceChunksArray = returnArrayOfSubarrays(
+      listData[USER_DELETE],
+      maxUserCountNumber
+    );
+    audienceChunksArray.forEach(allowedAudienceArray => {
+      response = prepareResponse(
+        message,
+        destination,
+        isHashRequired,
+        allowedAudienceArray,
+        userSchema
+      );
+      wrappedResponse = {
+        responseField: response,
+        operationCategory: USER_DELETE
+      };
+      toSendEvents.push(wrappedResponse);
+    });
+  }
+ 
+  // When "add" is present in the payload
+  Eif (isDefinedAndNotNullAndNotEmpty(listData[USER_ADD])) {
+    const audienceChunksArray = returnArrayOfSubarrays(
+      listData[USER_ADD],
+      maxUserCountNumber
+    );
+    audienceChunksArray.forEach(allowedAudienceArray => {
+      response = prepareResponse(
+        message,
+        destination,
+        isHashRequired,
+        allowedAudienceArray,
+        userSchema
+      );
+      wrappedResponse = {
+        responseField: response,
+        operationCategory: USER_ADD
+      };
+      toSendEvents.push(wrappedResponse);
+    });
+  }
+  toSendEvents.forEach(sendEvent => {
+    respList.push(responseBuilderSimple(sendEvent, operationAudienceId));
+  });
+  // When userListAdd or userListDelete is absent or both passed as empty arrays
+  Iif (respList.length === 0) {
+    throw new CustomError(
+      "missing valid parameters, unable to generate transformed payload",
+      400
+    );
+  }
+  return respList;
+};
+ 
+const process = event => {
+  return processEvent(event.message, event.destination);
+};
+ 
+const processRouterDest = inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+  const respList = inputs.map(input => {
+    try {
+      Iif (input.message.statusCode) {
+        // already transformed event
+        return getSuccessRespEvents(
+          input.message,
+          [input.metadata],
+          input.destination
+        );
+      }
+      const transformedList = process(input);
+      const responseList = transformedList.map(transformedPayload => {
+        return getSuccessRespEvents(
+          transformedPayload,
+          [input.metadata],
+          input.destination
+        );
+      });
+      return responseList;
+    } catch (error) {
+      return getErrorRespEvents(
+        [input.metadata],
+        // eslint-disable-next-line no-nested-ternary
+        400,
+        error.message || "Error occurred while processing payload."
+      );
+    }
+  });
+  return flattenMap(respList);
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/firehose/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/firehose/index.html new file mode 100644 index 00000000000..927f38de606 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/firehose/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/firehose + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/firehose

+
+ +
+ 52.38% + Statements + 11/21 +
+ + +
+ 31.58% + Branches + 6/19 +
+ + +
+ 50% + Functions + 2/4 +
+ + +
+ 52.38% + Lines + 11/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
52.38%11/2131.58%6/1950%2/452.38%11/21
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/firehose/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/firehose/transform.js.html new file mode 100644 index 00000000000..6c5c0be61b3 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/firehose/transform.js.html @@ -0,0 +1,287 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/firehose/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/firehose transform.js

+
+ +
+ 52.38% + Statements + 11/21 +
+ + +
+ 31.58% + Branches + 6/19 +
+ + +
+ 50% + Functions + 2/4 +
+ + +
+ 52.38% + Lines + 11/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70  +  +  +  +  +1x +  +  +6x +6x +6x +6x +  +  +  +  +  +  +  +6x +6x +5x +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
const {
+  getHashFromArray,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+function getDeliveryStreamMapTo(event) {
+  const { message } = event;
+  const { mapEvents } = event.destination.Config;
+  const hashMap = getHashFromArray(mapEvents, "from", "to");
+  return (
+    (message.event ? hashMap[message.event.toLowerCase()] : null) ||
+    hashMap[message.type.toLowerCase()] ||
+    hashMap["*"]
+  );
+}
+ 
+function process(event) {
+  const deliveryStreamMapTo = getDeliveryStreamMapTo(event);
+  if (deliveryStreamMapTo) {
+    return {
+      message: event.message,
+      userId: event.message.anonymousId,
+      deliveryStreamMapTo
+    };
+  }
+  throw new CustomError("No delivery stream set for this event", 400);
+}
+const processRouterDest = async inputs => {
+  if (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        if (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ga/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ga/config.js.html new file mode 100644 index 00000000000..ed72271dd2e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ga/config.js.html @@ -0,0 +1,653 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ga/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/ga config.js

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +1921x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +1x +1x +1x +29x +  +1x +  +1x +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ConfigCategory = {
+  IDENTIFY: {
+    name: "GAIdentifyConfig",
+    hitType: "event"
+  },
+  PAGE: {
+    name: "GAPageViewConfig",
+    hitType: "pageview"
+  },
+  SCREEN: {
+    name: "GAScreenViewConfig",
+    hitType: "screenview"
+  },
+  NON_ECOM: {
+    name: "GANonEComEventConfig",
+    hitType: "event"
+  },
+  PROMOTION: {
+    name: "GAPromotionEventConfig",
+    hitType: "event"
+  },
+  PAYMENT: {
+    name: "GAPaymentRelatedEventConfig",
+    hitType: "transaction"
+  },
+  REFUND: {
+    name: "GARefundEventConfig",
+    hitType: "transaction"
+  },
+  PRODUCT: {
+    name: "GAProductEventConfig",
+    hitType: "event"
+  },
+  PRODUCT_LIST: {
+    name: "GAProductListEventConfig",
+    hitType: "event"
+  },
+  TRANSACTION: {
+    name: "GATransactionEventConfig",
+    hitType: "transaction"
+  },
+  SHARING: {
+    name: "GASharingEventConfig",
+    hitType: "social"
+  },
+  ECOM_GENERIC: {
+    name: "GAEComGenericEventConfig",
+    hitType: "event"
+  }
+};
+ 
+const Event = {
+  PRODUCT_LIST_VIEWED: {
+    name: "product list viewed",
+    category: ConfigCategory.PRODUCT_LIST
+  },
+  PRODUCT_LIST_FILTERED: {
+    name: "product list filtered",
+    category: ConfigCategory.PRODUCT_LIST
+  },
+  PRODUCT_LIST_CLICKED: {
+    name: "product list clicked",
+    category: ConfigCategory.PRODUCT_LIST
+  },
+  PROMOTION_VIEWED: {
+    name: "promotion viewed",
+    category: ConfigCategory.PROMOTION
+  },
+  PROMOTION_CLICKED: {
+    name: "promotion clicked",
+    category: ConfigCategory.PROMOTION
+  },
+  PRODUCT_CLICKED: {
+    name: "product clicked",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_VIEWED: {
+    name: "product viewed",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_ADDED: {
+    name: "product added",
+    category: ConfigCategory.PRODUCT
+  },
+  WISHLIST_PRODUCT_ADDED_TO_CART: {
+    name: "wishlist product added to cart",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_REMOVED: {
+    name: "product removed",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_REMOVED_FROM_WISHLIST: {
+    name: "product removed from wishlist",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_ADDED_TO_WISHLIST: {
+    name: "product added to wishlist",
+    category: ConfigCategory.PRODUCT
+  },
+  CHECKOUT_STARTED: {
+    name: "checkout started",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_UPDATED: {
+    name: "order updated",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_COMPLETED: {
+    name: "order completed",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_CANCELLED: {
+    name: "order cancelled",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_REFUNDED: {
+    name: "order refunded",
+    category: ConfigCategory.REFUND
+  },
+  CHECKOUT_STEP_VIEWED: {
+    name: "checkout step viewed",
+    category: ConfigCategory.PAYMENT
+  },
+  CHECKOUT_STEP_COMPLETED: {
+    name: "checkout step completed",
+    category: ConfigCategory.PAYMENT
+  },
+  PAYMENT_INFO_ENTERED: {
+    name: "payment info entered",
+    category: ConfigCategory.PAYMENT
+  },
+  PRODUCT_SHARED: {
+    name: "product shared",
+    category: ConfigCategory.SHARING
+  },
+  CART_SHARED: {
+    name: "cart shared",
+    category: ConfigCategory.SHARING
+  },
+  CART_VIEWED: {
+    name: "cart viewed",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  COUPON_ENTERED: {
+    name: "coupon entered",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  COUPON_APPLIED: {
+    name: "coupon applied",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  COUPON_DENIED: {
+    name: "coupon denied",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  COUPON_REMOVED: {
+    name: "coupon removed",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  PRODUCT_REVIEWED: {
+    name: "product reviewed",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  PRODUCTS_SEARCHED: {
+    name: "products searched",
+    category: ConfigCategory.ECOM_GENERIC
+  }
+};
+ 
+const GA_ENDPOINT = "https://www.google-analytics.com/collect";
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+const nameToEventMap = {};
+const events = Object.keys(Event);
+events.forEach(event => {
+  nameToEventMap[Event[event].name] = Event[event];
+});
+const DESTINATION = "googleAnalytics";
+ 
+module.exports = {
+  Event,
+  GA_ENDPOINT,
+  ConfigCategory,
+  mappingConfig,
+  nameToEventMap,
+  DESTINATION
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ga/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ga/index.html new file mode 100644 index 00000000000..461095a4d2f --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ga/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ga + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/ga

+
+ +
+ 90% + Statements + 396/440 +
+ + +
+ 76.85% + Branches + 259/337 +
+ + +
+ 94.29% + Functions + 33/35 +
+ + +
+ 89.95% + Lines + 394/438 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%11/11100%0/0100%1/1100%11/11
transform.js +
+
89.74%385/42976.85%259/33794.12%32/3489.7%383/427
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ga/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ga/transform.js.html new file mode 100644 index 00000000000..5abc8926b19 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ga/transform.js.html @@ -0,0 +1,3293 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ga/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/ga transform.js

+
+ +
+ 89.74% + Statements + 385/429 +
+ + +
+ 76.85% + Branches + 259/337 +
+ + +
+ 94.12% + Functions + 32/34 +
+ + +
+ 89.7% + Lines + 383/427 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072  +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +162x +162x +162x +162x +162x +160x +320x +  +  +162x +162x +320x +320x +320x +320x +  +  +  +  +162x +  +  +  +35x +  +  +35x +35x +35x +140x +  +  +  +  +35x +  +  +  +31x +31x +31x +31x +  +  +  +  +  +31x +31x +62x +62x +62x +  +  +  +  +31x +31x +62x +62x +62x +  +  +  +31x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +54x +54x +54x +50x +  +50x +4x +4x +4x +4x +4x +4x +1x +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +54x +  +  +  +  +  +  +54x +  +  +  +  +  +  +  +  +10x +10x +20x +20x +  +20x +10x +  +10x +  +  +  +20x +20x +20x +  +  +  +  +  +20x +20x +20x +20x +20x +20x +20x +20x +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +54x +54x +54x +54x +54x +54x +54x +  +  +54x +  +  +  +54x +  +  +  +  +  +  +54x +53x +  +54x +48x +  +54x +49x +  +  +54x +  +54x +54x +54x +54x +54x +53x +53x +53x +  +54x +3x +3x +3x +3x +3x +3x +3x +  +  +54x +54x +54x +  +  +  +54x +54x +  +  +  +  +  +54x +54x +  +54x +54x +208x +  +  +54x +50x +50x +  +  +  +54x +  +  +54x +  +54x +  +  +54x +54x +  +  +54x +  +  +  +  +54x +  +54x +  +  +  +  +  +54x +  +  +  +  +  +54x +54x +  +54x +52x +  +54x +  +  +  +  +  +54x +1x +  +  +  +  +  +  +53x +  +  +  +  +  +  +54x +  +54x +  +  +54x +  +54x +54x +54x +54x +54x +  +54x +  +  +  +  +8x +1x +1x +1x +  +  +  +  +  +  +  +8x +8x +8x +  +8x +7x +  +1x +  +  +8x +  +8x +  +8x +  +  +  +6x +  +2x +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +11x +  +11x +  +  +  +11x +  +  +  +  +  +  +  +  +  +11x +  +  +  +  +2x +  +  +  +2x +  +  +  +2x +  +1x +1x +  +1x +1x +  +  +  +2x +2x +2x +2x +  +1x +1x +  +1x +1x +  +  +  +  +  +2x +  +  +  +  +2x +2x +  +2x +  +1x +1x +  +1x +1x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +5x +  +  +5x +5x +  +5x +5x +3x +  +  +  +  +  +3x +  +  +2x +  +  +5x +  +  +  +  +  +2x +  +  +2x +2x +2x +  +1x +1x +  +1x +1x +1x +2x +  +1x +1x +  +  +  +  +2x +  +  +  +  +6x +6x +6x +6x +  +  +  +6x +6x +  +  +3x +3x +  +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +6x +6x +6x +6x +  +  +4x +  +  +  +4x +  +  +6x +  +  +3x +  +  +  +3x +  +  +6x +5x +5x +9x +9x +  +9x +2x +  +7x +  +  +  +9x +  +  +  +  +9x +9x +9x +9x +  +9x +9x +9x +9x +  +  +  +6x +  +  +  +  +6x +6x +6x +  +  +  +  +6x +  +  +  +6x +6x +  +1x +1x +  +2x +2x +  +  +  +1x +1x +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +6x +  +  +  +  +6x +6x +  +6x +6x +  +  +  +  +6x +  +  +  +  +7x +7x +7x +7x +  +  +7x +  +1x +1x +  +1x +1x +  +1x +1x +  +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +7x +  +5x +  +4x +  +2x +  +  +1x +  +  +2x +  +  +7x +  +7x +6x +  +  +  +  +  +6x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +  +  +1x +1x +1x +1x +1x +  +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +57x +57x +  +  +  +  +  +  +  +  +  +  +  +57x +  +57x +57x +57x +57x +  +9x +8x +8x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +4x +4x +4x +  +1x +1x +1x +  +42x +42x +  +  +  +  +  +  +  +  +  +  +  +  +42x +41x +41x +  +  +41x +41x +41x +  +  +41x +41x +41x +  +41x +  +41x +41x +41x +  +6x +  +  +  +6x +  +2x +  +  +  +2x +  +6x +  +  +  +6x +  +7x +  +  +  +6x +  +2x +  +  +  +2x +  +5x +  +  +  +5x +  +1x +  +  +  +1x +  +2x +2x +  +10x +  +  +  +10x +  +  +1x +1x +  +41x +41x +41x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +54x +  +  +  +  +  +  +  +  +  +  +57x +  +1x +1x +  +  +  +  +1x +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x + 
/* eslint-disable no-nested-ternary */
+const get = require("get-value");
+const md5 = require("md5");
+const { EventType, MappedToDestinationKey } = require("../../../constants");
+const {
+  Event,
+  GA_ENDPOINT,
+  ConfigCategory,
+  mappingConfig,
+  nameToEventMap,
+  DESTINATION
+} = require("./config");
+const { TRANSFORMER_METRIC } = require("../../util/constant");
+const ErrorBuilder = require("../../util/error");
+const {
+  addExternalIdToTraits,
+  adduserIdFromExternalId,
+  removeUndefinedAndNullValues,
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  getParsedIP,
+  formatValue,
+  getFieldValueFromMessage,
+  getDestinationExternalID,
+  getErrorRespEvents,
+  getSuccessRespEvents,
+  generateErrorObject
+} = require("../../util");
+ 
+const gaDisplayName = "Google Analytics";
+ 
+function getParamsFromConfig(message, destination) {
+  const params = {};
+  const obj = {};
+  const messageType = message.type;
+  const traits = getFieldValueFromMessage(message, "traits");
+  if (destination) {
+    destination.forEach(mapping => {
+      obj[mapping.from] = mapping.to;
+    });
+  }
+  const keys = Object.keys(obj);
+  keys.forEach(key => {
+    obj[key] = obj[key].replace(/dimension/g, "cd");
+    obj[key] = obj[key].replace(/metric/g, "cm");
+    obj[key] = obj[key].replace(/contentGroup/g, "cg");
+    params[obj[key]] =
+      messageType !== "identify"
+        ? get(message.properties, key)
+        : get(traits, key);
+  });
+  return params;
+}
+ 
+function getProductLevelCustomParams(product, index, customParamKeys) {
+  const customParams = {};
+ 
+  // add all custom parameters
+  Eif (product && Object.keys(customParamKeys).length > 0) {
+    const productKey = `pr${index}`;
+    Object.keys(customParamKeys).forEach(customParamKey => {
+      customParams[`${productKey}${customParamKey}`] =
+        product[customParamKeys[customParamKey]];
+    });
+  }
+ 
+  return removeUndefinedAndNullValues(customParams);
+}
+ 
+function getCustomParamKeys(config) {
+  Eif (config) {
+    const customParams = {};
+    const { dimensions } = config;
+    const { metrics } = config;
+    let valueKey;
+    let dimensionKey;
+    let metricKey;
+ 
+    // convert dimension<index> to cd<index> and push to customParams
+    Eif (dimensions && dimensions.length > 0) {
+      dimensions.forEach(dimension => {
+        valueKey = dimension.from;
+        dimensionKey = dimension.to.replace(/dimension/g, "cd");
+        customParams[dimensionKey] = valueKey;
+      });
+    }
+ 
+    // convert metric<index> to cm<index> and push to customParams
+    Eif (metrics && metrics.length > 0) {
+      metrics.forEach(metric => {
+        valueKey = metric.from;
+        metricKey = metric.to.replace(/metric/g, "cm");
+        customParams[metricKey] = valueKey;
+      });
+    }
+ 
+    return removeUndefinedAndNullValues(customParams);
+  }
+  // return empty object if config is undefined or invalid
+  return {};
+}
+ 
+function getCustomParamsFromOldConfig(config) {
+  const dimensions = [];
+  const metrics = [];
+  if (config && config.customMappings && config.customMappings.length > 0) {
+    config.customMappings.forEach(mapping => {
+      if (mapping.to && mapping.to.startsWith("cd")) {
+        dimensions.push(mapping);
+      }
+      if (mapping.to && mapping.to.startsWith("cm")) {
+        metrics.push(mapping);
+      }
+    });
+  }
+  return [dimensions, metrics];
+}
+ 
+function checkmd5(message) {
+  Eif (message.userId && message.userId.length > 0) {
+    return md5(message.userId);
+  }
+  return undefined;
+}
+ 
+// Function for processing pageviews
+function processPageViews(message, destination) {
+  let documentPath;
+  let documentUrl;
+  let hostname;
+  let { includeSearch } = destination.Config;
+  includeSearch = includeSearch || false;
+  if (message.properties) {
+    documentUrl = getFieldValueFromMessage(message, "GApageUrl");
+    let url;
+    if (documentUrl) {
+      try {
+        url = new URL(documentUrl);
+        hostname = url.hostname;
+        documentPath = url.pathname;
+        const search = getFieldValueFromMessage(message, "GApageSearch");
+        if (search && includeSearch) {
+          documentPath += search;
+        }
+        // Ref - https://developers.google.com/analytics/devguides/collection/protocol/v1/reference#encoding
+        documentPath = encodeURIComponent(documentPath);
+      } catch (error) {
+        throw new ErrorBuilder()
+          .setStatus(400)
+          .setMessage(`Invalid Url: ${documentUrl}`)
+          .setStatTags({
+            destination: DESTINATION,
+            stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+            scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+            meta:
+              TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_PARAM
+          })
+          .build();
+      }
+    }
+  }
+  const parameters = {
+    dp: documentPath,
+    dl: documentUrl,
+    dh: hostname,
+    dt: getFieldValueFromMessage(message, "GApageTitle"),
+    dr: getFieldValueFromMessage(message, "GApageRef")
+  };
+  return removeUndefinedAndNullValues(parameters);
+}
+ 
+function setProductLevelProperties(
+  products,
+  parameters,
+  enhancedEcommerce,
+  destination
+) {
+  const params = parameters;
+  for (let i = 0; i < products.length; i += 1) {
+    const product = products[i];
+    const prodIndex = i + 1;
+    // If product_id is not provided, then SKU will be used in place of id
+    if (!product.product_id || product.product_id.length === 0) {
+      params[`pr${prodIndex}id`] = product.sku;
+    } else {
+      params[`pr${prodIndex}id`] = product.product_id;
+    }
+ 
+    // add product level custom dimensions and metrics to parameters
+    Eif (enhancedEcommerce) {
+      const customParamKeys = getCustomParamKeys(destination.Config);
+      Object.assign(
+        parameters,
+        getProductLevelCustomParams(product, prodIndex, customParamKeys)
+      );
+    }
+ 
+    params[`pr${prodIndex}nm`] = product.name;
+    params[`pr${prodIndex}ca`] = product.category;
+    params[`pr${prodIndex}br`] = product.brand;
+    params[`pr${prodIndex}va`] = product.variant;
+    params[`pr${prodIndex}cc`] = product.coupon;
+    params[`pr${prodIndex}ps`] = product.position;
+    params[`pr${prodIndex}pr`] = product.price;
+    params[`pr${prodIndex}qt`] = product.quantity || 1;
+  }
+  return params;
+}
+ 
+// Basic response builder
+// We pass the parameterMap with any processing-specific key-value prepopulated
+// We also pass the incoming payload, the hit type to be generated and
+// the field mapping and credentials JSONs
+function responseBuilderSimple(
+  parameters,
+  message,
+  hitType,
+  mappingJson,
+  destination
+) {
+  let {
+    doubleClick,
+    anonymizeIp,
+    enhancedLinkAttribution,
+    dimensions,
+    metrics,
+    contentGroupings
+  } = destination.Config;
+  const { trackingID } = destination.Config;
+  const traits = getFieldValueFromMessage(message, "traits") || {};
+  doubleClick = doubleClick || false;
+  anonymizeIp = anonymizeIp || false;
+  enhancedLinkAttribution = enhancedLinkAttribution || false;
+  contentGroupings = contentGroupings || [];
+ 
+  // for backward compatibility with old config
+  Iif (!dimensions && !metrics) {
+    [dimensions, metrics] = getCustomParamsFromOldConfig(destination.Config);
+  }
+ 
+  const rawPayload = {
+    v: "1",
+    t: hitType,
+    tid: trackingID,
+    ds: traits.ds || message.channel
+  };
+ 
+  if (doubleClick) {
+    rawPayload.npa = 1;
+  }
+  if (anonymizeIp) {
+    rawPayload.aip = 1;
+  }
+  if (enhancedLinkAttribution && message.properties) {
+    rawPayload.linkid = message.properties.linkid;
+  }
+ 
+  const params = removeUndefinedAndNullValues(parameters);
+ 
+  Eif (message.context) {
+    const { campaign, userAgent, locale, app, screen } = message.context;
+    rawPayload.ua = params.ua || userAgent;
+    rawPayload.ul = params.ul || locale;
+    if (app) {
+      rawPayload.an = params.an || app.name;
+      rawPayload.av = params.av || app.version;
+      rawPayload.aiid = params.aiid || app.namespace;
+    }
+    if (campaign) {
+      const { name, source, medium, content, term, campaignId } = campaign;
+      rawPayload.cn = params.cn || name;
+      rawPayload.cs = params.cs || source;
+      rawPayload.cm = params.cm || medium;
+      rawPayload.cc = params.cc || content;
+      rawPayload.ck = params.ck || term;
+      rawPayload.ci = campaignId;
+    }
+ 
+    Eif (screen) {
+      const { width, height } = screen;
+      Iif (width && height) {
+        rawPayload.sr = `${width}x${height}`;
+      }
+ 
+      const { innerWidth, innerHeight } = screen;
+      Iif (innerWidth && innerHeight) {
+        rawPayload.vp = `${innerWidth}x${innerHeight}`;
+      }
+    }
+  }
+ 
+  rawPayload.gclid = getDestinationExternalID(message, "googleAdsId");
+  rawPayload.dclid = getDestinationExternalID(message, "googleDisplayAdsId");
+ 
+  const sourceKeys = Object.keys(mappingJson);
+  sourceKeys.forEach(sourceKey => {
+    rawPayload[mappingJson[sourceKey]] = get(message, sourceKey);
+  });
+  let pageParams;
+  if (hitType !== "pageview") {
+    pageParams = processPageViews(message, destination);
+    delete pageParams.dr;
+  }
+ 
+  // Remove keys with undefined values
+  const payload = removeUndefinedAndNullValues(rawPayload);
+ 
+  // Get dimensions  from destination config
+  let dimensionsParam = getParamsFromConfig(message, dimensions, "dimensions");
+ 
+  dimensionsParam = removeUndefinedAndNullValues(dimensionsParam);
+ 
+  // Get metrics from destination config
+  let metricsParam = getParamsFromConfig(message, metrics, "metrics");
+  metricsParam = removeUndefinedAndNullValues(metricsParam);
+ 
+  // Get contentGroupings from destination config
+  let contentGroupingsParam = getParamsFromConfig(
+    message,
+    contentGroupings,
+    "content"
+  );
+  contentGroupingsParam = removeUndefinedAndNullValues(contentGroupingsParam);
+ 
+  const customParams = {
+    ...dimensionsParam,
+    ...metricsParam,
+    ...contentGroupingsParam
+  };
+ 
+  const finalPayload = {
+    ...params,
+    ...customParams,
+    ...payload,
+    ...pageParams
+  };
+  let { sendUserId } = destination.Config;
+  sendUserId = sendUserId || false;
+  // check if userId is there and populate
+  if (message.userId && message.userId.length > 0 && sendUserId) {
+    finalPayload.uid = message.userId;
+  }
+  const integrationsClientId = message.integrations
+    ? message.integrations[gaDisplayName]
+      ? message.integrations[gaDisplayName].clientId
+      : undefined
+    : undefined;
+ 
+  if (destination.Config.disableMd5) {
+    finalPayload.cid =
+      integrationsClientId ||
+      getDestinationExternalID(message, "gaExternalId") ||
+      traits.cid || // if for rETL cid is mapped in traits
+      message.anonymousId ||
+      undefined;
+  } else {
+    finalPayload.cid =
+      integrationsClientId ||
+      getDestinationExternalID(message, "gaExternalId") ||
+      traits.cid ||
+      message.anonymousId ||
+      checkmd5(message);
+  }
+  finalPayload.uip = traits.uip || getParsedIP(message);
+ 
+  const timestamp = message.originalTimestamp
+    ? new Date(message.originalTimestamp)
+    : new Date(message.timestamp);
+  finalPayload.qt = Date.now() - timestamp.getTime();
+ 
+  const response = defaultRequestConfig();
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = GA_ENDPOINT;
+  response.userId = message.anonymousId || message.userId;
+  response.params = finalPayload;
+ 
+  return response;
+}
+ 
+function processIdentify(message, destination) {
+  // If mapped to destination, Add externalId to traits
+  if (get(message, MappedToDestinationKey)) {
+    addExternalIdToTraits(message);
+    const identifierType = get(message, "context.externalId.0.identifierType");
+    Iif (identifierType === "uid") {
+      // this can be either uid / cid
+      adduserIdFromExternalId(message);
+    }
+  }
+  let {
+    serverSideIdentifyEventCategory,
+    serverSideIdentifyEventAction
+  } = destination.Config;
+  serverSideIdentifyEventAction = serverSideIdentifyEventAction || "";
+  serverSideIdentifyEventCategory = serverSideIdentifyEventCategory || "";
+  let ea;
+  if (serverSideIdentifyEventAction) {
+    ea = serverSideIdentifyEventAction;
+  } else {
+    ea = "User Enriched";
+  }
+  let ec;
+  const identifyTraits = getFieldValueFromMessage(message, "traits") || {};
+  // Check if present in traits and assign otherwise find the values
+  const { ua, ul, cn, cs, cm, cc, ck, an, av, aiid } = identifyTraits;
+ 
+  if (
+    serverSideIdentifyEventAction &&
+    identifyTraits[serverSideIdentifyEventCategory]
+  ) {
+    ec = identifyTraits[serverSideIdentifyEventCategory];
+  } else {
+    ec = "All";
+  }
+ 
+  return {
+    ea,
+    ec,
+    ni: 1,
+    ua,
+    ul,
+    cn,
+    cs,
+    cm,
+    cc,
+    ck,
+    an,
+    av,
+    aiid
+  };
+}
+ 
+// Function for processing non-ecom generic track events
+function processNonEComGenericEvent(message, destination) {
+  let { nonInteraction } = destination.Config;
+  nonInteraction = nonInteraction || false;
+  const nonInteractionProp =
+    message.properties !== undefined &&
+    message.properties.nonInteraction !== undefined
+      ? !!message.properties.nonInteraction
+      : !!nonInteraction;
+  const parameters = {
+    ea: message.event,
+    ec:
+      message.properties !== undefined &&
+      message.properties.category !== undefined
+        ? message.properties.category
+        : "All",
+    ni: nonInteractionProp === false ? 0 : 1
+  };
+ 
+  return parameters;
+}
+ 
+// Function for processing promotion viewed or clicked event
+function processPromotionEvent(message, destination) {
+  const eventString = message.event;
+ 
+  // Future releases will have additional logic for below elements allowing for
+  // customer-side overriding of event category and event action values
+  const parameters = {
+    cu: message.properties.currency
+  };
+ 
+  switch (eventString.toLowerCase()) {
+    case Event.PROMOTION_VIEWED.name:
+      parameters.promoa = "view";
+      break;
+    case Event.PROMOTION_CLICKED.name:
+      parameters.promoa = "promo_click";
+      break;
+    default:
+      break;
+  }
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+  Eif (enhancedEcommerce) {
+    switch (eventString.toLowerCase()) {
+      case Event.PROMOTION_VIEWED.name:
+        parameters.pa = "view";
+        break;
+      case Event.PROMOTION_CLICKED.name:
+        parameters.pa = "promo_click";
+        break;
+      default:
+        break;
+    }
+  }
+ 
+  return parameters;
+}
+ 
+// Function for processing payment-related events
+function processPaymentRelatedEvent(message, destination) {
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+  let pa;
+  switch (message.event.toLowerCase()) {
+    case Event.CHECKOUT_STEP_COMPLETED.name:
+      pa = "checkout_option";
+      break;
+    default:
+      pa = "checkout";
+      break;
+  }
+  Eif (enhancedEcommerce) {
+    return {
+      pa
+    };
+  }
+  return {
+    pa: "checkout"
+  };
+}
+ 
+// Function for processing order refund events
+function processRefundEvent(message, destination) {
+  const parameters = {
+    pa: "refund"
+  };
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+ 
+  const { products } = message.properties;
+  if (products && products.length > 0) {
+    const productParams = setProductLevelProperties(
+      products,
+      parameters,
+      enhancedEcommerce,
+      destination
+    );
+    Object.assign(parameters, productParams);
+  } else {
+    // full refund, only populate order_id
+    parameters.ti = message.properties.order_id;
+  }
+  // Finally fill up with mandatory and directly mapped fields
+  return parameters;
+}
+ 
+// Function for processing product and cart shared events =
+// This is not an Enhanced Ecomm event
+function processSharingEvent(message) {
+  const parameters = {};
+  // URL will be there for Product Shared event, hence that can be used as share target
+  // For Cart Shared, the list of product ids can be shared
+  const eventTypeString = message.event;
+  parameters.ec = message.properties.category || "All";
+  switch (eventTypeString.toLowerCase()) {
+    case Event.PRODUCT_SHARED.name:
+      parameters.st = message.properties.url;
+      break;
+    case Event.CART_SHARED.name: {
+      const { products } = message.properties;
+      let shareTargetString = ""; // all product ids will be concatenated with separation
+      products.forEach(product => {
+        shareTargetString += ` ${product.product_id}`;
+      });
+      parameters.st = shareTargetString;
+      break;
+    }
+    default:
+      parameters.st = "empty";
+  }
+  return parameters;
+}
+ 
+// Function for processing product list view event
+function processProductListEvent(message, destination) {
+  const eventString = message.event;
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+  const parameters = {};
+ 
+  // Set action depending on Product List Action
+ 
+  Eif (enhancedEcommerce) {
+    switch (eventString.toLowerCase()) {
+      case Event.PRODUCT_LIST_VIEWED.name:
+      case Event.PRODUCT_LIST_FILTERED.name:
+        parameters.pa = "detail";
+        break;
+      case Event.PRODUCT_LIST_CLICKED.name:
+        parameters.pa = "click";
+        break;
+      default:
+        throw new ErrorBuilder()
+          .setStatus(400)
+          .setMessage("unknown ProductListEvent type")
+          .setStatTags({
+            destination: DESTINATION,
+            stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+            scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+            meta:
+              TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_PARAM
+          })
+          .build();
+    }
+    const { products } = message.properties;
+    let { filters, sorts } = message.properties;
+    filters = Array.isArray(filters) ? filters : [];
+    sorts = Array.isArray(sorts) ? sorts : [];
+    filters = filters
+      .filter(
+        obj =>
+          Object.prototype.hasOwnProperty.call(obj, "type") &&
+          Object.prototype.hasOwnProperty.call(obj, "value")
+      )
+      .map(obj => {
+        return `${obj.type}:${obj.value}`;
+      })
+      .join();
+    sorts = sorts
+      .filter(
+        obj =>
+          Object.prototype.hasOwnProperty.call(obj, "type") &&
+          Object.prototype.hasOwnProperty.call(obj, "value")
+      )
+      .map(obj => {
+        return `${obj.type}:${obj.value}`;
+      })
+      .join();
+    if (products && products.length > 0) {
+      const customParamKeys = getCustomParamKeys(destination.Config);
+      for (let i = 0; i < products.length; i += 1) {
+        const value = products[i];
+        const prodIndex = i + 1;
+ 
+        if (!value.product_id || value.product_id.length === 0) {
+          parameters[`il1pi${prodIndex}id`] = value.sku;
+        } else {
+          parameters[`il1pi${prodIndex}id`] = value.product_id;
+        }
+ 
+        // add product level custom dimensions and metrics to parameters
+        Object.assign(
+          parameters,
+          getProductLevelCustomParams(value, prodIndex, customParamKeys)
+        );
+ 
+        parameters[`il1pi${prodIndex}nm`] = value.name;
+        parameters[`il1pi${prodIndex}ca`] = value.category;
+        parameters[`il1pi${prodIndex}br`] = value.brand;
+        parameters[`il1pi${prodIndex}va`] =
+          filters || sorts ? `${filters}::${sorts}` : undefined;
+        parameters[`il1pi${prodIndex}cc`] = value.coupon;
+        parameters[`il1pi${prodIndex}ps`] = value.position;
+        parameters[`il1pi${prodIndex}pr`] = value.price;
+        parameters[`il1pi${prodIndex}qt`] = value.quantity || 1;
+      }
+    }
+  }
+  return parameters;
+}
+ 
+// Function for processing product viewed or clicked events
+function processProductEvent(message, destination) {
+  const eventString = message.event;
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+ 
+  // Future releases will have additional logic for below elements allowing for
+  // customer-side overriding of event category and event action values
+ 
+  const parameters = {};
+ 
+  // Set product action to click or detail depending on event
+ 
+  Eif (enhancedEcommerce) {
+    switch (eventString.toLowerCase()) {
+      case Event.PRODUCT_CLICKED.name:
+        parameters.pa = "click";
+        break;
+      case Event.PRODUCT_VIEWED.name:
+        parameters.pa = "detail";
+        break;
+      case Event.PRODUCT_ADDED.name:
+      case Event.WISHLIST_PRODUCT_ADDED_TO_CART.name:
+      case Event.PRODUCT_ADDED_TO_WISHLIST.name:
+        parameters.pa = "add";
+        break;
+      case Event.PRODUCT_REMOVED.name:
+      case Event.PRODUCT_REMOVED_FROM_WISHLIST.name:
+        parameters.pa = "remove";
+        break;
+      default:
+        throw new ErrorBuilder()
+          .setStatus(400)
+          .setMessage("unknown ProductEvent type")
+          .setStatTags({
+            destination: DESTINATION,
+            stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+            scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+            meta:
+              TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_PARAM
+          })
+          .build();
+    }
+ 
+    // add produt level custom dimensions and metrics to parameters
+    // TODO:: This below block will be rejected if "pa" is not set, it is better fo this block should go under the above if block
+    // for better readability. ref: https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#pa
+    const customParamKeys = getCustomParamKeys(destination.Config);
+    Object.assign(
+      parameters,
+      getProductLevelCustomParams(message.properties, 1, customParamKeys)
+    );
+  }
+  const { sku } = message.properties;
+  const productId = message.properties.product_id;
+ 
+  Eif (!productId || productId.length === 0) {
+    parameters.pr1id = sku;
+  } else {
+    parameters.pr1id = productId;
+  }
+ 
+  return parameters;
+}
+ 
+// Function for processing transaction event
+function processTransactionEvent(message, destination) {
+  const eventString = message.event;
+  const parameters = {};
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+ 
+  // Set product action as per event
+  switch (eventString.toLowerCase()) {
+    case Event.CHECKOUT_STARTED.name:
+      parameters.pa = "checkout";
+      break;
+    case Event.ORDER_UPDATED.name:
+      parameters.pa = "checkout";
+      break;
+    case Event.ORDER_COMPLETED.name:
+      parameters.pa = "purchase";
+      break;
+    case Event.ORDER_CANCELLED.name:
+      parameters.pa = "refund";
+      break;
+    default:
+      throw new ErrorBuilder()
+        .setStatus(400)
+        .setMessage("unknown TransactionEvent type")
+        .isExplicit(true)
+        .setStatTags({
+          destination: DESTINATION,
+          stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+          scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+          meta:
+            TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_PARAM
+        })
+        .build();
+  }
+ 
+  // One of total/revenue/value should be there
+  const { revenue, value, total } = message.properties;
+ 
+  if (!revenue || revenue.length === 0) {
+    // revenue field is null or empty, cannot be used
+    if (!value || value.length === 0) {
+      // value field is null or empty, cannot be used
+      if (!(!total || total.length === 0)) {
+        // last option - total field
+        parameters.tr = total;
+      }
+    } else {
+      parameters.tr = value; // value field is populated, usable
+    }
+  } else {
+    parameters.tr = revenue; // revenue field is populated, usable
+  }
+ 
+  const { products } = message.properties;
+ 
+  if (products && products.length > 0) {
+    const productParams = setProductLevelProperties(
+      products,
+      parameters,
+      enhancedEcommerce,
+      destination
+    );
+    Object.assign(parameters, productParams);
+  } else {
+    // throw error, empty Product List in Product List Viewed event payload
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("No product information supplied for transaction event")
+      .setStatTags({
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+        meta: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_PARAM
+      })
+      .build();
+  }
+ 
+  // TODO: parameters.ec missing message.properties check and All value?
+  return parameters;
+}
+ 
+// Function for handling generic e-commerce events
+function processEComGenericEvent(message, destination) {
+  const eventString = message.event;
+  const parameters = {};
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+  Eif (enhancedEcommerce) {
+    // Set product action as per event
+    switch (eventString.toLowerCase()) {
+      case Event.CART_VIEWED.name:
+        parameters.pa = "detail";
+        break;
+      case Event.COUPON_ENTERED.name:
+        parameters.pa = "add";
+        break;
+      case Event.COUPON_APPLIED.name:
+        parameters.pa = "add";
+        break;
+      case Event.COUPON_DENIED.name:
+        parameters.pa = "remove";
+        break;
+      case Event.COUPON_REMOVED.name:
+        parameters.pa = "remove";
+        break;
+      case Event.PRODUCT_REVIEWED.name:
+        parameters.pa = "detail";
+        break;
+      case Event.PRODUCTS_SEARCHED.name:
+        parameters.pa = "click";
+        break;
+      default:
+        throw new ErrorBuilder()
+          .setStatus(400)
+          .setMessage("unknown TransactionEvent type")
+          .setStatTags({
+            destination: DESTINATION,
+            stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+            scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+            meta:
+              TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_PARAM
+          })
+          .build();
+    }
+  }
+  const { products } = message.properties;
+ 
+  Eif (products && products.length > 0) {
+    const productParams = setProductLevelProperties(
+      products,
+      parameters,
+      enhancedEcommerce,
+      destination
+    );
+    Object.assign(parameters, productParams);
+  }
+  return parameters;
+}
+ 
+// Generic process function which invokes specific handler functions depending on message type
+// and event type where applicable
+function processSingleMessage(message, destination) {
+  // Route to appropriate process depending on type of message received
+  const messageType = message.type ? message.type.toLowerCase() : undefined;
+  Iif (!messageType) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("Message type is not present")
+      .setStatTags({
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+        meta: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_EVENT
+      })
+      .build();
+  }
+  let customParams = {};
+  let category;
+  let { enableServerSideIdentify, enhancedEcommerce } = destination.Config;
+  enableServerSideIdentify = enableServerSideIdentify || false;
+  enhancedEcommerce = enhancedEcommerce || false;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      if (enableServerSideIdentify) {
+        customParams = processIdentify(message, destination);
+        category = ConfigCategory.IDENTIFY;
+      } else {
+        throw new ErrorBuilder()
+          .setStatus(400)
+          .setMessage("server side identify is not on")
+          .setStatTags({
+            destination: DESTINATION,
+            stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+            scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+            meta:
+              TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META
+                .CONFIGURATION
+          })
+          .build();
+      }
+      break;
+    case EventType.PAGE:
+      customParams = processPageViews(message, destination);
+      category = ConfigCategory.PAGE;
+      break;
+    case EventType.SCREEN:
+      customParams = {};
+      category = ConfigCategory.SCREEN;
+      break;
+    case EventType.TRACK: {
+      let eventName = message.event;
+      Iif (!(typeof eventName === "string" || eventName instanceof String)) {
+        throw new ErrorBuilder()
+          .setStatus(400)
+          .setMessage("Event name is not present/is not a string")
+          .setStatTags({
+            destination: DESTINATION,
+            stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+            scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+            meta:
+              TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_EVENT
+          })
+          .build();
+      }
+      if (enhancedEcommerce) {
+        eventName = eventName.toLowerCase();
+        category = nameToEventMap[eventName]
+          ? nameToEventMap[eventName].category
+          : ConfigCategory.NON_ECOM;
+        category.hitType = "event";
+        customParams.ni = 1;
+        customParams.ea = message.event;
+        let eventValue;
+        let setCategory;
+        Eif (message.properties) {
+          const { value, revenue, total } = message.properties;
+          eventValue = value || revenue || total;
+ 
+          setCategory = message.properties.category;
+        }
+        customParams.ec = setCategory || "EnhancedEcommerce";
+        customParams.ev = formatValue(eventValue);
+        switch (category.name) {
+          case ConfigCategory.PRODUCT_LIST.name:
+            Object.assign(
+              customParams,
+              processProductListEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.PROMOTION.name:
+            Object.assign(
+              customParams,
+              processPromotionEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.PRODUCT.name:
+            Object.assign(
+              customParams,
+              processProductEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.TRANSACTION.name:
+            Object.assign(
+              customParams,
+              processTransactionEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.PAYMENT.name:
+            Object.assign(
+              customParams,
+              processPaymentRelatedEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.REFUND.name:
+            Object.assign(
+              customParams,
+              processRefundEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.ECOM_GENERIC.name:
+            Object.assign(
+              customParams,
+              processEComGenericEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.SHARING.name:
+            Object.assign(customParams, processSharingEvent(message));
+            break;
+          default:
+            Object.assign(
+              customParams,
+              processNonEComGenericEvent(message, destination)
+            );
+            break;
+        }
+      } else {
+        category = ConfigCategory.NON_ECOM;
+        customParams = processNonEComGenericEvent(message, destination);
+      }
+      const label = message.properties ? message.properties.label : undefined;
+      customParams.el = label || "event";
+      break;
+    }
+    default:
+      // throw new RangeError('Unexpected value in type field');
+      throw new ErrorBuilder()
+        .setStatus(400)
+        .setMessage("message type not supported")
+        .setStatTags({
+          destination: DESTINATION,
+          stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+          scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+          meta:
+            TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_EVENT
+        })
+        .build();
+  }
+ 
+  return responseBuilderSimple(
+    customParams,
+    message,
+    category.hitType,
+    mappingConfig[category.name],
+    destination
+  );
+}
+ 
+// Iterate over input batch and generate response for each message
+function process(event) {
+  return processSingleMessage(event.message, event.destination);
+}
+const processRouterDest = inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = inputs.map(input => {
+    try {
+      Iif (input.message.statusCode) {
+        // already transformed event
+        return getSuccessRespEvents(
+          input.message,
+          [input.metadata],
+          input.destination
+        );
+      }
+      // if not transformed
+      return getSuccessRespEvents(
+        process(input),
+        [input.metadata],
+        input.destination
+      );
+    } catch (error) {
+      const errObj = generateErrorObject(
+        error,
+        DESTINATION,
+        TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM
+      );
+      return getErrorRespEvents(
+        [input.metadata],
+        error.status || 400,
+        error.message || "Error occurred while processing payload.",
+        errObj.statTags
+      );
+    }
+  });
+  return respList;
+};
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ga360/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ga360/config.js.html new file mode 100644 index 00000000000..1617b63b479 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ga360/config.js.html @@ -0,0 +1,647 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ga360/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/ga360 config.js

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +1901x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +1x +1x +1x +29x +  +  +1x +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ConfigCategory = {
+  IDENTIFY: {
+    name: "GAIdentifyConfig",
+    hitType: "event"
+  },
+  PAGE: {
+    name: "GAPageViewConfig",
+    hitType: "pageview"
+  },
+  SCREEN: {
+    name: "GAScreenViewConfig",
+    hitType: "screenview"
+  },
+  NON_ECOM: {
+    name: "GANonEComEventConfig",
+    hitType: "event"
+  },
+  PROMOTION: {
+    name: "GAPromotionEventConfig",
+    hitType: "event"
+  },
+  PAYMENT: {
+    name: "GAPaymentRelatedEventConfig",
+    hitType: "transaction"
+  },
+  REFUND: {
+    name: "GARefundEventConfig",
+    hitType: "transaction"
+  },
+  PRODUCT: {
+    name: "GAProductEventConfig",
+    hitType: "event"
+  },
+  PRODUCT_LIST: {
+    name: "GAProductListEventConfig",
+    hitType: "event"
+  },
+  TRANSACTION: {
+    name: "GATransactionEventConfig",
+    hitType: "transaction"
+  },
+  SHARING: {
+    name: "GASharingEventConfig",
+    hitType: "social"
+  },
+  ECOM_GENERIC: {
+    name: "GAEComGenericEventConfig",
+    hitType: "event"
+  }
+};
+ 
+const Event = {
+  PRODUCT_LIST_VIEWED: {
+    name: "product list viewed",
+    category: ConfigCategory.PRODUCT_LIST
+  },
+  PRODUCT_LIST_FILTERED: {
+    name: "product list filtered",
+    category: ConfigCategory.PRODUCT_LIST
+  },
+  PRODUCT_LIST_CLICKED: {
+    name: "product list clicked",
+    category: ConfigCategory.PRODUCT_LIST
+  },
+  PROMOTION_VIEWED: {
+    name: "promotion viewed",
+    category: ConfigCategory.PROMOTION
+  },
+  PROMOTION_CLICKED: {
+    name: "promotion clicked",
+    category: ConfigCategory.PROMOTION
+  },
+  PRODUCT_CLICKED: {
+    name: "product clicked",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_VIEWED: {
+    name: "product viewed",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_ADDED: {
+    name: "product added",
+    category: ConfigCategory.PRODUCT
+  },
+  WISHLIST_PRODUCT_ADDED_TO_CART: {
+    name: "wishlist product added to cart",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_REMOVED: {
+    name: "product removed",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_REMOVED_FROM_WISHLIST: {
+    name: "product removed from wishlist",
+    category: ConfigCategory.PRODUCT
+  },
+  PRODUCT_ADDED_TO_WISHLIST: {
+    name: "product added to wishlist",
+    category: ConfigCategory.PRODUCT
+  },
+  CHECKOUT_STARTED: {
+    name: "checkout started",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_UPDATED: {
+    name: "order updated",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_COMPLETED: {
+    name: "order completed",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_CANCELLED: {
+    name: "order cancelled",
+    category: ConfigCategory.TRANSACTION
+  },
+  ORDER_REFUNDED: {
+    name: "order refunded",
+    category: ConfigCategory.REFUND
+  },
+  CHECKOUT_STEP_VIEWED: {
+    name: "checkout step viewed",
+    category: ConfigCategory.PAYMENT
+  },
+  CHECKOUT_STEP_COMPLETED: {
+    name: "checkout step completed",
+    category: ConfigCategory.PAYMENT
+  },
+  PAYMENT_INFO_ENTERED: {
+    name: "payment info entered",
+    category: ConfigCategory.PAYMENT
+  },
+  PRODUCT_SHARED: {
+    name: "product shared",
+    category: ConfigCategory.SHARING
+  },
+  CART_SHARED: {
+    name: "cart shared",
+    category: ConfigCategory.SHARING
+  },
+  CART_VIEWED: {
+    name: "cart viewed",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  COUPON_ENTERED: {
+    name: "coupon entered",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  COUPON_APPLIED: {
+    name: "coupon applied",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  COUPON_DENIED: {
+    name: "coupon denied",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  COUPON_REMOVED: {
+    name: "coupon removed",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  PRODUCT_REVIEWED: {
+    name: "product reviewed",
+    category: ConfigCategory.ECOM_GENERIC
+  },
+  PRODUCTS_SEARCHED: {
+    name: "products searched",
+    category: ConfigCategory.ECOM_GENERIC
+  }
+};
+ 
+const GA_ENDPOINT = "https://www.google-analytics.com/collect";
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+const nameToEventMap = {};
+const events = Object.keys(Event);
+events.forEach(event => {
+  nameToEventMap[Event[event].name] = Event[event];
+});
+ 
+module.exports = {
+  Event,
+  GA_ENDPOINT,
+  ConfigCategory,
+  mappingConfig,
+  nameToEventMap
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ga360/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ga360/index.html new file mode 100644 index 00000000000..c0d5e5d7b6e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ga360/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ga360 + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/ga360

+
+ +
+ 90.58% + Statements + 375/414 +
+ + +
+ 75.26% + Branches + 219/291 +
+ + +
+ 93.75% + Functions + 30/32 +
+ + +
+ 90.53% + Lines + 373/412 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%10/10100%0/0100%1/1100%10/10
transform.js +
+
90.35%365/40475.26%219/29193.55%29/3190.3%363/402
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ga360/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ga360/transform.js.html new file mode 100644 index 00000000000..ddd1d97b35a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ga360/transform.js.html @@ -0,0 +1,2843 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ga360/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/ga360 transform.js

+
+ +
+ 90.35% + Statements + 365/404 +
+ + +
+ 75.26% + Branches + 219/291 +
+ + +
+ 93.55% + Functions + 29/31 +
+ + +
+ 90.3% + Lines + 363/402 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +9221x +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +153x +153x +153x +153x +153x +151x +302x +  +  +153x +153x +302x +302x +302x +302x +  +  +  +  +153x +  +  +  +33x +  +  +33x +33x +33x +132x +  +  +  +  +33x +  +  +  +30x +30x +30x +30x +  +  +  +  +  +30x +30x +60x +60x +60x +  +  +  +  +30x +30x +60x +60x +60x +  +  +  +30x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +51x +51x +51x +48x +  +48x +4x +4x +4x +4x +4x +4x +1x +  +  +  +  +  +  +51x +  +  +  +  +  +  +51x +  +  +  +  +  +  +  +  +10x +10x +20x +20x +  +20x +10x +  +10x +  +  +  +20x +20x +20x +  +  +  +  +  +20x +20x +20x +20x +20x +20x +20x +20x +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +51x +51x +51x +51x +51x +51x +  +  +51x +  +  +  +51x +  +  +  +  +  +  +51x +50x +  +51x +45x +  +51x +47x +  +  +51x +51x +51x +51x +51x +50x +50x +50x +  +51x +3x +3x +3x +3x +3x +3x +  +  +  +51x +51x +204x +  +  +51x +47x +  +  +  +51x +  +51x +  +  +51x +  +51x +  +  +51x +51x +  +  +51x +  +  +  +  +51x +  +51x +  +  +  +  +  +51x +  +  +  +  +  +51x +51x +  +51x +49x +  +51x +  +  +  +  +  +51x +1x +  +  +  +  +  +50x +  +  +  +  +  +  +51x +  +51x +51x +51x +51x +51x +  +51x +  +  +  +  +  +  +7x +7x +7x +  +7x +6x +  +1x +  +  +7x +7x +  +  +  +6x +  +1x +  +  +7x +  +  +  +  +  +  +  +  +11x +11x +  +11x +  +  +  +11x +  +  +  +  +  +  +  +  +  +11x +  +  +  +  +2x +  +  +  +2x +  +  +  +2x +  +1x +1x +  +1x +1x +  +  +  +2x +2x +2x +2x +  +1x +1x +  +1x +1x +  +  +  +  +  +2x +  +  +  +  +2x +2x +  +2x +  +1x +1x +  +1x +1x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +5x +  +  +5x +5x +  +5x +5x +3x +  +  +  +  +  +3x +  +  +2x +  +  +5x +  +  +  +  +  +2x +  +  +2x +2x +2x +  +1x +1x +  +1x +1x +1x +2x +  +1x +1x +  +  +  +  +2x +  +  +  +  +5x +5x +5x +5x +  +  +  +5x +5x +  +  +2x +2x +  +3x +3x +  +  +  +5x +5x +5x +5x +5x +  +4x +  +  +5x +  +2x +  +  +5x +4x +4x +7x +7x +  +7x +2x +  +5x +  +  +  +7x +  +  +  +  +7x +7x +7x +7x +  +7x +7x +7x +7x +  +  +  +1x +  +  +  +  +  +4x +  +  +  +  +6x +6x +6x +  +  +  +  +6x +  +  +  +6x +6x +  +1x +1x +  +2x +2x +  +  +  +1x +1x +  +  +2x +2x +  +  +  +  +  +  +  +6x +6x +  +  +  +  +6x +6x +  +6x +6x +  +  +  +  +6x +  +  +  +  +7x +7x +7x +7x +  +  +7x +  +1x +1x +  +1x +1x +  +1x +1x +  +4x +4x +  +  +  +  +  +7x +  +7x +  +5x +  +4x +  +2x +  +  +1x +  +  +2x +  +  +7x +  +7x +6x +  +  +  +  +  +6x +  +  +1x +  +  +  +  +  +  +6x +  +  +  +  +1x +1x +1x +1x +1x +  +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +55x +55x +  +  +55x +  +55x +55x +55x +55x +  +8x +7x +7x +  +1x +  +7x +  +4x +4x +4x +  +1x +1x +1x +  +41x +41x +  +  +41x +40x +40x +  +  +40x +40x +40x +  +  +40x +40x +40x +  +40x +  +40x +40x +40x +  +5x +  +  +  +4x +  +2x +  +  +  +2x +  +6x +  +  +  +6x +  +7x +  +  +  +6x +  +2x +  +  +  +2x +  +5x +  +  +  +5x +  +1x +  +  +  +1x +  +2x +2x +  +10x +  +  +  +10x +  +  +1x +1x +  +39x +39x +39x +  +  +  +1x +  +  +51x +  +  +  +  +  +  +  +  +  +  +  +55x +55x +  +4x +  +  +  +  +  +51x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const md5 = require("md5");
+const { EventType } = require("../../../constants");
+const {
+  Event,
+  GA_ENDPOINT,
+  ConfigCategory,
+  mappingConfig,
+  nameToEventMap
+} = require("./config");
+const {
+  removeUndefinedAndNullValues,
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  getParsedIP,
+  formatValue,
+  getFieldValueFromMessage,
+  getDestinationExternalID,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+const gaDisplayName = "Google Analytics";
+ 
+function getParamsFromConfig(message, destination) {
+  const params = {};
+  const obj = {};
+  const messageType = message.type;
+  const traits = getFieldValueFromMessage(message, "traits");
+  if (destination) {
+    destination.forEach(mapping => {
+      obj[mapping.from] = mapping.to;
+    });
+  }
+  const keys = Object.keys(obj);
+  keys.forEach(key => {
+    obj[key] = obj[key].replace(/dimension/g, "cd");
+    obj[key] = obj[key].replace(/metric/g, "cm");
+    obj[key] = obj[key].replace(/contentGroup/g, "cg");
+    params[obj[key]] =
+      messageType !== "identify"
+        ? get(message.properties, key)
+        : get(traits, key);
+  });
+  return params;
+}
+ 
+function getProductLevelCustomParams(product, index, customParamKeys) {
+  const customParams = {};
+ 
+  // add all custom parameters
+  Eif (product && Object.keys(customParamKeys).length > 0) {
+    const productKey = `pr${index}`;
+    Object.keys(customParamKeys).forEach(customParamKey => {
+      customParams[`${productKey}${customParamKey}`] =
+        product[customParamKeys[customParamKey]];
+    });
+  }
+ 
+  return removeUndefinedAndNullValues(customParams);
+}
+ 
+function getCustomParamKeys(config) {
+  Eif (config) {
+    const customParams = {};
+    const { dimensions } = config;
+    const { metrics } = config;
+    let valueKey;
+    let dimensionKey;
+    let metricKey;
+ 
+    // convert dimension<index> to cd<index> and push to customParams
+    Eif (dimensions && dimensions.length > 0) {
+      dimensions.forEach(dimension => {
+        valueKey = dimension.from;
+        dimensionKey = dimension.to.replace(/dimension/g, "cd");
+        customParams[dimensionKey] = valueKey;
+      });
+    }
+ 
+    // convert metric<index> to cm<index> and push to customParams
+    Eif (metrics && metrics.length > 0) {
+      metrics.forEach(metric => {
+        valueKey = metric.from;
+        metricKey = metric.to.replace(/metric/g, "cm");
+        customParams[metricKey] = valueKey;
+      });
+    }
+ 
+    return removeUndefinedAndNullValues(customParams);
+  }
+  // return empty object if config is undefined or invalid
+  return {};
+}
+ 
+function getCustomParamsFromOldConfig(config) {
+  const dimensions = [];
+  const metrics = [];
+  if (config && config.customMappings && config.customMappings.length > 0) {
+    config.customMappings.forEach(mapping => {
+      if (mapping.to && mapping.to.startsWith("cd")) {
+        dimensions.push(mapping);
+      }
+      if (mapping.to && mapping.to.startsWith("cm")) {
+        metrics.push(mapping);
+      }
+    });
+  }
+  return [dimensions, metrics];
+}
+ 
+// Function for processing pageviews
+function processPageViews(message, destination) {
+  let documentPath;
+  let documentUrl;
+  let hostname;
+  let { includeSearch } = destination.Config;
+  includeSearch = includeSearch || false;
+  if (message.properties) {
+    documentUrl = getFieldValueFromMessage(message, "GApageUrl");
+    let url;
+    if (documentUrl) {
+      try {
+        url = new URL(documentUrl);
+        hostname = url.hostname;
+        documentPath = url.pathname;
+        const search = getFieldValueFromMessage(message, "GApageSearch");
+        if (search && includeSearch) {
+          documentPath += search;
+        }
+      } catch (error) {
+        throw new CustomError(`Invalid Url: ${documentUrl}`, 400);
+      }
+    }
+  }
+  const parameters = {
+    dp: documentPath,
+    dl: documentUrl,
+    dh: hostname,
+    dt: getFieldValueFromMessage(message, "GApageTitle"),
+    dr: getFieldValueFromMessage(message, "GApageRef")
+  };
+  return removeUndefinedAndNullValues(parameters);
+}
+ 
+function setProductLevelProperties(
+  products,
+  parameters,
+  enhancedEcommerce,
+  destination
+) {
+  const params = parameters;
+  for (let i = 0; i < products.length; i += 1) {
+    const product = products[i];
+    const prodIndex = i + 1;
+    // If product_id is not provided, then SKU will be used in place of id
+    if (!product.product_id || product.product_id.length === 0) {
+      params[`pr${prodIndex}id`] = product.sku;
+    } else {
+      params[`pr${prodIndex}id`] = product.product_id;
+    }
+ 
+    // add product level custom dimensions and metrics to parameters
+    Eif (enhancedEcommerce) {
+      const customParamKeys = getCustomParamKeys(destination.Config);
+      Object.assign(
+        parameters,
+        getProductLevelCustomParams(product, prodIndex, customParamKeys)
+      );
+    }
+ 
+    params[`pr${prodIndex}nm`] = product.name;
+    params[`pr${prodIndex}ca`] = product.category;
+    params[`pr${prodIndex}br`] = product.brand;
+    params[`pr${prodIndex}va`] = product.variant;
+    params[`pr${prodIndex}cc`] = product.coupon;
+    params[`pr${prodIndex}ps`] = product.position;
+    params[`pr${prodIndex}pr`] = product.price;
+    params[`pr${prodIndex}qt`] = product.quantity || 1;
+  }
+  return params;
+}
+ 
+// Basic response builder
+// We pass the parameterMap with any processing-specific key-value prepopulated
+// We also pass the incoming payload, the hit type to be generated and
+// the field mapping and credentials JSONs
+function responseBuilderSimple(
+  parameters,
+  message,
+  hitType,
+  mappingJson,
+  destination
+) {
+  let {
+    doubleClick,
+    anonymizeIp,
+    enhancedLinkAttribution,
+    dimensions,
+    metrics,
+    contentGroupings
+  } = destination.Config;
+  const { trackingID } = destination.Config;
+  doubleClick = doubleClick || false;
+  anonymizeIp = anonymizeIp || false;
+  enhancedLinkAttribution = enhancedLinkAttribution || false;
+  contentGroupings = contentGroupings || [];
+ 
+  // for backward compatibility with old config
+  Iif (!dimensions && !metrics) {
+    [dimensions, metrics] = getCustomParamsFromOldConfig(destination.Config);
+  }
+ 
+  const rawPayload = {
+    v: "1",
+    t: hitType,
+    tid: trackingID,
+    ds: message.channel
+  };
+ 
+  if (doubleClick) {
+    rawPayload.npa = 1;
+  }
+  if (anonymizeIp) {
+    rawPayload.aip = 1;
+  }
+  if (enhancedLinkAttribution && message.properties) {
+    rawPayload.linkid = message.properties.linkid;
+  }
+ 
+  Eif (message.context) {
+    const { campaign, userAgent, locale, app } = message.context;
+    rawPayload.ua = userAgent;
+    rawPayload.ul = locale;
+    if (app) {
+      rawPayload.an = app.name;
+      rawPayload.av = app.version;
+      rawPayload.aiid = app.namespace;
+    }
+    if (campaign) {
+      const { name, source, medium, content, term } = campaign;
+      rawPayload.cn = name;
+      rawPayload.cs = source;
+      rawPayload.cm = medium;
+      rawPayload.cc = content;
+      rawPayload.ck = term;
+    }
+  }
+ 
+  const sourceKeys = Object.keys(mappingJson);
+  sourceKeys.forEach(sourceKey => {
+    rawPayload[mappingJson[sourceKey]] = get(message, sourceKey);
+  });
+  let pageParams;
+  if (hitType !== "pageview") {
+    pageParams = processPageViews(message, destination);
+  }
+ 
+  // Remove keys with undefined values
+  const payload = removeUndefinedAndNullValues(rawPayload);
+ 
+  const params = removeUndefinedAndNullValues(parameters);
+ 
+  // Get dimensions  from destination config
+  let dimensionsParam = getParamsFromConfig(message, dimensions, "dimensions");
+ 
+  dimensionsParam = removeUndefinedAndNullValues(dimensionsParam);
+ 
+  // Get metrics from destination config
+  let metricsParam = getParamsFromConfig(message, metrics, "metrics");
+  metricsParam = removeUndefinedAndNullValues(metricsParam);
+ 
+  // Get contentGroupings from destination config
+  let contentGroupingsParam = getParamsFromConfig(
+    message,
+    contentGroupings,
+    "content"
+  );
+  contentGroupingsParam = removeUndefinedAndNullValues(contentGroupingsParam);
+ 
+  const customParams = {
+    ...dimensionsParam,
+    ...metricsParam,
+    ...contentGroupingsParam
+  };
+ 
+  const finalPayload = {
+    ...params,
+    ...customParams,
+    ...payload,
+    ...pageParams
+  };
+  let { sendUserId } = destination.Config;
+  sendUserId = sendUserId || false;
+  // check if userId is there and populate
+  if (message.userId && message.userId.length > 0 && sendUserId) {
+    finalPayload.uid = message.userId;
+  }
+  const integrationsClientId = message.integrations
+    ? message.integrations[gaDisplayName]
+      ? message.integrations[gaDisplayName].clientId
+      : undefined
+    : undefined;
+ 
+  if (destination.Config.disableMd5) {
+    finalPayload.cid =
+      integrationsClientId ||
+      getDestinationExternalID(message, "gaExternalId") ||
+      message.anonymousId ||
+      message.userId;
+  } else {
+    finalPayload.cid =
+      integrationsClientId ||
+      getDestinationExternalID(message, "gaExternalId") ||
+      message.anonymousId ||
+      md5(message.userId);
+  }
+ 
+  finalPayload.uip = getParsedIP(message);
+ 
+  const response = defaultRequestConfig();
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = GA_ENDPOINT;
+  response.userId = message.anonymousId || message.userId;
+  response.params = finalPayload;
+ 
+  return response;
+}
+ 
+function processIdentify(message, destination) {
+  let {
+    serverSideIdentifyEventCategory,
+    serverSideIdentifyEventAction
+  } = destination.Config;
+  serverSideIdentifyEventAction = serverSideIdentifyEventAction || "";
+  serverSideIdentifyEventCategory = serverSideIdentifyEventCategory || "";
+  let ea;
+  if (serverSideIdentifyEventAction) {
+    ea = serverSideIdentifyEventAction;
+  } else {
+    ea = "User Enriched";
+  }
+  let ec;
+  const identifyTraits = getFieldValueFromMessage(message, "traits") || {};
+  if (
+    serverSideIdentifyEventAction &&
+    identifyTraits[serverSideIdentifyEventCategory]
+  ) {
+    ec = identifyTraits[serverSideIdentifyEventCategory];
+  } else {
+    ec = "All";
+  }
+ 
+  return {
+    ea,
+    ec,
+    ni: 1
+  };
+}
+ 
+// Function for processing non-ecom generic track events
+function processNonEComGenericEvent(message, destination) {
+  let { nonInteraction } = destination.Config;
+  nonInteraction = nonInteraction || false;
+  const nonInteractionProp =
+    message.properties !== undefined &&
+    message.properties.nonInteraction !== undefined
+      ? !!message.properties.nonInteraction
+      : !!nonInteraction;
+  const parameters = {
+    ea: message.event,
+    ec:
+      message.properties !== undefined &&
+      message.properties.category !== undefined
+        ? message.properties.category
+        : "All",
+    ni: nonInteractionProp === false ? 0 : 1
+  };
+ 
+  return parameters;
+}
+ 
+// Function for processing promotion viewed or clicked event
+function processPromotionEvent(message, destination) {
+  const eventString = message.event;
+ 
+  // Future releases will have additional logic for below elements allowing for
+  // customer-side overriding of event category and event action values
+  const parameters = {
+    cu: message.properties.currency
+  };
+ 
+  switch (eventString.toLowerCase()) {
+    case Event.PROMOTION_VIEWED.name:
+      parameters.promoa = "view";
+      break;
+    case Event.PROMOTION_CLICKED.name:
+      parameters.promoa = "promo_click";
+      break;
+    default:
+      break;
+  }
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+  Eif (enhancedEcommerce) {
+    switch (eventString.toLowerCase()) {
+      case Event.PROMOTION_VIEWED.name:
+        parameters.pa = "view";
+        break;
+      case Event.PROMOTION_CLICKED.name:
+        parameters.pa = "promo_click";
+        break;
+      default:
+        break;
+    }
+  }
+ 
+  return parameters;
+}
+ 
+// Function for processing payment-related events
+function processPaymentRelatedEvent(message, destination) {
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+  let pa;
+  switch (message.event.toLowerCase()) {
+    case Event.CHECKOUT_STEP_COMPLETED.name:
+      pa = "checkout_option";
+      break;
+    default:
+      pa = "checkout";
+      break;
+  }
+  Eif (enhancedEcommerce) {
+    return {
+      pa
+    };
+  }
+  return {
+    pa: "checkout"
+  };
+}
+ 
+// Function for processing order refund events
+function processRefundEvent(message, destination) {
+  const parameters = {
+    pa: "refund"
+  };
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+ 
+  const { products } = message.properties;
+  if (products && products.length > 0) {
+    const productParams = setProductLevelProperties(
+      products,
+      parameters,
+      enhancedEcommerce,
+      destination
+    );
+    Object.assign(parameters, productParams);
+  } else {
+    // full refund, only populate order_id
+    parameters.ti = message.properties.order_id;
+  }
+  // Finally fill up with mandatory and directly mapped fields
+  return parameters;
+}
+ 
+// Function for processing product and cart shared events =
+// This is not an Enhanced Ecomm event
+function processSharingEvent(message) {
+  const parameters = {};
+  // URL will be there for Product Shared event, hence that can be used as share target
+  // For Cart Shared, the list of product ids can be shared
+  const eventTypeString = message.event;
+  parameters.ec = message.properties.category || "All";
+  switch (eventTypeString.toLowerCase()) {
+    case Event.PRODUCT_SHARED.name:
+      parameters.st = message.properties.url;
+      break;
+    case Event.CART_SHARED.name: {
+      const { products } = message.properties;
+      let shareTargetString = ""; // all product ids will be concatenated with separation
+      products.forEach(product => {
+        shareTargetString += ` ${product.product_id}`;
+      });
+      parameters.st = shareTargetString;
+      break;
+    }
+    default:
+      parameters.st = "empty";
+  }
+  return parameters;
+}
+ 
+// Function for processing product list view event
+function processProductListEvent(message, destination) {
+  const eventString = message.event;
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+  const parameters = {};
+ 
+  // Set action depending on Product List Action
+ 
+  Eif (enhancedEcommerce) {
+    switch (eventString.toLowerCase()) {
+      case Event.PRODUCT_LIST_VIEWED.name:
+      case Event.PRODUCT_LIST_FILTERED.name:
+        parameters.pa = "detail";
+        break;
+      case Event.PRODUCT_LIST_CLICKED.name:
+        parameters.pa = "click";
+        break;
+      default:
+        throw new CustomError("unknown ProductListEvent type", 400);
+    }
+    const { products } = message.properties;
+    let { filters, sorts } = message.properties;
+    filters = filters || [];
+    sorts = sorts || [];
+    filters = filters
+      .map(obj => {
+        return `${obj.type}:${obj.value}`;
+      })
+      .join();
+    sorts = sorts
+      .map(obj => {
+        return `${obj.type}:${obj.value}`;
+      })
+      .join();
+    if (products && products.length > 0) {
+      const customParamKeys = getCustomParamKeys(destination.Config);
+      for (let i = 0; i < products.length; i += 1) {
+        const value = products[i];
+        const prodIndex = i + 1;
+ 
+        if (!value.product_id || value.product_id.length === 0) {
+          parameters[`il1pi${prodIndex}id`] = value.sku;
+        } else {
+          parameters[`il1pi${prodIndex}id`] = value.product_id;
+        }
+ 
+        // add product level custom dimensions and metrics to parameters
+        Object.assign(
+          parameters,
+          getProductLevelCustomParams(value, prodIndex, customParamKeys)
+        );
+ 
+        parameters[`il1pi${prodIndex}nm`] = value.name;
+        parameters[`il1pi${prodIndex}ca`] = value.category;
+        parameters[`il1pi${prodIndex}br`] = value.brand;
+        parameters[`il1pi${prodIndex}va`] =
+          filters || sorts ? `${filters}::${sorts}` : undefined;
+        parameters[`il1pi${prodIndex}cc`] = value.coupon;
+        parameters[`il1pi${prodIndex}ps`] = value.position;
+        parameters[`il1pi${prodIndex}pr`] = value.price;
+        parameters[`il1pi${prodIndex}qt`] = value.quantity || 1;
+      }
+    } else {
+      // throw error, empty Product List in Product List Viewed event payload
+      throw new CustomError(
+        "Empty Product List provided for Product List Viewed Event",
+        400
+      );
+    }
+  }
+  return parameters;
+}
+ 
+// Function for processing product viewed or clicked events
+function processProductEvent(message, destination) {
+  const eventString = message.event;
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+ 
+  // Future releases will have additional logic for below elements allowing for
+  // customer-side overriding of event category and event action values
+ 
+  const parameters = {};
+ 
+  // Set product action to click or detail depending on event
+ 
+  Eif (enhancedEcommerce) {
+    switch (eventString.toLowerCase()) {
+      case Event.PRODUCT_CLICKED.name:
+        parameters.pa = "click";
+        break;
+      case Event.PRODUCT_VIEWED.name:
+        parameters.pa = "detail";
+        break;
+      case Event.PRODUCT_ADDED.name:
+      case Event.WISHLIST_PRODUCT_ADDED_TO_CART.name:
+      case Event.PRODUCT_ADDED_TO_WISHLIST.name:
+        parameters.pa = "add";
+        break;
+      case Event.PRODUCT_REMOVED.name:
+      case Event.PRODUCT_REMOVED_FROM_WISHLIST.name:
+        parameters.pa = "remove";
+        break;
+      default:
+        throw new CustomError("unknown ProductEvent type", 400);
+    }
+ 
+    // add produt level custom dimensions and metrics to parameters
+    // TODO:: This below block will be rejected if "pa" is not set, it is better fo this block should go under the above if block
+    // for better readability. ref: https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#pa
+    const customParamKeys = getCustomParamKeys(destination.Config);
+    Object.assign(
+      parameters,
+      getProductLevelCustomParams(message.properties, 1, customParamKeys)
+    );
+  }
+  const { sku } = message.properties;
+  const productId = message.properties.product_id;
+ 
+  Eif (!productId || productId.length === 0) {
+    parameters.pr1id = sku;
+  } else {
+    parameters.pr1id = productId;
+  }
+ 
+  return parameters;
+}
+ 
+// Function for processing transaction event
+function processTransactionEvent(message, destination) {
+  const eventString = message.event;
+  const parameters = {};
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+ 
+  // Set product action as per event
+  switch (eventString.toLowerCase()) {
+    case Event.CHECKOUT_STARTED.name:
+      parameters.pa = "checkout";
+      break;
+    case Event.ORDER_UPDATED.name:
+      parameters.pa = "checkout";
+      break;
+    case Event.ORDER_COMPLETED.name:
+      parameters.pa = "purchase";
+      break;
+    case Event.ORDER_CANCELLED.name:
+      parameters.pa = "refund";
+      break;
+    default:
+      throw new CustomError("unknown TransactionEvent type", 400);
+  }
+ 
+  // One of total/revenue/value should be there
+  const { revenue, value, total } = message.properties;
+ 
+  if (!revenue || revenue.length === 0) {
+    // revenue field is null or empty, cannot be used
+    if (!value || value.length === 0) {
+      // value field is null or empty, cannot be used
+      if (!(!total || total.length === 0)) {
+        // last option - total field
+        parameters.tr = total;
+      }
+    } else {
+      parameters.tr = value; // value field is populated, usable
+    }
+  } else {
+    parameters.tr = revenue; // revenue field is populated, usable
+  }
+ 
+  const { products } = message.properties;
+ 
+  if (products && products.length > 0) {
+    const productParams = setProductLevelProperties(
+      products,
+      parameters,
+      enhancedEcommerce,
+      destination
+    );
+    Object.assign(parameters, productParams);
+  } else {
+    // throw error, empty Product List in Product List Viewed event payload
+    throw new CustomError(
+      "No product information supplied for transaction event",
+      400
+    );
+  }
+ 
+  // TODO: parameters.ec missing message.properties check and All value?
+  return parameters;
+}
+ 
+// Function for handling generic e-commerce events
+function processEComGenericEvent(message, destination) {
+  const eventString = message.event;
+  const parameters = {};
+  let { enhancedEcommerce } = destination.Config;
+  enhancedEcommerce = enhancedEcommerce || false;
+  Eif (enhancedEcommerce) {
+    // Set product action as per event
+    switch (eventString.toLowerCase()) {
+      case Event.CART_VIEWED.name:
+        parameters.pa = "detail";
+        break;
+      case Event.COUPON_ENTERED.name:
+        parameters.pa = "add";
+        break;
+      case Event.COUPON_APPLIED.name:
+        parameters.pa = "add";
+        break;
+      case Event.COUPON_DENIED.name:
+        parameters.pa = "remove";
+        break;
+      case Event.COUPON_REMOVED.name:
+        parameters.pa = "remove";
+        break;
+      case Event.PRODUCT_REVIEWED.name:
+        parameters.pa = "detail";
+        break;
+      case Event.PRODUCTS_SEARCHED.name:
+        parameters.pa = "click";
+        break;
+      default:
+        throw new CustomError("unknown TransactionEvent type", 400);
+    }
+  }
+  const { products } = message.properties;
+ 
+  Eif (products && products.length > 0) {
+    const productParams = setProductLevelProperties(
+      products,
+      parameters,
+      enhancedEcommerce,
+      destination
+    );
+    Object.assign(parameters, productParams);
+  }
+  return parameters;
+}
+ 
+// Generic process function which invokes specific handler functions depending on message type
+// and event type where applicable
+function processSingleMessage(message, destination) {
+  // Route to appropriate process depending on type of message received
+  const messageType = message.type ? message.type.toLowerCase() : undefined;
+  Iif (!messageType) {
+    throw new CustomError("Message type is not present", 400);
+  }
+  let customParams = {};
+  let category;
+  let { enableServerSideIdentify, enhancedEcommerce } = destination.Config;
+  enableServerSideIdentify = enableServerSideIdentify || false;
+  enhancedEcommerce = enhancedEcommerce || false;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      if (enableServerSideIdentify) {
+        customParams = processIdentify(message, destination);
+        category = ConfigCategory.IDENTIFY;
+      } else {
+        throw new CustomError("server side identify is not on", 400);
+      }
+      break;
+    case EventType.PAGE:
+      customParams = processPageViews(message, destination);
+      category = ConfigCategory.PAGE;
+      break;
+    case EventType.SCREEN:
+      customParams = {};
+      category = ConfigCategory.SCREEN;
+      break;
+    case EventType.TRACK: {
+      let eventName = message.event;
+      Iif (!(typeof eventName === "string" || eventName instanceof String)) {
+        throw new CustomError("Event name is not present/is not a string", 400);
+      }
+      if (enhancedEcommerce) {
+        eventName = eventName.toLowerCase();
+        category = nameToEventMap[eventName]
+          ? nameToEventMap[eventName].category
+          : ConfigCategory.NON_ECOM;
+        category.hitType = "event";
+        customParams.ni = 1;
+        customParams.ea = message.event;
+        let eventValue;
+        let setCategory;
+        Eif (message.properties) {
+          const { value, revenue, total } = message.properties;
+          eventValue = value || revenue || total;
+ 
+          setCategory = message.properties.category;
+        }
+        customParams.ec = setCategory || "EnhancedEcommerce";
+        customParams.ev = formatValue(eventValue);
+        switch (category.name) {
+          case ConfigCategory.PRODUCT_LIST.name:
+            Object.assign(
+              customParams,
+              processProductListEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.PROMOTION.name:
+            Object.assign(
+              customParams,
+              processPromotionEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.PRODUCT.name:
+            Object.assign(
+              customParams,
+              processProductEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.TRANSACTION.name:
+            Object.assign(
+              customParams,
+              processTransactionEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.PAYMENT.name:
+            Object.assign(
+              customParams,
+              processPaymentRelatedEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.REFUND.name:
+            Object.assign(
+              customParams,
+              processRefundEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.ECOM_GENERIC.name:
+            Object.assign(
+              customParams,
+              processEComGenericEvent(message, destination)
+            );
+            break;
+          case ConfigCategory.SHARING.name:
+            Object.assign(customParams, processSharingEvent(message));
+            break;
+          default:
+            Object.assign(
+              customParams,
+              processNonEComGenericEvent(message, destination)
+            );
+            break;
+        }
+      } else {
+        category = ConfigCategory.NON_ECOM;
+        customParams = processNonEComGenericEvent(message, destination);
+      }
+      const label = message.properties ? message.properties.label : undefined;
+      customParams.el = label || "event";
+      break;
+    }
+    default:
+      // throw new RangeError('Unexpected value in type field');
+      throw new CustomError("message type not supported", 400);
+  }
+ 
+  return responseBuilderSimple(
+    customParams,
+    message,
+    category.hitType,
+    mappingConfig[category.name],
+    destination
+  );
+}
+ 
+// Iterate over input batch and generate response for each message
+function process(event) {
+  let response;
+  try {
+    response = processSingleMessage(event.message, event.destination);
+  } catch (error) {
+    throw new CustomError(
+      error.message || "Unknown error",
+      error.status || 400
+    );
+  }
+ 
+  return response;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/config.js.html new file mode 100644 index 00000000000..c579b0ff380 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/config.js.html @@ -0,0 +1,428 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ga4/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/ga4 config.js

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +1171x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ENDPOINT = "https://www.google-analytics.com/mp/collect";
+ 
+const ConfigCategory = {
+  COMMON: { name: "GA4CommonConfig" },
+  ITEMS: { name: "GA4ItemsConfig" },
+ 
+  /* E-Commerce Events */
+  // Ref - https://www.rudderstack.com/docs/rudderstack-api/api-specification/rudderstack-ecommerce-events-specification/
+  /* Browsing Section */
+  PRODUCTS_SEARCHED: { name: "GA4ProductsSearchedConfig" },
+  PRODUCT_LIST_VIEWED: { name: "GA4ProductListViewedConfig" },
+ 
+  /* Promotions Section */
+  PROMOTION_VIEWED: { name: "GA4PromotionViewedConfig" },
+  PROMOTION_CLICKED: { name: "GA4PromotionClickedConfig" },
+ 
+  /* Ordering Section */
+  PRODUCT_CLICKED: { name: "GA4ProductClickedConfig" },
+  PRODUCT_VIEWED: { name: "GA4ProductViewedConfig" },
+  PRODUCT_ADDED: { name: "GA4ProductAddedConfig" },
+  PRODUCT_REMOVED: { name: "GA4ProductRemovedConfig" },
+  CART_VIEWED: { name: "GA4CartViewedConfig" },
+  CHECKOUT_STARTED: { name: "GA4CheckoutStartedConfig" },
+  PAYMENT_INFO_ENTERED: { name: "GA4PaymentInfoEnteredConfig" },
+  ORDER_COMPLETED: { name: "GA4OrderCompletedConfig" },
+  ORDER_REFUNDED: { name: "GA4OrderRefundedConfig" },
+ 
+  /* Wishlist Section */
+  PRODUCT_ADDED_TO_WISHLIST: { name: "GA4ProductAddedToWishlistConfig" },
+ 
+  /* Sharing Section */
+  PRODUCT_SHARED: { name: "GA4ProductSharedConfig" },
+  CART_SHARED: { name: "GA4CartSharedConfig" },
+ 
+  /* Group */
+  GROUP: { name: "GA4GroupConfig" },
+ 
+  /* GA4 Events */
+  EARN_VIRTUAL_CURRENCY: { name: "GA4EarnVirtualCurrencyConfig" },
+  GENERATE_LEAD: { name: "GA4GenerateLeadConfig" },
+  LEVEL_UP: { name: "GA4LevelUpConfig" },
+  LOGIN: { name: "GA4LoginConfig" },
+  POST_SCORE: { name: "GA4PostScoreConfig" },
+  SELECT_CONTENT: { name: "GA4SelectContentConfig" },
+  SIGN_UP: { name: "GA4SignUpConfig" },
+  SPEND_VIRTUAL_CURRENCY: { name: "GA4SpendVirtualCurrencyConfig" },
+ 
+  UNLOCK_ACHIEVEMENT: { name: "GA4UnlockAchievementConfig" },
+  VIEW_SEARCH_RESULTS: { name: "GA4ViewSearchResultsConfig" }
+};
+ 
+/**
+ * GA4 Events (29)
+ * Ref - https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference/events
+ */
+const eventNameMapping = {
+  /* E-Commerce Events */
+  /* Browsing Section */
+  products_searched: "search",
+  product_list_viewed: "view_item_list",
+ 
+  /* Promotions Section */
+  promotion_viewed: "view_promotion",
+  promotion_clicked: "select_promotion",
+ 
+  /* Ordering Section */
+  product_clicked: "select_item",
+  product_viewed: "view_item",
+  product_added: "add_to_cart",
+  product_removed: "remove_from_cart",
+  cart_viewed: "view_cart",
+  checkout_started: "begin_checkout",
+  payment_info_entered: "add_payment_info",
+  /**
+   * payment_info_entered: "add_shipping_info",
+   * This event mapping is handled from transform.js
+   */
+  order_completed: "purchase",
+  order_refunded: "refund",
+ 
+  /* Wishlist Section */
+  product_added_to_wishlist: "add_to_wishlist",
+ 
+  /* Sharing Section */
+  product_shared: "share",
+  cart_shared: "share",
+ 
+  /* Group */
+  group: "join_group",
+ 
+  /* GA4 Events */
+  earn_virtual_currency: "earn_virtual_currency",
+  generate_lead: "generate_lead",
+  level_up: "level_up",
+  login: "login",
+  post_score: "post_score",
+  select_content: "select_content",
+  sign_up: "sign_up",
+  spend_virtual_currency: "spend_virtual_currency",
+  tutorial_begin: "tutorial_begin",
+  tutorial_complete: "tutorial_complete",
+  unlock_achievement: "unlock_achievement",
+  view_search_results: "view_search_results"
+};
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+module.exports = {
+  ENDPOINT,
+  ConfigCategory,
+  eventNameMapping,
+  mappingConfig,
+  trackCommonConfig: mappingConfig[ConfigCategory.COMMON.name]
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/index.html new file mode 100644 index 00000000000..6fbd956a07b --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ga4 + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/ga4

+
+ +
+ 94.87% + Statements + 259/273 +
+ + +
+ 92% + Branches + 115/125 +
+ + +
+ 88.24% + Functions + 15/17 +
+ + +
+ 94.87% + Lines + 259/273 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%6/6100%0/0100%0/0100%6/6
transform.js +
+
97.86%183/18795.06%77/81100%2/297.86%183/187
utils.js +
+
87.5%70/8086.36%38/4486.67%13/1587.5%70/80
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/transform.js.html new file mode 100644 index 00000000000..e3fd868e253 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/transform.js.html @@ -0,0 +1,1418 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ga4/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/ga4 transform.js

+
+ +
+ 97.86% + Statements + 183/187 +
+ + +
+ 95.06% + Branches + 77/81 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 97.86% + Lines + 183/187 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +4471x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +67x +67x +1x +  +  +  +66x +  +  +66x +2x +  +  +  +  +  +  +64x +64x +63x +  +  +62x +  +  +59x +  +59x +1x +  +  +  +  +58x +  +3x +  +  +  +3x +1x +  +  +  +  +2x +  +  +  +  +60x +60x +  +  +50x +  +  +1x +1x +  +  +  +1x +  +1x +1x +  +  +  +1x +1x +  +  +1x +1x +  +  +  +1x +1x +  +4x +4x +  +  +  +4x +4x +  +  +1x +1x +  +  +  +1x +1x +  +1x +1x +  +  +  +1x +1x +  +5x +5x +  +  +  +5x +2x +  +1x +1x +  +  +  +1x +1x +  +2x +2x +  +  +  +2x +2x +  +1x +1x +  +  +  +1x +1x +  +2x +  +  +  +2x +1x +  +1x +  +2x +2x +  +1x +1x +  +  +  +1x +1x +  +2x +2x +  +  +  +2x +2x +  +  +1x +1x +  +  +  +1x +1x +  +  +2x +2x +  +  +  +2x +  +2x +2x +  +  +  +2x +  +  +2x +2x +  +  +  +2x +  +  +2x +2x +  +  +  +2x +  +1x +1x +  +  +  +1x +  +2x +2x +  +  +  +2x +  +2x +2x +  +  +  +2x +  +2x +2x +  +  +  +2x +  +2x +2x +  +  +  +2x +  +2x +2x +  +  +  +2x +  +2x +2x +  +  +  +2x +  +1x +1x +  +1x +1x +  +1x +1x +  +  +  +1x +  +2x +2x +  +  +  +2x +2x +  +  +  +  +  +  +10x +1x +  +  +  +  +  +9x +1x +  +  +  +  +  +8x +  +  +8x +8x +  +  +  +  +  +8x +5x +5x +  +  +  +  +  +  +55x +  +55x +50x +  +  +55x +13x +  +  +  +55x +55x +  +  +  +  +  +55x +2x +2x +  +  +55x +  +55x +55x +  +  +55x +55x +55x +55x +  +  +  +55x +  +  +  +  +55x +  +54x +54x +  +1x +1x +  +  +  +  +55x +55x +  +  +  +72x +72x +  +72x +  +  +72x +1x +  +71x +1x +  +70x +1x +  +  +69x +1x +  +  +  +  +  +68x +  +68x +  +65x +53x +  +  +2x +2x +2x +  +1x +  +55x +  +  +1x + 
const get = require("get-value");
+const { EventType } = require("../../../constants");
+const {
+  CustomError,
+  defaultPostRequestConfig,
+  constructPayload,
+  defaultRequestConfig,
+  extractCustomFields,
+  isEmptyObject,
+  flattenJson,
+  getDestinationExternalID,
+  removeUndefinedAndNullValues,
+  isDefinedAndNotNull
+} = require("../../util");
+const {
+  ENDPOINT,
+  trackCommonConfig,
+  eventNameMapping,
+  mappingConfig,
+  ConfigCategory
+} = require("./config");
+const {
+  msUnixTimestamp,
+  isReservedEventName,
+  GA4_RESERVED_PARAMETER_EXCLUSION,
+  removeReservedParameterPrefixNames,
+  GA4_RESERVED_USER_PROPERTY_EXCLUSION,
+  removeReservedUserPropertyPrefixNames,
+  isReservedWebCustomEventName,
+  isReservedWebCustomPrefixName,
+  getDestinationItemProperties
+} = require("./utils");
+ 
+function trackResponseBuilder(message, { Config }) {
+  let event = get(message, "event");
+  if (!event) {
+    throw new CustomError("Event name is required", 400);
+  }
+ 
+  // trim and replace spaces with "_"
+  event = event.trim().replace(/\s+/g, "_");
+ 
+  // reserved event names are not allowed
+  if (isReservedEventName(event)) {
+    throw new CustomError(
+      "[Google Analytics 4] track:: Reserved event names are not allowed",
+      400
+    );
+  }
+ 
+  // get common top level rawPayload
+  let rawPayload = constructPayload(message, trackCommonConfig);
+  if (rawPayload.timestamp_micros) {
+    rawPayload.timestamp_micros = msUnixTimestamp(rawPayload.timestamp_micros);
+  }
+ 
+  switch (Config.typesOfClient) {
+    case "gtag":
+      // gtag.js
+      rawPayload.client_id =
+        get(message, "context.client_id") || get(message, "messageId");
+      if (!isDefinedAndNotNull(rawPayload.client_id)) {
+        throw new CustomError(
+          "context.client_id or messageId must be provided",
+          400
+        );
+      }
+      break;
+    case "firebase":
+      rawPayload.app_instance_id = getDestinationExternalID(
+        message,
+        "ga4AppInstanceId"
+      );
+      if (!isDefinedAndNotNull(rawPayload.app_instance_id)) {
+        throw new CustomError(
+          "ga4AppInstanceId must be provided under externalId",
+          400
+        );
+      }
+      break;
+    default:
+      throw CustomError("GA4: Invalid type of client", 400);
+  }
+ 
+  let payload = {};
+  if (eventNameMapping[event.toLowerCase()]) {
+    // GA4 standard events
+    // get event specific parameters
+    switch (event.toLowerCase()) {
+      /* Browsing Section */
+      case "products_searched":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCTS_SEARCHED.name]
+        );
+        break;
+      case "product_list_viewed":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_LIST_VIEWED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      /* Promotions Section */
+      case "promotion_viewed":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PROMOTION_VIEWED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      case "promotion_clicked":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PROMOTION_CLICKED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, false);
+        break;
+      /* Ordering Section */
+      case "product_clicked":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_CLICKED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      case "product_viewed":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_VIEWED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      case "product_added":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_ADDED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      case "product_removed":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_REMOVED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      case "cart_viewed":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.CART_VIEWED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      case "checkout_started":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.CHECKOUT_STARTED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      case "payment_info_entered":
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PAYMENT_INFO_ENTERED.name]
+        );
+        if (payload.params.shipping_tier) {
+          payload.name = "add_shipping_info";
+        } else {
+          payload.name = "add_payment_info";
+        }
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      case "order_completed":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.ORDER_COMPLETED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      case "order_refunded":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.ORDER_REFUNDED.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, false);
+        break;
+      /* Wishlist Section */
+      case "product_added_to_wishlist":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_ADDED_TO_WISHLIST.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, true);
+        break;
+      /* Sharing Section */
+      case "product_shared":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_SHARED.name]
+        );
+        break;
+      case "cart_shared":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.CART_SHARED.name]
+        );
+        break;
+      /* Group */
+      case "group":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.GROUP.name]
+        );
+        break;
+      /* GA4 Events */
+      case "earn_virtual_currency":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.EARN_VIRTUAL_CURRENCY.name]
+        );
+        break;
+      case "generate_lead":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.GENERATE_LEAD.name]
+        );
+        break;
+      case "level_up":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.LEVEL_UP.name]
+        );
+        break;
+      case "login":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.LOGIN.name]
+        );
+        break;
+      case "post_score":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.POST_SCORE.name]
+        );
+        break;
+      case "select_content":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.SELECT_CONTENT.name]
+        );
+        break;
+      case "sign_up":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.SIGN_UP.name]
+        );
+        break;
+      case "spend_virtual_currency":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.SPEND_VIRTUAL_CURRENCY.name]
+        );
+        break;
+      case "tutorial_begin":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        break;
+      case "tutorial_complete":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        break;
+      case "unlock_achievement":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.UNLOCK_ACHIEVEMENT.name]
+        );
+        break;
+      case "view_search_results":
+        payload.name = eventNameMapping[event.toLowerCase()];
+        payload.params = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.VIEW_SEARCH_RESULTS.name]
+        );
+        payload.params.items = getDestinationItemProperties(message, false);
+        break;
+      default:
+        break;
+    }
+  } else {
+    // custom events category
+    // Event names are case sensitive
+    if (isReservedWebCustomEventName(event)) {
+      throw new CustomError(
+        "[Google Analytics 4] track:: Reserved custom event names are not allowed",
+        400
+      );
+    }
+ 
+    if (isReservedWebCustomPrefixName(event)) {
+      throw new CustomError(
+        "[Google Analytics 4] track:: Reserved custom prefix names are not allowed",
+        400
+      );
+    }
+ 
+    payload.name = event;
+ 
+    // all extra parameters passed is incorporated inside params
+    let customParameters = {};
+    customParameters = extractCustomFields(
+      message,
+      customParameters,
+      ["properties"],
+      GA4_RESERVED_PARAMETER_EXCLUSION
+    );
+    if (!isEmptyObject(customParameters)) {
+      customParameters = flattenJson(customParameters);
+      payload.params = {
+        ...payload.params,
+        ...customParameters
+      };
+    }
+  }
+ 
+  removeReservedParameterPrefixNames(payload.params);
+ 
+  if (payload.params) {
+    payload.params = removeUndefinedAndNullValues(payload.params);
+  }
+ 
+  if (isEmptyObject(payload.params)) {
+    delete payload.params;
+  }
+ 
+  // take GA4 user properties
+  let userProperties = {};
+  userProperties = extractCustomFields(
+    message,
+    userProperties,
+    ["properties.user_properties"],
+    GA4_RESERVED_USER_PROPERTY_EXCLUSION
+  );
+  if (!isEmptyObject(userProperties)) {
+    userProperties = flattenJson(userProperties);
+    rawPayload.user_properties = userProperties;
+  }
+ 
+  removeReservedUserPropertyPrefixNames(rawPayload.user_properties);
+ 
+  payload = removeUndefinedAndNullValues(payload);
+  rawPayload = { ...rawPayload, events: [payload] };
+ 
+  // build response
+  const response = defaultRequestConfig();
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = ENDPOINT;
+  response.headers = {
+    HOST: "www.google-analytics.com",
+    "Content-Type": "application/json"
+  };
+  response.params = {
+    api_secret: Config.apiSecret
+  };
+ 
+  // setting response params as per client type
+  switch (Config.typesOfClient) {
+    case "gtag":
+      response.params.measurement_id = Config.measurementId;
+      break;
+    case "firebase":
+      response.params.firebase_app_id = Config.firebaseAppId;
+      break;
+    default:
+      break;
+  }
+ 
+  response.body.JSON = rawPayload;
+  return response;
+}
+ 
+function process(event) {
+  const { message, destination } = event;
+  const { Config } = destination;
+ 
+  Iif (!Config.typesOfClient) {
+    throw new CustomError("Client type not found. Aborting ", 400);
+  }
+  if (!Config.apiSecret) {
+    throw new CustomError("API Secret not found. Aborting ", 400);
+  }
+  if (Config.typesOfClient === "gtag" && !Config.measurementId) {
+    throw new CustomError("measurementId must be provided. Aborting", 400);
+  }
+  if (Config.typesOfClient === "firebase" && !Config.firebaseAppId) {
+    throw new CustomError("firebaseAppId must be provided. Aborting", 400);
+  }
+ 
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  const messageType = message.type.toLowerCase();
+  let response;
+  switch (messageType) {
+    case EventType.TRACK:
+      response = trackResponseBuilder(message, destination);
+      break;
+    case EventType.PAGE:
+      // passing page_view custom event for page()
+      message.event = "page_view";
+      response = trackResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`Message type ${messageType} not supported`, 400);
+  }
+  return response;
+}
+ 
+module.exports = { process };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/utils.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/utils.js.html new file mode 100644 index 00000000000..d6e32ec3753 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ga4/utils.js.html @@ -0,0 +1,1088 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ga4/utils.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/ga4 utils.js

+
+ +
+ 87.5% + Statements + 70/80 +
+ + +
+ 86.36% + Branches + 38/44 +
+ + +
+ 86.67% + Functions + 13/15 +
+ + +
+ 87.5% + Lines + 70/80 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +3371x +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +  +  +  +  +  +63x +63x +  +63x +  +  +63x +1x +  +  +  +  +  +62x +1x +1x +  +  +  +  +  +  +61x +  +  +  +  +  +  +  +  +  +66x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +66x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +55x +  +55x +5x +  +  +50x +135x +399x +4x +  +395x +  +  +  +135x +  +4x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +55x +  +55x +53x +  +  +2x +3x +9x +1x +  +8x +  +  +  +3x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +10x +  +  +  +  +  +  +  +  +  +9x +  +  +9x +42x +1x +  +41x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +25x +25x +1x +  +  +  +  +24x +21x +21x +21x +  +  +  +21x +  +  +  +1x +  +  +20x +20x +  +  +  +  +  +20x +20x +20x +  +  +20x +  +3x +1x +  +22x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  + 
const get = require("get-value");
+const moment = require("moment");
+const { proxyRequest } = require("../../../adapters/network");
+const {
+  getDynamicMeta,
+  processAxiosResponse
+} = require("../../../adapters/utils/networkUtils");
+const {
+  constructPayload,
+  CustomError,
+  flattenJson,
+  isEmptyObject,
+  extractCustomFields,
+  isDefinedAndNotNull,
+  isHttpStatusSuccess
+} = require("../../util");
+const { TRANSFORMER_METRIC } = require("../../util/constant");
+const ErrorBuilder = require("../../util/error");
+const { mappingConfig, ConfigCategory } = require("./config");
+ 
+/**
+ * converts to Unix timestamp (in microseconds)
+ * @param {*} timestamp
+ * @returns
+ */
+function msUnixTimestamp(timestamp) {
+  const currentTime = moment.unix(moment().format("X"));
+  const time = moment.unix(moment(timestamp).format("X"));
+ 
+  const timeDifferenceInHours = Math.ceil(
+    moment.duration(currentTime.diff(time)).asHours()
+  );
+  if (timeDifferenceInHours > 72) {
+    throw new CustomError(
+      "[GA4]:: Measurement protocol only supports timestamps [72h] into the past",
+      400
+    );
+  }
+ 
+  if (timeDifferenceInHours <= 0) {
+    Eif (Math.ceil(moment.duration(time.diff(currentTime)).asMinutes()) > 15) {
+      throw new CustomError(
+        "[GA4]:: Measurement protocol only supports timestamps [15m] into the future",
+        400
+      );
+    }
+  }
+ 
+  return time.toDate().getTime() * 1000 + time.toDate().getMilliseconds();
+}
+ 
+/**
+ * Reserved event names cannot be used
+ * Ref - https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag#reserved_names
+ * @param {*} event
+ * @returns
+ */
+function isReservedEventName(event) {
+  const reservedEventNames = [
+    "ad_activeview",
+    "ad_click",
+    "ad_exposure",
+    "ad_impression",
+    "ad_query",
+    "adunit_exposure",
+    "app_clear_data",
+    "app_install",
+    "app_update",
+    "app_remove",
+    "error",
+    "first_open",
+    "first_visit",
+    "in_app_purchase",
+    "notification_dismiss",
+    "notification_foreground",
+    "notification_open",
+    "notification_receive",
+    "os_update",
+    "screen_view",
+    "session_start",
+    "user_engagement"
+  ];
+ 
+  return reservedEventNames.includes(event.toLowerCase());
+}
+ 
+/* Event parameters */
+/**
+ * Reserved parameter names cannot be used
+ * Here user_properties is a duplicate key hence excluding it.
+ * Ref - https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag#reserved_parameter_names
+ */
+const GA4_RESERVED_PARAMETER_EXCLUSION = [
+  "firebase_conversion",
+  "user_properties"
+];
+ 
+/**
+ * event parameter names cannot start with reserved prefixes
+ * Ref - https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag#reserved_parameter_names
+ * @param {*} parameter
+ */
+function removeReservedParameterPrefixNames(parameter) {
+  const reservedPrefixesNames = ["google_", "ga_", "firebase_"];
+ 
+  if (!parameter) {
+    return;
+  }
+ 
+  Object.keys(parameter).forEach(key => {
+    const valFound = reservedPrefixesNames.some(prefix => {
+      if (key.toLowerCase().startsWith(prefix)) {
+        return true;
+      }
+      return false;
+    });
+ 
+    // reject if found
+    if (valFound) {
+      // eslint-disable-next-line no-param-reassign
+      delete parameter[key];
+    }
+  });
+}
+ 
+/* user property */
+/**
+ * Reserved user property cannot be used
+ * Ref - https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag#reserved_user_property_names
+ */
+const GA4_RESERVED_USER_PROPERTY_EXCLUSION = [
+  "first_open_time",
+  "first_visit_time",
+  "last_deep_link_referrer",
+  "user_id",
+  "first_open_after_install"
+];
+ 
+/**
+ * user property names cannot start with reserved prefixes
+ * Ref - https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag#reserved_user_property_names
+ * @param {*} userProperties
+ */
+function removeReservedUserPropertyPrefixNames(userProperties) {
+  const reservedPrefixesNames = ["google_", "ga_", "firebase_"];
+ 
+  if (!userProperties) {
+    return;
+  }
+ 
+  Object.keys(userProperties).forEach(key => {
+    const valFound = reservedPrefixesNames.some(prefix => {
+      if (key.toLowerCase().startsWith(prefix)) {
+        return true;
+      }
+      return false;
+    });
+ 
+    // reject if found
+    if (valFound) {
+      // eslint-disable-next-line no-param-reassign
+      delete userProperties[key];
+    }
+  });
+}
+ 
+/* For custom events */
+/**
+ * Reserved custom event names cannot be used (Web)
+ * Ref - https://support.google.com/analytics/answer/10085872#zippy=%2Creserved-prefixes-and-event-names%2Cweb
+ * @param {*} event
+ * @returns
+ */
+function isReservedWebCustomEventName(event) {
+  const reservedEventNames = [
+    "app_remove",
+    "app_store_refund",
+    "app_store_subscription_cancel",
+    "app_store_subscription_convert",
+    "app_store_subscription_renew",
+    "first_open",
+    "first_visit",
+    "in_app_purchase",
+    "session_start",
+    "user_engagement"
+  ];
+ 
+  return reservedEventNames.includes(event.toLowerCase());
+}
+ 
+/**
+ * Reserved custom event name cannot start with reserved prefixes (Web)
+ * Ref - https://support.google.com/analytics/answer/10085872#zippy=%2Creserved-prefixes-and-event-names%2Cweb
+ * @param {*} event
+ * @returns
+ */
+function isReservedWebCustomPrefixName(event) {
+  const reservedPrefixesNames = ["_", "firebase_", "ga_", "google_", "gtag."];
+ 
+  // As soon as a single true is returned, .some() will itself return true and stop
+  return reservedPrefixesNames.some(prefix => {
+    if (event.toLowerCase().startsWith(prefix)) {
+      return true;
+    }
+    return false;
+  });
+}
+ 
+const GA4_ITEM_EXCLUSION = [
+  "item_id",
+  "itemId",
+  "product_id",
+ 
+  "item_name",
+  "itemName",
+  "name",
+ 
+  "coupon",
+ 
+  "item_category",
+  "itemCategory",
+  "category",
+ 
+  "item_brand",
+  "itemBrand",
+  "brand",
+ 
+  "item_variant",
+  "itemVariant",
+  "variant",
+ 
+  "price",
+  "quantity",
+ 
+  "index",
+  "position"
+];
+ 
+/**
+ * get items properties for a event.
+ * @param {*} message
+ * @returns
+ */
+function getDestinationItemProperties(message, isItemsRequired) {
+  let items;
+  const products = get(message, "properties.products");
+  if ((!products && isItemsRequired) || (products && products.length === 0)) {
+    throw new CustomError(
+      `Products is an required field for '${message.event}' event`,
+      400
+    );
+  }
+  if (products && Array.isArray(products)) {
+    items = [];
+    products.forEach((item, index) => {
+      let element = constructPayload(
+        item,
+        mappingConfig[ConfigCategory.ITEMS.name]
+      );
+      if (
+        !isDefinedAndNotNull(element.item_id) &&
+        !isDefinedAndNotNull(element.item_name)
+      ) {
+        throw new CustomError("One of product_id or name is required", 400);
+      }
+ 
+      let itemProperties = {};
+      itemProperties = extractCustomFields(
+        message,
+        itemProperties,
+        [`properties.products.${index}`],
+        GA4_ITEM_EXCLUSION
+      );
+      Eif (!isEmptyObject(itemProperties)) {
+        itemProperties = flattenJson(itemProperties);
+        element = { ...element, ...itemProperties };
+      }
+ 
+      items.push(element);
+    });
+  } else if (products && !Array.isArray(products)) {
+    throw new CustomError("Invalid type. Expected Array of products", 400);
+  }
+  return items;
+}
+ 
+const responseHandler = (destinationResponse, dest) => {
+  const message = `[GA4 Response Handler] - Request Processed Successfully`;
+  let { status } = destinationResponse;
+  if (status === 204) {
+    status = 200;
+  }
+ 
+  // if the responsee from destination is not a success case build an explicit error
+  if (!isHttpStatusSuccess(status)) {
+    throw new ErrorBuilder()
+      .setStatus(status)
+      .setMessage(
+        `[GA4 Response Handler] Request failed for destination ${dest} with status: ${status}`
+      )
+      .isTransformResponseFailure(true)
+      .setDestinationResponse(destinationResponse)
+      .setStatTags({
+        destination: dest,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.RESPONSE_TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.SCOPE,
+        meta: getDynamicMeta(status)
+      })
+      .build();
+  }
+ 
+  return {
+    status,
+    message,
+    destinationResponse
+  };
+};
+ 
+const networkHandler = function() {
+  this.responseHandler = responseHandler;
+  this.proxy = proxyRequest;
+  this.processAxiosResponse = processAxiosResponse;
+};
+ 
+module.exports = {
+  networkHandler,
+  msUnixTimestamp,
+  isReservedEventName,
+  GA4_RESERVED_PARAMETER_EXCLUSION,
+  removeReservedParameterPrefixNames,
+  GA4_RESERVED_USER_PROPERTY_EXCLUSION,
+  removeReservedUserPropertyPrefixNames,
+  isReservedWebCustomEventName,
+  isReservedWebCustomPrefixName,
+  getDestinationItemProperties
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/config.js.html new file mode 100644 index 00000000000..24ebd5b2881 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/config.js.html @@ -0,0 +1,422 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/gainsight/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/gainsight config.js

+
+ +
+ 100% + Statements + 18/18 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +1151x +  +10x +4x +  +1x +7x +  +3x +  +  +2x +  +1x +  +1x +  +  +1x +  +  +  +  +1x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const getBaseEndpoint = domain => `https://${domain}/v1.0/api`;
+const getCompanyBaseEndpoint = domain => `https://${domain}/v1/data/objects`;
+ 
+const ENDPOINTS = {
+  identifyEndpoint: domain => `${getBaseEndpoint(domain)}/people`,
+ 
+  trackEndpoint: domain => `${getBaseEndpoint(domain)}/eventManager/event`,
+ 
+  groupSearchEndpoint: domain =>
+    `${getCompanyBaseEndpoint(domain)}/query/Company`,
+ 
+  groupCreateEndpoint: domain => `${getCompanyBaseEndpoint(domain)}/Company`,
+ 
+  groupUpdateEndpoint: domain => `${getCompanyBaseEndpoint(domain)}/Company`
+};
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { type: "identify", name: "GainsightIdentify" },
+  GROUP: { type: "group", name: "GainsightGroup" }
+};
+ 
+const getLookupPayload = name => {
+  return {
+    select: ["Name"],
+    where: {
+      conditions: [
+        {
+          name: "Name",
+          alias: "A",
+          value: [name],
+          operator: "EQ"
+        }
+      ],
+      expression: "A"
+    }
+  };
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+const IDENTIFY_EXCLUSION_KEYS = [
+  "ModifiedDate",
+  "CreatedDate",
+  "CreatedBy",
+  "ModifiedBy",
+  "Gsid",
+  "companies",
+  "name",
+  "firstName",
+  "first_name",
+  "firstname",
+  "lastName",
+  "last_name",
+  "lastname",
+  "middleName",
+  "middle_name",
+  "middlename",
+  "email",
+  "linkedinUrl",
+  "location",
+  "externalRecordId",
+  "emailOptOut",
+  "dynamicResolutionKey",
+  "timezone",
+  "comments",
+  "masterRecordID",
+  "masterAvatarTypeCode"
+];
+ 
+const GROUP_EXCLUSION_KEYS = [
+  "CreatedDate",
+  "CreatedBy",
+  "Csat",
+  "CurrentScore",
+  "Gsid",
+  "ModifiedBy",
+  "ModifiedDate",
+  "Nps",
+  "ScorecardId",
+  "CurrentScore",
+  "Trend",
+  "name",
+  "billingAddress",
+  "employees",
+  "arr",
+  "companyType",
+  "csm",
+  "customerLifetimeInMonths",
+  "industry",
+  "lifecycleInWeeks",
+  "managedAs",
+  "mrr",
+  "originalContractDate",
+  "parentCompany",
+  "companyType",
+  "renewalDate",
+  "stage",
+  "status",
+  "tags",
+  "tickerSymbol",
+  "users",
+  "sfdcAccountId"
+];
+ 
+module.exports = {
+  getLookupPayload,
+  ENDPOINTS,
+  IDENTIFY_EXCLUSION_KEYS,
+  GROUP_EXCLUSION_KEYS,
+  identifyMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY.name],
+  groupMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.GROUP.name]
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/index.html new file mode 100644 index 00000000000..b73fdee6510 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/gainsight + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/gainsight

+
+ +
+ 82.61% + Statements + 152/184 +
+ + +
+ 57.14% + Branches + 52/91 +
+ + +
+ 100% + Functions + 23/23 +
+ + +
+ 82.42% + Lines + 150/182 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%18/18100%0/0100%8/8100%16/16
transform.js +
+
90.2%92/10257.69%30/52100%6/690.2%92/102
util.js +
+
65.63%42/6456.41%22/39100%9/965.63%42/64
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/transform.js.html new file mode 100644 index 00000000000..140140479e8 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/transform.js.html @@ -0,0 +1,902 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/gainsight/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/gainsight transform.js

+
+ +
+ 90.2% + Statements + 92/102 +
+ + +
+ 57.69% + Branches + 30/52 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 90.2% + Lines + 92/102 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275  +1x +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +6x +  +  +  +  +6x +1x +  +  +5x +5x +  +5x +  +  +  +  +  +  +5x +5x +  +5x +1x +1x +1x +1x +  +  +  +1x +  +  +5x +5x +5x +5x +  +  +  +5x +5x +  +  +  +  +  +  +  +1x +2x +2x +2x +  +  +  +2x +2x +  +  +  +2x +  +2x +2x +  +2x +  +  +  +  +  +  +2x +2x +2x +  +  +2x +1x +  +1x +  +  +2x +  +  +  +  +  +2x +2x +2x +2x +  +  +  +2x +2x +  +  +  +  +  +  +  +  +1x +  +  +3x +3x +  +  +  +3x +  +  +  +  +  +3x +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +3x +  +  +  +  +  +  +3x +  +  +  +3x +2x +  +  +3x +3x +  +3x +3x +3x +3x +3x +  +  +  +  +  +  +3x +2x +  +  +3x +3x +  +3x +  +  +  +  +  +1x +11x +11x +  +  +  +  +  +11x +  +  +11x +  +6x +5x +  +2x +2x +  +3x +3x +  +  +  +10x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-nested-ternary */
+const set = require("set-value");
+const get = require("get-value");
+const { EventType } = require("../../../constants");
+const {
+  identifyMapping,
+  groupMapping,
+  IDENTIFY_EXCLUSION_KEYS,
+  GROUP_EXCLUSION_KEYS,
+  ENDPOINTS
+} = require("./config");
+const {
+  constructPayload,
+  defaultRequestConfig,
+  getValueFromMessage,
+  extractCustomFields,
+  defaultPutRequestConfig,
+  removeUndefinedAndNullValues,
+  defaultPostRequestConfig,
+  getHashFromArray,
+  getDestinationExternalID,
+  getSuccessRespEvents,
+  getErrorRespEvents
+} = require("../../util/index");
+const {
+  searchGroup,
+  createGroup,
+  updateGroup,
+  renameCustomFieldsFromMap,
+  getConfigOrThrowError,
+  CustomError
+} = require("./util");
+ 
+/**
+ * Person Object is created or updated. Upsert API makes PUT request for both cases
+ * https://support.gainsight.com/Gainsight_NXT/API_and_Developer_Docs/Person_API/Person_API_Documentation
+ */
+const identifyResponseBuilder = (message, { Config }) => {
+  const { accessKey } = getConfigOrThrowError(
+    Config,
+    ["accessKey"],
+    "identify"
+  );
+  if (!getValueFromMessage(message, ["traits.email", "context.traits.email"])) {
+    throw new CustomError("email is required for identify", 400);
+  }
+ 
+  let payload = constructPayload(message, identifyMapping);
+  const defaultKeys = Object.keys(payload);
+ 
+  payload = extractCustomFields(
+    message,
+    payload,
+    ["traits", "context.traits"],
+    IDENTIFY_EXCLUSION_KEYS
+  );
+ 
+  const personMap = getHashFromArray(Config.personMap, "from", "to", false);
+  payload = renameCustomFieldsFromMap(payload, personMap, defaultKeys);
+ 
+  if (!payload.Name) {
+    const fName = payload.FirstName;
+    const lName = payload.LastName;
+    const mName = payload.MiddleName;
+    const name = mName
+      ? `${fName || ""} ${mName} ${lName || ""}`
+      : `${fName || ""} ${lName || ""}`;
+ 
+    set(payload, "Name", name.trim());
+  }
+ 
+  const response = defaultRequestConfig();
+  response.method = defaultPutRequestConfig.requestMethod;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  response.headers = {
+    Accesskey: accessKey,
+    "Content-Type": "application/json"
+  };
+  response.endpoint = ENDPOINTS.identifyEndpoint(Config.domain);
+  return response;
+};
+ 
+/**
+ * Company object is created or updated and added to a
+ * Person Object.
+ * https://support.gainsight.com/Gainsight_NXT/API_and_Developer_Docs/Company_API/Company_API_Documentation
+ */
+const groupResponseBuilder = async (message, { Config }) => {
+  const { accessKey } = getConfigOrThrowError(Config, ["accessKey"], "group");
+  const groupName = getValueFromMessage(message, "traits.name");
+  Iif (!groupName) {
+    throw new CustomError("company name is required for group", 400);
+  }
+ 
+  const email = getValueFromMessage(message, "context.traits.email");
+  Iif (!email) {
+    throw new CustomError("user email is required for group", 400);
+  }
+ 
+  const resp = await searchGroup(groupName, Config);
+ 
+  let payload = constructPayload(message, groupMapping);
+  const defaultKeys = Object.keys(payload);
+ 
+  payload = extractCustomFields(
+    message,
+    payload,
+    ["traits"],
+    GROUP_EXCLUSION_KEYS
+  );
+ 
+  const companyMap = getHashFromArray(Config.companyMap, "from", "to", false);
+  payload = renameCustomFieldsFromMap(payload, companyMap, defaultKeys);
+  payload = removeUndefinedAndNullValues(payload);
+ 
+  let groupGsid;
+  if (resp.data.data.records.length === 0) {
+    groupGsid = await createGroup(payload, Config);
+  } else {
+    groupGsid = await updateGroup(payload, Config);
+  }
+ 
+  const responsePayload = {
+    Email: email,
+    companies: [{ Company_ID: groupGsid }]
+  };
+ 
+  // update person with the group (company)
+  const response = defaultRequestConfig();
+  response.method = defaultPutRequestConfig.requestMethod;
+  response.endpoint = ENDPOINTS.identifyEndpoint(Config.domain);
+  response.headers = {
+    Accesskey: accessKey,
+    "Content-Type": "application/json"
+  };
+  response.body.JSON = responsePayload;
+  return response;
+};
+ 
+/**
+ * Events with eventName and versions are created in Gainsight Dashboard
+ * under a particular Topic. The track call will send a payload to the
+ * mentioned eventName, eventVersion for the particular topicName.
+ * https://support.gainsight.com/Gainsight_NXT/Journey_Orchestrator_and_Email_Templates/Programs/Events_Framework#Event_API_Contract
+ */
+const trackResponseBuilder = (message, { Config }) => {
+  // TODO: extract contractId (optional field)
+ 
+  const event = getValueFromMessage(message, "event");
+  Iif (!event) {
+    throw new CustomError("event name is required for track", 400);
+  }
+ 
+  const config = getConfigOrThrowError(
+    Config,
+    ["sharedSecret", "topicName", "tenantId"],
+    "track"
+  );
+ 
+  const eventNameMap = getHashFromArray(
+    Config.eventNameMap,
+    "from",
+    "to",
+    false
+  );
+  Iif (!eventNameMap || !get(eventNameMap, event)) {
+    throw new CustomError(`Event name mapping not provided for ${event}`, 400);
+  }
+  const eventVersionMap = getHashFromArray(
+    Config.eventVersionMap,
+    "from",
+    "to",
+    false
+  );
+  Iif (!eventVersionMap || !get(eventVersionMap, event)) {
+    throw new CustomError(
+      `event version mapping not provided for ${event}`,
+      400
+    );
+  }
+ 
+  let contractId = getDestinationExternalID(
+    message,
+    "gainsightEventContractId"
+  );
+  if (!contractId) {
+    contractId = Config.contractId;
+  }
+ 
+  let payload = {};
+  payload = extractCustomFields(message, payload, ["properties"], []);
+ 
+  const response = defaultRequestConfig();
+  response.body.JSON = payload;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = ENDPOINTS.trackEndpoint(Config.domain);
+  response.headers = {
+    ...config,
+    "Content-Type": "application/json",
+    eventName: get(eventNameMap, event),
+    eventVersion: get(eventVersionMap, event)
+  };
+ 
+  if (contractId) {
+    set(response.headers, "contractId", contractId);
+  }
+  // can work without setting this as well
+  Eif (Config.accessKey) {
+    set(response.headers, "Accesskey", Config.accessKey);
+  }
+  return response;
+};
+ 
+/**
+ * Processing Single event
+ */
+const process = async event => {
+  const { message, destination } = event;
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const messageType = message.type.toLowerCase();
+ 
+  let response;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      response = identifyResponseBuilder(message, destination);
+      break;
+    case EventType.GROUP:
+      response = await groupResponseBuilder(message, destination);
+      break;
+    case EventType.TRACK:
+      response = trackResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`message type ${messageType} not supported`, 400);
+  }
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/util.js.html new file mode 100644 index 00000000000..1ab32c13906 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight/util.js.html @@ -0,0 +1,551 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/gainsight/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/gainsight util.js

+
+ +
+ 65.63% + Statements + 42/64 +
+ + +
+ 56.41% + Branches + 22/39 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 65.63% + Lines + 42/64 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +1581x +1x +1x +  +  +  +1x +1x +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +2x +  +  +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +7x +  +7x +5x +28x +28x +  +  +5x +  +  +2x +2x +16x +13x +3x +2x +  +1x +  +  +2x +  +  +1x +11x +11x +17x +  +  +17x +  +11x +  +  +1x +  +  +  +  +  +  +  + 
const axios = require("axios");
+const logger = require("../../../logger");
+const { ENDPOINTS, getLookupPayload } = require("./config");
+ 
+class CustomError extends Error {
+  constructor(message, statusCode) {
+    super(message);
+    this.response = { status: statusCode };
+  }
+}
+ 
+const searchGroup = async (groupName, Config) => {
+  let resp;
+  try {
+    resp = await axios.post(
+      `${ENDPOINTS.groupSearchEndpoint(Config.domain)}`,
+      getLookupPayload(groupName),
+      {
+        headers: {
+          Accesskey: Config.accessKey,
+          "Content-Type": "application/json"
+        }
+      }
+    );
+  } catch (error) {
+    let errMessage = "";
+    let errorStatus = 500;
+    if (error.response && error.response.data) {
+      errMessage = error.response.data.errorDesc;
+      errorStatus = error.response.status;
+    }
+    throw new CustomError(`failed to search group ${errMessage}`, errorStatus);
+  }
+ 
+  Iif (!resp || !resp.data || resp.status !== 200) {
+    throw new CustomError("failed to search group", 500);
+  }
+  return resp;
+};
+ 
+const createGroup = async (payload, Config) => {
+  let resp;
+  try {
+    resp = await axios.post(
+      `${ENDPOINTS.groupCreateEndpoint(Config.domain)}`,
+      {
+        records: [payload]
+      },
+      {
+        headers: {
+          Accesskey: Config.accessKey,
+          "Content-Type": "application/json"
+        }
+      }
+    );
+  } catch (error) {
+    let errMessage = "";
+    let errorStatus = 500;
+    if (error.response && error.response.data) {
+      errMessage = error.response.data.errorDesc;
+      errorStatus = error.response.status;
+    }
+    throw new CustomError(`failed to create group ${errMessage}`, errorStatus);
+  }
+ 
+  Iif (!resp || !resp.data || resp.status !== 200) {
+    throw new CustomError("failed to create group", 500);
+  }
+  return resp.data.data.records[0].Gsid;
+};
+ 
+const updateGroup = async (payload, Config) => {
+  let resp;
+  try {
+    resp = await axios.put(
+      `${ENDPOINTS.groupUpdateEndpoint(Config.domain)}`,
+      {
+        records: [payload]
+      },
+      {
+        headers: {
+          Accesskey: Config.accessKey,
+          "Content-Type": "application/json"
+        },
+        params: {
+          keys: "Name"
+        }
+      }
+    );
+  } catch (error) {
+    let errMessage = "";
+    let errorStatus = 500;
+    if (error.response && error.response.data) {
+      errMessage = error.response.data.errorDesc;
+      errorStatus = error.response.status;
+    }
+    throw new CustomError(`failed to update group ${errMessage}`, errorStatus);
+  }
+ 
+  Iif (!resp || !resp.data || resp.status !== 200) {
+    throw new CustomError("failed to update group", 500);
+  }
+  return resp.data.data.records[0].Gsid;
+};
+ 
+/**
+ * Provides Custom Field name mappping. If map is empty, only keeps
+ * the default keys and removes all other keys from payload.
+ * @param {*} payload
+ * @param {*} fieldsMap
+ * @param {*} exlusionKeys
+ * @returns
+ */
+const renameCustomFieldsFromMap = (payload, fieldsMap, exlusionKeys) => {
+  const mappedPayload = {};
+ 
+  if (!fieldsMap || Object.keys(fieldsMap).length === 0) {
+    Object.keys(payload).forEach(key => {
+      Eif (exlusionKeys.includes(key)) {
+        mappedPayload[key] = payload[key];
+      }
+    });
+    return mappedPayload;
+  }
+ 
+  const fieldMapKeys = Object.keys(fieldsMap);
+  Object.keys(payload).forEach(key => {
+    if (exlusionKeys.includes(key)) {
+      mappedPayload[key] = payload[key];
+    } else if (fieldMapKeys.includes(key)) {
+      mappedPayload[fieldsMap[key]] = payload[key];
+    } else {
+      logger.info(`dropping key ${key}`);
+    }
+  });
+  return mappedPayload;
+};
+ 
+const getConfigOrThrowError = (Config, requiredKeys, methodName) => {
+  const retObj = {};
+  requiredKeys.forEach(key => {
+    Iif (!Config[key]) {
+      throw new CustomError(`${key} is required for ${methodName}`, 500);
+    }
+    retObj[key] = Config[key];
+  });
+  return retObj;
+};
+ 
+module.exports = {
+  searchGroup,
+  createGroup,
+  updateGroup,
+  renameCustomFieldsFromMap,
+  getConfigOrThrowError,
+  CustomError
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/config.js.html new file mode 100644 index 00000000000..48deba71772 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/config.js.html @@ -0,0 +1,344 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/gainsight_px/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/gainsight_px config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +891x +  +1x +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_ENDPOINT = "https://api.aptrinsic.com/v1";
+const ENDPOINTS = {
+  USERS_ENDPOINT: `${BASE_ENDPOINT}/users`,
+  CUSTOM_EVENTS_ENDPOINT: `${BASE_ENDPOINT}/events/custom`,
+  ACCOUNTS_ENDPOINT: `${BASE_ENDPOINT}/accounts`
+};
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { type: "identify", name: "GainsightPX_Identify" },
+  TRACK: { type: "track", name: "GainsightPX_Track" },
+  GROUP: { type: "group", name: "GainsightPX_Group" }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+const USER_EXCLUSION_FIELDS = [
+  "email",
+  "firstName",
+  "lastName",
+  "gender",
+  "lastSeenDate",
+  "signUpDate",
+  "firstVisitDate",
+  "title",
+  "phone",
+  "score",
+  "role",
+  "subscriptionId",
+  "numberOfVisits",
+  "createDate",
+  "globalUnsubscribe",
+  "sfdcContactId",
+  "countryName",
+  "countryCode",
+  "stateName",
+  "stateCode",
+  "stateCode",
+  "city",
+  "street",
+  "postalCode",
+  "continent",
+  "regionName",
+  "timeZone",
+  "latitude",
+  "longitude"
+];
+ 
+const ACCOUNT_EXCLUSION_FIELDS = [
+  "name",
+  "trackedSubscriptionId",
+  "sfdcId",
+  "dunsNumber",
+  "industry",
+  "numberOfEmployees",
+  "sicCode",
+  "website",
+  "naicsCode",
+  "plan",
+  "numberOfUsers",
+  "parentGroupId",
+  "createDate",
+  "lastModifiedDate",
+  "lastSeenDate",
+  "countryName",
+  "countryCode",
+  "stateName",
+  "stateCode",
+  "stateCode",
+  "city",
+  "street",
+  "postalCode",
+  "continent",
+  "regionName",
+  "timeZone",
+  "latitude",
+  "longitude"
+];
+ 
+module.exports = {
+  ENDPOINTS,
+  USER_EXCLUSION_FIELDS,
+  ACCOUNT_EXCLUSION_FIELDS,
+  identifyMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY.name],
+  trackMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK.name],
+  groupMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.GROUP.name]
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/index.html new file mode 100644 index 00000000000..b99a2556838 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/gainsight_px + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/gainsight_px

+
+ +
+ 86.31% + Statements + 145/168 +
+ + +
+ 65.82% + Branches + 52/79 +
+ + +
+ 92.86% + Functions + 13/14 +
+ + +
+ 86.31% + Lines + 145/168 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%0/0100%8/8
transform.js +
+
87.85%94/10765.38%34/52100%6/687.85%94/107
util.js +
+
81.13%43/5366.67%18/2787.5%7/881.13%43/53
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/transform.js.html new file mode 100644 index 00000000000..9bec4798d66 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/transform.js.html @@ -0,0 +1,995 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/gainsight_px/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/gainsight_px transform.js

+
+ +
+ 87.85% + Statements + 94/107 +
+ + +
+ 65.38% + Branches + 34/52 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 87.85% + Lines + 94/107 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +1x +4x +4x +1x +  +  +  +  +  +3x +3x +  +  +  +  +3x +  +3x +3x +  +  +  +3x +1x +1x +1x +  +3x +3x +  +  +  +  +  +  +3x +  +  +  +  +  +3x +3x +  +  +  +  +  +  +3x +  +2x +2x +2x +2x +  +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +1x +3x +3x +  +  +  +3x +  +  +  +  +3x +1x +  +  +2x +2x +1x +  +  +1x +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +1x +  +1x +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +1x +1x +  +  +1x +  +  +  +  +  +  +  +1x +6x +  +  +5x +  +5x +3x +  +  +  +  +  +  +  +5x +2x +  +  +5x +  +  +  +  +  +  +  +5x +5x +5x +5x +  +  +  +5x +5x +  +  +  +  +  +1x +13x +13x +  +  +  +  +  +  +13x +13x +  +  +  +13x +  +  +  +13x +  +  +13x +  +4x +3x +  +6x +5x +  +3x +1x +  +  +  +9x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-nested-ternary */
+const { EventType } = require("../../../constants");
+const {
+  isEmptyObject,
+  constructPayload,
+  defaultRequestConfig,
+  extractCustomFields,
+  defaultPutRequestConfig,
+  removeUndefinedAndNullValues,
+  defaultPostRequestConfig,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  getHashFromArray,
+  getFieldValueFromMessage,
+  getValueFromMessage,
+  CustomError
+} = require("../../util");
+const {
+  renameCustomFields,
+  objectExists,
+  createAccount,
+  updateAccount,
+  formatEventProps
+} = require("./util");
+const {
+  ENDPOINTS,
+  USER_EXCLUSION_FIELDS,
+  ACCOUNT_EXCLUSION_FIELDS,
+  trackMapping,
+  groupMapping,
+  identifyMapping
+} = require("./config");
+ 
+/**
+ * Create/Update a User with user attributes
+ */
+const identifyResponseBuilder = async (message, { Config }) => {
+  const userId = getFieldValueFromMessage(message, "userId");
+  if (!userId) {
+    throw new CustomError(
+      "userId or anonymousId is required for identify",
+      400
+    );
+  }
+ 
+  const response = defaultRequestConfig();
+  response.headers = {
+    "X-APTRINSIC-API-KEY": Config.apiKey,
+    "Content-Type": "application/json"
+  };
+ 
+  const { success: isPresent } = await objectExists(userId, Config, "user");
+ 
+  let payload = constructPayload(message, identifyMapping);
+  const name = getValueFromMessage(message, [
+    "traits.name",
+    "context.traits.name"
+  ]);
+  if (name && typeof name === "string") {
+    const [fName, lName] = name.split(" ");
+    payload.firstName = fName;
+    payload.lastName = lName;
+  }
+  let customAttributes = {};
+  customAttributes = extractCustomFields(
+    message,
+    customAttributes,
+    ["traits", "context.traits"],
+    USER_EXCLUSION_FIELDS
+  );
+ 
+  const userCustomFieldsMap = getHashFromArray(
+    Config.userAttributeMap,
+    "from",
+    "to",
+    false
+  );
+  customAttributes = renameCustomFields(customAttributes, userCustomFieldsMap);
+  payload = {
+    ...payload,
+    customAttributes,
+    propertyKeys: [Config.productTagKey],
+    type: "USER"
+  };
+ 
+  if (isPresent) {
+    // update user
+    response.method = defaultPutRequestConfig.requestMethod;
+    response.endpoint = `${ENDPOINTS.USERS_ENDPOINT}/${userId}`;
+    response.body.JSON = removeUndefinedAndNullValues(payload);
+    return response;
+  }
+ 
+  // create new user
+  payload.identifyId = userId;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = ENDPOINTS.USERS_ENDPOINT;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  return response;
+};
+ 
+/**
+ * Associates a User with an Account.
+ */
+const groupResponseBuilder = async (message, { Config }) => {
+  const userId = getFieldValueFromMessage(message, "userId");
+  Iif (!userId) {
+    throw new CustomError("userId or anonymousId is required for group", 400);
+  }
+ 
+  const { success: isPresent, err: e } = await objectExists(
+    userId,
+    Config,
+    "user"
+  );
+  if (!isPresent) {
+    throw new CustomError(`aborting group call: ${e}`, 400);
+  }
+ 
+  const groupId = getFieldValueFromMessage(message, "groupId");
+  if (!groupId) {
+    throw new CustomError("groupId is required for group", 400);
+  }
+ 
+  const { success: accountIsPresent } = await objectExists(
+    groupId,
+    Config,
+    "account"
+  );
+ 
+  let payload = constructPayload(message, groupMapping);
+  let customAttributes = {};
+  customAttributes = extractCustomFields(
+    message,
+    customAttributes,
+    ["traits"],
+    ACCOUNT_EXCLUSION_FIELDS
+  );
+ 
+  const accountFieldsMap = getHashFromArray(
+    Config.accountAttributeMap,
+    "from",
+    "to",
+    false
+  );
+  customAttributes = renameCustomFields(customAttributes, accountFieldsMap);
+  payload = {
+    ...payload,
+    customAttributes: !isEmptyObject(customAttributes)
+      ? customAttributes
+      : null,
+    propertyKeys: [Config.productTagKey]
+  };
+  payload = removeUndefinedAndNullValues(payload);
+ 
+  Eif (accountIsPresent) {
+    // update account
+    const { success: updateSuccess, err } = await updateAccount(
+      groupId,
+      payload,
+      Config
+    );
+    Iif (!updateSuccess) {
+      throw new CustomError(`failed to update account for group: ${err}`, 400);
+    }
+  } else {
+    // create account
+    payload.id = groupId;
+    const { success: createSuccess, err } = await createAccount(
+      payload,
+      Config
+    );
+    if (!createSuccess) {
+      throw new CustomError(`failed to create account for group: ${err}`, 400);
+    }
+  }
+ 
+  // add accountId to user object
+  const response = defaultRequestConfig();
+  response.method = defaultPutRequestConfig.requestMethod;
+  response.headers = {
+    "X-APTRINSIC-API-KEY": Config.apiKey,
+    "Content-Type": "application/json"
+  };
+  response.endpoint = `${ENDPOINTS.USERS_ENDPOINT}/${userId}`;
+  response.body.JSON = {
+    accountId: groupId
+  };
+  return response;
+};
+ 
+/**
+ * Creates Custom Events
+ * API Ref:
+ * https://gainsightpx.docs.apiary.io/#reference/custom-events/v1eventscustom/create-custom-event
+ */
+const trackResponseBuilder = (message, { Config }) => {
+  let payload = constructPayload(message, trackMapping);
+ 
+  // Global Context in payload overrides the one from Web app
+  let globalContext = getValueFromMessage(message, "properties.globalContext");
+ 
+  if (!globalContext || isEmptyObject(globalContext)) {
+    globalContext = getHashFromArray(
+      Config.globalContextMap,
+      "from",
+      "to",
+      false
+    );
+  }
+ 
+  if (payload.attributes && payload.attributes.globalContext) {
+    delete payload.attributes.globalContext;
+  }
+ 
+  payload = {
+    ...payload,
+    attributes: formatEventProps(payload.attributes),
+    propertyKey: Config.productTagKey,
+    userType: "USER",
+    globalContext: !isEmptyObject(globalContext) ? globalContext : null
+  };
+ 
+  const response = defaultRequestConfig();
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  response.headers = {
+    "X-APTRINSIC-API-KEY": Config.apiKey,
+    "Content-Type": "application/json"
+  };
+  response.endpoint = ENDPOINTS.CUSTOM_EVENTS_ENDPOINT;
+  return response;
+};
+ 
+/**
+ * Processing Single event
+ */
+const process = async event => {
+  const { message, destination } = event;
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  const { apiKey, productTagKey } = destination.Config;
+  Iif (!apiKey) {
+    throw new CustomError("Invalid API Key. Aborting message.", 400);
+  }
+ 
+  Iif (!productTagKey) {
+    throw new CustomError("product tag key is required", 400);
+  }
+ 
+  const messageType = message.type.toLowerCase();
+ 
+  let response;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      response = await identifyResponseBuilder(message, destination);
+      break;
+    case EventType.TRACK:
+      response = trackResponseBuilder(message, destination);
+      break;
+    case EventType.GROUP:
+      response = await groupResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`message type ${messageType} not supported`, 400);
+  }
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/util.js.html new file mode 100644 index 00000000000..5d7a0d6522f --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/gainsight_px/util.js.html @@ -0,0 +1,524 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/gainsight_px/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/gainsight_px util.js

+
+ +
+ 81.13% + Statements + 43/53 +
+ + +
+ 66.67% + Branches + 18/27 +
+ + +
+ 87.5% + Functions + 7/8 +
+ + +
+ 81.13% + Lines + 43/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +1491x +1x +1x +  +1x +  +  +  +  +  +2x +2x +  +2x +2x +  +  +  +2x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +1x +7x +7x +  +7x +1x +1x +  +  +  +7x +7x +  +  +  +  +  +5x +5x +  +  +  +2x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +4x +4x +4x +6x +3x +  +  +4x +  +  +  +  +  +  +  +  +1x +5x +5x +24x +7x +  +17x +  +  +5x +  +  +1x +  +  +  +  +  +  +  + 
const axios = require("axios");
+const { ENDPOINTS } = require("./config");
+const { CustomError } = require("../../util");
+ 
+const handleErrorResponse = (
+  error,
+  customErrMessage,
+  expectedErrStatus,
+  defaultStatus = 400
+) => {
+  let errMessage = "";
+  let errorStatus = defaultStatus;
+ 
+  Eif (error.response && error.response.data) {
+    errMessage = error.response.data.externalapierror
+      ? JSON.stringify(error.response.data.externalapierror)
+      : JSON.stringify(error.response.data);
+ 
+    errorStatus = error.response.status;
+ 
+    Eif (error.response.status === expectedErrStatus) {
+      return { success: false, err: errMessage };
+    }
+  }
+  throw new CustomError(`${customErrMessage}: ${errMessage}`, errorStatus);
+};
+ 
+/**
+ * Checks if user or account exists
+ * @param {*} id
+ * @param {*} Config
+ * @param {*} objectType
+ * @returns
+ */
+const objectExists = async (id, Config, objectType) => {
+  let url = `${ENDPOINTS.USERS_ENDPOINT}/${id}`;
+  let err = "invalid response while searching user";
+ 
+  if (objectType === "account") {
+    url = `${ENDPOINTS.ACCOUNTS_ENDPOINT}/${id}`;
+    err = "invalid response while searching account";
+  }
+ 
+  let response;
+  try {
+    response = await axios.get(url, {
+      headers: {
+        "X-APTRINSIC-API-KEY": Config.apiKey,
+        "Content-Type": "application/json"
+      }
+    });
+    Eif (response && response.status === 200) {
+      return { success: true, err: null };
+    }
+    throw new Error(err);
+  } catch (error) {
+    return handleErrorResponse(
+      error,
+      `error while fetching ${objectType}`,
+      404
+    );
+  }
+};
+ 
+const createAccount = async (payload, Config) => {
+  let response;
+  try {
+    response = await axios.post(ENDPOINTS.ACCOUNTS_ENDPOINT, payload, {
+      headers: {
+        "X-APTRINSIC-API-KEY": Config.apiKey,
+        "Content-Type": "application/json"
+      }
+    });
+    if (response && response.status === 201) {
+      return { success: true, err: null };
+    }
+    throw new Error("invalid response while creating account");
+  } catch (error) {
+    return handleErrorResponse(error, "error while creating account", 400);
+  }
+};
+ 
+const updateAccount = async (accountId, payload, Config) => {
+  let response;
+  try {
+    response = await axios.put(
+      `${ENDPOINTS.ACCOUNTS_ENDPOINT}/${accountId}`,
+      payload,
+      {
+        headers: {
+          "X-APTRINSIC-API-KEY": Config.apiKey,
+          "Content-Type": "application/json"
+        }
+      }
+    );
+    Eif (response && response.status === 204) {
+      return { success: true, err: null };
+    }
+    throw new Error("invalid response while updating account");
+  } catch (error) {
+    return handleErrorResponse(error, "error while updating account", 400);
+  }
+};
+ 
+/**
+ * Performs key mapping for Custom Attributes Object.
+ * Keys for which mapping is not provided in webapp are dropped.
+ * @param {*} payload
+ * @param {*} userCustomFieldsMap
+ * @returns
+ */
+const renameCustomFields = (payload, userCustomFieldsMap) => {
+  const renamedPayload = {};
+  const mapKeys = Object.keys(userCustomFieldsMap);
+  Object.keys(payload).forEach(key => {
+    if (mapKeys.includes(key)) {
+      renamedPayload[userCustomFieldsMap[key]] = payload[key];
+    }
+  });
+  return renamedPayload;
+};
+ 
+/**
+ * Util to stringify object present as value
+ * for any key in event properties
+ * @param {*} props
+ * @returns
+ */
+const formatEventProps = props => {
+  const formattedObj = {};
+  Object.keys(props).forEach(key => {
+    if (typeof props[key] === "object") {
+      formattedObj[key] = JSON.stringify(props[key]);
+    } else {
+      formattedObj[key] = props[key];
+    }
+  });
+  return formattedObj;
+};
+ 
+module.exports = {
+  CustomError,
+  renameCustomFields,
+  createAccount,
+  updateAccount,
+  objectExists,
+  formatEventProps
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/config.js.html new file mode 100644 index 00000000000..f70375bcfcf --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/config.js.html @@ -0,0 +1,158 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/google_adwords_enhanced_conversions config.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +  +1x +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +  +  +  +1x +1x +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_ENDPOINT = "https://googleads.googleapis.com/v10/customers";
+ 
+const CONFIG_CATEGORIES = {
+  TRACK_CONFIG: { type: "track", name: "trackConfig" }
+};
+ 
+const CONVERSION_ACTION_ID_CACHE_TTL = process.env
+  .CONVERSION_ACTION_ID_CACHE_TTL
+  ? parseInt(process.env.CONVERSION_ACTION_ID_CACHE_TTL, 10)
+  : 24 * 60 * 60;
+const hashAttributes = [
+  "email",
+  "phone",
+  "firstName",
+  "lastName",
+  "streetAddress"
+];
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+module.exports = {
+  trackMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK_CONFIG.name],
+  BASE_ENDPOINT,
+  hashAttributes,
+  CONVERSION_ACTION_ID_CACHE_TTL
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/index.html new file mode 100644 index 00000000000..cf1ce0e6623 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/google_adwords_enhanced_conversions + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/google_adwords_enhanced_conversions

+
+ +
+ 95.35% + Statements + 82/86 +
+ + +
+ 78.05% + Branches + 32/41 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 95.24% + Lines + 80/84 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%7/750%1/2100%0/0100%7/7
transform.js +
+
94.94%75/7979.49%31/39100%11/1194.81%73/77
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/transform.js.html new file mode 100644 index 00000000000..4e335db10b4 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/transform.js.html @@ -0,0 +1,668 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/google_adwords_enhanced_conversions/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/google_adwords_enhanced_conversions transform.js

+
+ +
+ 94.94% + Statements + 75/79 +
+ + +
+ 79.49% + Branches + 31/39 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 94.81% + Lines + 73/77 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197  +  +1x +1x +  +  +  +  +  +  +  +1x +1x +  +1x +  +  +  +  +  +  +  +1x +2x +2x +32x +28x +10x +  +  +32x +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +7x +7x +1x +  +  +  +  +6x +  +  +1x +7x +7x +7x +7x +7x +7x +6x +  +  +  +  +6x +6x +6x +5x +5x +  +1x +  +  +  +  +  +5x +  +  +1x +11x +11x +11x +11x +16x +9x +  +11x +2x +  +  +  +  +  +  +9x +9x +  +9x +2x +  +  +  +9x +9x +  +1x +  +  +  +  +  +  +  +8x +8x +1x +  +  +  +  +  +  +7x +  +7x +7x +12x +  +  +7x +  +  +1x +13x +13x +  +  +  +  +  +  +  +13x +2x +  +  +  +  +  +  +11x +  +  +  +1x +13x +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-param-reassign */
+ 
+const get = require("get-value");
+const { cloneDeep } = require("lodash");
+const {
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  constructPayload,
+  defaultRequestConfig,
+  getValueFromMessage,
+  removeHyphens
+} = require("../../util");
+const ErrorBuilder = require("../../util/error");
+ 
+const { trackMapping, BASE_ENDPOINT } = require("./config");
+ 
+/**
+ * This function is helping to update the mappingJson.
+ * It is removing the metadata field with type "hashToSha256"
+ * @param {} mapping -> it is the configMapping.json
+ * @returns
+ */
+const updateMappingJson = mapping => {
+  const newMapping = [];
+  mapping.forEach(element => {
+    if (get(element, "metadata.type")) {
+      if (element.metadata.type === "hashToSha256") {
+        element.metadata.type = "toString";
+      }
+    }
+    newMapping.push(element);
+  });
+  return newMapping;
+};
+ 
+/**
+ * Get access token to be bound to the event req headers
+ *
+ * Note:
+ * This method needs to be implemented particular to the destination
+ * As the schema that we'd get in `metadata.secret` can be different
+ * for different destinations
+ *
+ * @param {Object} metadata
+ * @returns
+ */
+const getAccessToken = metadata => {
+  // OAuth for this destination
+  const { secret } = metadata;
+  if (!secret) {
+    throw new ErrorBuilder()
+      .setMessage("Empty/Invalid access token")
+      .setStatus(500)
+      .build();
+  }
+  return secret.access_token;
+};
+ 
+const responseBuilder = async (metadata, message, { Config }, payload) => {
+  const response = defaultRequestConfig();
+  const { event } = message;
+  const filteredCustomerId = removeHyphens(Config.customerId);
+  response.endpoint = `${BASE_ENDPOINT}/${filteredCustomerId}:uploadConversionAdjustments`;
+  response.body.JSON = payload;
+  const accessToken = getAccessToken(metadata);
+  response.headers = {
+    Authorization: `Bearer ${accessToken}`,
+    "Content-Type": "application/json",
+    "developer-token": getValueFromMessage(metadata, "secret.developer_token")
+  };
+  response.params = { event, customerId: filteredCustomerId };
+  Eif (Config.subAccount)
+    if (Config.loginCustomerId) {
+      const filteredLoginCustomerId = removeHyphens(Config.loginCustomerId);
+      response.headers["login-customer-id"] = filteredLoginCustomerId;
+    } else
+      throw new ErrorBuilder()
+        .setMessage(
+          `[Google_adwords_enhanced_conversions]:: loginCustomerId is required as subAccount is true.`
+        )
+        .setStatus(400)
+        .build();
+  return response;
+};
+ 
+const processTrackEvent = async (metadata, message, destination) => {
+  let flag = 0;
+  const { Config } = destination;
+  const { event } = message;
+  const { listOfConversions } = Config;
+  if (listOfConversions.some(i => i.conversions === event)) {
+    flag = 1;
+  }
+  if (event === undefined || event === "" || flag === 0) {
+    throw new ErrorBuilder()
+      .setMessage(
+        `[Google_adwords_enhanced_conversions]:: Conversion named ${event} is not exist in rudderstack dashboard`
+      )
+      .setStatus(400)
+      .build();
+  }
+  const { requireHash } = destination.Config;
+  let updatedMapping = cloneDeep(trackMapping);
+ 
+  if (requireHash === false) {
+    updatedMapping = updateMappingJson(updatedMapping);
+  }
+ 
+  let payload;
+  try {
+    payload = constructPayload(message, updatedMapping);
+  } catch (e) {
+    throw new ErrorBuilder()
+      .setMessage(
+        `[Google_adwords_enhanced_conversions]::${e.message} for ${event} event.`
+      )
+      .setStatus(400)
+      .build();
+  }
+ 
+  payload.partialFailure = true;
+  if (!payload.conversionAdjustments[0].userIdentifiers) {
+    throw new ErrorBuilder()
+      .setMessage(
+        `[Google_adwords_enhanced_conversions]:: Any of email, phone, firstName, lastName, city, street, countryCode, postalCode or streetAddress is required in traits.`
+      )
+      .setStatus(400)
+      .build();
+  }
+  payload.conversionAdjustments[0].adjustmentType = "ENHANCEMENT";
+  // Removing the null values from userIdentifier
+  const arr = payload.conversionAdjustments[0].userIdentifiers;
+  payload.conversionAdjustments[0].userIdentifiers = arr.filter(item => {
+    Eif (item) return true;
+    return false;
+  });
+  return responseBuilder(metadata, message, destination, payload);
+};
+ 
+const processEvent = async (metadata, message, destination) => {
+  const { type } = message;
+  Iif (!type) {
+    throw new ErrorBuilder()
+      .setMessage(
+        "[Google_adwords_enhanced_conversions]::Invalid payload. Message Type is not present"
+      )
+      .setStatus(400)
+      .build();
+  }
+  if (type.toLowerCase() !== "track") {
+    throw new ErrorBuilder()
+      .setMessage(
+        `[Google_adwords_enhanced_conversions]::Message Type ${type} is not supported. Aborting message.`
+      )
+      .setStatus(400)
+      .build();
+  } else {
+    return processTrackEvent(metadata, message, destination);
+  }
+};
+ 
+const process = async event => {
+  return processEvent(event.metadata, event.message, event.destination);
+};
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          // eslint-disable-next-line no-nested-ternary
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : error.status || 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_remarketing_lists/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_remarketing_lists/config.js.html new file mode 100644 index 00000000000..34e8172361f --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_remarketing_lists/config.js.html @@ -0,0 +1,158 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/google_adwords_remarketing_lists/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/google_adwords_remarketing_lists config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +  +1x +1x +  +  +  +1x +  +  +  +1x +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_ENDPOINT = "https://googleads.googleapis.com/v10/customers";
+const CONFIG_CATEGORIES = {
+  AUDIENCE_LIST: { type: "audienceList", name: "offlineDataJobs" },
+  ADDRESSINFO: { type: "addressInfo", name: "addressInfo" }
+};
+const attributeMapping = {
+  email: "hashedEmail",
+  phone: "hashedPhoneNumber"
+};
+const hashAttributes = ["email", "phone", "firstName", "lastName"];
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+const TYPEOFLIST = Object.freeze({
+  userID: "thirdPartyUserId",
+  mobileDeviceID: "mobileId"
+});
+ 
+module.exports = {
+  BASE_ENDPOINT,
+  TYPEOFLIST,
+  attributeMapping,
+  hashAttributes,
+  offlineDataJobsMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.AUDIENCE_LIST.name],
+  addressInfoMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.ADDRESSINFO.name]
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_remarketing_lists/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_remarketing_lists/index.html new file mode 100644 index 00000000000..3a26bb743c8 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_remarketing_lists/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/google_adwords_remarketing_lists + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/google_adwords_remarketing_lists

+
+ +
+ 95.76% + Statements + 113/118 +
+ + +
+ 72.73% + Branches + 40/55 +
+ + +
+ 100% + Functions + 16/16 +
+ + +
+ 95.76% + Lines + 113/118 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%0/0100%8/8
transform.js +
+
95.45%105/11072.73%40/55100%16/1695.45%105/110
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_remarketing_lists/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_remarketing_lists/transform.js.html new file mode 100644 index 00000000000..9235037bce4 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/google_adwords_remarketing_lists/transform.js.html @@ -0,0 +1,998 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/google_adwords_remarketing_lists/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/google_adwords_remarketing_lists transform.js

+
+ +
+ 95.45% + Statements + 105/110 +
+ + +
+ 72.73% + Branches + 40/55 +
+ + +
+ 100% + Functions + 16/16 +
+ + +
+ 95.45% + Lines + 105/110 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +3071x +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +1x +  +1x +365x +2193x +  +1451x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +23x +23x +1x +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +1x +23x +23x +23x +23x +23x +23x +22x +22x +  +  +  +  +22x +2x +1x +1x +  +1x +  +  +  +  +  +21x +  +  +  +  +  +  +  +  +  +  +1x +25x +25x +25x +  +25x +6x +  +19x +  +25x +  +25x +365x +365x +  +  +365x +9x +4x +  +5x +  +  +356x +1068x +356x +  +356x +356x +712x +705x +  +  +  +  +  +7x +  +  +  +  +  +  +  +  +25x +  +  +  +  +  +  +  +  +  +  +  +  +1x +20x +20x +  +20x +20x +20x +26x +25x +  +  +  +25x +2x +  +  +2x +  +  +23x +23x +  +23x +  +  +  +  +23x +  +  +15x +42x +  +  +42x +42x +  +15x +15x +  +  +8x +26x +  +  +26x +26x +  +8x +8x +  +  +  +1x +  +  +  +  +  +20x +  +  +1x +22x +22x +1x +  +  +  +  +  +  +21x +  +  +  +  +  +  +  +21x +1x +  +  +  +  +  +  +20x +20x +  +20x +3x +  +  +  +  +  +  +  +17x +23x +  +15x +  +  +  +  +  +  +  +  +  +  +1x +22x +  +1x +1x +  +  +  +  +1x +  +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const sha256 = require("sha256");
+const logger = require("../../../logger");
+const {
+  isDefinedAndNotNullAndNotEmpty,
+  returnArrayOfSubarrays,
+  constructPayload,
+  defaultRequestConfig,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  getValueFromMessage,
+  removeUndefinedAndNullValues,
+  removeHyphens
+} = require("../../util");
+const ErrorBuilder = require("../../util/error");
+const {
+  offlineDataJobsMapping,
+  addressInfoMapping,
+  BASE_ENDPOINT,
+  attributeMapping,
+  hashAttributes,
+  TYPEOFLIST
+} = require("./config");
+ 
+const hashEncrypt = object => {
+  Object.keys(object).forEach(key => {
+    if (hashAttributes.includes(key) && object[key]) {
+      // eslint-disable-next-line no-param-reassign
+      object[key] = sha256(object[key]);
+    }
+  });
+};
+ 
+/**
+ * Get access token to be bound to the event req headers
+ *
+ * Note:
+ * This method needs to be implemented particular to the destination
+ * As the schema that we'd get in `metadata.secret` can be different
+ * for different destinations
+ *
+ * @param {Object} metadata
+ * @returns
+ */
+const getAccessToken = metadata => {
+  // OAuth for this destination
+  const { secret } = metadata;
+  if (!secret) {
+    throw new ErrorBuilder()
+      .setStatus(500)
+      .setMessage("Empty/Invalid access token")
+      .build();
+  }
+  return secret.access_token;
+};
+ 
+/**
+ * This function is used for building the response. It create a default rudder response
+ * and populate headers, params and body.JSON
+ * @param {*} metadata
+ * @param {*} body
+ * @param {*} param2
+ * @returns
+ */
+const responseBuilder = (metadata, body, { Config }) => {
+  const payload = body;
+  const response = defaultRequestConfig();
+  const filteredCustomerId = removeHyphens(Config.customerId);
+  response.endpoint = `${BASE_ENDPOINT}/${filteredCustomerId}/offlineUserDataJobs`;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  const accessToken = getAccessToken(metadata);
+  response.params = { listId: Config.listId, customerId: filteredCustomerId };
+  response.headers = {
+    Authorization: `Bearer ${accessToken}`,
+    "Content-Type": "application/json",
+    "developer-token": getValueFromMessage(metadata, "secret.developer_token")
+  };
+  if (Config.subAccount)
+    if (Config.loginCustomerId) {
+      const filteredLoginCustomerId = removeHyphens(Config.loginCustomerId);
+      response.headers["login-customer-id"] = filteredLoginCustomerId;
+    } else
+      throw new ErrorBuilder()
+        .setMessage(
+          `[Google_adwords_remarketing_list]:: loginCustomerId is required as subAccount is true.`
+        )
+        .setStatus(400)
+        .build();
+  return response;
+};
+/**
+ * This function helps creates an array with proper mapping for userIdentiFier.
+ * Logics: Here we are creating an array with all the attributes provided in the add/remove array
+ * inside listData.
+ * @param {rudder event message properties listData add} attributeArray
+ * @param {rudder event destination} Config
+ * @returns
+ */
+ 
+const populateIdentifiers = (attributeArray, { Config }) => {
+  const userIdentifier = [];
+  const { typeOfList } = Config;
+  const { isHashRequired } = Config;
+  let attribute;
+  if (TYPEOFLIST[typeOfList]) {
+    attribute = TYPEOFLIST[typeOfList];
+  } else {
+    attribute = Config.userSchema;
+  }
+  Eif (isDefinedAndNotNullAndNotEmpty(attributeArray)) {
+    // traversing through every element in the add array
+    attributeArray.forEach((element, index) => {
+      Eif (isHashRequired) {
+        hashEncrypt(element);
+      }
+      // checking if the attribute is an array or not for generic type list
+      if (!Array.isArray(attribute)) {
+        if (element[attribute]) {
+          userIdentifier.push({ [attribute]: element[attribute] });
+        } else {
+          logger.info(` ${attribute} is not present in index:`, index);
+        }
+      } else {
+        attribute.forEach((attributeElement, index2) => {
+          if (attributeElement === "addressInfo") {
+            const addressInfo = constructPayload(element, addressInfoMapping);
+            // checking if addressInfo object is empty or not.
+            Eif (isDefinedAndNotNullAndNotEmpty(addressInfo))
+              userIdentifier.push({ addressInfo });
+          } else if (element[`${attributeElement}`]) {
+            userIdentifier.push({
+              [`${attributeMapping[attributeElement]}`]: element[
+                `${attributeElement}`
+              ]
+            });
+          } else {
+            logger.info(
+              ` ${attribute[index2]} is not present in index:`,
+              index
+            );
+          }
+        });
+      }
+    });
+  }
+  return userIdentifier;
+};
+/**
+ * This function helps to create different operations by breaking the
+ * userIdentiFier Array in chunks of 20.
+ * Logics: Here for add/remove type lists, we are creating create/remove operations by
+ * breaking the userIdentiFier array in chunks of 20 and putting them inside one
+ * create/remove object each chunk.
+ * @param {rudder event message} message
+ * @param {rudder event destination} destination
+ * @returns
+ */
+ 
+const createPayload = (message, destination) => {
+  const { listData } = message.properties;
+  const properties = ["add", "remove"];
+ 
+  let outputPayloads = {};
+  const typeOfOperation = Object.keys(listData);
+  typeOfOperation.forEach(key => {
+    if (properties.includes(key)) {
+      const userIdentifiersList = populateIdentifiers(
+        listData[key],
+        destination
+      );
+      if (userIdentifiersList.length === 0) {
+        logger.info(
+          `Google_adwords_remarketing_list]:: No attributes are present in the '${key}' property.`
+        );
+        return;
+      }
+ 
+      const outputPayload = constructPayload(message, offlineDataJobsMapping);
+      outputPayload.operations = [];
+      // breaking the userIdentiFier array in chunks of 20
+      const userIdentifierChunks = returnArrayOfSubarrays(
+        userIdentifiersList,
+        20
+      );
+      // putting each chunk in different create/remove operations
+      switch (key) {
+        case "add":
+          // for add operation
+          userIdentifierChunks.forEach(element => {
+            const operations = {
+              create: {}
+            };
+            operations.create.userIdentifiers = element;
+            outputPayload.operations.push(operations);
+          });
+          outputPayloads = { ...outputPayloads, create: outputPayload };
+          break;
+        case "remove":
+          // for remove operation
+          userIdentifierChunks.forEach(element => {
+            const operations = {
+              remove: {}
+            };
+            operations.remove.userIdentifiers = element;
+            outputPayload.operations.push(operations);
+          });
+          outputPayloads = { ...outputPayloads, remove: outputPayload };
+          break;
+        default:
+      }
+    } else {
+      logger.info(
+        `listData "${key}" is not valid. Supported types are "add" and "remove"`
+      );
+    }
+  });
+ 
+  return outputPayloads;
+};
+ 
+const processEvent = async (metadata, message, destination) => {
+  const response = [];
+  if (!message.type) {
+    throw new ErrorBuilder()
+      .setMessage(
+        "[Google_adwords_remarketing_list]::Message Type is not present. Aborting message."
+      )
+      .setStatus(400)
+      .build();
+  }
+  Iif (!message.properties) {
+    throw new ErrorBuilder()
+      .setMessage(
+        "[Google_adwords_remarketing_list]::Message properties is not present. Aborting message."
+      )
+      .setStatus(400)
+      .build();
+  }
+  if (!message.properties.listData) {
+    throw new ErrorBuilder()
+      .setMessage(
+        "[Google_adwords_remarketing_list]::listData is not present inside properties. Aborting message."
+      )
+      .setStatus(400)
+      .build();
+  }
+  Eif (message.type.toLowerCase() === "audiencelist") {
+    const createdPayload = createPayload(message, destination);
+ 
+    if (!Object.keys(createdPayload).length) {
+      throw new ErrorBuilder()
+        .setMessage(
+          "[Google_adwords_remarketing_list]:: Neither 'add' nor 'remove' property is present inside 'listData' or there are no attributes inside 'add' or 'remove' properties matching with the schema fields. Aborting message."
+        )
+        .setStatus(400)
+        .build();
+    }
+ 
+    Object.values(createdPayload).forEach(data => {
+      response.push(responseBuilder(metadata, data, destination));
+    });
+    return response;
+  }
+ 
+  throw new ErrorBuilder()
+    .setMessage(
+      `[Google_adwords_remarketing_list]::Message Type ${message.type} not supported.`
+    )
+    .setStatus(400)
+    .build();
+};
+ 
+const process = async event => {
+  return processEvent(event.metadata, event.message, event.destination);
+};
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          // eslint-disable-next-line no-nested-ternary
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : error.status || 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/googlepubsub/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/googlepubsub/index.html new file mode 100644 index 00000000000..978be648bca --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/googlepubsub/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/googlepubsub + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/googlepubsub

+
+ +
+ 83.82% + Statements + 57/68 +
+ + +
+ 66.67% + Branches + 36/54 +
+ + +
+ 81.82% + Functions + 9/11 +
+ + +
+ 83.82% + Lines + 57/68 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
55.56%10/1828.57%4/1433.33%1/355.56%10/18
util.js +
+
94%47/5080%32/40100%8/894%47/50
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/googlepubsub/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/googlepubsub/transform.js.html new file mode 100644 index 00000000000..eb451745a55 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/googlepubsub/transform.js.html @@ -0,0 +1,233 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/googlepubsub/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/googlepubsub transform.js

+
+ +
+ 55.56% + Statements + 10/18 +
+ + +
+ 28.57% + Branches + 4/14 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 55.56% + Lines + 10/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +521x +  +1x +  +  +13x +13x +13x +10x +  +10x +  +  +  +  +  +  +3x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
const { getSuccessRespEvents, getErrorRespEvents } = require("../../util");
+ 
+const { getTopic, createAttributesMetadata } = require("./util");
+ 
+function process(event) {
+  const { message, destination } = event;
+  const topicId = getTopic(event);
+  if (topicId) {
+    const attributes = createAttributesMetadata(message, destination);
+ 
+    return {
+      userId: message.userId || message.anonymousId,
+      message,
+      topicId,
+      attributes
+    };
+  }
+  throw new Error("No topic set for this event");
+}
+ 
+const processRouterDest = async inputs => {
+  if (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/googlepubsub/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/googlepubsub/util.js.html new file mode 100644 index 00000000000..e6b2eb8d220 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/googlepubsub/util.js.html @@ -0,0 +1,443 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/googlepubsub/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/googlepubsub util.js

+
+ +
+ 94% + Statements + 47/50 +
+ + +
+ 80% + Branches + 32/40 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 94% + Lines + 47/50 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122  +  +  +  +  +  +1x +  +1x +1x +6x +  +  +  +  +  +  +  +1x +13x +13x +13x +  +13x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +10x +5x +  +  +5x +5x +8x +8x +8x +2x +  +6x +  +  +  +5x +  +  +  +  +  +6x +6x +2x +  +  +  +4x +4x +4x +4x +4x +4x +4x +4x +  +  +  +  +  +4x +4x +  +  +  +  +  +10x +  +10x +10x +5x +  +  +  +5x +  +  +  +5x +  +  +  +5x +6x +6x +6x +6x +6x +  +  +5x +  +  +1x +  +  +  + 
/* eslint-disable prettier/prettier */
+const {
+  getHashFromArray,
+  getValueFromMessage,
+  isDefinedAndNotNull,
+  isDefinedAndNotNullAndNotEmpty
+} = require("../../util");
+ 
+const SOURCE_KEYS = ["properties", "traits", "context.traits"];
+const stringifyValue = val => {
+  return typeof val === "string" ? val : JSON.stringify(val);
+}
+ 
+/**
+ * Returns Topic ID
+ * @param {*} event
+ * @returns
+ */
+const getTopic = event => {
+  const { message } = event;
+  const { eventToTopicMap } = event.destination.Config;
+  const hashMap = getHashFromArray(eventToTopicMap, "from", "to");
+ 
+  return (
+    (message.event ? hashMap[message.event.toLowerCase()] : null) ||
+    hashMap[message.type.toLowerCase()] ||
+    hashMap["*"]
+  );
+};
+ 
+/**
+ * Creates Attribute metadata object
+ * @param {*} message
+ * @param {*} attributesMap
+ * @returns
+ */
+const createAttributesMetadata = (message, { Config }) => {
+  /**
+   * Converts Config map to usable format
+   * @param {*} eventToAttributesMap
+   * @returns
+   */
+  function generateAttributesMap(eventToAttributesMap) {
+    if (!eventToAttributesMap || eventToAttributesMap.length === 0) {
+      return null;
+    }
+ 
+    const attributesMap = {};
+    eventToAttributesMap.forEach(item => {
+      const key = item.from.toLowerCase();
+      Eif (isDefinedAndNotNullAndNotEmpty(key)) {
+        if (isDefinedAndNotNullAndNotEmpty(attributesMap[key])) {
+          attributesMap[key].push(item.to);
+        } else {
+          attributesMap[key] = [item.to];
+        }
+      }
+    });
+    return attributesMap;
+  }
+ 
+  // Returns value for Attribute key if present, else returns null
+  function getAttributeValueOrNull(key) {
+    // Check first if present in message Root
+    const requiredVal = getValueFromMessage(message, key);
+    if (isDefinedAndNotNull(requiredVal)) {
+      return stringifyValue(requiredVal);
+    }
+ 
+    let val;
+    let found = false;
+    SOURCE_KEYS.some(sourceKey => {
+      const nestedObj = getValueFromMessage(message, sourceKey);
+      Eif (nestedObj) {
+        val = nestedObj[key] || getValueFromMessage(nestedObj, key);
+        Eif (isDefinedAndNotNull(val)) {
+          found = true;
+          return true;
+        }
+      }
+      return false;
+    });
+ 
+    Eif (found) {
+      return stringifyValue(val);
+    }
+    return null;
+  }
+ 
+  // intialize empty attributes metadata
+  const attrMetadata = {};
+ 
+  const attributesMap = generateAttributesMap(Config.eventToAttributesMap);
+  if (!attributesMap || Object.keys(attributesMap).length === 0) {
+    return attrMetadata;
+  }
+ 
+  const attributeKeys =
+    (message.event ? attributesMap[message.event.toLowerCase()] : null) ||
+    attributesMap[message.type.toLowerCase()] ||
+    attributesMap["*"];
+ 
+  Iif (!attributeKeys || attributeKeys.length === 0) {
+    return attrMetadata;
+  }
+ 
+  attributeKeys.forEach(key => {
+    const val = getAttributeValueOrNull(key);
+    Eif (isDefinedAndNotNull(val)) {
+      const splitKeysArray = key.split(".")
+      const refinedKey = splitKeysArray[splitKeysArray.length - 1]
+      attrMetadata[refinedKey] = val;
+    }
+  });
+  return attrMetadata;
+};
+ 
+module.exports = {
+  getTopic,
+  createAttributesMetadata
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/googlesheets/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/googlesheets/index.html new file mode 100644 index 00000000000..0d9e28c3185 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/googlesheets/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/googlesheets + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/googlesheets

+
+ +
+ 77.78% + Statements + 35/45 +
+ + +
+ 53.57% + Branches + 15/28 +
+ + +
+ 71.43% + Functions + 5/7 +
+ + +
+ 77.78% + Lines + 35/45 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
77.78%35/4553.57%15/2871.43%5/777.78%35/45
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/googlesheets/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/googlesheets/transform.js.html new file mode 100644 index 00000000000..043a19924ea --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/googlesheets/transform.js.html @@ -0,0 +1,521 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/googlesheets/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/googlesheets transform.js

+
+ +
+ 77.78% + Statements + 35/45 +
+ + +
+ 53.57% + Branches + 15/28 +
+ + +
+ 71.43% + Functions + 5/7 +
+ + +
+ 77.78% + Lines + 35/45 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +1481x +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +149x +149x +51x +  +149x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +5x +5x +5x +5x +  +  +  +  +  +  +5x +  +  +  +5x +  +5x +5x +  +  +70x +70x +  +56x +149x +  +  +  +  +149x +13x +  +136x +  +  +  +70x +  +  +  +70x +  +  +5x +  +  +  +1x +6x +6x +5x +  +  +  +  +  +  +  +5x +  +1x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  + 
const get = require("get-value");
+const {
+  getValueFromMessage,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+const SOURCE_KEYS = ["properties", "traits", "context.traits"];
+ 
+/**
+ *
+ * @param {*} message
+ * @param {*} sourceKey
+ * @param {*} mappingKey
+ *
+ * here we iterate through free flowing objects inside our events
+ * and check for the property value. Property with Whitespace between them
+ * is also supported
+ */
+const getMappingFieldValueFormMessage = (message, sourceKey, mappingKey) => {
+  let value;
+  const tempStore = getValueFromMessage(message, sourceKey);
+  if (tempStore) {
+    value = tempStore[mappingKey] || get(tempStore, mappingKey);
+  }
+  return value;
+};
+ 
+/**
+ *
+ * @param {*} message
+ * @param {*} attributeKeyMapping
+ *
+ * Here we process the event based on the custom mapping
+ * (attributeKeyMapping) we get from the destination-definition.
+ * As `attributeKeyMapping` is an array of mapping hence we
+ * dont loose the order of the mapping.
+ *
+ * Returns a json with numbered mapping keys denoting the position
+ * where the value needs to be placed when pared into array in server.
+ */
+const processWithCustomMapping = (message, attributeKeyMapping) => {
+  const responseMessage = {};
+  const fromKey = "from";
+  const toKey = "to";
+  let count = 0;
+ 
+  // Adding messageId in the first column to maintain order when whenver
+  // we are getting blank-values. We need to append below non-empty Value
+  // expecting messageId never to be empty.
+  // If messageId not present should add UUID?
+ 
+  responseMessage[count] = {
+    attributeKey: "messageId",
+    attributeValue: message.messageId || ""
+  };
+  count += 1;
+ 
+  Eif (Array.isArray(attributeKeyMapping)) {
+    attributeKeyMapping.forEach(mapping => {
+      let value;
+      // Check in root-level
+      value = getValueFromMessage(message, mapping[fromKey]);
+      if (!value) {
+        // Check in free-flowing object level
+        SOURCE_KEYS.some(sourceKey => {
+          value = getMappingFieldValueFormMessage(
+            message,
+            sourceKey,
+            mapping[fromKey]
+          );
+          if (value) {
+            return true;
+          }
+          return false;
+        });
+      }
+      // Set the value if present else set an empty string
+      responseMessage[count] = {
+        attributeKey: mapping[toKey],
+        attributeValue: value || ""
+      };
+      count += 1;
+    });
+  }
+  return responseMessage;
+};
+ 
+// Main process Function to handle transformation
+const process = event => {
+  const { message, destination } = event;
+  if (destination.Config.sheetName) {
+    const payload = {
+      message: processWithCustomMapping(
+        message,
+        destination.Config.eventKeyMap
+      ),
+      spreadSheetId: destination.Config.sheetId,
+      spreadSheet: destination.Config.sheetName
+    };
+    return payload;
+  }
+  throw new CustomError("No Spread Sheet set for this event", 400);
+};
+ 
+const processRouterDest = async inputs => {
+  if (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        if (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/hs/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/hs/config.js.html new file mode 100644 index 00000000000..5349059d568 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/hs/config.js.html @@ -0,0 +1,134 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/hs/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/hs config.js

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +191x +  +1x +  +  +  +  +  +1x +1x +1x +  +1x +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ConfigCategory = {
+  IDENTIFY: {
+    name: "HSIdentifyConfig"
+  }
+};
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+const BATCH_CONTACT_ENDPOINT = "https://api.hubapi.com/contacts/v1/contact/batch/";
+const MAX_BATCH_SIZE = 1000;
+ 
+module.exports = {
+  ConfigCategory,
+  mappingConfig,
+  BATCH_CONTACT_ENDPOINT,
+  MAX_BATCH_SIZE
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/hs/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/hs/index.html new file mode 100644 index 00000000000..75081c40568 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/hs/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/hs + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/hs

+
+ +
+ 92.66% + Statements + 164/177 +
+ + +
+ 76.47% + Branches + 52/68 +
+ + +
+ 96% + Functions + 24/25 +
+ + +
+ 92.61% + Lines + 163/176 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%6/6100%0/0100%0/0100%6/6
transform.js +
+
93.75%150/16076.47%52/68100%21/2193.75%150/160
util.js +
+
72.73%8/11100%0/075%3/470%7/10
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/hs/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/hs/transform.js.html new file mode 100644 index 00000000000..2ba89c6137c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/hs/transform.js.html @@ -0,0 +1,1256 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/hs/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/hs transform.js

+
+ +
+ 93.75% + Statements + 150/160 +
+ + +
+ 76.47% + Branches + 52/68 +
+ + +
+ 100% + Functions + 21/21 +
+ + +
+ 93.75% + Lines + 150/160 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +3931x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +1x +  +1x +  +1x +  +  +28x +28x +28x +28x +  +  +  +14x +14x +1x +  +  +14x +  +  +  +11x +  +11x +11x +11x +11x +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +9x +9x +1494x +  +9x +  +9x +  +  +  +  +  +  +  +  +13x +13x +13x +  +13x +13x +13x +10x +  +11x +110x +22x +  +  +11x +28x +28x +1x +1x +  +  +  +  +  +1x +  +  +  +11x +  +  +  +5x +11x +  +  +  +  +11x +11x +  +11x +11x +  +11x +5x +5x +5x +5x +5x +5x +  +  +  +5x +5x +  +6x +  +11x +  +  +11x +11x +11x +11x +  +11x +  +  +  +6x +  +  +  +  +6x +  +  +  +  +2x +  +6x +  +  +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +8x +8x +  +8x +1x +  +  +8x +1x +  +7x +  +  +  +  +  +5x +5x +  +  +  +  +  +  +  +  +  +  +15x +  +  +  +15x +  +6x +6x +  +8x +5x +  +1x +  +  +  +  +  +11x +  +  +  +  +12x +  +  +  +1x +1x +1x +1x +1x +  +4x +1x +1x +  +1x +1x +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +  +  +  +3x +  +4x +  +  +  +1x +1x +  +  +  +  +1x +1x +1x +  +  +  +1x +1x +1x +  +1x +  +1x +3x +  +  +3x +3x +  +  +  +3x +  +  +1x +  +  +  +1x +1x +  +  +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +1x +1x +  +  +  +  +1x +1x +  +1x +  +  +1x +1x +  +1x +1x +  +1x +  +4x +4x +  +1x +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +1x +  +  +1x + 
const get = require("get-value");
+const set = require("set-value");
+const axios = require("axios");
+const { EventType, MappedToDestinationKey } = require("../../../constants");
+const {
+  defaultGetRequestConfig,
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  removeUndefinedValues,
+  getFieldValueFromMessage,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  addExternalIdToTraits,
+  defaultBatchRequestConfig
+} = require("../../util");
+const {
+  ConfigCategory,
+  mappingConfig,
+  BATCH_CONTACT_ENDPOINT,
+  MAX_BATCH_SIZE
+} = require("./config");
+const { getEmailAndUpdatedProps } = require("./util");
+ 
+const hSIdentifyConfigJson = mappingConfig[ConfigCategory.IDENTIFY.name];
+ 
+let hubSpotPropertyMap = {};
+ 
+function getKey(key) {
+  let modifiedKey = key.toLowerCase();
+  modifiedKey = modifiedKey.replace(/\s/g, "_");
+  modifiedKey = modifiedKey.replace(/\./g, "_");
+  return modifiedKey;
+}
+ 
+function getTraits(message) {
+  let traits = getFieldValueFromMessage(message, "traits");
+  if (!traits || !Object.keys(traits).length) {
+    traits = message.properties;
+  }
+ 
+  return traits;
+}
+ 
+async function getProperties(destination) {
+  Eif (!hubSpotPropertyMap.length) {
+    let response;
+    const { apiKey } = destination.Config;
+    const url = `https://api.hubapi.com/properties/v1/contacts/properties?hapikey=${apiKey}`;
+    try {
+      response = await axios.get(url);
+    } catch (err) {
+      // check if exists err.response && err.response.status else 500
+ 
+      Eif (err.response) {
+        throw new CustomError(
+          JSON.stringify(err.response.data) ||
+            JSON.stringify(err.response.statusText) ||
+            "Failed to get hubspot properties",
+          err.response.status || 500
+        );
+      }
+      throw new CustomError(
+        "Failed to get hubspot properties : indvalid response",
+        500
+      );
+    }
+ 
+    const propertyMap = {};
+    response.data.forEach(element => {
+      propertyMap[element.name] = element.type;
+    });
+    hubSpotPropertyMap = propertyMap;
+  }
+  return hubSpotPropertyMap;
+}
+ 
+async function getTransformedJSON(
+  message,
+  mappingJson,
+  destination,
+  propertyMap
+) {
+  const rawPayload = {};
+  const sourceKeys = Object.keys(mappingJson);
+  const traits = getTraits(message);
+ 
+  Eif (traits) {
+    const traitsKeys = Object.keys(traits);
+    if (!propertyMap) {
+      propertyMap = await getProperties(destination);
+    }
+    sourceKeys.forEach(sourceKey => {
+      if (get(traits, sourceKey)) {
+        set(rawPayload, mappingJson[sourceKey], get(traits, sourceKey));
+      }
+    });
+    traitsKeys.forEach(traitsKey => {
+      const hsSupportedKey = getKey(traitsKey);
+      if (!rawPayload[traitsKey] && propertyMap[hsSupportedKey]) {
+        let propValue = traits[traitsKey];
+        Iif (propertyMap[hsSupportedKey] === "date") {
+          const time = propValue;
+          const date = new Date(time);
+          date.setUTCHours(0, 0, 0, 0);
+          propValue = date.getTime();
+        }
+        rawPayload[hsSupportedKey] = propValue;
+      }
+    });
+  }
+  return { ...rawPayload };
+}
+ 
+function getPropertyValueForIdentify(propMap) {
+  return Object.keys(propMap).map(key => {
+    return { property: key, value: propMap[key] };
+  });
+}
+ 
+function responseBuilderSimple(payload, message, eventType, destination) {
+  let endpoint = "https://track.hubspot.com/v1/event";
+  let params = {};
+ 
+  const response = defaultRequestConfig();
+  response.method = defaultGetRequestConfig.requestMethod;
+ 
+  if (eventType !== EventType.TRACK) {
+    const traits = getFieldValueFromMessage(message, "traits");
+    const { email } = traits;
+    const { apiKey } = destination.Config;
+    params = { hapikey: apiKey };
+    Eif (email) {
+      endpoint = `https://api.hubapi.com/contacts/v1/contact/createOrUpdate/email/${email}`;
+    } else {
+      endpoint = "https://api.hubapi.com/contacts/v1/contact";
+    }
+    response.method = defaultPostRequestConfig.requestMethod;
+    response.body.JSON = removeUndefinedValues(payload);
+  } else {
+    params = removeUndefinedValues(payload);
+  }
+  response.headers = {
+    "Content-Type": "application/json"
+  };
+  response.endpoint = endpoint;
+  response.userId = message.anonymousId;
+  response.params = params;
+  response.statusCode = 200;
+ 
+  return response;
+}
+ 
+async function processTrack(message, destination, propertyMap) {
+  const parameters = {
+    _a: destination.Config.hubID,
+    _n: message.event
+  };
+ 
+  if (
+    message.properties &&
+    (message.properties.revenue || message.properties.value)
+  ) {
+    // eslint-disable-next-line dot-notation
+    parameters["_m"] = message.properties.revenue || message.properties.value;
+  }
+  const userProperties = await getTransformedJSON(
+    message,
+    hSIdentifyConfigJson,
+    destination,
+    propertyMap
+  );
+ 
+  return responseBuilderSimple(
+    { ...parameters, ...userProperties },
+    message,
+    EventType.TRACK,
+    destination
+  );
+}
+ 
+// function handleError(message) {
+//   throw new Error(message);
+// }
+ 
+async function processIdentify(message, destination, propertyMap) {
+  const traits = getFieldValueFromMessage(message, "traits");
+  const mappedToDestination = get(message, MappedToDestinationKey);
+  // If mapped to destination, Add externalId to traits
+  if (mappedToDestination) {
+    addExternalIdToTraits(message);
+  }
+ 
+  if (!traits || !traits.email) {
+    throw new CustomError("Identify without email is not supported.", 400);
+  }
+  const userProperties = await getTransformedJSON(
+    message,
+    hSIdentifyConfigJson,
+    destination,
+    propertyMap
+  );
+  const properties = getPropertyValueForIdentify(userProperties);
+  return responseBuilderSimple(
+    { properties },
+    message,
+    EventType.IDENTIFY,
+    destination
+  );
+}
+ 
+async function processSingleMessage(message, destination, propertyMap) {
+  let response;
+ 
+  Iif (!message.type) {
+    throw new CustomError("message type not present", 400);
+  }
+ 
+  switch (message.type) {
+    case EventType.TRACK:
+      response = await processTrack(message, destination, propertyMap);
+      break;
+    case EventType.IDENTIFY:
+      response = await processIdentify(message, destination, propertyMap);
+      break;
+    default:
+      throw new CustomError(
+        `message type ${message.type} is not supported`,
+        400
+      );
+  }
+ 
+  return response;
+}
+ 
+// has been deprecated - using routerTransform for both the versions
+function process(event) {
+  return processSingleMessage(event.message, event.destination);
+}
+ 
+function batchEvents(destEvents) {
+  const batchedResponseList = [];
+  const trackResponseList = [];
+  let eventsChunk = [];
+  const arrayChunksIdentify = [];
+  destEvents.forEach((event, index) => {
+    // handler for track call
+    if (event.message.method === "GET") {
+      const { message, metadata, destination } = event;
+      const endpoint = get(message, "endpoint");
+ 
+      const batchedResponse = defaultBatchRequestConfig();
+      batchedResponse.batchedRequest.headers = message.headers;
+      batchedResponse.batchedRequest.endpoint = endpoint;
+      batchedResponse.batchedRequest.body = message.body;
+      batchedResponse.batchedRequest.params = message.params;
+      batchedResponse.batchedRequest.method =
+        defaultGetRequestConfig.requestMethod;
+      batchedResponse.metadata = [metadata];
+      batchedResponse.destination = destination;
+ 
+      trackResponseList.push(
+        getSuccessRespEvents(
+          batchedResponse.batchedRequest,
+          batchedResponse.metadata,
+          batchedResponse.destination
+        )
+      );
+    } else {
+      eventsChunk.push(event);
+    }
+    if (
+      eventsChunk.length &&
+      (eventsChunk.length === MAX_BATCH_SIZE || index === destEvents.length - 1)
+    ) {
+      arrayChunksIdentify.push(eventsChunk);
+      eventsChunk = [];
+    }
+  });
+ 
+  // list of chunks [ [..], [..] ]
+  arrayChunksIdentify.forEach(chunk => {
+    const identifyResponseList = [];
+    const metadata = [];
+ 
+    // extracting destination, apiKey value
+    // from the first event in a batch
+    const { destination } = chunk[0];
+    const { apiKey } = destination.Config;
+    const params = { hapikey: apiKey };
+ 
+    let batchEventResponse = defaultBatchRequestConfig();
+ 
+    chunk.forEach(ev => {
+      const { email, updatedProperties } = getEmailAndUpdatedProps(
+        ev.message.body.JSON.properties
+      );
+      ev.message.body.JSON.properties = updatedProperties;
+      identifyResponseList.push({
+        email,
+        properties: ev.message.body.JSON.properties
+      });
+      metadata.push(ev.metadata);
+    });
+ 
+    batchEventResponse.batchedRequest.body.JSON_ARRAY = {
+      batch: JSON.stringify(identifyResponseList)
+    };
+ 
+    batchEventResponse.batchedRequest.endpoint = BATCH_CONTACT_ENDPOINT;
+    batchEventResponse.batchedRequest.headers = {
+      "Content-Type": "application/json"
+    };
+    batchEventResponse.batchedRequest.params = params;
+    batchEventResponse = {
+      ...batchEventResponse,
+      metadata,
+      destination
+    };
+    batchedResponseList.push(
+      getSuccessRespEvents(
+        batchEventResponse.batchedRequest,
+        batchEventResponse.metadata,
+        batchEventResponse.destination,
+        true
+      )
+    );
+  });
+ 
+  return batchedResponseList.concat(trackResponseList);
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const successRespList = [];
+  const errorRespList = [];
+  // using the first destination config for transforming the batch
+  const { destination } = inputs[0];
+  // reduce the no. of calls for properties endpoint
+  let propertyMap;
+  const traitsFound = inputs.some(input => {
+    return getTraits(input.message) !== undefined;
+  });
+  Eif (traitsFound) {
+    propertyMap = await getProperties(destination);
+  }
+  await Promise.all(
+    inputs.map(async input => {
+      try {
+        if (input.message.statusCode) {
+          // already transformed event
+          successRespList.push({
+            message: input.message,
+            metadata: input.metadata,
+            destination
+          });
+        } else {
+          // event is not transformed
+          successRespList.push({
+            message: await processSingleMessage(
+              input.message,
+              destination,
+              propertyMap
+            ),
+            metadata: input.metadata,
+            destination
+          });
+        }
+      } catch (error) {
+        errorRespList.push(
+          getErrorRespEvents(
+            [input.metadata],
+            error.response ? error.response.status : 400,
+            error.message || "Error occurred while processing payload."
+          )
+        );
+      }
+    })
+  );
+ 
+  let batchedResponseList = [];
+  Eif (successRespList.length) {
+    batchedResponseList = await batchEvents(successRespList);
+  }
+  return [...batchedResponseList, ...errorRespList];
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/hs/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/hs/util.js.html new file mode 100644 index 00000000000..d7cae1d6c80 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/hs/util.js.html @@ -0,0 +1,149 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/hs/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/hs util.js

+
+ +
+ 72.73% + Statements + 8/11 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 70% + Lines + 7/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +241x +  +1x +  +  +  +  +  +  +  +  +1x +3x +3x +  +6x +  +  +  +1x +  +  +  + 
const { send } = require("../../../adapters/network");
+ 
+const getAllContactProperties = async endpoint => {
+  const requestOptions = {
+    url: endpoint,
+    method: "get"
+  };
+  const res = await send(requestOptions);
+  return res;
+};
+ 
+const getEmailAndUpdatedProps = properties => {
+  const index = properties.findIndex(prop => prop.property === "email");
+  return {
+    email: properties[index].value,
+    updatedProperties: properties.filter((prop, i) => i !== index)
+  };
+};
+ 
+module.exports = {
+  getAllContactProperties,
+  getEmailAndUpdatedProps
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/indicative/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/indicative/config.js.html new file mode 100644 index 00000000000..2816f2ac294 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/indicative/config.js.html @@ -0,0 +1,143 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/indicative/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/indicative config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +  +1x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +1x +  +1x +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_ENDPOINT = "https://api.indicative.com/service";
+const TRACK_ENDPOINT = `${BASE_ENDPOINT}/event`;
+const IDENTIFY_ENDPOINT = `${BASE_ENDPOINT}/identify`;
+const ALIAS_ENDPOINT = `${BASE_ENDPOINT}/alias`;
+ 
+const CONFIG_CATEGORIES = {
+  ALIAS: { endPoint: ALIAS_ENDPOINT, name: "INAliasConfig" },
+  IDENTIFY: { endPoint: IDENTIFY_ENDPOINT, name: "INIdentifyConfig" },
+  PAGE: { endPoint: TRACK_ENDPOINT, name: "INPageConfig" },
+  SCREEN: { endPoint: TRACK_ENDPOINT, name: "INScreenConfig" },
+  TRACK: { endPoint: TRACK_ENDPOINT, name: "INTrackConfig" }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/indicative/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/indicative/index.html new file mode 100644 index 00000000000..1f2880accf7 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/indicative/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/indicative + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/indicative

+
+ +
+ 95.05% + Statements + 96/101 +
+ + +
+ 82.14% + Branches + 46/56 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 95.05% + Lines + 96/101 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%0/0100%8/8
transform.js +
+
94.62%88/9382.14%46/56100%12/1294.62%88/93
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/indicative/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/indicative/transform.js.html new file mode 100644 index 00000000000..ac8104a0fb8 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/indicative/transform.js.html @@ -0,0 +1,788 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/indicative/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/indicative transform.js

+
+ +
+ 94.62% + Statements + 88/93 +
+ + +
+ 82.14% + Branches + 46/56 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 94.62% + Lines + 88/93 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +2371x +1x +1x +  +  +  +  +  +  +  +  +1x +  +1x +19x +  +  +19x +  +439x +  +376x +63x +11x +  +10x +  +10x +10x +44x +  +5x +39x +  +  +  +37x +  +  +  +  +10x +2x +  +  +  +10x +  +7x +7x +  +  +  +  +7x +  +  +31x +  +  +30x +  +  +  +  +7x +37x +37x +277x +  +  +276x +  +  +  +  +  +7x +30x +  +  +  +  +  +  +  +  +52x +  +420x +  +  +  +  +  +  +  +  +19x +19x +  +  +1x +24x +24x +24x +  +  +19x +  +24x +24x +24x +24x +24x +  +  +  +24x +24x +24x +  +  +  +  +  +1x +22x +1x +  +  +  +  +21x +21x +  +  +21x +21x +  +1x +1x +  +5x +5x +  +5x +5x +  +1x +1x +  +8x +8x +  +1x +  +  +  +20x +13x +1x +  +13x +  +  +  +  +  +  +  +20x +  +20x +5x +  +  +5x +  +4x +  +  +  +  +  +  +  +  +  +20x +  +  +1x +22x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const { EventType } = require("../../../constants");
+const { CONFIG_CATEGORIES, MAPPING_CONFIG } = require("./config");
+const {
+  defaultRequestConfig,
+  getFieldValueFromMessage,
+  constructPayload,
+  defaultPostRequestConfig,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+const handleProperties = properties => {
+  const result = {};
+  let l;
+ 
+  const recurse = (cur, prop) => {
+    let i;
+    if (Object(cur) !== cur) {
+      // primitive types
+      result[prop] = cur;
+    } else if (Array.isArray(cur)) {
+      if (cur.length > 0) {
+        // array for primitive type
+        const pArr = [];
+        // array for storing the objects of the array
+        const cArr = [];
+        cur.forEach(item => {
+          if (Object(item) !== item) {
+            // primitive | push too pArr
+            pArr.push(item);
+          } else if (Array.isArray(item)) {
+            // discard array of arrays
+          } else {
+            // object | push to cArr
+            cArr.push(item);
+          }
+        });
+ 
+        // handle primitive element array
+        if (pArr.length > 0) {
+          result[prop] = pArr.toString();
+        }
+ 
+        // handle object array
+        if (cArr.length > 0) {
+          // take the first element
+          const fel = cArr[0];
+          const objectMap = {};
+ 
+          // take the keys from the first element and store
+          // we're expecting all the objects of the array are same
+          // we'll discard if a new item is found later on
+          Object.keys(fel).forEach(key => {
+            // discarding nested objects and arrays for array of objects
+            // only allowing primitive times for array of objects
+            if (Object(fel[key]) !== fel[key]) {
+              // initiate empty arrays for each of the
+              // properties from the object
+              objectMap[key] = [];
+            }
+          });
+ 
+          // now iterate over the cArr
+          for (i = 0, l = cArr.length; i < l; i += 1) {
+            const el = cArr[i];
+            Object.keys(el).forEach(k => {
+              if (Object.keys(objectMap).indexOf(k) !== -1) {
+                // if the key is in the objectMap -
+                // in other words, the key was present in the first element of the array
+                objectMap[k].push(el[k]);
+              }
+            });
+          }
+ 
+          // fonally add the stringified arrays to the final result
+          Object.keys(objectMap).forEach(key => {
+            result[prop ? `${prop}.${key}` : key] = objectMap[key].toString();
+          });
+        }
+      }
+      // else {
+      // result[prop] = [];
+      // }
+    } else {
+      // let isEmpty = true;
+      Object.keys(cur).forEach(key => {
+        // isEmpty = false;
+        recurse(cur[key], prop ? `${prop}.${key}` : key);
+      });
+ 
+      // if (isEmpty && prop) {
+      //   result[prop] = {};
+      // }
+    }
+  };
+ 
+  recurse(properties, "");
+  return result;
+};
+ 
+const responseBuilderSimple = (message, category, destination) => {
+  const payload = constructPayload(message, MAPPING_CONFIG[category.name]);
+  Eif (payload) {
+    if (payload.properties) {
+      // keeping this properties handling logic here
+      // If we observe similar expectation from other destination, will move to Utils
+      payload.properties = handleProperties(payload.properties);
+    }
+    const responseBody = { ...payload, apiKey: destination.Config.apiKey };
+    const response = defaultRequestConfig();
+    response.endpoint = category.endPoint;
+    response.method = defaultPostRequestConfig.requestMethod;
+    response.headers = {
+      "Indicative-Client": "RudderStack",
+      "Content-Type": "application/json"
+    };
+    response.userId = getFieldValueFromMessage(message, "userId");
+    response.body.JSON = responseBody;
+    return response;
+  }
+  // fail-safety for developer error
+  throw new CustomError("Payload could not be constructed", 400);
+};
+ 
+const processEvent = (message, destination) => {
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const messageType = message.type.toLowerCase();
+  const formattedMessage = message;
+ 
+  let category;
+  const respList = [];
+  switch (messageType) {
+    case EventType.ALIAS:
+      category = CONFIG_CATEGORIES.ALIAS;
+      break;
+    case EventType.IDENTIFY:
+      category = CONFIG_CATEGORIES.IDENTIFY;
+      break;
+    case EventType.PAGE:
+      category = CONFIG_CATEGORIES.PAGE;
+      break;
+    case EventType.SCREEN:
+      category = CONFIG_CATEGORIES.SCREEN;
+      break;
+    case EventType.TRACK:
+      category = CONFIG_CATEGORIES.TRACK;
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+ 
+  // append context.page to properties for page, track
+  if (messageType === EventType.PAGE || messageType === EventType.TRACK) {
+    if (!formattedMessage.properties) {
+      formattedMessage.properties = {};
+    }
+    formattedMessage.properties = {
+      ...get(formattedMessage, "context.page"),
+      campaign: get(formattedMessage, "context.campaign"),
+      ...formattedMessage.properties
+    };
+  }
+ 
+  // build the response
+  respList.push(responseBuilderSimple(formattedMessage, category, destination));
+ 
+  if (messageType === EventType.IDENTIFY) {
+    const userId = getFieldValueFromMessage(formattedMessage, "userIdOnly");
+    // append the alias call only if a valid value of "userId" is present
+    // otherwise its a request with only anonymousId with traits. alias call isn't ideal
+    if (userId) {
+      // append an alias call with anonymousId and userId for identity resolution
+      respList.push(
+        responseBuilderSimple(
+          formattedMessage,
+          CONFIG_CATEGORIES.ALIAS,
+          destination
+        )
+      );
+    }
+  }
+ 
+  return respList;
+};
+ 
+const process = event => {
+  return processEvent(event.message, event.destination);
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/intercom/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/intercom/config.js.html new file mode 100644 index 00000000000..0d02354a80e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/intercom/config.js.html @@ -0,0 +1,230 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/intercom/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/intercom config.js

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +511x +  +1x +  +  +1x +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_ENDPOINT = "https://api.intercom.io";
+ 
+// track events | Track
+const TRACK_ENDPOINT = `${BASE_ENDPOINT}/events`;
+// Create, Update a user with a company | Identify
+const IDENTIFY_ENDPOINT = `${BASE_ENDPOINT}/users`;
+// create, update, delete a company | Group
+// const GROUP_ENDPOINT = `${BASE_ENDPOINT}/companies`;
+ 
+const ConfigCategory = {
+  TRACK: {
+    endpoint: TRACK_ENDPOINT,
+    name: "INTERCOMTrackConfig"
+  },
+  IDENTIFY: {
+    endpoint: IDENTIFY_ENDPOINT,
+    name: "INTERCOMIdentifyConfig"
+  }
+  // ,
+  // GROUP: {
+  //   endpoint: GROUP_ENDPOINT,
+  //   name: "INTERCOMGroupConfig"
+  // }
+};
+ 
+const MappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+const ReservedTraitsProperties = [
+  "userId",
+  "email",
+  "phone",
+  "name",
+  "createdAt",
+  "firstName",
+  "lastName",
+  "firstname",
+  "lastname",
+  "company"
+];
+ 
+const ReservedCompanyProperties = ["id", "name", "industry"];
+ 
+module.exports = {
+  ConfigCategory,
+  MappingConfig,
+  ReservedCompanyProperties,
+  ReservedTraitsProperties
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/intercom/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/intercom/index.html new file mode 100644 index 00000000000..2680f1bc777 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/intercom/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/intercom + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/intercom

+
+ +
+ 92.63% + Statements + 88/95 +
+ + +
+ 82.61% + Branches + 57/69 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 92.63% + Lines + 88/95 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%9/9100%0/0100%0/0100%9/9
transform.js +
+
91.86%79/8682.61%57/69100%11/1191.86%79/86
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/intercom/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/intercom/transform.js.html new file mode 100644 index 00000000000..818100fc2c1 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/intercom/transform.js.html @@ -0,0 +1,728 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/intercom/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/intercom transform.js

+
+ +
+ 91.86% + Statements + 79/86 +
+ + +
+ 82.61% + Branches + 57/69 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 91.86% + Lines + 79/86 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +2171x +1x +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +3x +3x +2x +2x +  +8x +3x +3x +2x +  +  +  +  +2x +  +  +  +  +  +  +3x +  +  +  +13x +  +13x +13x +11x +7x +7x +7x +2x +  +5x +  +  +  +11x +3x +  +  +  +  +11x +10x +100x +  +  +  +11x +  +2x +  +  +  +  +3x +2x +2x +1x +6x +6x +4x +  +  +  +2x +  +1x +  +  +  +16x +16x +16x +  +13x +  +  +11x +  +3x +  +  +2x +  +  +  +  +13x +13x +13x +  +  +  +  +  +13x +13x +  +  +  +16x +  +  +  +  +  +16x +16x +  +  +16x +  +13x +13x +  +3x +3x +  +  +  +  +  +  +  +  +  +16x +1x +1x +  +15x +  +16x +1x +  +16x +  +  +  +  +16x +16x +  +3x +  +  +  +  +13x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const md5 = require("md5");
+const get = require("get-value");
+const { EventType, MappedToDestinationKey } = require("../../../constants");
+const {
+  ConfigCategory,
+  MappingConfig,
+  ReservedTraitsProperties,
+  ReservedCompanyProperties
+} = require("./config");
+const {
+  constructPayload,
+  removeUndefinedAndNullValues,
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  getFieldValueFromMessage,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  addExternalIdToTraits
+} = require("../../util");
+ 
+function getCompanyAttribute(company) {
+  const companiesList = [];
+  if (company.name || company.id) {
+    const customAttributes = {};
+    Object.keys(company).forEach(key => {
+      // the key is not in ReservedCompanyProperties
+      if (!ReservedCompanyProperties.includes(key)) {
+        const val = company[key];
+        if (val) {
+          customAttributes[key] = val;
+        }
+      }
+    });
+ 
+    companiesList.push({
+      company_id: company.id || md5(company.name),
+      custom_attributes: customAttributes,
+      name: company.name,
+      industry: company.industry
+    });
+  }
+  return companiesList;
+}
+ 
+function validateIdentify(message, payload) {
+  const finalPayload = payload;
+ 
+  finalPayload.update_last_request_at = true;
+  if (payload.user_id || payload.email) {
+    if (payload.name === undefined || payload.name === "") {
+      const firstName = getFieldValueFromMessage(message, "firstName");
+      const lastName = getFieldValueFromMessage(message, "lastName");
+      if (firstName && lastName) {
+        finalPayload.name = `${firstName} ${lastName}`;
+      } else {
+        finalPayload.name = firstName || lastName;
+      }
+    }
+ 
+    if (get(finalPayload, "custom_attributes.company")) {
+      finalPayload.companies = getCompanyAttribute(
+        finalPayload.custom_attributes.company
+      );
+    }
+ 
+    if (finalPayload.custom_attributes) {
+      ReservedTraitsProperties.forEach(trait => {
+        delete finalPayload.custom_attributes[trait];
+      });
+    }
+ 
+    return finalPayload;
+  }
+  throw new CustomError("Email or userId is mandatory", 400);
+}
+ 
+function validateTrack(message, payload) {
+  // pass only string, number, boolean properties
+  if (payload.user_id || payload.email) {
+    const metadata = {};
+    if (message.properties) {
+      Object.keys(message.properties).forEach(key => {
+        const val = message.properties[key];
+        if (val && typeof val !== "object" && !Array.isArray(val)) {
+          metadata[key] = val;
+        }
+      });
+    }
+    return { ...payload, metadata };
+  }
+  throw new CustomError("Email or userId is mandatory", 400);
+}
+ 
+function validateAndBuildResponse(message, payload, category, destination) {
+  const messageType = message.type.toLowerCase();
+  const response = defaultRequestConfig();
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      response.body.JSON = removeUndefinedAndNullValues(
+        validateIdentify(message, payload)
+      );
+      break;
+    case EventType.TRACK:
+      response.body.JSON = removeUndefinedAndNullValues(
+        validateTrack(message, payload)
+      );
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+ 
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = category.endpoint;
+  response.headers = {
+    "Content-Type": "application/json",
+    Authorization: `Bearer ${destination.Config.apiKey}`,
+    Accept: "application/json",
+    "Intercom-Version": "1.4"
+  };
+  response.userId = message.anonymousId;
+  return response;
+}
+ 
+function processSingleMessage(message, destination) {
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const { sendAnonymousId } = destination.Config;
+  const messageType = message.type.toLowerCase();
+  let category;
+ 
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      category = ConfigCategory.IDENTIFY;
+      break;
+    case EventType.TRACK:
+      category = ConfigCategory.TRACK;
+      break;
+    // case EventType.GROUP:
+    //   category = ConfigCategory.GROUP;
+    //   break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+ 
+  // build the response and return
+  let payload;
+  if (get(message, MappedToDestinationKey)) {
+    addExternalIdToTraits(message);
+    payload = getFieldValueFromMessage(message, "traits");
+  } else {
+    payload = constructPayload(message, MappingConfig[category.name]);
+  }
+  if (sendAnonymousId && !payload.user_id) {
+    payload.user_id = message.anonymousId;
+  }
+  return validateAndBuildResponse(message, payload, category, destination);
+}
+ 
+function process(event) {
+  let response;
+  try {
+    response = processSingleMessage(event.message, event.destination);
+  } catch (error) {
+    throw new CustomError(
+      error.message || "Unknown error",
+      error.status || 400
+    );
+  }
+  return response;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/iterable/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/iterable/config.js.html new file mode 100644 index 00000000000..7a980a05dd8 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/iterable/config.js.html @@ -0,0 +1,305 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/iterable/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/iterable config.js

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +761x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +1x +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_URL = "https://api.iterable.com/api/";
+ 
+const ConfigCategory = {
+  IDENTIFY_BROWSER: {
+    name: "IterableRegisterBrowserTokenConfig"
+  },
+  IDENTIFY_DEVICE: {
+    name: "IterableRegisterDeviceTokenConfig"
+  },
+  IDENTIFY: {
+    name: "IterableIdentifyConfig",
+    action: "identify",
+    actionDevice: "identifyDevice",
+    actionBrowser: "identifyBrowser",
+    endpoint: `${BASE_URL}users/update`,
+    endpointDevice: `${BASE_URL}users/registerDeviceToken`,
+    endpointBrowser: `${BASE_URL}users/registerBrowserToken`
+  },
+  PAGE: {
+    name: "IterablePageConfig",
+    action: "page",
+    endpoint: `${BASE_URL}events/track`
+  },
+  SCREEN: {
+    name: "IterablePageConfig",
+    action: "screen",
+    endpoint: `${BASE_URL}events/track`
+  },
+  TRACK: {
+    name: "IterableTrackConfig",
+    action: "track",
+    endpoint: `${BASE_URL}events/track`
+  },
+  TRACK_PURCHASE: {
+    name: "IterableTrackPurchaseConfig",
+    action: "trackPurchase",
+    endpoint: `${BASE_URL}commerce/trackPurchase`
+  },
+  PRODUCT: {
+    name: "IterableProductConfig",
+    action: "product",
+    endpoint: ""
+  },
+  UPDATE_CART: {
+    name: "IterableProductConfig",
+    action: "updateCart",
+    endpoint: `${BASE_URL}commerce/updateCart`
+  },
+  DEVICE: {
+    name: "IterableDeviceConfig",
+    action: "product",
+    endpoint: ""
+  },
+  ALIAS: {
+    name: "IterableAliasConfig",
+    action: "alias",
+    endpoint: `${BASE_URL}users/updateEmail`
+  }
+};
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+const IDENTIFY_MAX_BATCH_SIZE = 1000;
+const TRACK_MAX_BATCH_SIZE = 8000;
+const IDENTIFY_BATCH_ENDPOINT = "https://api.iterable.com/api/users/bulkUpdate";
+const TRACK_BATCH_ENDPOINT = "https://api.iterable.com/api/events/trackBulk";
+ 
+module.exports = {
+  ConfigCategory,
+  mappingConfig,
+  IDENTIFY_BATCH_ENDPOINT,
+  TRACK_BATCH_ENDPOINT,
+  IDENTIFY_MAX_BATCH_SIZE,
+  TRACK_MAX_BATCH_SIZE
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/iterable/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/iterable/index.html new file mode 100644 index 00000000000..16de31ea1e0 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/iterable/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/iterable + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/iterable

+
+ +
+ 92% + Statements + 230/250 +
+ + +
+ 76.67% + Branches + 115/150 +
+ + +
+ 100% + Functions + 14/14 +
+ + +
+ 92% + Lines + 230/250 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%9/9100%0/0100%0/0100%9/9
transform.js +
+
91.7%221/24176.67%115/150100%14/1491.7%221/241
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/iterable/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/iterable/transform.js.html new file mode 100644 index 00000000000..ea3eca310ca --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/iterable/transform.js.html @@ -0,0 +1,1682 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/iterable/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/iterable transform.js

+
+ +
+ 91.7% + Statements + 221/241 +
+ + +
+ 76.67% + Branches + 115/150 +
+ + +
+ 100% + Functions + 14/14 +
+ + +
+ 91.7% + Lines + 221/241 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +5351x +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +32x +1x +  +  +  +  +41x +41x +  +41x +  +3x +  +  +  +3x +  +  +  +3x +3x +2x +  +1x +  +3x +  +2x +  +  +  +2x +2x +  +  +11x +3x +  +11x +11x +11x +11x +10x +  +8x +3x +5x +  +  +  +  +2x +3x +  +  +  +1x +  +2x +  +6x +6x +1x +  +5x +  +6x +6x +1x +  +6x +1x +  +6x +  +4x +2x +2x +  +  +  +  +1x +1x +  +  +  +1x +  +  +  +4x +4x +1x +  +3x +  +4x +4x +1x +  +4x +1x +  +4x +  +3x +3x +3x +3x +1x +  +3x +1x +  +3x +  +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +2x +  +  +  +2x +2x +  +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +1x +  +1x +1x +  +1x +1x +  +1x +  +5x +  +  +  +5x +5x +5x +5x +5x +4x +8x +  +  +  +8x +6x +  +8x +8x +8x +8x +  +  +1x +  +  +  +1x +  +  +1x +1x +1x +1x +  +  +5x +5x +  +4x +2x +  +  +  +  +36x +  +  +  +36x +36x +36x +36x +31x +  +  +  +31x +  +  +  +5x +5x +  +5x +3x +3x +  +  +  +  +2x +2x +2x +  +  +  +  +  +  +5x +  +  +  +5x +  +  +  +37x +37x +  +37x +  +11x +11x +  +8x +8x +  +4x +4x +  +9x +9x +  +1x +1x +  +  +5x +5x +  +3x +  +9x +  +4x +4x +  +1x +  +36x +  +31x +  +  +  +  +  +5x +  +  +  +  +  +26x +  +  +  +37x +  +  +  +2x +  +  +2x +2x +2x +  +  +  +2x +2x +  +2x +  +  +2x +6x +6x +  +  +2x +1x +  +  +1x +  +  +1x +  +  +1x +  +  +2x +  +  +  +  +2x +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +7x +3x +4x +  +3x +  +  +1x +1x +  +1x +1x +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +1x +1x +  +7x +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +1x +1x +  +7x +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +1x +1x +1x +  +1x +  +1x +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const { EventType, MappedToDestinationKey } = require("../../../constants");
+const {
+  ConfigCategory,
+  mappingConfig,
+  IDENTIFY_BATCH_ENDPOINT,
+  TRACK_BATCH_ENDPOINT,
+  IDENTIFY_MAX_BATCH_SIZE,
+  TRACK_MAX_BATCH_SIZE
+} = require("./config");
+const {
+  removeUndefinedValues,
+  defaultPostRequestConfig,
+  defaultBatchRequestConfig,
+  defaultRequestConfig,
+  constructPayload,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  addExternalIdToTraits,
+  isAppleFamily
+} = require("../../util");
+const logger = require("../../../logger");
+ 
+function validateMandatoryField(payload) {
+  if (payload.email === undefined && payload.userId === undefined) {
+    throw new CustomError("userId or email is mandatory for this request", 400);
+  }
+}
+ 
+function constructPayloadItem(message, category, destination) {
+  const rawPayloadItemArr = [];
+  let rawPayload = {};
+ 
+  switch (category.action) {
+    case "identifyDevice":
+      rawPayload = constructPayload(
+        message,
+        mappingConfig[ConfigCategory.IDENTIFY_DEVICE.name]
+      );
+      rawPayload.device = constructPayload(
+        message,
+        mappingConfig[ConfigCategory.DEVICE.name]
+      );
+      rawPayload.preferUserId = true;
+      if (isAppleFamily(message.context.device.type)) {
+        rawPayload.device.platform = "APNS";
+      } else {
+        rawPayload.device.platform = "GCM";
+      }
+      break;
+    case "identifyBrowser":
+      rawPayload = constructPayload(
+        message,
+        mappingConfig[ConfigCategory.IDENTIFY_BROWSER.name]
+      );
+      validateMandatoryField(rawPayload);
+      break;
+    case "identify":
+      // If mapped to destination, Add externalId to traits
+      if (get(message, MappedToDestinationKey)) {
+        addExternalIdToTraits(message);
+      }
+      rawPayload = constructPayload(message, mappingConfig[category.name]);
+      rawPayload.preferUserId = true;
+      rawPayload.mergeNestedObjects = true;
+      validateMandatoryField(rawPayload);
+      break;
+    case "page":
+      if (destination.Config.trackAllPages) {
+        rawPayload = constructPayload(message, mappingConfig[category.name]);
+      } else if (
+        destination.Config.trackCategorisedPages &&
+        ((message.properties && message.properties.category) ||
+          message.category)
+      ) {
+        rawPayload = constructPayload(message, mappingConfig[category.name]);
+      } else if (
+        destination.Config.trackNamedPages &&
+        ((message.properties && message.properties.name) || message.name)
+      ) {
+        rawPayload = constructPayload(message, mappingConfig[category.name]);
+      } else {
+        throw new CustomError("Invalid page call", 400);
+      }
+      validateMandatoryField(rawPayload);
+      if (destination.Config.mapToSingleEvent) {
+        rawPayload.eventName = "Loaded a Page";
+      } else {
+        rawPayload.eventName += " page";
+      }
+      rawPayload.createdAt = new Date(rawPayload.createdAt).getTime();
+      if (rawPayload.campaignId) {
+        rawPayload.campaignId = parseInt(rawPayload.campaignId, 10);
+      }
+      if (rawPayload.templateId) {
+        rawPayload.templateId = parseInt(rawPayload.templateId, 10);
+      }
+      break;
+    case "screen":
+      if (destination.Config.trackAllPages) {
+        rawPayload = constructPayload(message, mappingConfig[category.name]);
+      } else if (
+        destination.Config.trackCategorisedPages &&
+        ((message.properties && message.properties.category) ||
+          message.category)
+      ) {
+        rawPayload = constructPayload(message, mappingConfig[category.name]);
+      } else Eif (
+        destination.Config.trackNamedPages &&
+        ((message.properties && message.properties.name) || message.name)
+      ) {
+        rawPayload = constructPayload(message, mappingConfig[category.name]);
+      } else {
+        throw new CustomError("Invalid screen call", 400);
+      }
+      validateMandatoryField(rawPayload);
+      if (destination.Config.mapToSingleEvent) {
+        rawPayload.eventName = "Loaded a Screen";
+      } else {
+        rawPayload.eventName += " screen";
+      }
+      rawPayload.createdAt = new Date(rawPayload.createdAt).getTime();
+      if (rawPayload.campaignId) {
+        rawPayload.campaignId = parseInt(rawPayload.campaignId, 10);
+      }
+      if (rawPayload.templateId) {
+        rawPayload.templateId = parseInt(rawPayload.templateId, 10);
+      }
+      break;
+    case "track":
+      rawPayload = constructPayload(message, mappingConfig[category.name]);
+      validateMandatoryField(rawPayload);
+      rawPayload.createdAt = new Date(rawPayload.createdAt).getTime();
+      if (rawPayload.campaignId) {
+        rawPayload.campaignId = parseInt(rawPayload.campaignId, 10);
+      }
+      if (rawPayload.templateId) {
+        rawPayload.templateId = parseInt(rawPayload.templateId, 10);
+      }
+      break;
+    case "trackPurchase":
+      rawPayload = constructPayload(message, mappingConfig[category.name]);
+      rawPayload.user = constructPayload(
+        message,
+        mappingConfig[ConfigCategory.IDENTIFY.name]
+      );
+      validateMandatoryField(rawPayload.user);
+      rawPayload.user.preferUserId = true;
+      rawPayload.user.mergeNestedObjects = true;
+      rawPayload.items = message.properties.products;
+      Eif (rawPayload.items) {
+        rawPayload.items.forEach(el => {
+          const element = constructPayload(
+            el,
+            mappingConfig[ConfigCategory.PRODUCT.name]
+          );
+          Eif (element.categories && typeof element.categories === "string") {
+            element.categories = element.categories.split(",");
+          }
+          element.price = parseFloat(element.price);
+          element.quantity = parseInt(element.quantity, 10);
+          const clone = { ...element };
+          rawPayloadItemArr.push(clone);
+        });
+      } else {
+        const element = constructPayload(
+          message.properties,
+          mappingConfig[ConfigCategory.PRODUCT.name]
+        );
+        if (element.categories && typeof element.categories === "string") {
+          element.categories = element.categories.split(",");
+        }
+        element.price = parseFloat(element.price);
+        element.quantity = parseInt(element.quantity, 10);
+        const clone = { ...element };
+        rawPayloadItemArr.push(clone);
+      }
+ 
+      rawPayload.items = rawPayloadItemArr;
+      rawPayload.createdAt = new Date(rawPayload.createdAt).getTime();
+      rawPayload.total = parseFloat(rawPayload.total);
+      Eif (rawPayload.id) {
+        rawPayload.id = rawPayload.id.toString();
+      }
+      Eif (rawPayload.campaignId) {
+        rawPayload.campaignId = parseInt(rawPayload.campaignId, 10);
+      }
+      Eif (rawPayload.templateId) {
+        rawPayload.templateId = parseInt(rawPayload.templateId, 10);
+      }
+      break;
+    case "updateCart":
+      rawPayload.user = constructPayload(
+        message,
+        mappingConfig[ConfigCategory.IDENTIFY.name]
+      );
+      validateMandatoryField(rawPayload.user);
+      rawPayload.user.preferUserId = true;
+      rawPayload.user.mergeNestedObjects = true;
+      rawPayload.items = message.properties.products;
+      if (rawPayload.items) {
+        rawPayload.items.forEach(el => {
+          const element = constructPayload(
+            el,
+            mappingConfig[ConfigCategory.PRODUCT.name]
+          );
+          if (element.categories && typeof element.categories === "string") {
+            element.categories = element.categories.split(",");
+          }
+          element.price = parseFloat(element.price);
+          element.quantity = parseInt(element.quantity, 10);
+          const clone = { ...element };
+          rawPayloadItemArr.push(clone);
+        });
+      } else {
+        const element = constructPayload(
+          message.properties,
+          mappingConfig[ConfigCategory.PRODUCT.name]
+        );
+        Iif (element.categories && typeof element.categories === "string") {
+          element.categories = element.categories.split(",");
+        }
+        element.price = parseFloat(element.price);
+        element.quantity = parseInt(element.quantity, 10);
+        const clone = { ...element };
+        rawPayloadItemArr.push(clone);
+      }
+ 
+      rawPayload.items = rawPayloadItemArr;
+      break;
+    case "alias":
+      rawPayload = constructPayload(message, mappingConfig[category.name]);
+      break;
+    default:
+      logger.debug("not supported type");
+  }
+ 
+  return removeUndefinedValues(rawPayload);
+}
+ 
+function responseBuilderSimple(message, category, destination) {
+  const response = defaultRequestConfig();
+  response.endpoint = category.endpoint;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.body.JSON = constructPayloadItem(message, category, destination);
+  response.headers = {
+    "Content-Type": "application/json",
+    api_key: destination.Config.apiKey
+  };
+  return response;
+}
+ 
+function responseBuilderSimpleForIdentify(message, category, destination) {
+  const response = defaultRequestConfig();
+  const { os, device } = message.context;
+ 
+  if (device) {
+    response.endpoint = category.endpointDevice;
+    response.body.JSON = constructPayloadItem(
+      message,
+      { ...category, action: category.actionDevice },
+      destination
+    );
+  } else Eif (os) {
+    response.endpoint = category.endpointBrowser;
+    response.body.JSON = constructPayloadItem(
+      message,
+      { ...category, action: category.actionBrowser },
+      destination
+    );
+  }
+ 
+  response.headers = {
+    "Content-Type": "application/json",
+    api_key: destination.Config.apiKey
+  };
+  return response;
+}
+ 
+function processSingleMessage(message, destination) {
+  const messageType = message.type.toLowerCase();
+  let category = {};
+  let event;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      category = ConfigCategory.IDENTIFY;
+      break;
+    case EventType.PAGE:
+      category = ConfigCategory.PAGE;
+      break;
+    case EventType.SCREEN:
+      category = ConfigCategory.SCREEN;
+      break;
+    case EventType.TRACK:
+      event = message.event.toLowerCase();
+      switch (event) {
+        case "order completed":
+          category = ConfigCategory.TRACK_PURCHASE;
+          break;
+        case "product added":
+        case "product removed":
+          category = ConfigCategory.UPDATE_CART;
+          break;
+        default:
+          category = ConfigCategory.TRACK;
+      }
+      break;
+    case EventType.ALIAS:
+      category = ConfigCategory.ALIAS;
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+  const response = responseBuilderSimple(message, category, destination);
+ 
+  if (
+    message.type === EventType.IDENTIFY &&
+    message.context &&
+    ((message.context.device && message.context.device.token) ||
+      (message.context.os && message.context.os.token))
+  ) {
+    return [
+      response,
+      responseBuilderSimpleForIdentify(message, category, destination)
+    ];
+  }
+ 
+  return response;
+}
+ 
+function process(event) {
+  return processSingleMessage(event.message, event.destination);
+}
+ 
+function batchEvents(arrayChunks) {
+  const batchedResponseList = [];
+ 
+  // list of chunks [ [..], [..] ]
+  arrayChunks.forEach(chunk => {
+    const batchResponseList = [];
+    const metadatas = [];
+ 
+    // extracting destination
+    // from the first event in a batch
+    const { destination } = chunk[0];
+    const { apiKey } = destination.Config;
+ 
+    let batchEventResponse = defaultBatchRequestConfig();
+ 
+    // Batch event into dest batch structure
+    chunk.forEach(ev => {
+      batchResponseList.push(get(ev, "message.body.JSON"));
+      metadatas.push(ev.metadata);
+    });
+    // batching into identify batch structure
+    if (chunk[0].message.endpoint.includes("/api/users")) {
+      batchEventResponse.batchedRequest.body.JSON = {
+        users: batchResponseList
+      };
+      batchEventResponse.batchedRequest.endpoint = IDENTIFY_BATCH_ENDPOINT;
+    } else {
+      // batching into track batch structure
+      batchEventResponse.batchedRequest.body.JSON = {
+        events: batchResponseList
+      };
+      batchEventResponse.batchedRequest.endpoint = TRACK_BATCH_ENDPOINT;
+    }
+ 
+    batchEventResponse.batchedRequest.headers = {
+      "Content-Type": "application/json",
+      api_key: apiKey
+    };
+ 
+    batchEventResponse = {
+      ...batchEventResponse,
+      metadata: metadatas,
+      destination
+    };
+    batchedResponseList.push(
+      getSuccessRespEvents(
+        batchEventResponse.batchedRequest,
+        batchEventResponse.metadata,
+        batchEventResponse.destination,
+        true
+      )
+    );
+  });
+ 
+  return batchedResponseList;
+}
+ 
+function getEventChunks(
+  event,
+  identifyEventChunks,
+  trackEventChunks,
+  eventResponseList
+) {
+  // Categorizing identify and track type of events
+  // Checking if it is identify type event
+  if (event.message.endpoint.includes("api/users/update")) {
+    identifyEventChunks.push(event);
+  } else if (event.message.endpoint.includes("api/events/track")) {
+    // Checking if it is track type of event
+    trackEventChunks.push(event);
+  } else {
+    // any other type of event
+    const { message, metadata, destination } = event;
+    const endpoint = get(message, "endpoint");
+ 
+    const batchedResponse = defaultBatchRequestConfig();
+    batchedResponse.batchedRequest.headers = message.headers;
+    batchedResponse.batchedRequest.endpoint = endpoint;
+    batchedResponse.batchedRequest.body = message.body;
+    batchedResponse.batchedRequest.params = message.params;
+    batchedResponse.batchedRequest.method =
+      defaultPostRequestConfig.requestMethod;
+    batchedResponse.metadata = [metadata];
+    batchedResponse.destination = destination;
+ 
+    eventResponseList.push(
+      getSuccessRespEvents(
+        batchedResponse.batchedRequest,
+        batchedResponse.metadata,
+        batchedResponse.destination
+      )
+    );
+  }
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  let identifyEventChunks = []; // list containing identify events in batched format
+  let trackEventChunks = []; // list containing track events in batched format
+  const eventResponseList = []; // list containing other events in batched format
+  const identifyArrayChunks = [];
+  const trackArrayChunks = [];
+  const errorRespList = [];
+  await Promise.all(
+    inputs.map(async (event, index) => {
+      try {
+        Iif (event.message.statusCode) {
+          // already transformed event
+          getEventChunks(
+            event,
+            identifyEventChunks,
+            trackEventChunks,
+            eventResponseList
+          );
+          // slice according to batch size
+          if (
+            identifyEventChunks.length &&
+            (identifyEventChunks.length >= IDENTIFY_MAX_BATCH_SIZE ||
+              index === inputs.length - 1)
+          ) {
+            identifyArrayChunks.push(identifyEventChunks);
+            identifyEventChunks = [];
+          }
+          if (
+            trackEventChunks.length &&
+            (trackEventChunks.length >= TRACK_MAX_BATCH_SIZE ||
+              index === inputs.length - 1)
+          ) {
+            trackArrayChunks.push(trackEventChunks);
+            trackEventChunks = [];
+          }
+        } else {
+          // if not transformed
+          getEventChunks(
+            {
+              message: await process(event),
+              metadata: event.metadata,
+              destination: event.destination
+            },
+            identifyEventChunks,
+            trackEventChunks,
+            eventResponseList
+          );
+ 
+          // slice according to batch size
+          if (
+            identifyEventChunks.length &&
+            (identifyEventChunks.length >= IDENTIFY_MAX_BATCH_SIZE ||
+              index === inputs.length - 1)
+          ) {
+            identifyArrayChunks.push(identifyEventChunks);
+            identifyEventChunks = [];
+          }
+          if (
+            trackEventChunks.length &&
+            (trackEventChunks.length >= TRACK_MAX_BATCH_SIZE ||
+              index === inputs.length - 1)
+          ) {
+            trackArrayChunks.push(trackEventChunks);
+            trackEventChunks = [];
+          }
+        }
+      } catch (error) {
+        errorRespList.push(
+          getErrorRespEvents(
+            [event.metadata],
+            error.response ? error.response.status : 400,
+            error.message || "Error occurred while processing payload."
+          )
+        );
+      }
+    })
+  );
+ 
+  // batching identifyArrayChunks
+  let identifyBatchedResponseList = [];
+  Eif (identifyArrayChunks.length) {
+    identifyBatchedResponseList = await batchEvents(identifyArrayChunks);
+  }
+  // batching TrackArrayChunks
+  let trackBatchedResponseList = [];
+  Eif (trackArrayChunks.length) {
+    trackBatchedResponseList = await batchEvents(trackArrayChunks);
+  }
+  let batchedResponseList = [];
+  // appending all kinds of batches
+  batchedResponseList = batchedResponseList
+    .concat(identifyBatchedResponseList)
+    .concat(trackBatchedResponseList)
+    .concat(eventResponseList);
+ 
+  return [...batchedResponseList, ...errorRespList];
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kafka/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kafka/index.html new file mode 100644 index 00000000000..11573b552b2 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kafka/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kafka + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/kafka

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%11/1150%1/2100%3/3100%11/11
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kafka/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kafka/transform.js.html new file mode 100644 index 00000000000..40d792ecaec --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kafka/transform.js.html @@ -0,0 +1,158 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kafka/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/kafka transform.js

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27  +1x +1x +1x +1x +4x +4x +  +1x +  +  +  +  +  +1x +  +  +  +5x +  +  +  +5x +  +  +1x + 
function batch(destEvents) {
+  const respList = [];
+  const batchedRequest = [];
+  const metadata = [];
+  destEvents.forEach(event => {
+    metadata.push(event.metadata);
+    batchedRequest.push(event.message);
+  });
+  respList.push({
+    batchedRequest,
+    metadata,
+    destination: destEvents[0].destination
+  });
+ 
+  return respList;
+}
+ 
+function process(event) {
+  const result = {
+    message: event.message,
+    userId: event.message.userId || event.message.anonymousId
+  };
+  return result;
+}
+ 
+module.exports = { process, batch };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/keen/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/keen/config.js.html new file mode 100644 index 00000000000..dca00e1428d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/keen/config.js.html @@ -0,0 +1,95 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/keen/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/keen config.js

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +61x +  +1x +  +  + 
const ENDPOINT = "https://api.keen.io/3.0/projects";
+ 
+module.exports = {
+  ENDPOINT
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/keen/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/keen/index.html new file mode 100644 index 00000000000..53b67fe5ee6 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/keen/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/keen + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/keen

+
+ +
+ 89.86% + Statements + 62/69 +
+ + +
+ 60.78% + Branches + 31/51 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 89.86% + Lines + 62/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%2/2100%0/0100%0/0100%2/2
transform.js +
+
89.55%60/6760.78%31/51100%7/789.55%60/67
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/keen/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/keen/transform.js.html new file mode 100644 index 00000000000..d5ed5ac0a9a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/keen/transform.js.html @@ -0,0 +1,644 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/keen/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/keen transform.js

+
+ +
+ 89.55% + Statements + 60/67 +
+ + +
+ 60.78% + Branches + 31/51 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 89.55% + Lines + 60/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189  +  +1x +1x +1x +  +  +  +  +  +  +  +  +1x +1x +  +  +4x +4x +4x +  +  +  +  +  +4x +4x +  +  +  +  +  +4x +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +4x +4x +4x +4x +4x +  +  +  +4x +4x +  +  +4x +  +  +  +4x +4x +4x +4x +  +  +  +  +4x +4x +  +  +  +  +4x +4x +  +  +4x +  +  +4x +  +4x +  +4x +4x +  +  +  +2x +2x +  +  +  +2x +  +2x +2x +  +  +2x +  +  +  +2x +  +2x +  +  +  +  +5x +5x +  +5x +  +2x +2x +  +2x +2x +  +1x +  +  +4x +4x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-param-reassign */
+/* eslint-disable no-nested-ternary */
+const isIp = require("is-ip");
+const validUrl = require("valid-url");
+const { EventType } = require("../../../constants");
+const {
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  getParsedIP,
+  getFieldValueFromMessage,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+const { ENDPOINT } = require("./config");
+ 
+function addAddons(properties, config) {
+  const addons = [];
+  Eif (config.ipAddon && properties.request_ip && isIp(properties.request_ip)) {
+    addons.push({
+      name: "keen:ip_to_geo",
+      input: { ip: "request_ip" },
+      output: "ip_geo_info"
+    });
+  }
+  Eif (config.uaAddon && properties.user_agent) {
+    addons.push({
+      name: "keen:ua_parser",
+      input: { ua_string: "user_agent" },
+      output: "parsed_user_agent"
+    });
+  }
+  Iif (config.urlAddon && properties.url && validUrl.isUri(properties.url)) {
+    addons.push({
+      name: "keen:url_parser",
+      input: { url: "url" },
+      output: "parsed_page_url"
+    });
+  }
+  // should check referrer ?
+  Iif (
+    config.referrerAddon &&
+    properties.referrer &&
+    properties.url &&
+    validUrl.isUri(properties.url)
+  ) {
+    addons.push({
+      name: "keen:referrer_parser",
+      input: {
+        referrer_url: "referrer",
+        page_url: "url"
+      },
+      output: "referrer_info"
+    });
+  }
+ 
+  properties.keen = {
+    addons
+  };
+}
+ 
+function buildResponse(eventName, message, destination) {
+  const endpoint = `${ENDPOINT}/${destination.Config.projectID}/events/${eventName}`;
+  const response = defaultRequestConfig();
+  response.endpoint = endpoint;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.headers = {
+    "Content-Type": "application/json",
+    Authorization: destination.Config.writeKey
+  };
+  response.userId = message.userId ? message.userId : message.anonymousId;
+  response.body.JSON = {
+    ...message.properties
+  };
+  return response;
+}
+ 
+function processTrack(message, destination) {
+  const eventName = message.event;
+  let { properties } = message;
+  const user = {};
+  user.userId = message.userId
+    ? message.userId !== ""
+      ? message.userId
+      : message.anonymousId
+    : message.anonymousId;
+  user.traits = getFieldValueFromMessage(message, "traits") || {};
+  properties = {
+    ...properties,
+    user
+  };
+  // add userid/anonymousid
+  properties.userId = message.userId;
+  properties.anonymousId = message.anonymousId;
+ 
+  // add ip from the message
+  properties.request_ip = getParsedIP(message);
+ 
+  // add user-agent
+  properties.user_agent = message.context.userAgent;
+ 
+  addAddons(properties, destination.Config);
+ 
+  message.properties = properties;
+  return buildResponse(eventName, message, destination);
+}
+ 
+function processPage(message, destination) {
+  const pageName = message.name;
+  const pageCategory = message.properties
+    ? message.properties.category
+    : undefined;
+ 
+  let eventName = "Loaded a Page";
+ 
+  Eif (pageName) {
+    eventName = `Viewed ${pageName} page`;
+  }
+ 
+  Iif (pageCategory && pageName) {
+    eventName = `Viewed ${pageCategory} ${pageName} page`;
+  }
+ 
+  message.event = eventName;
+ 
+  return processTrack(message, destination);
+}
+ 
+function process(event) {
+  let response;
+  const { message, destination } = event;
+  const messageType = message.type.toLowerCase();
+ 
+  switch (messageType) {
+    case EventType.PAGE:
+      response = processPage(message, destination);
+      break;
+    case EventType.TRACK:
+      response = processTrack(message, destination);
+      break;
+    default:
+      throw new CustomError("message type not supported", 400);
+  }
+ 
+  response.statusCode = 200;
+  return response;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kinesis/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kinesis/index.html new file mode 100644 index 00000000000..e59cb5ba8ac --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kinesis/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kinesis + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/kinesis

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%3/350%1/2100%1/1100%3/3
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kinesis/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kinesis/transform.js.html new file mode 100644 index 00000000000..a061f94c20c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kinesis/transform.js.html @@ -0,0 +1,107 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kinesis/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/kinesis transform.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 50% + Branches + 1/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10  +5x +  +  +  +5x +  +  +1x + 
function process(event) {
+  const result = {
+    message: event.message,
+    userId: event.message.userId || event.message.anonymousId
+  };
+  return result;
+}
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kissmetrics/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kissmetrics/config.js.html new file mode 100644 index 00000000000..45c5db96d9c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kissmetrics/config.js.html @@ -0,0 +1,119 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kissmetrics/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/kissmetrics config.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +1x +1x +  +1x +  +  +  +  +  +1x +  +  + 
const TRACK_ENDPOINT = "https://trk.kissmetrics.com/e";
+const IDENTIFY_ENDPOINT = "https://trk.kissmetrics.com/s";
+const ALIAS_ENDPOINT = "https://trk.kissmetrics.com/a";
+ 
+const ENDPOINT = {
+  TRACK: TRACK_ENDPOINT,
+  IDENTIFY: IDENTIFY_ENDPOINT,
+  ALIAS: ALIAS_ENDPOINT
+};
+ 
+module.exports = {
+  ENDPOINT
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kissmetrics/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kissmetrics/index.html new file mode 100644 index 00000000000..de74995be85 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kissmetrics/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kissmetrics + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/kissmetrics

+
+ +
+ 68.42% + Statements + 143/209 +
+ + +
+ 42.61% + Branches + 49/115 +
+ + +
+ 84.21% + Functions + 16/19 +
+ + +
+ 68.45% + Lines + 141/206 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%5/5100%0/0100%0/0100%5/5
transform.js +
+
67.65%138/20442.61%49/11584.21%16/1967.66%136/201
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kissmetrics/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kissmetrics/transform.js.html new file mode 100644 index 00000000000..11d531816bc --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kissmetrics/transform.js.html @@ -0,0 +1,1319 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kissmetrics/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/kissmetrics transform.js

+
+ +
+ 67.65% + Statements + 138/204 +
+ + +
+ 42.61% + Branches + 49/115 +
+ + +
+ 84.21% + Functions + 16/19 +
+ + +
+ 67.66% + Lines + 136/201 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +7x +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +7x +35x +35x +35x +  +  +35x +  +  +  +  +  +35x +  +  +  +  +  +35x +7x +7x +  +  +  +  +28x +28x +28x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +  +  +  +  +6x +6x +37x +  +37x +2x +2x +  +35x +  +  +6x +  +  +  +4x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +4x +  +  +4x +  +  +  +4x +  +  +  +10x +10x +10x +10x +10x +  +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +  +  +3x +3x +  +3x +  +  +3x +3x +3x +3x +  +3x +  +  +  +4x +4x +4x +4x +4x +4x +  +  +  +4x +4x +  +4x +4x +2x +  +  +4x +4x +1x +  +  +4x +  +4x +4x +2x +  +4x +2x +  +  +4x +4x +4x +4x +4x +  +4x +4x +4x +1x +2x +2x +2x +2x +  +2x +2x +  +  +4x +  +  +  +2x +2x +  +  +  +2x +  +2x +  +  +  +2x +  +  +  +2x +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +1x +  +1x +1x +1x +1x +1x +  +  +  +8x +  +  +8x +8x +  +8x +  +2x +2x +2x +2x +  +  +  +  +  +  +2x +2x +4x +4x +  +2x +  +3x +3x +3x +3x +  +1x +1x +1x +1x +  +  +  +  +8x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-plusplus */
+/* eslint-disable no-param-reassign */
+/* eslint-disable no-continue */
+/* eslint-disable no-prototype-builtins */
+/* eslint-disable no-restricted-syntax */
+/* eslint-disable no-restricted-globals */
+/* eslint-disable consistent-return */
+/* eslint-disable no-underscore-dangle */
+const is = require("is");
+const extend = require("@ndhoule/extend");
+const each = require("component-each");
+const { EventType } = require("../../../constants");
+const {
+  defaultGetRequestConfig,
+  defaultRequestConfig,
+  getFieldValueFromMessage,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+const { ENDPOINT } = require("./config");
+const logger = require("../../../logger");
+ 
+// source : https://github.com/segment-integrations/analytics.js-integration-kissmetrics/blob/master/lib/index.js
+function toUnixTimestamp(date) {
+  date = new Date(date);
+  return `${Math.floor(date.getTime() / 1000)}`;
+}
+ 
+// source : https://github.com/segment-integrations/analytics.js-integration-kissmetrics/blob/master/lib/index.js
+function flatten(target, opts) {
+  opts = opts || {};
+ 
+  const delimiter = opts.delimiter || ".";
+  let { maxDepth } = opts;
+  let currentDepth = 1;
+  const output = {};
+ 
+  function step(object, prev) {
+    for (const key in object) {
+      if (object.hasOwnProperty(key)) {
+        const value = object[key];
+        const isarray = opts.safe && is.array(value);
+        const type = Object.prototype.toString.call(value);
+        const isobject =
+          type === "[object Object]" || type === "[object Array]";
+        const arr = [];
+ 
+        const newKey = prev ? prev + delimiter + key : key;
+ 
+        if (!opts.maxDepth) {
+          maxDepth = currentDepth + 1;
+        }
+ 
+        for (const keys in value) {
+          if (value.hasOwnProperty(keys)) {
+            arr.push(keys);
+          }
+        }
+ 
+        if (!isarray && isobject && arr.length && currentDepth < maxDepth) {
+          ++currentDepth;
+          return step(value, newKey);
+        }
+ 
+        output[newKey] = value;
+      }
+    }
+  }
+ 
+  step(target);
+ 
+  return output;
+}
+ 
+// source : https://github.com/segment-integrations/analytics.js-integration-kissmetrics/blob/master/lib/index.js
+function clean(obj) {
+  let ret = {};
+ 
+  for (const k in obj) {
+    Eif (obj.hasOwnProperty(k)) {
+      const value = obj[k];
+      Iif (value === null || typeof value === "undefined") continue;
+ 
+      // convert date to unix
+      Iif (is.date(value)) {
+        ret[k] = toUnixTimestamp(value);
+        continue;
+      }
+ 
+      // leave boolean as is
+      Iif (is.bool(value)) {
+        ret[k] = value;
+        continue;
+      }
+ 
+      // leave  numbers as is
+      if (is.number(value)) {
+        ret[k] = value;
+        continue;
+      }
+ 
+      // convert non objects to strings
+      // console.log(value.toString());
+      Eif (value.toString() !== "[object Object]") {
+        ret[k] = value.toString();
+        continue;
+      }
+ 
+      // json
+      // must flatten including the name of the original trait/property
+      const nestedObj = {};
+      nestedObj[k] = value;
+      const flattenedObj = flatten(nestedObj, { safe: true });
+ 
+      // stringify arrays inside nested object to be consistent with top level behavior of arrays
+      for (const key in flattenedObj) {
+        if (is.array(flattenedObj[key])) {
+          flattenedObj[key] = flattenedObj[key].toString();
+        }
+      }
+ 
+      ret = extend(ret, flattenedObj);
+      delete ret[k];
+    }
+  }
+  return ret;
+}
+ 
+//  source : https://github.com/segment-integrations/analytics.js-integration-kissmetrics/blob/master/lib/index.js
+function prefix(event, properties) {
+  const prefixed = {};
+  each(properties, function(key, val) {
+    Iif (key === "Billing Amount") {
+      prefixed[key] = val;
+    } else if (key === "revenue") {
+      prefixed[`${event} - ${key}`] = val;
+      prefixed["Billing Amount"] = val;
+    } else {
+      prefixed[`${event}-${key}`] = val;
+    }
+  });
+  return prefixed;
+}
+ 
+function getCurrency(val) {
+  if (!val) return;
+  Eif (typeof val === "number") {
+    return val;
+  }
+  if (typeof val !== "string") {
+    return;
+  }
+ 
+  val = val.replace(/\$/g, "");
+  val = parseFloat(val);
+ 
+  if (!isNaN(val)) {
+    return val;
+  }
+}
+ 
+function getRevenue(properties, eventName) {
+  let { revenue } = properties;
+  const orderCompletedRegExp = /^[ _]?completed[ _]?order[ _]?|^[ _]?order[ _]?completed[ _]?$/i;
+ 
+  // it's always revenue, unless it's called during an order completion.
+  Iif (!revenue && eventName && eventName.match(orderCompletedRegExp)) {
+    revenue = properties.total;
+  }
+ 
+  return getCurrency(revenue);
+}
+ 
+function buildResponse(message, properties, endpoint) {
+  const response = defaultRequestConfig();
+  response.endpoint = endpoint;
+  response.method = defaultGetRequestConfig.requestMethod;
+  response.userId = message.userId ? message.userId : message.anonymousId;
+  response.params = {
+    ...properties
+  };
+  return response;
+}
+ 
+/* function track(message, destination) {
+  const apiKey = destination.Config.apiKey;
+  const eventName = message.event;
+  let properties = message.properties;
+  properties = {
+    ...properties
+  };
+  if (destination.Config.prefixProperties) {
+    properties = this.prefix("Page", properties);
+  }
+  properties._k = apiKey;
+  properties._p = message.userId ? message.userId : message.anonymousId;
+  properties._k = eventName;
+ 
+  return buildResponse(message, properties);
+} */
+ 
+function processIdentify(message, destination) {
+  const { apiKey } = destination.Config;
+  let properties = JSON.parse(
+    JSON.stringify(getFieldValueFromMessage(message, "traits") || {})
+  );
+  const timestamp = toUnixTimestamp(message.originalTimestamp);
+  const endpoint = ENDPOINT.IDENTIFY;
+ 
+  properties = clean(properties);
+  // console.log(JSON.stringify(properties));
+ 
+  properties._k = apiKey;
+  properties._p = message.userId ? message.userId : message.anonymousId;
+  properties._t = timestamp;
+  properties._d = 1;
+ 
+  return buildResponse(message, properties, endpoint);
+}
+ 
+function processTrack(message, destination) {
+  const { apiKey } = destination.Config;
+  const { event } = message;
+  const messageType = message.type.toLowerCase();
+  let properties = {};
+  Eif (message.properties) {
+    properties = JSON.parse(JSON.stringify(message.properties));
+  }
+ 
+  // TODO: Give priority to timestamp, then originalTimestam ?
+  const timestamp = toUnixTimestamp(message.originalTimestamp);
+  let endpoint = ENDPOINT.TRACK;
+ 
+  const revenue = getRevenue(properties);
+  if (revenue) {
+    properties.revenue = revenue;
+  }
+ 
+  const { products } = properties;
+  if (products) {
+    delete properties.products;
+  }
+ 
+  properties = clean(properties);
+ 
+  Eif (destination.Config.prefixProperties) {
+    if (messageType === EventType.TRACK) {
+      properties = prefix(event, properties);
+    }
+    if (messageType === EventType.PAGE) {
+      properties = prefix("Page", properties);
+    }
+  }
+  properties._k = apiKey;
+  properties._p = message.userId ? message.userId : message.anonymousId;
+  properties._n = event;
+  properties._t = timestamp;
+  properties._d = 1;
+ 
+  const trackList = [];
+  trackList.push(buildResponse(message, properties, endpoint));
+  if (products) {
+    products.forEach(product => {
+      let item = product;
+      Eif (destination.Config.prefixProperties) item = prefix(event, item);
+      item._k = apiKey;
+      item._p = message.userId ? message.userId : message.anonymousId;
+ 
+      endpoint = ENDPOINT.IDENTIFY;
+      trackList.push(buildResponse(message, item, endpoint));
+    });
+  }
+  return trackList;
+}
+ 
+function processPage(message, destination) {
+  const pageName = message.name;
+  const pageCategory = message.properties
+    ? message.properties.category
+    : undefined;
+ 
+  let eventName = "Loaded a Page";
+ 
+  Iif (pageName) {
+    eventName = `Viewed ${pageName} page`;
+  }
+ 
+  Iif (pageCategory && pageName) {
+    eventName = `Viewed ${pageCategory} ${pageName} page`;
+  }
+ 
+  message.event = eventName;
+ 
+  return processTrack(message, destination)[0];
+}
+ 
+function processScreen(message, destination) {
+  const screenName = message.name;
+  const screenCategory = message.properties
+    ? message.properties.category
+    : undefined;
+ 
+  let eventName = "Loaded a Screen";
+ 
+  if (screenName) {
+    eventName = `Viewed ${screenName} screen`;
+  }
+ 
+  if (screenCategory && screenName) {
+    eventName = `Viewed ${screenCategory} ${screenName} page`;
+  }
+ 
+  message.event = eventName;
+ 
+  return processTrack(message, destination)[0];
+}
+ 
+function processAlias(message, destination) {
+  const { previousId } = message;
+  const { userId } = message;
+  const { apiKey } = destination.Config;
+  const endpoint = ENDPOINT.ALIAS;
+ 
+  const properties = {};
+  properties._k = apiKey;
+  properties._p = previousId;
+  properties._n = userId;
+  return buildResponse(message, properties, endpoint);
+}
+ 
+function process(event) {
+  const respList = [];
+  let response;
+  let responses;
+  const { message, destination } = event;
+  const messageType = message.type.toLowerCase();
+ 
+  switch (messageType) {
+    case EventType.PAGE:
+      response = processPage(message, destination);
+      response.statusCode = 200;
+      respList.push(response);
+      break;
+    case EventType.SCREEN:
+      response = processScreen(message, destination);
+      response.statusCode = 200;
+      respList.push(response);
+      break;
+    case EventType.TRACK:
+      responses = processTrack(message, destination);
+      responses.forEach(element => {
+        element.statusCode = 200;
+        respList.push(element);
+      });
+      break;
+    case EventType.IDENTIFY:
+      response = processIdentify(message, destination);
+      response.statusCode = 200;
+      respList.push(response);
+      break;
+    case EventType.ALIAS:
+      response = processAlias(message, destination);
+      response.statusCode = 200;
+      respList.push(response);
+      break;
+    default:
+      logger.debug("Message type not supported");
+      throw new CustomError("Message type not supported", 400);
+  }
+  return respList;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/klaviyo/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/klaviyo/config.js.html new file mode 100644 index 00000000000..ce783bea08c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/klaviyo/config.js.html @@ -0,0 +1,296 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/klaviyo/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/klaviyo config.js

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +731x +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_ENDPOINT = "https://a.klaviyo.com";
+ 
+// TRACK and IDENTIFY DOCS: https://www.klaviyo.com/docs/http-api
+// LIST API [MEMBERSHIP/SUBSCRIBE] DOCS:https://www.klaviyo.com/docs/http-api
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { name: "KlaviyoIdentify", apiUrl: "/api/identify" },
+  SCREEN: { name: "KlaviyoTrack", apiUrl: "/api/track" },
+  TRACK: { name: "KlaviyoTrack", apiUrl: "/api/track" },
+  GROUP: { name: "KlaviyoGroup" },
+  STARTED_CHECKOUT: { name: "StartedCheckout" },
+  VIEWED_PRODUCT: { name: "ViewedProduct" },
+  ADDED_TO_CART: { name: "AddedToCart" },
+  ITEMS: { name: "Items" }
+};
+const ecomExclusionKeys = [
+  "name",
+  "product_id",
+  "sku",
+  "image_url",
+  "url",
+  "brand",
+  "price",
+  "compare_at_price",
+  "quantity",
+  "categories",
+  "products",
+  "product_names",
+  "order_id",
+  "value",
+  "checkout_url",
+  "item_names",
+  "items",
+  "checkout_url"
+];
+ 
+const ecomEvents = [
+  "product viewed",
+  "product clicked",
+  "product added",
+  "checkout started"
+];
+const eventNameMapping = {
+  "product viewed": "Viewed Product",
+  "product clicked": "Viewed Product",
+  "product added": "Added to Cart",
+  "checkout started": "Started Checkout"
+};
+const jsonNameMapping = {
+  "Viewed Product": "VIEWED_PRODUCT",
+  "Added to Cart": "ADDED_TO_CART",
+  "Started Checkout": "STARTED_CHECKOUT"
+};
+const LIST_CONF = {
+  SUBSCRIBE: "Subscribe",
+  MEMBERSHIP: "Membership"
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  BASE_ENDPOINT,
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG,
+  LIST_CONF,
+  ecomExclusionKeys,
+  ecomEvents,
+  eventNameMapping,
+  jsonNameMapping
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/klaviyo/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/klaviyo/index.html new file mode 100644 index 00000000000..711ab68f6ce --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/klaviyo/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/klaviyo + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/klaviyo

+
+ +
+ 87.27% + Statements + 144/165 +
+ + +
+ 66.67% + Branches + 52/78 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 87.27% + Lines + 144/165 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%10/10100%0/0100%0/0100%10/10
transform.js +
+
86.45%134/15566.67%52/78100%10/1086.45%134/155
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/klaviyo/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/klaviyo/transform.js.html new file mode 100644 index 00000000000..84c407f9220 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/klaviyo/transform.js.html @@ -0,0 +1,1322 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/klaviyo/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/klaviyo transform.js

+
+ +
+ 86.45% + Statements + 134/155 +
+ + +
+ 66.67% + Branches + 52/78 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 86.45% + Lines + 134/155 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415  +  +  +1x +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +4x +4x +4x +  +  +  +  +4x +  +  +  +  +4x +  +  +  +  +4x +2x +  +  +2x +2x +  +  +2x +  +  +  +4x +  +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +4x +4x +  +  +  +2x +2x +2x +  +  +  +  +  +  +  +2x +  +  +  +  +4x +4x +1x +1x +  +  +4x +  +  +  +  +4x +  +  +  +  +  +4x +4x +  +  +  +  +4x +  +  +  +4x +4x +4x +4x +4x +  +  +  +  +  +  +  +  +1x +6x +  +  +  +  +6x +  +  +  +  +  +6x +6x +  +1x +6x +6x +6x +6x +3x +3x +3x +3x +  +3x +3x +  +  +  +1x +  +  +  +  +2x +2x +  +  +  +  +  +2x +1x +1x +2x +  +  +  +2x +2x +2x +  +  +1x +  +  +1x +  +  +  +2x +2x +  +  +  +  +  +2x +  +  +  +  +  +  +2x +  +  +  +3x +3x +3x +1x +1x +  +3x +3x +  +  +  +3x +  +5x +  +  +5x +5x +5x +5x +5x +  +  +  +  +  +  +  +  +1x +1x +  +  +  +1x +  +1x +  +  +  +1x +  +  +  +  +  +1x +1x +  +  +  +1x +  +1x +  +  +1x +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +1x +1x +  +  +  +1x +  +  +1x +1x +1x +  +  +  +1x +12x +  +  +  +  +  +12x +  +  +  +12x +  +4x +4x +4x +  +  +6x +6x +5x +  +1x +1x +1x +  +1x +  +10x +  +  +1x +12x +10x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-nested-ternary */
+/* eslint-disable no-underscore-dangle */
+/* eslint-disable  array-callback-return */
+const get = require("get-value");
+const axios = require("axios");
+const logger = require("../../../logger");
+const {
+  EventType,
+  WhiteListedTraits,
+  MappedToDestinationKey
+} = require("../../../constants");
+const {
+  CONFIG_CATEGORIES,
+  BASE_ENDPOINT,
+  MAPPING_CONFIG,
+  LIST_CONF,
+  ecomExclusionKeys,
+  ecomEvents,
+  eventNameMapping,
+  jsonNameMapping
+} = require("./config");
+const {
+  defaultRequestConfig,
+  constructPayload,
+  getFieldValueFromMessage,
+  defaultGetRequestConfig,
+  defaultPostRequestConfig,
+  extractCustomFields,
+  removeUndefinedValues,
+  toUnixTimestamp,
+  removeUndefinedAndNullValues,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  isEmptyObject,
+  addExternalIdToTraits,
+  adduserIdFromExternalId
+} = require("../../util");
+ 
+// A sigle func to handle the addition of user to a list
+// from an identify call.
+// DOCS: https://www.klaviyo.com/docs/api/v2/lists
+const addUserToList = async (message, traitsInfo, conf, destination) => {
+  // Check if list Id is present in message properties, if yes override
+  let targetUrl = `${BASE_ENDPOINT}/api/v2/list/${destination.Config.listId}`;
+  Eif (get(traitsInfo.properties, "listId")) {
+    targetUrl = `${BASE_ENDPOINT}/api/v2/list/${get(
+      traitsInfo.properties,
+      "listId"
+    )}`;
+  }
+  let profile = {
+    id: getFieldValueFromMessage(message, "userId"),
+    email: getFieldValueFromMessage(message, "email"),
+    phone_number: getFieldValueFromMessage(message, "phone")
+  };
+  Iif (destination.Config.enforceEmailAsPrimary) {
+    delete profile.id;
+    profile._id = getFieldValueFromMessage(message, "userId");
+  }
+  // If func is called as membership func else subscribe func
+  if (conf === LIST_CONF.MEMBERSHIP) {
+    targetUrl = `${targetUrl}/members`;
+  } else {
+    // get consent statuses from message if availabe else from dest config
+    targetUrl = `${targetUrl}/subscribe`;
+    profile.sms_consent = get(traitsInfo.properties, "smsConsent")
+      ? get(traitsInfo.properties, "smsConsent")
+      : destination.Config.smsConsent;
+    profile.$consent = get(traitsInfo.properties, "consent")
+      ? get(traitsInfo.properties, "consent")
+      : destination.Config.consent;
+  }
+  profile = removeUndefinedValues(profile);
+  // send network request
+  try {
+    await axios.post(
+      targetUrl,
+      {
+        api_key: destination.Config.privateApiKey,
+        profiles: [profile]
+      },
+      {
+        headers: {
+          "Content-Type": "application/json"
+        }
+      }
+    );
+  } catch (err) {
+    logger.debug("[Klaviyo :: addToList]", err);
+  }
+};
+ 
+// ---------------------
+// Main Identify request handler func
+// internally it uses axios if membership and(or)
+// subscription is enabled for that user to
+// specific List.
+// DOCS: https://www.klaviyo.com/docs/http-api
+// ---------------------
+const identifyRequestHandler = async (message, category, destination) => {
+  // If listId property is present try to subscribe/member user in list
+  const traitsInfo = getFieldValueFromMessage(message, "traits");
+  if (
+    (!!destination.Config.listId || !!get(traitsInfo.properties, "listId")) &&
+    destination.Config.privateApiKey
+  ) {
+    await addUserToList(message, traitsInfo, LIST_CONF.MEMBERSHIP, destination);
+    Eif (get(traitsInfo.properties, "subscribe") === true) {
+      await addUserToList(
+        message,
+        traitsInfo,
+        LIST_CONF.SUBSCRIBE,
+        destination
+      );
+    }
+  } else {
+    logger.info(
+      `Cannot process list operation as listId is not available, either in message or config, or private key not present`
+    );
+  }
+ 
+  const mappedToDestination = get(message, MappedToDestinationKey);
+  if (mappedToDestination) {
+    addExternalIdToTraits(message);
+    adduserIdFromExternalId(message);
+  }
+  // actual identify call
+  let propertyPayload = constructPayload(
+    message,
+    MAPPING_CONFIG[category.name]
+  );
+  // Extract other K-V property from traits about user custom properties
+  propertyPayload = extractCustomFields(
+    message,
+    propertyPayload,
+    ["traits", "context.traits"],
+    WhiteListedTraits
+  );
+  propertyPayload = removeUndefinedAndNullValues(propertyPayload);
+  Iif (destination.Config.enforceEmailAsPrimary) {
+    delete propertyPayload.$id;
+    propertyPayload._id = getFieldValueFromMessage(message, "userId");
+  }
+ 
+  const payload = {
+    token: destination.Config.publicApiKey,
+    properties: propertyPayload
+  };
+  const encodedData = Buffer.from(JSON.stringify(payload)).toString("base64");
+  const response = defaultRequestConfig();
+  response.endpoint = `${BASE_ENDPOINT}${category.apiUrl}?data=${encodedData}`;
+  response.method = defaultGetRequestConfig.requestMethod;
+  return response;
+};
+ 
+// ----------------------
+// Main handler func for track request/screen request
+// User info needs to be mapped to a track event (mandatory)
+// DOCS: https://www.klaviyo.com/docs/http-api
+// ----------------------
+ 
+const createCustomerProperties = message => {
+  let customerProperties = constructPayload(
+    message,
+    MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY.name]
+  );
+  // Extract other K-V property from traits about user custom properties
+  customerProperties = extractCustomFields(
+    message,
+    customerProperties,
+    ["traits", "context.traits"],
+    WhiteListedTraits
+  );
+  customerProperties = removeUndefinedAndNullValues(customerProperties);
+  return customerProperties;
+};
+const trackRequestHandler = (message, category, destination) => {
+  let payload = {};
+  let event = get(message, "event");
+  event = event ? event.trim().toLowerCase() : event;
+  if (ecomEvents.includes(event) && message.properties) {
+    const eventName = eventNameMapping[event];
+    payload.event = eventName;
+    payload.token = destination.Config.publicApiKey;
+    const eventMap = jsonNameMapping[eventName];
+    // using identify to create customer properties
+    payload.customer_properties = createCustomerProperties(message);
+    if (
+      !payload.customer_properties.$email &&
+      !payload.customer_properties.$phone_number
+    ) {
+      throw new CustomError(
+        "email or phone is required for customer_properties",
+        400
+      );
+    }
+    const categ = CONFIG_CATEGORIES[eventMap];
+    payload.properties = constructPayload(
+      message.properties,
+      MAPPING_CONFIG[categ.name]
+    );
+ 
+    // products mapping using Items.json
+    if (message.properties.items && Array.isArray(message.properties.items)) {
+      const itemArr = [];
+      message.properties.items.forEach(key => {
+        let item = constructPayload(
+          key,
+          MAPPING_CONFIG[CONFIG_CATEGORIES.ITEMS.name]
+        );
+        item = removeUndefinedAndNullValues(item);
+        Eif (!isEmptyObject(item)) {
+          itemArr.push(item);
+        }
+      });
+      Iif (!payload.properties) {
+        payload.properties = {};
+      }
+      payload.properties.items = itemArr;
+    }
+ 
+    // all extra props passed is incorporated inside properties
+    let customProperties = {};
+    customProperties = extractCustomFields(
+      message,
+      customProperties,
+      ["properties"],
+      ecomExclusionKeys
+    );
+    Iif (!isEmptyObject(customProperties)) {
+      payload.properties = {
+        ...payload.properties,
+        ...customProperties
+      };
+    }
+ 
+    Iif (isEmptyObject(payload.properties)) {
+      delete payload.properties;
+    }
+  } else {
+    payload = constructPayload(message, MAPPING_CONFIG[category.name]);
+    payload.token = destination.Config.publicApiKey;
+    if (message.properties && message.properties.revenue) {
+      payload.properties.$value = message.properties.revenue;
+      delete payload.properties.revenue;
+    }
+    const customerProperties = createCustomerProperties(message);
+    Iif (destination.Config.enforceEmailAsPrimary) {
+      delete customerProperties.$id;
+      customerProperties._id = getFieldValueFromMessage(message, "userId");
+    }
+    payload.customer_properties = customerProperties;
+  }
+  Iif (message.timestamp) {
+    payload.time = toUnixTimestamp(message.timestamp);
+  }
+  const encodedData = Buffer.from(JSON.stringify(payload)).toString("base64");
+  const response = defaultRequestConfig();
+  response.endpoint = `${BASE_ENDPOINT}${category.apiUrl}?data=${encodedData}`;
+  response.method = defaultGetRequestConfig.requestMethod;
+  return response;
+};
+ 
+// ----------------------
+// Main handlerfunc for group request
+// we will map user to list (subscribe and/or member)
+// based on property sent
+// DOCS: https://www.klaviyo.com/docs/api/v2/lists
+// ----------------------
+const groupRequestHandler = async (message, category, destination) => {
+  const targetUrl = `${BASE_ENDPOINT}/api/v2/list/${get(
+    message,
+    "groupId"
+  )}/subscribe`;
+  let profile = constructPayload(message, MAPPING_CONFIG[category.name]);
+  // Extract other K-V property from traits about user custom properties
+  const groupWhitelistedTraits = [
+    ...WhiteListedTraits,
+    ...["consent", "smsConsent", "subscribe"]
+  ];
+  profile = extractCustomFields(
+    message,
+    profile,
+    ["traits", "context.traits"],
+    groupWhitelistedTraits
+  );
+  profile = removeUndefinedAndNullValues(profile);
+  Iif (destination.Config.enforceEmailAsPrimary) {
+    delete profile.$id;
+    profile._id = getFieldValueFromMessage(message, "userId");
+  }
+  Eif (get(message.traits, "subscribe") === true) {
+    // If consent info not present draw it from dest config
+    Iif (!profile.sms_consent) {
+      profile.sms_consent = destination.Config.smsConsent;
+    }
+    Iif (!profile.$consent) {
+      profile.$consent = destination.Config.consent;
+    }
+    // send network request
+    try {
+      await axios.post(
+        targetUrl,
+        {
+          api_key: destination.Config.privateApiKey,
+          profiles: [profile]
+        },
+        {
+          headers: {
+            "Content-Type": "application/json"
+          }
+        }
+      );
+    } catch (err) {
+      logger.debug("[Klaviyo :: groupRequestHandler (addToList)", err);
+    }
+  }
+  delete profile.sms_consent;
+  delete profile.$consent;
+  const payload = {
+    api_key: destination.Config.privateApiKey,
+    profiles: [profile]
+  };
+  const response = defaultRequestConfig();
+  response.endpoint = `${BASE_ENDPOINT}/api/v2/list/${get(
+    message,
+    "groupId"
+  )}/members`;
+  response.headers = {
+    "Content-Type": "application/json"
+  };
+  response.body.JSON = payload;
+  response.method = defaultPostRequestConfig.requestMethod;
+  return response;
+};
+ 
+// Main event processor using specific handler funcs
+const processEvent = async (message, destination) => {
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const messageType = message.type.toLowerCase();
+ 
+  let category;
+  let response;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      category = CONFIG_CATEGORIES.IDENTIFY;
+      response = await identifyRequestHandler(message, category, destination);
+      break;
+    case EventType.SCREEN:
+    case EventType.TRACK:
+      category = CONFIG_CATEGORIES.TRACK;
+      response = trackRequestHandler(message, category, destination);
+      break;
+    case EventType.GROUP:
+      category = CONFIG_CATEGORIES.GROUP;
+      response = await groupRequestHandler(message, category, destination);
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+  return response;
+};
+ 
+const process = async event => {
+  const result = await processEvent(event.message, event.destination);
+  return result;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/config.js.html new file mode 100644 index 00000000000..7f11bae6bfa --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/config.js.html @@ -0,0 +1,134 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kustomer/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/kustomer config.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +191x +  +1x +  +1x +  +  +  +  +  +  +1x +  +1x +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_ENDPOINT = "https://api.kustomerapp.com";
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { name: "KustomerIdentify" },
+  PAGE: { name: "KustomerPage" },
+  SCREEN: { name: "KustomerScreen" },
+  TRACK: { name: "KustomerTrack" }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  BASE_ENDPOINT,
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/index.html new file mode 100644 index 00000000000..faf15bec4b8 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kustomer + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/kustomer

+
+ +
+ 67.04% + Statements + 120/179 +
+ + +
+ 56.45% + Branches + 70/124 +
+ + +
+ 44.44% + Functions + 8/18 +
+ + +
+ 67.42% + Lines + 120/178 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%5/5100%0/0100%0/0100%5/5
transform.js +
+
89.11%90/10172.73%64/88100%6/689.11%90/101
util.js +
+
34.25%25/7316.67%6/3616.67%2/1234.72%25/72
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/transform.js.html new file mode 100644 index 00000000000..bd5e1b62c45 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/transform.js.html @@ -0,0 +1,941 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kustomer/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/kustomer transform.js

+
+ +
+ 89.11% + Statements + 90/101 +
+ + +
+ 72.73% + Branches + 64/88 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 89.11% + Lines + 90/101 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288  +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +1x +6x +  +  +  +  +6x +6x +6x +6x +  +6x +3x +  +  +6x +4x +  +  +  +  +  +  +  +6x +4x +  +  +  +  +  +  +  +6x +5x +  +  +  +  +  +  +6x +6x +  +5x +2x +  +3x +3x +  +  +  +  +5x +5x +  +  +  +  +  +  +  +  +6x +  +  +  +  +1x +14x +  +14x +  +  +  +  +  +  +  +  +  +  +14x +6x +6x +6x +6x +6x +1x +  +  +  +  +  +  +6x +4x +  +  +  +  +  +  +  +6x +5x +  +  +  +  +  +  +  +6x +4x +  +  +  +  +  +  +  +  +6x +4x +  +  +  +2x +  +6x +  +  +  +  +  +  +  +  +8x +8x +  +8x +  +3x +1x +  +3x +  +2x +1x +  +2x +  +8x +8x +  +  +8x +  +  +  +  +  +  +8x +  +  +  +  +  +  +14x +14x +14x +14x +  +  +14x +  +  +  +14x +14x +  +  +  +  +  +1x +14x +  +  +  +  +  +  +14x +  +6x +6x +  +3x +3x +  +2x +2x +  +3x +3x +  +  +  +14x +  +  +1x +14x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-nested-ternary */
+const get = require("get-value");
+const { EventType } = require("../../../constants");
+const {
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG,
+  BASE_ENDPOINT
+} = require("./config");
+const {
+  defaultRequestConfig,
+  getFieldValueFromMessage,
+  getDestinationExternalID,
+  constructPayload,
+  removeUndefinedAndNullValues,
+  defaultPostRequestConfig,
+  defaultPutRequestConfig,
+  getSuccessRespEvents,
+  getErrorRespEvents
+} = require("../../util");
+const {
+  fetchKustomer,
+  handleAdvancedtransformations,
+  CustomError
+} = require("./util");
+ 
+// Function responsible for constructing the Kustomer (User) Payload for identify
+// type of events.
+const constructKustomerPayload = (message, category, email) => {
+  const kustomerPayload = constructPayload(
+    message,
+    MAPPING_CONFIG[category.name]
+  );
+ 
+  const firstName = getFieldValueFromMessage(message, "firstName");
+  const lastName = getFieldValueFromMessage(message, "lastName");
+  const phone = getFieldValueFromMessage(message, "phone");
+  const url = getFieldValueFromMessage(message, "website");
+ 
+  if (!get(kustomerPayload, "name") && firstName && lastName) {
+    kustomerPayload.name = `${firstName} ${lastName}`;
+  }
+ 
+  if (!kustomerPayload.emails && email) {
+    kustomerPayload.emails = [
+      {
+        type: "home",
+        email
+      }
+    ];
+  }
+ 
+  if (!kustomerPayload.phones && phone) {
+    kustomerPayload.phones = [
+      {
+        type: "home",
+        phone
+      }
+    ];
+  }
+ 
+  if (url) {
+    kustomerPayload.urls = [
+      {
+        url
+      }
+    ];
+  }
+ 
+  const address = getFieldValueFromMessage(message, "address");
+  if (address) {
+    let addrStr;
+    if (typeof address === "string") {
+      addrStr = address;
+    } else {
+      const { street, city, state, postalCode } = address;
+      addrStr =
+        street || city || state || postalCode
+          ? `${street || ""} ${city || ""} ${state || ""} ${postalCode || ""}`
+          : addrStr;
+    }
+    Eif (typeof addrStr === "string") {
+      kustomerPayload.locations = [
+        {
+          type: "home",
+          address: addrStr
+        }
+      ];
+    }
+  }
+ 
+  return removeUndefinedAndNullValues(kustomerPayload);
+};
+ 
+// Main process function responsible for building payload for all
+// type of events.
+const responseBuilderSimple = async (message, category, destination) => {
+  let payload = {};
+  let targetUrl;
+  let storedState = {
+    userExists: false
+  };
+  // In case of identify type of event first extract the anonymousId, userId
+  // and search if any Kustomer is present in destination.
+  // If present update the same kustomer with the given payload.
+  // else create a new kustomer.
+  //-------------------------------------------------------------
+  // Get Kustomer: https://apidocs.kustomer.com/#ff41f372-6144-4c64-9712-662ee5ef1c33
+  // Create Kustomer: https://apidocs.kustomer.com/#07bd1072-4d4b-4875-b526-8369d711e811
+  // Update Kustomer: https://apidocs.kustomer.com/#077d653a-184e-4153-8133-d24b6427c1ae
+  if (message.type.toLowerCase() === EventType.IDENTIFY) {
+    const userEmail = getFieldValueFromMessage(message, "email");
+    const userId = getFieldValueFromMessage(message, "userIdOnly");
+    const anonymousId = get(message, "anonymousId");
+    const externalId = getDestinationExternalID(message, "kustomerId");
+    if (externalId) {
+      storedState = {
+        userExists: true,
+        targetUrl: `${BASE_ENDPOINT}/v1/customers/${externalId}?replace=false`
+      };
+    }
+    // If email exists we first search Kustomer with email if present then we mark it
+    // for update call.
+    if (!storedState.userExists && userEmail) {
+      storedState = await fetchKustomer(
+        `${BASE_ENDPOINT}/v1/customers/email=${userEmail}`,
+        destination
+      );
+    }
+    // If response.userExists flag is false
+    // If Kustomer has userId we search using userId as externalId if user
+    // is present or not. If yes then we mark it for update.
+    if (!storedState.userExists && userId) {
+      storedState = await fetchKustomer(
+        `${BASE_ENDPOINT}/v1/customers/externalId=${userId}`,
+        destination
+      );
+    }
+    // If response.userExists flag is still false
+    // and the Kustomer has anonymousId we search using anonymousId as externalId.
+    // If present we mark it for update
+    if (!storedState.userExists && anonymousId) {
+      storedState = await fetchKustomer(
+        `${BASE_ENDPOINT}/v1/customers/externalId=${get(
+          message,
+          "anonymousId"
+        )}`,
+        destination
+      );
+    }
+    // URL to use for creating new Kustomer
+    if (!storedState.userExists) {
+      targetUrl = `${BASE_ENDPOINT}/v1/customers`;
+    }
+    // URL to use for updating Kustomer
+    else {
+      targetUrl = storedState.targetUrl;
+    }
+    payload = constructKustomerPayload(message, category, userEmail);
+  }
+  // Section responsible for handling screen, page, and track type of
+  // events. An userId, or anonymous id of the user who is already
+  // identified is required for logging events into their timeline.
+  // -----------------------------------------------------------
+  // Ref: https://apidocs.kustomer.com/#fe1b29a6-7f3c-40a7-8f54-973ecd0335e8
+  // Ref: https://apidocs.kustomer.com/#0b0da19f-fca2-401d-af78-5d054c75a9b2
+  else {
+    targetUrl = `${BASE_ENDPOINT}/v1/tracking/identityEvent`;
+    let eventPayload = constructPayload(message, MAPPING_CONFIG[category.name]);
+    // eslint-disable-next-line default-case
+    switch (message.type.toLowerCase()) {
+      case EventType.PAGE:
+        if (destination.Config.genericPage) {
+          eventPayload.name = "Web-Page-Viewed";
+        }
+        break;
+      case EventType.SCREEN:
+        if (destination.Config.genericScreen) {
+          eventPayload.name = "Screen-Viewed";
+        }
+        break;
+    }
+    eventPayload = removeUndefinedAndNullValues(eventPayload);
+    Iif (destination.Config.advancedTransform) {
+      eventPayload = handleAdvancedtransformations(eventPayload);
+    }
+    payload = {
+      identity: {
+        externalId: getFieldValueFromMessage(message, "userId")
+      },
+      event: eventPayload
+    };
+    // handle email for track calls
+    Iif (destination.Config.setIdentityEmail) {
+      payload.identity.email = getFieldValueFromMessage(message, "email");
+      if (destination.Config.disableEmailAsTrackingProperty) {
+        delete payload.event.meta.email;
+      }
+    }
+  }
+  Eif (payload) {
+    const response = defaultRequestConfig();
+    response.endpoint = targetUrl;
+    response.method = storedState.userExists
+      ? defaultPutRequestConfig.requestMethod
+      : defaultPostRequestConfig.requestMethod;
+    response.headers = {
+      "Content-Type": "application/json",
+      Authorization: `Bearer ${destination.Config.apiKey}`
+    };
+    response.body.JSON = { ...payload };
+    return response;
+  }
+  // fail-safety for developer error
+  throw new CustomError("[Kustomer] :: Payload could not be constructed", 400);
+};
+ 
+const processEvent = (message, destination) => {
+  Iif (!message.type) {
+    throw CustomError(
+      "[Kustomer] :: Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  let category;
+  switch (message.type.toLowerCase()) {
+    case EventType.IDENTIFY:
+      category = CONFIG_CATEGORIES.IDENTIFY;
+      break;
+    case EventType.PAGE:
+      category = CONFIG_CATEGORIES.PAGE;
+      break;
+    case EventType.SCREEN:
+      category = CONFIG_CATEGORIES.SCREEN;
+      break;
+    case EventType.TRACK:
+      category = CONFIG_CATEGORIES.TRACK;
+      break;
+    default:
+      throw new CustomError("[Kustomer] :: Message type not supported", 400);
+  }
+  return responseBuilderSimple(message, category, destination);
+};
+ 
+const process = event => {
+  return processEvent(event.message, event.destination);
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/util.js.html new file mode 100644 index 00000000000..0fa4d0e13df --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/kustomer/util.js.html @@ -0,0 +1,551 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/kustomer/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/kustomer util.js

+
+ +
+ 34.25% + Statements + 25/73 +
+ + +
+ 16.67% + Branches + 6/36 +
+ + +
+ 16.67% + Functions + 2/12 +
+ + +
+ 34.72% + Lines + 25/72 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158  +1x +1x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +13x +13x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +12x +  +  +  +  +  +  +  +  +1x +  +13x +13x +  +  +  +  +  +  +  +  +  +  +13x +  +  +1x +  +  +  +  + 
/* eslint-disable eqeqeq */
+const axios = require("axios");
+const _ = require("lodash");
+const set = require("set-value");
+const get = require("get-value");
+const { BASE_ENDPOINT } = require("./config");
+const { getType, isDefinedAndNotNull, isObject } = require("../../util");
+ 
+/**
+ * RegExp to test a string for a ISO 8601 Date spec
+ *  YYYY
+ *  YYYY-MM
+ *  YYYY-MM-DD
+ *  YYYY-MM-DDThh:mmTZD
+ *  YYYY-MM-DDThh:mm:ssTZD
+ *  YYYY-MM-DDThh:mm:ss.sTZD
+ * @see: https://www.w3.org/TR/NOTE-datetime
+ * @type {RegExp}
+ */
+const ISO_8601 = /^\d{4}(-\d\d(-\d\d(T\d\d:\d\d(:\d\d)?(\.\d+)?(([+-]\d\d:\d\d)|Z)?)?)?)?$/i;
+ 
+class CustomError extends Error {
+  constructor(message, statusCode) {
+    super(message);
+    this.response = { status: statusCode };
+  }
+}
+ 
+// Handles for Number type fields
+const transformNumberField = fieldName => {
+  const typeDelim = "";
+  const transformedFieldName = fieldName.trim().replace(/\s+/g, "-");
+  if (_.endsWith(transformedFieldName, "Num")) {
+    return transformedFieldName;
+  }
+  return `${transformedFieldName}${typeDelim}Num`;
+};
+// handles for Date type fields
+const transformDateField = fieldName => {
+  const typeDelim = "";
+  const transformedFieldName = fieldName.trim().replace(/\s+/g, "-");
+  if (_.endsWith(transformedFieldName, "At")) {
+    return transformedFieldName;
+  }
+  return `${transformedFieldName}${typeDelim}At`;
+};
+// handle boolen values
+const transformBooleanValue = value => {
+  const transformedFieldValue = `${value}`;
+  return transformedFieldValue;
+};
+// handle array values
+const transformArrayValue = arrValue => {
+  const transformedArrayValue = arrValue.map(x => JSON.stringify(x)).join(",");
+  return transformedArrayValue;
+};
+// handle object value
+const transformedObjectValue = objValue => {
+  const transformedObjectVal = JSON.stringify(objValue);
+  return transformedObjectVal;
+};
+// handles other type fields
+const transformField = fieldName => {
+  const transformedFieldName = fieldName.trim().replace(/\s+/g, "-");
+  return transformedFieldName;
+};
+ 
+const handleAdvancedtransformations = event => {
+  let cloneEvent = _.cloneDeep(event);
+  const transformedMeta = {};
+  let eventName = get(cloneEvent, "name");
+  const { meta } = cloneEvent;
+ 
+  // Handles event name
+  // This will handle for event names = "Order Completed", "  Order Completed ", "Order   Completed" etc
+  if (isDefinedAndNotNull(eventName)) {
+    eventName = eventName.trim().replace(/\s+/g, "-");
+    cloneEvent = set(cloneEvent, "name", eventName);
+  }
+ 
+  if (isDefinedAndNotNull(meta) && isObject(meta)) {
+    Object.keys(meta).forEach(propKey => {
+      if (getType(meta[propKey]) == "number") {
+        transformedMeta[transformNumberField(propKey)] = meta[propKey];
+      } else if (ISO_8601.test(meta[propKey])) {
+        transformedMeta[transformDateField(propKey)] = meta[propKey];
+      } else if (getType(meta[propKey]) == "boolean") {
+        transformedMeta[transformField(propKey)] = transformBooleanValue(
+          meta[propKey]
+        );
+      } else if (getType(meta[propKey]) == "array") {
+        transformedMeta[transformField(propKey)] = transformArrayValue(
+          meta[propKey]
+        );
+      } else if (getType(meta[propKey]) == "object") {
+        transformedMeta[transformField(propKey)] = transformedObjectValue(
+          meta[propKey]
+        );
+      } else {
+        transformedMeta[transformField(propKey)] = meta[propKey];
+      }
+    });
+  }
+ 
+  cloneEvent = set(cloneEvent, "meta", transformedMeta);
+ 
+  return cloneEvent;
+};
+ 
+const handleResponse = response => {
+  const { status, data } = response;
+  switch (status) {
+    case 200:
+      Eif (data && data.data && data.data.id) {
+        return {
+          userExists: true,
+          targetUrl: `${BASE_ENDPOINT}/v1/customers/${data.data.id}?replace=false`
+        };
+      }
+      throw new CustomError(
+        `Error while lookingUp Kustomer ${
+          data.data ? JSON.stringify(data.data) : ""
+        }`,
+        400
+      );
+    case 404:
+      return { userExists: false };
+    default:
+      throw new CustomError(
+        data ? JSON.stringify(data) : "Error while lookingUp Kustomer",
+        status || 400
+      );
+  }
+};
+ 
+const fetchKustomer = async (url, destination) => {
+  let response;
+  try {
+    response = await axios.get(url, {
+      headers: {
+        Authorization: `Bearer ${destination.Config.apiKey}`
+      }
+    });
+  } catch (err) {
+    if (err.response) {
+      return handleResponse(err.response);
+    }
+    throw new CustomError(err.message, 400);
+  }
+  return handleResponse(response);
+};
+ 
+module.exports = {
+  fetchKustomer,
+  handleAdvancedtransformations,
+  CustomError
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/leanplum/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/leanplum/config.js.html new file mode 100644 index 00000000000..cbc65d6e9d3 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/leanplum/config.js.html @@ -0,0 +1,188 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/leanplum/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/leanplum config.js

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +371x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +1x +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ConfigCategory = {
+  PAGE: {
+    name: "LPPageConfig",
+    action: "advance"
+  },
+  IDENTIFY: {
+    name: "LPIdentifyConfig",
+    action: "setUserAttributes"
+  },
+  TRACK: {
+    name: "LPTrackConfig",
+    action: "track"
+  },
+  SCREEN: {
+    name: "LPScreenConfig",
+    action: "advance"
+  },
+  START: {
+    name: "LPStartConfig",
+    action: "start"
+  }
+};
+ 
+const ENDPOINT = "https://api.leanplum.com/api";
+const API_VERSION = "1.0.6";
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+module.exports = {
+  ConfigCategory,
+  mappingConfig,
+  ENDPOINT,
+  API_VERSION
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/leanplum/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/leanplum/index.html new file mode 100644 index 00000000000..2121c73f5bf --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/leanplum/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/leanplum + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/leanplum

+
+ +
+ 89.06% + Statements + 57/64 +
+ + +
+ 57.58% + Branches + 19/33 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 89.06% + Lines + 57/64 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%6/6100%0/0100%0/0100%6/6
transform.js +
+
87.93%51/5857.58%19/33100%7/787.93%51/58
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/leanplum/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/leanplum/transform.js.html new file mode 100644 index 00000000000..df8abe72ac6 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/leanplum/transform.js.html @@ -0,0 +1,557 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/leanplum/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/leanplum transform.js

+
+ +
+ 87.93% + Statements + 51/58 +
+ + +
+ 57.58% + Branches + 19/33 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 87.93% + Lines + 51/58 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +1601x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +29x +29x +  +  +  +  +  +  +27x +  +  +  +27x +27x +  +  +  +  +27x +1x +1x +  +27x +27x +27x +  +  +27x +  +  +  +29x +29x +29x +29x +  +  +29x +29x +27x +  +  +  +27x +  +  +  +13x +  +  +  +16x +  +  +  +  +  +16x +  +  +16x +  +2x +2x +  +1x +1x +  +2x +2x +  +11x +11x +  +  +  +  +  +16x +  +  +14x +13x +  +  +1x +  +  +  +  +16x +16x +  +2x +  +  +  +  +14x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const { EventType } = require("../../../constants");
+const {
+  ConfigCategory,
+  mappingConfig,
+  ENDPOINT,
+  API_VERSION
+} = require("./config");
+const {
+  removeUndefinedValues,
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  constructPayload,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+function preparePayload(message, name, destination) {
+  const mappingJson = mappingConfig[name];
+  const rawPayload = {
+    appId: destination.Config.applicationId,
+    clientKey: destination.Config.clientKey,
+    apiVersion: API_VERSION,
+    ...constructPayload(message, mappingJson)
+  };
+ 
+  Iif (rawPayload.newUserId === "") {
+    delete rawPayload.newUserId;
+  }
+ 
+  Eif (destination.Config.isDevelop) {
+    rawPayload.devMode = true;
+  }
+ 
+  // special case for "created", "time"
+  // ideally we should add data type field in the json and handle it
+  if (rawPayload.created) {
+    const created = Math.round(new Date(rawPayload.created).getTime() / 1000);
+    rawPayload.created = created;
+  }
+  Eif (rawPayload.time) {
+    const time = Math.round(new Date(rawPayload.time).getTime() / 1000);
+    rawPayload.time = time;
+  }
+ 
+  return removeUndefinedValues(rawPayload);
+}
+ 
+function responseBuilderSimple(message, category, destination) {
+  const response = defaultRequestConfig();
+  response.endpoint = ENDPOINT;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.headers = {
+    "Content-Type": "application/json"
+  };
+  response.userId = message.anonymousId;
+  response.body.JSON = preparePayload(message, category.name, destination);
+  response.params = {
+    action: category.action
+  };
+ 
+  return response;
+}
+ 
+function startSession(message, destination) {
+  return responseBuilderSimple(message, ConfigCategory.START, destination);
+}
+ 
+function processSingleMessage(message, destination) {
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const messageType = message.type.toLowerCase();
+  let category;
+ 
+  switch (messageType) {
+    case EventType.PAGE:
+      category = ConfigCategory.PAGE;
+      break;
+    case EventType.IDENTIFY:
+      category = ConfigCategory.IDENTIFY;
+      break;
+    case EventType.TRACK:
+      category = ConfigCategory.TRACK;
+      break;
+    case EventType.SCREEN:
+      category = ConfigCategory.SCREEN;
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+ 
+  // build the response
+  const response = responseBuilderSimple(message, category, destination);
+ 
+  // all event types except idetify requires startSession
+  if (messageType !== EventType.IDENTIFY) {
+    return [startSession(message, destination), response];
+  }
+ 
+  return response;
+}
+ 
+function process(event) {
+  let response;
+  try {
+    response = processSingleMessage(event.message, event.destination);
+  } catch (error) {
+    throw new CustomError(
+      error.message || "Unknown error",
+      error.status || 400
+    );
+  }
+  return response;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/mailchimp/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/mailchimp/config.js.html new file mode 100644 index 00000000000..2b157580178 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/mailchimp/config.js.html @@ -0,0 +1,173 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/mailchimp/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/mailchimp config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +321x +28x +28x +28x +  +  +1x +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  + 
const getEndpoint = (dataCenterId, audienceId) => {
+  const mailChimpApi = "api.mailchimp.com";
+  const listsUrl = `https://${dataCenterId}.${mailChimpApi}/3.0/lists`;
+  return `${listsUrl}/${audienceId}`;
+};
+ 
+const destinationConfigKeys = {
+  apiKey: "apiKey",
+  audienceId: "audienceId",
+  dataCenterId: "datacenterId"
+};
+ 
+const subscriptionStatus = {
+  subscribed: "subscribed",
+  pending: "pending"
+};
+ 
+const validStatuses = [
+  "subscribed",
+  "unsubscribed",
+  "cleaned",
+  "pending",
+  "transactional"
+];
+ 
+module.exports = {
+  getEndpoint,
+  destinationConfigKeys,
+  subscriptionStatus,
+  validStatuses
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/mailchimp/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/mailchimp/index.html new file mode 100644 index 00000000000..4b37e18a0a6 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/mailchimp/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/mailchimp + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/mailchimp

+
+ +
+ 90.84% + Statements + 119/131 +
+ + +
+ 70.49% + Branches + 43/61 +
+ + +
+ 100% + Functions + 20/20 +
+ + +
+ 90.84% + Lines + 119/131 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%1/1100%8/8
transform.js +
+
90.24%111/12370.49%43/61100%19/1990.24%111/123
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/mailchimp/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/mailchimp/transform.js.html new file mode 100644 index 00000000000..a14401fb969 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/mailchimp/transform.js.html @@ -0,0 +1,962 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/mailchimp/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/mailchimp transform.js

+
+ +
+ 90.24% + Statements + 111/123 +
+ + +
+ 70.49% + Branches + 43/61 +
+ + +
+ 100% + Functions + 19/19 +
+ + +
+ 90.24% + Lines + 111/123 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +2951x +1x +1x +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +13x +13x +13x +7x +  +6x +  +  +  +28x +  +  +  +17x +  +  +17x +17x +  +17x +17x +17x +  +  +  +  +  +13x +  +4x +  +17x +  +  +  +  +2x +2x +2x +  +  +  +  +  +  +1x +  +  +  +  +1x +  +  +  +2x +  +  +  +  +7x +7x +  +  +  +9x +9x +  +9x +9x +7x +7x +  +2x +2x +  +9x +9x +  +  +9x +1x +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +3x +3x +3x +3x +3x +  +  +  +  +3x +6x +3x +3x +2x +2x +  +  +3x +  +  +5x +5x +5x +5x +  +5x +16x +5x +  +11x +11x +  +  +  +5x +2x +1x +  +  +  +4x +  +  +  +  +  +11x +11x +2x +2x +  +  +9x +  +9x +  +  +  +9x +9x +1x +  +  +8x +  +8x +  +  +  +  +  +  +7x +  +  +  +11x +11x +11x +35x +  +11x +11x +  +11x +11x +  +11x +11x +  +2x +  +2x +  +  +  +  +  +  +11x +11x +  +  +  +  +  +11x +  +  +  +11x +11x +9x +  +  +  +12x +1x +  +  +11x +  +  +  +12x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const axios = require("axios");
+const md5 = require("md5");
+const { EventType, MappedToDestinationKey } = require("../../../constants");
+const {
+  getEndpoint,
+  destinationConfigKeys,
+  subscriptionStatus,
+  validStatuses
+} = require("./config");
+const {
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  defaultPutRequestConfig,
+  getFieldValueFromMessage,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  addExternalIdToTraits
+} = require("../../util");
+const logger = require("../../../logger");
+ 
+// Converts to upper case and removes spaces
+function filterTagValue(tag) {
+  const maxLength = 10;
+  const newTag = tag.replace(/[^\w\s]/gi, "");
+  if (newTag.length > maxLength) {
+    return newTag.slice(0, 10);
+  }
+  return newTag.toUpperCase();
+}
+ 
+function getMailChimpEndpoint(mailChimpConfig) {
+  return getEndpoint(mailChimpConfig.dataCenterId, mailChimpConfig.audienceId);
+}
+ 
+async function checkIfMailExists(mailChimpConfig, email) {
+  Iif (!email) {
+    return false;
+  }
+  const hash = md5(email);
+  const url = `${getMailChimpEndpoint(mailChimpConfig)}/members/${hash}`;
+ 
+  let status = false;
+  try {
+    await axios.get(url, {
+      auth: {
+        username: "apiKey",
+        password: `${mailChimpConfig.apiKey}`
+      }
+    });
+    status = true;
+  } catch (error) {
+    logger.error("axios error");
+  }
+  return status;
+}
+ 
+async function checkIfDoubleOptIn(mailChimpConfig) {
+  let response;
+  const url = `${getMailChimpEndpoint(mailChimpConfig)}`;
+  try {
+    response = await axios.get(url, {
+      auth: {
+        username: "apiKey",
+        password: `${mailChimpConfig.apiKey}`
+      }
+    });
+  } catch (error) {
+    throw new CustomError(
+      "User does not have access to the requested operation",
+      error.status || 400
+    );
+  }
+  return !!response.data.double_optin;
+}
+// New User - make a post request to create the user with the userObj and api key
+function getSubscribeUserUrl(mailChimpConfig) {
+  return `${getMailChimpEndpoint(mailChimpConfig)}/members`;
+}
+ 
+// Existing user - make a put request to create the user with the userObj and api key
+function getUpdateUserTraitsUrl(mailChimpConfig, email) {
+  const hash = md5(email);
+  return `${getMailChimpEndpoint(mailChimpConfig)}/members/${hash}`;
+}
+ 
+async function responseBuilderSimple(payload, message, mailChimpConfig) {
+  const email = getFieldValueFromMessage(message, "email");
+  const emailExists = await checkIfMailExists(mailChimpConfig, email);
+ 
+  const response = defaultRequestConfig();
+  if (emailExists) {
+    response.endpoint = getUpdateUserTraitsUrl(mailChimpConfig, email);
+    response.method = defaultPutRequestConfig.requestMethod;
+  } else {
+    response.endpoint = getSubscribeUserUrl(mailChimpConfig);
+    response.method = defaultPostRequestConfig.requestMethod;
+  }
+  response.body.JSON = payload;
+  const basicAuth = Buffer.from(`apiKey:${mailChimpConfig.apiKey}`).toString(
+    "base64"
+  );
+  if (payload.status && !validStatuses.includes(payload.status)) {
+    throw new CustomError(
+      "The status must be one of [subscribed, unsubscribed, cleaned, pending, transactional]",
+      400
+    );
+  }
+  return {
+    ...response,
+    headers: {
+      "Content-Type": "application/json",
+      Authorization: `Basic ${basicAuth}`
+    },
+    userId: message.userId ? message.userId : message.anonymousId
+  };
+}
+ 
+async function getPayload(
+  traits,
+  updateSubscription,
+  message,
+  emailExists,
+  mailChimpConfig
+) {
+  if (updateSubscription !== undefined && emailExists) {
+    const rawPayload = {};
+    rawPayload.merge_fields = {};
+    Object.keys(message.integrations.MailChimp).forEach(field => {
+      Eif (field === "subscriptionStatus") {
+        rawPayload.status = message.integrations.MailChimp[field];
+      } else {
+        rawPayload[field] = message.integrations.MailChimp[field];
+      }
+    });
+    Object.keys(traits).forEach(trait => {
+      if (trait === "email") {
+        rawPayload.email_address = traits[trait];
+      } else if (mailChimpConfig.enableMergeFields) {
+        const tag = filterTagValue(trait);
+        rawPayload.merge_fields[tag] = traits[trait];
+      }
+    });
+    return rawPayload;
+  }
+ 
+  const email = getFieldValueFromMessage(message, "email");
+  Eif (email) {
+    const rawPayload = {};
+    rawPayload.merge_fields = {};
+ 
+    Object.keys(traits).forEach(trait => {
+      if (trait === "email") {
+        rawPayload.email_address = traits[trait];
+      } else {
+        const tag = filterTagValue(trait);
+        rawPayload.merge_fields[tag] = traits[trait];
+      }
+    });
+    // given email does not exist in the list
+    if (!emailExists) {
+      const isDoubleOptin = await checkIfDoubleOptIn(mailChimpConfig);
+      rawPayload.status = isDoubleOptin
+        ? subscriptionStatus.pending
+        : subscriptionStatus.subscribed;
+    }
+    return rawPayload;
+  }
+  return null;
+}
+ 
+async function getTransformedJSON(message, mailChimpConfig) {
+  const mappedToDestination = get(message, MappedToDestinationKey);
+  if (mappedToDestination) {
+    addExternalIdToTraits(message);
+    return getFieldValueFromMessage(message, "traits");
+  }
+ 
+  const traits = getFieldValueFromMessage(message, "traits");
+ 
+  const updateSubscription = get(message, "integrations.MailChimp")
+    ? message.integrations.MailChimp
+    : undefined;
+ 
+  const email = getFieldValueFromMessage(message, "email");
+  if (!email) {
+    throw new CustomError("email is required for identify", 400);
+  }
+ 
+  const emailExists = await checkIfMailExists(mailChimpConfig, email);
+ 
+  const rawPayload = await getPayload(
+    traits,
+    updateSubscription,
+    message,
+    emailExists,
+    mailChimpConfig
+  );
+  return { ...rawPayload };
+}
+ 
+function getMailChimpConfig(message, destination) {
+  const configKeys = Object.keys(destination.Config);
+  const mailChimpConfig = {};
+  configKeys.forEach(key => {
+    switch (key) {
+      case destinationConfigKeys.apiKey:
+        mailChimpConfig.apiKey = `${destination.Config[key]}`;
+        break;
+      case destinationConfigKeys.audienceId:
+        mailChimpConfig.audienceId = `${destination.Config[key]}`;
+        break;
+      case destinationConfigKeys.dataCenterId:
+        mailChimpConfig.dataCenterId = `${destination.Config[key]}`;
+        break;
+      case "enableMergeFields":
+        mailChimpConfig.enableMergeFields =
+          destination.Config.enableMergeFields;
+        break;
+      default:
+        logger.debug("MailChimp: Unknown key type: ", key);
+        break;
+    }
+  });
+ 
+  const mailChimpExists = get(message, "context.MailChimp");
+  Iif (mailChimpExists) {
+    const listIdExists = get(message, "context.MailChimp.listId");
+    if (listIdExists) {
+      mailChimpConfig.audienceId = message.context.MailChimp.listId;
+    }
+  }
+  return mailChimpConfig;
+}
+ 
+async function processIdentify(message, destination) {
+  const mailChimpConfig = getMailChimpConfig(message, destination);
+  const properties = await getTransformedJSON(message, mailChimpConfig);
+  return responseBuilderSimple(properties, message, mailChimpConfig);
+}
+ 
+async function processSingleMessage(message, destination) {
+  if (message.type !== EventType.IDENTIFY) {
+    throw new CustomError(`message type ${message.type} is not supported`, 400);
+  }
+ 
+  return processIdentify(message, destination);
+}
+ 
+async function process(event) {
+  return processSingleMessage(event.message, event.destination);
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/config.js.html new file mode 100644 index 00000000000..fcb6f23d3c5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/config.js.html @@ -0,0 +1,245 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/marketo/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/marketo config.js

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 100% + Branches + 2/2 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +562x +  +2x +  +  +  +2x +2x +2x +  +2x +2x +  +2x +27x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  + 
const { getMappingConfig, getHashFromArray } = require("../../util");
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { name: "MARKETOIdentify" }
+};
+ 
+const LEAD_LOOKUP_METRIC = "marketo_lead_lookup";
+const ACTIVITY_METRIC = "marketo_activity";
+const FETCH_TOKEN_METRIC = "marketo_fetch_token";
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+const DESTINATION = "marketo";
+ 
+const formatConfig = destination => {
+  return {
+    ID: destination.ID,
+    ...destination.Config,
+    customActivityEventMap: getHashFromArray(
+      destination.Config.customActivityEventMap,
+      "from",
+      "to",
+      false
+    ),
+    customActivityPropertyMap: getHashFromArray(
+      destination.Config.customActivityPropertyMap,
+      "from",
+      "to",
+      false
+    ),
+    customActivityPrimaryKeyMap: getHashFromArray(
+      destination.Config.customActivityPrimaryKeyMap,
+      "from",
+      "to",
+      false
+    ),
+    leadTraitMapping: getHashFromArray(
+      destination.Config.leadTraitMapping,
+      "from",
+      "to",
+      false
+    ),
+    responseRules: destination.DestinationDefinition
+      ? destination.DestinationDefinition.ResponseRules
+      : null
+  };
+};
+ 
+module.exports = {
+  LEAD_LOOKUP_METRIC,
+  ACTIVITY_METRIC,
+  FETCH_TOKEN_METRIC,
+  DESTINATION,
+  formatConfig,
+  identifyConfig: MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY.name]
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/index.html new file mode 100644 index 00000000000..67c6f0e612d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/marketo + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/marketo

+
+ +
+ 75.44% + Statements + 172/228 +
+ + +
+ 60.48% + Branches + 75/124 +
+ + +
+ 66.67% + Functions + 18/27 +
+ + +
+ 75.44% + Lines + 172/228 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%10/10100%2/2100%1/1100%10/10
transform.js +
+
75.88%129/17055.32%52/9470%14/2075.88%129/170
util.js +
+
68.75%33/4875%21/2850%3/668.75%33/48
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/transform.js.html new file mode 100644 index 00000000000..d09db688df2 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/transform.js.html @@ -0,0 +1,2006 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/marketo/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/marketo transform.js

+
+ +
+ 75.88% + Statements + 129/170 +
+ + +
+ 55.32% + Branches + 52/94 +
+ + +
+ 70% + Functions + 14/20 +
+ + +
+ 75.88% + Lines + 129/170 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643  +  +  +2x +2x +2x +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +  +  +  +  +2x +  +  +  +  +2x +  +2x +2x +2x +  +  +  +  +  +  +  +  +  +2x +14x +4x +4x +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +3x +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +7x +4x +4x +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +4x +4x +4x +4x +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +8x +8x +  +  +  +  +  +  +  +8x +  +8x +7x +  +  +  +8x +  +7x +  +  +  +7x +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +2x +  +3x +1x +  +  +3x +  +3x +3x +1x +  +  +  +  +  +  +  +  +  +  +  +2x +  +2x +  +2x +1x +1x +1x +  +1x +  +1x +  +  +2x +2x +  +  +  +2x +1x +  +2x +2x +  +  +  +  +  +2x +1x +  +  +  +  +1x +1x +  +  +  +  +1x +1x +  +1x +1x +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +9x +  +9x +9x +1x +  +  +  +  +  +  +  +  +  +  +  +  +8x +8x +1x +  +  +  +  +  +  +  +  +  +  +  +  +7x +7x +  +  +  +7x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +  +6x +6x +  +7x +1x +1x +1x +  +  +  +  +6x +  +  +  +  +  +  +  +  +  +  +  +  +6x +  +6x +  +  +  +  +  +  +2x +8x +8x +8x +8x +8x +8x +  +  +2x +14x +1x +  +  +  +  +  +  +  +  +  +  +13x +13x +  +  +13x +  +3x +2x +  +9x +6x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +2x +12x +11x +  +  +  +  +  +  +  +  +  +  +11x +5x +  +  +2x +  +  +2x +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +2x + 
/* eslint-disable no-nested-ternary */
+/* eslint-disable no-await-in-loop */
+/* eslint-disable no-use-before-define */
+const get = require("get-value");
+const stats = require("../../../util/stats");
+const { EventType, MappedToDestinationKey } = require("../../../constants");
+const {
+  identifyConfig,
+  formatConfig,
+  LEAD_LOOKUP_METRIC,
+  ACTIVITY_METRIC,
+  FETCH_TOKEN_METRIC,
+  DESTINATION
+} = require("./config");
+const {
+  addExternalIdToTraits,
+  getDestinationExternalIDInfoForRetl,
+  isDefined,
+  removeUndefinedValues,
+  constructPayload,
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  getFieldValueFromMessage,
+  getDestinationExternalID,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  isDefinedAndNotNull,
+  generateErrorObject
+} = require("../../util");
+const ErrorBuilder = require("../../util/error");
+const Cache = require("../../util/cache");
+const {
+  USER_LEAD_CACHE_TTL,
+  AUTH_CACHE_TTL,
+  TRANSFORMER_METRIC
+} = require("../../util/constant");
+const {
+  marketoResponseHandler,
+  sendGetRequest,
+  sendPostRequest
+} = require("./util");
+ 
+const userIdLeadCache = new Cache(USER_LEAD_CACHE_TTL); // 1 day
+const emailLeadCache = new Cache(USER_LEAD_CACHE_TTL); // 1 day
+const authCache = new Cache(AUTH_CACHE_TTL); // 1 hr
+ 
+// //////////////////////////////////////////////////////////////////////
+// BASE URL REF: https://developers.marketo.com/rest-api/base-url/
+// //////////////////////////////////////////////////////////////////////
+ 
+// calls Marketo Auth API and fetches bearer token
+// fails the transformer if auth fails
+// ------------------------
+// Ref: https://developers.marketo.com/rest-api/authentication/#creating_an_access_token
+const getAuthToken = async formattedDestination => {
+  return authCache.get(formattedDestination.ID, async () => {
+    const { accountId, clientId, clientSecret } = formattedDestination;
+    const clientResponse = await sendGetRequest(
+      `https://${accountId}.mktorest.com/identity/oauth/token`,
+      {
+        params: {
+          client_id: clientId,
+          client_secret: clientSecret,
+          grant_type: "client_credentials"
+        }
+      }
+    );
+    const data = marketoResponseHandler(
+      clientResponse,
+      "During fetching auth token",
+      TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM
+    );
+    Eif (data) {
+      stats.increment(FETCH_TOKEN_METRIC, 1, { status: "success" });
+      return data.access_token;
+    }
+    stats.increment(FETCH_TOKEN_METRIC, 1, { status: "failed" });
+    return null;
+  });
+};
+ 
+// lookup Marketo with userId or anonymousId
+// Marketo will create the lead
+// fails transformer if lookup fails - fields are not created in Marketo
+// ------------------------
+// Ref: https://developers.marketo.com/rest-api/lead-database/leads/#create_and_update
+// Section: Create and Update
+// ------------------------
+// In this request, you’ll see two important fields, action and lookupField.
+// action specifies the operation type of the request, and can be
+// createOrUpdate, createOnly, updateOnly, or createDuplicate.
+// If it is omitted, the action defaults to createOrUpdate.
+// The lookupField parameter specifies the key to use in the operation.
+// If lookupField is omitted, the default key is email.
+// ------------------------
+// Thus we'll always be using createOrUpdate
+const createOrUpdateLead = async (
+  formattedDestination,
+  token,
+  userId,
+  anonymousId
+) => {
+  return userIdLeadCache.get(userId || anonymousId, async () => {
+    const attribute = userId ? { userId } : { anonymousId };
+    stats.increment(LEAD_LOOKUP_METRIC, 1, {
+      type: "userid",
+      action: "create"
+    });
+    const { accountId } = formattedDestination;
+    const clientResponse = await sendPostRequest(
+      `https://${accountId}.mktorest.com/rest/v1/leads.json`,
+      // `https://httpstat.us/200`,
+      {
+        action: "createOrUpdate",
+        input: [attribute],
+        lookupField: userId ? "userId" : "anonymousId"
+      },
+      {
+        headers: {
+          Authorization: `Bearer ${token}`,
+          "Content-type": "application/json"
+        }
+      }
+    );
+    const data = marketoResponseHandler(
+      clientResponse,
+      "[Marketo Transformer]: During lookup lead",
+      TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM
+    );
+    if (data) {
+      const { result } = data;
+      if (result && Array.isArray(result) && result.length > 0) {
+        return result[0].id;
+      }
+    }
+    return null;
+  });
+};
+ 
+// lookup Marketo using email
+// fails transformer if lookup fails - fields are not created in Marketo
+// ------------------------
+// Ref: https://developers.marketo.com/rest-api/lead-database/leads/#create_and_update
+// ------------------------
+const lookupLeadUsingEmail = async (formattedDestination, token, email) => {
+  return emailLeadCache.get(email, async () => {
+    stats.increment(LEAD_LOOKUP_METRIC, 1, { type: "email", action: "fetch" });
+    const clientResponse = await sendGetRequest(
+      `https://${formattedDestination.accountId}.mktorest.com/rest/v1/leads.json`,
+      // `https://httpstat.us/200`,
+      {
+        params: { filterValues: email, filterType: "email" },
+        headers: { Authorization: `Bearer ${token}` }
+      }
+    );
+    const data = marketoResponseHandler(
+      clientResponse,
+      "[Marketo Transformer]: During lead look up using email",
+      TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM
+    );
+    if (data) {
+      const { result } = data;
+      if (result && Array.isArray(result) && result.length > 0) {
+        return result[0].id;
+      }
+    }
+    return null;
+  });
+};
+ 
+// lookup Marketo using userId/anonymousId
+// fails transformer if lookup fails - and create if not exist is disabled
+// if userId is present searches using userId else searches using anonymousId
+// ------------------------
+// Ref: https://developers.marketo.com/rest-api/lead-database/leads/#create_and_update
+// ------------------------
+const lookupLeadUsingId = async (
+  formattedDestination,
+  token,
+  userId,
+  anonymousId
+) => {
+  return userIdLeadCache.get(userId || anonymousId, async () => {
+    stats.increment(LEAD_LOOKUP_METRIC, 1, { type: "userId", action: "fetch" });
+    const clientResponse = await sendGetRequest(
+      `https://${formattedDestination.accountId}.mktorest.com/rest/v1/leads.json`,
+      {
+        params: {
+          filterValues: userId || anonymousId,
+          filterType: userId ? "userId" : "anonymousId"
+        },
+        headers: { Authorization: `Bearer ${token}` }
+      }
+    );
+    const data = marketoResponseHandler(
+      clientResponse,
+      "[Marketo Transformer]: During lead look up using userId",
+      TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM
+    );
+    Eif (data) {
+      const { result } = data;
+      Eif (result && Array.isArray(result) && result.length > 0) {
+        return result[0].id;
+      }
+    }
+    return null;
+  });
+};
+ 
+const getLeadId = async (message, formattedDestination, token) => {
+  // precedence ->>
+  //  -> externalId (context.externalId[0].type == marketoLeadId)
+  //  -> lookup lead using email
+  //  -> lookup lead using userId or anonymousId
+  //  if nothing is found check if user has given permission to create the leads
+  //  -> -> if provided ---- create the lead and use that ID
+  //  -> -> if not ---- throw with error
+ 
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  const email = getFieldValueFromMessage(message, "email");
+  // check if marketo lead id is set in the externalId through rETL
+  // "externalId": [
+  //   {
+  //     "id": "lynnanderson@smith.net",
+  //     "identifierType": "email",
+  //     "type": "MARKETO-{object}"
+  //   }
+  let leadId = getDestinationExternalIDInfoForRetl(message, "MARKETO")
+    .destinationExternalId;
+  if (!leadId) {
+    leadId = getDestinationExternalID(message, "marketoLeadId");
+  }
+ 
+  // leadId is not supplied through the externalId parameter
+  if (!leadId) {
+    // search for lead using email
+    Iif (email) {
+      leadId = await lookupLeadUsingEmail(formattedDestination, token, email);
+    } else {
+      // search lead using userId or anonymousId
+      leadId = await lookupLeadUsingId(
+        formattedDestination,
+        token,
+        userId,
+        message.anonymousId
+      );
+    }
+  }
+ 
+  // if leadId lookup failed
+  Iif (!leadId) {
+    // check we have permission to create lead on marketo
+    if (formattedDestination.createIfNotExist) {
+      leadId = await createOrUpdateLead(
+        formattedDestination,
+        token,
+        userId,
+        message.anonymousId
+      );
+    } else {
+      throw new ErrorBuilder()
+        .setStatus(400)
+        .setMessage("Lead creation is turned off on the dashboard")
+        .setStatTags({
+          destination: DESTINATION,
+          stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+          scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+          meta:
+            TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META
+              .CONFIGURATION
+        })
+        .build();
+    }
+  }
+ 
+  Iif (!leadId) {
+    // throwing here as lookup failed because of
+    // either "anonymousId" or "userId" field is not created in marketo
+    // --> resulting to lookup failure or lead doesn't exist with "email".
+    //
+    // In the scenario of either of these, we should abort the event and the top level
+    // try-catch should handle this
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage(
+        "lookup failure - either anonymousId or userId or both fields are not created in marketo"
+      )
+      .setStatTags({
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+        meta:
+          TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META
+            .INSTRUMENTATION
+      })
+      .build();
+  }
+ 
+  return leadId;
+};
+ 
+// Handles identify calls
+// ------------------------
+// Ref: https://developers.marketo.com/rest-api/lead-database/leads/#create_and_update
+// Section: Create and Update
+// ------------------------
+// Almost same as leadId lookup. Noticable difference from lookup is we'll using
+// `id` i.e. leadId as lookupField at the end of it
+const processIdentify = async (message, formattedDestination, token) => {
+  // If mapped to destination, Add externalId to traits
+  if (get(message, MappedToDestinationKey)) {
+    addExternalIdToTraits(message);
+  }
+  // get the leadId and proceed
+  const { accountId, leadTraitMapping } = formattedDestination;
+ 
+  const traits = getFieldValueFromMessage(message, "traits");
+  if (!traits) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("Invalid traits value for Marketo")
+      .setStatTags({
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+        meta: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_EVENT
+      })
+      .build();
+  }
+ 
+  const leadId = await getLeadId(message, formattedDestination, token);
+ 
+  let attribute = constructPayload(traits, identifyConfig);
+  // leadTraitMapping will not be used if mapping is done through VDM in rETL
+  if (!get(message, MappedToDestinationKey)) {
+    Object.keys(leadTraitMapping).forEach(key => {
+      const val = traits[key];
+      attribute[leadTraitMapping[key]] = val;
+    });
+    attribute = removeUndefinedValues(attribute);
+  } else {
+    attribute = removeUndefinedValues(traits);
+  }
+ 
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  const inputObj = {
+    ...attribute,
+    id: leadId
+  };
+  if (isDefinedAndNotNull(userId)) {
+    inputObj.userId = userId;
+  }
+  let endPoint = `https://${accountId}.mktorest.com/rest/v1/leads.json`;
+  let payload = {
+    action: "createOrUpdate",
+    input: [inputObj],
+    lookupField: "id"
+  };
+  // handled if vdm enabled
+  if (get(message, MappedToDestinationKey)) {
+    const { objectType } = getDestinationExternalIDInfoForRetl(
+      message,
+      "MARKETO"
+    );
+    // if leads object then will fallback to the already existing endpoint and payload
+    Eif (objectType !== "leads") {
+      endPoint = `https://${accountId}.mktorest.com/rest/v1/customobjects/${objectType}.json`;
+      // we will be using the dedupeBy dedupeFields for this endpoint
+      // DOC: https://developers.marketo.com/rest-api/lead-database/custom-objects/#create_and_update
+      // if marketoGUID is mapped it should be removed before sending to marketo as for this type the following error can arise
+      // Field 'marketoGUID' not updateable or Field 'marketoGUID' is not allowed when dedupeBy is 'dedupeFields'
+      Eif (traits.marketoGUID) {
+        delete traits.marketoGUID;
+      }
+      const input = [removeUndefinedValues(traits)];
+      payload = {
+        action: "createOrUpdate",
+        dedupeBy: "dedupeFields",
+        input
+      };
+    }
+  }
+  return {
+    endPoint,
+    headers: {
+      Authorization: `Bearer ${token}`
+    },
+    payload
+  };
+};
+ 
+// process track events - only mapped events
+// ------------------------
+// Ref: https://developers.marketo.com/rest-api/endpoint-reference/lead-database-endpoint-reference/#!/Activities/addCustomActivityUsingPOST
+const processTrack = async (message, formattedDestination, token) => {
+  // check if trackAnonymousEvent is turned off and userId is not present - fail
+  // check if the event is mapped in customActivityEventMap. if not - fail
+  // get primaryKey name for the event
+  // - get the value from properties with that name
+  // - check if the value is valid. if not - fail
+  //
+  // get the leadId and proceed
+  // format the payload
+ 
+  const {
+    trackAnonymousEvents,
+    accountId,
+    customActivityEventMap,
+    customActivityPrimaryKeyMap,
+    customActivityPropertyMap
+  } = formattedDestination;
+ 
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  if (!(trackAnonymousEvents || userId)) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("Anonymous event tracking is turned off and invalid userId")
+      .setStatTags({
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+        meta:
+          TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.CONFIGURATION
+      })
+      .build();
+  }
+ 
+  const activityTypeId = customActivityEventMap[message.event];
+  if (!activityTypeId) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("Event is not mapped to Custom Activity")
+      .setStatTags({
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+        meta:
+          TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.CONFIGURATION
+      })
+      .build();
+  }
+ 
+  const primaryKeyPropName = customActivityPrimaryKeyMap[message.event];
+  const primaryAttributeValue = get(
+    message,
+    `properties.${primaryKeyPropName}`
+  );
+  if (!primaryAttributeValue) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("Primary Key value is invalid for the event")
+      .setStatTags({
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+        meta:
+          TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.CONFIGURATION
+      })
+      .build();
+  }
+ 
+  // get leadId
+  const leadId = await getLeadId(message, formattedDestination, token);
+ 
+  // handle custom activy attributes
+  const attribute = [];
+  Object.keys(customActivityPropertyMap).forEach(key => {
+    // exclude the primaryKey
+    if (key !== primaryKeyPropName) {
+      const value = message.properties[key];
+      Eif (isDefined(value)) {
+        attribute.push({ apiName: customActivityPropertyMap[key], value });
+      }
+    }
+  });
+ 
+  const payload = {
+    input: [
+      {
+        activityDate: getFieldValueFromMessage(message, "timestamp"),
+        activityTypeId: Number.parseInt(activityTypeId, 10),
+        attribute,
+        leadId,
+        primaryAttributeValue
+      }
+    ]
+  };
+ 
+  // metric collection
+  stats.increment(ACTIVITY_METRIC, 1);
+ 
+  return {
+    endPoint: `https://${accountId}.mktorest.com/rest/v1/activities/external.json`,
+    headers: { Authorization: `Bearer ${token}` },
+    payload
+  };
+};
+ 
+const responseWrapper = response => {
+  const resp = defaultRequestConfig();
+  resp.endpoint = response.endPoint;
+  resp.method = defaultPostRequestConfig.requestMethod;
+  resp.headers = { ...response.headers, "Content-Type": "application/json" };
+  resp.body.JSON = response.payload;
+  return resp;
+};
+ 
+const processEvent = async (message, destination, token) => {
+  if (!message.type) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("Message Type is not present. Aborting message.")
+      .setStatTags({
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+        meta: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_EVENT
+      })
+      .build();
+  }
+  const messageType = message.type.toLowerCase();
+  const formattedDestination = formatConfig(destination);
+ 
+  let response;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      response = await processIdentify(message, formattedDestination, token);
+      break;
+    case EventType.TRACK:
+      response = await processTrack(message, formattedDestination, token);
+      break;
+    default:
+      throw new ErrorBuilder()
+        .setStatus(400)
+        .setMessage("Message type not supported")
+        .setStatTags({
+          destination: DESTINATION,
+          stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+          scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.SCOPE,
+          meta:
+            TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_EVENT
+        })
+        .build();
+  }
+ 
+  // wrap response for router processing
+  return responseWrapper(response);
+};
+ 
+const process = async event => {
+  const token = await getAuthToken(formatConfig(event.destination));
+  Iif (!token) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("Authorisation failed")
+      .setStatTags({
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.AUTHENTICATION.SCOPE
+      })
+      .build();
+  }
+  const response = await processEvent(event.message, event.destination, token);
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  // Token needs to be generated for marketo which will be done on input level.
+  // If destination information is not present Error should be thrown
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+  let token;
+  try {
+    token = await getAuthToken(formatConfig(inputs[0].destination));
+  } catch (error) {
+    const errObj = generateErrorObject(
+      error,
+      DESTINATION,
+      TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM
+    );
+    const respEvents = getErrorRespEvents(
+      inputs.map(input => input.metadata),
+      error.status || 500, // default to retryable
+      error.message || "Error occurred while processing payload.",
+      errObj.statTags
+    );
+    return [respEvents];
+  }
+ 
+  // If token is null track/identify calls cannot be executed.
+  Iif (!token) {
+    const errResp = {
+      status: 400,
+      message: "Authorisation failed",
+      responseTransformFailure: true,
+      statTags: {
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.AUTHENTICATION.SCOPE
+      }
+    };
+    const respEvents = getErrorRespEvents(
+      inputs.map(input => input.metadata),
+      errResp.status,
+      errResp.message,
+      errResp.statTags
+    );
+    return [respEvents];
+  }
+ 
+  // Checking previous status Code. Initially setting to false.
+  // If true then previous status is 500 and every subsequent event output should be
+  // sent with status code 500 to the router to be retried.
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        return getSuccessRespEvents(
+          await processEvent(input.message, input.destination, token),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        const errObj = generateErrorObject(
+          error,
+          DESTINATION,
+          TRANSFORMER_METRIC.TRANSFORMER_STAGE.TRANSFORM
+        );
+        return getErrorRespEvents(
+          [input.metadata],
+          error.status || 500,
+          error.message || "Error occurred while processing payload.",
+          errObj.statTags
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/util.js.html new file mode 100644 index 00000000000..50d9031260e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/marketo/util.js.html @@ -0,0 +1,605 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/marketo/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/marketo util.js

+
+ +
+ 68.75% + Statements + 33/48 +
+ + +
+ 75% + Branches + 21/28 +
+ + +
+ 50% + Functions + 3/6 +
+ + +
+ 68.75% + Lines + 33/48 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176  +  +  +  +2x +  +  +  +2x +2x +2x +2x +  +2x +2x +2x +2x +  +  +2x +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +8x +8x +  +8x +3x +  +  +5x +4x +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +8x +8x +8x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +2x +  +  +  +  +  + 
const {
+  httpGET,
+  httpPOST,
+  proxyRequest
+} = require("../../../adapters/network");
+const {
+  getDynamicMeta,
+  processAxiosResponse
+} = require("../../../adapters/utils/networkUtils");
+const { isHttpStatusSuccess } = require("../../util/index");
+const { TRANSFORMER_METRIC } = require("../../util/constant");
+const ErrorBuilder = require("../../util/error");
+ 
+const MARKETO_RETRYABLE_CODES = ["601", "602", "604", "611"];
+const MARKETO_ABORTABLE_CODES = ["600", "603", "605", "609", "610", "612"];
+const MARKETO_THROTTLED_CODES = ["502", "606", "607", "608", "615"];
+const { DESTINATION } = require("./config");
+ 
+// handles marketo application level failures
+const marketoApplicationErrorHandler = (
+  marketoResponse,
+  sourceMessage,
+  stage
+) => {
+  const { response } = marketoResponse;
+  const { errors } = response;
+  Iif (errors && MARKETO_ABORTABLE_CODES.indexOf(errors[0].code) > -1) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage(
+        `Request Failed for Marketo, ${errors[0].message} (Aborted).${sourceMessage}`
+      )
+      .setDestinationResponse(marketoResponse)
+      .isTransformResponseFailure(true)
+      .setStatTags({
+        destination: DESTINATION,
+        stage,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.SCOPE,
+        meta: TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.META.ABORTABLE
+      })
+      .build();
+  } else Iif (errors && MARKETO_THROTTLED_CODES.indexOf(errors[0].code) > -1) {
+    throw new ErrorBuilder()
+      .setStatus(429)
+      .setMessage(
+        `Request Failed for Marketo, ${errors[0].message} (Throttled).${sourceMessage}`
+      )
+      .setDestinationResponse(marketoResponse)
+      .isTransformResponseFailure(true)
+      .setStatTags({
+        destination: DESTINATION,
+        stage,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.SCOPE,
+        meta: TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.META.THROTTLED
+      })
+      .build();
+  } else Eif (errors && MARKETO_RETRYABLE_CODES.indexOf(errors[0].code) > -1) {
+    throw new ErrorBuilder()
+      .setStatus(500)
+      .setMessage(
+        `Request Failed for Marketo, ${errors[0].message} (Retryable).${sourceMessage}`
+      )
+      .setDestinationResponse(marketoResponse)
+      .isTransformResponseFailure(true)
+      .setStatTags({
+        destination: DESTINATION,
+        stage,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.SCOPE,
+        meta: TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.META.RETRYABLE
+      })
+      .build();
+  }
+};
+ 
+const marketoResponseHandler = (destResponse, sourceMessage, stage) => {
+  const { status, response } = destResponse;
+  Eif (isHttpStatusSuccess(status)) {
+    // for authentication requests
+    if (response && response.access_token) {
+      return response;
+    }
+    // marketo application level success
+    if (response && response.success) {
+      return response;
+    }
+    // marketo application level failure
+    Eif (response && !response.success) {
+      marketoApplicationErrorHandler(destResponse, sourceMessage, stage);
+    }
+  }
+  // non 2xx failure
+  throw new ErrorBuilder()
+    .setStatus(status)
+    .setMessage(`Error occured ${sourceMessage}`)
+    .setDestinationResponse(destResponse)
+    .setStatTags({
+      destination: DESTINATION,
+      stage,
+      scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.SCOPE,
+      meta: getDynamicMeta(status)
+    })
+    .build();
+};
+ 
+/**
+ *
+ * @param {*} url
+ * @param {*} options
+ * @returns { response, status }
+ */
+const sendGetRequest = async (url, options) => {
+  const clientResponse = await httpGET(url, options);
+  const processedResponse = processAxiosResponse(clientResponse);
+  return processedResponse;
+};
+ 
+/**
+ *
+ * @param {*} url
+ * @param {*} options
+ * @returns { response, status }
+ */
+const sendPostRequest = async (url, data, options) => {
+  const clientResponse = await httpPOST(url, options);
+  const processedResponse = processAxiosResponse(clientResponse);
+  return processedResponse;
+};
+ 
+// eslint-disable-next-line no-unused-vars
+const responseHandler = (destinationResponse, _dest) => {
+  const message = `[Marketo Response Handler] - Request Processed Successfully`;
+  const { status } = destinationResponse;
+  // if the responsee from destination is not a success case build an explicit error
+  if (!isHttpStatusSuccess(status)) {
+    throw new ErrorBuilder()
+      .setStatus(status)
+      .setMessage(
+        `[Marketo Response Handler] - Request failed  with status: ${status}`
+      )
+      .setDestinationResponse(destinationResponse)
+      .isTransformResponseFailure(true)
+      .setStatTags({
+        destination: DESTINATION,
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE.RESPONSE_TRANSFORM,
+        scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.SCOPE,
+        meta: getDynamicMeta(status)
+      })
+      .build();
+  }
+  // check for marketo application level failures
+  marketoApplicationErrorHandler(
+    destinationResponse,
+    "during Marketo Response Handling",
+    TRANSFORMER_METRIC.TRANSFORMER_STAGE.RESPONSE_TRANSFORM
+  );
+  // else successfully return status, message and original destination response
+  return {
+    status,
+    message,
+    destinationResponse
+  };
+};
+ 
+const networkHandler = function() {
+  this.responseHandler = responseHandler;
+  this.proxy = proxyRequest;
+  this.processAxiosResponse = processAxiosResponse;
+};
+ 
+module.exports = {
+  marketoResponseHandler,
+  sendGetRequest,
+  sendPostRequest,
+  networkHandler
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/moengage/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/moengage/config.js.html new file mode 100644 index 00000000000..7281952b4cf --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/moengage/config.js.html @@ -0,0 +1,230 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/moengage/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/moengage config.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +511x +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const endpointUS = {
+  // track properties, | Track
+  identify: `https://api-01.moengage.com/v1/customer/`,
+  // identify a user| Identify
+  track: `https://api-01.moengage.com/v1/event/`,
+  // identify a user| Device
+  device: `https://api-01.moengage.com/v1/device/`
+};
+ 
+const endpointEU = {
+  identify: `https://api-02.moengage.com/v1/customer/`,
+  track: `https://api-02.moengage.com/v1/event/`,
+  device: `https://api-02.moengage.com/v1/device/`
+};
+ 
+const endpointIND = {
+  identify: `https://api-03.moengage.com/v1/customer/`,
+  track: `https://api-03.moengage.com/v1/event/`,
+  device: `https://api-03.moengage.com/v1/device/`
+};
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { type: "identify", name: "MOENGAGEIdentifyConfig" },
+  TRACK: { type: "track", name: "MOENGAGETrackConfig" },
+  DEVICE: { type: "device", name: "MOENGAGEDeviceConfig" },
+  IDENTIFY_ATTR: {
+    type: "identifyAttr",
+    name: "MOENGAGEIdentifyAttributesConfig"
+  },
+  DEVICE_ATTR: {
+    type: "deviceAttr",
+    name: "MOENGAGEDeviceAttributesConfig"
+  },
+  TRACK_ATTR: {
+    type: "trackAttr",
+    name: "MOENGAGETrackAttributesConfig"
+  }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG,
+  endpointEU,
+  endpointIND,
+  endpointUS
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/moengage/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/moengage/index.html new file mode 100644 index 00000000000..95d03d885b1 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/moengage/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/moengage + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/moengage

+
+ +
+ 91.55% + Statements + 65/71 +
+ + +
+ 70.59% + Branches + 24/34 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 91.55% + Lines + 65/71 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%7/7100%0/0100%0/0100%7/7
transform.js +
+
90.63%58/6470.59%24/34100%5/590.63%58/64
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/moengage/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/moengage/transform.js.html new file mode 100644 index 00000000000..40a9956aa92 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/moengage/transform.js.html @@ -0,0 +1,614 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/moengage/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/moengage transform.js

+
+ +
+ 90.63% + Statements + 58/64 +
+ + +
+ 70.59% + Branches + 24/34 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 90.63% + Lines + 58/64 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +1791x +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +12x +12x +12x +  +12x +  +1x +1x +  +9x +9x +  +1x +1x +  +1x +  +11x +11x +  +  +  +  +  +  +11x +11x +11x +  +  +6x +6x +  +  +  +  +6x +6x +  +  +1x +1x +  +  +  +  +1x +1x +  +  +4x +4x +  +  +  +  +  +4x +  +  +  +  +11x +  +  +  +  +11x +  +  +1x +13x +1x +  +  +  +  +  +12x +  +  +12x +  +7x +7x +  +  +6x +  +  +  +  +  +1x +  +  +  +  +  +  +6x +  +4x +  +4x +4x +  +1x +  +  +10x +  +  +1x +13x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const btoa = require("btoa");
+const { EventType } = require("../../../constants");
+const {
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG,
+  endpointEU,
+  endpointIND,
+  endpointUS
+} = require("./config");
+const {
+  constructPayload,
+  defaultPostRequestConfig,
+  removeUndefinedAndNullValues,
+  defaultRequestConfig,
+  flattenJson,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+function responseBuilderSimple(message, category, destination) {
+  const payload = constructPayload(message, MAPPING_CONFIG[category.name]);
+  const { apiId, region, apiKey } = destination.Config;
+  const response = defaultRequestConfig();
+  // check the region and which api end point should be used
+  switch (region) {
+    case "EU":
+      response.endpoint = `${endpointEU[category.type]}${apiId}`;
+      break;
+    case "US":
+      response.endpoint = `${endpointUS[category.type]}${apiId}`;
+      break;
+    case "IND":
+      response.endpoint = `${endpointIND[category.type]}${apiId}`;
+      break;
+    default:
+      throw new CustomError("The region is not valid", 400);
+  }
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.headers = {
+    "Content-Type": "application/json",
+    "MOE-APPKEY": apiId,
+    // Basic Authentication encodes a 'username:password'
+    // using base64 and prepends it with the string 'Basic '.
+    Authorization: `Basic ${btoa(`${apiId}:${apiKey}`)}`
+  };
+  response.userId = message.anonymousId || message.userId;
+  Eif (payload) {
+    switch (category.type) {
+      case "identify":
+        // Ref: https://docs.moengage.com/docs/data-import-apis#user-api
+        payload.type = "customer";
+        payload.attributes = constructPayload(
+          message,
+          MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY_ATTR.name]
+        );
+        // nested attributes are not by moengage so it is falttened
+        payload.attributes = flattenJson(payload.attributes);
+        break;
+      case "device":
+        // Ref: https://docs.moengage.com/docs/data-import-apis#device-api
+        payload.type = "device";
+        payload.attributes = constructPayload(
+          message,
+          MAPPING_CONFIG[CONFIG_CATEGORIES.DEVICE_ATTR.name]
+        );
+        // nested attributes are not by moengage so it is falttened
+        payload.attributes = flattenJson(payload.attributes);
+        break;
+      case "track":
+        // Ref: https://docs.moengage.com/docs/data-import-apis#event-api
+        payload.type = "event";
+        payload.actions = [
+          constructPayload(
+            message,
+            MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK_ATTR.name]
+          )
+        ];
+        break;
+      default:
+        throw new CustomError("Call type is not valid", 400);
+    }
+ 
+    response.body.JSON = removeUndefinedAndNullValues(payload);
+  } else {
+    // fail-safety for developer error
+    throw new CustomError("Payload could not be constructed", 400);
+  }
+  return response;
+}
+ 
+const processEvent = (message, destination) => {
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  const messageType = message.type.toLowerCase();
+  let category;
+  let response;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      category = CONFIG_CATEGORIES.IDENTIFY;
+      response = responseBuilderSimple(message, category, destination);
+      // only if device information is present device info will be added/updated
+      // with an identify call otherwise only user info will be added/updated
+      if (
+        message.context.device &&
+        message.context.device.type &&
+        message.context.device.token
+      ) {
+        // build the response
+        response = [
+          // user api payload (output for identify)
+          response,
+          // device api payload
+          responseBuilderSimple(message, CONFIG_CATEGORIES.DEVICE, destination)
+        ];
+      }
+      break;
+    case EventType.TRACK:
+      category = CONFIG_CATEGORIES.TRACK;
+      // build the response
+      response = responseBuilderSimple(message, category, destination);
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+ 
+  return response;
+};
+ 
+const process = event => {
+  return processEvent(event.message, event.destination);
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/monetate/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/monetate/config.js.html new file mode 100644 index 00000000000..2cdcc89846a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/monetate/config.js.html @@ -0,0 +1,143 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/monetate/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/monetate config.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +221x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x + 
const { getMappingConfig } = require("../../util");
+ 
+const ENDPOINT = "https://engine.monetate.net/api/engine/v1/decide/";
+ 
+const mappingConfig = getMappingConfig(
+  {
+    Track: {
+      name: "MONETATETrack"
+    },
+    Page: {
+      name: "MONETATEPage"
+    },
+    Screen: {
+      name: "MONETATEScreen"
+    }
+  },
+  __dirname
+);
+ 
+exports.ENDPOINT = ENDPOINT;
+exports.mappingConfig = mappingConfig;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/monetate/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/monetate/index.html new file mode 100644 index 00000000000..304bfbdf68c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/monetate/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/monetate + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/monetate

+
+ +
+ 93.25% + Statements + 152/163 +
+ + +
+ 81.33% + Branches + 122/150 +
+ + +
+ 100% + Functions + 21/21 +
+ + +
+ 93.21% + Lines + 151/162 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%5/5100%0/0100%0/0100%5/5
transform.js +
+
93.04%147/15881.33%122/150100%21/2192.99%146/157
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/monetate/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/monetate/transform.js.html new file mode 100644 index 00000000000..30a70e98443 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/monetate/transform.js.html @@ -0,0 +1,1328 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/monetate/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/monetate transform.js

+
+ +
+ 93.04% + Statements + 147/158 +
+ + +
+ 81.33% + Branches + 122/150 +
+ + +
+ 100% + Functions + 21/21 +
+ + +
+ 92.99% + Lines + 146/157 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +4171x +1x +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +1x +29x +  +  +  +29x +29x +  +29x +29x +  +  +  +  +29x +  +  +1x +  +205x +34x +171x +  +  +99x +99x +  +  +72x +  +205x +  +  +1x +  +205x +173x +32x +32x +32x +32x +32x +32x +3x +  +  +  +  +  +  +  +32x +29x +  +  +205x +  +  +1x +72x +  +  +72x +  +  +  +72x +72x +205x +  +205x +205x +205x +166x +39x +  +  +9x +9x +  +  +  +72x +  +  +1x +  +72x +29x +  +  +72x +  +  +  +  +  +  +72x +  +  +  +  +72x +63x +  +  +  +  +  +21x +21x +  +  +21x +  +21x +21x +21x +  +  +  +21x +  +  +1x +  +29x +29x +  +29x +136x +  +136x +136x +  +82x +72x +  +10x +  +54x +  +  +  +  +  +  +  +29x +  +  +  +  +  +20x +  +20x +19x +  +1x +  +  +  +20x +20x +20x +20x +5x +3x +3x +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +15x +4x +3x +6x +  +3x +1x +  +  +  +  +2x +  +  +4x +  +  +  +1x +  +  +  +  +11x +4x +4x +4x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +7x +2x +2x +  +4x +  +  +  +  +  +2x +1x +  +  +  +  +1x +  +  +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +5x +3x +3x +3x +3x +  +6x +  +  +  +  +  +3x +1x +  +  +  +  +2x +  +  +  +4x +4x +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +12x +  +  +  +7x +  +7x +  +  +  +2x +  +2x +  +  +  +  +32x +32x +  +  +32x +31x +  +20x +  +7x +  +2x +  +2x +  +  +1x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const set = require("set-value");
+ 
+const {
+  getValueFromMessage,
+  defaultRequestConfig,
+  removeUndefinedValues,
+  getErrorRespEvents,
+  getSuccessRespEvents,
+  CustomError,
+  isDefinedAndNotNull
+} = require("../../util");
+const { EventType } = require("../../../constants");
+ 
+const { ENDPOINT, mappingConfig } = require("./config");
+ 
+const createObject = type => {
+  Iif (!type) {
+    throw new CustomError("[createObject] type not defined", 400);
+  }
+  // TODO: check if default makes sense
+  let retObj = {};
+  switch (type.toLowerCase()) {
+    case "array":
+      retObj = [];
+      break;
+    case "object":
+      retObj = {};
+      break;
+  }
+  return retObj;
+};
+ 
+const getStringValue = (value, key) => {
+  let val;
+  if (key === "sourceKeyValue") {
+    val = value;
+  } else if (key.startsWith("sourceKeyValue.")) {
+    // gets the substring after the first .
+    // sourceKeyValue.page.url => page.url
+    const k = key.substring(key.indexOf(".") + 1);
+    val = get(value, k);
+  } else {
+    // leave the sourceKey as it is if cannot be replaced
+    val = key;
+  }
+  return val;
+};
+ 
+const getValue = (value, key) => {
+  let val;
+  if (typeof key === "string") {
+    val = getStringValue(value, key);
+  } else Eif (Array.isArray(key)) {
+    val = [];
+    key.forEach(k => {
+      Eif (typeof k === "string") {
+        const v = getStringValue(value, k);
+        if (v) {
+          val.push(v);
+        }
+      } else {
+        // if child element of array is not a string, push it as it is
+        // TODO : add support for more types
+        val.push(k);
+      }
+    });
+    if (val.length === 0) {
+      val = undefined;
+    }
+  }
+  return val;
+};
+ 
+const formatValue = (value, format, required) => {
+  let formattedVal = {};
+  // format is an object in this case
+  // TODO : Add generic support for more types
+  Eif (value && format) {
+    let sourceKey;
+    let key;
+    let val;
+    const formatKeys = Object.keys(format);
+    for (let i = 0; i < formatKeys.length; i += 1) {
+      key = formatKeys[i];
+      // Object.keys(format).forEach(key => {
+      sourceKey = format[key];
+      val = getValue(value, sourceKey);
+      if (val) {
+        formattedVal[key] = val;
+      } else if (required) {
+        // return undefined if val doesn't exist.All keys for targetFormat are required.
+        // TODO : make this configurable from JSON
+        formattedVal = undefined;
+        break;
+      }
+    }
+  }
+  return formattedVal;
+};
+ 
+const customMetadataHandler = (payload, destKey, value, metadata) => {
+  // make sure payload.destKey exists and is of correct type
+  if (!get(payload, destKey) && metadata.targetType) {
+    payload[destKey] = createObject(metadata.targetType);
+  }
+  // populate payload
+  Iif (metadata.isTargetTypePrimite) {
+    // set value directly if it is primitive
+    // TODO : call format value for here, we can use the function alredy defined in utils
+    set(payload, destKey, value);
+  } else {
+    // value is not a primitive type
+    // TODO: add else or refactor for better code cov
+    const targetValue = formatValue(
+      value,
+      metadata.targetFormat,
+      metadata.targetFormatRequired
+    );
+    if (metadata.action && payload[destKey][metadata.action] && targetValue) {
+      payload[destKey][metadata.action](targetValue);
+    }
+  }
+};
+ 
+function responseBuilder(body, destination) {
+  const destinationConfig = destination.Config || {};
+  const response = defaultRequestConfig();
+ 
+  // adding monetate channel to body
+  body.channel = destinationConfig.monetateChannel;
+ 
+  response.endpoint = ENDPOINT + destinationConfig.retailerShortName;
+  response.body.JSON = body;
+  response.headers = {
+    "Content-Type": "application/json"
+  };
+ 
+  return response;
+}
+ 
+const constructPayload = (message, mappingJson) => {
+  // Mapping JSON should be an array
+  Eif (Array.isArray(mappingJson) && mappingJson.length > 0) {
+    const payload = {};
+ 
+    mappingJson.forEach(mapping => {
+      const { sourceKeys, destKey, required, metadata } = mapping;
+      // get the value from event
+      const value = getValueFromMessage(message, sourceKeys);
+      if (value) {
+        // set the value only if correct
+        if (metadata) {
+          customMetadataHandler(payload, destKey, value, metadata);
+        } else {
+          set(payload, destKey, value);
+        }
+      } else Iif (required) {
+        // throw error if reqired value is missing
+        throw new CustomError(
+          `Missing required value from ${JSON.stringify(sourceKeys)}`,
+          400
+        );
+      }
+    });
+    return payload;
+  }
+  return null;
+};
+ 
+function track(message, destination) {
+  const rawPayload = constructPayload(message, mappingConfig.MONETATETrack);
+ 
+  if (message.userId) {
+    rawPayload.customerId = message.userId;
+  } else {
+    rawPayload.deviceId = message.anonymousId;
+  }
+ 
+  // Add Ecomm Events if applicable
+  const evName = message.event;
+  const properties = message.properties || {};
+  Eif (evName) {
+    if (evName === "Product Viewed") {
+      if (properties.product_id) {
+        const sku = properties.sku || "";
+        rawPayload.events.push({
+          eventType: "monetate:context:ProductDetailView",
+          products: [
+            {
+              productId: properties.product_id,
+              sku
+            }
+          ]
+        });
+      } else {
+        throw new CustomError(
+          "'product_id' is a required field for Product Viewed",
+          400
+        );
+      }
+    } else if (evName === "Product List Viewed") {
+      if (properties.products && Array.isArray(properties.products)) {
+        const viewedProducts = properties.products.filter(
+          product => product.product_id
+        );
+        if (viewedProducts.length !== properties.products.length) {
+          throw new CustomError(
+            "'product_id' is a required field for all products for Product List Viewed",
+            400
+          );
+        }
+        rawPayload.events.push({
+          eventType: "monetate:context:ProductThumbnailView",
+          products: properties.products.map(product =>
+            product.product_id.toString()
+          )
+        });
+      } else {
+        throw new CustomError(
+          "'products' missing or not array in Product List Viewed",
+          400
+        );
+      }
+    } else if (evName === "Product Added") {
+      const currency = properties.currency || "USD";
+      const sku = properties.sku || "";
+      if (
+        properties.product_id &&
+        properties.quantity &&
+        Number.isInteger(properties.quantity) &&
+        properties.cart_value
+      ) {
+        rawPayload.events.push({
+          eventType: "monetate:context:Cart",
+          cartLines: [
+            {
+              pid: properties.product_id
+                ? properties.product_id.toString()
+                : "",
+              sku,
+              quantity: properties.quantity,
+              value: properties.cart_value
+                ? properties.cart_value.toString()
+                : "",
+              currency
+            }
+          ]
+        });
+      } else {
+        throw new CustomError(
+          "'product_id', 'quantity', 'cart_value' are required fields and 'quantity' should be a number for Product Added",
+          400
+        );
+      }
+    } else if (evName === "Cart Viewed") {
+      Eif (properties.products && Array.isArray(properties.products)) {
+        const cartProducts = properties.products.filter(
+          product =>
+            product.quantity &&
+            Number.isInteger(product.quantity) &&
+            isDefinedAndNotNull(product.price) &&
+            typeof product.price === "number" &&
+            product.product_id
+        );
+        if (cartProducts.length !== properties.products.length) {
+          throw new CustomError(
+            "'quantity', 'price' and 'product_id' are required fields and 'quantity' and 'price' should be a number for all products for Cart Viewed",
+            400
+          );
+        }
+        rawPayload.events.push({
+          eventType: "monetate:context:Cart",
+          cartLines: properties.products.map(product => {
+            const cartValue = (product.quantity * product.price).toFixed(2);
+            const currency = product.currency || properties.currency || "USD";
+            const sku = product.sku || "";
+            return {
+              pid: product.product_id ? product.product_id.toString() : "",
+              sku,
+              quantity: product.quantity,
+              value: cartValue ? cartValue.toString() : "",
+              currency
+            };
+          })
+        });
+      }
+    } else if (evName === "Order Completed") {
+      const purchaseId = properties.order_id;
+      const { products } = properties;
+      Eif (purchaseId && products && Array.isArray(products)) {
+        const purchaseLines = products.filter(
+          product =>
+            product.quantity &&
+            Number.isInteger(product.quantity) &&
+            isDefinedAndNotNull(product.price) &&
+            typeof product.price === "number" &&
+            product.product_id
+        );
+        if (purchaseLines.length !== products.length) {
+          throw new CustomError(
+            "'quantity', 'price' and 'product_id' are required fields and 'quantity' and 'price' should be a number for all products for Order Completed",
+            400
+          );
+        }
+        rawPayload.events.push({
+          eventType: "monetate:context:Purchase",
+          purchaseId,
+          purchaseLines: purchaseLines.map(product => {
+            const valueStr = (product.quantity * product.price).toFixed(2);
+            const currency = product.currency || properties.currency || "USD";
+            const sku = product.sku || "";
+            return {
+              pid: product.product_id ? product.product_id.toString() : "",
+              sku,
+              quantity: product.quantity,
+              value: valueStr ? valueStr.toString() : "",
+              currency
+            };
+          })
+        });
+      }
+    } else {
+      // The Engine API does not currently support custom events.
+      // For lifecycle events, we would prefer to add them to our spec,
+      // rather than support free-form custom events.  Nevertheless, if
+      // custom event support is added to the Engine API, the following
+      // block can be uncommented.
+      /*
+        rawPayload.events.push({
+          "eventType": "monetate:context:CustomEvents",
+          "customEvents": [{
+              name: evName,
+              value: true,
+          }],
+        });
+      */
+    }
+  }
+ 
+  return responseBuilder(removeUndefinedValues(rawPayload), destination);
+}
+ 
+function page(message, destination) {
+  const rawPayload = constructPayload(message, mappingConfig.MONETATEPage);
+ 
+  return responseBuilder(removeUndefinedValues(rawPayload), destination);
+}
+ 
+function screen(message, destination) {
+  const rawPayload = constructPayload(message, mappingConfig.MONETATEScreen);
+ 
+  return responseBuilder(removeUndefinedValues(rawPayload), destination);
+}
+ 
+function process(event) {
+  // get the event type
+  let evType = get(event, "message.type");
+  evType = evType ? evType.toLowerCase() : undefined;
+ 
+  // call the appropriate handler based on event type
+  if (evType) {
+    switch (evType) {
+      case EventType.TRACK:
+        return track(event.message, event.destination);
+      case EventType.PAGE:
+        return page(event.message, event.destination);
+      case EventType.SCREEN:
+        return screen(event.message, event.destination);
+      default:
+        throw new CustomError(`Message type ${evType} not supported`, 400);
+    }
+  }
+  throw new CustomError("Message type missing from event", 400);
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/mp/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/mp/config.js.html new file mode 100644 index 00000000000..0845f57f3bb --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/mp/config.js.html @@ -0,0 +1,215 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/mp/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/mp config.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +461x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ConfigCategory = {
+  IDENTIFY: {
+    name: "MPIdentifyConfig"
+  },
+  PROFILE_ANDROID: {
+    name: "MPProfilePropertiesAndroid"
+  },
+  PROFILE_IOS: {
+    name: "MPProfilePropertiesIOS"
+  },
+  EVENT_PROPERTIES: {
+    name: "MPEventPropertiesConfig"
+  }
+};
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+const MP_IDENTIFY_EXCLUSION_LIST = [
+  "createdAt",
+  "email",
+  "firstName",
+  "firstname",
+  "first_name",
+  "lastName",
+  "lastname",
+  "last_name",
+  "name",
+  "username",
+  "userName",
+  "phone",
+  "avatar",
+  "address",
+  "country",
+  "city",
+  "state",
+  "unsubscribed"
+];
+ 
+module.exports = {
+  ConfigCategory,
+  mappingConfig,
+  MP_IDENTIFY_EXCLUSION_LIST
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/mp/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/mp/index.html new file mode 100644 index 00000000000..cb1eac6374d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/mp/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/mp + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/mp

+
+ +
+ 96.64% + Statements + 144/149 +
+ + +
+ 88.29% + Branches + 98/111 +
+ + +
+ 100% + Functions + 15/15 +
+ + +
+ 96.64% + Lines + 144/149 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%5/5100%0/0100%0/0100%5/5
transform.js +
+
96.53%139/14488.29%98/111100%15/1596.53%139/144
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/mp/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/mp/transform.js.html new file mode 100644 index 00000000000..9c332b486ad --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/mp/transform.js.html @@ -0,0 +1,1487 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/mp/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/mp transform.js

+
+ +
+ 96.53% + Statements + 139/144 +
+ + +
+ 88.29% + Branches + 98/111 +
+ + +
+ 100% + Functions + 15/15 +
+ + +
+ 96.53% + Lines + 139/144 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +4701x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +1x +  +1x +1x +  +1x +  +  +4x +  +  +  +45x +  +45x +  +  +  +45x +  +  +  +  +18x +18x +15x +  +  +  +3x +1x +  +  +  +  +2x +  +  +  +2x +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +43x +  +  +  +43x +43x +43x +43x +43x +43x +  +43x +  +  +  +4x +4x +  +  +  +4x +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +9x +  +  +  +9x +  +9x +  +  +  +  +  +  +  +  +9x +8x +8x +8x +  +  +9x +  +  +  +  +9x +  +  +  +  +  +  +  +  +9x +9x +4x +  +9x +7x +  +  +  +17x +17x +17x +14x +  +  +17x +  +  +  +  +  +  +  +  +  +  +  +17x +10x +7x +7x +  +10x +4x +4x +  +  +  +17x +  +  +  +17x +  +17x +  +17x +  +  +  +  +17x +17x +  +3x +2x +2x +1x +1x +1x +  +3x +  +17x +14x +14x +14x +  +17x +  +17x +  +  +  +  +  +  +17x +1x +  +17x +  +  +  +17x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +2x +  +  +  +  +  +  +2x +  +  +  +  +2x +  +  +  +  +2x +  +  +17x +  +  +  +7x +  +  +  +7x +7x +  +  +  +  +  +  +  +  +7x +7x +  +7x +2x +  +7x +4x +4x +4x +  +  +7x +7x +  +  +  +7x +  +  +  +3x +1x +  +  +  +  +2x +  +  +  +  +  +  +  +2x +  +  +  +3x +3x +  +  +  +  +3x +2x +2x +2x +2x +  +  +  +  +  +  +2x +  +  +  +  +  +2x +  +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +2x +  +  +  +  +2x +  +  +  +1x +  +2x +  +  +  +40x +  +  +  +  +  +40x +  +9x +  +  +7x +  +  +17x +  +3x +  +3x +  +  +1x +  +  +  +  +40x +  +  +  +  +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const set = require("set-value");
+const { EventType } = require("../../../constants");
+const {
+  removeUndefinedValues,
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  removeUndefinedAndNullValues,
+  constructPayload,
+  getBrowserInfo,
+  getValuesAsArrayFromConfig,
+  toUnixTimestamp,
+  getTimeDifference,
+  getErrorRespEvents,
+  getSuccessRespEvents,
+  CustomError,
+  isAppleFamily,
+  getFullName,
+  extractCustomFields
+} = require("../../util");
+const {
+  ConfigCategory,
+  mappingConfig,
+  MP_IDENTIFY_EXCLUSION_LIST
+} = require("./config");
+ 
+const mPIdentifyConfigJson = mappingConfig[ConfigCategory.IDENTIFY.name];
+const mPProfileAndroidConfigJson =
+  mappingConfig[ConfigCategory.PROFILE_ANDROID.name];
+const mPProfileIosConfigJson = mappingConfig[ConfigCategory.PROFILE_IOS.name];
+const mPEventPropertiesConfigJson =
+  mappingConfig[ConfigCategory.EVENT_PROPERTIES.name];
+ 
+function getEventTime(message) {
+  return new Date(message.timestamp).toISOString();
+}
+ 
+function responseBuilderSimple(parameters, message, eventType, destConfig) {
+  let headers = {};
+  let endpoint =
+    destConfig.dataResidency === "eu"
+      ? "https://api-eu.mixpanel.com/engage/"
+      : "https://api.mixpanel.com/engage/";
+ 
+  if (
+    eventType !== EventType.IDENTIFY &&
+    eventType !== EventType.GROUP &&
+    eventType !== "revenue"
+  ) {
+    const duration = getTimeDifference(message.timestamp);
+    if (duration.days <= 5) {
+      endpoint =
+        destConfig.dataResidency === "eu"
+          ? "https://api-eu.mixpanel.com/track/"
+          : "https://api.mixpanel.com/track/";
+    } else if (duration.years > 5) {
+      throw new CustomError(
+        "Event timestamp should be within last 5 years",
+        400
+      );
+    } else {
+      endpoint =
+        destConfig.dataResidency === "eu"
+          ? "https://api-eu.mixpanel.com/import/"
+          : "https://api.mixpanel.com/import/";
+      if (destConfig.apiSecret) {
+        headers = {
+          Authorization: `Basic ${Buffer.from(
+            `${destConfig.apiSecret}:`
+          ).toString("base64")}`
+        };
+      } else {
+        throw new CustomError(
+          "Event timestamp is older than 5 days and no apisecret is provided in destination config.",
+          400
+        );
+      }
+    }
+  }
+ 
+  const encodedData = Buffer.from(
+    JSON.stringify(removeUndefinedValues(parameters))
+  ).toString("base64");
+ 
+  const response = defaultRequestConfig();
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = endpoint;
+  response.headers = headers;
+  response.userId = message.anonymousId || message.userId;
+  response.params = { data: encodedData };
+ 
+  return response;
+}
+ 
+function processRevenueEvents(message, destination) {
+  const revenueValue = get(message, "properties.revenue");
+  const transactions = {
+    $time: getEventTime(message),
+    $amount: revenueValue
+  };
+  const parameters = {
+    $append: { $transactions: transactions },
+    $token: destination.Config.token,
+    $distinct_id: message.userId || message.anonymousId
+  };
+ 
+  return responseBuilderSimple(
+    parameters,
+    message,
+    "revenue",
+    destination.Config
+  );
+}
+ 
+function getEventValueForTrackEvent(message, destination) {
+  const mappedProperties = constructPayload(
+    message,
+    mPEventPropertiesConfigJson
+  );
+  const unixTimestamp = toUnixTimestamp(message.timestamp);
+  // ??
+  const properties = {
+    ...message.properties,
+    ...get(message, "context.traits"),
+    ...mappedProperties,
+    token: destination.Config.token,
+    distinct_id: message.userId || message.anonymousId,
+    time: unixTimestamp
+  };
+ 
+  if (message.channel === "web" && message.context.userAgent) {
+    const browser = getBrowserInfo(message.context.userAgent);
+    properties.$browser = browser.name;
+    properties.$browser_version = browser.version;
+  }
+ 
+  const parameters = {
+    event: message.event,
+    properties
+  };
+ 
+  return responseBuilderSimple(
+    parameters,
+    message,
+    EventType.TRACK,
+    destination.Config
+  );
+}
+ 
+function processTrack(message, destination) {
+  const returnValue = [];
+  if (message.properties && message.properties.revenue) {
+    returnValue.push(processRevenueEvents(message, destination));
+  }
+  returnValue.push(getEventValueForTrackEvent(message, destination));
+  return returnValue;
+}
+ 
+function getTransformedJSON(message, mappingJson, useNewMapping) {
+  let rawPayload = constructPayload(message, mappingJson);
+  const userName = get(rawPayload, "$name");
+  if (!userName) {
+    set(rawPayload, "$name", getFullName(message));
+  }
+ 
+  rawPayload = extractCustomFields(
+    message,
+    rawPayload,
+    ["traits", "context.traits"],
+    MP_IDENTIFY_EXCLUSION_LIST
+  );
+  /*
+  we are adding backward compatibility using useNewMapping key.
+  TODO :: This portion need to be removed after we deciding to stop 
+  support for old mapping.
+  */
+ 
+  if (!useNewMapping) {
+    if (rawPayload.$first_name) {
+      rawPayload.$firstName = rawPayload.$first_name;
+      delete rawPayload.$first_name;
+    }
+    if (rawPayload.$last_name) {
+      rawPayload.$lastName = rawPayload.$last_name;
+      delete rawPayload.$last_name;
+    }
+  }
+ 
+  return rawPayload;
+}
+ 
+function processIdentifyEvents(message, type, destination) {
+  const returnValue = [];
+  // this variable is used for supporting backward compatibility
+  const { useNewMapping } = destination.Config;
+  // user payload created
+  let properties = getTransformedJSON(
+    message,
+    mPIdentifyConfigJson,
+    useNewMapping
+  );
+  const device = get(message, "context.device");
+  if (device && device.token) {
+    let payload;
+    if (isAppleFamily(device.type)) {
+      payload = constructPayload(message, mPProfileIosConfigJson);
+      properties.$ios_devices = [device.token];
+    } else Eif (device.type.toLowerCase() === "android") {
+      payload = constructPayload(message, mPProfileAndroidConfigJson);
+      properties.$android_devices = [device.token];
+    }
+    properties = { ...properties, ...payload };
+  }
+  if (message.channel === "web" && message.context.userAgent) {
+    const browser = getBrowserInfo(message.context.userAgent);
+    properties.$browser = browser.name;
+    properties.$browser_version = browser.version;
+  }
+  const unixTimestamp = toUnixTimestamp(message.timestamp);
+ 
+  const parameters = {
+    $set: properties,
+    $token: destination.Config.token,
+    $distinct_id: message.userId || message.anonymousId,
+    $ip: get(message, "context.ip") || message.request_ip,
+    $time: unixTimestamp
+  };
+  if (message.context?.active === false) {
+    parameters.$ignore_time = true;
+  }
+  returnValue.push(
+    responseBuilderSimple(parameters, message, type, destination.Config)
+  );
+ 
+  if (message.userId && message.anonymousId && destination.Config.apiSecret) {
+    // Use this block when our userids are changed to UUID V4.
+    // const trackParameters = {
+    //   event: "$identify",
+    //   properties: {
+    //     $identified_id: message.userId,
+    //     $anon_id: message.anonymousId,
+    //     token: destination.Config.token
+    //   }
+    // };
+    // const identifyTrackResponse = responseBuilderSimple(
+    //   trackParameters,
+    //   message,
+    //   type,
+    //   destination.Config
+    // );
+    // identifyTrackResponse.endpoint =
+    //   destination.Config.dataResidency === "eu"
+    //     ? "https://api-eu.mixpanel.com/track/"
+    //     : "https://api.mixpanel.com/track/";
+    // returnValue.push(identifyTrackResponse);
+ 
+    const trackParameters = {
+      event: "$merge",
+      properties: {
+        $distinct_ids: [message.userId, message.anonymousId],
+        token: destination.Config.token
+      }
+    };
+    const identifyTrackResponse = responseBuilderSimple(
+      trackParameters,
+      message,
+      type,
+      destination.Config
+    );
+ 
+    identifyTrackResponse.endpoint =
+      destination.Config.dataResidency === "eu"
+        ? "https://api-eu.mixpanel.com/import/"
+        : "https://api.mixpanel.com/import/";
+ 
+    identifyTrackResponse.headers = {
+      Authorization: `Basic ${Buffer.from(
+        `${destination.Config.apiSecret}:`
+      ).toString("base64")}`
+    };
+    returnValue.push(identifyTrackResponse);
+  }
+ 
+  return returnValue;
+}
+ 
+function processPageOrScreenEvents(message, type, destination) {
+  const mappedProperties = constructPayload(
+    message,
+    mPEventPropertiesConfigJson
+  );
+  const unixTimestamp = toUnixTimestamp(message.timestamp);
+  const properties = {
+    ...get(message, "context.traits"),
+    ...message.properties,
+    ...mappedProperties,
+    token: destination.Config.token,
+    distinct_id: message.userId || message.anonymousId,
+    time: unixTimestamp
+  };
+ 
+  Eif (message.name) {
+    properties.name = message.name;
+  }
+  if (message.category) {
+    properties.category = message.category;
+  }
+  if (message.channel === "web" && message.context.userAgent) {
+    const browser = getBrowserInfo(message.context.userAgent);
+    properties.$browser = browser.name;
+    properties.$browser_version = browser.version;
+  }
+ 
+  const eventName = type === "page" ? "Loaded a Page" : "Loaded a Screen";
+  const parameters = {
+    event: eventName,
+    properties
+  };
+  return responseBuilderSimple(parameters, message, type, destination.Config);
+}
+ 
+function processAliasEvents(message, type, destination) {
+  if (!(message.previousId || message.anonymousId)) {
+    throw new CustomError(
+      "Either previous id or anonymous id should be present in alias payload",
+      400
+    );
+  }
+  const parameters = {
+    event: "$create_alias",
+    properties: {
+      distinct_id: message.previousId || message.anonymousId,
+      alias: message.userId,
+      token: destination.Config.token
+    }
+  };
+  return responseBuilderSimple(parameters, message, type, destination.Config);
+}
+ 
+function processGroupEvents(message, type, destination) {
+  const returnValue = [];
+  const groupKeys = getValuesAsArrayFromConfig(
+    destination.Config.groupKeySettings,
+    "groupKey"
+  );
+  let groupKeyVal;
+  if (groupKeys.length > 0) {
+    groupKeys.forEach(groupKey => {
+      groupKeyVal = get(message.traits, groupKey);
+      Eif (groupKeyVal) {
+        const parameters = {
+          $token: destination.Config.token,
+          $distinct_id: message.userId || message.anonymousId,
+          $set: {
+            [groupKey]: [get(message.traits, groupKey)]
+          }
+        };
+        const response = responseBuilderSimple(
+          parameters,
+          message,
+          type,
+          destination.Config
+        );
+        returnValue.push(response);
+ 
+        const groupParameters = {
+          $token: destination.Config.token,
+          $group_key: groupKey,
+          $group_id: get(message.traits, groupKey),
+          $set: {
+            ...message.traits
+          }
+        };
+ 
+        const groupResponse = responseBuilderSimple(
+          groupParameters,
+          message,
+          type,
+          destination.Config
+        );
+ 
+        groupResponse.endpoint =
+          destination.Config.dataResidency === "eu"
+            ? "https://api-eu.mixpanel.com/groups/"
+            : "https://api.mixpanel.com/groups/";
+ 
+        returnValue.push(groupResponse);
+      }
+    });
+  } else {
+    throw new CustomError("config is not supported", 400);
+  }
+  return returnValue;
+}
+ 
+function processSingleMessage(message, destination) {
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  switch (message.type) {
+    case EventType.TRACK:
+      return processTrack(message, destination);
+    case EventType.SCREEN:
+    case EventType.PAGE: {
+      return processPageOrScreenEvents(message, message.type, destination);
+    }
+    case EventType.IDENTIFY:
+      return processIdentifyEvents(message, message.type, destination);
+    case EventType.ALIAS:
+      return processAliasEvents(message, message.type, destination);
+    case EventType.GROUP:
+      return processGroupEvents(message, message.type, destination);
+ 
+    default:
+      throw new CustomError("message type not supported", 400);
+  }
+}
+ 
+function process(event) {
+  return processSingleMessage(event.message, event.destination);
+}
+ 
+// Documentation about how Mixpanel handles the utm parameters
+// Ref: https://help.mixpanel.com/hc/en-us/articles/115004613766-Default-Properties-Collected-by-Mixpanel
+// Ref: https://help.mixpanel.com/hc/en-us/articles/115004561786-Track-UTM-Tags
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/mssql/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/mssql/index.html new file mode 100644 index 00000000000..70faeaae445 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/mssql/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/mssql + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/mssql

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%8/875%3/4100%3/3100%8/8
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/mssql/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/mssql/transform.js.html new file mode 100644 index 00000000000..11466629c7b --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/mssql/transform.js.html @@ -0,0 +1,164 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/mssql/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/mssql transform.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +293x +  +3x +  +  +124x +  +  +  +  +  +124x +124x +124x +124x +  +  +  +  +  +  +  +  +  +3x +  +  +  + 
const { processWarehouseMessage } = require("../../../warehouse");
+ 
+const mssql = "mssql";
+ 
+function processSingleMessage(message, options) {
+  return processWarehouseMessage(message, options);
+}
+ 
+function getDataTypeOverride(key, val, options) {}
+ 
+function process(event) {
+  const whSchemaVersion = event.request.query.whSchemaVersion || "v1";
+  const whStoreEvent = event.destination.Config.storeFullEvent === true;
+  const provider = mssql;
+  return processSingleMessage(event.message, {
+    metadata: event.metadata,
+    whSchemaVersion,
+    whStoreEvent,
+    getDataTypeOverride,
+    provider,
+    sourceCategory: event.metadata ? event.metadata.sourceCategory : null
+  });
+}
+ 
+module.exports = {
+  process,
+  getDataTypeOverride
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/config.js.html new file mode 100644 index 00000000000..d71b8f9449a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/config.js.html @@ -0,0 +1,1022 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ometria/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/ometria config.js

+
+ +
+ 100% + Statements + 14/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +3151x +  +1x +1x +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ENDPOINT = "https://api.ometria.com/v2/push";
+const CONFIG_CATEGORIES = {
+  IDENTIFY: { type: "identify", name: "OmetriaContact" },
+  CUSTOM_EVENT: { type: "custom event", name: "OmetriaCustomEvent" },
+  ORDER: { type: "order", name: "OmetriaOrder" },
+  LINEITEMS: { type: "lineitems", name: "OmetriaLineitems" },
+  VARIANT: { type: "variant", name: "OmetriaVariant" }
+};
+ 
+const MAX_BATCH_SIZE = 100;
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+const IDENTIFY_EXCLUSION_FIELDS = [
+  "email",
+  "phoneNumber",
+  "phone",
+  "collection",
+  "marketinOptin",
+  "userId",
+  "anonymousId",
+  "prefix",
+  "name",
+  "first_name",
+  "firstName",
+  "last_name",
+  "lastName",
+  "middle_name",
+  "middleName",
+  "firstName",
+  "lastname",
+  "middlename",
+  "dateOfBirth",
+  "birthday",
+  "countryId",
+  "timezone",
+  "timestampAcquired",
+  "createdAt",
+  "timestampSubscribed",
+  "timestampUnsubscribed",
+  "channels",
+  "storeIds",
+  "gender",
+  "removeFromLists",
+  "addToLists",
+  "marketingOptin",
+  "custom_fields",
+  "listingId",
+  "forceOptin",
+  "merge"
+];
+ 
+const CUSTOM_EVENT_EXCLUSION_FIELDS = [
+  "event_id",
+  "event_type",
+  "timestamp",
+  "profile_id",
+  "email",
+  "userId",
+  "anonymousId",
+  "custom_fields"
+];
+ 
+const ORDER_EXCLUSION_FIELDS = [
+  "order_id",
+  "timestamp",
+  "grand_total",
+  "subtotal",
+  "discount",
+  "shipping",
+  "tax",
+  "currency",
+  "web_id",
+  "status",
+  "customer",
+  "products",
+  "ip_address",
+  "channel",
+  "store",
+  "payment_method",
+  "shipping_method",
+  "shipping_address",
+  "billing_address",
+  "coupon_code",
+  "custom_fields",
+  "is_valid",
+  "status"
+];
+ 
+const LINEITEMS_EXCLUSION_FIELDS = [
+  "product_id",
+  "variant_id",
+  "quantity",
+  "sku",
+  "unit_price",
+  "quantity_refunded",
+  "refunded",
+  "subtotal",
+  "tax",
+  "total",
+  "discount",
+  "is_on_sale",
+  "totals",
+  "properties",
+  "variant_options"
+];
+ 
+const MARKETING_OPTIN_LIST = [
+  "EXPLICITYLY_OPTEDOUT",
+  "NOT_SPECIFIED",
+  "EXPLICITLY_OPTEDIN"
+];
+ 
+const ecomEvents = [
+  "order completed",
+  "order shipped",
+  "order pending",
+  "order complete",
+  "pending",
+  "complete",
+  "shipped"
+];
+ 
+const eventNameMapping = {
+  "order completed": "complete",
+  "order complete": "complete",
+  complete: "complete",
+  "order pending": "pending",
+  pending: "pending",
+  "order shipped": "shipped",
+  shipped: "shipped"
+};
+ 
+const currencyList = [
+  "AED",
+  "AFN",
+  "ALL",
+  "AMD",
+  "ANG",
+  "AOA",
+  "AUD",
+  "AWG",
+  "AZN",
+  "BAM",
+  "BBD",
+  "BDT",
+  "BGN",
+  "BHD",
+  "BIF",
+  "BMD",
+  "BND",
+  "BOB",
+  "BRL",
+  "BSD",
+  "BTN",
+  "BWP",
+  "BYR",
+  "BZD",
+  "CAD",
+  "CDF",
+  "CHF",
+  "CLP",
+  "CNY",
+  "COP",
+  "CRC",
+  "CUC",
+  "CUP",
+  "CVE",
+  "CZK",
+  "DJF",
+  "DKK",
+  "DOP",
+  "DZD",
+  "EGP",
+  "ERN",
+  "ETB",
+  "EUR",
+  "FJD",
+  "FKP",
+  "GBP",
+  "GEL",
+  "GGP",
+  "GHS",
+  "GIP",
+  "GMD",
+  "GNF",
+  "GTQ",
+  "GYD",
+  "HKD",
+  "HNL",
+  "HRK",
+  "HTG",
+  "HUF",
+  "IDR",
+  "ILS",
+  "IMP",
+  "INR",
+  "IQD",
+  "IRR",
+  "ISK",
+  "JEP",
+  "JMD",
+  "JOD",
+  "JPY",
+  "KES",
+  "KGS",
+  "KHR",
+  "KMF",
+  "KPW",
+  "KRW",
+  "KWD",
+  "KYD",
+  "KZT",
+  "LAK",
+  "LBP",
+  "LKR",
+  "LRD",
+  "LSL",
+  "LYD",
+  "MAD",
+  "MDL",
+  "MGA",
+  "MKD",
+  "MMK",
+  "MNT",
+  "MOP",
+  "MRO",
+  "MUR",
+  "MVR",
+  "MWK",
+  "MXN",
+  "MYR",
+  "MZN",
+  "NAD",
+  "NGN",
+  "NIO",
+  "NOK",
+  "NPR",
+  "NZD",
+  "OMR",
+  "PAB",
+  "PEN",
+  "PGK",
+  "PHP",
+  "PKR",
+  "PLN",
+  "PYG",
+  "QAR",
+  "RON",
+  "RSD",
+  "RUB",
+  "RWF",
+  "SAR",
+  "SBD",
+  "SCR",
+  "SDG",
+  "SEK",
+  "SGD",
+  "SHP",
+  "SLL",
+  "SOS",
+  "SPL",
+  "SRD",
+  "STD",
+  "SVC",
+  "SYP",
+  "SZL",
+  "THB",
+  "TJS",
+  "TMT",
+  "TND",
+  "TOP",
+  "TRY",
+  "TTD",
+  "TVD",
+  "TWD",
+  "TZS",
+  "UAH",
+  "UGX",
+  "USD",
+  "UYU",
+  "UZS",
+  "VEF",
+  "VND",
+  "VUV",
+  "WST",
+  "XAF",
+  "XCD",
+  "XDR",
+  "XOF",
+  "XPF",
+  "YER",
+  "ZAR",
+  "ZMW",
+  "ZWD"
+];
+ 
+module.exports = {
+  ENDPOINT,
+  ecomEvents,
+  eventNameMapping,
+  currencyList,
+  MAX_BATCH_SIZE,
+  IDENTIFY_EXCLUSION_FIELDS,
+  CUSTOM_EVENT_EXCLUSION_FIELDS,
+  MARKETING_OPTIN_LIST,
+  ORDER_EXCLUSION_FIELDS,
+  LINEITEMS_EXCLUSION_FIELDS,
+  contactDataMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY.name],
+  customEventMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.CUSTOM_EVENT.name],
+  orderMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.ORDER.name],
+  lineitemsMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.LINEITEMS.name],
+  variantMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.VARIANT.name]
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/index.html new file mode 100644 index 00000000000..17b3546704d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ometria + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/ometria

+
+ +
+ 85.65% + Statements + 185/216 +
+ + +
+ 62.16% + Branches + 92/148 +
+ + +
+ 100% + Functions + 15/15 +
+ + +
+ 85.65% + Lines + 185/216 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%14/14100%0/0100%0/0100%14/14
transform.js +
+
87.59%120/13760%57/95100%7/787.59%120/137
util.js +
+
78.46%51/6566.04%35/53100%8/878.46%51/65
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/transform.js.html new file mode 100644 index 00000000000..ecdebad22cf --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/transform.js.html @@ -0,0 +1,1019 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ometria/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/ometria transform.js

+
+ +
+ 87.59% + Statements + 120/137 +
+ + +
+ 60% + Branches + 57/95 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 87.59% + Lines + 120/137 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +1x +7x +7x +  +7x +7x +7x +7x +  +  +  +  +  +7x +7x +  +  +  +7x +  +  +7x +7x +7x +  +  +  +  +  +7x +7x +  +  +7x +7x +  +7x +  +  +  +  +  +7x +  +  +  +  +  +  +  +7x +  +  +7x +7x +  +  +  +  +  +  +  +  +7x +  +  +  +7x +3x +3x +3x +2x +2x +  +1x +1x +1x +  +  +  +7x +  +  +1x +6x +6x +  +  +  +6x +6x +6x +5x +5x +  +  +5x +5x +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +5x +5x +5x +5x +5x +5x +5x +  +  +  +  +  +5x +5x +  +  +5x +5x +4x +4x +4x +  +  +5x +1x +  +5x +2x +  +5x +  +  +  +1x +1x +  +  +1x +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +1x +  +1x +  +  +1x +13x +  +  +13x +  +13x +  +7x +7x +  +6x +6x +  +  +  +13x +  +  +  +  +  +1x +11x +11x +  +  +  +  +  +  +11x +  +  +  +11x +11x +11x +11x +11x +11x +  +  +11x +  +  +1x +1x +  +  +  +1x +1x +1x +1x +1x +1x +  +  +  +1x +1x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +1x +  +  +1x +1x +  +  +  +  +1x +  +  +1x + 
/* eslint-disable one-var */
+/* eslint-disable camelcase */
+const { EventType } = require("../../../constants");
+const {
+  constructPayload,
+  extractCustomFields,
+  removeUndefinedAndNullValues,
+  returnArrayOfSubarrays,
+  defaultPostRequestConfig,
+  CustomError,
+  defaultRequestConfig,
+  getValueFromMessage,
+  isEmptyObject,
+  getFieldValueFromMessage,
+  getIntegrationsObj,
+  getErrorRespEvents,
+  getSuccessRespEvents
+} = require("../../util/index");
+const {
+  MAX_BATCH_SIZE,
+  ecomEvents,
+  eventNameMapping,
+  contactDataMapping,
+  customEventMapping,
+  orderMapping,
+  currencyList,
+  IDENTIFY_EXCLUSION_FIELDS,
+  CUSTOM_EVENT_EXCLUSION_FIELDS,
+  ORDER_EXCLUSION_FIELDS,
+  ENDPOINT,
+  MARKETING_OPTIN_LIST
+} = require("./config");
+const {
+  isValidTimestamp,
+  createLineItems,
+  addressMappper,
+  contactPayloadValidator
+} = require("./util");
+ 
+const identifyResponseBuilder = (message, { Config }) => {
+  let payload = constructPayload(message, contactDataMapping);
+  payload = contactPayloadValidator(payload);
+ 
+  payload["@type"] = "contact";
+  Eif (!payload.properties) {
+    let customFields = {};
+    customFields = extractCustomFields(
+      message,
+      customFields,
+      ["traits", "context.traits"],
+      IDENTIFY_EXCLUSION_FIELDS
+    );
+    Eif (!isEmptyObject(customFields)) {
+      payload.properties = customFields;
+    }
+  }
+ 
+  let { marketingOptin, allowMarketing, allowTransactional } = Config;
+  let dt_updated_marketing, dt_updated_transactional;
+ 
+  const integrationsObj = getIntegrationsObj(message, "ometria");
+  Eif (integrationsObj) {
+    Iif (
+      integrationsObj.marketingOptin &&
+      MARKETING_OPTIN_LIST.includes(integrationsObj.marketingOptin)
+    ) {
+      marketingOptin = integrationsObj.marketingOptin;
+    }
+    Eif (integrationsObj.listingId) {
+      payload.id = integrationsObj.listingId;
+    }
+ 
+    allowMarketing = integrationsObj.allowMarketing || allowMarketing;
+    allowTransactional =
+      integrationsObj.allowTransactional || allowTransactional;
+    Iif (
+      integrationsObj.dt_updated_marketing &&
+      isValidTimestamp(integrationsObj.dt_updated_marketing)
+    ) {
+      dt_updated_marketing = integrationsObj.dt_updated_marketing;
+    }
+    Iif (
+      integrationsObj.dt_updated_transactional &&
+      isValidTimestamp(integrationsObj.dt_updated_transactional)
+    ) {
+      dt_updated_transactional = integrationsObj.dt_updated_transactional;
+    }
+  }
+ 
+  Iif (!payload.id) {
+    throw new CustomError("listingId is required for identify", 400);
+  }
+  payload.marketing_optin = marketingOptin;
+  payload.channels = {
+    sms: removeUndefinedAndNullValues({
+      dt_updated_marketing,
+      dt_updated_transactional,
+      allow_marketing: allowMarketing,
+      allow_transactional: allowTransactional
+    })
+  };
+ 
+  const name = getValueFromMessage(message, [
+    "traits.name",
+    "context.traits.name"
+  ]);
+  if (name) {
+    const splitArr = name.split(" ");
+    const [fName, mName, lName] = splitArr;
+    if (splitArr && splitArr.length <= 2) {
+      payload.firstname = fName || null;
+      payload.lastname = mName || null;
+    } else {
+      payload.firstname = fName || null;
+      payload.middlename = mName || null;
+      payload.lastname = lName || null;
+    }
+  }
+ 
+  return removeUndefinedAndNullValues(payload);
+};
+ 
+const trackResponseBuilder = message => {
+  let event = getValueFromMessage(message, "event");
+  Iif (!event) {
+    throw new CustomError("Event name is required for track call.", 400);
+  }
+ 
+  event = event.trim().toLowerCase();
+  let payload = {};
+  if (ecomEvents.includes(event)) {
+    payload = constructPayload(message, orderMapping);
+    Iif (!isValidTimestamp(payload.timestamp)) {
+      throw new CustomError("Timestamp format must be ISO-8601", 400);
+    }
+    payload.currency = payload.currency.trim().toUpperCase();
+    Iif (!currencyList.includes(payload.currency)) {
+      throw new CustomError(
+        "currency should be only 3 characters and must follow format ISO 4217.",
+        400
+      );
+    }
+ 
+    const customer = removeUndefinedAndNullValues({
+      id: getFieldValueFromMessage(message, "userId"),
+      email: getValueFromMessage(message, [
+        "traits.email",
+        "context.traits.email",
+        "properties.email"
+      ]),
+      firstname: getFieldValueFromMessage(message, "firstName"),
+      lastname: getFieldValueFromMessage(message, "lastName")
+    });
+    Iif (!customer.id || !customer.email) {
+      throw new CustomError(
+        "customer_id and email is required for order related event.",
+        400
+      );
+    }
+ 
+    payload.customer = customer;
+    payload["@type"] = "order";
+    payload.status = eventNameMapping[event];
+    payload.is_valid = true;
+    Eif (!payload.properties) {
+      let customFields = {};
+      customFields = extractCustomFields(
+        message,
+        customFields,
+        ["properties"],
+        ORDER_EXCLUSION_FIELDS
+      );
+      Eif (!isEmptyObject(customFields)) {
+        payload.properties = customFields;
+      }
+    }
+    const items = getValueFromMessage(message, "properties.products");
+    if (items) {
+      const lineitems = createLineItems(items);
+      Eif (lineitems && lineitems.length > 0) {
+        payload.lineitems = lineitems;
+      }
+    }
+    if (payload.billing_address) {
+      payload.billing_address = addressMappper(payload.billing_address);
+    }
+    if (payload.shipping_address) {
+      payload.shipping_address = addressMappper(payload.shipping_address);
+    }
+    return removeUndefinedAndNullValues(payload);
+  }
+ 
+  // custom events
+  payload = constructPayload(message, customEventMapping);
+  Iif (!isValidTimestamp(payload.timestamp)) {
+    throw new CustomError("Timestamp format must be ISO-8601", 400);
+  }
+  Iif (!payload.id) {
+    payload.id = message.messageId;
+  }
+  payload["@type"] = "custom_event";
+  payload.event_type = event;
+  Eif (!payload.properties) {
+    let customFields = {};
+    customFields = extractCustomFields(
+      message,
+      customFields,
+      ["properties"],
+      CUSTOM_EVENT_EXCLUSION_FIELDS
+    );
+    payload.properties = customFields;
+  }
+  return removeUndefinedAndNullValues(payload);
+};
+ 
+const handleMessage = (message, destination) => {
+  Iif (!message.type) {
+    throw new CustomError(`Message type is not defined`, 400);
+  }
+  const messageType = message.type.toLowerCase();
+  let payload;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      payload = identifyResponseBuilder(message, destination);
+      break;
+    case EventType.TRACK:
+      payload = trackResponseBuilder(message);
+      break;
+    default:
+      throw new CustomError(`message type ${messageType} not supported`, 400);
+  }
+  return payload;
+};
+ 
+/**
+ * Processing Single event
+ */
+const process = event => {
+  const { message, destination } = event;
+  Iif (!message.type) {
+    throw new CustomError(
+      "message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  Iif (!destination.Config.apiKey) {
+    throw new CustomError("Invalid Api Key", 400);
+  }
+ 
+  const payload = handleMessage(message, destination);
+  const response = defaultRequestConfig();
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.body.JSON_ARRAY = { batch: JSON.stringify([payload]) };
+  response.endpoint = ENDPOINT;
+  response.headers = {
+    "X-Ometria-Auth": destination.Config.apiKey
+  };
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+  const inputChunks = returnArrayOfSubarrays(inputs, MAX_BATCH_SIZE);
+  const successList = [];
+  const errorList = [];
+  inputChunks.forEach(chunk => {
+    const eventsList = [];
+    const metadataList = [];
+ 
+    // using the first destination config in chunk for transforming the events in one
+    // chunk into a batch
+    const { destination } = chunk[0];
+    chunk.forEach(async input => {
+      try {
+        const transformedEvent = handleMessage(input.message, destination);
+        eventsList.push(transformedEvent);
+        metadataList.push(input.metadata);
+      } catch (error) {
+        errorList.push(
+          getErrorRespEvents(
+            [input.metadata],
+            error.response
+              ? error.response.status
+              : error.code
+              ? error.code
+              : 400,
+            error.message || "Error occurred while processing payload."
+          )
+        );
+      }
+    });
+ 
+    Eif (eventsList.length !== 0) {
+      // setting up the batched request json here
+      const batchedRequest = defaultRequestConfig();
+      batchedRequest.endpoint = ENDPOINT;
+      batchedRequest.headers = {
+        "X-Ometria-Auth": destination.Config.apiKey
+      };
+      batchedRequest.body.JSON_ARRAY = { batch: JSON.stringify(eventsList) };
+      successList.push(
+        getSuccessRespEvents(batchedRequest, metadataList, destination, true)
+      );
+    }
+  });
+  return [...errorList, ...successList];
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/util.js.html new file mode 100644 index 00000000000..f9fef587e5a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/ometria/util.js.html @@ -0,0 +1,542 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/ometria/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/ometria util.js

+
+ +
+ 78.46% + Statements + 51/65 +
+ + +
+ 66.04% + Branches + 35/53 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 78.46% + Lines + 51/65 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +1x +  +1x +6x +6x +  +  +1x +2x +2x +  +  +1x +3x +3x +3x +3x +3x +3x +  +  +  +  +  +  +  +3x +  +  +1x +4x +4x +4x +4x +4x +  +  +  +  +4x +4x +1x +  +3x +3x +3x +  +  +4x +4x +4x +  +  +  +  +  +4x +  +  +  +4x +  +  +  +  +  +4x +  +  +  +  +  +  +  +4x +  +  +1x +3x +2x +2x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +7x +7x +  +  +  +7x +  +  +  +7x +  +  +  +  +  +  +7x +  +  +  +  +  +  +7x +  +  +  +  +  +  +7x +  +  +1x +  +  +  +  +  +  + 
const {
+  lineitemsMapping,
+  variantMapping,
+  LINEITEMS_EXCLUSION_FIELDS
+} = require("./config");
+const logger = require("../../../logger");
+const {
+  constructPayload,
+  removeUndefinedAndNullValues,
+  extractCustomFields,
+  isEmptyObject,
+  getValueFromMessage,
+  isObject,
+  isDefinedAndNotNull
+} = require("../../util");
+ 
+const isValidTimestamp = timestamp => {
+  const re = /^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$/;
+  return re.test(String(timestamp));
+};
+ 
+const isValidPhone = phone => {
+  const phoneformat = /^\+[1-9]\d{10,14}$/;
+  return phoneformat.test(String(phone));
+};
+ 
+const createVariantList = variants => {
+  const variantList = [];
+  Eif (variants.length > 0) {
+    variants.forEach((variant, index) => {
+      const variantPayload = constructPayload(variant, variantMapping);
+      Eif (variantPayload.id && variantPayload.type && variantPayload.label) {
+        variantList.push(variantPayload);
+      } else {
+        logger.error(
+          `variant at index ${index} dropped. Id, type and label are required.`
+        );
+      }
+    });
+  }
+  return variantList;
+};
+ 
+const createLineItems = items => {
+  const itemList = [];
+  Eif (items.length > 0) {
+    items.forEach((item, index) => {
+      const itemPayload = constructPayload(item, lineitemsMapping);
+      Eif (
+        itemPayload.product_id &&
+        itemPayload.quantity &&
+        (isDefinedAndNotNull(itemPayload.unit_price) || isDefinedAndNotNull(itemPayload.subtotal))
+      ) {
+        const variantList = item.variant_options;
+        if (!variantList || !Array.isArray(variantList)) {
+          logger.error("variant options must be an array of objects.");
+        } else {
+          const variantOptions = createVariantList(variantList);
+          Eif (variantOptions && variantOptions.length > 0) {
+            itemPayload.variant_options = variantOptions;
+          }
+        }
+        Eif (!itemPayload.properties) {
+          let customFields = {};
+          customFields = extractCustomFields(
+            item,
+            customFields,
+            "root",
+            LINEITEMS_EXCLUSION_FIELDS
+          );
+          Iif (!isEmptyObject(customFields)) {
+            itemPayload.properties = customFields;
+          }
+        }
+        Iif (
+          itemPayload.is_on_sale &&
+          typeof itemPayload.is_on_sale !== "boolean"
+        ) {
+          itemPayload.is_on_sale = null;
+        }
+        itemList.push(removeUndefinedAndNullValues(itemPayload));
+      } else {
+        logger.error(
+          `item at index ${index} dropped. Product id , quantity and either unit_price or subtotal are required.`
+        );
+      }
+    });
+  }
+  return itemList;
+};
+ 
+const addressMappper = address => {
+  if (!isObject(address)) {
+    logger.error("billing address or shipping address should be an object.");
+    return null;
+  }
+  const res = {
+    city: getValueFromMessage(address, "city"),
+    state: getValueFromMessage(address, "state"),
+    country_code: getValueFromMessage(address, [
+      "country_code",
+      "country",
+      "countryCode"
+    ]),
+    postcode: getValueFromMessage(address, [
+      "postcode",
+      "postalCode",
+      "postalcode"
+    ])
+  };
+  return res;
+};
+ 
+const contactPayloadValidator = payload => {
+  const updatedPayload = payload;
+  Iif (payload["@force_optin"] && typeof payload["@force_optin"] !== "boolean") {
+    updatedPayload["@force_optin"] = null;
+    logger.error("forceOptin must contain only boolean value.");
+  }
+  Iif (payload.phone_number && !isValidPhone(payload.phone_number)) {
+    updatedPayload.phone_number = null;
+    logger.error("phone number format must be E.164.");
+  }
+  Iif (
+    payload.timestamp_acquired &&
+    !isValidTimestamp(payload.timestamp_acquired)
+  ) {
+    updatedPayload.timestamp_acquired = null;
+    logger.error("timestamp format must be ISO 8601.");
+  }
+  Iif (
+    payload.timestamp_subscribed &&
+    !isValidTimestamp(payload.timestamp_subscribed)
+  ) {
+    updatedPayload.timestamp_subscribed = null;
+    logger.error("timestamp format must be ISO 8601.");
+  }
+  Iif (
+    payload.timestamp_unsubscribed &&
+    !isValidTimestamp(payload.timestamp_unsubscribed)
+  ) {
+    updatedPayload.timestamp_unsubscribed = null;
+    logger.error("timestamp format must be ISO 8601.");
+  }
+  return updatedPayload;
+};
+ 
+module.exports = {
+  isValidTimestamp,
+  createLineItems,
+  isValidPhone,
+  addressMappper,
+  contactPayloadValidator
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/pardot/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/pardot/config.js.html new file mode 100644 index 00000000000..95f18f6079e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/pardot/config.js.html @@ -0,0 +1,152 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/pardot/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/pardot config.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +251x +  +1x +1x +  +1x +  +  +  +1x +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_URL = "https://pi.pardot.com";
+const version = "4";
+ 
+const endpoints = {
+  upsertUrl: `${BASE_URL}/api/prospect/version/${version}/do/upsert`
+};
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: {
+    name: "PardotIdentify",
+    endPointUpsert: endpoints.upsertUrl
+  }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  BASE_URL,
+  identifyConfig: MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY.name],
+  DESTINATION: "PARDOT",
+  CONFIG_CATEGORIES
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/pardot/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/pardot/index.html new file mode 100644 index 00000000000..e82f45eadb4 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/pardot/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/pardot + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/pardot

+
+ +
+ 88.89% + Statements + 72/81 +
+ + +
+ 70.73% + Branches + 29/41 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 88.89% + Lines + 72/81 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%7/7100%0/0100%0/0100%7/7
transform.js +
+
87.84%65/7470.73%29/41100%9/987.84%65/74
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/pardot/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/pardot/transform.js.html new file mode 100644 index 00000000000..3c9cc1f06bc --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/pardot/transform.js.html @@ -0,0 +1,782 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/pardot/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/pardot transform.js

+
+ +
+ 87.84% + Statements + 65/74 +
+ + +
+ 70.73% + Branches + 29/41 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 87.84% + Lines + 65/74 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +5x +5x +1x +  +  +  +  +4x +  +  +1x +4x +4x +4x +4x +4x +  +  +  +4x +4x +  +  +1x +4x +  +  +  +  +  +  +  +  +  +  +  +1x +4x +4x +4x +2x +2x +  +  +2x +  +1x +1x +  +1x +1x +  +  +  +  +  +  +2x +  +  +1x +5x +5x +  +4x +4x +4x +  +4x +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +4x +4x +  +  +4x +  +  +1x +  +5x +  +  +  +  +  +5x +  +  +  +  +  +  +5x +  +  +  +  +  +  +5x +5x +  +5x +  +  +  +  +  +  +4x +  +  +1x +5x +  +  +1x +1x +  +  +  +  +1x +  +5x +5x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-lonely-if */
+/* eslint-disable no-else-return */
+ 
+/**
+ * Doc for the file:
+ * This destination in general uses upsert API exposed by Pardot for creation/updation of a prospect
+ *
+ * externalId should be sent inside context object
+ * Example:
+ * {
+ *    ...,
+ *    context: {
+ *      externalId: {
+ *        type: 'pardotId' || 'crmfid',
+ *        id: number || string (whatever pardot/salesforce provides as pardot id or crm fid)
+ *      },
+ *      ...
+ *    }
+ *    ...
+ * }
+ *
+ * If externalId sent as a valid object including type & id in it, we would update the prospect
+ * If externalId is not sent or not a valid object, we would by default create the prospect
+ *
+ * Cases:
+ * case-1 -> externalId = { type: 'randpmType', id: 1239835 } - created(use upsert API) using email in payload
+ * case-2 -> externalId = { type: 'pardotId', id: 1239835 } - update(use upsert API) using pardot id provided here
+ * case-3 -> externalId = { type: 'crmfid', id: 'xyze' } - try to update(use upsert API) using crmfid
+ * case-4 -> externalId = { type: 'pardotId' } - created(use upsert API) using email in payload
+ * case-5 -> externalId = { id: 1234434 } - created(use upsert API) using email in payload
+ * case-6 -> externalId = { } - created(use upsert API) using email in payload
+ * case-7 -> externalId not sent in payload - created(use upsert API) using email in payload
+ *
+ */
+ 
+const get = require("get-value");
+const { identifyConfig } = require("./config");
+const logger = require("../../../logger");
+const {
+  defaultRequestConfig,
+  constructPayload,
+  defaultPostRequestConfig,
+  getFieldValueFromMessage,
+  CustomError,
+  removeUndefinedValues,
+  getSuccessRespEvents,
+  getErrorRespEvents
+} = require("../../util");
+const ErrorBuilder = require("../../util/error");
+ 
+const { CONFIG_CATEGORIES } = require("./config");
+const { TRANSFORMER_METRIC } = require("../../util/constant");
+ 
+/**
+ * Get access token to be bound to the event req headers
+ *
+ * Note:
+ * This method needs to be implemented particular to the destination
+ * As the schema that we'd get in `metadata.secret` can be different
+ * for different destinations
+ *
+ * @param {Object} metadata
+ * @returns
+ */
+const getAccessToken = metadata => {
+  // OAuth for this destination
+  const { secret } = metadata;
+  if (!secret) {
+    throw new ErrorBuilder()
+      .setMessage("Empty/Invalid access token")
+      .setStatus(500)
+      .build();
+  }
+  return secret.access_token;
+};
+ 
+const buildResponse = (payload, url, destination, token) => {
+  const responseBody = removeUndefinedValues(payload);
+  const response = defaultRequestConfig();
+  response.endpoint = url;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.headers = {
+    Authorization: `Bearer ${token}`,
+    "Pardot-Business-Unit-Id": destination.Config.businessUnitId
+  };
+  response.body.FORM = responseBody;
+  return response;
+};
+ 
+const isExtIdNotProperlyDefined = externalId => {
+  return !externalId || (externalId && (!externalId.type || !externalId.id));
+};
+ 
+/**
+ * This method provides the url that would be used to send the event to Pardot
+ *
+ * @typedef {Object} urlParams
+ * @property {{ type: string, id: string }} externalId
+ * @property {Object} category
+ * @property {string} email - email sent in the payload
+ * @returns {properUrl} - The complete url used for sending event to Pardot
+ */
+const getUrl = urlParams => {
+  const { externalId, category, email, nonProperExtId } = urlParams;
+  let properUrl = `${category.endPointUpsert}/email/${email}`;
+  if (nonProperExtId) {
+    logger.debug(`PARDOT: externalId doesn't exist/invalid datastructure`);
+    return properUrl;
+  }
+  // when there is a proper externalId object defined
+  switch (externalId.type.toLowerCase()) {
+    case "pardotid":
+      properUrl = `${category.endPointUpsert}/id/${externalId.id}`;
+      break;
+    case "crmfid":
+      properUrl = `${category.endPointUpsert}/fid/${externalId.id}`;
+      break;
+    default:
+      logger.debug(
+        `PARDOT: externalId type is different from the ones supported`
+      );
+      break;
+  }
+  return properUrl;
+};
+ 
+const processIdentify = ({ message, metadata }, destination, category) => {
+  const { campaignId } = destination.Config;
+  const accessToken = getAccessToken(metadata);
+ 
+  let extId = get(message, "context.externalId");
+  extId = extId && extId.length > 0 ? extId[0] : null;
+  const email = getFieldValueFromMessage(message, "email");
+ 
+  const prospectObject = constructPayload(message, identifyConfig);
+  const nonProperExtId = isExtIdNotProperlyDefined(extId);
+  Iif (nonProperExtId && !email) {
+    throw new ErrorBuilder()
+      .setStatus(400)
+      .setMessage("Without externalId, email is required")
+      .setStatTags({
+        destination: "pardot",
+        stage: TRANSFORMER_METRIC.TRANSFORMER_STAGE,
+        scope:
+          TRANSFORMER_METRIC.MEASUREMENT_TYPE.TRANSFORMATION.META.BAD_EVENT,
+        meta: TRANSFORMER_METRIC.MEASUREMENT_TYPE.API.META.ABORTABLE
+      })
+      .build();
+  }
+  const url = getUrl({
+    nonProperExtId,
+    externalId: extId,
+    category,
+    email
+  });
+ 
+  Eif (!prospectObject.campaign_id) {
+    prospectObject.campaign_id = campaignId;
+  }
+ 
+  return buildResponse(prospectObject, url, destination, accessToken);
+};
+ 
+const processEvent = (metadata, message, destination) => {
+  let response;
+  Iif (!message.type) {
+    throw new ErrorBuilder()
+      .setMessage("Message Type is not present. Aborting message.")
+      .setStatus(400)
+      .build();
+  }
+  Iif (!destination.Config.campaignId) {
+    throw new ErrorBuilder()
+      .setMessage("Campaign Id is mandatory")
+      .setStatus(400)
+      .build();
+  }
+ 
+  Iif (!destination.Config.businessUnitId) {
+    throw new ErrorBuilder()
+      .setMessage("Business Unit Id is mandatory")
+      .setStatus(400)
+      .build();
+  }
+ 
+  Eif (message.type === "identify") {
+    const category = CONFIG_CATEGORIES.IDENTIFY;
+ 
+    response = processIdentify({ message, metadata }, destination, category);
+  } else {
+    throw new ErrorBuilder()
+      .setMessage(`${message.type} is not supported in Pardot`)
+      .setStatus(400)
+      .build();
+  }
+  return response;
+};
+ 
+const process = event => {
+  return processEvent(event.metadata, event.message, event.destination);
+};
+ 
+const processRouterDest = async events => {
+  Iif (!Array.isArray(events) || events.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const responseList = Promise.all(
+    events.map(event => {
+      try {
+        return getSuccessRespEvents(
+          process(event),
+          [event.metadata],
+          event.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [event.metadata],
+          // eslint-disable-next-line no-nested-ternary
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : error.status || 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return responseList;
+};
+ 
+exports.processRouterDest = processRouterDest;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/personalize/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/personalize/config.js.html new file mode 100644 index 00000000000..91cf577e58d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/personalize/config.js.html @@ -0,0 +1,119 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/personalize/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/personalize config.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +  +  +  +  +  +  +1x +  +1x +  +  +  + 
const KEY_CHECK_LIST = [
+  "ITEM_ID",
+  "EVENT_VALUE",
+  "IMPRESSION",
+  "RECOMMENDATION_ID"
+];
+ 
+const MANDATORY_PROPERTIES = ["USER_ID", "EVENT_TYPE", "TIMESTAMP"];
+ 
+module.exports = {
+  KEY_CHECK_LIST,
+  MANDATORY_PROPERTIES
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/personalize/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/personalize/index.html new file mode 100644 index 00000000000..f129ea2f2bc --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/personalize/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/personalize + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/personalize

+
+ +
+ 88.24% + Statements + 105/119 +
+ + +
+ 80.58% + Branches + 83/103 +
+ + +
+ 81.82% + Functions + 9/11 +
+ + +
+ 88.24% + Lines + 105/119 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%3/3100%0/0100%0/0100%3/3
transform.js +
+
87.93%102/11680.58%83/10381.82%9/1187.93%102/116
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/personalize/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/personalize/transform.js.html new file mode 100644 index 00000000000..916a184c5e4 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/personalize/transform.js.html @@ -0,0 +1,1031 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/personalize/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/personalize transform.js

+
+ +
+ 87.93% + Statements + 102/116 +
+ + +
+ 80.58% + Branches + 83/103 +
+ + +
+ 81.82% + Functions + 9/11 +
+ + +
+ 87.93% + Lines + 102/116 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +3181x +1x +1x +  +  +  +  +  +  +  +  +  +1x +  +1x +14x +14x +  +14x +1x +  +  +13x +1x +  +  +  +  +  +12x +  +  +12x +  +  +  +  +12x +  +35x +35x +  +  +  +24x +  +  +  +24x +11x +9x +  +  +  +  +  +  +  +  +9x +  +  +  +  +  +2x +7x +4x +  +  +4x +  +  +  +  +  +3x +  +3x +  +  +  +  +12x +  +  +  +  +  +  +12x +12x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +12x +  +  +1x +5x +5x +5x +  +5x +1x +  +  +  +4x +1x +  +  +  +  +3x +  +  +3x +  +  +7x +5x +  +  +2x +  +2x +  +  +7x +1x +  +6x +  +4x +  +2x +  +  +2x +1x +  +  +  +  +1x +  +  +  +1x +  +  +1x +  +  +20x +  +14x +12x +  +5x +1x +  +1x +  +  +  +  +13x +  +  +1x +5x +5x +  +5x +  +5x +1x +  +  +  +  +  +4x +1x +  +  +  +  +3x +1x +  +  +  +  +  +2x +  +  +  +2x +4x +4x +1x +  +3x +  +3x +  +  +1x +  +  +  +  +  +1x +  +  +  +1x +  +  +1x +  +  +27x +27x +27x +1x +  +  +  +  +  +26x +26x +  +5x +1x +  +20x +13x +  +1x +  +  +14x +2x +  +  +  +  +  +12x +  +  +14x +  +  +1x +27x +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
const _ = require("lodash");
+const { KEY_CHECK_LIST, MANDATORY_PROPERTIES } = require("./config");
+const { EventType } = require("../../../constants");
+const {
+  isDefinedAndNotNull,
+  getHashFromArray,
+  getFieldValueFromMessage,
+  isBlank,
+  isDefined,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+const putEventsHandler = (message, destination) => {
+  const { properties, anonymousId, event } = message;
+  const { customMappings, trackingId } = destination.Config;
+ 
+  if (!event || !isDefinedAndNotNull(event) || isBlank(event)) {
+    throw new CustomError(" Cannot process if no event name specified", 400);
+  }
+ 
+  if (!trackingId) {
+    throw new CustomError(
+      "Tracking Id is a mandatory information to use putEvents",
+      400
+    );
+  }
+ 
+  const keyMap = getHashFromArray(customMappings, "from", "to", false);
+ 
+  // process event properties
+  const outputEvent = {
+    eventType: event,
+    sentAt: getFieldValueFromMessage(message, "historicalTimestamp"),
+    properties: {}
+  };
+  Object.keys(keyMap).forEach(key => {
+    // name of the key in event.properties
+    const value = properties && properties[keyMap[key]];
+    if (
+      !KEY_CHECK_LIST.includes(key.toUpperCase()) &&
+      !MANDATORY_PROPERTIES.includes(key.toUpperCase())
+    ) {
+      Iif (!isDefined(value)) {
+        throw new CustomError(`Mapped property ${keyMap[key]} not found`, 400);
+      }
+      // all the values inside property has to be sent as strings
+      outputEvent.properties[_.camelCase(key)] = String(value);
+    } else if (!MANDATORY_PROPERTIES.includes(key.toUpperCase())) {
+      Iif (
+        (!isDefinedAndNotNull(value) || isBlank(value)) &&
+        key.toUpperCase() !== "ITEM_ID"
+      ) {
+        throw new CustomError(
+          `Null values cannot be sent for ${keyMap[key]} `,
+          400
+        );
+      }
+      if (
+        !(
+          key.toUpperCase() === "IMPRESSION" ||
+          key.toUpperCase() === "EVENT_VALUE"
+        )
+      )
+        outputEvent[_.camelCase(key)] = String(value);
+      else if (key.toUpperCase() === "IMPRESSION") {
+        outputEvent[_.camelCase(key)] = Array.isArray(value)
+          ? value.map(String)
+          : [String(value)];
+        outputEvent[_.camelCase(key)] = _.without(
+          outputEvent[_.camelCase(key)],
+          undefined,
+          null,
+          ""
+        );
+      } else Eif (!Number.isNaN(parseFloat(value))) {
+        // for eventValue
+        outputEvent[_.camelCase(key)] = parseFloat(value);
+      } else throw new CustomError(" EVENT_VALUE should be a float value", 400);
+    }
+  });
+  // manipulate for itemId
+  outputEvent.itemId =
+    outputEvent.itemId &&
+    outputEvent.itemId !== "undefined" &&
+    outputEvent.itemId !== " "
+      ? outputEvent.itemId
+      : message.messageId;
+  // userId is a mandatory field, so even if user doesn't mention, it is needed to be provided
+  const userId = getFieldValueFromMessage(message, "userIdOnly");
+  const response = {
+    userId:
+      keyMap.USER_ID &&
+      isDefinedAndNotNull(properties[keyMap.USER_ID]) &&
+      !isBlank(properties[keyMap.USER_ID]) &&
+      properties[keyMap.USER_ID] !== " "
+        ? properties[keyMap.USER_ID]
+        : userId,
+    // not using getFieldValueFromMessage(message, "userId") as we want to
+    // prioritize anonymousId over userId
+    sessionId: anonymousId || userId,
+    trackingId,
+    eventList: [outputEvent]
+  };
+ 
+  return response;
+};
+ 
+const putItemsHandler = (message, destination) => {
+  const { properties } = message;
+  const { customMappings, datasetARN } = destination.Config;
+  const keyMap = getHashFromArray(customMappings, "from", "to", false);
+ 
+  if (!datasetARN) {
+    throw new CustomError(
+      "Dataset ARN is a mandatory information to use putItems"
+    );
+  }
+  if (!datasetARN.includes("/ITEMS")) {
+    throw new CustomError(
+      "Either Dataset ARN is not correctly entered or invalid",
+      400
+    );
+  }
+  const outputItem = {
+    properties: {}
+  };
+  Object.keys(keyMap).forEach(key => {
+    let value;
+ 
+    if (key.toUpperCase() !== "ITEM_ID") {
+      value = properties && properties[keyMap[key]];
+    } else {
+      // eslint-disable-next-line no-lonely-if
+      Eif (!isDefinedAndNotNull(value) || isBlank(value)) {
+        // itemId cannot be null
+        value = String(_.get(message, keyMap[key]));
+      }
+    }
+    if (!isDefined(value)) {
+      throw new CustomError(`Mapped property ${keyMap[key]} not found`, 400);
+    }
+    if (key.toUpperCase() !== "ITEM_ID") {
+      // itemId is not allowed inside properties
+      outputItem.properties[_.camelCase(key)] = value;
+    } else {
+      outputItem.itemId = String(value);
+    }
+  });
+  if (!outputItem.itemId) {
+    throw new CustomError(
+      "itemId is a mandatory property for using PutItems",
+      400
+    );
+  }
+  const response = {
+    datasetArn: datasetARN,
+    items: [outputItem]
+  };
+  return response;
+};
+ 
+const trackRequestHandler = (message, destination, eventOperation) => {
+  let response;
+ 
+  switch (eventOperation) {
+    case "PutEvents":
+      response = putEventsHandler(message, destination);
+      break;
+    case "PutItems":
+      response = putItemsHandler(message, destination);
+      break;
+    default:
+      throw new CustomError(
+        `${eventOperation} is not supported for Track Calls`,
+        400
+      );
+  }
+  return response;
+};
+ 
+const identifyRequestHandler = (message, destination, eventOperation) => {
+  const traits = getFieldValueFromMessage(message, "traits");
+  const { customMappings, datasetARN } = destination.Config;
+ 
+  const keyMap = getHashFromArray(customMappings, "from", "to", false);
+ 
+  if (eventOperation !== "PutUsers") {
+    throw new CustomError(
+      `This Message Type does not support ${eventOperation}. Aborting message.`,
+      400
+    );
+  }
+ 
+  if (!datasetARN) {
+    throw new CustomError(
+      "Dataset ARN is a mandatory information to use putUsers"
+    );
+  }
+ 
+  if (!datasetARN.includes("/USERS")) {
+    throw new CustomError(
+      "Either Dataset ARN is not correctly entered or invalid.",
+      400
+    );
+  }
+ 
+  const outputUser = {
+    userId: getFieldValueFromMessage(message, "userId"),
+    properties: {}
+  };
+  Object.keys(keyMap).forEach(key => {
+    const value = traits && traits[keyMap[key]];
+    if (!isDefined(value)) {
+      throw new CustomError(`Mapped property ${keyMap[key]} not found`, 400);
+    }
+    Eif (key.toUpperCase() !== "USER_ID") {
+      // userId is not allowed inside properties
+      outputUser.properties[_.camelCase(key)] = value;
+    }
+  });
+  Iif (!outputUser.userId) {
+    throw new CustomError(
+      "userId is a mandatory property for using PutUsers",
+      400
+    );
+  }
+  const response = {
+    datasetArn: datasetARN,
+    users: [outputUser]
+  };
+  return response;
+};
+ 
+const processEvent = async (message, destination) => {
+  let response;
+  let wrappedResponse;
+  const { eventChoice } = destination.Config;
+  const eventOperation = eventChoice || "PutEvents";
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  const messageType = message.type.toLowerCase();
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      response = identifyRequestHandler(message, destination, eventOperation);
+      break;
+    case EventType.TRACK:
+      response = trackRequestHandler(message, destination, eventOperation);
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+ 
+  if (eventChoice && eventChoice !== "PutEvents") {
+    wrappedResponse = {
+      payload: response,
+      choice: eventChoice
+    };
+  } else {
+    // this is done to make it comaptible with the older version of rudder-server
+    wrappedResponse = response;
+  }
+ 
+  return wrappedResponse;
+};
+ 
+const process = event => {
+  return processEvent(event.message, event.destination);
+};
+ 
+const processRouterDest = async inputs => {
+  if (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        if (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          // eslint-disable-next-line no-nested-ternary
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/postgres/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/postgres/index.html new file mode 100644 index 00000000000..41112ba2c2a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/postgres/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/postgres + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/postgres

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 83.33% + Branches + 5/6 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%11/1183.33%5/6100%3/3100%11/11
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/postgres/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/postgres/transform.js.html new file mode 100644 index 00000000000..0d4c59623b5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/postgres/transform.js.html @@ -0,0 +1,179 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/postgres/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/postgres transform.js

+
+ +
+ 100% + Statements + 11/11 +
+ + +
+ 83.33% + Branches + 5/6 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 11/11 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +343x +  +3x +  +  +124x +  +  +  +2917x +1x +  +2916x +  +  +  +124x +124x +124x +124x +  +  +  +  +  +  +  +  +  +3x +  +  +  + 
const { processWarehouseMessage } = require("../../../warehouse");
+ 
+const postgres = "postgres";
+ 
+function processSingleMessage(message, options) {
+  return processWarehouseMessage(message, options);
+}
+ 
+function getDataTypeOverride(key, val, options) {
+  if (key === "violationErrors") {
+    return "json";
+  }
+  return "string";
+}
+ 
+function process(event) {
+  const whSchemaVersion = event.request.query.whSchemaVersion || "v1";
+  const whStoreEvent = event.destination.Config.storeFullEvent === true;
+  const provider = postgres;
+  return processSingleMessage(event.message, {
+    metadata: event.metadata,
+    whSchemaVersion,
+    whStoreEvent,
+    getDataTypeOverride,
+    provider,
+    sourceCategory: event.metadata ? event.metadata.sourceCategory : null
+  });
+}
+ 
+module.exports = {
+  process,
+  getDataTypeOverride
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/posthog/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/posthog/config.js.html new file mode 100644 index 00000000000..e151bda43c0 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/posthog/config.js.html @@ -0,0 +1,224 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/posthog/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/posthog config.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +491x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const DEFAULT_BASE_ENDPOINT = "https://app.posthog.com";
+ 
+const CONFIG_CATEGORIES = {
+  ALIAS: {
+    name: "PHAliasConfig",
+    type: "alias",
+    event: "$create_alias"
+  },
+  TRACK: { name: "PHTrackConfig", type: "capture" },
+  IDENTIFY: {
+    name: "PHIdentifyConfig",
+    type: "identify",
+    event: "$identify"
+  },
+  GROUP: {
+    name: "PHGroupConfigOld",
+    type: "group",
+    event: "$group"
+  },
+  GROUPV2: {
+    name: "PHGroupConfig",
+    type: "group",
+    event: "$group"
+  },
+  PAGE: {
+    name: "PHPageConfig",
+    type: "page",
+    event: "$pageview"
+  },
+  SCREEN: {
+    name: "PHScreenConfig",
+    type: "screen",
+    event: "$screen"
+  },
+  PROPERTY: {
+    name: "PHPropertiesConfig"
+  }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  DEFAULT_BASE_ENDPOINT,
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/posthog/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/posthog/index.html new file mode 100644 index 00000000000..f59decdef6d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/posthog/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/posthog + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/posthog

+
+ +
+ 89.71% + Statements + 61/68 +
+ + +
+ 73.33% + Branches + 33/45 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 89.71% + Lines + 61/68 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%5/5100%0/0100%0/0100%5/5
transform.js +
+
88.89%56/6373.33%33/45100%6/688.89%56/63
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/posthog/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/posthog/transform.js.html new file mode 100644 index 00000000000..286cd2881d5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/posthog/transform.js.html @@ -0,0 +1,635 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/posthog/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/posthog transform.js

+
+ +
+ 88.89% + Statements + 56/63 +
+ + +
+ 73.33% + Branches + 33/45 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 88.89% + Lines + 56/63 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +1861x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +11x +11x +11x +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +  +  +11x +  +  +  +  +5x +5x +5x +5x +5x +  +  +  +11x +1x +  +  +  +11x +11x +5x +  +  +11x +  +  +1x +  +  +11x +1x +  +  +  +  +10x +  +11x +  +  +  +  +11x +  +  +  +  +11x +  +  +1x +  +  +  +11x +9x +  +11x +  +  +  +11x +  +  +  +11x +6x +  +  +11x +  +  +  +  +11x +11x +  +11x +11x +  +  +11x +11x +  +  +1x +11x +  +  +  +11x +11x +  +  +  +11x +  +  +1x +11x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const { EventType } = require("../../../constants");
+const {
+  DEFAULT_BASE_ENDPOINT,
+  CONFIG_CATEGORIES,
+  MAPPING_CONFIG
+} = require("./config");
+const {
+  defaultRequestConfig,
+  getBrowserInfo,
+  getDeviceModel,
+  constructPayload,
+  defaultPostRequestConfig,
+  ErrorMessage,
+  isValidUrl,
+  stripTrailingSlash,
+  isDefinedAndNotNull,
+  removeUndefinedAndNullValues,
+  getErrorRespEvents,
+  getSuccessRespEvents,
+  CustomError
+} = require("../../util");
+ 
+// Logic To match destination Property key that is in Rudder Stack Properties Object.
+const generatePropertyDefination = message => {
+  const PHPropertyJson = CONFIG_CATEGORIES.PROPERTY.name;
+  const propertyJson = MAPPING_CONFIG[PHPropertyJson];
+  let data = {};
+ 
+  // Filter out property specific to mobile or web. isMobile key takes care of it.
+  // Array Filter() will map propeerty on basis of given condition and filters it.
+  // if (message.channel === "mobile") {
+  //   propertyJson = propertyJson.filter(d => {
+  //     return d.isMobile || d.all;
+  //   });
+  // } else {
+  //   propertyJson = propertyJson.filter(d => {
+  //     return !d.isMobile || d.all;
+  //   });
+  // }
+ 
+  data = constructPayload(message, propertyJson);
+ 
+  // This logic ensures to get browser info only for payload generated from web.
+  if (
+    message.channel === "web" &&
+    message.context &&
+    message.context.userAgent
+  ) {
+    const browser = getBrowserInfo(message.context.userAgent);
+    const osInfo = getDeviceModel(message);
+    data.$os = osInfo;
+    data.$browser = browser.name;
+    data.$browser_version = browser.version;
+  }
+ 
+  // For EventType Screen Posthog maps screen name to our event property.
+  if (message.type === EventType.SCREEN) {
+    data.$screen_name = message.event;
+  }
+ 
+  // Validate current url from payload and generate host form that url.
+  const url = isValidUrl(data.$current_url);
+  if (url) {
+    data.$host = url.host;
+  }
+ 
+  return removeUndefinedAndNullValues(data);
+};
+ 
+const responseBuilderSimple = (message, category, destination) => {
+  // This is to ensure backward compatibility of group calls.
+  let payload;
+  if (category.type === "group" && destination.Config.useV2Group) {
+    payload = constructPayload(
+      message,
+      MAPPING_CONFIG[CONFIG_CATEGORIES.GROUPV2.name]
+    );
+  } else {
+    payload = constructPayload(message, MAPPING_CONFIG[category.name]);
+  }
+  Iif (!payload) {
+    // fail-safety for developer error
+    throw new CustomError(ErrorMessage.FailedToConstructPayload, 400);
+  }
+ 
+  payload.properties = {
+    ...generatePropertyDefination(message),
+    ...payload.properties
+  };
+ 
+  if (category.type === "group" && destination.Config.useV2Group) {
+    // This is to ensure groupType delete from $group_set, as it is properly mapped
+    // in 'properties.$group_type'.
+    delete payload?.properties?.$group_set?.groupType;
+  }
+ 
+  // Convert the distinct_id to string as that is the needed type in destinations.
+  if (isDefinedAndNotNull(payload.distinct_id)) {
+    payload.distinct_id = payload.distinct_id.toString();
+  }
+  Eif (
+    payload.properties &&
+    isDefinedAndNotNull(payload.properties.distinct_id)
+  ) {
+    payload.properties.distinct_id = payload.properties.distinct_id.toString();
+  }
+ 
+  // Mapping Destination Event with correct value
+  if (category.type !== CONFIG_CATEGORIES.TRACK.type) {
+    payload.event = category.event;
+  }
+ 
+  const responseBody = {
+    ...payload,
+    api_key: destination.Config.teamApiKey,
+    type: category.type
+  };
+  const response = defaultRequestConfig();
+  response.endpoint = `${stripTrailingSlash(destination.Config.yourInstance) ||
+    DEFAULT_BASE_ENDPOINT}/batch`;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.headers = {
+    "Content-Type": "application/json"
+  };
+  response.body.JSON = responseBody;
+  return response;
+};
+ 
+const processEvent = (message, destination) => {
+  Iif (!message.type) {
+    throw new CustomError(ErrorMessage.TypeNotFound, 400);
+  }
+ 
+  const category = CONFIG_CATEGORIES[message.type.toUpperCase()];
+  Iif (!category) {
+    throw new CustomError(ErrorMessage.TypeNotSupported, 400);
+  }
+ 
+  return responseBuilderSimple(message, category, destination);
+};
+ 
+const process = event => {
+  return processEvent(event.message, event.destination);
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/config.js.html new file mode 100644 index 00000000000..1f7eb299515 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/config.js.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/profitwell/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/profitwell config.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +231x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const BASE_ENDPOINT = "https://api.profitwell.com";
+ 
+const ConfigCategory = {
+  IDENTIFY_CREATE: {
+    name: "CreateSubscription",
+    action: "identify"
+  },
+  IDENTIFY_UPDATE: {
+    name: "UpdateSubscription",
+    action: "identify"
+  }
+};
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+module.exports = {
+  createPayloadMapping: mappingConfig[ConfigCategory.IDENTIFY_CREATE.name],
+  updatePayloadMapping: mappingConfig[ConfigCategory.IDENTIFY_UPDATE.name],
+  mappingConfig,
+  BASE_ENDPOINT
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/index.html new file mode 100644 index 00000000000..afdaeb40265 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/profitwell + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/profitwell

+
+ +
+ 80.45% + Statements + 107/133 +
+ + +
+ 67.24% + Branches + 78/116 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 80.45% + Lines + 107/133 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%5/5100%0/0100%0/0100%5/5
transform.js +
+
77.48%86/11166.96%75/112100%5/577.48%86/111
utils.js +
+
94.12%16/1775%3/4100%3/394.12%16/17
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/transform.js.html new file mode 100644 index 00000000000..7039831aaab --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/transform.js.html @@ -0,0 +1,965 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/profitwell/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/profitwell transform.js

+
+ +
+ 77.48% + Statements + 86/111 +
+ + +
+ 66.96% + Branches + 75/112 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 77.48% + Lines + 86/111 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +2961x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +1x +  +1x +13x +13x +  +13x +1x +  +  +12x +  +  +  +  +12x +  +  +12x +1x +  +  +  +  +  +11x +11x +  +  +  +  +  +  +11x +  +11x +6x +6x +6x +6x +4x +4x +4x +  +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +6x +  +  +  +2x +1x +  +1x +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +1x +1x +1x +  +  +  +1x +1x +  +  +  +4x +4x +3x +  +  +  +  +  +  +1x +  +2x +  +  +  +  +  +  +1x +  +2x +  +  +  +2x +2x +  +2x +  +  +  +2x +2x +  +  +  +  +5x +5x +  +  +  +  +  +  +  +5x +2x +  +  +  +3x +3x +  +  +  +3x +  +  +  +  +  +  +  +  +3x +  +  +3x +  +  +  +  +  +  +  +  +3x +  +  +  +3x +3x +3x +  +  +  +3x +3x +  +  +1x +14x +14x +  +  +  +14x +1x +  +  +13x +  +  +13x +  +13x +6x +  +  +  +6x +  +  +1x +1x +  +  +  +  +1x +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const { EventType } = require("../../../constants");
+const {
+  getSubscriptionHistory,
+  unixTimestampOrError,
+  isValidPlanCurrency
+} = require("./utils");
+const {
+  CustomError,
+  getDestinationExternalID,
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  defaultPutRequestConfig,
+  removeUndefinedAndNullValues,
+  constructPayload,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  getFieldValueFromMessage
+} = require("../../util");
+const {
+  createPayloadMapping,
+  updatePayloadMapping,
+  BASE_ENDPOINT
+} = require("./config");
+ 
+const identifyResponseBuilder = async (message, { Config }) => {
+  const userId = getDestinationExternalID(message, "profitwellUserId");
+  const userAlias = getFieldValueFromMessage(message, "userId");
+ 
+  if (!userId && !userAlias) {
+    throw new CustomError("userId or userAlias is required for identify", 400);
+  }
+ 
+  let subscriptionId = getDestinationExternalID(
+    message,
+    "profitwellSubscriptionId"
+  );
+  let subscriptionAlias =
+    get(message, "traits.subscriptionAlias") ||
+    get(message, "context.traits.subscriptionAlias");
+ 
+  if (!subscriptionId && !subscriptionAlias) {
+    throw new CustomError(
+      "subscriptionId or subscriptionAlias is required for identify",
+      400
+    );
+  }
+ 
+  const targetUrl = `${BASE_ENDPOINT}/v2/users/${userId || userAlias}/`;
+  const res = await getSubscriptionHistory(targetUrl, {
+    headers: {
+      Authorization: Config.privateApiKey
+    }
+  });
+ 
+  let payload;
+  const response = defaultRequestConfig();
+ 
+  if (res.success) {
+    let subscriptionFound = true;
+    const valFound = res.response.data.some(element => {
+      Eif (userId && userId === element.user_id) {
+        if (subscriptionId && subscriptionId === element.subscription_id) {
+          subscriptionId = element.subscription_id;
+          subscriptionFound = true;
+          return true;
+        }
+        Iif (
+          !subscriptionId &&
+          subscriptionAlias &&
+          subscriptionAlias === element.subscription_alias
+        ) {
+          subscriptionAlias = element.subscription_alias;
+          subscriptionFound = true;
+          return true;
+        }
+        subscriptionFound = false;
+      } else if (userAlias && userAlias === element.user_alias) {
+        if (subscriptionId && subscriptionId === element.subscription_id) {
+          subscriptionId = element.subscription_id;
+          subscriptionFound = true;
+          return true;
+        }
+        if (
+          !subscriptionId &&
+          subscriptionAlias &&
+          subscriptionAlias === element.subscription_alias
+        ) {
+          subscriptionAlias = element.subscription_alias;
+          subscriptionFound = true;
+          return true;
+        }
+        subscriptionFound = false;
+      }
+      return false;
+    });
+ 
+    if (!subscriptionFound) {
+      // for a given userId, subscriptionId not found
+      // dropping event if profitwellSubscriptionId (externalId) did not
+      // match with any subscription_id at destination
+      if (subscriptionId) {
+        throw new CustomError("profitwell subscription_id not found", 400);
+      }
+      payload = constructPayload(message, createPayloadMapping);
+      payload = {
+        ...payload,
+        user_id: userId,
+        user_alias: userAlias
+      };
+      Iif (
+        payload.plan_interval &&
+        !(
+          payload.plan_interval.toLowerCase() === "month" ||
+          payload.plan_interval.toLowerCase() === "year"
+        )
+      ) {
+        throw new CustomError("invalid format for planInterval. Aborting", 400);
+      }
+      Iif (
+        payload.plan_currency &&
+        !isValidPlanCurrency(payload.plan_currency)
+      ) {
+        payload.plan_currency = null;
+      }
+      Iif (
+        payload.status &&
+        !(
+          payload.status.toLowerCase() === "active" ||
+          payload.status.toLowerCase() === "trialing"
+        )
+      ) {
+        payload.status = null;
+      }
+      payload.effective_date = unixTimestampOrError(
+        payload.effective_date,
+        message.originalTimestamp
+      );
+      response.method = defaultPostRequestConfig.requestMethod;
+      response.endpoint = `${BASE_ENDPOINT}/v2/subscriptions/`;
+      response.headers = {
+        "Content-Type": "application/json",
+        Authorization: Config.privateApiKey
+      };
+      response.body.JSON = removeUndefinedAndNullValues(payload);
+      return response;
+    }
+ 
+    // for a given userId, subscription is found at dest.
+    Eif (valFound) {
+      payload = constructPayload(message, updatePayloadMapping);
+      if (
+        payload.plan_interval &&
+        !(
+          payload.plan_interval.toLowerCase() === "month" ||
+          payload.plan_interval.toLowerCase() === "year"
+        )
+      ) {
+        throw new CustomError("invalid format for planInterval. Aborting", 400);
+      }
+      if (
+        payload.status &&
+        !(
+          payload.status.toLowerCase() === "active" ||
+          payload.status.toLowerCase() === "trialing"
+        )
+      ) {
+        payload.status = null;
+      }
+      payload.effective_date = unixTimestampOrError(
+        payload.effective_date,
+        message.originalTimestamp
+      );
+      response.method = defaultPutRequestConfig.requestMethod;
+      response.endpoint = `${BASE_ENDPOINT}/v2/subscriptions/${subscriptionId ||
+        subscriptionAlias}/`;
+      response.headers = {
+        "Content-Type": "application/json",
+        Authorization: Config.privateApiKey
+      };
+      response.body.JSON = removeUndefinedAndNullValues(payload);
+      return response;
+    }
+  }
+ 
+  // handler for other destination side errors
+  const error = res.response;
+  Iif (error.response.status !== 404) {
+    throw new CustomError(
+      `Failed to get subscription history for a user (${error.response.statusText})`,
+      res.response.response.status
+    );
+  }
+ 
+  // drop event if profitwellUserId (externalId) did not match with any user_id
+  if (userId) {
+    throw new CustomError("no user found for profitwell user_id", 400);
+  }
+ 
+  // create new subscription for new user with given userAlias
+  payload = constructPayload(message, createPayloadMapping);
+  payload = {
+    ...payload,
+    user_alias: userAlias
+  };
+  Iif (
+    payload.plan_interval &&
+    !(
+      payload.plan_interval.toLowerCase() === "month" ||
+      payload.plan_interval.toLowerCase() === "year"
+    )
+  ) {
+    throw new CustomError("invalid format for planInterval. Aborting", 400);
+  }
+  Iif (payload.plan_currency && !isValidPlanCurrency(payload.plan_currency)) {
+    payload.plan_currency = null;
+  }
+  Iif (
+    payload.status &&
+    !(
+      payload.status.toLowerCase() === "active" ||
+      payload.status.toLowerCase() === "trialing"
+    )
+  ) {
+    payload.status = null;
+  }
+  payload.effective_date = unixTimestampOrError(
+    payload.effective_date,
+    message.originalTimestamp
+  );
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = `${BASE_ENDPOINT}/v2/subscriptions/`;
+  response.headers = {
+    "Content-Type": "application/json",
+    Authorization: Config.privateApiKey
+  };
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  return response;
+};
+ 
+const process = async event => {
+  const { message, destination } = event;
+  Iif (!message.type) {
+    throw new CustomError("invalid message type. Aborting.", 400);
+  }
+ 
+  if (!destination.Config.privateApiKey) {
+    throw new CustomError("Private API Key not found. Aborting.", 400);
+  }
+ 
+  const messageType = message.type.toLowerCase();
+ 
+  let response;
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      response = await identifyResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`message type ${messageType} not supported`, 400);
+  }
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/utils.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/utils.js.html new file mode 100644 index 00000000000..7842be8d57e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/profitwell/utils.js.html @@ -0,0 +1,677 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/profitwell/utils.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/profitwell utils.js

+
+ +
+ 94.12% + Statements + 16/17 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 94.12% + Lines + 16/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +2001x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +11x +  +  +  +  +11x +11x +  +  +1x +6x +3x +  +3x +3x +3x +  +  +  +  +  +  +  +1x +4x +  +  +1x +  +  +  +  + 
const { httpGET } = require("../../../adapters/network");
+const { CustomError, toUnixTimestamp } = require("../../util");
+ 
+const CURRENCY_CODES = [
+  "aed",
+  "afn",
+  "all",
+  "amd",
+  "ang",
+  "aoa",
+  "ars",
+  "aud",
+  "awg",
+  "azn",
+  "bam",
+  "bbd",
+  "bdt",
+  "bgn",
+  "bhd",
+  "bif",
+  "bmd",
+  "bnd",
+  "bob",
+  "brl",
+  "bsd",
+  "btc",
+  "btn",
+  "bwp",
+  "bzd",
+  "cad",
+  "cdf",
+  "chf",
+  "clf",
+  "clp",
+  "cny",
+  "cop",
+  "crc",
+  "cup",
+  "cve",
+  "czk",
+  "djf",
+  "dkk",
+  "dop",
+  "dzd",
+  "egp",
+  "ern",
+  "etb",
+  "eur",
+  "fjd",
+  "fkp",
+  "gbp",
+  "gel",
+  "ghs",
+  "gip",
+  "gmd",
+  "gnf",
+  "gtq",
+  "gyd",
+  "hkd",
+  "hnl",
+  "hrk",
+  "htg",
+  "huf",
+  "idr",
+  "ils",
+  "inr",
+  "iqd",
+  "irr",
+  "isk",
+  "jep",
+  "jmd",
+  "jod",
+  "jpy",
+  "kes",
+  "kgs",
+  "khr",
+  "kmf",
+  "kpw",
+  "krw",
+  "kwd",
+  "kyd",
+  "kzt",
+  "lak",
+  "lbp",
+  "lkr",
+  "lrd",
+  "lsl",
+  "lyd",
+  "mad",
+  "mdl",
+  "mga",
+  "mkd",
+  "mmk",
+  "mnt",
+  "mop",
+  "mro",
+  "mur",
+  "mvr",
+  "mwk",
+  "mxn",
+  "myr",
+  "mzn",
+  "nad",
+  "ngn",
+  "nio",
+  "nok",
+  "npr",
+  "nzd",
+  "omr",
+  "pab",
+  "pen",
+  "pgk",
+  "php",
+  "pkr",
+  "pln",
+  "pyg",
+  "qar",
+  "ron",
+  "rsd",
+  "rub",
+  "rwf",
+  "sar",
+  "sbd",
+  "scr",
+  "sdg",
+  "sek",
+  "sgd",
+  "shp",
+  "sll",
+  "sos",
+  "srd",
+  "std",
+  "svc",
+  "syp",
+  "szl",
+  "thb",
+  "tjs",
+  "tmt",
+  "tnd",
+  "top",
+  "try",
+  "ttd",
+  "twd",
+  "tzs",
+  "uah",
+  "ugx",
+  "usd",
+  "uyu",
+  "uzs",
+  "vef",
+  "vnd",
+  "vuv",
+  "wst",
+  "xaf",
+  "xag",
+  "xau",
+  "xcd",
+  "xdr",
+  "xof",
+  "xpf",
+  "yer",
+  "zar",
+  "zmw",
+  "zwl"
+];
+ 
+const getSubscriptionHistory = async (endpoint, options) => {
+  const requestOptions = {
+    method: "get",
+    ...options
+  };
+ 
+  const res = await httpGET(endpoint, requestOptions);
+  return res;
+};
+ 
+const unixTimestampOrError = (timestamp, originalTimestamp) => {
+  if (!timestamp) {
+    return toUnixTimestamp(originalTimestamp);
+  }
+  const convertedTS = new Date(Number(timestamp)).getTime();
+  Eif (convertedTS > 0) {
+    return convertedTS;
+  }
+  throw new CustomError(
+    "invalid timestamp format for effectiveDate. Aborting",
+    400
+  );
+};
+ 
+const isValidPlanCurrency = planCurrency => {
+  return CURRENCY_CODES.includes(planCurrency.toLowerCase());
+};
+ 
+module.exports = {
+  getSubscriptionHistory,
+  unixTimestampOrError,
+  isValidPlanCurrency
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/redis/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/redis/index.html new file mode 100644 index 00000000000..fd9f0c5926f --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/redis/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/redis + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/redis

+
+ +
+ 93.55% + Statements + 29/31 +
+ + +
+ 86.96% + Branches + 20/23 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 93.55% + Lines + 29/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
93.55%29/3186.96%20/23100%3/393.55%29/31
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/redis/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/redis/transform.js.html new file mode 100644 index 00000000000..cd1887b977c --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/redis/transform.js.html @@ -0,0 +1,299 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/redis/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/redis transform.js

+
+ +
+ 93.55% + Statements + 29/31 +
+ + +
+ 86.96% + Branches + 20/23 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 93.55% + Lines + 29/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +741x +1x +  +1x +1x +  +  +  +  +1x +5x +49x +  +4x +4x +  +45x +  +45x +  +  +  +1x +5x +5x +  +5x +  +  +  +5x +  +  +  +5x +5x +  +5x +  +  +  +  +5x +5x +  +  +  +  +  +5x +2x +  +  +  +  +  +  +  +  +5x +  +5x +1x +  +  +4x +  +  +  +4x +  +  +1x + 
const _ = require("lodash");
+const flatten = require("flat");
+ 
+const { isEmpty, isObject, CustomError } = require("../../util");
+const { EventType } = require("../../../constants");
+ 
+// processValues:
+// 1. removes keys with empty values or still an object(empty) after flattening
+// 2. stringifies the values to set them in redis
+const processValues = obj => {
+  Object.keys(obj).forEach(key => {
+    if (obj[key] === null || isObject(obj[key])) {
+      // eslint-disable-next-line no-param-reassign
+      delete obj[key];
+      return;
+    }
+    const val = obj[key];
+    // eslint-disable-next-line no-param-reassign
+    obj[key] = _.isArray(val) ? JSON.stringify(val) : _.toString(val);
+  });
+};
+ 
+const process = event => {
+  const { message, destination } = event;
+  const messageType = message && message.type && message.type.toLowerCase();
+ 
+  Iif (messageType !== EventType.IDENTIFY) {
+    return [];
+  }
+ 
+  Iif (isEmpty(event.message.userId)) {
+    throw new CustomError("Blank userId passed in identify event", 400);
+  }
+ 
+  const { prefix } = destination.Config;
+  const keyPrefix = isEmpty(prefix) ? "" : `${prefix.trim()}:`;
+ 
+  const hmap = {
+    key: `${keyPrefix}user:${_.toString(event.message.userId)}`,
+    fields: {}
+  };
+ 
+  Eif (isObject(message.context) && isObject(message.context.traits)) {
+    hmap.fields = flatten(message.context.traits, {
+      delimiter: ".",
+      safe: true
+    });
+  }
+ 
+  if (isObject(message.traits)) {
+    hmap.fields = Object.assign(
+      hmap.fields,
+      flatten(message.traits, {
+        delimiter: ".",
+        safe: true
+      })
+    );
+  }
+ 
+  processValues(hmap.fields);
+ 
+  if (Object.keys(hmap.fields).length === 0) {
+    throw new CustomError("context or context.traits or traits is empty", 400);
+  }
+ 
+  const result = {
+    message: hmap,
+    userId: event.message.userId
+  };
+  return result;
+};
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/rs/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/rs/index.html new file mode 100644 index 00000000000..244478657c0 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/rs/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/rs + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/rs

+
+ +
+ 80% + Statements + 12/15 +
+ + +
+ 50% + Branches + 7/14 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 80% + Lines + 12/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
80%12/1550%7/14100%3/380%12/15
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/rs/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/rs/transform.js.html new file mode 100644 index 00000000000..9a131b1a082 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/rs/transform.js.html @@ -0,0 +1,203 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/rs/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/rs transform.js

+
+ +
+ 80% + Statements + 12/15 +
+ + +
+ 50% + Branches + 7/14 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 80% + Lines + 12/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +423x +  +  +3x +3x +  +  +124x +  +  +  +2917x +  +  +  +  +  +2917x +  +  +  +124x +124x +  +124x +124x +124x +  +  +  +  +  +  +  +  +  +  +3x +  +  +  + 
const { processWarehouseMessage } = require("../../../warehouse");
+ 
+// redshift destination string limit, if the string length crosses 512 we will change data type to text which is varchar(max) in redshift
+const RSStringLimit = 512;
+const redshift = "rs";
+ 
+function processSingleMessage(message, options) {
+  return processWarehouseMessage(message, options);
+}
+ 
+function getDataTypeOverride(key, val, options) {
+  Iif (options.rsAlterStringToText === "true" && val) {
+    const stringifiedVal = Array.isArray(val) ? JSON.stringify(val) : val;
+    if (stringifiedVal.length > RSStringLimit) {
+      return "text";
+    }
+  }
+  return "string";
+}
+ 
+function process(event) {
+  const whSchemaVersion = event.request.query.whSchemaVersion || "v1";
+  const whStoreEvent = event.destination.Config.storeFullEvent === true;
+  const rsAlterStringToText =
+    event.request.query.rsAlterStringToText || "false";
+  const provider = redshift;
+  return processSingleMessage(event.message, {
+    metadata: event.metadata,
+    whSchemaVersion,
+    whStoreEvent,
+    getDataTypeOverride,
+    provider,
+    rsAlterStringToText,
+    sourceCategory: event.metadata ? event.metadata.sourceCategory : null
+  });
+}
+ 
+module.exports = {
+  process,
+  getDataTypeOverride
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/s3/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/s3/index.html new file mode 100644 index 00000000000..06c87622071 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/s3/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/s3 + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/s3

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%2/2100%0/0100%1/1100%2/2
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/s3/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/s3/transform.js.html new file mode 100644 index 00000000000..74b34afcb86 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/s3/transform.js.html @@ -0,0 +1,95 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/s3/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/s3 transform.js

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6  +2x +  +  +1x + 
function process(event) {
+  return event.message;
+}
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/s3_datalake/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/s3_datalake/index.html new file mode 100644 index 00000000000..595f193766e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/s3_datalake/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/s3_datalake + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/s3_datalake

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%8/875%3/4100%3/3100%8/8
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/s3_datalake/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/s3_datalake/transform.js.html new file mode 100644 index 00000000000..065a22bd730 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/s3_datalake/transform.js.html @@ -0,0 +1,167 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/s3_datalake/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/s3_datalake transform.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +303x +  +  +3x +  +  +123x +  +  +  +  +  +123x +123x +123x +123x +  +  +  +  +  +  +  +  +  +3x +  +  +  + 
const { processWarehouseMessage } = require("../../../warehouse");
+ 
+// use postgres providers for s3-datalake
+const s3datalakeProvider = "s3_datalake";
+ 
+function processSingleMessage(message, options) {
+  return processWarehouseMessage(message, options);
+}
+ 
+function getDataTypeOverride(key, val, options) {}
+ 
+function process(event) {
+  const whSchemaVersion = event.request.query.whSchemaVersion || "v1";
+  const whStoreEvent = event.destination.Config.storeFullEvent === true;
+  const provider = s3datalakeProvider;
+  return processSingleMessage(event.message, {
+    metadata: event.metadata,
+    whSchemaVersion,
+    whStoreEvent,
+    getDataTypeOverride,
+    provider,
+    sourceCategory: event.metadata ? event.metadata.sourceCategory : null
+  });
+}
+ 
+module.exports = {
+  process,
+  getDataTypeOverride
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/salesforce/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/salesforce/config.js.html new file mode 100644 index 00000000000..bbfe106b849 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/salesforce/config.js.html @@ -0,0 +1,158 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/salesforce/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/salesforce config.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +  +1x +  +  +  +  +  +  +  +  +1x +  +1x +  +1x +  +1x +  +1x +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ConfigCategory = {
+  IDENTIFY: {
+    name: "SFIdentifyConfig"
+  },
+  IGNORE: {
+    name: "SFIgnoreConfig"
+  }
+};
+ 
+const SF_API_VERSION = "50.0";
+const SF_TOKEN_REQUEST_URL =
+  "https://login.salesforce.com/services/oauth2/token";
+const SF_TOKEN_REQUEST_URL_SANDBOX =
+  "https://test.salesforce.com/services/oauth2/token";
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+module.exports = {
+  SF_API_VERSION,
+  SF_TOKEN_REQUEST_URL,
+  SF_TOKEN_REQUEST_URL_SANDBOX,
+  identifyMappingJson: mappingConfig[ConfigCategory.IDENTIFY.name],
+  ignoredTraits: mappingConfig[ConfigCategory.IGNORE.name]
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/salesforce/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/salesforce/index.html new file mode 100644 index 00000000000..567f500fddb --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/salesforce/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/salesforce + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/salesforce

+
+ +
+ 71.43% + Statements + 85/119 +
+ + +
+ 53.25% + Branches + 41/77 +
+ + +
+ 78.57% + Functions + 11/14 +
+ + +
+ 71.43% + Lines + 85/119 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%7/7100%0/0100%0/0100%7/7
transform.js +
+
69.64%78/11253.25%41/7778.57%11/1469.64%78/112
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/salesforce/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/salesforce/transform.js.html new file mode 100644 index 00000000000..8a75bdfab51 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/salesforce/transform.js.html @@ -0,0 +1,1280 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/salesforce/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/salesforce transform.js

+
+ +
+ 69.64% + Statements + 78/112 +
+ + +
+ 53.25% + Branches + 41/77 +
+ + +
+ 78.57% + Functions + 11/14 +
+ + +
+ 69.64% + Lines + 78/112 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +4011x +1x +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +10x +1x +  +9x +  +10x +  +  +  +  +  +  +  +10x +10x +  +  +  +  +  +  +  +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +10x +  +  +  +10x +10x +2x +  +  +  +  +10x +  +  +10x +  +  +  +8x +  +  +  +8x +69x +2x +  +  +  +  +10x +10x +  +  +  +10x +10x +10x +10x +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +10x +  +  +10x +10x +  +  +10x +2x +2x +2x +2x +  +  +  +  +  +  +  +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +10x +  +  +  +8x +  +8x +  +  +  +8x +  +  +  +8x +8x +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +10x +  +  +  +  +  +10x +  +  +  +10x +10x +  +  +  +  +  +10x +10x +10x +  +  +  +  +  +  +  +  +10x +  +  +10x +  +  +  +  +  +  +10x +  +10x +  +  +  +  +  +  +  +  +  +  +10x +  +  +  +  +  +  +11x +10x +  +1x +  +10x +  +  +  +  +9x +9x +  +  +  +  +8x +  +  +1x +1x +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +3x +3x +  +1x +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const axios = require("axios");
+const { EventType, MappedToDestinationKey } = require("../../../constants");
+const {
+  SF_API_VERSION,
+  SF_TOKEN_REQUEST_URL,
+  SF_TOKEN_REQUEST_URL_SANDBOX,
+  identifyMappingJson,
+  ignoredTraits
+} = require("./config");
+const {
+  removeUndefinedValues,
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  getFieldValueFromMessage,
+  constructPayload,
+  getFirstAndLastName,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  addExternalIdToTraits
+} = require("../../util");
+const logger = require("../../../logger");
+ 
+// Utility method to construct the header to be used for SFDC API calls
+// The "Authorization: Bearer <token>" header element needs to be passed for
+// authentication for all SFDC REST API calls
+async function getSFDCHeader(destination) {
+  let SF_TOKEN_URL;
+  if (destination.Config.sandbox) {
+    SF_TOKEN_URL = SF_TOKEN_REQUEST_URL_SANDBOX;
+  } else {
+    SF_TOKEN_URL = SF_TOKEN_REQUEST_URL;
+  }
+  const authUrl = `${SF_TOKEN_URL}?username=${
+    destination.Config.userName
+  }&password=${encodeURIComponent(
+    destination.Config.password
+  )}${encodeURIComponent(destination.Config.initialAccessToken)}&client_id=${
+    destination.Config.consumerKey
+  }&client_secret=${destination.Config.consumerSecret}&grant_type=password`;
+  let response;
+  try {
+    response = await axios.post(authUrl, {});
+  } catch (error) {
+    logger.error(error);
+    throw new CustomError(
+      `SALESFORCE AUTH FAILED: ${error.message}`,
+      error.status || 400
+    );
+  }
+ 
+  return {
+    token: `Bearer ${response.data.access_token}`,
+    instanceUrl: response.data.instance_url
+  };
+}
+ 
+// Basic response builder
+// We pass the parameterMap with any processing-specific key-value prepopulated
+// We also pass the incoming payload, the hit type to be generated and
+// the field mapping and credentials JSONs
+function responseBuilderSimple(
+  traits,
+  salesforceMap,
+  authorizationData,
+  mapProperty,
+  mappedToDestination
+) {
+  const { salesforceType, salesforceId } = salesforceMap;
+ 
+  // if id is valid, do update else create the object
+  // POST for create, PATCH for update
+  let targetEndpoint = `${authorizationData.instanceUrl}/services/data/v${SF_API_VERSION}/sobjects/${salesforceType}`;
+  if (salesforceId) {
+    targetEndpoint += `/${salesforceId}?_HttpMethod=PATCH`;
+  }
+ 
+  // First name and last name need to be extracted from the name field
+  // get traits from the message
+  let rawPayload = traits;
+  // map using the config only if the type is Lead
+  // If message is already mapped to destination, Do not map it using config and send traits as-is
+  if (salesforceType === "Lead" && mapProperty && !mappedToDestination) {
+    // adjust the payload only for new Leads. For update do incremental update
+    // adjust for firstName and lastName
+    // construct the payload using the mappingJson and add extra params
+    rawPayload = constructPayload(
+      { ...traits, ...getFirstAndLastName(traits, "n/a") },
+      identifyMappingJson
+    );
+    Object.keys(traits).forEach(key => {
+      if (ignoredTraits.indexOf(key) === -1 && traits[key]) {
+        rawPayload[`${key}__c`] = traits[key];
+      }
+    });
+  }
+ 
+  const response = defaultRequestConfig();
+  const header = {
+    "Content-Type": "application/json",
+    Authorization: authorizationData.token
+  };
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.headers = header;
+  response.body.JSON = removeUndefinedValues(rawPayload);
+  response.endpoint = targetEndpoint;
+ 
+  return response;
+}
+ 
+async function getSaleforceIdForRecord(
+  authorizationData,
+  objectType,
+  identifierType,
+  identifierValue
+) {
+  const objSearchUrl = `${authorizationData.instanceUrl}/services/data/v${SF_API_VERSION}/parameterizedSearch/?q=${identifierValue}&sobject=${objectType}&in=${identifierType}&${objectType}.fields=id`;
+ 
+  const objSearchResponse = await axios.get(objSearchUrl, {
+    headers: { Authorization: authorizationData.token }
+  });
+ 
+  return get(objSearchResponse, "data.searchRecords.0.Id");
+}
+ 
+// Check for externalId field under context and look for probable Salesforce objects
+// We'll make separate requests for every Salesforce Object types present under externalIds
+//
+// Expected externalId map for Contact object:
+//
+// ------------------------
+// {
+//   "type": "Salesforce-Library",
+//   "id": "test@gmail.com"
+ 
+// }
+// ------------------------
+//
+// We'll use the Salesforce Object names by removing "Salesforce-" string from the type field
+//
+// Default Object type will be "Lead" for backward compatibility
+async function getSalesforceIdFromPayload(
+  message,
+  authorizationData,
+  destination
+) {
+  // define default map
+  const salesforceMaps = [];
+ 
+  // get externalId
+  const externalIds = get(message, "context.externalId");
+  const mappedToDestination = get(message, MappedToDestinationKey);
+ 
+  // if externalIds are present look for type `Salesforce-`
+  if (externalIds && Array.isArray(externalIds) && !mappedToDestination) {
+    externalIds.forEach(extIdMap => {
+      const { type, id } = extIdMap;
+      Eif (type.includes("Salesforce")) {
+        salesforceMaps.push({
+          salesforceType: type.replace("Salesforce-", ""),
+          salesforceId: id
+        });
+      }
+    });
+  }
+ 
+  // Support All salesforce objects, do not fallback to lead in case event is mapped to destination
+  Iif (mappedToDestination) {
+    const { id, type, identifierType } = get(message, "context.externalId.0");
+ 
+    if (
+      !id ||
+      !type ||
+      !identifierType ||
+      !type.toLowerCase().includes("salesforce")
+    ) {
+      throw new CustomError(
+        "Invalid externalId. id, type, identifierType must be provided",
+        400
+      );
+    }
+ 
+    const objectType = type.toLowerCase().replace("salesforce-", "");
+    let salesforceId = id;
+ 
+    // Fetch the salesforce Id if the identifierType is not ID
+    if (identifierType.toUpperCase() !== "ID") {
+      salesforceId = await getSaleforceIdForRecord(
+        authorizationData,
+        objectType,
+        identifierType,
+        id
+      );
+    }
+ 
+    salesforceMaps.push({
+      salesforceType: objectType,
+      salesforceId
+    });
+  }
+ 
+  // if nothing is present consider it as a Lead Object
+  // BACKWORD COMPATIBILITY
+  if (salesforceMaps.length === 0 && !mappedToDestination) {
+    // its a lead object. try to get lead object id using search query
+    // check if the lead exists
+    // need to perform a parameterized search for this using email
+    const email = getFieldValueFromMessage(message, "email");
+ 
+    Iif (!email) {
+      throw new CustomError("Invalid Email address for Lead Objet", 400);
+    }
+ 
+    const leadQueryUrl = `${authorizationData.instanceUrl}/services/data/v${SF_API_VERSION}/parameterizedSearch/?q=${email}&sobject=Lead&Lead.fields=id,IsConverted,ConvertedContactId,IsDeleted`;
+ 
+    // request configuration will be conditional
+    let leadQueryResponse;
+    try {
+      leadQueryResponse = await axios.get(leadQueryUrl, {
+        headers: { Authorization: authorizationData.token }
+      });
+    } catch (err) {
+      throw new CustomError(
+        JSON.stringify(err.response.data[0]) || err.message,
+        err.response.status || 500
+      ); // default 500
+    }
+ 
+    Iif (
+      leadQueryResponse &&
+      leadQueryResponse.data?.searchRecords?.length > 0
+    ) {
+      // if count is greater than zero, it means that lead exists, then only update it
+      // else the original endpoint, which is the one for creation - can be used
+      const record = leadQueryResponse.data.searchRecords[0];
+      if (record.IsDeleted === true) {
+        if (record.IsConverted) {
+          throw new CustomError("The contact has been deleted.", 400);
+        } else {
+          throw new CustomError("The lead has been deleted.", 400);
+        }
+      }
+      if (record.IsConverted && destination.Config.useContactId) {
+        salesforceMaps.push({
+          salesforceType: "Contact",
+          salesforceId: record.ConvertedContactId
+        });
+      } else {
+        salesforceMaps.push({
+          salesforceType: "Lead",
+          salesforceId: record.Id
+        });
+      }
+    } else {
+      salesforceMaps.push({
+        salesforceType: "Lead",
+        salesforceId: undefined
+      });
+    }
+  }
+  return salesforceMaps;
+}
+ 
+// Function for handling identify events
+async function processIdentify(message, authorizationData, destination) {
+  const mapProperty =
+    destination.Config.mapProperty === undefined
+      ? true
+      : destination.Config.mapProperty;
+  // check the traits before hand
+  const traits = getFieldValueFromMessage(message, "traits");
+  Iif (!traits) {
+    throw new CustomError("Invalid traits for Salesforce request", 400);
+  }
+ 
+  // Append external ID to traits if event is mapped to destination and only if identifier type is not id
+  // If identifier type is id, then it should not be added to traits, else saleforce will throw an error
+  const mappedToDestination = get(message, MappedToDestinationKey);
+  const identifierType = get(message, "context.externalId.0.type");
+  Iif (
+    mappedToDestination &&
+    identifierType &&
+    identifierType.toLowerCase !== "id"
+  ) {
+    addExternalIdToTraits(message);
+  }
+ 
+  // if traits is correct, start processing
+  const responseData = [];
+ 
+  // get salesforce object map
+  const salesforceMaps = await getSalesforceIdFromPayload(
+    message,
+    authorizationData,
+    destination
+  );
+ 
+  // iterate over the object types found
+  salesforceMaps.forEach(salesforceMap => {
+    // finally build the response and push to the list
+    responseData.push(
+      responseBuilderSimple(
+        traits,
+        salesforceMap,
+        authorizationData,
+        mapProperty,
+        mappedToDestination
+      )
+    );
+  });
+ 
+  return responseData;
+}
+ 
+// Generic process function which invokes specific handler functions depending on message type
+// and event type where applicable
+async function processSingleMessage(message, authorizationData, destination) {
+  let response;
+  if (message.type === EventType.IDENTIFY) {
+    response = await processIdentify(message, authorizationData, destination);
+  } else {
+    throw new CustomError(`message type ${message.type} is not supported`, 400);
+  }
+  return response;
+}
+ 
+async function process(event) {
+  // Get the authorization header if not available
+  const authorizationData = await getSFDCHeader(event.destination);
+  const response = await processSingleMessage(
+    event.message,
+    authorizationData,
+    event.destination
+  );
+  return response;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  let authorizationData;
+  try {
+    authorizationData = await getSFDCHeader(inputs[0].destination);
+  } catch (error) {
+    const respEvents = getErrorRespEvents(
+      inputs.map(input => input.metadata),
+      400,
+      "Authorisation failed"
+    );
+    return [respEvents];
+  }
+ 
+  Iif (!authorizationData) {
+    const respEvents = getErrorRespEvents(
+      inputs.map(input => input.metadata),
+      400,
+      "Authorisation failed"
+    );
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        if (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+ 
+        // unprocessed payload
+        return getSuccessRespEvents(
+          await processSingleMessage(
+            input.message,
+            authorizationData,
+            input.destination
+          ),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response ? error.response.status : 500, // default to retryable
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/segment/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/segment/config.js.html new file mode 100644 index 00000000000..5c44f195399 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/segment/config.js.html @@ -0,0 +1,110 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/segment/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/segment config.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +111x +  +1x +  +  +  +1x +  +  +  + 
batchEndpoint = "https://api.segment.io/v1/batch";
+ 
+destinationConfigKeys = {
+  writeKey: "writeKey"
+};
+ 
+module.exports = {
+  destinationConfigKeys,
+  batchEndpoint
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/segment/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/segment/index.html new file mode 100644 index 00000000000..9f186ed1aca --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/segment/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/segment + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/segment

+
+ +
+ 95.12% + Statements + 39/41 +
+ + +
+ 80% + Branches + 8/10 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 95.12% + Lines + 39/41 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%3/3100%0/0100%0/0100%3/3
transform.js +
+
94.74%36/3880%8/10100%6/694.74%36/38
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/segment/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/segment/transform.js.html new file mode 100644 index 00000000000..50423d0f078 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/segment/transform.js.html @@ -0,0 +1,335 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/segment/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/segment transform.js

+
+ +
+ 94.74% + Statements + 36/38 +
+ + +
+ 80% + Branches + 8/10 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 94.74% + Lines + 36/38 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +861x +1x +  +  +  +  +  +1x +  +  +5x +  +  +  +5x +5x +  +  +  +5x +5x +5x +5x +5x +5x +  +5x +  +  +  +5x +5x +5x +5x +  +  +5x +  +  +5x +5x +  +5x +  +  +  +  +  +  +  +  +  +  +  +5x +5x +5x +5x +  +5x +5x +  +  +  +  +  +5x +5x +  +  +  +5x +5x +5x +  +  +5x +5x +  +  +  +5x +  +  +1x + 
const get = require("get-value");
+const { destinationConfigKeys, batchEndpoint } = require("./config");
+const {
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  removeUndefinedAndNullValues,
+  getFieldValueFromMessage
+} = require("../../util");
+ 
+function responseBuilderSimple(payload, segmentConfig) {
+  const basicAuth = Buffer.from(`${segmentConfig.writeKey}:`).toString(
+    "base64"
+  );
+ 
+  const response = defaultRequestConfig();
+  const header = {
+    "Content-Type": "application/json",
+    Authorization: `Basic ${basicAuth}`
+  };
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.headers = header;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  response.endpoint = batchEndpoint;
+  response.userId = segmentConfig.userId;
+  response.statusCode = 200;
+ 
+  return response;
+}
+ 
+function getTransformedJSON(message, segmentConfig) {
+  const { type, anonymousId } = message;
+  const { userId } = segmentConfig;
+  const traits = getFieldValueFromMessage(message, "traits");
+  Iif (traits && traits.anonymousId) {
+    delete traits.anonymousId;
+  }
+  const properties = get(message, "properties")
+    ? message.properties
+    : undefined;
+  const event = get(message, "event") ? message.event : undefined;
+  const timeStamp = getFieldValueFromMessage(message, "timestamp");
+ 
+  return removeUndefinedAndNullValues({
+    anonymousId,
+    type,
+    userId,
+    event,
+    traits,
+    properties,
+    timeStamp
+  });
+}
+ 
+function getSegmentConfig(destination, message) {
+  const segmentConfig = {};
+  const configKeys = Object.keys(destination.Config);
+  configKeys.forEach(key => {
+    switch (key) {
+      case destinationConfigKeys.writeKey:
+        segmentConfig.writeKey = `${destination.Config[key]}`;
+        break;
+      default:
+        break;
+    }
+  });
+ 
+  segmentConfig.userId = getFieldValueFromMessage(message, "userId");
+  return segmentConfig;
+}
+ 
+function processSingleMessage(message, destination) {
+  const segmentConfig = getSegmentConfig(destination, message);
+  const properties = getTransformedJSON(message, segmentConfig);
+  const respObj = {
+    batch: []
+  };
+  respObj.batch.push(properties);
+  return responseBuilderSimple(respObj, segmentConfig);
+}
+ 
+function process(event) {
+  return processSingleMessage(event.message, event.destination);
+}
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/config.js.html new file mode 100644 index 00000000000..1437e38cf33 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/config.js.html @@ -0,0 +1,194 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/sendgrid/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/sendgrid config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +391x +  +1x +1x +1x +  +1x +  +  +  +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ENDPOINT = "https://api.sendgrid.com/v3/mail/send";
+const MIN_POOL_LENGTH = 2;
+const MAX_POOL_LENGTH = 64;
+ 
+const CONFIG_CATEGORIES = {
+  TRACK: { type: "track", name: "SendgridTrack" }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+const TRACK_EXCLUSION_FIELDS = [
+  "personalizations",
+  "from",
+  "replyTo",
+  "replyToList",
+  "subject",
+  "content",
+  "attachments",
+  "templateId",
+  "headers",
+  "categories",
+  "sendAt",
+  "batchId",
+  "asm",
+  "IPPoolName",
+  "mailSettings",
+  "trackingSettings"
+];
+ 
+module.exports = {
+  ENDPOINT,
+  TRACK_EXCLUSION_FIELDS,
+  MAX_POOL_LENGTH,
+  MIN_POOL_LENGTH,
+  trackMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK.name]
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/index.html new file mode 100644 index 00000000000..50d5a263dbc --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/sendgrid + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/sendgrid

+
+ +
+ 79.62% + Statements + 211/265 +
+ + +
+ 65.24% + Branches + 152/233 +
+ + +
+ 91.67% + Functions + 22/24 +
+ + +
+ 79.62% + Lines + 211/265 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%0/0100%8/8
transform.js +
+
79.1%53/6750%21/42100%4/479.1%53/67
util.js +
+
78.95%150/19068.59%131/19190%18/2078.95%150/190
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/transform.js.html new file mode 100644 index 00000000000..781d538d05b --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/transform.js.html @@ -0,0 +1,572 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/sendgrid/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/sendgrid transform.js

+
+ +
+ 79.1% + Statements + 53/67 +
+ + +
+ 50% + Branches + 21/42 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 79.1% + Lines + 53/67 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +1x +8x +8x +  +  +8x +8x +1x +  +7x +7x +7x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7x +7x +7x +7x +  +  +  +  +4x +  +7x +7x +  +  +7x +  +  +  +  +  +  +7x +7x +7x +7x +7x +7x +7x +  +  +  +  +  +7x +  +  +  +7x +7x +7x +7x +  +  +  +7x +7x +7x +7x +  +1x +8x +8x +  +  +  +  +  +  +8x +  +  +8x +  +  +8x +  +8x +7x +  +  +  +7x +  +  +1x +1x +  +  +  +  +1x +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable object-shorthand */
+const { EventType } = require("../../../constants");
+const {
+  CustomError,
+  getValueFromMessage,
+  getErrorRespEvents,
+  getSuccessRespEvents,
+  removeUndefinedAndNullValues,
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  isEmptyObject,
+  extractCustomFields,
+  constructPayload
+} = require("../../util");
+const {
+  ENDPOINT,
+  TRACK_EXCLUSION_FIELDS,
+  MIN_POOL_LENGTH,
+  MAX_POOL_LENGTH,
+  trackMapping
+} = require("./config");
+const {
+  payloadValidator,
+  isValidEvent,
+  createList,
+  createMailSettings,
+  createTrackSettings,
+  generatePayloadFromConfig,
+  requiredFieldValidator
+} = require("./util");
+ 
+const trackResponseBuilder = (message, { Config }) => {
+  let event = getValueFromMessage(message, "event");
+  Iif (!event) {
+    throw new CustomError("event is required for track call", 400);
+  }
+  event = event.trim().toLowerCase();
+  if (!isValidEvent(Config, event)) {
+    throw new CustomError("event not configured on dashboard", 400);
+  }
+  let payload = {};
+  payload = constructPayload(message, trackMapping);
+  Iif (!payload.personalizations) {
+    if (Config.mailFromTraits) {
+      // if enabled then we look for email in traits and if found we create personalizations object
+      const email = getValueFromMessage(message, [
+        "traits.email",
+        "context.traits.email"
+      ]);
+      if (email) {
+        payload.personalizations = [{ to: [{ email: email }] }];
+      } else {
+        throw new CustomError(
+          "Either email not found in traits or personalizations field is missing/empty",
+          400
+        );
+      }
+    }
+  }
+  payload = generatePayloadFromConfig(payload, Config); // if fields present in config are not/empty in properties we override those properties with config values
+  requiredFieldValidator(payload);
+  payload.asm = {};
+  if (
+    Config.group &&
+    !Number.isNaN(Number(Config.group)) &&
+    Number.isInteger(Number(Config.group))
+  ) {
+    payload.asm.group_id = Number(Config.group);
+  }
+  const groupsToDisplay = createList(Config);
+  payload.asm.groups_to_display =
+    groupsToDisplay.length > 0 ? groupsToDisplay : null;
+ 
+  Iif (
+    Config.IPPoolName &&
+    Config.IPPoolName.length >= MIN_POOL_LENGTH &&
+    Config.IPPoolName.length <= MAX_POOL_LENGTH
+  ) {
+    payload.ip_pool_name = Config.IPPoolName;
+  }
+  payload.reply_to = removeUndefinedAndNullValues(payload.reply_to);
+  payload.asm = removeUndefinedAndNullValues(payload.asm);
+  payload = createMailSettings(payload, message, Config); // we are sending message directly because we want this func to get called everytime, since it can take values from Config as well
+  payload = createTrackSettings(payload, Config);
+  Eif (!payload.custom_args) {
+    let customFields = {};
+    customFields = extractCustomFields(
+      message,
+      customFields,
+      ["properties"],
+      TRACK_EXCLUSION_FIELDS
+    );
+    Iif (!isEmptyObject(customFields)) {
+      payload.custom_args = customFields;
+    }
+  }
+  payload = payloadValidator(payload);
+  payload = removeUndefinedAndNullValues(payload);
+  const response = defaultRequestConfig();
+  response.headers = {
+    Authorization: `Bearer ${Config.apiKey}`,
+    "Content-Type": "application/json"
+  };
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = ENDPOINT;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  return response;
+};
+const process = event => {
+  const { message, destination } = event;
+  Iif (!message.type) {
+    throw new CustomError(
+      "message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  Iif (!destination.Config.apiKey) {
+    throw new CustomError("Invalid Api Key", 400);
+  }
+  const messageType = message.type.toLowerCase();
+ 
+  let response;
+  switch (messageType) {
+    case EventType.TRACK:
+      response = trackResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`message type ${messageType} not supported`, 400);
+  }
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/util.js.html new file mode 100644 index 00000000000..2cd98074c88 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/sendgrid/util.js.html @@ -0,0 +1,1196 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/sendgrid/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/sendgrid util.js

+
+ +
+ 78.95% + Statements + 150/190 +
+ + +
+ 68.59% + Branches + 131/191 +
+ + +
+ 90% + Functions + 18/20 +
+ + +
+ 78.95% + Lines + 150/190 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +3731x +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +1x +7x +7x +  +  +  +7x +  +  +  +  +  +7x +  +  +7x +  +  +  +  +1x +7x +  +  +7x +7x +7x +7x +7x +14x +7x +  +  +  +  +  +7x +  +  +7x +3x +3x +  +  +  +3x +  +  +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +7x +  +  +7x +  +  +7x +  +  +7x +  +  +  +7x +  +  +  +7x +3x +  +7x +  +  +1x +8x +8x +9x +  +  +  +  +7x +7x +  +  +8x +  +  +1x +7x +7x +4x +12x +  +  +  +  +  +8x +  +  +  +7x +  +  +1x +7x +7x +7x +7x +7x +7x +  +  +  +  +  +  +  +7x +  +  +1x +7x +7x +3x +3x +5x +3x +2x +  +  +  +  +  +  +7x +  +  +1x +7x +7x +  +  +  +  +  +  +  +7x +7x +7x +7x +  +7x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +  +  +1x +  +  +1x +  +  +  +7x +  +  +  +  +  +7x +28x +27x +  +  +7x +2x +  +7x +7x +  +7x +  +  +7x +  +  +7x +6x +  +7x +7x +  +7x +6x +  +7x +  +  +1x +7x +7x +  +  +  +  +  +7x +7x +  +  +7x +7x +  +  +7x +7x +  +7x +  +7x +  +7x +  +  +7x +7x +  +7x +  +7x +7x +  +7x +  +  +7x +7x +21x +  +  +  +  +7x +  +  +  +7x +7x +  +7x +7x +  +7x +7x +  +7x +  +  +  +7x +  +7x +7x +  +7x +  +  +1x +7x +7x +  +  +  +  +  +7x +  +  +7x +  +  +  +7x +7x +3x +  +4x +  +  +  +7x +7x +7x +7x +  +  +  +  +7x +7x +  +7x +2x +2x +  +  +2x +  +  +  +7x +  +  +1x +  +  +  +  +  +  +  +  + 
const logger = require("../../../logger");
+const {
+  CustomError,
+  isObject,
+  isEmptyObject,
+  removeUndefinedAndNullValues,
+  removeUndefinedAndNullAndEmptyValues,
+  isEmpty
+} = require("../../util");
+ 
+const isValidBase64 = content => {
+  const re = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
+  return re.test(String(content));
+};
+ 
+const requiredFieldValidator = payload => {
+  Eif (!payload.template_id) {
+    Iif (!payload.content || (payload.content && isEmpty(payload.content))) {
+      throw new CustomError("Either template id or content is required.", 400);
+    }
+  }
+  Iif (!payload.personalizations || isEmpty(payload.personalizations)) {
+    throw new CustomError(
+      "personalizations field cannot be missing or empty",
+      400
+    );
+  }
+  Iif (!payload.from) {
+    throw new CustomError("from is required field", 400);
+  }
+  Iif (payload.from && !payload.from.email) {
+    throw new CustomError("email inside from object is required", 400);
+  }
+};
+ 
+const payloadValidator = payload => {
+  const updatedPayload = payload;
+ 
+  // each item in personalizations array must have 'to' field
+  Eif (payload.personalizations) {
+    payload.personalizations.forEach((keys, index) => {
+      const personalizationsArr = [];
+      Eif (keys.to && (payload.subject || keys.subject)) {
+        keys.to.forEach(keyto => {
+          if (keyto.email) {
+            personalizationsArr.push(keyto);
+          }
+        });
+      } else {
+        logger.error(`item at index ${index} dropped. to field is mandatory`);
+      }
+      updatedPayload.personalizations[index].to = personalizationsArr;
+    });
+  }
+  if (payload.attachments) {
+    payload.attachments.forEach((attachment, index) => {
+      Iif (!attachment.content || !attachment.filename) {
+        updatedPayload.attachments[index] = null;
+        logger.error("content and filename are required for attachments");
+      }
+      Iif (
+        payload.attachments.content &&
+        !isValidBase64(payload.attachments.content)
+      ) {
+        updatedPayload.attachments[index] = null;
+        logger.error("content should be base64 encoded");
+      }
+    });
+  }
+  Iif (payload.categories) {
+    payload.categories.forEach((category, index) => {
+      if (typeof category !== "string") {
+        updatedPayload.categories[index] = JSON.stringify(category);
+      }
+    });
+    payload.categories.splice(10); // categories can only have 10 items
+  }
+  Iif (payload.headers && !isObject(payload.headers)) {
+    updatedPayload.headers = null;
+  }
+  Iif (payload.subject && payload.subject.length < 1) {
+    delete updatedPayload.subject;
+  }
+  Iif (isEmptyObject(payload.reply_to)) {
+    delete updatedPayload.reply_to;
+  }
+  Iif (payload.reply_to && !payload.reply_to.email) {
+    logger.error("reply_to object requires email field");
+    delete updatedPayload.reply_to;
+  }
+  Iif (payload.asm && payload.asm.groups_to_display && !payload.asm.group_id) {
+    logger.error("group Id parameter is required in asm");
+    delete updatedPayload.asm;
+  }
+  if (isEmptyObject(payload.asm)) {
+    delete updatedPayload.asm;
+  }
+  return updatedPayload;
+};
+ 
+const isValidEvent = (Config, event) => {
+  let flag = false;
+  Config.eventNamesSettings.some(eventName => {
+    if (
+      eventName.event &&
+      eventName.event.trim().length !== 0 &&
+      eventName.event.trim().toLowerCase() === event
+    ) {
+      flag = true;
+      return true;
+    }
+  });
+  return flag;
+};
+ 
+const createList = Config => {
+  const asmList = [];
+  if (Config.groupsToDisplay && Config.groupsToDisplay.length > 0) {
+    Config.groupsToDisplay.forEach(groups => {
+      if (
+        groups.groupId &&
+        groups.groupId.trim() &&
+        !Number.isNaN(Number(groups.groupId)) &&
+        Number.isInteger(Number(groups.groupId))
+      ) {
+        asmList.push(Number(groups.groupId));
+      }
+    });
+  }
+  return asmList;
+};
+ 
+const createContent = Config => {
+  const contentList = [];
+  Eif (Config.contents && Config.contents.length > 0) {
+    const len = Config.contents.length - 1;
+    Config.contents.forEach((content, index) => {
+      Eif (content.type && content.value) {
+        contentList.push(content);
+      } else if (index < len) {
+        logger.error(
+          `item at index ${index} dropped. type and value are required fields`
+        );
+      }
+    });
+  }
+  return contentList;
+};
+ 
+const createAttachments = Config => {
+  const attachmentList = [];
+  if (Config.attachments && Config.attachments.length > 0) {
+    const len = Config.attachments.length - 1;
+    Config.attachments.forEach((attachment, index) => {
+      if (attachment.content && attachment.filename) {
+        attachmentList.push(removeUndefinedAndNullAndEmptyValues(attachment));
+      } else Iif (index < len) {
+        logger.error(
+          `item at index ${index} dropped. content and type are required fields`
+        );
+      }
+    });
+  }
+  return attachmentList;
+};
+ 
+const createMailSettings = (payload, message, Config) => {
+  const updatedPayload = payload;
+  updatedPayload.mail_settings = {
+    bypass_list_management: {},
+    bypass_spam_management: {},
+    bypass_bounce_management: {},
+    bypass_unsubscribe_management: {},
+    footer: {},
+    sandbox_mode: {}
+  };
+  updatedPayload.mail_settings.footer.enable = Config.footer;
+  updatedPayload.mail_settings.footer.text = Config.footerText;
+  updatedPayload.mail_settings.footer.html = Config.footerHtml;
+  updatedPayload.mail_settings.sandbox_mode.enable = Config.sandboxMode;
+ 
+  if (message.properties.mailSettings) {
+    const mailObj = message.properties.mailSettings;
+    Eif (mailObj.bypassListManagement) {
+      updatedPayload.mail_settings.bypass_list_management.enable =
+        mailObj.bypassListManagement;
+    } else {
+      if (mailObj.bypassSpamManagement) {
+        updatedPayload.mail_settings.bypass_spam_management.enable =
+          mailObj.bypassSpamManagement;
+      }
+      if (mailObj.bypassBounceManagement) {
+        updatedPayload.mail_settings.bypass_bounce_management.enable =
+          mailObj.bypassBounceManagement;
+      }
+      if (mailObj.bypassUnsubscribeManagement) {
+        updatedPayload.mail_settings.bypass_unsubscribe_management.enable =
+          mailObj.bypassUnsubscribeManagement;
+      }
+    }
+    Eif (mailObj.footer) {
+      updatedPayload.mail_settings.footer.enable = mailObj.footer;
+    }
+    Iif (mailObj.footerText) {
+      updatedPayload.mail_settings.footer.text = mailObj.footerText;
+    }
+    Iif (mailObj.footerHtml) {
+      updatedPayload.mail_settings.footer.html = mailObj.footerHtml;
+    }
+    Iif (mailObj.sandboxMode) {
+      updatedPayload.mail_settings.sandbox_mode.enable = mailObj.sandboxMode;
+    }
+  }
+  const list = [
+    "bypass_list_management",
+    "bypass_spam_management",
+    "bypass_bounce_management",
+    "bypass_unsubscribe_management"
+  ];
+  list.forEach(key => {
+    if (isEmptyObject(updatedPayload.mail_settings[key])) {
+      delete updatedPayload.mail_settings[key];
+    }
+  });
+  if (isEmpty(updatedPayload.mail_settings.footer.text)) {
+    updatedPayload.mail_settings.footer.text = null;
+  }
+  Eif (isEmpty(updatedPayload.mail_settings.footer.html)) {
+    updatedPayload.mail_settings.footer.html = null;
+  }
+  updatedPayload.mail_settings.footer = removeUndefinedAndNullValues(
+    updatedPayload.mail_settings.footer
+  );
+  updatedPayload.mail_settings = removeUndefinedAndNullValues(
+    payload.mail_settings
+  );
+  if (!updatedPayload.mail_settings.footer.enable) {
+    delete updatedPayload.mail_settings.footer;
+  }
+  Eif (!updatedPayload.mail_settings.sandbox_mode.enable) {
+    delete updatedPayload.mail_settings.sandbox_mode;
+  }
+  if (isEmptyObject(updatedPayload.mail_settings)) {
+    delete updatedPayload.mail_settings;
+  }
+  return updatedPayload;
+};
+ 
+const createTrackSettings = (payload, Config) => {
+  const updatedPayload = payload;
+  updatedPayload.tracking_settings = {
+    click_tracking: {},
+    open_tracking: {},
+    subscription_tracking: {},
+    ganalytics: {}
+  };
+  updatedPayload.tracking_settings.click_tracking.enable = Config.clickTracking;
+  updatedPayload.tracking_settings.click_tracking.enable_text =
+    Config.clickTrackingEnableText;
+ 
+  updatedPayload.tracking_settings.open_tracking.enable = Config.openTracking;
+  updatedPayload.tracking_settings.open_tracking.substitution_tag =
+    Config.openTrackingSubstitutionTag || null;
+ 
+  updatedPayload.tracking_settings.subscription_tracking = {};
+  updatedPayload.tracking_settings.subscription_tracking.enable =
+    Config.subscriptionTracking || false;
+  updatedPayload.tracking_settings.subscription_tracking.text =
+    Config.text || null;
+  updatedPayload.tracking_settings.subscription_tracking.html =
+    Config.html || null;
+  updatedPayload.tracking_settings.subscription_tracking.substitution_tag =
+    Config.substitutionTag || null;
+ 
+  updatedPayload.tracking_settings.ganalytics.enable = Config.ganalytics;
+  updatedPayload.tracking_settings.ganalytics.utm_source =
+    Config.utmSource || null;
+  updatedPayload.tracking_settings.ganalytics.utm_medium =
+    Config.utmMedium || null;
+  updatedPayload.tracking_settings.ganalytics.utm_term = Config.utmTerm || null;
+  updatedPayload.tracking_settings.ganalytics.utm_content =
+    Config.utmContent || null;
+  updatedPayload.tracking_settings.ganalytics.utm_campaign =
+    Config.utmCampaign || null;
+ 
+  const list = ["ganalytics", "subscription_tracking", "open_tracking"];
+  list.forEach(key => {
+    updatedPayload.tracking_settings[key] = removeUndefinedAndNullValues(
+      payload.tracking_settings[key]
+    );
+  });
+ 
+  updatedPayload.tracking_settings = removeUndefinedAndNullValues(
+    payload.tracking_settings
+  );
+  // when not enabled then its any fields inside it are not required
+  Eif (!updatedPayload.tracking_settings.subscription_tracking.enable) {
+    delete updatedPayload.tracking_settings.subscription_tracking;
+  }
+  Eif (!updatedPayload.tracking_settings.open_tracking.enable) {
+    delete updatedPayload.tracking_settings.open_tracking;
+  }
+  Eif (!updatedPayload.tracking_settings.ganalytics.enable) {
+    delete updatedPayload.tracking_settings.ganalytics;
+  }
+  Eif (
+    !updatedPayload.tracking_settings.click_tracking.enable &&
+    !updatedPayload.tracking_settings.click_tracking.enable_text
+  ) {
+    delete updatedPayload.tracking_settings.click_tracking;
+  }
+  Eif (isEmptyObject(updatedPayload.tracking_settings)) {
+    delete updatedPayload.tracking_settings;
+  }
+  return updatedPayload;
+};
+ 
+const generatePayloadFromConfig = (payload, Config) => {
+  const updatedPayload = payload;
+  Iif (!payload.from) {
+    updatedPayload.from = {};
+    updatedPayload.from.email = Config.fromEmail;
+    updatedPayload.from.name = Config.fromName ? Config.fromName : null;
+    updatedPayload.from = removeUndefinedAndNullValues(updatedPayload.from);
+  }
+  Iif (Config.templateId && !payload.template_id) {
+    updatedPayload.template_id = Config.templateId;
+  }
+  Eif (
+    !payload.attachments ||
+    (payload.attachments && isEmpty(payload.attachments))
+  ) {
+    const attachments = createAttachments(Config);
+    if (attachments.length > 0) {
+      updatedPayload.attachments = attachments;
+    } else {
+      delete updatedPayload.attachments;
+    }
+  }
+ 
+  Eif (!payload.content || (payload.content && isEmpty(payload.content))) {
+    const content = createContent(Config);
+    Eif (content.length > 0) {
+      updatedPayload.content = content;
+    } else {
+      delete updatedPayload.content;
+    }
+  }
+  Eif (!payload.subject || (payload.subject && isEmpty(payload.subject))) {
+    updatedPayload.subject = Config.subject;
+  }
+  if (!payload.reply_to) {
+    updatedPayload.reply_to = {};
+    updatedPayload.reply_to.email = Config.replyToEmail
+      ? Config.replyToEmail
+      : null;
+    updatedPayload.reply_to.name = Config.replyToName
+      ? Config.replyToName
+      : null;
+  }
+  return updatedPayload;
+};
+ 
+module.exports = {
+  payloadValidator,
+  isValidEvent,
+  createList,
+  createMailSettings,
+  createTrackSettings,
+  generatePayloadFromConfig,
+  requiredFieldValidator
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/sfmc/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/sfmc/config.js.html new file mode 100644 index 00000000000..6c0f867124d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/sfmc/config.js.html @@ -0,0 +1,158 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/sfmc/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/sfmc config.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +271x +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ENDPOINTS = {
+  GET_TOKEN: `auth.marketingcloudapis.com/v2/token`,
+  CONTACTS: `rest.marketingcloudapis.com/contacts/v1/contacts`,
+  INSERT_CONTACTS: `rest.marketingcloudapis.com/hub/v1/dataevents/key:`
+};
+ 
+const CONFIG_CATEGORIES = {
+  IDENTIFY: {
+    type: "identify",
+    name: "SFMCInsertIdentifyContactsConfig"
+  },
+  TRACK: {
+    type: "track",
+    name: "SFMCInsertTrackContactsConfig"
+  }
+};
+ 
+const MAPPING_CONFIG = getMappingConfig(CONFIG_CATEGORIES, __dirname);
+ 
+module.exports = {
+  ENDPOINTS,
+  MAPPING_CONFIG,
+  CONFIG_CATEGORIES
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/sfmc/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/sfmc/index.html new file mode 100644 index 00000000000..464432c9d30 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/sfmc/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/sfmc + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/sfmc

+
+ +
+ 92.08% + Statements + 93/101 +
+ + +
+ 85.48% + Branches + 53/62 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 92.08% + Lines + 93/101 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%5/5100%0/0100%0/0100%5/5
transform.js +
+
91.67%88/9685.48%53/62100%9/991.67%88/96
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/sfmc/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/sfmc/transform.js.html new file mode 100644 index 00000000000..8e96a2fd501 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/sfmc/transform.js.html @@ -0,0 +1,986 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/sfmc/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/sfmc transform.js

+
+ +
+ 91.67% + Statements + 88/96 +
+ + +
+ 85.48% + Branches + 53/62 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 91.67% + Lines + 88/96 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303  +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +1x +12x +12x +  +  +  +  +  +  +  +  +  +  +12x +12x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +4x +4x +4x +  +  +4x +  +4x +1x +  +3x +3x +  +  +  +3x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +8x +  +8x +1x +  +  +7x +7x +7x +  +  +  +  +  +7x +4x +  +  +  +7x +  +  +  +  +  +7x +  +  +  +  +  +  +4x +4x +  +  +  +  +  +3x +  +1x +1x +1x +  +  +  +  +  +  +  +2x +2x +3x +3x +3x +  +1x +  +  +3x +2x +  +1x +  +  +2x +2x +  +  +  +  +  +  +7x +  +  +1x +  +  +  +  +  +  +  +  +  +12x +  +12x +  +12x +  +12x +  +12x +  +12x +  +4x +  +  +  +  +  +3x +  +  +  +  +  +  +  +3x +  +  +8x +2x +  +  +6x +  +  +  +5x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +14x +1x +  +  +  +  +  +13x +  +  +13x +  +6x +6x +  +6x +6x +  +1x +  +  +  +12x +7x +  +  +1x +14x +7x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-nested-ternary */
+const axios = require("axios");
+const { EventType } = require("../../../constants");
+const { CONFIG_CATEGORIES, MAPPING_CONFIG, ENDPOINTS } = require("./config");
+const {
+  removeUndefinedAndNullValues,
+  getFieldValueFromMessage,
+  defaultPostRequestConfig,
+  defaultPutRequestConfig,
+  defaultRequestConfig,
+  constructPayload,
+  flattenJson,
+  toTitleCase,
+  getHashFromArray,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError,
+  isEmpty
+} = require("../../util");
+const { nodeSysErrorToStatus } = require("../../../adapters/utils/networkUtils");
+ 
+// DOC: https://developer.salesforce.com/docs/atlas.en-us.mc-app-development.meta/mc-app-development/access-token-s2s.htm
+ 
+const getToken = async (clientId, clientSecret, subdomain) => {
+  try {
+    const resp = await axios.post(
+      `https://${subdomain}.${ENDPOINTS.GET_TOKEN}`,
+      {
+        grant_type: "client_credentials",
+        client_id: clientId,
+        client_secret: clientSecret
+      },
+      {
+        "Content-Type": "application/json"
+      }
+    );
+    Eif (resp && resp.data) {
+      return resp.data.access_token;
+    }
+    throw new CustomError("Could not retrieve authorisation token", 400);
+  } catch (error) {
+    if (!isEmpty(error.response)) {
+      throw new CustomError(
+        `Authorization Failed ${error.response.statusText}`,
+        error.response.status
+      );
+    } else {
+      const httpError = nodeSysErrorToStatus(error.code);
+      throw new CustomError(
+        `Authorization Failed ${httpError.message}`,
+        httpError.status
+      );
+    }
+  }
+};
+ 
+// DOC : https://developer.salesforce.com/docs/atlas.en-us.noversion.mc-apis.meta/mc-apis/createContacts.htm
+ 
+const responseBuilderForIdentifyContacts = (message, subdomain, authToken) => {
+  const response = defaultRequestConfig();
+  response.endpoint = `https://${subdomain}.${ENDPOINTS.CONTACTS}`;
+  response.method = defaultPostRequestConfig.requestMethod;
+  // set contact key as userId or email from traits. Either of these two is required.
+  const contactKey =
+    getFieldValueFromMessage(message, "userIdOnly") ||
+    getFieldValueFromMessage(message, "email");
+  if (!contactKey) {
+    throw new CustomError("Either userId or email is required", 400);
+  }
+  response.body.JSON = { attributeSets: [], contactKey };
+  response.headers = {
+    "Content-Type": "application/json",
+    Authorization: `Bearer ${authToken}`
+  };
+  return response;
+};
+ 
+// DOC : https://developer.salesforce.com/docs/atlas.en-us.noversion.mc-apis.meta/mc-apis/putDataExtensionRowByKey.htm?search_text=%252Fhub%252Fv1%252Fdataevents%252Fkey:%7Bkey%7D%252Frows%252F%7BprimaryKeys%7D
+ 
+const responseBuilderForInsertData = (
+  message,
+  externalKey,
+  subdomain,
+  category,
+  authToken,
+  type,
+  primaryKey,
+  uuid
+) => {
+  // set contact key as userId or email from traits. Either of these two is required.
+  const contactKey =
+    getFieldValueFromMessage(message, "userIdOnly") ||
+    getFieldValueFromMessage(message, "email");
+  if (!contactKey) {
+    throw new CustomError("Either userId or email is required", 400);
+  }
+ 
+  const response = defaultRequestConfig();
+  response.method = defaultPutRequestConfig.requestMethod;
+  response.headers = {
+    "Content-Type": "application/json",
+    Authorization: `Bearer ${authToken}`
+  };
+  // multiple primary keys can be set by the user as comma separated.
+  let primaryKeyArray;
+  if (primaryKey) {
+    primaryKeyArray = primaryKey.split(",");
+  }
+  // Rudder handles the payload by sending the properties as title case only as the user is instructed to set column names in data
+  // extensions as title case.
+  const payload = removeUndefinedAndNullValues(
+    toTitleCase(
+      flattenJson(constructPayload(message, MAPPING_CONFIG[category.name]))
+    )
+  );
+  // for both identify and track calls with only one primary key set as "Contact Key" is same.
+  if (
+    type === "identify" ||
+    (type === "track" &&
+      primaryKeyArray.length === 1 &&
+      primaryKeyArray.includes("Contact Key") &&
+      !uuid)
+  ) {
+    response.endpoint = `https://${subdomain}.${ENDPOINTS.INSERT_CONTACTS}${externalKey}/rows/Contact Key:${contactKey}`;
+    response.body.JSON = {
+      values: {
+        "Contact Key": contactKey,
+        ...payload
+      }
+    };
+  } else if (type === "track" && uuid) {
+    // for track calls and uuid as true the primary keys set will be overridden and only Uuid will be set as the primary key
+    const generateUuid = message.messageId; // messageId is set as the Uuid.
+    response.endpoint = `https://${subdomain}.${ENDPOINTS.INSERT_CONTACTS}${externalKey}/rows/Uuid:${generateUuid}`;
+    response.body.JSON = {
+      values: {
+        Uuid: generateUuid,
+        ...payload
+      }
+    };
+  } else {
+    // other track cases where there are multiple primary keys or one primary key which is not "Contact Key" and uuid is false
+    let strPrimary = "";
+    primaryKeyArray.forEach((key, index) => {
+      const keyTrimmed = key.trim();
+      let payloadValue = payload[keyTrimmed];
+      if (keyTrimmed === "Contact Key") {
+        // if one of the multiple primary key is "Contact Key"
+        payloadValue = contactKey;
+      }
+      // to format the strin like "Primary Key1":"value1","Primary Key2":"value2"
+      if (index === 0) {
+        strPrimary += `${keyTrimmed}:${payloadValue}`;
+      } else {
+        strPrimary += `,${keyTrimmed}:${payloadValue}`;
+      }
+    });
+    response.endpoint = `https://${subdomain}.${ENDPOINTS.INSERT_CONTACTS}${externalKey}/rows/${strPrimary}`;
+    response.body.JSON = {
+      values: {
+        ...payload
+      }
+    };
+  }
+ 
+  return response;
+};
+ 
+const responseBuilderSimple = async (message, category, destination) => {
+  const {
+    clientId,
+    clientSecret,
+    subDomain,
+    createOrUpdateContacts,
+    externalKey,
+    eventToExternalKey,
+    eventToPrimaryKey,
+    eventToUUID
+  } = destination.Config;
+  // map from an event name to an external key of a data extension.
+  const hashMapExternalKey = getHashFromArray(eventToExternalKey, "from", "to");
+  // map from an event name to a primary key of the data extension.
+  const hashMapPrimaryKey = getHashFromArray(eventToPrimaryKey, "from", "to");
+  // map from an event name to uuid as true or false to determine to send uuid as primary key or not.
+  const hashMapUUID = getHashFromArray(eventToUUID, "event", "uuid");
+  // token needed for authorization for subsequent calls
+  const authToken = await getToken(clientId, clientSecret, subDomain);
+  // if createOrUpdateContacts is true identify calls for create and update of contacts will not occur.
+  if (category.type === "identify" && !createOrUpdateContacts) {
+    // first call to identify the contact
+    const identifyContactsPayload = responseBuilderForIdentifyContacts(
+      message,
+      subDomain,
+      authToken
+    );
+    // second call to insert/update data against the contact in the data extension
+    const identifyInsertDataPayload = responseBuilderForInsertData(
+      message,
+      externalKey,
+      subDomain,
+      category,
+      authToken,
+      "identify"
+    );
+    return [identifyContactsPayload, identifyInsertDataPayload];
+  }
+ 
+  if (category.type === "identify" && createOrUpdateContacts) {
+    throw new CustomError("Creating or updating contacts is disabled", 400);
+  }
+ 
+  if (
+    category.type === "track" &&
+    hashMapExternalKey[message.event.toLowerCase()]
+  ) {
+    return responseBuilderForInsertData(
+      message,
+      hashMapExternalKey[message.event.toLowerCase()],
+      subDomain,
+      category,
+      authToken,
+      "track",
+      hashMapPrimaryKey[message.event.toLowerCase()] || "Contact Key",
+      hashMapUUID[message.event.toLowerCase()]
+    );
+  }
+ 
+  throw new CustomError("Event not mapped for this track call", 400);
+};
+ 
+const processEvent = async (message, destination) => {
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  const messageType = message.type.toLowerCase();
+  let category;
+  // only accept track and identify calls
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      category = CONFIG_CATEGORIES.IDENTIFY;
+      break;
+    case EventType.TRACK:
+      category = CONFIG_CATEGORIES.TRACK;
+      break;
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+ 
+  // build the response
+  const response = await responseBuilderSimple(message, category, destination);
+  return response;
+};
+ 
+const process = async event => {
+  const response = await processEvent(event.message, event.destination);
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+              ? error.code
+              : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/slack/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/slack/config.js.html new file mode 100644 index 00000000000..5c1b7f853c4 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/slack/config.js.html @@ -0,0 +1,101 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/slack/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/slack config.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +81x +1x +  +1x +  +  +  + 
const SLACK_USER_NAME = "RudderStack";
+const SLACK_RUDDER_IMAGE_URL = "https://cdn.rudderlabs.com/rudderstack.png";
+ 
+module.exports = {
+  SLACK_RUDDER_IMAGE_URL,
+  SLACK_USER_NAME
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/slack/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/slack/index.html new file mode 100644 index 00000000000..0712d0eba87 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/slack/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/slack + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/slack

+
+ +
+ 87.02% + Statements + 114/131 +
+ + +
+ 52.59% + Branches + 71/135 +
+ + +
+ 81.25% + Functions + 13/16 +
+ + +
+ 87.02% + Lines + 114/131 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%3/3100%0/0100%0/0100%3/3
transform.js +
+
86.72%111/12852.59%71/13581.25%13/1686.72%111/128
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/slack/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/slack/transform.js.html new file mode 100644 index 00000000000..434f8121671 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/slack/transform.js.html @@ -0,0 +1,1214 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/slack/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/slack transform.js

+
+ +
+ 86.72% + Statements + 111/128 +
+ + +
+ 52.59% + Branches + 71/135 +
+ + +
+ 81.25% + Functions + 13/16 +
+ + +
+ 86.72% + Lines + 111/128 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379  +  +1x +1x +  +1x +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +6x +6x +26x +26x +16x +4x +  +  +10x +  +  +  +6x +6x +  +  +  +  +  +4x +  +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +4x +  +  +  +  +  +  +4x +4x +4x +4x +4x +4x +4x +  +  +  +  +  +  +4x +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +4x +8x +  +  +  +  +  +  +4x +  +  +  +  +  +  +2x +2x +  +2x +  +2x +2x +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +2x +  +  +  +  +  +  +2x +2x +  +  +  +  +3x +3x +3x +  +3x +1x +  +2x +2x +2x +  +2x +  +  +  +  +  +  +  +2x +6x +  +  +  +  +6x +  +  +  +  +6x +2x +2x +  +  +  +2x +  +  +  +  +  +2x +  +  +  +2x +  +  +  +  +  +  +  +2x +  +  +2x +4x +  +  +  +  +4x +  +  +  +  +4x +2x +2x +  +  +  +2x +  +  +  +  +  +  +  +2x +  +2x +  +  +  +  +2x +  +  +2x +  +2x +  +  +  +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +  +2x +  +2x +2x +2x +  +  +  +  +  +  +  +  +  +8x +8x +8x +  +8x +8x +1x +  +  +  +  +7x +7x +  +7x +  +2x +2x +2x +2x +  +3x +2x +2x +2x +  +2x +2x +  +4x +4x +4x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-nested-ternary */
+/* eslint-disable no-prototype-builtins */
+const Handlebars = require("handlebars");
+const { EventType } = require("../../../constants");
+ 
+const logger = require("../../../logger");
+ 
+const { SLACK_RUDDER_IMAGE_URL, SLACK_USER_NAME } = require("./config");
+const {
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  getFieldValueFromMessage,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+// to string json traits, not using JSON.stringify()
+// always first check for whitelisted traits
+function stringifyJSON(json, whiteListedTraits) {
+  let output = "";
+  Object.keys(json).forEach(key => {
+    Eif (json.hasOwnProperty(key)) {
+      if (whiteListedTraits && whiteListedTraits.length > 0) {
+        if (whiteListedTraits.includes(key)) {
+          output += `${key}: ${json[key]} `;
+        }
+      } else {
+        output += `${key}: ${json[key]} `;
+      }
+    }
+  });
+  logger.debug("traitsString:: ", output);
+  return output;
+}
+ 
+// get the name value from either traits.name/traits.firstName+traits.lastName/traits.username/
+// properties.email/traits.email/userId/anonymousId
+function getName(message) {
+  const traits = getFieldValueFromMessage(message, "traits");
+  let uName;
+  Eif (traits) {
+    uName =
+      traits.name ||
+      (traits.firstName
+        ? traits.lastName
+          ? `${traits.firstName}${traits.lastName}`
+          : traits.firstName
+        : undefined) ||
+      traits.username ||
+      (message.properties ? message.properties.email : undefined) ||
+      traits.email ||
+      (message.userId ? `User ${message.userId}` : undefined) ||
+      `Anonymous user ${message.anonymousId}`;
+  } else {
+    uName =
+      (message.properties ? message.properties.email : undefined) ||
+      (message.userId ? `User ${message.userId}` : undefined) ||
+      `Anonymous user ${message.anonymousId}`;
+  }
+ 
+  logger.debug("final name::: ", uName);
+  return uName;
+}
+ 
+// build the response to be sent to backend, url encoded header is required as slack accepts payload in this format
+// add the username and image for Rudder
+// image currently served from prod CDN
+function buildResponse(payloadJSON, message, destination) {
+  const endpoint = destination.Config.webhookUrl;
+  const response = defaultRequestConfig();
+  response.endpoint = endpoint;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.headers = { "Content-Type": "application/x-www-form-urlencoded" };
+  response.userId = message.userId ? message.userId : message.anonymousId;
+  response.body.FORM = {
+    payload: JSON.stringify({
+      ...payloadJSON,
+      username: SLACK_USER_NAME,
+      icon_url: SLACK_RUDDER_IMAGE_URL
+    })
+  };
+  response.statusCode = 200;
+  logger.debug(response);
+  return response;
+}
+ 
+// build default identify template
+// if whitelisted traits are present build on it else build the entire traits object
+function buildDefaultTraitTemplate(traitsList, traits) {
+  let templateString = "Identified {{name}} ";
+  // build template with whitelisted traits
+  traitsList.forEach(trait => {
+    templateString += `${trait}: {{${trait}}} `;
+  });
+  // else with all traits
+  if (traitsList.length === 0) {
+    Object.keys(traits).forEach(traitKey => {
+      if (traits.hasOwnProperty(traitKey)) {
+        templateString += `${traitKey}: {{${traitKey}}} `;
+      }
+    });
+  }
+  return templateString;
+}
+ 
+function getWhiteListedTraits(destination, traitsList) {
+  destination.Config.whitelistedTraitsSettings.forEach(whiteListTrait => {
+    if (
+      whiteListTrait.trait
+        ? whiteListTrait.trait.trim().length !== 0
+          ? whiteListTrait.trait
+          : undefined
+        : undefined
+    ) {
+      traitsList.push(whiteListTrait.trait);
+    }
+  });
+}
+ 
+function processIdentify(message, destination) {
+  // debug(JSON.stringify(destination));
+  const identifyTemplateConfig = destination.Config.identifyTemplate;
+  const traitsList = [];
+ 
+  getWhiteListedTraits(destination, traitsList);
+ 
+  logger.debug("defaulTraitsList:: ", traitsList);
+  const uName = getName(message);
+ 
+  // required traitlist ??
+  /* if (!traitsList || traitsList.length == 0) {
+    throw Error("traits list in config not present");
+  } */
+ 
+  const template = Handlebars.compile(
+    (identifyTemplateConfig
+      ? identifyTemplateConfig.trim().length === 0
+        ? undefined
+        : identifyTemplateConfig
+      : undefined) ||
+      buildDefaultTraitTemplate(
+        traitsList,
+        getFieldValueFromMessage(message, "traits") || {}
+      )
+  );
+  logger.debug(
+    "identifyTemplateConfig: ",
+    (identifyTemplateConfig
+      ? identifyTemplateConfig.trim().length === 0
+        ? undefined
+        : identifyTemplateConfig
+      : undefined) ||
+      buildDefaultTraitTemplate(
+        traitsList,
+        getFieldValueFromMessage(message, "traits") || {}
+      )
+  );
+ 
+  // provide a fat input with flattened traits as well as traits object
+  // helps the user to build additional handlebar expressions
+  const identityTraits = getFieldValueFromMessage(message, "traits") || {};
+ 
+  const templateInput = {
+    name: uName,
+    ...identityTraits,
+    traits: stringifyJSON(identityTraits, traitsList),
+    traitsList: identityTraits
+  };
+ 
+  const resultText = template(templateInput);
+  return buildResponse({ text: resultText }, message, destination);
+}
+ 
+function processTrack(message, destination) {
+  // logger.debug(JSON.stringify(destination));
+  const traitsList = [];
+  const eventChannelConfig = destination.Config.eventChannelSettings;
+  const eventTemplateConfig = destination.Config.eventTemplateSettings;
+ 
+  if (!message.event) {
+    throw new CustomError("Event name is required", 400);
+  }
+  const eventName = message.event;
+  const channelListToSendThisEvent = new Set();
+  const templateListForThisEvent = new Set();
+ 
+  getWhiteListedTraits(destination, traitsList);
+ 
+  // Add global context to regex always
+  // build the channel list and templatelist for the event, pick the first in case of multiple
+  // using set to filter out
+  // document this behaviour
+ 
+  // building channel list
+  eventChannelConfig.forEach(channelConfig => {
+    const configEventName = channelConfig.eventName
+      ? channelConfig.eventName.trim().length > 0
+        ? channelConfig.eventName
+        : undefined
+      : undefined;
+    const configEventChannel = channelConfig.eventChannel
+      ? channelConfig.eventChannel.trim().length > 0
+        ? channelConfig.eventChannel
+        : undefined
+      : undefined;
+    if (configEventName && configEventChannel) {
+      Eif (channelConfig.eventRegex) {
+        logger.debug(
+          "regex: ",
+          `${configEventName} trying to match with ${eventName}`
+        );
+        logger.debug(
+          "match:: ",
+          configEventName,
+          eventName,
+          eventName.match(new RegExp(configEventName, "g"))
+        );
+        Eif (
+          eventName.match(new RegExp(configEventName, "g")) &&
+          eventName.match(new RegExp(configEventName, "g")).length > 0
+        ) {
+          channelListToSendThisEvent.add(configEventChannel);
+        }
+      } else if (configEventName === eventName) {
+        channelListToSendThisEvent.add(configEventChannel);
+      }
+    }
+  });
+ 
+  const channelListArray = Array.from(channelListToSendThisEvent);
+ 
+  // building templatelist
+  eventTemplateConfig.forEach(templateConfig => {
+    const configEventName = templateConfig.eventName
+      ? templateConfig.eventName.trim().length > 0
+        ? templateConfig.eventName
+        : undefined
+      : undefined;
+    const configEventTemplate = templateConfig.eventTemplate
+      ? templateConfig.eventTemplate.trim().length > 0
+        ? templateConfig.eventTemplate
+        : undefined
+      : undefined;
+    if (configEventName && configEventTemplate) {
+      Eif (templateConfig.eventRegex) {
+        Eif (
+          eventName.match(new RegExp(configEventName, "g")) &&
+          eventName.match(new RegExp(configEventName, "g")).length > 0
+        ) {
+          templateListForThisEvent.add(configEventTemplate);
+        }
+      } else if (configEventName === eventName) {
+        templateListForThisEvent.add(configEventTemplate);
+      }
+    }
+  });
+ 
+  const templateListArray = Array.from(templateListForThisEvent);
+ 
+  logger.debug(
+    "templateListForThisEvent: ",
+    templateListArray,
+    templateListArray.length > 0 ? templateListArray[0] : undefined
+  );
+  logger.debug("channelListToSendThisEvent: ", channelListArray);
+ 
+  // track event default handlebar expression
+  const defaultTemplate = "{{name}} did {{event}}";
+ 
+  const eventTemplate = Handlebars.compile(
+    templateListArray
+      ? templateListArray.length > 0
+        ? templateListArray[0]
+        : defaultTemplate
+      : defaultTemplate
+  );
+ 
+  // provide flattened properties as well as propertie sobject
+  const identityTraits = getFieldValueFromMessage(message, "traits") || {};
+  const templateInput = {
+    name: getName(message),
+    event: eventName,
+    ...message.properties,
+    properties: message.properties,
+    propertiesList: stringifyJSON(message.properties || {}),
+    traits: stringifyJSON(identityTraits, traitsList),
+    traitsList: identityTraits
+  };
+ 
+  logger.debug("templateInputTrack: ", templateInput);
+ 
+  const resultText = eventTemplate(templateInput);
+  Eif (channelListArray && channelListArray.length > 0) {
+    return buildResponse(
+      { channel: channelListArray[0], text: resultText },
+      message,
+      destination
+    );
+  }
+  return buildResponse({ text: resultText }, message, destination);
+}
+ 
+function process(event) {
+  logger.debug("=====start=====");
+  logger.debug(JSON.stringify(event));
+  const respList = [];
+  let response;
+  const { message, destination } = event;
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+  const messageType = message.type.toLowerCase();
+  logger.debug("messageType: ", messageType);
+ 
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      response = processIdentify(message, destination);
+      response.statusCode = 200;
+      respList.push(response);
+      break;
+    case EventType.TRACK:
+      response = processTrack(message, destination);
+      response.statusCode = 200;
+      respList.push(response);
+      break;
+    default:
+      logger.debug("Message type not supported");
+      throw new CustomError("Message type not supported", 400);
+  }
+  logger.debug(JSON.stringify(respList));
+  logger.debug("=====end======");
+  return respList;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/config.js.html new file mode 100644 index 00000000000..5215a95acfc --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/config.js.html @@ -0,0 +1,335 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/snapchat_conversion/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/snapchat_conversion config.js

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 7/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +861x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ENDPOINT = "https://tr.snapchat.com/v2/conversion";
+const MAX_BATCH_SIZE = 2000;
+ 
+const ConfigCategory = {
+  COMMON: { name: "SnapchatCommonConfig" },
+  /* E-Commerce Events */
+  // Ref - https://www.rudderstack.com/docs/rudderstack-api/api-specification/rudderstack-ecommerce-events-specification/
+  /* Browsing Section */
+  PRODUCTS_SEARCHED: { name: "ProductsSearchedConfig" },
+  PRODUCT_LIST_VIEWED: { name: "ProductListViewedConfig" },
+ 
+  /* Promotions Section */
+  PROMOTION_VIEWED: { name: "PromotionViewedConfig" },
+  PROMOTION_CLICKED: { name: "PromotionClickedConfig" },
+ 
+  /* Ordering Section */
+  PRODUCT_VIEWED: { name: "ProductViewedConfig" },
+  PRODUCT_ADDED: { name: "ProductAddedConfig" },
+  CHECKOUT_STARTED: { name: "CheckoutStartedConfig" },
+  PAYMENT_INFO_ENTERED: { name: "PaymentInfoEnteredConfig" },
+  ORDER_COMPLETED: { name: "OrderCompletedConfig" },
+ 
+  /* Wishlist Section */
+  PRODUCT_ADDED_TO_WISHLIST: { name: "ProductAddedToWishlistConfig" },
+ 
+  /* Snapchat General Events */
+  SIGN_UP: { name: "SignupConfig" }
+};
+ 
+const eventNameMapping = {
+  /* E-Commerce Events */
+  /* Browsing Section */
+  products_searched: "SEARCH",
+  product_list_viewed: "VIEW_CONTENT",
+ 
+  /* Promotions Section */
+  promotion_viewed: "AD_VIEW",
+  promotion_clicked: "AD_CLICK",
+ 
+  /* Ordering Section */
+  product_viewed: "VIEW_CONTENT",
+  product_added: "ADD_CART",
+  checkout_started: "START_CHECKOUT",
+  payment_info_entered: "ADD_BILLING",
+  order_completed: "PURCHASE",
+ 
+  /* Wishlist Section */
+  product_added_to_wishlist: "ADD_TO_WISHLIST",
+ 
+  sign_up: "SIGN_UP",
+  app_open: "APP_OPEN",
+  save: "SAVE",
+  subscribe: "SUBSCRIBE",
+  complete_tutorial: "COMPLETE_TUTORIAL",
+  invite: "INVITE",
+  login: "LOGIN",
+  share: "SHARE",
+  reserve: "RESERVE",
+  achievement_unlocked: "ACHIEVEMENT_UNLOCKED",
+  spent_credits: "SPENT_CREDITS",
+  rate: "RATE",
+  start_trial: "START_TRIAL",
+  list_view: "LIST_VIEW",
+  page_view: "PAGE_VIEW",
+  app_install: "APP_INSTALL",
+ 
+  custom_event_1: "CUSTOM_EVENT_1",
+  custom_event_2: "CUSTOM_EVENT_2",
+  custom_event_3: "CUSTOM_EVENT_3",
+  custom_event_4: "CUSTOM_EVENT_4",
+  custom_event_5: "CUSTOM_EVENT_5"
+};
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+module.exports = {
+  ENDPOINT,
+  ConfigCategory,
+  eventNameMapping,
+  mappingConfig,
+  trackCommonConfig: mappingConfig[ConfigCategory.COMMON.name],
+  MAX_BATCH_SIZE
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/index.html new file mode 100644 index 00000000000..3b38a44cd45 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/snapchat_conversion + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/snapchat_conversion

+
+ +
+ 88.58% + Statements + 194/219 +
+ + +
+ 68.07% + Branches + 81/119 +
+ + +
+ 100% + Functions + 16/16 +
+ + +
+ 88.53% + Lines + 193/218 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%7/7100%0/0100%0/0100%7/7
transform.js +
+
90.97%141/15571.08%59/83100%8/890.97%141/155
util.js +
+
80.7%46/5761.11%22/36100%8/880.36%45/56
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/transform.js.html new file mode 100644 index 00000000000..9d09b2acb39 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/transform.js.html @@ -0,0 +1,1301 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/snapchat_conversion/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/snapchat_conversion transform.js

+
+ +
+ 90.97% + Statements + 141/155 +
+ + +
+ 71.08% + Branches + 59/83 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 90.97% + Lines + 141/155 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +4081x +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +26x +26x +1x +  +25x +  +25x +25x +25x +25x +  +  +  +13x +  +  +  +12x +  +  +25x +  +  +  +1x +  +  +  +  +  +24x +2x +1x +  +1x +  +  +  +  +  +22x +  +  +  +22x +  +  +7x +  +  +  +7x +7x +  +1x +  +  +  +1x +1x +1x +1x +  +  +1x +  +  +  +1x +1x +  +1x +  +  +  +1x +1x +  +  +4x +  +  +  +4x +4x +  +1x +  +  +  +1x +1x +1x +1x +  +1x +  +  +  +1x +1x +  +2x +  +  +  +2x +2x +2x +2x +  +1x +  +  +  +1x +1x +  +  +1x +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +2x +  +  +  +2x +2x +  +  +  +  +  +  +  +  +22x +1x +  +  +22x +  +  +  +  +  +22x +  +  +  +  +22x +22x +  +  +22x +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +22x +22x +22x +22x +22x +  +22x +22x +  +  +  +  +  +  +22x +22x +22x +  +  +  +  +22x +22x +3x +3x +  +22x +7x +7x +  +22x +12x +  +  +22x +  +  +22x +22x +22x +  +  +  +22x +22x +22x +  +  +  +27x +  +27x +  +  +  +  +  +  +27x +  +27x +  +26x +22x +  +1x +  +22x +  +  +  +1x +  +  +1x +1x +1x +  +  +  +1x +1x +  +1x +  +  +1x +3x +3x +  +  +1x +  +  +  +1x +1x +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +3x +  +  +1x +1x +  +  +  +  +1x +1x +1x +1x +  +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +3x +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +1x +  +  +1x + 
const get = require("get-value");
+const { logger } = require("handlebars");
+const { stringify } = require("uuid");
+const moment = require("moment");
+const { EventType } = require("../../../constants");
+ 
+const {
+  defaultPostRequestConfig,
+  constructPayload,
+  defaultRequestConfig,
+  removeUndefinedAndNullValues,
+  getFieldValueFromMessage,
+  defaultBatchRequestConfig,
+  getErrorRespEvents,
+  getSuccessRespEvents,
+  CustomError
+} = require("../../util");
+const {
+  ENDPOINT,
+  eventNameMapping,
+  mappingConfig,
+  ConfigCategory,
+  MAX_BATCH_SIZE
+} = require("./config");
+const {
+  msUnixTimestamp,
+  getHashedValue,
+  getItemIds,
+  getPriceSum,
+  getDataUseValue,
+  getNormalizedPhoneNumber,
+  channelMapping
+} = require("./util");
+ 
+function trackResponseBuilder(message, { Config }) {
+  let event = get(message, "event");
+  if (!event) {
+    throw new CustomError("[Snapchat] :: Event name is required", 400);
+  }
+  event = event.trim().replace(/\s+/g, "_");
+ 
+  const { apiKey, pixelId, snapAppId, appId } = Config;
+  let channel = get(message, "channel");
+  let eventConversionType = message?.properties?.eventConversionType;
+  if (
+    channelMapping[eventConversionType?.toLowerCase()] ||
+    channelMapping[channel?.toLowerCase()]
+  ) {
+    eventConversionType = eventConversionType
+      ? channelMapping[eventConversionType?.toLowerCase()]
+      : channelMapping[channel?.toLowerCase()];
+  } else {
+    eventConversionType = "OFFLINE";
+  }
+ 
+  if (
+    (eventConversionType === "WEB" || eventConversionType === "OFFLINE") &&
+    !pixelId
+  ) {
+    throw new CustomError(
+      "[Snapchat] :: Pixel Id is required for web and offline events",
+      400
+    );
+  }
+ 
+  if (eventConversionType === "MOBILE_APP" && !(appId && snapAppId)) {
+    if (!appId) {
+      throw new CustomError("[Snapchat] :: App Id is required for app events");
+    } else {
+      throw new CustomError(
+        "[Snapchat] :: Snap App Id is required for app events"
+      );
+    }
+  }
+ 
+  Eif (eventNameMapping[event.toLowerCase()]) {
+    // Snapchat standard events
+    // get event specific parameters
+ 
+    switch (event.toLowerCase()) {
+      /* Browsing Section */
+      case "products_searched":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCTS_SEARCHED.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        break;
+      case "product_list_viewed":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_LIST_VIEWED.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        payload.item_ids = getItemIds(message);
+        payload.price = getPriceSum(message);
+        break;
+      /* Promotions Section */
+      case "promotion_viewed":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PROMOTION_VIEWED.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        break;
+      case "promotion_clicked":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PROMOTION_CLICKED.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        break;
+      /* Ordering Section */
+      case "product_viewed":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_VIEWED.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        break;
+      case "checkout_started":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.CHECKOUT_STARTED.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        payload.item_ids = getItemIds(message);
+        payload.price = getPriceSum(message);
+        break;
+      case "payment_info_entered":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PAYMENT_INFO_ENTERED.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        break;
+      case "order_completed":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.ORDER_COMPLETED.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        payload.item_ids = getItemIds(message);
+        payload.price = getPriceSum(message);
+        break;
+      case "product_added":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_ADDED.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        break;
+      /* Wishlist Section */
+      case "product_added_to_wishlist":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.PRODUCT_ADDED_TO_WISHLIST.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        break;
+      /* Snapchat General Events */
+      case "sign_up":
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.SIGN_UP.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        break;
+      default:
+        payload = constructPayload(
+          message,
+          mappingConfig[ConfigCategory.COMMON.name]
+        );
+        payload.event_type = eventNameMapping[event.toLowerCase()];
+        break;
+    }
+  } else {
+    throw new CustomError(
+      `Event ${event} doesn't match with Snapchat Events!`,
+      400
+    );
+  }
+ 
+  if (get(message, "properties.event_tag")) {
+    payload.event_tag = message.properties.event_tag;
+  }
+ 
+  payload.hashed_email = getHashedValue(
+    message?.context?.traits?.email
+      ?.trim()
+      ?.toString()
+      ?.toLowerCase()
+  );
+  payload.hashed_phone_number = getHashedValue(
+    getNormalizedPhoneNumber(message)
+      ?.toString()
+      ?.toLowerCase()
+  );
+  payload.user_agent = message?.context?.userAgent?.toString()?.toLowerCase();
+  payload.hashed_ip_address = getHashedValue(
+    message?.context?.ip?.toString()?.toLowerCase()
+  );
+  (hashed_mobile_ad_id = getHashedValue(
+    message?.context?.idfa?.toString()?.toLowerCase()
+  )),
+    (hashed_idfv = getHashedValue(
+      message?.context?.idfv?.toString()?.toLowerCase()
+    ));
+ 
+  Iif (
+    !payload.hashed_email &&
+    !payload.hashed_phone_number &&
+    !payload.hashed_mobile_ad_id &&
+    !(payload.hashed_ip_address && payload.user_agent)
+  ) {
+    throw new CustomError(
+      "At least one of email or phone or idfa or ip and userAgent is required",
+      400
+    );
+  }
+  payload.timestamp = getFieldValueFromMessage(message, "timestamp");
+  const timeStamp = payload.timestamp;
+  Eif (timeStamp) {
+    const start = moment.unix(moment(timeStamp).format("X"));
+    const current = moment.unix(moment().format("X"));
+    // calculates past event in days
+    const deltaDay = Math.ceil(moment.duration(current.diff(start)).asDays());
+    Iif (deltaDay > 28) {
+      throw new CustomError(
+        "[snapchat_conversion]: Events must be sent within 28 days of their occurrence.",
+        400
+      );
+    }
+  }
+  payload.data_use = getDataUseValue(message);
+  Eif (timeStamp) {
+    payload.timestamp = msUnixTimestamp(payload.timestamp)
+      ?.toString()
+      ?.slice(0, 10);
+  }
+ 
+  payload.event_conversion_type = eventConversionType;
+  if (eventConversionType === "WEB") {
+    payload.pixel_id = pixelId;
+    payload.page_url = getFieldValueFromMessage(message, "pageUrl");
+  }
+  if (eventConversionType === "MOBILE_APP") {
+    payload.snap_app_id = snapAppId;
+    payload.app_id = appId;
+  }
+  if (eventConversionType === "OFFLINE") {
+    payload.pixel_id = pixelId;
+  }
+ 
+  payload = removeUndefinedAndNullValues(payload);
+ 
+  // build response
+  const response = defaultRequestConfig();
+  response.endpoint = ENDPOINT;
+  response.headers = {
+    Authorization: `Bearer ${apiKey}`,
+    "Content-Type": "application/json"
+  };
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  return response;
+}
+ 
+function process(event) {
+  const { message, destination } = event;
+ 
+  Iif (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  const messageType = message.type.toLowerCase();
+  let response;
+  switch (messageType) {
+    case EventType.TRACK:
+      response = trackResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`Message type ${messageType} not supported`, 400);
+  }
+  return response;
+}
+ 
+function batchEvents(arrayChunks) {
+  const batchedResponseList = [];
+ 
+  // list of chunks [ [..], [..] ]
+  arrayChunks.forEach(chunk => {
+    const batchResponseList = [];
+    const metadata = [];
+ 
+    // extracting destination
+    // from the first event in a batch
+    const { destination } = chunk[0];
+    const { apiKey } = destination.Config;
+ 
+    let batchEventResponse = defaultBatchRequestConfig();
+ 
+    // Batch event into dest batch structure
+    chunk.forEach(ev => {
+      batchResponseList.push(ev.message.body.JSON);
+      metadata.push(ev.metadata);
+    });
+ 
+    batchEventResponse.batchedRequest.body.JSON_ARRAY = {
+      batch: JSON.stringify(batchResponseList)
+    };
+ 
+    batchEventResponse.batchedRequest.endpoint = ENDPOINT;
+    batchEventResponse.batchedRequest.headers = {
+      "Content-Type": "application/json",
+      Authorization: `Bearer ${apiKey}`
+    };
+    batchEventResponse = {
+      ...batchEventResponse,
+      metadata,
+      destination
+    };
+    batchedResponseList.push(
+      getSuccessRespEvents(
+        batchEventResponse.batchedRequest,
+        batchEventResponse.metadata,
+        batchEventResponse.destination,
+        true
+      )
+    );
+  });
+ 
+  return batchedResponseList;
+}
+ 
+function getEventChunks(event, eventsChunk) {
+  // build eventsChunk of MAX_BATCH_SIZE
+  eventsChunk.push(event);
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  let eventsChunk = []; // temporary variable to divide payload into chunks
+  const arrayChunks = []; // transformed payload of (2000) batch size
+  const errorRespList = [];
+  await Promise.all(
+    inputs.map(async (event, index) => {
+      try {
+        Iif (event.message.statusCode) {
+          // already transformed event
+          getEventChunks(event, eventsChunk);
+          // slice according to batch size
+          if (
+            eventsChunk.length &&
+            (eventsChunk.length >= MAX_BATCH_SIZE ||
+              index === inputs.length - 1)
+          ) {
+            arrayChunks.push(eventsChunk);
+            eventsChunk = [];
+          }
+        } else {
+          // if not transformed
+          getEventChunks(
+            {
+              message: await process(event),
+              metadata: event.metadata,
+              destination: event.destination
+            },
+            eventsChunk
+          );
+          // slice according to batch size
+          if (
+            eventsChunk.length &&
+            (eventsChunk.length >= MAX_BATCH_SIZE ||
+              index === inputs.length - 1)
+          ) {
+            arrayChunks.push(eventsChunk);
+            eventsChunk = [];
+          }
+        }
+      } catch (error) {
+        errorRespList.push(
+          getErrorRespEvents(
+            [event.metadata],
+            error.response ? error.response.status : 400,
+            error.message || "Error occurred while processing payload."
+          )
+        );
+      }
+    })
+  );
+ 
+  let batchedResponseList = [];
+  Eif (arrayChunks.length) {
+    batchedResponseList = batchEvents(arrayChunks);
+  }
+  return [...batchedResponseList, ...errorRespList];
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/util.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/util.js.html new file mode 100644 index 00000000000..e5f4a78f384 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/snapchat_conversion/util.js.html @@ -0,0 +1,404 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/snapchat_conversion/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/snapchat_conversion util.js

+
+ +
+ 80.7% + Statements + 46/57 +
+ + +
+ 61.11% + Branches + 22/36 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 80.36% + Lines + 45/56 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +1091x +1x +1x +  +1x +  +1x +  +  +  +  +  +  +  +22x +22x +  +  +  +110x +44x +44x +44x +  +  +  +  +  +22x +22x +22x +  +  +22x +22x +22x +264x +66x +66x +198x +  +  +  +198x +  +  +22x +  +  +  +  +22x +  +22x +22x +22x +  +  +  +  +22x +  +  +  +  +  +  +4x +4x +4x +4x +8x +8x +8x +  +  +  +  +  +  +  +4x +  +  +4x +4x +4x +4x +8x +8x +8x +  +  +  +  +  +4x +  +  +1x +  +  +  +  +  +  +  +  + 
const get = require("get-value");
+const sha256 = require("sha256");
+const { logger } = require("handlebars");
+ 
+const { isDefinedAndNotNull } = require("../../util");
+ 
+const channelMapping = {
+  web: "WEB",
+  mobile: "MOBILE_APP",
+  mobile_app: "MOBILE_APP",
+  offline: "OFFLINE"
+};
+ 
+function msUnixTimestamp(timestamp) {
+  const time = new Date(timestamp);
+  return time.getTime() * 1000 + time.getMilliseconds();
+}
+ 
+function getHashedValue(identifier) {
+  if (identifier) {
+    const regexExp = /^[a-f0-9]{64}$/gi;
+    Eif (!regexExp.test(identifier)) {
+      return sha256(identifier);
+    }
+    return identifier;
+  }
+}
+function getNormalizedPhoneNumber(message) {
+  const regexExp = /^[a-f0-9]{64}$/gi;
+  let phoneNumber = message?.context?.traits?.phone?.toString();
+  Iif (regexExp.test(phoneNumber)) {
+    return phoneNumber;
+  }
+  let leadingZero = true;
+  Eif (phoneNumber) {
+    for (let i = 0; i < phoneNumber.length; i += 1) {
+      if (Number.isNaN(parseInt(phoneNumber[i], 10))) {
+        phoneNumber = phoneNumber.replace(phoneNumber[i], "");
+        i--;
+      } else Iif (phoneNumber[i] === "0" && leadingZero) {
+        phoneNumber = phoneNumber.replace(phoneNumber[i], "");
+        i--;
+      } else {
+        leadingZero = false;
+      }
+    }
+    return phoneNumber;
+  }
+}
+ 
+function getDataUseValue(message) {
+  const att = get(message, "context.device.attTrackingStatus");
+  let limitAdTracking;
+  Eif (isDefinedAndNotNull(att)) {
+    Eif (att === 3) {
+      limitAdTracking = false;
+    } else if (att === 2) {
+      limitAdTracking = true;
+    }
+  }
+  Iif (limitAdTracking) {
+    limitAdTracking = "['lmu']";
+    return limitAdTracking;
+  }
+}
+ 
+function getItemIds(message) {
+  let itemIds = [];
+  const products = get(message, "properties.products");
+  Eif (products && Array.isArray(products)) {
+    products.forEach((element, index) => {
+      const pId = element.product_id;
+      Eif (pId) {
+        itemIds.push(pId);
+      } else {
+        logger.debug(`product_id not present for product at index ${index}`);
+      }
+    });
+  } else {
+    itemIds = null;
+  }
+  return itemIds;
+}
+function getPriceSum(message) {
+  let priceSum = 0;
+  const products = get(message, "properties.products");
+  Eif (products && Array.isArray(products)) {
+    products.forEach(element => {
+      const pPrice = element.price;
+      Eif (pPrice && !Number.isNaN(parseFloat(pPrice))) {
+        priceSum += parseFloat(pPrice);
+      }
+    });
+  } else {
+    priceSum = null;
+  }
+  return String(priceSum);
+}
+ 
+module.exports = {
+  msUnixTimestamp,
+  getItemIds,
+  getPriceSum,
+  getDataUseValue,
+  getNormalizedPhoneNumber,
+  getHashedValue,
+  channelMapping
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/snowflake/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/snowflake/index.html new file mode 100644 index 00000000000..51457acf896 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/snowflake/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/snowflake + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/snowflake

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 87.5% + Branches + 7/8 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%12/1287.5%7/8100%3/3100%12/12
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/snowflake/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/snowflake/transform.js.html new file mode 100644 index 00000000000..d96ed99a098 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/snowflake/transform.js.html @@ -0,0 +1,185 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/snowflake/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/snowflake transform.js

+
+ +
+ 100% + Statements + 12/12 +
+ + +
+ 87.5% + Branches + 7/8 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 12/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +363x +  +3x +  +  +124x +  +  +  +2917x +1x +  +2916x +  +  +  +124x +124x +124x +124x +124x +  +  +  +  +  +  +  +  +  +  +3x +  +  +  + 
const { processWarehouseMessage } = require("../../../warehouse");
+ 
+const snowflake = "snowflake";
+ 
+function processSingleMessage(message, options) {
+  return processWarehouseMessage(message, options);
+}
+ 
+function getDataTypeOverride(key, val, options) {
+  if (key === "violationErrors") {
+    return "json";
+  }
+  return "string";
+}
+ 
+function process(event) {
+  const whSchemaVersion = event.request.query.whSchemaVersion || "v1";
+  const whIDResolve = event.request.query.whIDResolve === "true" || false;
+  const whStoreEvent = event.destination.Config.storeFullEvent === true;
+  const provider = snowflake;
+  return processSingleMessage(event.message, {
+    metadata: event.metadata,
+    whSchemaVersion,
+    whStoreEvent,
+    whIDResolve,
+    getDataTypeOverride,
+    provider,
+    sourceCategory: event.metadata ? event.metadata.sourceCategory : null
+  });
+}
+ 
+module.exports = {
+  process,
+  getDataTypeOverride
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/tiktok_ads/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/tiktok_ads/config.js.html new file mode 100644 index 00000000000..f8f5eb53918 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/tiktok_ads/config.js.html @@ -0,0 +1,203 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/tiktok_ads/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/tiktok_ads config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +421x +  +  +1x +  +1x +1x +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const TRACK_ENDPOINT =
+  "https://business-api.tiktok.com/open_api/v1.2/pixel/track/";
+const BATCH_ENDPOINT =
+  "https://business-api.tiktok.com/open_api/v1.2/pixel/batch/";
+const MAX_BATCH_SIZE = 50;
+ 
+const ConfigCategory = {
+  TRACK: {
+    type: "track",
+    name: "TikTokTrack"
+  }
+};
+ 
+const eventNameMapping = {
+  "product added to wishlist": "AddToWishlist",
+  "product added": "AddToCart",
+  "checkout started": "InitiateCheckout",
+  "payment info entered": "AddPaymentInfo",
+  "checkout step completed": "CompletePayment",
+  "order completed": "PlaceAnOrder",
+  viewcontent: "ViewContent",
+  clickbuttom: "ClickButton",
+  search: "Search",
+  contact: "Contact",
+  download: "Download",
+  submitform: "SubmitForm",
+  completeregistration: "CompleteRegistration",
+  subscribe: "Subscribe"
+};
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+module.exports = {
+  TRACK_ENDPOINT,
+  BATCH_ENDPOINT,
+  MAX_BATCH_SIZE,
+  trackMapping: mappingConfig[ConfigCategory.TRACK.name],
+  eventNameMapping
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/tiktok_ads/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/tiktok_ads/index.html new file mode 100644 index 00000000000..134fde248ac --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/tiktok_ads/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/tiktok_ads + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/tiktok_ads

+
+ +
+ 92.86% + Statements + 117/126 +
+ + +
+ 68.97% + Branches + 40/58 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 92.86% + Lines + 117/126 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%0/0100%8/8
transform.js +
+
92.37%109/11868.97%40/58100%9/992.37%109/118
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/tiktok_ads/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/tiktok_ads/transform.js.html new file mode 100644 index 00000000000..05aea58bcc4 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/tiktok_ads/transform.js.html @@ -0,0 +1,965 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/tiktok_ads/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/tiktok_ads transform.js

+
+ +
+ 92.37% + Statements + 109/118 +
+ + +
+ 68.97% + Branches + 40/58 +
+ + +
+ 100% + Functions + 9/9 +
+ + +
+ 92.37% + Lines + 109/118 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296  +1x +1x +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +4x +  +4x +  +  +1x +23x +  +23x +23x +23x +1x +  +  +22x +1x +  +21x +  +21x +  +21x +21x +21x +  +  +21x +  +  +21x +21x +1x +  +  +21x +21x +1x +  +  +21x +  +  +  +  +  +21x +4x +4x +4x +  +  +4x +4x +4x +  +  +  +  +4x +4x +4x +3x +  +  +  +1x +  +  +  +  +  +  +  +20x +20x +  +  +  +  +20x +20x +20x +20x +  +  +1x +25x +  +25x +  +  +  +25x +  +  +  +25x +1x +  +  +  +  +  +24x +  +  +24x +  +23x +20x +  +1x +  +20x +  +  +  +1x +  +  +1x +1x +1x +  +  +  +1x +1x +  +1x +  +  +1x +  +4x +4x +4x +4x +  +  +1x +  +  +  +  +1x +1x +  +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +5x +1x +1x +1x +  +1x +1x +1x +1x +1x +1x +  +1x +1x +  +1x +  +  +  +  +  +  +  +  +4x +  +  +  +1x +1x +  +  +  +  +1x +1x +1x +1x +1x +  +5x +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +  +  +  +  +  +5x +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +1x +  +1x +  +  +1x + 
/* eslint-disable camelcase */
+const { SHA256 } = require("crypto-js");
+const get = require("get-value");
+const set = require("set-value");
+const { EventType } = require("../../../constants");
+const {
+  getErrorRespEvents,
+  CustomError,
+  constructPayload,
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  removeUndefinedAndNullValues,
+  defaultBatchRequestConfig,
+  getSuccessRespEvents,
+  isDefinedAndNotNullAndNotEmpty,
+  getDestinationExternalID,
+  getFieldValueFromMessage
+} = require("../../util");
+const {
+  trackMapping,
+  TRACK_ENDPOINT,
+  BATCH_ENDPOINT,
+  eventNameMapping,
+  MAX_BATCH_SIZE
+} = require("./config");
+ 
+function checkIfValidPhoneNumber(str) {
+  // Ref - https://ads.tiktok.com/marketing_api/docs?id=1701890979375106
+  // Regular expression to check whether it has country code
+  // but should not include +86
+  const regexExp = /^(\+(?!86)\d{1,3}){0,1}[0-9]{10}$/gi;
+ 
+  return regexExp.test(str);
+}
+ 
+const trackResponseBuilder = async (message, { Config }) => {
+  const pixel_code = Config.pixelCode;
+ 
+  let event = get(message, "event");
+  event = event ? event.trim().toLowerCase() : event;
+  if (!event) {
+    throw new CustomError("Event name is required", 400);
+  }
+ 
+  if (eventNameMapping[event] === undefined) {
+    throw new CustomError(`Event name (${event}) is not valid`, 400);
+  }
+  event = eventNameMapping[event];
+ 
+  let payload = constructPayload(message, trackMapping);
+ 
+  const externalId = getDestinationExternalID(message, "tiktokExternalId");
+  Eif (isDefinedAndNotNullAndNotEmpty(externalId)) {
+    set(payload, "context.user.external_id", externalId);
+  }
+ 
+  const traits = getFieldValueFromMessage(message, "traits");
+ 
+  // taking user properties like email and phone from traits
+  let email = get(payload, "context.user.email");
+  if (!isDefinedAndNotNullAndNotEmpty(email) && traits?.email) {
+    set(payload, "context.user.email", traits.email);
+  }
+ 
+  let phone_number = get(payload, "context.user.phone_number");
+  if (!isDefinedAndNotNullAndNotEmpty(phone_number) && traits?.phone) {
+    set(payload, "context.user.phone_number", traits.phone);
+  }
+ 
+  payload = { pixel_code, event, ...payload };
+ 
+  /*
+   * Hashing user related detail i.e external_id, email, phone_number
+   */
+ 
+  if (Config.hashUserProperties) {
+    const external_id = get(payload, "context.user.external_id");
+    Eif (isDefinedAndNotNullAndNotEmpty(external_id)) {
+      payload.context.user.external_id = SHA256(external_id.trim()).toString();
+    }
+ 
+    email = get(payload, "context.user.email");
+    Eif (isDefinedAndNotNullAndNotEmpty(email)) {
+      payload.context.user.email = SHA256(
+        email.trim().toLowerCase()
+      ).toString();
+    }
+ 
+    phone_number = get(payload, "context.user.phone_number");
+    Eif (isDefinedAndNotNullAndNotEmpty(phone_number)) {
+      if (checkIfValidPhoneNumber(phone_number.trim())) {
+        payload.context.user.phone_number = SHA256(
+          phone_number.trim()
+        ).toString();
+      } else {
+        throw new CustomError(
+          "Invalid phone number. Include proper country code except +86. Aborting ",
+          400
+        );
+      }
+    }
+  }
+ 
+  const response = defaultRequestConfig();
+  response.headers = {
+    "Access-Token": Config.accessToken,
+    "Content-Type": "application/json"
+  };
+ 
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.endpoint = TRACK_ENDPOINT;
+  response.body.JSON = removeUndefinedAndNullValues(payload);
+  return response;
+};
+ 
+const process = async event => {
+  const { message, destination } = event;
+ 
+  Iif (!destination.Config.accessToken) {
+    throw new CustomError("Access Token not found. Aborting ", 400);
+  }
+ 
+  Iif (!destination.Config.pixelCode) {
+    throw new CustomError("Pixel Code not found. Aborting", 400);
+  }
+ 
+  if (!message.type) {
+    throw new CustomError(
+      "Message Type is not present. Aborting message.",
+      400
+    );
+  }
+ 
+  const messageType = message.type.toLowerCase();
+ 
+  let response;
+  switch (messageType) {
+    case EventType.TRACK:
+      response = await trackResponseBuilder(message, destination);
+      break;
+    default:
+      throw new CustomError(`Message type ${messageType} not supported`, 400);
+  }
+  return response;
+};
+ 
+function batchEvents(arrayChunks) {
+  const batchedResponseList = [];
+ 
+  // list of chunks [ [..], [..] ]
+  arrayChunks.forEach(chunk => {
+    const batchResponseList = [];
+    const metadata = [];
+ 
+    // extracting destination
+    // from the first event in a batch
+    const { destination } = chunk[0];
+    const { accessToken, pixelCode } = destination.Config;
+ 
+    let batchEventResponse = defaultBatchRequestConfig();
+ 
+    // Batch event into dest batch structure
+    chunk.forEach(ev => {
+      // Pixel code must be added above "batch": [..]
+      delete ev.message.body.JSON.pixel_code;
+      ev.message.body.JSON.type = "track";
+      batchResponseList.push(ev.message.body.JSON);
+      metadata.push(ev.metadata);
+    });
+ 
+    batchEventResponse.batchedRequest.body.JSON = {
+      pixel_code: pixelCode,
+      batch: batchResponseList
+    };
+ 
+    batchEventResponse.batchedRequest.endpoint = BATCH_ENDPOINT;
+    batchEventResponse.batchedRequest.headers = {
+      "Access-Token": accessToken,
+      "Content-Type": "application/json"
+    };
+    batchEventResponse = {
+      ...batchEventResponse,
+      metadata,
+      destination
+    };
+    batchedResponseList.push(
+      getSuccessRespEvents(
+        batchEventResponse.batchedRequest,
+        batchEventResponse.metadata,
+        batchEventResponse.destination,
+        true
+      )
+    );
+  });
+ 
+  return batchedResponseList;
+}
+ 
+function getEventChunks(event, trackResponseList, eventsChunk) {
+  // Do not apply batching if the payload contains test_event_code
+  // which corresponds to track endpoint
+  if (event.message.body.JSON.test_event_code) {
+    const { message, metadata, destination } = event;
+    const endpoint = get(message, "endpoint");
+    delete message.body.JSON.type;
+ 
+    const batchedResponse = defaultBatchRequestConfig();
+    batchedResponse.batchedRequest.headers = message.headers;
+    batchedResponse.batchedRequest.endpoint = endpoint;
+    batchedResponse.batchedRequest.body = message.body;
+    batchedResponse.batchedRequest.params = message.params;
+    batchedResponse.batchedRequest.method =
+      defaultPostRequestConfig.requestMethod;
+    batchedResponse.metadata = [metadata];
+    batchedResponse.destination = destination;
+ 
+    trackResponseList.push(
+      getSuccessRespEvents(
+        batchedResponse.batchedRequest,
+        batchedResponse.metadata,
+        batchedResponse.destination
+      )
+    );
+  } else {
+    // build eventsChunk of MAX_BATCH_SIZE
+    eventsChunk.push(event);
+  }
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const trackResponseList = []; // list containing single track event in batched format
+  let eventsChunk = []; // temporary variable to divide payload into chunks
+  const arrayChunks = []; // transformed payload of (n) batch size
+  const errorRespList = [];
+  await Promise.all(
+    inputs.map(async (event, index) => {
+      try {
+        Iif (event.message.statusCode) {
+          // already transformed event
+          getEventChunks(event, trackResponseList, eventsChunk);
+          // slice according to batch size
+          if (
+            eventsChunk.length &&
+            (eventsChunk.length >= MAX_BATCH_SIZE ||
+              index === inputs.length - 1)
+          ) {
+            arrayChunks.push(eventsChunk);
+            eventsChunk = [];
+          }
+        } else {
+          // if not transformed
+          getEventChunks(
+            {
+              message: await process(event),
+              metadata: event.metadata,
+              destination: event.destination
+            },
+            trackResponseList,
+            eventsChunk
+          );
+          // slice according to batch size
+          if (
+            eventsChunk.length &&
+            (eventsChunk.length >= MAX_BATCH_SIZE ||
+              index === inputs.length - 1)
+          ) {
+            arrayChunks.push(eventsChunk);
+            eventsChunk = [];
+          }
+        }
+      } catch (error) {
+        errorRespList.push(
+          getErrorRespEvents(
+            [event.metadata],
+            error.response ? error.response.status : 400,
+            error.message || "Error occurred while processing payload."
+          )
+        );
+      }
+    })
+  );
+ 
+  let batchedResponseList = [];
+  Eif (arrayChunks.length) {
+    batchedResponseList = await batchEvents(arrayChunks);
+  }
+  return [...batchedResponseList.concat(trackResponseList), ...errorRespList];
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/trengo/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/trengo/config.js.html new file mode 100644 index 00000000000..7a0a89fa3ee --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/trengo/config.js.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/trengo/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/trengo config.js

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +131x +  +1x +  +  +  +  +  +1x +  +  +  + 
const BASE_URL = "https://app.trengo.com/api/v2";
+ 
+const EndPoints = {
+  createTicket: `${BASE_URL}/tickets`,
+  createContact: `${BASE_URL}/channels/channel_id/contacts`,
+  updateContact: `${BASE_URL}/contacts/id`
+};
+ 
+module.exports = {
+  EndPoints,
+  BASE_URL
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/trengo/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/trengo/index.html new file mode 100644 index 00000000000..5eb9188a8a7 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/trengo/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/trengo + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/trengo

+
+ +
+ 87.7% + Statements + 107/122 +
+ + +
+ 74.47% + Branches + 70/94 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 87.7% + Lines + 107/122 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%3/3100%0/0100%0/0100%3/3
transform.js +
+
87.39%104/11974.47%70/94100%10/1087.39%104/119
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/trengo/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/trengo/transform.js.html new file mode 100644 index 00000000000..5f6617ed121 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/trengo/transform.js.html @@ -0,0 +1,1379 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/trengo/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/trengo transform.js

+
+ +
+ 87.39% + Statements + 104/119 +
+ + +
+ 74.47% + Branches + 70/94 +
+ + +
+ 100% + Functions + 10/10 +
+ + +
+ 87.39% + Lines + 104/119 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434  +  +1x +1x +1x +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +10x +10x +10x +10x +1x +  +  +  +  +  +9x +  +  +  +  +  +  +  +  +  +  +  +1x +4x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +15x +15x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +15x +  +  +  +  +  +  +13x +13x +2x +  +  +  +11x +8x +  +3x +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +11x +11x +  +  +  +  +  +  +11x +  +  +  +4x +  +  +  +  +4x +4x +  +  +  +  +  +  +  +  +7x +7x +  +7x +6x +  +2x +  +  +  +  +  +4x +3x +  +  +  +  +1x +  +  +1x +1x +  +  +  +  +  +5x +  +  +1x +  +10x +9x +9x +9x +8x +7x +  +  +  +  +  +  +7x +  +  +  +  +  +  +  +8x +  +7x +4x +4x +4x +  +  +  +  +4x +  +  +  +  +  +  +  +  +8x +  +  +  +  +8x +8x +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +18x +  +  +  +  +  +  +  +  +  +18x +18x +  +  +18x +  +  +  +18x +  +18x +  +  +  +8x +  +  +7x +  +  +  +  +  +  +4x +  +  +  +  +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +  +  +  +  +  +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +13x +13x +13x +  +13x +1x +  +12x +  +  +13x +  +  +  +  +13x +13x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +18x +  +  +18x +18x +  +  +18x +13x +  +  +1x +18x +13x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
/* eslint-disable no-nested-ternary */
+/* eslint-disable no-prototype-builtins */
+const Handlebars = require("handlebars");
+const axios = require("axios");
+const get = require("get-value");
+const { EventType } = require("../../../constants");
+const { EndPoints, BASE_URL } = require("./config");
+const {
+  getHashFromArray,
+  removeUndefinedAndNullValues
+} = require("../../util");
+const {
+  defaultRequestConfig,
+  defaultPostRequestConfig,
+  defaultPutRequestConfig,
+  getFieldValueFromMessage,
+  getDestinationExternalID,
+  getSuccessRespEvents,
+  getStringValueOfJSON,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+ 
+/**
+ *
+ * @param {*} message
+ * @param {*} destination
+ *
+ * This func returns specific template based on event that is
+ * sent (Track calls). If the event is not listed in the keys of the mapping
+ * we will not process the event. In order to process specific events
+ * it needs to be present in the mapping keys.
+ */
+const getTemplate = (message, destination) => {
+  const { event } = message;
+  const { eventTemplateMap } = destination.Config;
+  const hashMap = getHashFromArray(eventTemplateMap, "from", "to", false);
+  if (!Object.keys(hashMap).includes(event)) {
+    throw new CustomError(
+      `[Trengo] :: ${event} is not present in Event-Map template keys, aborting event`,
+      400
+    );
+  }
+ 
+  return message.event ? hashMap[message.event] : null;
+};
+ 
+/**
+ *
+ * @param {*} email
+ * @param {*} phone
+ * @param {*} channelIdentifier
+ * Based on type of channelIdentifier selected from destination dashboard
+ * we check the presence of required property which is email or phone either
+ * has to be present based on destination settings.
+ */
+const validate = (email, phone, channelIdentifier) => {
+  Iif (
+    (channelIdentifier === "phone" && !phone) ||
+    (channelIdentifier === "email" && !email)
+  ) {
+    throw new CustomError(
+      `[Trengo] :: Mandatory field for Channel-Identifier :${channelIdentifier} not present`,
+      400
+    );
+  }
+};
+ 
+/**
+ *
+ * @param {*} term
+ * @param {*} destination
+ *
+ * This function looks up contact details and returns the contactId if found.
+ * For duplicate contact found for a specific identifier it will return error
+ * (as this func is used for updating and lodging tickets for a contact) hence
+ * it will not work for duplicates.
+ *
+ * In case no contact is founf for a particular identifer it returns -1
+ */
+const lookupContact = async (term, destination) => {
+  let res;
+  try {
+    res = await axios.get(`${BASE_URL}/contacts?page=1&term=${term}`, {
+      headers: {
+        Authorization: `Bearer ${destination.Config.apiToken}`
+      }
+    });
+  } catch (err) {
+    // check if exists err.response && err.response.status else 500
+    if (err.response && err.response.status) {
+      throw new CustomError(err.response.statusText, err.response.status);
+    }
+    throw new CustomError(
+      "[Trengo] :: Inside lookupContact, failed to make request",
+      500
+    );
+  }
+  if (
+    res &&
+    res.status === 200 &&
+    res.data &&
+    res.data.data &&
+    Array.isArray(res.data.data)
+  ) {
+    const { data } = res.data;
+    if (data.length > 1) {
+      throw new CustomError(
+        `[Trengo] :: Inside lookupContact, duplicates present for identifer : ${term}`,
+        400
+      );
+    } else if (data.length === 1) {
+      return data[0].id;
+    }
+    return -1;
+  }
+  return null;
+};
+/**
+ *
+ * @param {*} message
+ * @param {*} destination
+ * @param {*} identifier
+ * @param {*} cretaeScope
+ *
+ * This function cretaes contact payload
+ * Based on create-scope flag it will either create payload
+ * for cretaing contact or for updating contact.
+ *
+ */
+const contactBuilderTrengo = async (
+  message,
+  destination,
+  identifier,
+  extIds,
+  createScope = true
+) => {
+  let result;
+ 
+  // External id will override the channelId
+  const externalId = get(extIds, "externalId");
+  const contactName = getFieldValueFromMessage(message, "name")
+    ? getFieldValueFromMessage(message, "name")
+    : `${getFieldValueFromMessage(
+        message,
+        "firstName"
+      )} ${getFieldValueFromMessage(message, "lastName")}`;
+ 
+  if (createScope) {
+    // In create scope we directly create the payload for creating new contact
+    // based on the info we have.
+ 
+    let payload = {
+      name: contactName,
+      identifier,
+      channel_id: externalId || destination.Config.channelId
+    };
+    payload = removeUndefinedAndNullValues(payload);
+    result = {
+      payload,
+      endpoint: `${BASE_URL}/channels/${externalId ||
+        destination.Config.channelId}/contacts`,
+      method: "POST"
+    };
+  } else {
+    // If we are in update scope we need to search the contact and get the contactId
+    // using the identifier (email/phone) we have.
+    let contactId = get(extIds, "contactId");
+    Eif (!contactId) {
+      // If we alrady dont have contactId in our message we do lookup
+      contactId = await lookupContact(identifier, destination);
+      if (!contactId) {
+        // In case contactId is returned null we throw error (This indicates and search API issue in trengo end)
+        throw new CustomError(
+          `[Trengo] :: LookupContact failed for term:${identifier} update failed, aborting as dedup option is enabled`,
+          400
+        );
+      }
+      // In case we did not find the contact for this identifier we return -1
+      if (contactId === -1) {
+        return -1;
+      }
+    }
+ 
+    // If we get contactId we update that contact with below payload
+    let payload = {
+      name: contactName
+    };
+    payload = removeUndefinedAndNullValues(payload);
+    result = {
+      payload,
+      endpoint: `${BASE_URL}/contacts/${contactId}`,
+      method: "PUT"
+    };
+  }
+  return result;
+};
+ 
+const ticketBuilderTrengo = async (message, destination, identifer, extIds) => {
+  let subjectLine;
+  const template = getTemplate(message, destination);
+  const externalId = get(extIds, "externalId");
+  let contactId = get(extIds, "contactId");
+  if (!contactId) {
+    contactId = await lookupContact(identifer, destination);
+    Iif (!contactId) {
+      throw new CustomError(
+        `[Trengo] :: LookupContact failed for term:${identifer} track event failed`,
+        400
+      );
+    }
+ 
+    Iif (contactId === -1) {
+      throw new CustomError(
+        `[Trengo] :: No contact found for term:${identifer} track event failed`,
+        400
+      );
+    }
+  }
+ 
+  if (destination.Config.channelIdentifier === "email") {
+    // check with keys
+    if (template && template.length > 0) {
+      try {
+        const hTemplate = Handlebars.compile(template.trim());
+        const templateInput = {
+          event: message.event,
+          properties: getStringValueOfJSON(message.properties),
+          ...message.properties
+        };
+        subjectLine = hTemplate(templateInput).trim();
+      } catch (err) {
+        throw new CustomError(
+          `[Trengo] :: Error occured in parsing event template for ${message.event}`,
+          400
+        );
+      }
+    }
+  }
+  let ticketPayload = {
+    contact_id: contactId,
+    channel_id: externalId || destination.Config.channelId,
+    subject: subjectLine
+  };
+  ticketPayload = removeUndefinedAndNullValues(ticketPayload);
+  const result = {
+    payload: ticketPayload,
+    endpoint: EndPoints.createTicket,
+    method: "POST"
+  };
+  return result;
+};
+ 
+/**
+ *
+ * @param {*} message
+ * @param {*} messageType
+ * @param {*} destination
+ *
+ * The core function responsible for building the payload for trengo,
+ * based on type of event and the destination configurations the
+ * payloads are generated.
+ */
+const responseBuilderSimple = async (message, messageType, destination) => {
+  let trengoPayload;
+  // ChannelId is a mandatory field if it is not present in destination config
+  // we will abort events.
+  Iif (
+    !destination.Config.channelId ||
+    destination.Config.channelId.length === 0
+  ) {
+    throw new CustomError(
+      "[Trengo] :: Cound not process event, missing mandatory field channelId",
+      400
+    );
+  }
+ 
+  const email = getFieldValueFromMessage(message, "email");
+  const phone = getFieldValueFromMessage(message, "phone");
+  // If externalId is present It will take preference over ChannelId
+  // If contactId is present we will not lookup for contactId
+  const extIds = {
+    externalId: getDestinationExternalID(message, "trengoChannelId"),
+    contactId: getDestinationExternalID(message, "trengoContactId")
+  };
+  const { channelIdentifier, enableDedup } = destination.Config;
+  // In case of Identify type of events we create contacts or update
+  if (messageType === EventType.IDENTIFY) {
+    // If deduplication is enabled
+    // we will first search the contact if unique contact is found
+    // we will update its name else if not found we will create new.
+    if (enableDedup) {
+      // Here we are searching the contact first then if present creating the update
+      // payload. If not found we return  -1.
+      trengoPayload = await contactBuilderTrengo(
+        message,
+        destination,
+        channelIdentifier === "email" ? email : phone,
+        extIds,
+        false
+      );
+      if (trengoPayload === -1) {
+        // If not found create new
+        // Destination behaviour
+        // -- For phone type contacts duplicates will be created
+        // -- For email type no duplicates will be created
+        validate(email, phone, channelIdentifier);
+        trengoPayload = await contactBuilderTrengo(
+          message,
+          destination,
+          channelIdentifier === "email" ? email : phone,
+          extIds,
+          true
+        );
+      }
+    } else {
+      // If deduplicaton is disabled we will always create new contacts.
+      // Destination behaviour
+      // -- For phone type contacts duplicates will be created
+      // -- For email type no duplicates will be created
+      validate(email, phone, channelIdentifier);
+      trengoPayload = await contactBuilderTrengo(
+        message,
+        destination,
+        channelIdentifier === "email" ? email : phone,
+        extIds,
+        true
+      );
+    }
+  } else {
+    // Here we create ticket payload, we take the identifier email/phone based on channel
+    // identifier. For track calls also we expect email/phone to be present in message
+    trengoPayload = await ticketBuilderTrengo(
+      message,
+      destination,
+      channelIdentifier === "email" ? email : phone,
+      extIds
+    );
+  }
+  // Wrapped payload with structure
+  // {
+  //  payload: { the paylaod.. },
+  //  endpoint: "endpoint.."
+  //  method: "POST"/"PUT"
+  // }
+  Eif (trengoPayload) {
+    const response = defaultRequestConfig();
+    response.endpoint = trengoPayload.endpoint;
+ 
+    if (trengoPayload.method === "PUT") {
+      response.method = defaultPutRequestConfig.requestMethod;
+    } else {
+      response.method = defaultPostRequestConfig.requestMethod;
+    }
+ 
+    response.headers = {
+      "Content-Type": "application/json",
+      Accept: "application/json",
+      Authorization: `Bearer ${destination.Config.apiToken}`
+    };
+    response.body.JSON = trengoPayload.payload;
+    return response;
+  }
+  // fail-safety for developer error
+  throw new CustomError("Payload could not be constructed", 400);
+};
+ 
+/**
+ *
+ * @param {*} message
+ * @param {*} destination
+ *
+ * Main process function responsible for processing events.
+ * If event type is not identify or track it will discard
+ * the event
+ */
+const processEvent = async (message, destination) => {
+  Iif (!message.type) {
+    throw CustomError("Message Type is not present. Aborting message.", 400);
+  }
+  const messageType = message.type.toLowerCase();
+  Iif (messageType !== EventType.IDENTIFY && messageType !== EventType.TRACK) {
+    throw new CustomError("Message type not supported", 400);
+  }
+  const resp = await responseBuilderSimple(message, messageType, destination);
+  return resp;
+};
+ 
+const process = async event => {
+  const response = await processEvent(event.message, event.destination);
+  return response;
+};
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/webhook/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/webhook/index.html new file mode 100644 index 00000000000..49b35abd21a --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/webhook/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/webhook + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/webhook

+
+ +
+ 87.93% + Statements + 51/58 +
+ + +
+ 65.22% + Branches + 30/46 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 87.93% + Lines + 51/58 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
87.93%51/5865.22%30/46100%5/587.93%51/58
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/webhook/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/webhook/transform.js.html new file mode 100644 index 00000000000..a5845e747d9 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/webhook/transform.js.html @@ -0,0 +1,587 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/webhook/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/webhook transform.js

+
+ +
+ 87.93% + Statements + 51/58 +
+ + +
+ 65.22% + Branches + 30/46 +
+ + +
+ 100% + Functions + 5/5 +
+ + +
+ 87.93% + Lines + 51/58 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +1701x +1x +  +  +  +  +  +  +  +  +  +  +  +  +1x +1x +  +1x +2x +  +  +2x +  +  +  +14x +14x +  +14x +  +  +  +2x +  +14x +14x +14x +14x +  +14x +14x +2x +  +2x +  +12x +1x +  +11x +  +12x +12x +  +  +  +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +14x +1x +1x +3x +3x +1x +  +  +  +  +1x +1x +  +  +  +14x +14x +  +  +  +  +  +  +  +  +  +14x +3x +3x +  +  +  +  +  +  +  +  +  +  +14x +3x +3x +  +  +14x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const set = require("set-value");
+const {
+  defaultPostRequestConfig,
+  defaultPutRequestConfig,
+  defaultGetRequestConfig,
+  defaultRequestConfig,
+  getHashFromArray,
+  getFieldValueFromMessage,
+  flattenJson,
+  isDefinedAndNotNull,
+  CustomError,
+  getErrorRespEvents,
+  getSuccessRespEvents
+} = require("../../util");
+const { EventType } = require("../../../constants");
+ 
+const getPropertyParams = message => {
+  Iif (message.type === EventType.IDENTIFY) {
+    return flattenJson(getFieldValueFromMessage(message, "traits"));
+  }
+  return flattenJson(message.properties);
+};
+ 
+function process(event) {
+  try {
+    const { message, destination } = event;
+    // set context.ip from request_ip if it is missing
+    if (
+      !get(message, "context.ip") &&
+      isDefinedAndNotNull(message.request_ip)
+    ) {
+      set(message, "context.ip", message.request_ip);
+    }
+    const response = defaultRequestConfig();
+    const url = destination.Config.webhookUrl;
+    const method = destination.Config.webhookMethod;
+    const { headers } = destination.Config;
+ 
+    Eif (url) {
+      if (method === defaultGetRequestConfig.requestMethod) {
+        response.method = defaultGetRequestConfig.requestMethod;
+        // send properties as query params for GET
+        response.params = getPropertyParams(message);
+      } else {
+        if (method === defaultPutRequestConfig.requestMethod) {
+          response.method = defaultPutRequestConfig.requestMethod;
+        } else {
+          response.method = defaultPostRequestConfig.requestMethod;
+        }
+        response.body.JSON = message;
+        response.headers = {
+          "content-type": "application/json"
+        };
+      }
+ 
+      Object.assign(response.headers, getHashFromArray(headers));
+      // ------------------------------------------------
+      // This is temporary and just to support dynamic header through user transformation
+      // Final goal is to support updating destinaiton config using user transformation
+      //
+      // We'll deprecate this feature as soon as we release the final feature
+      // Sample user transformation for this:
+      //
+      // export function transformEvent(event, metadata) {
+      //   event.header = {
+      //     dynamic_header_1: "dynamic_header_value"
+      //   };
+      //
+      //   return event;
+      // }
+      //
+      // ------------------------------------------------
+      const { header } = message;
+      if (header) {
+        Eif (typeof header === "object") {
+          Object.keys(header).forEach(key => {
+            const val = header[key];
+            if (val && typeof val === "string") {
+              response.headers[key] = val;
+            }
+          });
+        }
+ 
+        Eif (response.body.JSON) {
+          delete response.body.JSON.header;
+        }
+      }
+ 
+      response.userId = message.anonymousId;
+      response.endpoint = url;
+ 
+      // Similar hack as above for dynamically changing the full url
+      // Sample user transformation for this:
+      //
+      // export function transformEvent(event, metadata) {
+      //   event.fullPath = `${subdomain}.rudderstack.com`
+      //
+      //   return event;
+      // }
+      if (message.fullPath && typeof message.fullPath === "string" ) {
+        response.endpoint = message.fullPath;
+        delete message.fullPath
+      }
+ 
+      // Similar hack as above to adding dynamic path to base url, probably needs a regex eventually
+      // Sample user transformation for this:
+      //
+      // export function transformEvent(event, metadata) {
+      //   event.appendPath = `/path/${var}/search?param=${var2}`
+      //
+      //   return event;
+      // }
+      if (message.appendPath && typeof message.appendPath === "string" ) {
+        response.endpoint += message.appendPath;
+        delete message.appendPath
+      }
+ 
+      return response;
+    }
+    throw new CustomError("Invalid URL in destination config", 400);
+  } catch (err) {
+    throw new CustomError(
+      err.message || "[webhook] Failed to process request",
+      err.status || 400
+    );
+  }
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/zendesk/config.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/zendesk/config.js.html new file mode 100644 index 00000000000..324b5563674 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/zendesk/config.js.html @@ -0,0 +1,242 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/zendesk/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/zendesk config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +551x +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  + 
const { getMappingConfig } = require("../../util");
+ 
+const ConfigCategory = {
+  IDENTIFY: {
+    name: "ZDIdentifyConfig",
+    json_name: "user",
+    userFieldsEndpoint: "user_fields.json",
+    userFieldsJson: "user_fields",
+    createOrUpdateUserEndpoint: "users/create_or_update.json"
+  },
+  GROUP: {
+    name: "ZDGroupConfig",
+    json_name: "organization",
+    organizationFieldsEndpoint: "organization_fields.json",
+    organizationFieldsJson: "organization_fields",
+    userMembershipEndpoint: "organization_memberships.json",
+    createEndpoint: "organizations/create_or_update.json"
+  }
+};
+ 
+const defaultFields = {
+  [ConfigCategory.IDENTIFY.userFieldsJson]: [
+    "email",
+    "name",
+    "organizationId",
+    "timezone",
+    "phone",
+    "userId",
+    "id"
+  ],
+  [ConfigCategory.GROUP.organizationFieldsJson]: [
+    "name",
+    "domainNames",
+    "tags",
+    "groupId",
+    "url",
+    "deleted"
+  ]
+};
+ 
+const mappingConfig = getMappingConfig(ConfigCategory, __dirname);
+ 
+const ZENDESK_MARKET_PLACE_NAME = "RudderStack";
+const ZENDESK_MARKET_PLACE_ORG_ID = "3339";
+const ZENDESK_MARKET_PLACE_APP_ID = "263241";
+ 
+module.exports = {
+  ConfigCategory,
+  mappingConfig,
+  defaultFields,
+  ZENDESK_MARKET_PLACE_NAME,
+  ZENDESK_MARKET_PLACE_ORG_ID,
+  ZENDESK_MARKET_PLACE_APP_ID
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/zendesk/index.html b/coverage/lcov-report/rudder-transformer/v0/destinations/zendesk/index.html new file mode 100644 index 00000000000..06ee269082e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/zendesk/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/zendesk + + + + + + + + + +
+
+

All files rudder-transformer/v0/destinations/zendesk

+
+ +
+ 86.97% + Statements + 207/238 +
+ + +
+ 64.66% + Branches + 86/133 +
+ + +
+ 100% + Functions + 24/24 +
+ + +
+ 86.92% + Lines + 206/237 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%0/0100%8/8
transform.js +
+
86.52%199/23064.66%86/133100%24/2486.46%198/229
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/destinations/zendesk/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/destinations/zendesk/transform.js.html new file mode 100644 index 00000000000..6d1a1ad1305 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/destinations/zendesk/transform.js.html @@ -0,0 +1,1808 @@ + + + + + + Code coverage report for rudder-transformer/v0/destinations/zendesk/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/destinations/zendesk transform.js

+
+ +
+ 86.52% + Statements + 199/230 +
+ + +
+ 64.66% + Branches + 86/133 +
+ + +
+ 100% + Functions + 24/24 +
+ + +
+ 86.46% + Lines + 198/229 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +5771x +1x +1x +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +1x +  +  +  +  +12x +  +12x +  +  +  +  +  +  +12x +12x +12x +12x +12x +  +12x +  +  +  +  +  +3x +3x +  +3x +  +  +  +  +  +  +  +  +3x +3x +3x +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +10x +  +10x +10x +  +10x +10x +10x +10x +  +26x +10x +  +  +10x +10x +30x +  +  +10x +3x +  +  +  +  +  +  +  +  +8x +  +  +8x +  +  +  +8x +7x +  +  +7x +  +  +7x +  +7x +7x +  +  +  +7x +24x +  +7x +3x +  +  +7x +  +7x +5x +  +  +7x +  +  +  +  +5x +  +  +5x +5x +  +5x +  +5x +5x +5x +1x +1x +  +  +4x +4x +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +2x +  +  +  +  +  +  +2x +  +  +  +  +2x +  +  +2x +2x +  +2x +2x +2x +  +2x +2x +2x +2x +  +2x +2x +  +2x +  +  +  +  +  +  +  +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +2x +2x +2x +  +2x +2x +  +  +  +  +  +2x +2x +  +6x +  +2x +2x +  +  +  +  +  +  +2x +  +2x +  +  +  +2x +2x +  +2x +2x +  +2x +  +  +  +  +2x +2x +  +  +  +  +  +  +  +15x +1x +  +  +  +  +  +  +  +8x +8x +  +8x +  +  +  +  +  +  +8x +  +  +  +  +  +7x +7x +  +7x +7x +  +  +  +  +  +3x +3x +3x +2x +2x +2x +2x +2x +  +  +  +  +2x +  +  +2x +2x +  +2x +2x +2x +  +  +  +  +  +2x +2x +  +  +  +  +  +  +  +  +7x +7x +  +  +  +4x +4x +  +4x +4x +  +4x +1x +  +  +  +3x +3x +3x +3x +2x +  +  +  +  +2x +  +  +2x +  +  +2x +2x +  +3x +3x +  +3x +3x +3x +3x +3x +  +3x +3x +3x +3x +  +3x +3x +  +3x +3x +  +  +  +3x +2x +  +  +  +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +2x +  +  +  +  +  +  +  +2x +  +  +  +  +  +2x +  +2x +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +16x +16x +16x +16x +16x +  +  +  +  +  +  +16x +  +8x +  +3x +  +4x +  +1x +  +  +  +  +16x +16x +12x +  +  +1x +1x +  +  +  +  +1x +  +2x +2x +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x + 
const get = require("get-value");
+const set = require("set-value");
+const axios = require("axios");
+ 
+const { EventType } = require("../../../constants");
+const {
+  ConfigCategory,
+  mappingConfig,
+  defaultFields,
+  ZENDESK_MARKET_PLACE_NAME,
+  ZENDESK_MARKET_PLACE_ORG_ID,
+  ZENDESK_MARKET_PLACE_APP_ID
+} = require("./config");
+const {
+  removeUndefinedValues,
+  defaultPostRequestConfig,
+  defaultRequestConfig,
+  defaultDeleteRequestConfig,
+  getFieldValueFromMessage,
+  constructPayload,
+  getSuccessRespEvents,
+  getErrorRespEvents,
+  CustomError
+} = require("../../util");
+const logger = require("../../../logger");
+ 
+let endPoint;
+ 
+function responseBuilder(message, headers, payload, endpoint) {
+  const response = defaultRequestConfig();
+ 
+  const updatedHeaders = {
+    ...headers,
+    "X-Zendesk-Marketplace-Name": ZENDESK_MARKET_PLACE_NAME,
+    "X-Zendesk-Marketplace-Organization-Id": ZENDESK_MARKET_PLACE_ORG_ID,
+    "X-Zendesk-Marketplace-App-Id": ZENDESK_MARKET_PLACE_APP_ID
+  };
+ 
+  response.endpoint = endpoint;
+  response.method = defaultPostRequestConfig.requestMethod;
+  response.headers = updatedHeaders;
+  response.userId = message.anonymousId;
+  response.body.JSON = payload;
+ 
+  return response;
+}
+ 
+async function createUserFields(url, config, newFields, fieldJson) {
+  let fieldData;
+  // removing trailing 's' from fieldJson
+  fieldJson = fieldJson.slice(0, -1);
+  newFields.forEach(async field => {
+    // create payload for each new user field
+    fieldData = {
+      [fieldJson]: {
+        title: field,
+        active: true,
+        key: field,
+        description: field
+      }
+    };
+ 
+    try {
+      const response = await axios.post(url, fieldData, config);
+      Eif (response.status !== 201) {
+        logger.debug("Failed to create User Field : ", field);
+      }
+    } catch (error) {
+      if (error.response && error.response.status !== 422) {
+        logger.debug("Cannot create User field ", field, error);
+      }
+    }
+  });
+}
+ 
+async function checkAndCreateUserFields(
+  traits,
+  categoryEndpoint,
+  fieldJson,
+  headers
+) {
+  let newFields = [];
+ 
+  const url = endPoint + categoryEndpoint;
+  const config = { headers };
+ 
+  try {
+    const response = await axios.get(url, config);
+    const fields = get(response.data, fieldJson);
+    Eif (response.data && fields) {
+      // get existing user_fields and concatenate them with default fields
+      let existingKeys = fields.map(field => field.key);
+      existingKeys = existingKeys.concat(defaultFields[fieldJson]);
+ 
+      // check for new fields
+      const traitKeys = Object.keys(traits);
+      newFields = traitKeys.filter(
+        key => !(existingKeys.includes(key) || typeof traits[key] === "object") // to handle traits.company.remove
+      );
+ 
+      if (newFields.length > 0) {
+        await createUserFields(url, config, newFields, fieldJson);
+      }
+    }
+  } catch (error) {
+    logger.debug("Error :", error.response ? error.response.data : error);
+  }
+}
+ 
+function getIdentifyPayload(message, category, destinationConfig, type) {
+  const mappingJson = mappingConfig[category.name];
+ 
+  const traits =
+    type === "group"
+      ? get(message, "context.traits")
+      : getFieldValueFromMessage(message, "traits");
+ 
+  const payload = constructPayload(traits, mappingJson);
+  Iif (!payload.user) {
+    payload.user = {};
+  }
+  payload.user.external_id =
+    get(traits, "userId") || get(traits, "id") || message.userId;
+ 
+  const sourceKeys = defaultFields[ConfigCategory.IDENTIFY.userFieldsJson];
+ 
+  Eif (payload.user.external_id) {
+    set(payload, "user.user_fields.id", payload.user.external_id);
+  }
+ 
+  // send fields not in sourceKeys as user fields
+  const userFields = Object.keys(traits).filter(
+    trait => !(sourceKeys.includes(trait) || typeof traits[trait] === "object")
+  );
+  userFields.forEach(field => {
+    set(payload, `user.user_fields.${field}`, get(traits, field));
+  });
+ 
+  payload.user = removeUndefinedValues(payload.user);
+ 
+  if (destinationConfig.createUsersAsVerified) {
+    set(payload, "user.verified", true);
+  }
+ 
+  return payload;
+}
+ 
+async function getUserId(message, headers, type) {
+  const traits =
+    type === "group"
+      ? get(message, "context.traits")
+      : getFieldValueFromMessage(message, "traits");
+  const userEmail = traits.email;
+  const url = `${endPoint}users/search.json?query=${userEmail}`;
+  // let url  = endPoint + `users/search.json?external_id=${externalId}`;
+  const config = { headers };
+ 
+  try {
+    const resp = await axios.get(url, config);
+    if (!resp || !resp.data || resp.data.count === 0) {
+      logger.debug("User not found");
+      return undefined;
+    }
+ 
+    const zendeskUserId = resp.data.users[0].id;
+    return zendeskUserId;
+  } catch (error) {
+    // logger.debug(
+    //   `Cannot get userId for externalId : ${externalId}`,
+    //   error.response
+    // );
+    return undefined;
+  }
+}
+ 
+async function isUserAlreadyAssociated(userId, orgId, headers) {
+  const url = `${endPoint}/users/${userId}/organization_memberships.json`;
+  const config = { headers };
+  const response = await axios.get(url, config);
+  Iif (
+    response.data &&
+    response.data.organization_memberships.length > 0 &&
+    response.data.organization_memberships[0].organization_id === orgId
+  ) {
+    return true;
+  }
+  return false;
+}
+ 
+async function createUser(message, headers, destinationConfig, type) {
+  const traits =
+    type === "group"
+      ? get(message, "context.traits")
+      : getFieldValueFromMessage(message, "traits");
+  const { name, email } = traits;
+  const userId = getFieldValueFromMessage(message, "userId");
+ 
+  const userObject = { name, external_id: userId, email };
+  Eif (destinationConfig.createUsersAsVerified) {
+    userObject.verified = true;
+  }
+  const category = ConfigCategory.IDENTIFY;
+  const url = endPoint + category.createOrUpdateUserEndpoint;
+  const config = { headers };
+  const payload = { user: userObject };
+ 
+  try {
+    const resp = await axios.post(url, payload, config);
+ 
+    Iif (!resp.data || !resp.data.user || !resp.data.user.id) {
+      logger.debug(`Couldn't create User: ${name}`);
+      throw new CustomError(
+        "user not found",
+        resp.status || resp.data.status || 400
+      );
+    }
+ 
+    const userID = resp.data.user.id;
+    const userEmail = resp.data.user.email;
+    return { zendeskUserId: userID, email: userEmail };
+  } catch (error) {
+    logger.debug(error);
+    logger.debug(`Couldn't find user: ${name}`);
+    throw new CustomError(`Couldn't find user: ${name}`, error.status || 400);
+  }
+}
+ 
+async function getUserMembershipPayload(
+  message,
+  headers,
+  orgId,
+  destinationConfig
+) {
+  // let zendeskUserID = await getUserId(message.userId, headers);
+  let zendeskUserID = await getUserId(message, headers, "group");
+  const traits = get(message, "context.traits");
+  Iif (!zendeskUserID) {
+    if (traits.name && traits.email) {
+      const { zendeskUserId } = await createUser(
+        message,
+        headers,
+        destinationConfig,
+        "group"
+      );
+      zendeskUserID = zendeskUserId;
+    } else {
+      throw new CustomError("User not found", 400);
+    }
+  }
+  const payload = {
+    organization_membership: {
+      user_id: zendeskUserID,
+      organization_id: orgId
+    }
+  };
+ 
+  return payload;
+}
+ 
+async function createOrganization(
+  message,
+  category,
+  headers,
+  destinationConfig
+) {
+  await checkAndCreateUserFields(
+    message.traits,
+    category.organizationFieldsEndpoint,
+    category.organizationFieldsJson,
+    headers
+  );
+  const mappingJson = mappingConfig[category.name];
+  const payload = constructPayload(message, mappingJson);
+  const sourceKeys = defaultFields[ConfigCategory.GROUP.organizationFieldsJson];
+ 
+  Eif (payload.organization.external_id) {
+    set(
+      payload,
+      "organization.organization_fields.id",
+      payload.organization.external_id
+    );
+  }
+  const traitKeys = Object.keys(message.traits);
+  const organizationFields = traitKeys.filter(
+    trait =>
+      !(sourceKeys.includes(trait) || typeof message.traits[trait] === "object")
+  );
+  organizationFields.forEach(field => {
+    set(
+      payload,
+      `organization.organization_fields.${field}`,
+      get(message, `traits.${field}`)
+    );
+  });
+ 
+  payload.organization = removeUndefinedValues(payload.organization);
+ 
+  Iif (destinationConfig.sendGroupCallsWithoutUserId && !message.userId) {
+    return payload;
+  }
+ 
+  const url = endPoint + category.createEndpoint;
+  const config = { headers };
+ 
+  try {
+    const resp = await axios.post(url, payload, config);
+ 
+    Iif (!resp.data || !resp.data.organization) {
+      logger.debug(`Couldn't create Organization: ${message.traits.name}`);
+      return undefined;
+    }
+ 
+    const orgId = resp.data.organization.id;
+    return orgId;
+  } catch (error) {
+    logger.debug(`Couldn't create Organization: ${message.traits.name}`);
+    return undefined;
+  }
+}
+ 
+function validateUserId(message) {
+  if (!message.userId) {
+    throw new CustomError(
+      `Zendesk : UserId is a mandatory field for ${message.type}`,
+      400
+    );
+  }
+}
+ 
+async function processIdentify(message, destinationConfig, headers) {
+  validateUserId(message);
+  const category = ConfigCategory.IDENTIFY;
+  // create user fields if required
+  await checkAndCreateUserFields(
+    getFieldValueFromMessage(message, "traits"),
+    category.userFieldsEndpoint,
+    category.userFieldsJson,
+    headers
+  );
+ 
+  const payload = getIdentifyPayload(
+    message,
+    category,
+    destinationConfig,
+    "identify"
+  );
+  const url = endPoint + category.createOrUpdateUserEndpoint;
+  const returnList = [];
+ 
+  const traits = getFieldValueFromMessage(message, "traits");
+  if (
+    traits.company &&
+    traits.company.remove &&
+    destinationConfig.removeUsersFromOrganization &&
+    traits.company.id
+  ) {
+    const orgId = traits.company.id;
+    const userId = await getUserId(message, headers);
+    if (userId) {
+      const membershipUrl = `${endPoint}users/${userId}/organization_memberships.json`;
+      try {
+        const config = { headers };
+        const response = await axios.get(membershipUrl, config);
+        Eif (
+          response.data &&
+          response.data.organization_memberships &&
+          response.data.organization_memberships.length > 0
+        ) {
+          Eif (
+            orgId === response.data.organization_memberships[0].organization_id
+          ) {
+            const membershipId = response.data.organization_memberships[0].id;
+            const deleteResponse = defaultRequestConfig();
+ 
+            deleteResponse.endpoint = `${endPoint}users/${userId}/organization_memberships/${membershipId}.json`;
+            deleteResponse.method = defaultDeleteRequestConfig.requestMethod;
+            deleteResponse.headers = {
+              ...headers,
+              "X-Zendesk-Marketplace-Name": ZENDESK_MARKET_PLACE_NAME,
+              "X-Zendesk-Marketplace-Organization-Id": ZENDESK_MARKET_PLACE_ORG_ID,
+              "X-Zendesk-Marketplace-App-Id": ZENDESK_MARKET_PLACE_APP_ID
+            };
+            deleteResponse.userId = message.anonymousId;
+            returnList.push(deleteResponse);
+          }
+        }
+      } catch (error) {
+        logger.debug(error);
+      }
+    }
+  }
+ 
+  returnList.push(responseBuilder(message, headers, payload, url));
+  return returnList;
+}
+ 
+async function processTrack(message, destinationConfig, headers) {
+  validateUserId(message);
+  const traits = getFieldValueFromMessage(message, "traits");
+  let userEmail;
+  Eif (traits) {
+    userEmail = traits.email ? traits.email : null;
+  }
+  if (!userEmail) {
+    throw new CustomError("email not found in traits.", 400);
+  }
+  let zendeskUserID;
+ 
+  let url = `${endPoint}users/search.json?query=${userEmail}`;
+  const config = { headers };
+  const userResponse = await axios.get(url, config);
+  if (!userResponse || !userResponse.data || userResponse.data.count === 0) {
+    const { zendeskUserId, email } = await createUser(
+      message,
+      headers,
+      destinationConfig
+    );
+    Iif (!zendeskUserId) {
+      throw new CustomError("user not found", 400);
+    }
+    Iif (!email) {
+      throw new CustomError("user email not found", 400);
+    }
+    zendeskUserID = zendeskUserId;
+    userEmail = email;
+  }
+  zendeskUserID = zendeskUserID || userResponse.data.users[0].id;
+  userEmail = userEmail || userResponse.data.users[0].email;
+ 
+  const eventObject = {};
+  eventObject.description = message.event;
+  eventObject.type = message.event;
+  eventObject.source = "Rudder";
+  eventObject.properties = message.properties;
+ 
+  const profileObject = {};
+  profileObject.type = message.event;
+  profileObject.source = "Rudder";
+  profileObject.identifiers = [{ type: "email", value: userEmail }];
+ 
+  const eventPayload = { event: eventObject, profile: profileObject };
+  url = `${endPoint}users/${zendeskUserID}/events`;
+ 
+  const response = responseBuilder(message, headers, eventPayload, url);
+  return response;
+}
+ 
+async function processGroup(message, destinationConfig, headers) {
+  validateUserId(message);
+  const category = ConfigCategory.GROUP;
+  let payload;
+  let url;
+ 
+  Iif (destinationConfig.sendGroupCallsWithoutUserId && !message.userId) {
+    payload = await createOrganization(
+      message,
+      category,
+      headers,
+      destinationConfig
+    );
+    url = endPoint + category.createEndpoint;
+  } else {
+    const orgId = await createOrganization(
+      message,
+      category,
+      headers,
+      destinationConfig
+    );
+    Iif (!orgId) {
+      throw new CustomError(
+        `Couldn't create user membership for user having external id ${message.userId} as Organization ${message.traits.name} wasn't created`,
+        400
+      );
+    }
+    // adds an organization against a user and can add multiple organisation. the last one does not override but adds to the previously added organizations.
+    // Docs: https://developer.zendesk.com/rest_api/docs/support/organization_memberships#create-membership
+    payload = await getUserMembershipPayload(
+      message,
+      headers,
+      orgId,
+      destinationConfig
+    );
+    url = endPoint + category.userMembershipEndpoint;
+ 
+    const userId = payload.organization_membership.user_id;
+    Iif (await isUserAlreadyAssociated(userId, orgId, headers)) {
+      throw new CustomError(
+        "user is already associated with organization",
+        400
+      );
+    }
+  }
+ 
+  // not removing this code - as it is a different implementation for group membership - may be needed later.
+  // this implementation does not let you add more than one organization to a particular user. The last one overrides the previously added organization.
+ 
+  // category = ConfigCategory.IDENTIFY;
+  // payload = getIdentifyPayload(message, category, destinationConfig, "group");
+  // payload.user.organization_id = orgId;
+  // url = endPoint + category.createOrUpdateUserEndpoint;
+  // return responseBuilder(message, headers, payload, url);
+ 
+  return responseBuilder(message, headers, payload, url);
+}
+ 
+async function processSingleMessage(event) {
+  const { message } = event;
+  const destinationConfig = event.destination.Config;
+  const messageType = message.type.toLowerCase();
+  const unencodedBase64Str = `${destinationConfig.email}/token:${destinationConfig.apiToken}`;
+  const headers = {
+    Authorization: `Basic ${Buffer.from(unencodedBase64Str).toString(
+      "base64"
+    )}`,
+    "Content-Type": "application/json"
+  };
+ 
+  switch (messageType) {
+    case EventType.IDENTIFY:
+      return processIdentify(message, destinationConfig, headers);
+    case EventType.GROUP:
+      return processGroup(message, destinationConfig, headers);
+    case EventType.TRACK:
+      return processTrack(message, destinationConfig, headers);
+    default:
+      throw new CustomError("Message type not supported", 400);
+  }
+}
+ 
+async function process(event) {
+  endPoint = `https://${event.destination.Config.domain}.zendesk.com/api/v2/`;
+  const resp = await processSingleMessage(event);
+  return resp;
+}
+ 
+const processRouterDest = async inputs => {
+  Iif (!Array.isArray(inputs) || inputs.length <= 0) {
+    const respEvents = getErrorRespEvents(null, 400, "Invalid event array");
+    return [respEvents];
+  }
+ 
+  const respList = await Promise.all(
+    inputs.map(async input => {
+      try {
+        Iif (input.message.statusCode) {
+          // already transformed event
+          return getSuccessRespEvents(
+            input.message,
+            [input.metadata],
+            input.destination
+          );
+        }
+        // if not transformed
+        return getSuccessRespEvents(
+          await process(input),
+          [input.metadata],
+          input.destination
+        );
+      } catch (error) {
+        return getErrorRespEvents(
+          [input.metadata],
+          // eslint-disable-next-line no-nested-ternary
+          error.response
+            ? error.response.status
+            : error.code
+            ? error.code
+            : 400,
+          error.message || "Error occurred while processing payload."
+        );
+      }
+    })
+  );
+  return respList;
+};
+ 
+module.exports = { process, processRouterDest };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/appcenter/index.html b/coverage/lcov-report/rudder-transformer/v0/sources/appcenter/index.html new file mode 100644 index 00000000000..9318395d534 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/appcenter/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/appcenter + + + + + + + + + +
+
+

All files rudder-transformer/v0/sources/appcenter

+
+ +
+ 21.43% + Statements + 6/28 +
+ + +
+ 0% + Branches + 0/20 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 21.43% + Lines + 6/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
21.43%6/280%0/200%0/421.43%6/28
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/appcenter/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/appcenter/transform.js.html new file mode 100644 index 00000000000..35cae123306 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/appcenter/transform.js.html @@ -0,0 +1,266 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/appcenter/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/appcenter transform.js

+
+ +
+ 21.43% + Statements + 6/28 +
+ + +
+ 0% + Branches + 0/20 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 21.43% + Lines + 6/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +631x +1x +1x +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x + 
const path = require("path");
+const fs = require("fs");
+const Message = require("../message");
+ 
+const mappingJson = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "./mapping.json"), "utf-8")
+);
+ 
+const { removeUndefinedAndNullValues } = require("../../util");
+ 
+function guidGenerator() {
+  const S4 = () =>
+    // eslint-disable-next-line no-bitwise
+    (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
+  return `${S4() + S4()}-${S4()}-${S4()}-${S4()}-${S4()}${S4()}${S4()}`;
+}
+ 
+function processEvent(event) {
+  const message = new Message(`APPCENTER`);
+  message.setEventType("track");
+ 
+  if (event.build_status && event.build_status === "Succeeded") {
+    message.setEventName("Build Succeeded");
+  } else if (event.build_status && event.build_status === "Broken") {
+    message.setEventName("Build Failed");
+  } else if (
+    event.release_id &&
+    event.release_id !== "" &&
+    event.short_version &&
+    event.short_version !== ""
+  ) {
+    message.setEventName(`Released Version ${event.short_version}`);
+  } else if (
+    event.id &&
+    event.id !== "" &&
+    event.reason &&
+    event.reason !== ""
+  ) {
+    message.setEventName("App Crashed");
+  } else {
+    throw new Error("Unknown event type from Appcenter");
+  }
+  const properties = { ...event };
+  message.setProperty("properties", properties);
+ 
+  // set fields in payload from mapping json
+  message.setPropertiesV2(event, mappingJson);
+ 
+  // app center does not has the concept of user but we need to set some random anonymousId in order to make the server accept the message
+  message.anonymousId = guidGenerator();
+  return message;
+}
+ 
+function process(event) {
+  const response = processEvent(event);
+  const returnValue = removeUndefinedAndNullValues(response);
+  // to bypass the unit testcases ( we may change this)
+  //returnValue.anonymousId = "7e32188a4dab669f";
+  return returnValue;
+}
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/appsflyer/index.html b/coverage/lcov-report/rudder-transformer/v0/sources/appsflyer/index.html new file mode 100644 index 00000000000..4a4db733555 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/appsflyer/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/appsflyer + + + + + + + + + +
+
+

All files rudder-transformer/v0/sources/appsflyer

+
+ +
+ 100% + Statements + 42/42 +
+ + +
+ 76.67% + Branches + 23/30 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 42/42 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%42/4276.67%23/30100%3/3100%42/42
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/appsflyer/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/appsflyer/transform.js.html new file mode 100644 index 00000000000..8e428c3aa8f --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/appsflyer/transform.js.html @@ -0,0 +1,344 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/appsflyer/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/appsflyer transform.js

+
+ +
+ 100% + Statements + 42/42 +
+ + +
+ 76.67% + Branches + 23/30 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 42/42 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +891x +1x +1x +1x +  +1x +  +  +  +  +  +  +  +1x +  +  +8x +  +8x +7x +7x +  +7x +  +7x +  +7x +7x +  +  +7x +  +  +7x +112x +107x +  +  +  +7x +4x +  +  +7x +7x +6x +1x +1x +  +  +7x +7x +  +  +7x +7x +  +  +7x +7x +  +  +7x +7x +  +  +  +  +  +  +7x +7x +  +  +7x +  +7x +  +1x +  +  +  +8x +7x +7x +  +  +1x + 
const path = require("path");
+const fs = require("fs");
+const Message = require("../message");
+const { generateUUID } = require("../../util");
+ 
+const mappingJson = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "./mapping.json"), "utf-8")
+);
+ 
+const {
+  removeUndefinedAndNullValues,
+  isObject,
+  isAppleFamily
+} = require("../../util");
+ 
+function processEvent(event) {
+  const messageType = "track";
+ 
+  if (event.event_name) {
+    const eventName = event.event_name;
+    const message = new Message(`AF`);
+ 
+    message.setEventType(messageType);
+ 
+    message.setEventName(eventName);
+ 
+    const properties = { ...event };
+    message.setProperty("properties", properties);
+ 
+    // set fields in payload from mapping json
+    message.setProperties(event, mappingJson);
+ 
+    // Remove the fields from properties that are already mapped to other fields.
+    Object.keys(mappingJson).forEach(key => {
+      if (message.properties && message.properties[key] !== undefined) {
+        delete message.properties[key];
+      }
+    });
+ 
+    if (!isObject(message.context.device)) {
+      message.context.device = {};
+    }
+ 
+    Eif (event.platform) {
+      if (isAppleFamily(event.platform)) {
+        message.context.device.advertisingId = event.idfa;
+      } else Eif (event.platform.toLowerCase() === "android") {
+        message.context.device.advertisingId = event.android_id;
+      }
+      // remove idfa from message properties as it is already mapped.
+      Eif (message.properties && message.properties.idfa !== undefined) {
+        delete message.properties.idfa;
+      }
+      // remove android_id from message properties as it is already mapped.
+      Eif (message.properties && message.properties.android_id !== undefined) {
+        delete message.properties.android_id;
+      }
+    }
+    Eif (message.context.device.advertisingId) {
+      message.context.device.adTrackingEnabled = true;
+    }
+ 
+    Eif (event.appsflyer_id) {
+      message.context.externalId = [
+        {
+          type: "appsflyerExternalId",
+          value: event.appsflyer_id
+        }
+      ];
+      // remove appsflyer_id from message properties as it is already mapped.
+      Eif (message.properties && message.properties.appsflyer_id !== undefined) {
+        delete message.properties.appsflyer_id;
+      }
+    }
+    message.setProperty("anonymousId", generateUUID());
+ 
+    return message;
+  }
+  throw new Error("Unknwon event type from Appsflyer");
+}
+ 
+function process(event) {
+  const response = processEvent(event);
+  const returnValue = removeUndefinedAndNullValues(response);
+  return returnValue;
+}
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/auth0/index.html b/coverage/lcov-report/rudder-transformer/v0/sources/auth0/index.html new file mode 100644 index 00000000000..d67669aa3fa --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/auth0/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/auth0 + + + + + + + + + +
+
+

All files rudder-transformer/v0/sources/auth0

+
+ +
+ 93.18% + Statements + 41/44 +
+ + +
+ 72.73% + Branches + 16/22 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 92.5% + Lines + 37/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
93.18%41/4472.73%16/22100%7/792.5%37/40
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/auth0/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/auth0/transform.js.html new file mode 100644 index 00000000000..d3eede69102 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/auth0/transform.js.html @@ -0,0 +1,329 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/auth0/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/auth0 transform.js

+
+ +
+ 93.18% + Statements + 41/44 +
+ + +
+ 72.73% + Branches + 16/22 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 92.5% + Lines + 37/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +841x +1x +1x +  +1x +  +  +1x +  +  +1x +  +  +  +  +  +  +  +22x +22x +22x +3x +  +  +4x +  +4x +3x +3x +  +  +3x +  +3x +3x +  +3x +  +3x +2x +2x +  +  +3x +3x +  +  +3x +3x +  +  +  +1x +  +  +  +1x +1x +1x +  +  +1x +4x +4x +3x +3x +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +1x + 
const path = require("path");
+const fs = require("fs");
+const _ = require("lodash");
+// import mapping json using JSON.parse to preserve object key order
+const mapping = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "./mapping.json"), "utf-8")
+);
+const Message = require("../message");
+ 
+// Ref: https://auth0.com/docs/logs/references/log-event-type-codes
+const eventNameMap = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "./eventMapping.json"), "utf-8")
+);
+ 
+// ideally this should go under utils
+// we should move the utils class out of the destinations folder
+// and put under a common place so that both sources and destinations can use that
+// will take that in a separate PR
+const isDefined = x => !_.isUndefined(x);
+const isNotNull = x => x != null;
+const isDefinedAndNotNull = x => isDefined(x) && isNotNull(x);
+const removeUndefinedAndNullValues = obj => _.pickBy(obj, isDefinedAndNotNull);
+ 
+function processEvent(event) {
+  const messageType = "track";
+ 
+  if (event.type) {
+    const eventType = event.type;
+    const message = new Message(`Auth0`);
+ 
+    // since only email status events are supported, event type is always track
+    message.setEventType(messageType);
+ 
+    const eventName = eventNameMap[eventType] || eventType;
+    message.setEventName(eventName);
+ 
+    message.setProperties(event, mapping);
+ 
+    if (event.date) {
+      message.setProperty("originalTimestamp", event.date);
+      message.setProperty("sentAt", event.date);
+    }
+ 
+    Eif (message.context && message.context.traits) {
+      message.userId = message.context.traits.userId;
+    }
+ 
+    Eif (message.userId && message.userId !== "") {
+      return message;
+    }
+    return null;
+  }
+  throw new Error("Unknwon event type from Auth0");
+}
+ 
+function process(events) {
+  const responses = [];
+  let eventList = events;
+  Iif (!Array.isArray(events)) {
+    eventList = [events];
+  }
+  eventList.forEach(event => {
+    try {
+      const resp = processEvent(event);
+      Eif (resp) {
+        responses.push(removeUndefinedAndNullValues(resp));
+      }
+    } catch (error) {
+      // TODO: figure out a way to handle partial failures within batch
+      // responses.push({
+      //   statusCode: 400,
+      //   error: error.message || "Unknwon error"
+      // });
+    }
+  });
+  Iif (responses.length === 0) {
+    throw new Error("All requests in the batch failed");
+  } else {
+    return responses;
+  }
+}
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/braze/index.html b/coverage/lcov-report/rudder-transformer/v0/sources/braze/index.html new file mode 100644 index 00000000000..94b17bb24fe --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/braze/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/braze + + + + + + + + + +
+
+

All files rudder-transformer/v0/sources/braze

+
+ +
+ 92.5% + Statements + 37/40 +
+ + +
+ 63.64% + Branches + 14/22 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 92.5% + Lines + 37/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
92.5%37/4063.64%14/22100%4/492.5%37/40
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/braze/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/braze/transform.js.html new file mode 100644 index 00000000000..4e96d2848a5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/braze/transform.js.html @@ -0,0 +1,383 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/braze/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/braze transform.js

+
+ +
+ 92.5% + Statements + 37/40 +
+ + +
+ 63.64% + Branches + 14/22 +
+ + +
+ 100% + Functions + 4/4 +
+ + +
+ 92.5% + Lines + 37/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +1021x +1x +1x +1x +1x +1x +  +  +1x +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +1x +11x +  +11x +11x +11x +  +  +11x +  +  +11x +11x +  +  +11x +  +  +11x +11x +  +  +  +  +  +  +  +11x +11x +89x +  +62x +  +  +  +  +  +11x +11x +  +  +  +  +  +  +  +  +1x +1x +  +  +  +1x +  +  +1x +11x +11x +11x +11x +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +1x + 
const set = require("set-value");
+const get = require("get-value");
+const path = require("path");
+const fs = require("fs");
+const { removeUndefinedAndNullValues, formatTimeStamp } = require("../../util");
+const Message = require("../message");
+ 
+// import mapping json using JSON.parse to preserve object key order
+const mapping = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "./mapping.json"), "utf-8")
+);
+ 
+// if we need to map braze event name to something else. blank as of now
+const eventNameMap = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "./eventMapping.json"), "utf-8")
+);
+ 
+// ignored properties
+// to be deleted from the field `event.properties` as already mapped
+// using mapping.json
+const ignoredProperties = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "./ignore.json"), "utf-8")
+);
+ 
+const processEvent = event => {
+  const messageType = "track";
+ 
+  Eif (event.event_type) {
+    const eventType = event.event_type;
+    const message = new Message(`Braze`);
+ 
+    // since only email status events are supported, event type is always track
+    message.setEventType(messageType);
+ 
+    // set event name
+    const eventName = eventNameMap[eventType] || eventType;
+    message.setEventName(eventName);
+ 
+    // map event properties based on mapping.json
+    message.setProperties(event, mapping);
+ 
+    // set timestamp for the event
+    Eif (event.time) {
+      message.setProperty(
+        "timestamp",
+        formatTimeStamp(event.time, "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")
+      );
+    }
+ 
+    // set message properties from the event which are not ignored
+    // ignored - already mapped using mapping.json
+    Eif (event.properties) {
+      Object.keys(event.properties).forEach(key => {
+        if (ignoredProperties.indexOf(key) === -1) {
+          // the property is not ignored
+          set(message, `properties.${key}`, get(event, `properties.${key}`));
+        }
+      });
+    }
+ 
+    // one of userId or anonymousId is required to process
+    Eif (message.userId || message.anonymousId) {
+      return message;
+    }
+ 
+    // wrong data
+    return null;
+  }
+  throw new Error("Unknwon event type from Braze");
+};
+ 
+const process = events => {
+  const responses = [];
+ 
+  // Ref: Custom Currents Connector Partner Dev Documentation.pdf
+  const eventList =
+    Array.isArray(events) && events.length > 0
+      ? events[0].events
+      : events.events;
+  eventList.forEach(event => {
+    try {
+      const resp = processEvent(event);
+      Eif (resp) {
+        responses.push(removeUndefinedAndNullValues(resp));
+      }
+    } catch (error) {
+      // TODO: figure out a way to handle partial failures within batch
+      // responses.push({
+      //   statusCode: 400,
+      //   error: error.message || "Unknwon error"
+      // });
+    }
+  });
+  Iif (responses.length === 0) {
+    throw new Error("All requests in the batch failed");
+  } else {
+    return responses;
+  }
+};
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/customerio/config.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/customerio/config.js.html new file mode 100644 index 00000000000..93991a7c268 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/customerio/config.js.html @@ -0,0 +1,311 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/customerio/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/customerio config.js

+
+ +
+ 100% + Statements + 8/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 8/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +781x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  + 
const customerEventNameMap = {
+  subscribed: "Customer Subscribed",
+  unsubscribed: "Customer Unsubscribed"
+};
+ 
+const emailEventNameMap = {
+  failed: "Email Failed",
+  spammed: "Email Marked as Spam",
+  dropped: "Email Dropped",
+  bounced: "Email Bounced",
+  unsubscribed: "Email Unsubscribed",
+  converted: "Email Converted",
+  clicked: "Email Link Clicked",
+  opened: "Email Opened",
+  delivered: "Email Delivered",
+  sent: "Email Sent",
+  attempted: "Email Attempted",
+  drafted: "Email Drafted"
+};
+ 
+const smsEventNameMap = {
+  failed: "SMS Failed",
+  bounced: "SMS Bounced",
+  converted: "SMS Converted",
+  clicked: "SMS Link Clicked",
+  delivered: "SMS Delivered",
+  sent: "SMS Sent",
+  attempted: "SMS Attempted",
+  drafted: "SMS Drafted"
+};
+ 
+const pushEventNameMap = {
+  failed: "Push Failed",
+  dropped: "Push Dropped",
+  bounced: "Push Bounced",
+  converted: "Push Converted",
+  clicked: "Push Link Clicked",
+  opened: "Push Opened",
+  sent: "Push Sent",
+  attempted: "Push Attempted",
+  drafted: "Push Drafted"
+};
+ 
+const slackEventNameMap = {
+  failed: "Slack Message Failed",
+  clicked: "Slack Message Link Clicked",
+  sent: "Slack Message Sent",
+  attempted: "Slack Message Attempted",
+  drafted: "Slack Message Drafted"
+};
+ 
+const webhookEventNameMap = {
+  failed: "Webhook Message Failed",
+  clicked: "Webhook Message Link Clicked",
+  sent: "Webhook Message Sent",
+  attempted: "Webhook Message Attempted",
+  drafted: "Webhook Message Drafted"
+};
+ 
+const mappingConfig = {
+  customer: customerEventNameMap,
+  email: emailEventNameMap,
+  sms: smsEventNameMap,
+  push: pushEventNameMap,
+  slack: slackEventNameMap,
+  webhook: webhookEventNameMap
+};
+ 
+module.exports = {
+  customerEventNameMap,
+  emailEventNameMap,
+  smsEventNameMap,
+  pushEventNameMap,
+  slackEventNameMap,
+  webhookEventNameMap,
+  mappingConfig
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/customerio/index.html b/coverage/lcov-report/rudder-transformer/v0/sources/customerio/index.html new file mode 100644 index 00000000000..d24744d14b7 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/customerio/index.html @@ -0,0 +1,126 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/customerio + + + + + + + + + +
+
+

All files rudder-transformer/v0/sources/customerio

+
+ +
+ 90% + Statements + 27/30 +
+ + +
+ 38.46% + Branches + 5/13 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 90% + Lines + 27/30 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%8/8100%0/0100%0/0100%8/8
transform.js +
+
86.36%19/2238.46%5/13100%1/186.36%19/22
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/customerio/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/customerio/transform.js.html new file mode 100644 index 00000000000..95a11e1af52 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/customerio/transform.js.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/customerio/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/customerio transform.js

+
+ +
+ 86.36% + Statements + 19/22 +
+ + +
+ 38.46% + Branches + 5/13 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 86.36% + Lines + 19/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +481x +1x +  +1x +  +  +1x +1x +  +  +19x +  +  +  +19x +19x +  +19x +19x +  +  +  +19x +  +19x +  +19x +19x +19x +19x +  +  +  +19x +  +  +  +  +  +  +  +  +  +19x +  +  +1x + 
const path = require("path");
+const fs = require("fs");
+// import mapping json using JSON.parse to preserve object key order
+const mapping = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "./mapping.json"), "utf-8")
+);
+const Message = require("../message");
+const { mappingConfig } = require("./config");
+ 
+function process(event) {
+  const message = new Message(`Customer.io`);
+ 
+  // since customer, email, sms, push, slack, webhook
+  // status events are supported, event type is always track
+  const eventType = "track";
+  message.setEventType(eventType);
+ 
+  let eventName = mappingConfig[event.object_type.toLowerCase()][event.metric];
+  Iif (!eventName) {
+    // throw new Error("Metric not supported");
+    eventName = "Unknown Event";
+  }
+  message.setEventName(eventName);
+ 
+  message.setProperties(event, mapping);
+ 
+  Eif (event.timestamp) {
+    const ts = new Date(event.timestamp * 1000).toISOString();
+    message.setProperty("originalTimestamp", ts);
+    message.setProperty("sentAt", ts);
+  }
+ 
+  // when customer.io does not pass an associated userId, set the email address as anonymousId
+  Iif (message.userId === null || message.userId === undefined) {
+    if (
+      message.context &&
+      message.context.traits &&
+      message.context.traits.email
+    ) {
+      message.anonymousId = message.context.traits.email;
+    }
+  }
+ 
+  return message;
+}
+ 
+module.exports = { process };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/index.html b/coverage/lcov-report/rudder-transformer/v0/sources/index.html new file mode 100644 index 00000000000..46baa70a3d1 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources + + + + + + + + + +
+
+

All files rudder-transformer/v0/sources

+
+ +
+ 100% + Statements + 31/31 +
+ + +
+ 93.75% + Branches + 15/16 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 100% + Lines + 31/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
message.js +
+
100%31/3193.75%15/16100%12/12100%31/31
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/iterable/index.html b/coverage/lcov-report/rudder-transformer/v0/sources/iterable/index.html new file mode 100644 index 00000000000..97e0d08daf7 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/iterable/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/iterable + + + + + + + + + +
+
+

All files rudder-transformer/v0/sources/iterable

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 90% + Branches + 9/10 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%22/2290%9/10100%1/1100%22/22
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/iterable/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/iterable/transform.js.html new file mode 100644 index 00000000000..7d618fb2290 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/iterable/transform.js.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/iterable/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/iterable transform.js

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 90% + Branches + 9/10 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +481x +1x +1x +1x +  +  +1x +  +  +  +  +  +30x +2x +  +28x +  +  +28x +  +28x +  +28x +  +28x +  +28x +  +28x +27x +27x +27x +  +  +  +27x +  +  +  +27x +26x +  +  +27x +  +  +1x + 
const path = require("path");
+const fs = require("fs");
+const md5 = require("md5");
+const Message = require("../message");
+ 
+// import mapping json using JSON.parse to preserve object key order
+const mapping = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "./mapping.json"), "utf-8")
+);
+ 
+function process(event) {
+  // throw an error if (email, eventName) are not present
+  if (!(event.email && event.eventName)) {
+    throw new Error("Unknwon event type from Iterable");
+  }
+  const message = new Message(`Iterable`);
+ 
+  // event type is always track
+  const eventType = "track";
+ 
+  message.setEventType(eventType);
+ 
+  message.setEventName(event.eventName);
+ 
+  message.setPropertiesV2(event, mapping);
+ 
+  message.context.integration.version = "1.0.0";
+ 
+  Eif (event.dataFields.createdAt) {
+    const ts = new Date(event.dataFields.createdAt).toISOString();
+    message.receivedAt = ts;
+    message.timestamp = ts;
+  }
+ 
+  // As email is present in message.traits, removing it from properties to reduce redundancy
+  delete message.properties.email;
+ 
+  // Treating userId as unique identifier
+  // If userId is not present, then generating it from email using md5 hash function
+  if (message.userId === null || message.userId === undefined) {
+    message.userId = md5(event.email);
+  }
+ 
+  return message;
+}
+ 
+module.exports = { process };
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/message.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/message.js.html new file mode 100644 index 00000000000..47239f37fd9 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/message.js.html @@ -0,0 +1,344 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/message.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources message.js

+
+ +
+ 100% + Statements + 31/31 +
+ + +
+ 93.75% + Branches + 15/16 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 100% + Lines + 31/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +897x +7x +  +7x +  +7x +72x +  +  +  +  +  +  +  +  +  +  +  +  +72x +72x +  +  +  +  +  +71x +  +  +  +72x +  +  +  +185x +  +  +  +40x +807x +807x +807x +765x +  +807x +849x +  +  +849x +  +  +  +  +370x +  +  +  +  +  +  +32x +184x +184x +184x +184x +184x +  +184x +184x +  +  +184x +  +  +  +  +95x +  +  +  +  +  +  +2x +  +  +  +7x + 
const set = require("set-value");
+const get = require("get-value");
+ 
+const { getValueFromMessage } = require("../util");
+ 
+const context = integration => {
+  return {
+    library: {
+      name: "unknown",
+      version: "unknown"
+    },
+    integration: {
+      name: integration
+    }
+  };
+};
+ 
+class Message {
+  constructor(integration) {
+    this.context = context(integration);
+    this.integrations = {
+      [integration]: false
+    };
+  }
+ 
+  setEventName(name) {
+    this.event = name;
+  }
+ 
+  setEventType(type) {
+    this.type = type;
+  }
+ 
+  setProperty(name, value) {
+    set(this, name, value);
+  }
+ 
+  setProperties(event, mapping) {
+    Object.keys(mapping).forEach(key => {
+      const setVal = get(event, key);
+      let destKeys = mapping[key];
+      if (!Array.isArray(destKeys)) {
+        destKeys = [destKeys];
+      }
+      destKeys.forEach(destKey => {
+        const existingVal = get(this, destKey);
+        // do not set if val setVal nil
+        // give higher pref to first key in mapping.json in case of same value
+        if (
+          setVal !== null &&
+          setVal !== undefined &&
+          (existingVal === null || existingVal === undefined)
+        ) {
+          set(this, destKey, setVal);
+        }
+      });
+    });
+  }
+ 
+  setPropertiesV2(event, mappingJson) {
+    mappingJson.forEach(mapping => {
+      const { sourceKeys } = mapping;
+      let { destKeys } = mapping;
+      const setVal = getValueFromMessage(event, sourceKeys);
+      Eif (!Array.isArray(destKeys)) {
+        destKeys = [destKeys];
+      }
+      destKeys.forEach(destKey => {
+        const existingVal = get(this, destKey);
+        // do not set if val setVal nil
+        // give higher pref to first key in mapping.json in case of same value
+        if (
+          setVal !== null &&
+          setVal !== undefined &&
+          (existingVal === null || existingVal === undefined)
+        ) {
+          set(this, destKey, setVal);
+        }
+      });
+    });
+  }
+ 
+  setTimestamp(timestamp) {
+    this.timestamp = timestamp;
+  }
+}
+ 
+module.exports = Message;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/segment/index.html b/coverage/lcov-report/rudder-transformer/v0/sources/segment/index.html new file mode 100644 index 00000000000..46cc615c576 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/segment/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/segment + + + + + + + + + +
+
+

All files rudder-transformer/v0/sources/segment

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
transform.js +
+
100%2/2100%0/0100%1/1100%2/2
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/segment/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/segment/transform.js.html new file mode 100644 index 00000000000..825a9fcf974 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/segment/transform.js.html @@ -0,0 +1,95 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/segment/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/segment transform.js

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6  +1x +  +  +1x + 
function process(events) {
+  return events;
+}
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/shopify/config.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/shopify/config.js.html new file mode 100644 index 00000000000..893d4ae859e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/shopify/config.js.html @@ -0,0 +1,428 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/shopify/config.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/shopify config.js

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +1171x +1x +1x +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +  +  +1x +  +1x +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +  +  + 
const path = require("path");
+const fs = require("fs");
+const { EventType } = require("../../../constants");
+ 
+const IDENTIFY_TOPICS = {
+  CUSTOMERS_CREATE: "customers_create",
+  CUSTOMERS_UPDATE: "customers_update"
+};
+ 
+// Mapping from shopify_topic name for ecom events
+const ECOM_TOPICS = {
+  CHECKOUTS_CREATE: "checkouts_create",
+  CHECKOUTS_UPDATE: "checkouts_update",
+  ORDERS_UPDATE: "orders_updated",
+  ORDERS_CREATE: "orders_create"
+};
+ 
+const RUDDER_ECOM_MAP = {
+  checkouts_create: "Checkout Started",
+  checkouts_update: "Checkout Updated",
+  orders_updated: "Order Updated",
+  orders_create: "Order Created"
+};
+ 
+const SHOPIFY_TRACK_MAP = {
+  checkout_delete: "Checkout Deleted",
+  carts_create: "Cart Create",
+  carts_update: "Cart Update",
+  fulfillments_create: "Fulfillments Create",
+  fulfillments_update: "Fulfillments Update",
+  orders_delete: "Order Deleted",
+  orders_edited: "Order Edited",
+  orders_cancelled: "Order Cancelled",
+  orders_fulfilled: "Order Fulfilled",
+  orders_paid: "Order Paid",
+  orders_partially_fullfilled: "Order Partially Fulfilled"
+};
+ 
+const identifyMappingJSON = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "data", "identifyMapping.json"))
+);
+ 
+const productMappingJSON = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "data", "productMapping.json"))
+);
+ 
+const lineItemsMappingJSON = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, "data", "lineItemsMapping.json"))
+);
+ 
+const INTEGERATION = "SHOPIFY";
+ 
+const MAPPING_CATEGORIES = {
+  [EventType.IDENTIFY]: identifyMappingJSON,
+  [EventType.TRACK]: productMappingJSON
+};
+ 
+const LINE_ITEM_EXCLUSION_FIELDS = [
+  "product_id",
+  "sku",
+  "name",
+  "price",
+  "vendor",
+  "quantity",
+  "variant_id",
+  "variant_price",
+  "variant_title"
+];
+ 
+const PRODUCT_MAPPING_EXCLUSION_FIELDS = [
+  "id",
+  "total_price",
+  "total_tax",
+  "currency",
+  "line_items",
+  "customer",
+  "shipping_address",
+  "billing_address"
+];
+ 
+/**
+ * list of events name supported as generic track calls
+ * track events not belonging to this list or ecom events will
+ * be discarded.
+ */
+const SUPPORTED_TRACK_EVENTS = [
+  "checkouts_delete",
+  "checkouts_update",
+  "customers_disabled",
+  "customers_enable",
+  "carts_create",
+  "carts_update",
+  "fulfillments_create",
+  "fulfillments_update",
+  "orders_create",
+  "orders_delete",
+  "orders_edited",
+  "orders_cancelled",
+  "orders_fulfilled",
+  "orders_paid",
+  "orders_partially_fullfilled"
+];
+ 
+module.exports = {
+  ECOM_TOPICS,
+  IDENTIFY_TOPICS,
+  INTEGERATION,
+  MAPPING_CATEGORIES,
+  RUDDER_ECOM_MAP,
+  lineItemsMappingJSON,
+  productMappingJSON,
+  LINE_ITEM_EXCLUSION_FIELDS,
+  PRODUCT_MAPPING_EXCLUSION_FIELDS,
+  SUPPORTED_TRACK_EVENTS,
+  SHOPIFY_TRACK_MAP
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/shopify/index.html b/coverage/lcov-report/rudder-transformer/v0/sources/shopify/index.html new file mode 100644 index 00000000000..a1ce2481856 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/shopify/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/shopify + + + + + + + + + +
+
+

All files rudder-transformer/v0/sources/shopify

+
+ +
+ 94.29% + Statements + 132/140 +
+ + +
+ 73.77% + Branches + 45/61 +
+ + +
+ 100% + Functions + 15/15 +
+ + +
+ 94.29% + Lines + 132/140 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
config.js +
+
100%16/16100%0/0100%0/0100%16/16
transform.js +
+
95.06%77/8173.17%30/41100%8/895.06%77/81
util.js +
+
90.7%39/4375%15/20100%7/790.7%39/43
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/shopify/transform.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/shopify/transform.js.html new file mode 100644 index 00000000000..0ed6b4687ad --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/shopify/transform.js.html @@ -0,0 +1,575 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/shopify/transform.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/shopify transform.js

+
+ +
+ 95.06% + Statements + 77/81 +
+ + +
+ 73.17% + Branches + 30/41 +
+ + +
+ 100% + Functions + 8/8 +
+ + +
+ 95.06% + Lines + 77/81 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +1661x +  +  +  +  +  +1x +  +  +  +  +1x +1x +1x +  +  +  +  +  +  +  +1x +  +1x +1x +1x +1x +1x +  +1x +  +1x +  +  +1x +1x +1x +1x +  +1x +1x +1x +64x +  +  +1x +1x +1x +  +  +  +  +1x +  +  +1x +  +1x +1x +  +  +  +  +1x +  +  +1x +  +  +1x +  +  +  +1x +  +  +1x +2x +2x +2x +2x +  +  +42x +  +  +  +  +  +  +  +  +  +37x +  +2x +2x +2x +2x +1x +  +  +  +  +2x +1x +  +2x +1x +  +2x +  +  +2x +  +  +1x +  +5x +5x +  +5x +  +  +1x +1x +  +  +  +  +1x +1x +  +3x +1x +  +2x +2x +  +  +4x +2x +  +4x +1x +1x +1x +  +  +4x +4x +4x +  +  +  +4x +4x +  +  +1x +5x +4x +  +  +1x + 
const get = require("get-value");
+const {
+  getShopifyTopic,
+  createPropertiesForEcomEvent,
+  getProductsListFromLineItems,
+  extractEmailFromPayload
+} = require("./util");
+const {
+  generateUUID,
+  CustomError,
+  removeUndefinedAndNullValues
+} = require("../../util");
+const Message = require("../message");
+const { EventType } = require("../../../constants");
+const {
+  INTEGERATION,
+  MAPPING_CATEGORIES,
+  IDENTIFY_TOPICS,
+  ECOM_TOPICS,
+  RUDDER_ECOM_MAP,
+  SUPPORTED_TRACK_EVENTS
+} = require("./config");
+ 
+const identifyPayloadBuilder = event => {
+  const message = new Message(INTEGERATION);
+  message.setEventType(EventType.IDENTIFY);
+  message.setPropertiesV2(event, MAPPING_CATEGORIES[EventType.IDENTIFY]);
+  Eif (event.updated_at) {
+    // converting shopify updated_at timestamp to rudder timestamp format
+    message.setTimestamp(new Date(event.updated_at).toISOString());
+  }
+  return message;
+};
+ 
+const ecomPayloadBuilder = (event, shopifyTopic) => {
+  const message = new Message(INTEGERATION);
+  message.setEventType(EventType.TRACK);
+  message.setEventName(RUDDER_ECOM_MAP[shopifyTopic]);
+ 
+  let properties = createPropertiesForEcomEvent(event);
+  properties = removeUndefinedAndNullValues(properties);
+  Object.keys(properties).forEach(key =>
+    message.setProperty(`properties.${key}`, properties[key])
+  );
+  // Map Customer details if present
+  const customerDetails = get(event, "customer");
+  Eif (customerDetails) {
+    message.setPropertiesV2(
+      customerDetails,
+      MAPPING_CATEGORIES[EventType.IDENTIFY]
+    );
+  }
+  Eif (event.updated_at) {
+    // TODO: look for created_at for checkout_create?
+    // converting shopify updated_at timestamp to rudder timestamp format
+    message.setTimestamp(new Date(event.updated_at).toISOString());
+  }
+  Eif (event.customer) {
+    message.setPropertiesV2(
+      event.customer,
+      MAPPING_CATEGORIES[EventType.IDENTIFY]
+    );
+  }
+  Iif (event.shipping_address) {
+    message.setProperty("traits.shippingAddress", event.shipping_address);
+  }
+  Iif (event.billing_address) {
+    message.setProperty("traits.billingAddress", event.billing_address);
+  }
+  Iif (!message.userId && event.user_id) {
+    message.setProperty("userId", event.user_id);
+  }
+ 
+  return message;
+};
+ 
+const trackPayloadBuilder = (event, shopifyTopic) => {
+  const message = new Message(INTEGERATION);
+  message.setEventType(EventType.TRACK);
+  message.setEventName(shopifyTopic);
+  Object.keys(event)
+    .filter(
+      key =>
+        ![
+          "type",
+          "event",
+          "line_items",
+          "customer",
+          "shipping_address",
+          "billing_address"
+        ].includes(key)
+    )
+    .forEach(key => {
+      message.setProperty(`properties.${key}`, event[key]);
+    });
+  const { line_items: lineItems } = event;
+  const productsList = getProductsListFromLineItems(lineItems);
+  message.setProperty("properties.products", productsList);
+  if (event.customer) {
+    message.setPropertiesV2(
+      event.customer,
+      MAPPING_CATEGORIES[EventType.IDENTIFY]
+    );
+  }
+  if (event.shipping_address) {
+    message.setProperty("traits.shippingAddress", event.shipping_address);
+  }
+  if (event.billing_address) {
+    message.setProperty("traits.billingAddress", event.billing_address);
+  }
+  Iif (!message.userId && event.user_id) {
+    message.setProperty("userId", event.user_id);
+  }
+  return message;
+};
+ 
+const processEvent = event => {
+  let message;
+  const shopifyTopic = getShopifyTopic(event);
+  delete event.query_parameters;
+ 
+  switch (shopifyTopic) {
+    case IDENTIFY_TOPICS.CUSTOMERS_CREATE:
+    case IDENTIFY_TOPICS.CUSTOMERS_UPDATE:
+      message = identifyPayloadBuilder(event);
+      break;
+    case ECOM_TOPICS.ORDERS_CREATE:
+    case ECOM_TOPICS.ORDERS_UPDATE:
+    case ECOM_TOPICS.CHECKOUTS_CREATE:
+    case ECOM_TOPICS.CHECKOUTS_UPDATE:
+      message = ecomPayloadBuilder(event, shopifyTopic);
+      break;
+    default:
+      if (!SUPPORTED_TRACK_EVENTS.includes(shopifyTopic)) {
+        throw new CustomError(`event type ${shopifyTopic} not supported`, 400);
+      }
+      message = trackPayloadBuilder(event, shopifyTopic);
+      break;
+  }
+ 
+  if (message.userId) {
+    message.userId = String(message.userId);
+  }
+  if (!get(message, "traits.email")) {
+    const email = extractEmailFromPayload(event);
+    Eif (email) {
+      message.setProperty("traits.email", email);
+    }
+  }
+  message.setProperty("anonymousId", generateUUID());
+  message.setProperty(`integrations.${INTEGERATION}`, true);
+  message.setProperty("context.library", {
+    name: "RudderStack Shopify Cloud",
+    version: "1.0.0"
+  });
+  message = removeUndefinedAndNullValues(message);
+  return message;
+};
+ 
+const process = event => {
+  const response = processEvent(event);
+  return response;
+};
+ 
+exports.process = process;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/sources/shopify/util.js.html b/coverage/lcov-report/rudder-transformer/v0/sources/shopify/util.js.html new file mode 100644 index 00000000000..e91f356e4cd --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/sources/shopify/util.js.html @@ -0,0 +1,359 @@ + + + + + + Code coverage report for rudder-transformer/v0/sources/shopify/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/sources/shopify util.js

+
+ +
+ 90.7% + Statements + 39/43 +
+ + +
+ 75% + Branches + 15/20 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 90.7% + Lines + 39/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94  +  +  +  +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +  +1x +5x +5x +5x +  +  +5x +5x +  +  +  +  +  +  +5x +  +  +5x +  +  +1x +3x +3x +  +  +1x +3x +  +  +3x +3x +3x +3x +3x +3x +  +3x +  +  +1x +1x +1x +1x +1x +  +  +  +  +  +1x +1x +  +  +1x +1x +  +1x +1x +4x +1x +1x +  +3x +  +1x +  +  +1x +  +  +  +  +  + 
/* eslint-disable camelcase */
+const {
+  CustomError,
+  constructPayload,
+  extractCustomFields,
+  flattenJson
+} = require("../../util");
+const {
+  lineItemsMappingJSON,
+  productMappingJSON,
+  LINE_ITEM_EXCLUSION_FIELDS,
+  PRODUCT_MAPPING_EXCLUSION_FIELDS
+} = require("./config");
+ 
+/**
+ * query_parameters : { topic: ['<shopify_topic>'], ...}
+ * Throws error otherwise
+ * @param {*} event
+ * @returns
+ */
+const getShopifyTopic = event => {
+  const { query_parameters: qParams } = event;
+  console.log("query_params", qParams);
+  Iif (!qParams) {
+    throw new CustomError("[Shopify Source] query_parameters is missing", 400);
+  }
+  const { topic } = qParams;
+  Iif (!topic || !Array.isArray(topic)) {
+    throw new CustomError(
+      "[Shopify Source] invalid topic in query_parameters",
+      400
+    );
+  }
+ 
+  Iif (topic.length === 0) {
+    throw new CustomError("[Shopify Source] topic not found", 400);
+  }
+  return topic[0];
+};
+ 
+const getVariantString = lineItem => {
+  const { variant_id, variant_price, variant_title } = lineItem;
+  return `${variant_id || ""} ${variant_price || ""} ${variant_title || ""}`;
+};
+ 
+const getProductsListFromLineItems = lineItems => {
+  Iif (!lineItems || lineItems.length === 0) {
+    return [];
+  }
+  const products = [];
+  lineItems.forEach(lineItem => {
+    const product = constructPayload(lineItem, lineItemsMappingJSON);
+    extractCustomFields(lineItem, product, "root", LINE_ITEM_EXCLUSION_FIELDS);
+    product.variant = getVariantString(lineItem);
+    products.push(product);
+  });
+  return products;
+};
+ 
+const createPropertiesForEcomEvent = message => {
+  const { line_items: lineItems } = message;
+  const productsList = getProductsListFromLineItems(lineItems);
+  const mappedPayload = constructPayload(message, productMappingJSON);
+  extractCustomFields(
+    message,
+    mappedPayload,
+    "root",
+    PRODUCT_MAPPING_EXCLUSION_FIELDS
+  );
+  mappedPayload.products = productsList;
+  return mappedPayload;
+};
+ 
+const extractEmailFromPayload = event => {
+  const flattenedPayload = flattenJson(event);
+  let email;
+  const regex_email = new RegExp("\\bemail\\b", "i");
+  Object.entries(flattenedPayload).some(([key, value]) => {
+    if (regex_email.test(key)) {
+      email = value;
+      return true;
+    }
+    return false;
+  });
+  return email;
+};
+ 
+module.exports = {
+  getShopifyTopic,
+  getProductsListFromLineItems,
+  createPropertiesForEcomEvent,
+  extractEmailFromPayload
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/util/cache.js.html b/coverage/lcov-report/rudder-transformer/v0/util/cache.js.html new file mode 100644 index 00000000000..802e8536d56 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/util/cache.js.html @@ -0,0 +1,164 @@ + + + + + + Code coverage report for rudder-transformer/v0/util/cache.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/util cache.js

+
+ +
+ 100% + Statements + 10/10 +
+ + +
+ 75% + Branches + 3/4 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 10/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +292x +  +  +  +6x +  +  +  +  +  +  +  +21x +21x +13x +  +  +8x +  +7x +7x +  +7x +  +  +  +  +2x + 
const NodeCache = require("node-cache");
+ 
+class Cache {
+  constructor(ttlSeconds) {
+    this.cache = new NodeCache({
+      stdTTL: ttlSeconds,
+      checkperiod: ttlSeconds * 0.2,
+      useClones: false
+    });
+  }
+ 
+  get(key, storeFunction) {
+    const value = this.cache.get(key);
+    if (value) {
+      return Promise.resolve(value);
+    }
+ 
+    return storeFunction().then(result => {
+      // store in cache if the value is valid, else skip
+      Eif (result) {
+        this.cache.set(key, result);
+      }
+      return result;
+    });
+  }
+}
+ 
+module.exports = Cache;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/util/constant.js.html b/coverage/lcov-report/rudder-transformer/v0/util/constant.js.html new file mode 100644 index 00000000000..992a0a777bb --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/util/constant.js.html @@ -0,0 +1,245 @@ + + + + + + Code coverage report for rudder-transformer/v0/util/constant.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/util constant.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 50% + Branches + 2/4 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +5670x +  +  +  +70x +  +  +  +70x +  +70x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +70x +  +  +  +  +  + 
const USER_LEAD_CACHE_TTL = process.env.MARKETO_LEAD_CACHE_TTL
+  ? parseInt(process.env.MARKETO_LEAD_CACHE_TTL, 10)
+  : 24 * 60 * 60;
+ 
+const AUTH_CACHE_TTL = process.env.MARKETO_AUTH_CACHE_TTL
+  ? parseInt(process.env.MARKETO_AUTH_CACHE_TTL, 10)
+  : 60 * 60;
+ 
+const API_CALL = "api_call_count";
+ 
+const TRANSFORMER_METRIC = {
+  MEASUREMENT: {
+    INTEGRATION_ERROR_METRIC: "integration_error_metric"
+  },
+  TRANSFORMER_STAGE: {
+    TRANSFORM: "transform",
+    RESPONSE_TRANSFORM: "responseTransform"
+  },
+  MEASUREMENT_TYPE: {
+    API: {
+      SCOPE: "api",
+      META: {
+        ABORTABLE: "abortable",
+        RETRYABLE: "retryable",
+        THROTTLED: "throttled",
+        SUCCESS: "success"
+      }
+    },
+    TRANSFORMATION: {
+      SCOPE: "transformation",
+      META: {
+        BAD_EVENT: "badEvent",
+        BAD_PARAM: "badParam",
+        INSTRUMENTATION: "instrumentation",
+        CONFIGURATION: "configuration"
+      }
+    },
+    AUTHENTICATION: {
+      SCOPE: "authentication"
+    },
+    EXCEPTION: {
+      SCOPE: "exception"
+    },
+    DEFAULT: {
+      SCOPE: "default"
+    }
+  }
+};
+ 
+module.exports = {
+  API_CALL,
+  AUTH_CACHE_TTL,
+  TRANSFORMER_METRIC,
+  USER_LEAD_CACHE_TTL
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/util/error.js.html b/coverage/lcov-report/rudder-transformer/v0/util/error.js.html new file mode 100644 index 00000000000..5e5786c0e2d --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/util/error.js.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for rudder-transformer/v0/util/error.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/util error.js

+
+ +
+ 84.62% + Statements + 22/26 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 77.78% + Functions + 7/9 +
+ + +
+ 84% + Lines + 21/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48  +  +28x +28x +  +28x +28x +28x +  +28x +28x +28x +  +  +28x +1x +1x +  +  +28x +1x +1x +  +  +28x +  +  +  +  +  +  +  +28x +12x +12x +  +  +  +28x +  +  +  +  +28x +  +  +14x + 
// Todo add documentation for internal functions
+function ErrorBuilder() {
+  this.err = new Error();
+  this.err.isExpected = true;
+ 
+  this.setMessage = message => {
+    this.err.message = message;
+    return this;
+  };
+  this.setStatus = status => {
+    this.err.status = status;
+    return this;
+  };
+ 
+  this.setDestinationResponse = destinationResponse => {
+    this.err.destinationResponse = destinationResponse;
+    return this;
+  };
+ 
+  this.isTransformResponseFailure = arg => {
+    this.err.responseTransformFailure = arg;
+    return this;
+  };
+ 
+  this.setErrorResponse = () => {
+    this.err.response = {
+      status: this.err.status,
+      message: this.err.message
+    };
+    return this;
+  };
+ 
+  this.setStatTags = arg => {
+    this.err.statTags = arg;
+    return this;
+  };
+ 
+  // Used for only OAuth related destinations
+  this.setAuthErrorCategory = errorCat => {
+    this.err.authErrorCategory = errorCat;
+    return this;
+  };
+ 
+  this.build = () => this.err;
+}
+ 
+module.exports = ErrorBuilder;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/util/index.html b/coverage/lcov-report/rudder-transformer/v0/util/index.html new file mode 100644 index 00000000000..7c98db86527 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/util/index.html @@ -0,0 +1,156 @@ + + + + + + Code coverage report for rudder-transformer/v0/util + + + + + + + + + +
+
+

All files rudder-transformer/v0/util

+
+ +
+ 80.04% + Statements + 397/496 +
+ + +
+ 66.56% + Branches + 213/320 +
+ + +
+ 81.65% + Functions + 89/109 +
+ + +
+ 79.75% + Lines + 378/474 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
cache.js +
+
100%10/1075%3/4100%3/3100%10/10
constant.js +
+
100%5/550%2/4100%0/0100%5/5
error.js +
+
84.62%22/26100%0/077.78%7/984%21/25
index.js +
+
79.12%360/45566.67%208/31281.44%79/9778.8%342/434
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/v0/util/index.js.html b/coverage/lcov-report/rudder-transformer/v0/util/index.js.html new file mode 100644 index 00000000000..bf84eab5eba --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/v0/util/index.js.html @@ -0,0 +1,3992 @@ + + + + + + Code coverage report for rudder-transformer/v0/util/index.js + + + + + + + + + +
+
+

All files / rudder-transformer/v0/util index.js

+
+ +
+ 79.12% + Statements + 360/455 +
+ + +
+ 66.67% + Branches + 208/312 +
+ + +
+ 81.44% + Functions + 79/97 +
+ + +
+ 78.8% + Lines + 342/434 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015 +1016 +1017 +1018 +1019 +1020 +1021 +1022 +1023 +1024 +1025 +1026 +1027 +1028 +1029 +1030 +1031 +1032 +1033 +1034 +1035 +1036 +1037 +1038 +1039 +1040 +1041 +1042 +1043 +1044 +1045 +1046 +1047 +1048 +1049 +1050 +1051 +1052 +1053 +1054 +1055 +1056 +1057 +1058 +1059 +1060 +1061 +1062 +1063 +1064 +1065 +1066 +1067 +1068 +1069 +1070 +1071 +1072 +1073 +1074 +1075 +1076 +1077 +1078 +1079 +1080 +1081 +1082 +1083 +1084 +1085 +1086 +1087 +1088 +1089 +1090 +1091 +1092 +1093 +1094 +1095 +1096 +1097 +1098 +1099 +1100 +1101 +1102 +1103 +1104 +1105 +1106 +1107 +1108 +1109 +1110 +1111 +1112 +1113 +1114 +1115 +1116 +1117 +1118 +1119 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1155 +1156 +1157 +1158 +1159 +1160 +1161 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1217 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1231 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305  +  +  +  +  +  +  +70x +  +70x +70x +70x +70x +70x +70x +70x +70x +70x +70x +  +  +70x +70x +70x +  +  +  +  +15595x +576x +9274x +13028x +70x +584x +311x +70x +1368x +70x +7x +70x +70x +  +  +  +  +  +70x +11x +11x +  +6x +  +  +  +70x +11x +  +  +70x +  +  +  +  +  +  +  +  +  +  +  +  +  +70x +  +  +  +  +  +  +  +  +  +  +70x +81x +24x +  +  +  +371x +  +  +  +  +  +  +  +  +243x +5x +5x +  +238x +  +  +  +70x +  +  +  +  +  +242x +242x +216x +333x +325x +  +  +  +242x +  +  +  +  +70x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +101x +  +  +  +  +  +1364x +1097x +267x +40x +69x +  +40x +3x +  +  +227x +227x +1194x +1194x +  +227x +  +  +  +101x +101x +  +  +  +  +70x +4x +4x +3x +  +  +3x +3x +3x +3x +3x +  +3x +  +1x +  +  +  +  +70x +  +  +  +  +  +  +  +  +  +  +  +  +70x +93x +  +93x +11x +  +  +  +82x +  +  +70x +87x +  +  +  +70x +3x +  +  +  +  +3x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +70x +  +  +  +  +  +70x +  +  +  +  +  +70x +  +  +  +  +  +70x +  +  +  +  +  +  +  +  +70x +1080x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +70x +30x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +70x +  +  +  +  +  +100x +  +  +  +  +  +  +  +  +  +  +70x +  +  +  +  +  +  +6x +  +  +  +  +  +70x +  +  +  +  +  +  +  +  +70x +  +  +  +  +  +70x +174x +39x +  +135x +  +  +  +  +70x +46x +46x +46x +232x +232x +  +  +  +46x +  +  +  +  +70x +  +  +  +  +  +  +  +  +70x +11475x +5828x +  +  +  +  +  +5828x +11996x +11996x +  +  +3726x +  +  +5647x +  +  +5647x +  +  +  +  +  +2102x +  +  +  +  +  +  +  +  +70x +2160x +2160x +2156x +  +4x +  +  +  +  +  +  +  +  +70x +8694x +7740x +  +  +  +  +  +  +  +  +  +  +  +954x +  +  +954x +455x +  +  +499x +  +  +499x +380x +  +38x +38x +  +44x +  +  +44x +  +4x +4x +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +8x +  +13x +  +  +  +  +3x +  +13x +13x +1x +  +12x +  +70x +70x +  +108x +108x +  +  +  +  +2x +2x +  +84x +  +  +  +84x +  +3x +3x +  +4x +4x +  +2x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +498x +12x +12x +  +  +  +498x +22x +  +22x +167x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +498x +71x +71x +71x +141x +  +  +  +  +  +  +  +  +  +  +  +141x +70x +70x +70x +  +  +  +  +  +71x +  +  +498x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +498x +  +  +  +  +  +70x +891x +891x +891x +4427x +  +  +  +4427x +7x +  +  +  +884x +  +  +  +70x +  +1087x +  +  +  +  +1087x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +1087x +  +  +  +  +  +  +8694x +  +  +8694x +  +  +8694x +  +  +  +  +  +  +  +8693x +4700x +  +4687x +  +  +13x +  +3993x +  +11x +  +  +  +  +  +1075x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +370x +370x +370x +67x +  +370x +67x +79x +51x +  +  +  +370x +  +  +  +  +70x +9x +9x +9x +9x +2x +  +9x +9x +2x +2x +2x +2x +  +  +  +9x +  +  +70x +80x +80x +  +  +  +  +  +  +70x +  +  +  +  +  +31x +31x +  +  +  +5x +5x +5x +  +  +  +5x +  +5x +5x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +3x +3x +  +2x +2x +2x +2x +  +  +  +3x +  +  +  +  +38x +38x +38x +  +  +  +  +18x +18x +18x +18x +18x +18x +18x +18x +18x +18x +  +  +  +  +  +  +  +8x +7x +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +14x +14x +14x +14x +7x +  +14x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +219x +219x +211x +267x +267x +157x +1202x +  +157x +616x +616x +  +  +  +  +8x +8x +184x +  +8x +137x +137x +  +  +  +  +  +  +219x +  +  +  +  +  +16x +6x +  +10x +10x +  +10x +  +  +  +  +  +  +  +10x +  +  +  +  +  +7x +7x +131x +131x +131x +  +  +  +  +  +  +  +245x +  +131x +  +7x +  +  +  +  +  +  +  +  +  +  +4x +4x +  +14x +14x +  +  +4x +  +  +70x +  +  +  +  +  +  +  +  +100x +10x +  +  +  +  +43x +43x +43x +43x +88x +  +43x +  +  +  +  +  +16x +16x +16x +  +  +  +  +  +70x +4x +4x +4x +  +  +  +  +188x +188x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +8x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +11x +11x +  +  +  +  +  +11x +341x +341x +341x +  +  +  +70x +  +  +  +  +70x +  +  +  +  +  +  +  +  +48x +48x +  +  +  +36x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +46x +47x +  +  +  +  +46x +1x +  +  +  +  +46x +  +  +  +  +  +  +70x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// ========================================================================
+// Make sure you are putting any new method in relevant section
+// INLINERS ==> Inline methods
+// REQUEST FORMATS ==> Various request formats to format the final response
+// TRANSFORMER UTILITIES ==> Utility methods having dependency on event/message
+// GENERIC ==> Other methods which doesn't fit in other categories
+// ========================================================================
+const Handlebars = require("handlebars");
+ 
+const fs = require("fs");
+const path = require("path");
+const _ = require("lodash");
+const set = require("set-value");
+const get = require("get-value");
+const uaParser = require("ua-parser-js");
+const moment = require("moment-timezone");
+const sha256 = require("sha256");
+const logger = require("../../logger");
+const stats = require("../../util/stats");
+const {
+  DestCanonicalNames
+} = require("../../constants/destinationCanonicalNames");
+const { TRANSFORMER_METRIC } = require("./constant");
+const { cdkEnabled } = require("../../features.json");
+// ========================================================================
+// INLINERS
+// ========================================================================
+ 
+const isDefined = x => !_.isUndefined(x);
+const isNotEmpty = x => !_.isEmpty(x);
+const isNotNull = x => x != null;
+const isDefinedAndNotNull = x => isDefined(x) && isNotNull(x);
+const isDefinedAndNotNullAndNotEmpty = x =>
+  isDefined(x) && isNotNull(x) && isNotEmpty(x);
+const removeUndefinedValues = obj => _.pickBy(obj, isDefined);
+const removeNullValues = obj => _.pickBy(obj, isNotNull);
+const removeUndefinedAndNullValues = obj => _.pickBy(obj, isDefinedAndNotNull);
+const removeUndefinedAndNullAndEmptyValues = obj =>
+  _.pickBy(obj, isDefinedAndNotNullAndNotEmpty);
+const isBlank = value => _.isEmpty(_.toString(value));
+const flattenMap = collection => _.flatMap(collection, x => x);
+// ========================================================================
+// GENERIC UTLITY
+// ========================================================================
+ 
+// return a valid URL object if correct else null
+const isValidUrl = url => {
+  try {
+    return new URL(url);
+  } catch (err) {
+    return null;
+  }
+};
+ 
+const stripTrailingSlash = str => {
+  return str && str.endsWith("/") ? str.slice(0, -1) : str;
+};
+ 
+const isPrimitive = arg => {
+  const type = typeof arg;
+  return arg == null || (type !== "object" && type !== "function");
+};
+ 
+/**
+ *
+ * @param {*} arg
+ * @returns {type}
+ *
+ * Returns type of passed arg
+ * for null argss returns "NULL" insted of "object"
+ *
+ */
+const getType = arg => {
+  const type = typeof arg;
+  if (arg == null) {
+    return "NULL";
+  }
+  if (Array.isArray(arg)) {
+    return "array";
+  }
+  return type;
+};
+ 
+const formatValue = value => {
+  if (!value || value < 0) return null;
+  return Math.round(value);
+};
+ 
+function isEmpty(input) {
+  return _.isEmpty(_.toString(input).trim());
+}
+ 
+/**
+ * Returns true for empty object {}
+ * @param {*} obj
+ * @returns
+ */
+function isEmptyObject(obj) {
+  if (!obj) {
+    logger.warn("input is undefined or null");
+    return true;
+  }
+  return Object.keys(obj).length === 0;
+}
+ 
+// Format the destination.Config.dynamicMap arrays to hashMap
+const getHashFromArray = (
+  arrays,
+  fromKey = "from",
+  toKey = "to",
+  isLowerCase = true
+) => {
+  const hashMap = {};
+  if (Array.isArray(arrays)) {
+    arrays.forEach(array => {
+      if (isEmpty(array[fromKey])) return;
+      hashMap[isLowerCase ? array[fromKey].toLowerCase() : array[fromKey]] =
+        array[toKey];
+    });
+  }
+  return hashMap;
+};
+ 
+// NEED to decouple value finding and `required` checking
+// NEED TO DEPRECATE
+const setValues = (payload, message, mappingJson) => {
+  if (Array.isArray(mappingJson)) {
+    let val;
+    let sourceKeys;
+    mappingJson.forEach(mapping => {
+      val = undefined;
+      sourceKeys = mapping.sourceKeys;
+      if (Array.isArray(sourceKeys) && sourceKeys.length > 0) {
+        for (let index = 0; index < sourceKeys.length; index += 1) {
+          val = get(message, sourceKeys[index]);
+          if (val) {
+            break;
+          }
+        }
+        if (val) {
+          set(payload, mapping.destKey, val);
+        } else if (mapping.required) {
+          throw new Error(
+            `One of ${JSON.stringify(mapping.sourceKeys)} is required`
+          );
+        }
+      }
+    });
+  }
+  return payload;
+};
+ 
+// function to flatten a json
+function flattenJson(data) {
+  const result = {};
+  let l;
+ 
+  // a recursive function to loop through the array of the data
+  function recurse(cur, prop) {
+    let i;
+    if (Object(cur) !== cur) {
+      result[prop] = cur;
+    } else if (Array.isArray(cur)) {
+      for (i = 0, l = cur.length; i < l; i += 1) {
+        recurse(cur[i], `${prop}[${i}]`);
+      }
+      if (l === 0) {
+        result[prop] = [];
+      }
+    } else {
+      let isEmptyFlag = true;
+      Object.keys(cur).forEach(key => {
+        isEmptyFlag = false;
+        recurse(cur[key], prop ? `${prop}.${key}` : key);
+      });
+      if (isEmptyFlag && prop) result[prop] = {};
+    }
+  }
+ 
+  recurse(data, "");
+  return result;
+}
+ 
+// Get the offset value in Seconds for timezone
+ 
+const getOffsetInSec = value => {
+  const name = moment.tz.zone(value);
+  if (name) {
+    const x = moment()
+      .tz(value)
+      .format("Z");
+    const split = x.split(":");
+    const hour = Number(split[0]);
+    const min = Number(split[1]);
+    let sec = 0;
+    sec =
+      hour < 0 ? -1 * (hour * -60 * 60 + min * 60) : hour * 60 * 60 + min * 60;
+    return sec;
+  }
+  return undefined;
+};
+// Important !@!
+// format date in yyyymmdd format
+// NEED TO DEPRECATE
+const getDateInFormat = date => {
+  const x = new Date(date);
+  const y = x.getFullYear().toString();
+  let m = (x.getMonth() + 1).toString();
+  let d = x.getDate().toString();
+  d = d.length === 1 ? d : `0${d}`;
+  m = m.length === 1 ? m : `0${m}`;
+  const yyyymmdd = y + m + d;
+  return yyyymmdd;
+};
+ 
+// Important !@!
+// Generic timestamp formatter
+const formatTimeStamp = (dateStr, format) => {
+  const date = new Date(dateStr);
+  // moment format is passed. format accordingly
+  if (format) {
+    return moment.utc(date).format(format);
+  }
+ 
+  // return default format
+  return date.getTime();
+};
+ 
+const hashToSha256 = value => {
+  return sha256(value);
+};
+ 
+// Check what type of gender and convert to f or m
+const getFbGenderVal = gender => {
+  Eif (
+    gender.toUpperCase() === "FEMALE" ||
+    gender.toUpperCase() === "F" ||
+    gender.toUpperCase() === "WOMAN"
+  ) {
+    return hashToSha256("f");
+  }
+  if (
+    gender.toUpperCase() === "MALE" ||
+    gender.toUpperCase() === "M" ||
+    gender.toUpperCase() === "MAN"
+  ) {
+    return hashToSha256("m");
+  }
+  return null;
+};
+ 
+// ========================================================================
+// REQUEST FORMAT METHODS
+// ========================================================================
+ 
+// GET
+const defaultGetRequestConfig = {
+  requestFormat: "PARAMS",
+  requestMethod: "GET"
+};
+ 
+// POST
+const defaultPostRequestConfig = {
+  requestFormat: "JSON",
+  requestMethod: "POST"
+};
+ 
+// DELETE
+const defaultDeleteRequestConfig = {
+  requestFormat: "JSON",
+  requestMethod: "DELETE"
+};
+ 
+// PUT
+const defaultPutRequestConfig = {
+  requestFormat: "JSON",
+  requestMethod: "PUT"
+};
+ 
+// DEFAULT
+// TODO: add builder pattern to generate request and batchRequest
+// and set payload for JSON_ARRAY
+// JSON_ARRAY: { payload: [] }
+const defaultRequestConfig = () => {
+  return {
+    version: "1",
+    type: "REST",
+    method: "POST",
+    endpoint: "",
+    headers: {},
+    params: {},
+    body: {
+      JSON: {},
+      JSON_ARRAY: {},
+      XML: {},
+      FORM: {}
+    },
+    files: {}
+  };
+};
+ 
+// JSON_ARRAY: { payload: [] }
+const defaultBatchRequestConfig = () => {
+  return {
+    batchedRequest: {
+      version: "1",
+      type: "REST",
+      method: "POST",
+      endpoint: "",
+      headers: {},
+      params: {},
+      body: {
+        JSON: {},
+        JSON_ARRAY: {},
+        XML: {},
+        FORM: {}
+      },
+      files: {}
+    }
+  };
+};
+ 
+// Router transformer
+// Success responses
+const getSuccessRespEvents = (
+  message,
+  metadata,
+  destination,
+  batched = false
+) => {
+  return {
+    batchedRequest: message,
+    metadata,
+    batched,
+    statusCode: 200,
+    destination
+  };
+};
+ 
+// Router transformer
+// Error responses
+const getErrorRespEvents = (
+  metadata,
+  statusCode,
+  error,
+  statTags,
+  batched = false
+) => {
+  return { metadata, batched, statusCode, error, statTags };
+};
+ 
+// ========================================================================
+// Error Message UTILITIES
+// ========================================================================
+const ErrorMessage = {
+  TypeNotFound: "Invalid payload. Property Type is not present",
+  TypeNotSupported: "Message type not supported",
+  FailedToConstructPayload: "Payload could not be constructed"
+};
+ 
+// ========================================================================
+// TRANSFORMER UTILITIES
+// ========================================================================
+const MESSAGE_MAPPING = JSON.parse(
+  fs.readFileSync(path.resolve(__dirname, `./data/GenericFieldMapping.json`))
+);
+ 
+// Get the IP address from the message.
+// NEED TO DEPRECATE
+const getParsedIP = message => {
+  if (message.context && message.context.ip) {
+    return message.context.ip;
+  }
+  return message.request_ip;
+};
+ 
+// Important !@!
+// create the mappingConfig from data JSONs for destinations
+const getMappingConfig = (config, dir) => {
+  const mappingConfig = {};
+  const categoryKeys = Object.keys(config);
+  categoryKeys.forEach(categoryKey => {
+    const category = config[categoryKey];
+    mappingConfig[category.name] = JSON.parse(
+      fs.readFileSync(path.resolve(dir, `./data/${category.name}.json`))
+    );
+  });
+  return mappingConfig;
+};
+ 
+// NEED a better way to handle it. Only used in Autopilot and Intercom
+// NEED TO DEPRECATE
+const updatePayload = (currentKey, eventMappingArr, value, payload) => {
+  eventMappingArr.forEach(obj => {
+    if (obj.rudderKey === currentKey) {
+      set(payload, obj.expectedKey, value);
+    }
+  });
+  return payload;
+};
+ 
+const getValueFromMessage = (message, sourceKey) => {
+  if (Array.isArray(sourceKey) && sourceKey.length > 0) {
+    Iif (sourceKey.length === 1) {
+      logger.warn(
+        "List with single element is not ideal. Use it as string instead"
+      );
+    }
+    // got the possible sourceKeys
+    for (let index = 0; index < sourceKey.length; index += 1) {
+      const val = get(message, sourceKey[index]);
+      if (val || val === false || val === 0) {
+        // return only if the value is valid.
+        // else look for next possible source in precedence
+        return val;
+      }
+    }
+  } else Eif (typeof sourceKey === "string") {
+    // got a single key
+    // - we don't need to iterate over a loop for a single possible value
+    return get(message, sourceKey);
+  } else {
+    // wrong sourceKey type. abort
+    // DEVELOPER ERROR
+    throw new Error("Wrong sourceKey type or blank sourceKey array");
+  }
+  return null;
+};
+ 
+// get a field value from message.
+// if sourceFromGenericMap is true get its value from GenericFieldMapping.json and use it as sourceKey
+// else use sourceKey from `data/message.json` for actual field precedence
+// Example usage: getFieldValueFromMessage(message, "userId",true)
+//                This will return the first nonnull value from
+//                ["userId", "traits.userId", "traits.id", "context.traits.userId", "context.traits.id", "anonymousId"]
+const getFieldValueFromMessage = (message, sourceKey) => {
+  const sourceKeyMap = MESSAGE_MAPPING[sourceKey];
+  if (sourceKeyMap) {
+    return getValueFromMessage(message, sourceKeyMap);
+  }
+  return null;
+};
+ 
+// format the value as per the metadata values
+// Expected metadata keys are: (according to precedence)
+// - - type, typeFormat: expected data type and its format
+// - - template : need to have a handlebar expression {{value}}
+// - - excludes : fields you want to strip of from the final value (works only for object)
+// - - - - ex: "anonymousId", "userId" from traits
+const handleMetadataForValue = (value, metadata, integrationsObj = null) => {
+  if (!metadata) {
+    return value;
+  }
+ 
+  // get infor from metadata
+  const {
+    type,
+    typeFormat,
+    template,
+    defaultValue,
+    excludes,
+    multikeyMap,
+    allowedKeyCheck
+  } = metadata;
+ 
+  // if value is null and defaultValue is supplied - use that
+  if (!isDefinedAndNotNull(value)) {
+    return defaultValue || value;
+  }
+  // we've got a correct value. start processing
+  let formattedVal = value;
+ 
+  // handle type and format
+  if (type) {
+    switch (type) {
+      case "timestamp":
+        formattedVal = formatTimeStamp(formattedVal, typeFormat);
+        break;
+      case "secondTimestamp":
+        formattedVal = Math.floor(
+          formatTimeStamp(formattedVal, typeFormat) / 1000
+        );
+        break;
+      case "flatJson":
+        formattedVal = flattenJson(formattedVal);
+        break;
+      case "encodeURIComponent":
+        formattedVal = encodeURIComponent(JSON.stringify(formattedVal));
+        break;
+      case "jsonStringify":
+        formattedVal = JSON.stringify(formattedVal);
+        break;
+      case "jsonStringifyOnFlatten":
+        formattedVal = JSON.stringify(flattenJson(formattedVal));
+        break;
+      case "jsonStringifyOnObject":
+        // if already a string, will not stringify
+        // calling stringify on string will add escape characters
+        Iif (typeof formattedVal !== "string") {
+          formattedVal = JSON.stringify(formattedVal);
+        }
+        break;
+      case "numberForRevenue":
+        if (
+          (typeof formattedVal === "string" ||
+            formattedVal instanceof String) &&
+          formattedVal.charAt(0) === "$"
+        ) {
+          formattedVal = formattedVal.substring(1);
+        }
+        formattedVal = Number.parseFloat(Number(formattedVal || 0).toFixed(2));
+        if (Number.isNaN(formattedVal)) {
+          throw new Error("Revenue is not in the correct format");
+        }
+        break;
+      case "toString":
+        formattedVal = String(formattedVal);
+        break;
+      case "toNumber":
+        formattedVal = Number(formattedVal);
+        break;
+      case "toFloat":
+        formattedVal = parseFloat(formattedVal);
+        break;
+      case "toInt":
+        formattedVal = parseInt(formattedVal, 10);
+        break;
+      case "hashToSha256":
+        formattedVal =
+          integrationsObj && integrationsObj.hashed
+            ? String(formattedVal)
+            : hashToSha256(String(formattedVal));
+        break;
+      case "getFbGenderVal":
+        formattedVal = getFbGenderVal(formattedVal);
+        break;
+      case "getOffsetInSec":
+        formattedVal = getOffsetInSec(formattedVal);
+        break;
+      case "domainUrl":
+        formattedVal = formattedVal
+          .replace("https://", "")
+          .replace("http://", "");
+        break;
+      case "IsBoolean":
+        if (!(typeof formattedVal === "boolean")) {
+          logger.debug("Boolean value missing, so dropping it");
+        }
+        break;
+      default:
+        break;
+    }
+  }
+ 
+  // handle template
+  if (template) {
+    const hTemplate = Handlebars.compile(template.trim());
+    formattedVal = hTemplate({ value }).trim();
+  }
+ 
+  // handle excludes
+  if (excludes) {
+    Eif (typeof value === "object") {
+      // exlude the fields from the formattedVal
+      excludes.forEach(key => {
+        delete formattedVal[key];
+      });
+    } else {
+      logger.warn(
+        "exludes doesn't work with non-object data type. Ignoring exludes"
+      );
+    }
+  }
+ 
+  // handle multikeyMap
+  // sourceVal is expected to be an array
+  // if value is present in sourceVal, returns the destVal
+  // else returns the original value
+  // Expected multikeyMap value:
+  // "multikeyMap": [
+  //   {
+  //     "sourceVal": ["m", "M", "Male", "male"],
+  //     "destVal": "M"
+  //   },
+  //   {
+  //     "sourceVal": ["f", "F", "Female", "female"],
+  //     "destVal": "F"
+  //   }
+  // ]
+  if (multikeyMap) {
+    let foundVal = false;
+    Eif (Array.isArray(multikeyMap)) {
+      multikeyMap.some(map => {
+        Iif (
+          !map.sourceVal ||
+          !isDefinedAndNotNull(map.destVal) ||
+          !Array.isArray(map.sourceVal)
+        ) {
+          logger.warn(
+            "multikeyMap skipped: sourceVal and destVal must be of valid type"
+          );
+          foundVal = true;
+          return true;
+        }
+ 
+        if (map.sourceVal.includes(formattedVal)) {
+          formattedVal = map.destVal;
+          foundVal = true;
+          return true;
+        }
+      });
+    } else {
+      logger.warn("multikeyMap skipped: multikeyMap must be an array");
+    }
+    if (!foundVal) formattedVal = undefined;
+  }
+ 
+  Iif (allowedKeyCheck) {
+    let foundVal = false;
+    if (Array.isArray(allowedKeyCheck)) {
+      allowedKeyCheck.some(key => {
+        if (key.sourceVal.includes(formattedVal)) {
+          foundVal = true;
+          return true;
+        }
+      });
+    }
+    if (!foundVal) {
+      formattedVal = undefined;
+    }
+  }
+ 
+  return formattedVal;
+};
+ 
+// Given a destinationName according to the destination definition names,
+// It'll look for the canonical names for that integration and return the
+// `integrations` object for that destination, else null
+const getIntegrationsObj = (message, destinationName = null) => {
+  Eif (destinationName) {
+    const canonicalNames = DestCanonicalNames[destinationName];
+    for (let index = 0; index < canonicalNames.length; index += 1) {
+      const integrationsObj = get(
+        message,
+        `integrations.${canonicalNames[index]}`
+      );
+      if (integrationsObj) {
+        return integrationsObj;
+      }
+    }
+  }
+  return null;
+};
+ 
+// construct payload from an event and mappingJson
+const constructPayload = (message, mappingJson, destinationName = null) => {
+  // Mapping JSON should be an array
+  Eif (Array.isArray(mappingJson) && mappingJson.length > 0) {
+    // - construct a blank payload and return at the end
+    // - if you to need merge multiple constructPayload do it on the transformer code
+    // - - will give a cleaner approach
+    // - - you don't need to iterate over multiple loops to construct a payload for a single event
+    const payload = {};
+ 
+    // loop through the mappingJson
+    // Expected mappingJson :
+    // [
+    //   {
+    //     sourceKeys: [ "userId", "context.traits.userId", "context.traits.id", "anonymousId" ],
+    //     destKey: "uniqueid",
+    //     required: true
+    //   },
+    //   {
+    //     sourceKeys: "event",
+    //     destKey: "eventName",
+    //     required: true
+    //   },
+    //   {
+    //     sourceKeys: "event",
+    //     destKey: "eventName",
+    //     required: true,
+    //     metadata: {
+    //       template: "Visited {{value}} page"
+    //     }
+    //   },
+    //   {
+    //     sourceKeys: "originalTimestamp",
+    //     destKey: "timestamp",
+    //     required: true,
+    //     metadata: {
+    //       type: "timestamp",
+    //       typeFormat: "yyyymmdd"
+    //     }
+    //   },
+    //   ...
+    // ];
+    mappingJson.forEach(mapping => {
+      const {
+        sourceKeys,
+        destKey,
+        required,
+        metadata,
+        sourceFromGenericMap
+      } = mapping;
+      // get the value from event, pass sourceFromGenericMap in the mapping to force this to take the
+      // sourcekeys from GenericFieldMapping, else take the sourceKeys from specific destination mapping sourceKeys
+      const integrationsObj = destinationName
+        ? getIntegrationsObj(message, destinationName)
+        : null;
+      const value = handleMetadataForValue(
+        sourceFromGenericMap
+          ? getFieldValueFromMessage(message, sourceKeys)
+          : getValueFromMessage(message, sourceKeys),
+        metadata,
+        integrationsObj
+      );
+ 
+      if (value || value === 0 || value === false) {
+        if (destKey) {
+          // set the value only if correct
+          _.set(payload, destKey, value);
+        } else {
+          // to set to root and flatten later
+          payload[""] = value;
+        }
+      } else if (required) {
+        // throw error if reqired value is missing
+        throw new Error(
+          `Missing required value from ${JSON.stringify(sourceKeys)}`
+        );
+      }
+    });
+ 
+    return payload;
+  }
+ 
+  // invalid mappingJson
+  return null;
+};
+ 
+// External ID format
+// {
+//   "context": {
+//     "externalId": [
+//       {
+//         "type": "kustomerId",
+//         "id": "12345678"
+//       }
+//     ]
+//   }
+// }
+// to get destination specific external id passed in context.
+function getDestinationExternalID(message, type) {
+  let externalIdArray = null;
+  let destinationExternalId = null;
+  if (message.context && message.context.externalId) {
+    externalIdArray = message.context.externalId;
+  }
+  if (externalIdArray) {
+    externalIdArray.forEach(extIdObj => {
+      if (extIdObj.type === type) {
+        destinationExternalId = extIdObj.id;
+      }
+    });
+  }
+  return destinationExternalId;
+}
+ 
+// Get id and object type from externalId for rETL
+// type will be of the form: <DESTINATION-NAME>-<object>
+const getDestinationExternalIDInfoForRetl = (message, destination) => {
+  let externalIdArray = [];
+  let destinationExternalId = null;
+  let objectType = null;
+  if (message.context && message.context.externalId) {
+    externalIdArray = message.context.externalId;
+  }
+  Eif (externalIdArray) {
+    externalIdArray.forEach(extIdObj => {
+      const { type } = extIdObj;
+      Eif (type.includes(`${destination}-`)) {
+        destinationExternalId = extIdObj.id;
+        objectType = type.replace(`${destination}-`, "");
+      }
+    });
+  }
+  return { destinationExternalId, objectType };
+};
+ 
+const isObject = value => {
+  const type = typeof value;
+  return (
+    value != null &&
+    (type === "object" || type === "function") &&
+    !Array.isArray(value)
+  );
+};
+ 
+const isNonFuncObject = value => {
+  const type = typeof value;
+  return value != null && type === "object" && !Array.isArray(value);
+};
+ 
+function getBrowserInfo(userAgent) {
+  const ua = uaParser(userAgent);
+  return { name: ua.browser.name, version: ua.browser.version };
+}
+ 
+function getInfoFromUA(prop, payload, defaultVal) {
+  const ua = get(payload, "context.userAgent");
+  const devInfo = ua ? uaParser(ua) : {};
+  return get(devInfo, prop) || defaultVal;
+}
+ 
+function getDeviceModel(payload, sourceKey) {
+  const payloadVal = get(payload, sourceKey);
+ 
+  Eif (payload.channel && payload.channel.toLowerCase() === "web") {
+    return getInfoFromUA("os.name", payload, payloadVal);
+  }
+  return payloadVal;
+}
+ 
+/** * This method forms an array of non-empty values from destination config where that particular config holds an array of "key-value" pair.
+For example,
+    Config{
+      "groupKeySettings": [
+        {
+          "groupKey": "companyid"
+        },
+        {
+          "groupKey": "accountid"
+        }
+      ]
+    }
+This will return an array as ["companyid", "accountid"]
+The correcponding call is: getValuesAsArrayFromConfig(Config.groupKeySettings, "groupKey")
+* */
+function getValuesAsArrayFromConfig(configObject, key) {
+  const returnArray = [];
+  if (configObject && Array.isArray(configObject) && configObject.length > 0) {
+    let value;
+    configObject.forEach(element => {
+      value = element[key];
+      Eif (value) {
+        returnArray.push(value);
+      }
+    });
+  }
+  return returnArray;
+}
+ 
+// Accepts a timestamp and returns the corresponding unix timestamp
+function toUnixTimestamp(timestamp) {
+  const date = new Date(timestamp);
+  const unixTimestamp = Math.floor(date.getTime() / 1000);
+  return unixTimestamp;
+}
+ 
+// Accecpts timestamp as a parameter and returns the difference of the same with current time.
+function getTimeDifference(timestamp) {
+  const currentTime = Date.now();
+  const eventTime = new Date(timestamp);
+  const duration = moment.duration(moment(currentTime).diff(moment(eventTime)));
+  const days = duration.asDays();
+  const years = duration.asYears();
+  const months = duration.asMonths();
+  const hours = duration.asHours();
+  const minutes = duration.asMinutes();
+  const seconds = duration.asSeconds();
+  return { days, months, years, hours, minutes, seconds };
+}
+ 
+// Extract firstName and lastName from traits
+// split the name with <space> and consider the 0th position as first name
+// and the last item (only if name is not a single word) as lastName
+function getFirstAndLastName(traits, defaultLastName = "n/a") {
+  let nameParts;
+  if (traits.name) {
+    nameParts = traits.name.split(" ");
+  }
+  return {
+    firstName:
+      traits.firstName ||
+      (nameParts && nameParts.length > 0 ? nameParts[0] : ""),
+    lastName:
+      traits.lastName ||
+      (nameParts && nameParts.length > 1
+        ? nameParts[nameParts.length - 1]
+        : defaultLastName)
+  };
+}
+ 
+// Checks if the traits object has a firstName key and a lastName key as defined in GenericFieldMapping.json
+// If it does have those two keys AND does NOT already have a name key
+// Then this function will return fullName: "<firstName> <lastName>"
+function getFullName(message) {
+  let fullName;
+  const firstName = getFieldValueFromMessage(message, "firstName");
+  const lastName = getFieldValueFromMessage(message, "lastName");
+  const name = getFieldValueFromMessage(message, "name");
+  if (!name && firstName && lastName) {
+    fullName = `${firstName} ${lastName}`;
+  }
+  return fullName;
+}
+ 
+/**
+ * Extract fileds from message with exclusions
+ * Pass the keys of message for extraction and
+ * exclusion fields to exlude and the payload to map into
+ *
+ * Example:
+ * extractCustomFields(
+ *   message,
+ *   payload,
+ *   ["traits", "context.traits", "properties"],
+ *   [
+ *     "firstName",
+ *     "lastName",
+ *     "phone",
+ *     "title",
+ *     "organization",
+ *     "city",
+ *     "region",
+ *     "country",
+ *     "zip",
+ *     "image",
+ *     "timezone"
+ *   ]
+ * )
+ * -------------------------------------------
+ * The above call will map the fields other than the
+ * exlusion list from the given keys to the destination payload
+ *
+ */
+function extractCustomFields(message, destination, keys, exclusionFields) {
+  const mappingKeys = [];
+  if (Array.isArray(keys)) {
+    keys.map(key => {
+      const messageContext = get(message, key);
+      if (messageContext) {
+        Object.keys(messageContext).map(k => {
+          if (!exclusionFields.includes(k)) mappingKeys.push(k);
+        });
+        mappingKeys.map(mappingKey => {
+          Eif (!(typeof messageContext[mappingKey] === "undefined")) {
+            set(destination, mappingKey, get(messageContext, mappingKey));
+          }
+        });
+      }
+    });
+  } else Eif (keys === "root") {
+    Object.keys(message).map(k => {
+      if (!exclusionFields.includes(k)) mappingKeys.push(k);
+    });
+    mappingKeys.map(mappingKey => {
+      Eif (!(typeof message[mappingKey] === "undefined")) {
+        set(destination, mappingKey, get(message, mappingKey));
+      }
+    });
+  } else {
+    logger.debug("unable to parse keys");
+  }
+ 
+  return destination;
+}
+ 
+// Deleting nested properties from objects
+function deleteObjectProperty(object, pathToObject) {
+  let i;
+  if (!object || !pathToObject) {
+    return;
+  }
+  Eif (typeof pathToObject === "string") {
+    pathToObject = pathToObject.split(".");
+  }
+  for (i = 0; i < pathToObject.length - 1; i += 1) {
+    object = object[pathToObject[i]];
+ 
+    if (typeof object === "undefined") {
+      return;
+    }
+  }
+ 
+  delete object[pathToObject.pop()];
+}
+ 
+// function convert keys in a object to title case
+ 
+function toTitleCase(payload) {
+  const newPayload = payload;
+  Object.keys(payload).forEach(key => {
+    const value = newPayload[key];
+    delete newPayload[key];
+    const newKey = key
+      .replace(/([a-z])([A-Z])/g, "$1 $2")
+      .replace(/([A-Z])([A-Z][a-z])/g, "$1 $2")
+      .replace(/([a-z])([0-9])/gi, "$1 $2")
+      .replace(/([0-9])([a-z])/gi, "$1 $2")
+      .trim()
+      .replace(/(_)/g, ` `)
+      .replace(/(^\w{1})|(\s+\w{1})/g, match => {
+        return match.toUpperCase();
+      });
+    newPayload[newKey] = value;
+  });
+  return newPayload;
+}
+ 
+// returns false if there is any empty string inside an array or true otherwise
+ 
+function checkEmptyStringInarray(array) {
+  const result = array.filter(item => item === "").length === 0;
+  return result;
+}
+// Returns raw string value of JSON
+function getStringValueOfJSON(json) {
+  let output = "";
+  Object.keys(json).forEach(key => {
+    // eslint-disable-next-line no-prototype-builtins
+    Eif (json.hasOwnProperty(key)) {
+      output += `${key}: ${json[key]} `;
+    }
+  });
+  return output;
+}
+ 
+const getMetadata = metadata => {
+  return {
+    sourceType: metadata.sourceType,
+    destinationType: metadata.destinationType,
+    k8_namespace: metadata.namespace
+  };
+};
+// checks if array 2 is a subset of array 1
+function checkSubsetOfArray(array1, array2) {
+  const result = array2.every(val => array1.includes(val));
+  return result;
+}
+ 
+// splits array into equal parts and returns array of sub arrays
+function returnArrayOfSubarrays(arr, len) {
+  const chunks = [];
+  let i = 0;
+  const n = arr.length;
+  while (i < n) {
+    chunks.push(arr.slice(i, (i += len)));
+  }
+  return chunks;
+}
+ 
+// Helper method to add external Id to traits
+// Traverse through the possible keys for traits using generic mapping and add externalId if traits found
+function addExternalIdToTraits(message) {
+  const identifierType = get(message, "context.externalId.0.identifierType");
+  const identifierValue = get(message, "context.externalId.0.id");
+  set(
+    getFieldValueFromMessage(message, "traits"),
+    identifierType,
+    identifierValue
+  );
+}
+const adduserIdFromExternalId = message => {
+  const externalId = get(message, "context.externalId.0.id");
+  Eif (externalId) {
+    message.userId = externalId;
+  }
+};
+class CustomError extends Error {
+  constructor(message, statusCode, metadata) {
+    super(message);
+    this.response = { status: statusCode, metadata };
+  }
+}
+ 
+/**
+ * Used for generating error response with stats from native and built errors
+ * @param {*} arg
+ * @param {*} destination
+ * @param {*} transformStage
+ */
+function generateErrorObject(error, destination, transformStage) {
+  // check err is object
+  // filter to check if it is coming from cdk
+  if (error.fromCdk) {
+    return error;
+  }
+  const { status, message, destinationResponse } = error;
+  let { statTags } = error;
+  if (!statTags) {
+    statTags = {
+      destination,
+      stage: transformStage,
+      scope: TRANSFORMER_METRIC.MEASUREMENT_TYPE.EXCEPTION.SCOPE
+    };
+  }
+  const response = {
+    status: status || 400,
+    message,
+    destinationResponse,
+    statTags
+  };
+  // Extra Params needed for OAuth destinations' Response handling
+  if (error.authErrorCategory) {
+    response.authErrorCategory = error.authErrorCategory || "";
+  }
+  return response;
+}
+/**
+ * Returns true for http status code in range of 200 to 300
+ * @param {*} status
+ * @returns
+ */
+function isHttpStatusSuccess(status) {
+  return status >= 200 && status < 300;
+}
+ 
+/**
+ * Returns true for http status code in range of 500 to 600
+ * @param {*} status
+ * @returns
+ */
+function isHttpStatusRetryable(status) {
+  return status >= 500 && status < 600;
+}
+/**
+ *
+ * Utility function for UUID genration
+ * @returns
+ */
+function generateUUID() {
+  // Public Domain/MIT
+  let d = new Date().getTime();
+  Iif (
+    typeof performance !== "undefined" &&
+    typeof performance.now === "function"
+  ) {
+    d += performance.now(); // use high-precision timer if available
+  }
+  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
+    const r = (d + Math.random() * 16) % 16 | 0;
+    d = Math.floor(d / 16);
+    return (c === "x" ? r : (r & 0x3) | 0x8).toString(16);
+  });
+}
+ 
+const isOAuthDestination = destination => {
+  const { Config: destConf } = destination.DestinationDefinition;
+  return destConf && destConf.auth && destConf.auth.type === "OAuth";
+};
+ 
+const isOAuthSupported = (destination, destHandler) => {
+  return (
+    isOAuthDestination(destination) &&
+    destHandler.processAuth &&
+    typeof destHandler.processAuth === "function"
+  );
+};
+ 
+function isAppleFamily(platform) {
+  const appleOsNames = ["ios", "watchos", "ipados", "tvos"];
+  return appleOsNames.includes(platform.toLowerCase());
+}
+ 
+function removeHyphens(str) {
+  return str.replace(/-/g, "");
+}
+ 
+function isCdkDestination(event) {
+  // TODO: maybe dont need all these checks in place
+  return (
+    event.destination &&
+    event.destination.DestinationDefinition &&
+    event.destination.DestinationDefinition.Config &&
+    event.destination.DestinationDefinition.Config.cdkEnabled
+  );
+}
+ 
+/**
+ * This function helps to remove any invalid object values from the config generated by dynamicForm, 
+ * dynamicCustomForm, and dynamicSelectForm web app form elements.
+ *
+ * example:
+ * input: "eventsToEvents": [
+                    {
+                        "from": "spin_result",
+                        "to": "Schedule"
+                    },
+                    {
+                        "to": "Schedule"
+                    }
+                ]
+ * output: "eventsToEvents": [
+                    {
+                        "from": "spin_result",
+                        "to": "Schedule"
+                    }
+                ]
+ 
+ * @param {*} attributeArray -> This is the config output (array) from dynamicForm/dynamicCustomForm/dynamicSelectForm element.
+ * @param {*} keyLeft -> This is the name of the leftKey, in general it is 'from'.
+ * @param {*} keyRight -> This is the name of the rightKey, in general it is 'to'.
+ * @param {*} destinationType -> This is the type of the destination.
+ * @param {*} destinationId -> This is the id of the destination.
+ * @returns
+ */
+function getValidDynamicFormConfig(
+  attributeArray,
+  keyLeft,
+  keyRight,
+  destinationType,
+  destinationId
+) {
+  const res = attributeArray.filter(element => {
+    return (
+      (element[keyLeft] || element[keyLeft] === "") &&
+      (element[keyRight] || element[keyRight] === "")
+    );
+  });
+  if (res.length < attributeArray.length) {
+    stats.increment("dest_transform_invalid_dynamicConfig_count", 1, {
+      destinationType,
+      destinationId
+    });
+  }
+  return res;
+}
+ 
+// ========================================================================
+// EXPORTS
+// ========================================================================
+// keep it sorted to find easily
+module.exports = {
+  CustomError,
+  ErrorMessage,
+  addExternalIdToTraits,
+  adduserIdFromExternalId,
+  checkEmptyStringInarray,
+  checkSubsetOfArray,
+  constructPayload,
+  defaultBatchRequestConfig,
+  defaultDeleteRequestConfig,
+  defaultGetRequestConfig,
+  defaultPostRequestConfig,
+  defaultPutRequestConfig,
+  defaultRequestConfig,
+  deleteObjectProperty,
+  extractCustomFields,
+  flattenJson,
+  flattenMap,
+  formatTimeStamp,
+  formatValue,
+  generateUUID,
+  getSuccessRespEvents,
+  generateErrorObject,
+  getBrowserInfo,
+  getDateInFormat,
+  getDestinationExternalID,
+  getDeviceModel,
+  getErrorRespEvents,
+  getFieldValueFromMessage,
+  getFirstAndLastName,
+  getFullName,
+  getHashFromArray,
+  getIntegrationsObj,
+  getMappingConfig,
+  getMetadata,
+  getParsedIP,
+  getStringValueOfJSON,
+  getTimeDifference,
+  getType,
+  getValueFromMessage,
+  getValuesAsArrayFromConfig,
+  isBlank,
+  isDefined,
+  isDefinedAndNotNull,
+  isDefinedAndNotNullAndNotEmpty,
+  isEmpty,
+  isEmptyObject,
+  isHttpStatusSuccess,
+  isHttpStatusRetryable,
+  isNonFuncObject,
+  isObject,
+  isPrimitive,
+  isValidUrl,
+  removeNullValues,
+  removeUndefinedAndNullAndEmptyValues,
+  removeUndefinedAndNullValues,
+  removeUndefinedValues,
+  returnArrayOfSubarrays,
+  setValues,
+  stripTrailingSlash,
+  toTitleCase,
+  toUnixTimestamp,
+  updatePayload,
+  isOAuthSupported,
+  isOAuthDestination,
+  isAppleFamily,
+  isCdkDestination,
+  getValidDynamicFormConfig,
+  getDestinationExternalIDInfoForRetl,
+  removeHyphens
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/WHAliasConfig.js.html b/coverage/lcov-report/rudder-transformer/warehouse/config/WHAliasConfig.js.html new file mode 100644 index 00000000000..f01860cf1ca --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/WHAliasConfig.js.html @@ -0,0 +1,95 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config/WHAliasConfig.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/config WHAliasConfig.js

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +610x +  +  +  +10x + 
const rules = {
+  previous_id: "previousId"
+};
+ 
+module.exports = rules;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/WHDefaultConfig.js.html b/coverage/lcov-report/rudder-transformer/warehouse/config/WHDefaultConfig.js.html new file mode 100644 index 00000000000..c925b77afec --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/WHDefaultConfig.js.html @@ -0,0 +1,134 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config/WHDefaultConfig.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/config WHDefaultConfig.js

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +1910x +  +10x +  +  +  +  +  +  +  +  +  +991x +  +  +  +  +10x + 
const { getFirstValidValue } = require("./helpers");
+ 
+const rules = {
+  id: "messageId",
+  anonymous_id: "anonymousId",
+  user_id: "userId",
+  sent_at: "sentAt",
+  timestamp: "timestamp",
+  received_at: "receivedAt",
+  original_timestamp: "originalTimestamp",
+  channel: "channel",
+  context_ip: message =>
+    getFirstValidValue(message, ["context.ip", "request_ip"]),
+  context_request_ip: "request_ip",
+  context_passed_ip: "context.ip"
+};
+ 
+module.exports = rules;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/WHGroupConfig.js.html b/coverage/lcov-report/rudder-transformer/warehouse/config/WHGroupConfig.js.html new file mode 100644 index 00000000000..b9c9b0acb05 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/WHGroupConfig.js.html @@ -0,0 +1,95 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config/WHGroupConfig.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/config WHGroupConfig.js

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +610x +  +  +  +10x + 
const rules = {
+  group_id: "groupId"
+};
+ 
+module.exports = rules;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/WHPageConfig.js.html b/coverage/lcov-report/rudder-transformer/warehouse/config/WHPageConfig.js.html new file mode 100644 index 00000000000..4f8524c1821 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/WHPageConfig.js.html @@ -0,0 +1,101 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config/WHPageConfig.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/config WHPageConfig.js

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +810x +  +10x +144x +  +  +10x + 
const { getFirstValidValue } = require("./helpers");
+ 
+const rules = {
+  name: message => getFirstValidValue(message, ["name", "properties.name"])
+};
+ 
+module.exports = rules;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/WHScreenConfig.js.html b/coverage/lcov-report/rudder-transformer/warehouse/config/WHScreenConfig.js.html new file mode 100644 index 00000000000..b7703a44933 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/WHScreenConfig.js.html @@ -0,0 +1,101 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config/WHScreenConfig.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/config WHScreenConfig.js

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +810x +  +10x +136x +  +  +10x + 
const { getFirstValidValue } = require("./helpers");
+ 
+const rules = {
+  name: message => getFirstValidValue(message, ["name", "properties.name"])
+};
+ 
+module.exports = rules;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/WHTrackConfig.js.html b/coverage/lcov-report/rudder-transformer/warehouse/config/WHTrackConfig.js.html new file mode 100644 index 00000000000..0b598752966 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/WHTrackConfig.js.html @@ -0,0 +1,95 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config/WHTrackConfig.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/config WHTrackConfig.js

+
+ +
+ 100% + Statements + 2/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 2/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +610x +  +  +  +10x + 
const rules = {
+  event_text: "event"
+};
+ 
+module.exports = rules;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/WHTrackEventTableConfig.js.html b/coverage/lcov-report/rudder-transformer/warehouse/config/WHTrackEventTableConfig.js.html new file mode 100644 index 00000000000..260e9bdcdf1 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/WHTrackEventTableConfig.js.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config/WHTrackEventTableConfig.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/config WHTrackEventTableConfig.js

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +1310x +  +10x +  +287x +  +  +  +  +  +  +10x + 
const { sourceCategoriesToUseRecordId, getCloudRecordID } = require("../util");
+ 
+const rules = {
+  id: (message, options) => {
+    return message.type === "track" &&
+      sourceCategoriesToUseRecordId.includes(options.sourceCategory)
+      ? getCloudRecordID(message, message.messageId)
+      : message.messageId;
+  }
+};
+ 
+module.exports = rules;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/WHTracksTableConfig.js.html b/coverage/lcov-report/rudder-transformer/warehouse/config/WHTracksTableConfig.js.html new file mode 100644 index 00000000000..96bcd11c823 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/WHTracksTableConfig.js.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config/WHTracksTableConfig.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/config WHTracksTableConfig.js

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 4/4 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +1310x +10x +  +10x +  +317x +  +  +  +  +  +10x + 
const _ = require("lodash");
+const { sourceCategoriesToUseRecordId, getCloudRecordID } = require("../util");
+ 
+const rules = {
+  record_id: (message, options) =>
+    message.type === "track" &&
+    sourceCategoriesToUseRecordId.includes(options.sourceCategory)
+      ? _.toString(getCloudRecordID(message))
+      : null
+};
+ 
+module.exports = rules;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/WHUserConfig.js.html b/coverage/lcov-report/rudder-transformer/warehouse/config/WHUserConfig.js.html new file mode 100644 index 00000000000..c2f299b4475 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/WHUserConfig.js.html @@ -0,0 +1,110 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config/WHUserConfig.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/config WHUserConfig.js

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +1110x +  +10x +  +144x +  +  +  +  +10x + 
const { getFirstValidValue } = require("./helpers");
+ 
+const rules = {
+  context_ip: message =>
+    getFirstValidValue(message, ["context.ip", "request_ip"]),
+  context_request_ip: "request_ip",
+  context_passed_ip: "context.ip"
+};
+ 
+module.exports = rules;
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/helpers.js.html b/coverage/lcov-report/rudder-transformer/warehouse/config/helpers.js.html new file mode 100644 index 00000000000..b957d00494e --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/helpers.js.html @@ -0,0 +1,188 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config/helpers.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/config helpers.js

+
+ +
+ 93.75% + Statements + 15/16 +
+ + +
+ 71.43% + Branches + 5/7 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 93.33% + Lines + 14/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +3710x +10x +  +10x +  +  +  +10x +1599x +  +  +10x +1415x +1415x +1599x +1599x +1351x +  +  +  +1415x +  +  +  +52826x +  +  +  +  +  +  +10x +  +  +  +  + 
const _ = require("lodash");
+const get = require("get-value");
+ 
+const isNull = x => {
+  return x === null || x === undefined;
+};
+ 
+const isBlank = value => {
+  return _.isEmpty(_.toString(value));
+};
+ 
+const getFirstValidValue = (message, props) => {
+  let currVal = null;
+  for (let index = 0; index < props.length; index += 1) {
+    currVal = get(message, props[index]);
+    if (!isBlank(currVal)) {
+      break;
+    }
+  }
+ 
+  return currVal;
+};
+ 
+function isDataLakeProvider(provider) {
+  return (
+    provider === "s3_datalake" ||
+    provider === "gcs_datalake" ||
+    provider === "azure_datalake"
+  );
+}
+ 
+module.exports = {
+  isNull,
+  getFirstValidValue,
+  isDataLakeProvider
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/config/index.html b/coverage/lcov-report/rudder-transformer/warehouse/config/index.html new file mode 100644 index 00000000000..589de05e0e5 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/config/index.html @@ -0,0 +1,246 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/config + + + + + + + + + +
+
+

All files rudder-transformer/warehouse/config

+
+ +
+ 97.87% + Statements + 46/47 +
+ + +
+ 86.67% + Branches + 13/15 +
+ + +
+ 90% + Functions + 9/10 +
+ + +
+ 97.83% + Lines + 45/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
WHAliasConfig.js +
+
100%2/2100%0/0100%0/0100%2/2
WHDefaultConfig.js +
+
100%4/4100%0/0100%1/1100%4/4
WHGroupConfig.js +
+
100%2/2100%0/0100%0/0100%2/2
WHPageConfig.js +
+
100%4/4100%0/0100%1/1100%4/4
WHScreenConfig.js +
+
100%4/4100%0/0100%1/1100%4/4
WHTrackConfig.js +
+
100%2/2100%0/0100%0/0100%2/2
WHTrackEventTableConfig.js +
+
100%4/4100%4/4100%1/1100%4/4
WHTracksTableConfig.js +
+
100%5/5100%4/4100%1/1100%5/5
WHUserConfig.js +
+
100%4/4100%0/0100%1/1100%4/4
helpers.js +
+
93.75%15/1671.43%5/775%3/493.33%14/15
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/identity.js.html b/coverage/lcov-report/rudder-transformer/warehouse/identity.js.html new file mode 100644 index 00000000000..ee8bacc3b03 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/identity.js.html @@ -0,0 +1,506 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/identity.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse identity.js

+
+ +
+ 16.36% + Statements + 9/55 +
+ + +
+ 2.56% + Branches + 1/39 +
+ + +
+ 33.33% + Functions + 1/3 +
+ + +
+ 16.36% + Lines + 9/55 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +14310x +10x +  +10x +10x +10x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +952x +952x +952x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +10x +  +  + 
const _ = require("lodash");
+const { getVersionedUtils } = require("./util");
+ 
+const identityEnabledWarehouses = ["snowflake", "bq"];
+const versionedMergePropColumns = {};
+const versionedMergeRuleTableNames = {};
+ 
+// Computes provider-safe column name
+// Caches for future use
+function getMergePropColumns(version, options) {
+  const { provider } = options;
+  if (
+    versionedMergePropColumns[version] !== undefined &&
+    versionedMergePropColumns[version][provider] !== undefined
+  ) {
+    return versionedMergePropColumns[version][provider];
+  }
+ 
+  if (versionedMergePropColumns[version] === undefined) {
+    versionedMergePropColumns[version] = {};
+  }
+ 
+  const utils = getVersionedUtils(version);
+  versionedMergePropColumns[version][provider] = {
+    prop1Type: utils.safeColumnName(options, "merge_property_1_type"),
+    prop1Value: utils.safeColumnName(options, "merge_property_1_value"),
+    prop2Type: utils.safeColumnName(options, "merge_property_2_type"),
+    prop2Value: utils.safeColumnName(options, "merge_property_2_value")
+  };
+  return versionedMergePropColumns[version][provider];
+}
+ 
+// Computes provider-safe Table name
+// Caches for future use
+function getMergeRulesTableName(version, options) {
+  const { provider } = options;
+  if (
+    versionedMergeRuleTableNames[version] !== undefined &&
+    versionedMergeRuleTableNames[version][provider] !== undefined
+  ) {
+    return versionedMergeRuleTableNames[version][provider];
+  }
+ 
+  if (versionedMergeRuleTableNames[version] === undefined) {
+    versionedMergeRuleTableNames[version] = {};
+  }
+  const utils = getVersionedUtils(version);
+  versionedMergeRuleTableNames[version][provider] = utils.safeTableName(
+    options,
+    "rudder_identity_merge_rules"
+  );
+  return versionedMergeRuleTableNames[version][provider];
+}
+ 
+// Get Merge rule event from any given event
+function getMergeRuleEvent(message = {}, eventType, options) {
+  const { whSchemaVersion, provider, whIDResolve } = options;
+  Eif (!whIDResolve) {
+    return null;
+  }
+ 
+  if (!identityEnabledWarehouses.includes(provider)) {
+    return null;
+  }
+  let mergeProp1 = {};
+  let mergeProp2 = {};
+  if (eventType === "merge") {
+    if (
+      !_.has(message, "mergeProperties[0]") ||
+      !_.has(message, "mergeProperties[1]")
+    ) {
+      throw new Error("either or both identifiers missing in mergeProperties");
+    }
+ 
+    if (
+      _.isEmpty(_.toString(message.mergeProperties[0].type)) ||
+      _.isEmpty(_.toString(message.mergeProperties[0].value)) ||
+      _.isEmpty(_.toString(message.mergeProperties[1].type)) ||
+      _.isEmpty(_.toString(message.mergeProperties[1].value))
+    ) {
+      throw new Error(
+        "mergeProperties contains null values for expected inputs"
+      );
+    }
+ 
+    mergeProp1 = {
+      name: message.mergeProperties[0].type,
+      value: message.mergeProperties[0].value
+    };
+    mergeProp2 = {
+      name: message.mergeProperties[1].type,
+      value: message.mergeProperties[1].value
+    };
+  } else if (eventType === "alias") {
+    mergeProp1 = { name: "user_id", value: message.userId };
+    mergeProp2 = { name: "user_id", value: message.previousId };
+  } else if (_.isEmpty(_.toString(message.anonymousId))) {
+    // handle messages with only userId and no anonymousId
+    mergeProp1 = { name: "user_id", value: message.userId };
+  } else {
+    mergeProp1 = { name: "anonymous_id", value: message.anonymousId };
+    mergeProp2 = { name: "user_id", value: message.userId };
+  }
+ 
+  if (_.isEmpty(_.toString(mergeProp1.value))) {
+    return null;
+  }
+ 
+  const mergePropColumns = getMergePropColumns(whSchemaVersion, options);
+ 
+  // add prop1 to merge rule
+  const mergeRule = {
+    [mergePropColumns.prop1Type]: mergeProp1.name,
+    [mergePropColumns.prop1Value]: mergeProp1.value.toString()
+  };
+  const mergeColumnTypes = {
+    [mergePropColumns.prop1Type]: "string",
+    [mergePropColumns.prop1Value]: "string"
+  };
+ 
+  // add prop2 to merge rule
+  if (!_.isEmpty(_.toString(mergeProp2.value))) {
+    mergeRule[mergePropColumns.prop2Type] = mergeProp2.name;
+    mergeRule[mergePropColumns.prop2Value] = mergeProp2.value.toString();
+    mergeColumnTypes[mergePropColumns.prop2Type] = "string";
+    mergeColumnTypes[mergePropColumns.prop2Value] = "string";
+  }
+ 
+  const mergeRulesMetadata = {
+    table: getMergeRulesTableName(whSchemaVersion, options),
+    columns: mergeColumnTypes,
+    isMergeRule: true,
+    receivedAt: message.receivedAt,
+    mergePropOne: mergeProp1.value.toString(),
+    mergePropTwo: mergeProp2.value && mergeProp2.value.toString()
+  };
+  return { metadata: mergeRulesMetadata, data: mergeRule };
+}
+ 
+module.exports = {
+  getMergeRuleEvent
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/index.html b/coverage/lcov-report/rudder-transformer/warehouse/index.html new file mode 100644 index 00000000000..f153ce4bdcf --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/index.html @@ -0,0 +1,141 @@ + + + + + + Code coverage report for rudder-transformer/warehouse + + + + + + + + + +
+
+

All files rudder-transformer/warehouse

+
+ +
+ 78.32% + Statements + 242/309 +
+ + +
+ 67.01% + Branches + 130/194 +
+ + +
+ 90% + Functions + 18/20 +
+ + +
+ 78.5% + Lines + 241/307 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
identity.js +
+
16.36%9/552.56%1/3933.33%1/316.36%9/55
index.js +
+
91.48%204/22382.58%109/132100%11/1191.86%203/221
util.js +
+
93.55%29/3186.96%20/23100%6/693.55%29/31
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/index.js.html b/coverage/lcov-report/rudder-transformer/warehouse/index.js.html new file mode 100644 index 00000000000..614cce14617 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/index.js.html @@ -0,0 +1,3122 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/index.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse index.js

+
+ +
+ 91.48% + Statements + 204/223 +
+ + +
+ 82.58% + Branches + 109/132 +
+ + +
+ 100% + Functions + 11/11 +
+ + +
+ 91.86% + Lines + 203/221 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 +826 +827 +828 +829 +830 +831 +832 +833 +834 +835 +836 +837 +838 +839 +840 +841 +842 +843 +844 +845 +846 +847 +848 +849 +850 +851 +852 +853 +854 +855 +856 +857 +858 +859 +860 +861 +862 +863 +864 +865 +866 +867 +868 +869 +870 +871 +872 +873 +874 +875 +876 +877 +878 +879 +880 +881 +882 +883 +884 +885 +886 +887 +888 +889 +890 +891 +892 +893 +894 +895 +896 +897 +898 +899 +900 +901 +902 +903 +904 +905 +906 +907 +908 +909 +910 +911 +912 +913 +914 +915 +916 +917 +918 +919 +920 +921 +922 +923 +924 +925 +926 +927 +928 +929 +930 +931 +932 +933 +934 +935 +936 +937 +938 +939 +940 +941 +942 +943 +944 +945 +946 +947 +948 +949 +950 +951 +952 +953 +954 +955 +956 +957 +958 +959 +960 +961 +962 +963 +964 +965 +966 +967 +968 +969 +970 +971 +972 +973 +974 +975 +976 +977 +978 +979 +980 +981 +982 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1009 +1010 +1011 +1012 +1013 +1014 +1015  +10x +10x +10x +  +  +  +  +  +  +  +10x +10x +  +10x +10x +10x +10x +10x +10x +10x +10x +10x +10x +  +10x +  +  +  +  +  +10x +  +10x +49089x +49089x +  +5815x +  +16066x +  +27208x +  +27208x +3871x +  +23337x +  +  +  +23328x +  +9x +  +  +10x +  +  +  +  +  +  +  +  +10x +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +287x +  +  +  +  +5x +  +282x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2586x +2586x +12784x +  +12784x +2019x +  +10765x +  +  +12776x +  +12776x +  +  +  +997x +  +997x +997x +  +11779x +11779x +3868x +  +  +11779x +  +11779x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +7328x +6689x +44899x +  +  +  +4803x +  +  +  +  +  +  +  +  +  +  +40096x +  +40096x +3022x +  +37074x +  +  +  +  +8x +  +  +37074x +37074x +  +  +37074x +37074x +37074x +  +37074x +  +  +  +1699x +  +  +35375x +  +35375x +  +  +  +  +  +  +  +  +  +  +1412x +1412x +1412x +  +1412x +177x +177x +  +1412x +59434x +  +  +  +  +  +1412x +  +  +  +  +7x +  +  +  +1405x +  +  +10x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +981x +48x +  +48x +  +48x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +991x +  +  +991x +943x +  +48x +48x +48x +48x +48x +  +48x +  +  +  +991x +991x +  +  +  +  +  +  +  +  +  +  +  +  +991x +  +  +  +991x +991x +991x +  +991x +  +991x +6x +6x +  +  +  +991x +  +991x +6x +  +  +  +  +  +  +991x +  +  +319x +319x +  +319x +  +  +  +  +  +  +  +  +319x +  +  +  +  +  +  +  +319x +  +  +  +  +  +  +  +  +  +319x +319x +  +  +  +319x +  +  +319x +317x +  +317x +  +317x +  +  +  +  +  +  +  +309x +  +  +  +  +  +  +309x +  +  +  +  +  +  +  +309x +  +  +  +  +  +  +  +  +  +  +311x +24x +  +287x +287x +  +287x +  +  +  +  +  +  +  +287x +  +  +  +  +  +  +  +287x +  +  +  +  +  +  +  +  +  +287x +  +  +  +287x +  +  +  +  +  +  +  +  +  +  +  +  +  +280x +  +  +  +  +  +280x +280x +  +  +  +  +280x +  +  +  +144x +144x +144x +  +  +  +  +  +  +  +144x +  +  +  +  +  +  +  +144x +  +  +  +  +  +  +  +  +  +  +144x +  +  +  +  +  +  +  +  +  +  +144x +144x +  +  +  +  +  +  +  +  +144x +144x +144x +  +  +  +  +  +  +  +144x +  +  +  +  +  +  +144x +  +  +  +  +  +  +  +144x +  +  +  +  +  +  +144x +144x +  +  +  +  +  +  +144x +  +  +144x +144x +144x +  +  +  +  +  +  +  +  +144x +144x +  +  +  +  +  +144x +  +  +  +  +144x +  +  +144x +  +  +  +  +  +  +  +144x +  +  +  +  +144x +  +  +  +280x +280x +280x +  +  +  +  +  +  +  +  +280x +  +  +  +  +  +  +  +  +280x +  +  +  +  +  +  +  +280x +  +280x +144x +  +  +  +  +  +  +  +136x +136x +  +  +  +  +  +  +  +  +  +280x +  +  +  +  +280x +  +  +280x +280x +  +  +  +  +280x +  +  +120x +120x +120x +  +  +  +  +  +  +  +120x +  +  +  +  +  +  +  +  +120x +  +  +  +  +  +  +  +120x +  +  +  +  +  +  +  +120x +  +120x +  +  +  +  +120x +  +  +120x +120x +  +  +  +  +120x +  +  +128x +128x +128x +  +  +  +  +  +  +  +128x +  +  +  +  +  +  +  +  +128x +  +  +  +  +  +  +  +128x +  +  +  +  +  +  +  +128x +  +128x +  +  +  +  +128x +  +  +128x +128x +  +  +  +  +128x +  +  +  +  +  +  +  +  +  +  +  +976x +  +  +10x +  +  +  +  + 
/* eslint-disable no-param-reassign */
+const get = require("get-value");
+const _ = require("lodash");
+const { v4: uuidv4 } = require("uuid");
+ 
+const {
+  isObject,
+  isBlank,
+  validTimestamp,
+  getVersionedUtils,
+  isRudderSourcesEvent
+} = require("./util");
+const { getMergeRuleEvent } = require("./identity");
+ 
+const whDefaultColumnMappingRules = require("./config/WHDefaultConfig.js");
+const whTrackColumnMappingRules = require("./config/WHTrackConfig.js");
+const whTracksTableColumnMappingRules = require("./config/WHTracksTableConfig.js");
+const whTrackEventTableColumnMappingRules = require("./config/WHTrackEventTableConfig.js");
+const whUserColumnMappingRules = require("./config/WHUserConfig.js");
+const whPageColumnMappingRules = require("./config/WHPageConfig.js");
+const whScreenColumnMappingRules = require("./config/WHScreenConfig.js");
+const whGroupColumnMappingRules = require("./config/WHGroupConfig.js");
+const whAliasColumnMappingRules = require("./config/WHAliasConfig.js");
+const { isDataLakeProvider } = require("./config/helpers");
+ 
+const maxColumnsInEvent = parseInt(
+  process.env.WH_MAX_COLUMNS_IN_EVENT || "200",
+  10
+);
+ 
+const WH_POPULATE_SRC_DEST_INFO_IN_CONTEXT =
+  process.env.WH_POPULATE_SRC_DEST_INFO_IN_CONTEXT || true;
+ 
+const getDataType = (key, val, options) => {
+  const type = typeof val;
+  switch (type) {
+    case "number":
+      return Number.isInteger(val) ? "int" : "float";
+    case "boolean":
+      return "boolean";
+    default:
+      break;
+  }
+  if (validTimestamp(val)) {
+    return "datetime";
+  }
+  if (
+    options.getDataTypeOverride &&
+    typeof options.getDataTypeOverride === "function"
+  ) {
+    return options.getDataTypeOverride(key, val, options) || "string";
+  }
+  return "string";
+};
+ 
+const rudderCreatedTables = [
+  "tracks",
+  "pages",
+  "screens",
+  "aliases",
+  "groups",
+  "accounts"
+];
+ 
+const rudderIsolatedTables = ["users", "identifies"];
+ 
+const rudderReservedColums = {
+  track: {
+    ...whDefaultColumnMappingRules,
+    ...whTrackColumnMappingRules,
+    ...whTracksTableColumnMappingRules,
+    ...whTrackEventTableColumnMappingRules
+  },
+  identify: { ...whDefaultColumnMappingRules, ...whUserColumnMappingRules },
+  page: { ...whDefaultColumnMappingRules, ...whPageColumnMappingRules },
+  screen: { ...whDefaultColumnMappingRules, ...whScreenColumnMappingRules },
+  group: { ...whDefaultColumnMappingRules, ...whGroupColumnMappingRules },
+  alias: { ...whDefaultColumnMappingRules, ...whAliasColumnMappingRules }
+};
+ 
+function excludeRudderCreatedTableNames(
+  name,
+  skipReservedKeywordsEscaping = false
+) {
+  if (
+    rudderIsolatedTables.includes(name.toLowerCase()) ||
+    (rudderCreatedTables.includes(name.toLowerCase()) &&
+      !skipReservedKeywordsEscaping)
+  ) {
+    return `_${name}`;
+  }
+  return name;
+}
+ 
+/*
+  setDataFromColumnMappingAndComputeColumnTypes takes in input object and
+    1. reads columnMapping and adds corresponding data from message to output object
+    2. computes and sets the datatype of the added data to output in columnTypes object
+ 
+  Note: this function mutates output, columnTypes args for sake of perf
+ 
+  eg.1
+  input = {messageId: "m1", anonymousId: "a1"}
+  output = {}
+  columnMapping = {messageId: "id", anonymousId: "anonymous_id"}
+  columnTypes = {}
+  options = {}
+ 
+  setDataFromColumnMappingAndComputeColumnTypes(utils, output, input, configJson, columnTypes, options)
+ 
+  ----After in-place edit, the objects mutate to----
+ 
+  output = {id: "m1", anonymous_id: "a1"}
+  columnTypes = {id: "string", anonymous_id: "string"}
+  the data type of an key from columnMapping shouldn't be object. if its, then the column is dropped
+*/
+ 
+function setDataFromColumnMappingAndComputeColumnTypes(
+  utils,
+  output,
+  input,
+  columnMapping,
+  columnTypes,
+  options
+) {
+  Iif (!isObject(columnMapping)) return;
+  Object.keys(columnMapping).forEach(key => {
+    const valInMap = columnMapping[key];
+    let val;
+    if (_.isFunction(valInMap)) {
+      val = valInMap(input, options);
+    } else {
+      val = get(input, valInMap);
+    }
+ 
+    const columnName = utils.safeColumnName(options, key);
+    // do not set column if val is null/empty/object
+    if (typeof val === "object" || isBlank(val)) {
+      // delete in output and columnTypes, so as to remove if we user
+      // has set property with same name
+      // eslint-disable-next-line no-param-reassign
+      delete output[columnName];
+      // eslint-disable-next-line no-param-reassign
+      delete columnTypes[columnName];
+      return;
+    }
+    const datatype = getDataType(key, val, options);
+    if (datatype === "datetime") {
+      val = new Date(val).toISOString();
+    }
+    // eslint-disable-next-line no-param-reassign
+    output[columnName] = val;
+    // eslint-disable-next-line no-param-reassign
+    columnTypes[columnName] = datatype;
+  });
+}
+ 
+/*
+  setDataFromInputAndComputeColumnTypes takes in input object and
+    1. adds the key/values in input (recursively in case of keys with value of type object) to output object (prefix is added to all keys)
+    2. computes and sets the datatype of the added data to output in columnTypes object
+ 
+  Note: this function mutates output, columnTypes args for sake of perf
+ 
+  eg.
+  output = {}
+  input = { library: { name: 'rudder-sdk-ruby-sync', version: '1.0.6' } }
+  columnTypes = {}
+  options = {}
+  prefix = "context_"
+ 
+  setDataFromInputAndComputeColumnTypes(utils, output, input, columnTypes, options, prefix)
+ 
+  ----After in-place edit, the objects mutate to----
+ 
+  output = {context_library_name: 'rudder-sdk-ruby-sync', context_library_version: '1.0.6'}
+  columnTypes = {context_library_name: 'string', context_library_version: 'string'}
+ 
+*/
+ 
+function setDataFromInputAndComputeColumnTypes(
+  utils,
+  eventType,
+  output,
+  input,
+  columnTypes,
+  options,
+  prefix = "",
+  level = 0
+) {
+  if (!input || !isObject(input)) return;
+  Object.keys(input).forEach(key => {
+    if (
+      isObject(input[key]) &&
+      (options.sourceCategory !== "cloud" || level < 3)
+    ) {
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        output,
+        input[key],
+        columnTypes,
+        options,
+        `${prefix + key}_`,
+        level + 1
+      );
+    } else {
+      let val = input[key];
+      // do not set column if val is null/empty
+      if (isBlank(val)) {
+        return;
+      }
+      if (
+        options.sourceCategory === "cloud" &&
+        level >= 3 &&
+        isObject(input[key])
+      ) {
+        val = JSON.stringify(val);
+      }
+ 
+      const datatype = getDataType(key, val, options);
+      Iif (datatype === "datetime") {
+        val = new Date(val).toISOString();
+      }
+      let safeKey = utils.transformColumnName(options, prefix + key);
+      Eif (safeKey !== "") {
+        safeKey = utils.safeColumnName(options, safeKey);
+        // remove rudder reserved columns name if set by user
+        if (
+          rudderReservedColums[eventType] &&
+          rudderReservedColums[eventType][safeKey.toLowerCase()]
+        ) {
+          return;
+        }
+        // eslint-disable-next-line no-param-reassign
+        output[safeKey] = val;
+        // eslint-disable-next-line no-param-reassign
+        columnTypes[safeKey] = datatype;
+      }
+    }
+  });
+}
+ 
+/*
+ * uuid_ts and loaded_at datatypes are passed from here to create appropriate columns.
+ * Corresponding values are inserted when loading into the warehouse
+ */
+function getColumns(options, event, columnTypes) {
+  const columns = {};
+  const uuidTS = options.provider === "snowflake" ? "UUID_TS" : "uuid_ts";
+  columns[uuidTS] = "datetime";
+  // add loaded_at for bq to be segment compatible
+  if (options.provider === "bq") {
+    const loadedAt = "loaded_at";
+    columns[loadedAt] = "datetime";
+  }
+  Object.keys(event).forEach(key => {
+    columns[key] = columnTypes[key] || getDataType(key, event[key], options);
+  });
+  /*
+   1) throw error if too many columns in an event just in case to avoid creating too many columns in warehouse due to a spurious event
+   2) if the events are coming from rudder-sources, ignore the column limit as the event columns are controlled by user
+  */
+  if (
+    Object.keys(columns).length > maxColumnsInEvent &&
+    !isRudderSourcesEvent(event) &&
+    !isDataLakeProvider(options.provider)
+  ) {
+    throw new Error(
+      `${options.provider} transfomer: Too many columns outputted from the event`
+    );
+  }
+  return columns;
+}
+ 
+const fullEventColumnTypeByProvider = {
+  snowflake: "json",
+  rs: "text",
+  bq: "string",
+  postgres: "json",
+  mssql: "json",
+  azure_synapse: "json",
+  clickhouse: "string",
+  s3_datalake: "string",
+  deltalake: "string",
+  gcs_datalake: "string",
+  azure_datalake: "string"
+};
+ 
+function storeRudderEvent(utils, message, output, columnTypes, options) {
+  if (options.whStoreEvent === true) {
+    const colName = utils.safeColumnName(options, "rudder_event");
+    // eslint-disable-next-line no-param-reassign
+    output[colName] = JSON.stringify(message);
+    // eslint-disable-next-line no-param-reassign
+    columnTypes[colName] = fullEventColumnTypeByProvider[options.provider];
+  }
+}
+ 
+/*
+  Examples:
+ 
+  1. track event
+  input: {
+    "message": {
+      "type": "track",
+      "event": "Example Event",
+      "sentAt": "2020-08-24T20:19:05.560Z",
+      "userId": "fec930b2-ab00-4b9d-a912-ed48ab5a5b52",
+      "context": {
+        "library": {
+          "name": "rudder-sdk-ruby-sync",
+          "version": "1.0.6"
+        }
+      },
+      "messageId": "e8e5d7e7-d9e2-4f49-833b-5b01bafa3933",
+      "timestamp": "2020-08-24T20:19:05.560Z",
+      "properties": {
+        "id": true,
+        "is_anonymous_user": true,
+        "score": 5
+      },
+      "anonymousId": "26508834-c290-4354-9303-11c9b339a58a",
+      "integrations": {
+        "All": true
+      }
+    }
+  }
+  output: [
+    {
+      "output": {
+        "metadata": {
+          "table": "tracks",
+          "columns": {
+            "uuid_ts": "datetime",
+            "context_library_name": "string",
+            "context_library_version": "string",
+            "event_text": "string",
+            "id": "string",
+            "anonymous_id": "string",
+            "user_id": "string",
+            "sent_at": "datetime",
+            "timestamp": "datetime",
+            "event": "string"
+          }
+        },
+        "data": {
+          "context_library_name": "rudder-sdk-ruby-sync",
+          "context_library_version": "1.0.6",
+          "event_text": "Example Event",
+          "id": "e8e5d7e7-d9e2-4f49-833b-5b01bafa3933",
+          "anonymous_id": "26508834-c290-4354-9303-11c9b339a58a",
+          "user_id": "fec930b2-ab00-4b9d-a912-ed48ab5a5b52",
+          "sent_at": "2020-08-24T20:19:05.560Z",
+          "timestamp": "2020-08-24T20:19:05.560Z",
+          "event": "example_event"
+        }
+    },
+    "statusCode": 200
+    },
+    {
+      "output": {
+        "metadata": {
+          "table": "example_event",
+          "columns": {
+            "uuid_ts": "datetime",
+            "id": "string",
+            "is_anonymous_user": "boolean",
+            "score": "int",
+            "context_library_name": "string",
+            "context_library_version": "string",
+            "event_text": "string",
+            "anonymous_id": "string",
+            "user_id": "string",
+            "sent_at": "datetime",
+            "timestamp": "datetime",
+            "event": "string"
+          }
+        },
+        "data": {
+          "id": "e8e5d7e7-d9e2-4f49-833b-5b01bafa3933",
+          "is_anonymous_user": true,
+          "score": 5,
+          "context_library_name": "rudder-sdk-ruby-sync",
+          "context_library_version": "1.0.6",
+          "event_text": "Example Event",
+          "anonymous_id": "26508834-c290-4354-9303-11c9b339a58a",
+          "user_id": "fec930b2-ab00-4b9d-a912-ed48ab5a5b52",
+          "sent_at": "2020-08-24T20:19:05.560Z",
+          "timestamp": "2020-08-24T20:19:05.560Z",
+          "event": "example_event"
+        }
+      },
+      "statusCode": 200
+    }
+ 
+  ]
+ 
+  2.identify event
+  input: {
+    "message": {
+      "type": "identify",
+      "channel": "web",
+      "context": {
+        "app": {
+          "build": "1.0.0"
+        }
+      },
+      "request_ip": "1.1.1.1",
+      "anonymousId": "26508834-c290-4354-9303-11c9b339a58a",
+      "userId": "fec930b2-ab00-4b9d-a912-ed48ab5a5b52",
+      "traits": {
+        "name": "srikanth",
+        "email": "srikanth@rudderlabs.com",
+        "userId": "u1"
+      },
+      "sentAt": "2006-01-02T15:04:05.000Z07:00"
+    }
+  }
+ 
+  output: [
+    {
+      "output": {
+        "metadata": {
+          "table": "identifies",
+          "columns": {
+            "uuid_ts": "datetime",
+            "name": "string",
+            "email": "string",
+            "context_app_build": "string",
+            "_user_id": "string",
+            "anonymous_id": "string",
+            "user_id": "string",
+            "context_ip": "string",
+            "sent_at": "string",
+            "channel": "string"
+          }
+        },
+        "data": {
+          "name": "srikanth",
+          "email": "srikanth@rudderlabs.com",
+          "context_app_build": "1.0.0",
+          "_user_id": "u1",
+          "anonymous_id": "26508834-c290-4354-9303-11c9b339a58a",
+          "user_id": "fec930b2-ab00-4b9d-a912-ed48ab5a5b52",
+          "context_ip": "1.1.1.1",
+          "sent_at": "2006-01-02T15:04:05.000Z07:00",
+          "channel": "web"
+        }
+      },
+      "statusCode": 200
+    },
+    {
+      "output": {
+        "metadata": {
+          "table": "users",
+          "columns": {
+            "uuid_ts": "datetime",
+            "name": "string",
+            "email": "string",
+            "context_app_build": "string",
+            "_user_id": "string",
+            "id": "string",
+            "received_at": "datetime"
+          }
+        },
+        "data": {
+          "name": "srikanth",
+          "email": "srikanth@rudderlabs.com",
+          "context_app_build": "1.0.0",
+          "_user_id": "u1",
+          "id": "fec930b2-ab00-4b9d-a912-ed48ab5a5b52",
+          "received_at": "2020-08-25T07:21:48.481Z"
+        }
+      },
+      "statusCode": 200
+    }
+  ]
+*/
+ 
+/*
+ * Adds source and destination specific information into context
+ * */
+function enhanceContextWithSourceDestInfo(message, metadata) {
+  Iif (!WH_POPULATE_SRC_DEST_INFO_IN_CONTEXT) {
+    return;
+  }
+  if (!metadata) {
+    return;
+  }
+  const context = message.context || {};
+  context.sourceId = metadata.sourceId;
+  context.sourceType = metadata.sourceType;
+  context.destinationId = metadata.destinationId;
+  context.destinationType = metadata.destinationType;
+ 
+  message.context = context;
+}
+ 
+function processWarehouseMessage(message, options) {
+  const utils = getVersionedUtils(options.whSchemaVersion);
+  options.utils = utils;
+  /* 
+   * integration options example
+    "integrations": {
+      "RS": {
+        "options": {
+          "skipReservedKeywordsEscaping": true,
+          "skipTracksTable": true,
+          "useBlendoCasing": true
+        }
+      }
+    }
+  */
+  options.integrationOptions =
+    message.integrations && message.integrations[options.provider.toUpperCase()]
+      ? message.integrations[options.provider.toUpperCase()].options
+      : {};
+  const responses = [];
+  const eventType = message.type.toLowerCase();
+  const skipTracksTable = options.integrationOptions.skipTracksTable || false;
+  const skipReservedKeywordsEscaping =
+    options.integrationOptions.skipReservedKeywordsEscaping || false;
+ 
+  if (isBlank(message.messageId)) {
+    const randomID = uuidv4();
+    message.messageId = `auto-${randomID}`;
+  }
+ 
+  // Adding source and destination specific information.
+  enhanceContextWithSourceDestInfo(message, options.metadata);
+ 
+  if (isBlank(message.receivedAt) || !validTimestamp(message.receivedAt)) {
+    message.receivedAt =
+      options.metadata && options.metadata.receivedAt
+        ? options.metadata.receivedAt
+        : new Date().toISOString();
+  }
+ 
+  // store columnTypes as each column is set, so as not to call getDataType again
+  switch (eventType) {
+    case "track": {
+      // set properties common to both tracks and event table
+      const commonProps = {};
+      const commonColumnTypes = {};
+ 
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        commonProps,
+        message.context,
+        commonColumnTypes,
+        options,
+        "context_"
+      );
+      setDataFromColumnMappingAndComputeColumnTypes(
+        utils,
+        commonProps,
+        message,
+        whTrackColumnMappingRules,
+        commonColumnTypes,
+        options
+      );
+      setDataFromColumnMappingAndComputeColumnTypes(
+        utils,
+        commonProps,
+        message,
+        whDefaultColumnMappingRules,
+        commonColumnTypes,
+        options
+      );
+ 
+      // set event column based on event_text in the tracks table
+      const eventColName = utils.safeColumnName(options, "event");
+      commonProps[eventColName] = utils.transformTableName(
+        options,
+        commonProps[utils.safeColumnName(options, "event_text")]
+      );
+      commonColumnTypes[eventColName] = "string";
+ 
+      // -----start: tracks table------
+      if (!skipTracksTable) {
+        const tracksColumnTypes = {};
+        // shallow copy is sufficient since it does not contains nested objects
+        const tracksEvent = { ...commonProps };
+ 
+        setDataFromColumnMappingAndComputeColumnTypes(
+          utils,
+          tracksEvent,
+          message,
+          whTracksTableColumnMappingRules,
+          tracksColumnTypes,
+          options
+        );
+        storeRudderEvent(
+          utils,
+          message,
+          tracksEvent,
+          tracksColumnTypes,
+          options
+        );
+        const tracksMetadata = {
+          table: utils.safeTableName(options, "tracks"),
+          columns: getColumns(options, tracksEvent, {
+            ...tracksColumnTypes,
+            ...commonColumnTypes
+          }), // override tracksColumnTypes with columnTypes from commonColumnTypes
+          receivedAt: message.receivedAt
+        };
+        responses.push({
+          metadata: tracksMetadata,
+          data: tracksEvent
+        });
+      }
+ 
+      // -----end: tracks table------
+ 
+      // -----start: event table------
+ 
+      // do not create event table in case of empty event name (after utils.transformColumnName)
+      if (_.toString(commonProps[eventColName]).trim() === "") {
+        break;
+      }
+      const trackProps = {};
+      const eventTableColumnTypes = {};
+ 
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        trackProps,
+        message.properties,
+        eventTableColumnTypes,
+        options
+      );
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        trackProps,
+        message.userProperties,
+        eventTableColumnTypes,
+        options
+      );
+      setDataFromColumnMappingAndComputeColumnTypes(
+        utils,
+        commonProps,
+        message,
+        whTrackEventTableColumnMappingRules,
+        commonColumnTypes,
+        options
+      );
+ 
+      // always set commonProps last so that they are not overwritten
+      const eventTableEvent = {
+        ...trackProps,
+        ...commonProps
+      };
+      const eventTableMetadata = {
+        table: excludeRudderCreatedTableNames(
+          utils.safeTableName(
+            options,
+            utils.transformColumnName(options, eventTableEvent[eventColName])
+          ),
+          skipReservedKeywordsEscaping
+        ),
+        columns: getColumns(options, eventTableEvent, {
+          ...eventTableColumnTypes,
+          ...commonColumnTypes
+        }), // override tracksColumnTypes with columnTypes from commonColumnTypes
+        receivedAt: message.receivedAt
+      };
+      responses.push({
+        metadata: eventTableMetadata,
+        data: eventTableEvent
+      });
+ 
+      // -----start: identity_merge_rules table------
+      const mergeRuleEvent = getMergeRuleEvent(message, eventType, options);
+      Iif (mergeRuleEvent) {
+        responses.push(mergeRuleEvent);
+      }
+      // -----end: identity_merge_rules table------
+ 
+      break;
+    }
+    case "identify": {
+      // set properties common to both identifies and users table
+      const commonProps = {};
+      const commonColumnTypes = {};
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        commonProps,
+        message.userProperties,
+        commonColumnTypes,
+        options
+      );
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        commonProps,
+        message.context ? message.context.traits : {},
+        commonColumnTypes,
+        options
+      );
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        commonProps,
+        message.traits,
+        commonColumnTypes,
+        options,
+        ""
+      );
+ 
+      // set context props
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        commonProps,
+        message.context,
+        commonColumnTypes,
+        options,
+        "context_"
+      );
+ 
+      // TODO: create a list of reserved keywords and append underscore for all in setDataFromInputAndComputeColumnTypes
+      const userIdColumn = utils.safeColumnName(options, "user_id");
+      Iif (_.has(commonProps, userIdColumn)) {
+        const newUserIdColumn = `_${userIdColumn}`;
+        commonProps[newUserIdColumn] = commonProps[userIdColumn];
+        delete commonProps[userIdColumn];
+        commonColumnTypes[newUserIdColumn] = commonColumnTypes[userIdColumn];
+        delete commonColumnTypes[userIdColumn];
+      }
+ 
+      // -----start: identifies table------
+      const identifiesEvent = { ...commonProps };
+      const identifiesColumnTypes = {};
+      setDataFromColumnMappingAndComputeColumnTypes(
+        utils,
+        identifiesEvent,
+        message,
+        whDefaultColumnMappingRules,
+        identifiesColumnTypes,
+        options
+      );
+      storeRudderEvent(
+        utils,
+        message,
+        identifiesEvent,
+        identifiesColumnTypes,
+        options
+      );
+      const identifiesMetadata = {
+        table: utils.safeTableName(options, "identifies"),
+        columns: getColumns(options, identifiesEvent, {
+          ...commonColumnTypes,
+          ...identifiesColumnTypes
+        }), // override commonColumnTypes with columnTypes from setDataFromColumnMappingAndComputeColumnTypes
+        receivedAt: message.receivedAt
+      };
+      responses.push({
+        metadata: identifiesMetadata,
+        data: identifiesEvent
+      });
+      // -----end: identifies table------
+ 
+      // -----start: identity_merge_rules table------
+      const mergeRuleEvent = getMergeRuleEvent(message, eventType, options);
+      Iif (mergeRuleEvent) {
+        responses.push(mergeRuleEvent);
+      }
+      // -----end: identity_merge_rules table------
+ 
+      // -----start: users table------
+      // do not create a user record if userId is not present in payload
+      Iif (_.toString(message.userId).trim() === "") {
+        break;
+      }
+      const usersEvent = { ...commonProps };
+      const usersColumnTypes = {};
+      setDataFromColumnMappingAndComputeColumnTypes(
+        utils,
+        usersEvent,
+        message,
+        whUserColumnMappingRules,
+        usersColumnTypes,
+        options
+      );
+      // set id
+      usersEvent[utils.safeColumnName(options, "id")] = message.userId;
+      usersColumnTypes[utils.safeColumnName(options, "id")] = getDataType(
+        utils.safeColumnName(options, "id"),
+        message.userId,
+        options
+      );
+      // set received_at
+      usersEvent[
+        utils.safeColumnName(options, "received_at")
+      ] = message.receivedAt
+        ? new Date(message.receivedAt).toISOString()
+        : new Date().toISOString();
+      usersColumnTypes[utils.safeColumnName(options, "received_at")] =
+        "datetime";
+ 
+      const usersMetadata = {
+        table: utils.safeTableName(options, "users"),
+        columns: getColumns(options, usersEvent, {
+          ...commonColumnTypes,
+          ...usersColumnTypes
+        }), // override commonColumnTypes with columnTypes from setDataFromColumnMappingAndComputeColumnTypes
+        receivedAt: message.receivedAt
+      };
+      responses.push({
+        metadata: usersMetadata,
+        data: usersEvent
+      });
+      // -----end: users table------
+      break;
+    }
+    case "page":
+    case "screen": {
+      const event = {};
+      const columnTypes = {};
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        event,
+        message.properties,
+        columnTypes,
+        options
+      );
+      // set rudder properties after user set properties to prevent overwriting
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        event,
+        message.context,
+        columnTypes,
+        options,
+        "context_"
+      );
+      setDataFromColumnMappingAndComputeColumnTypes(
+        utils,
+        event,
+        message,
+        whDefaultColumnMappingRules,
+        columnTypes,
+        options
+      );
+      storeRudderEvent(utils, message, event, columnTypes, options);
+ 
+      if (eventType === "page") {
+        setDataFromColumnMappingAndComputeColumnTypes(
+          utils,
+          event,
+          message,
+          whPageColumnMappingRules,
+          columnTypes,
+          options
+        );
+      } else Eif (eventType === "screen") {
+        setDataFromColumnMappingAndComputeColumnTypes(
+          utils,
+          event,
+          message,
+          whScreenColumnMappingRules,
+          columnTypes,
+          options
+        );
+      }
+ 
+      const metadata = {
+        table: utils.safeTableName(options, `${eventType}s`),
+        columns: getColumns(options, event, columnTypes),
+        receivedAt: message.receivedAt
+      };
+      responses.push({ metadata, data: event });
+ 
+      // -----start: identity_merge_rules table------
+      const mergeRuleEvent = getMergeRuleEvent(message, eventType, options);
+      Iif (mergeRuleEvent) {
+        responses.push(mergeRuleEvent);
+      }
+      // -----end: identity_merge_rules table------
+ 
+      break;
+    }
+    case "group": {
+      const event = {};
+      const columnTypes = {};
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        event,
+        message.traits,
+        columnTypes,
+        options
+      );
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        event,
+        message.context,
+        columnTypes,
+        options,
+        "context_"
+      );
+      setDataFromColumnMappingAndComputeColumnTypes(
+        utils,
+        event,
+        message,
+        whDefaultColumnMappingRules,
+        columnTypes,
+        options
+      );
+      setDataFromColumnMappingAndComputeColumnTypes(
+        utils,
+        event,
+        message,
+        whGroupColumnMappingRules,
+        columnTypes,
+        options
+      );
+      storeRudderEvent(utils, message, event, columnTypes, options);
+ 
+      const metadata = {
+        table: utils.safeTableName(options, "groups"),
+        columns: getColumns(options, event, columnTypes),
+        receivedAt: message.receivedAt
+      };
+      responses.push({ metadata, data: event });
+ 
+      // -----start: identity_merge_rules table------
+      const mergeRuleEvent = getMergeRuleEvent(message, eventType, options);
+      Iif (mergeRuleEvent) {
+        responses.push(mergeRuleEvent);
+      }
+      // -----end: identity_merge_rules table------
+ 
+      break;
+    }
+    case "alias": {
+      const event = {};
+      const columnTypes = {};
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        event,
+        message.traits,
+        columnTypes,
+        options
+      );
+      setDataFromInputAndComputeColumnTypes(
+        utils,
+        eventType,
+        event,
+        message.context,
+        columnTypes,
+        options,
+        "context_"
+      );
+      setDataFromColumnMappingAndComputeColumnTypes(
+        utils,
+        event,
+        message,
+        whDefaultColumnMappingRules,
+        columnTypes,
+        options
+      );
+      setDataFromColumnMappingAndComputeColumnTypes(
+        utils,
+        event,
+        message,
+        whAliasColumnMappingRules,
+        columnTypes,
+        options
+      );
+      storeRudderEvent(utils, message, event, columnTypes, options);
+ 
+      const metadata = {
+        table: utils.safeTableName(options, "aliases"),
+        columns: getColumns(options, event, columnTypes),
+        receivedAt: message.receivedAt
+      };
+      responses.push({ metadata, data: event });
+ 
+      // -----start: identity_merge_rules table------
+      const mergeRuleEvent = getMergeRuleEvent(message, eventType, options);
+      Iif (mergeRuleEvent) {
+        responses.push(mergeRuleEvent);
+      }
+      // -----end: identity_merge_rules table------
+ 
+      break;
+    }
+    case "merge": {
+      const mergeRuleEvent = getMergeRuleEvent(message, eventType, options);
+      if (mergeRuleEvent) {
+        responses.push(mergeRuleEvent);
+      }
+      break;
+    }
+    default:
+      throw new Error("Unknown event type", eventType);
+  }
+  return responses;
+}
+ 
+module.exports = {
+  processWarehouseMessage,
+  fullEventColumnTypeByProvider,
+  getDataType
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/util.js.html b/coverage/lcov-report/rudder-transformer/warehouse/util.js.html new file mode 100644 index 00000000000..ca634cdf9ef --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/util.js.html @@ -0,0 +1,317 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse util.js

+
+ +
+ 93.55% + Statements + 29/31 +
+ + +
+ 86.96% + Branches + 20/23 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 93.55% + Lines + 29/31 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +8010x +10x +  +10x +10x +  +10x +10x +  +10x +  +10x +54238x +54238x +  +  +  +  +  +  +10x +54449x +  +  +  +  +  +10x +  +  +  +  +  +28193x +  +4856x +4856x +4856x +  +  +23337x +  +  +  +991x +  +  +  +991x +  +  +  +  +  +  +22x +  +  +10x +72x +40x +40x +8x +  +32x +  +32x +  +  +10x +  +  +  +  +  +  +  +  +  + 
const _ = require("lodash");
+const get = require("get-value");
+ 
+const v0 = require("./v0/util");
+const v1 = require("./v1/util");
+ 
+const minTimeInMs = Date.parse("0001-01-01T00:00:00Z");
+const maxTimeInMs = Date.parse("9999-12-31T23:59:59.999Z");
+ 
+const sourceCategoriesToUseRecordId = ["cloud", "singer-protocol"];
+ 
+const isObject = value => {
+  const type = typeof value;
+  return (
+    value != null &&
+    (type === "object" || type === "function") &&
+    !Array.isArray(value)
+  );
+};
+ 
+const isBlank = value => {
+  return _.isEmpty(_.toString(value));
+};
+ 
+// https://www.myintervals.com/blog/2009/05/20/iso-8601-date-validation-that-doesnt-suck/
+// make sure to disable prettier for regex expression
+// prettier-ignore
+const timestampRegex = new RegExp(
+  // eslint-disable-next-line no-useless-escape
+  /^([\+-]?\d{4})((-)((0[1-9]|1[0-2])(-([12]\d|0[1-9]|3[01])))([T\s]((([01]\d|2[0-3])((:)[0-5]\d))([\:]\d+)?)?(:[0-5]\d([\.]\d+)?)?([zZ]|([\+-])([01]\d|2[0-3]):?([0-5]\d)?)?)?)$/
+);
+ 
+function validTimestamp(input) {
+  if (timestampRegex.test(input)) {
+    // check if date value lies in between min time and max time. if not then it's not a valid timestamp
+    const dateInMs = Date.parse(new Date(input).toISOString());
+    Eif (minTimeInMs <= dateInMs && dateInMs <= maxTimeInMs) {
+      return true;
+    }
+  }
+  return false;
+}
+ 
+function getVersionedUtils(schemaVersion) {
+  switch (schemaVersion) {
+    case "v0":
+      return v0;
+    case "v1":
+      return v1;
+    default:
+      return v1;
+  }
+}
+ 
+function isRudderSourcesEvent(event) {
+  return event.channel === "sources" || event.CHANNEL === "sources";
+}
+ 
+const getCloudRecordID = (message, fallbackValue) => {
+  if (get(message, "context.sources.version")) {
+    const { recordId } = message;
+    if (typeof recordId === "object" || isBlank(recordId)) {
+      throw new Error("recordId cannot be empty for cloud sources events");
+    }
+    return recordId;
+  }
+  return fallbackValue || null;
+};
+ 
+module.exports = {
+  isObject,
+  isBlank,
+  timestampRegex,
+  validTimestamp,
+  getVersionedUtils,
+  isRudderSourcesEvent,
+  sourceCategoriesToUseRecordId,
+  getCloudRecordID
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/v1/index.html b/coverage/lcov-report/rudder-transformer/warehouse/v1/index.html new file mode 100644 index 00000000000..1e0c98935f4 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/v1/index.html @@ -0,0 +1,111 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/v1 + + + + + + + + + +
+
+

All files rudder-transformer/warehouse/v1

+
+ +
+ 95.77% + Statements + 68/71 +
+ + +
+ 86.76% + Branches + 59/68 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 95.71% + Lines + 67/70 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
util.js +
+
95.77%68/7186.76%59/68100%7/795.71%67/70
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/rudder-transformer/warehouse/v1/util.js.html b/coverage/lcov-report/rudder-transformer/warehouse/v1/util.js.html new file mode 100644 index 00000000000..d84e4cd8c27 --- /dev/null +++ b/coverage/lcov-report/rudder-transformer/warehouse/v1/util.js.html @@ -0,0 +1,584 @@ + + + + + + Code coverage report for rudder-transformer/warehouse/v1/util.js + + + + + + + + + +
+
+

All files / rudder-transformer/warehouse/v1 util.js

+
+ +
+ 95.77% + Statements + 68/71 +
+ + +
+ 86.76% + Branches + 59/68 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 95.71% + Lines + 67/70 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +16910x +  +10x +10x +  +  +1412x +  +1412x +1412x +1412x +  +  +1412x +176x +1236x +177x +177x +  +1059x +  +1412x +  +  +  +16x +  +1412x +  +175x +  +  +1237x +  +  +  +51400x +  +51400x +51400x +51400x +  +  +51400x +5798x +45602x +5637x +5637x +  +39965x +  +51400x +  +  +  +9200x +  +51400x +  +7623x +  +43777x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +37638x +37638x +37638x +424941x +424941x +424941x +  +  +  +  +396381x +  +28560x +26387x +  +28560x +  +  +37638x +37182x +  +37638x +37638x +  +  +  +55x +  +37583x +  +  +37638x +349x +  +37638x +3880x +  +37638x +  +  +  +  +  +  +  +  +  +  +  +40x +  +40x +40x +2x +  +40x +  +  +40x +  +  +  +2x +  +  +  +319x +319x +  +  +  +37361x +37361x +37361x +  +  +  +  +10x +  +  +  +  +  + 
const _ = require("lodash");
+ 
+const reservedANSIKeywordsMap = require("../config/ReservedKeywords.json");
+const { isDataLakeProvider } = require("../config/helpers");
+ 
+function safeTableName(options, name = "") {
+  const { provider } = options;
+  const skipReservedKeywordsEscaping =
+    options.integrationOptions.skipReservedKeywordsEscaping || false;
+  let tableName = name;
+  Iif (tableName === "") {
+    throw new Error("Table name cannot be empty.");
+  }
+  if (provider === "snowflake") {
+    tableName = tableName.toUpperCase();
+  } else if (provider === "postgres") {
+    tableName = tableName.substr(0, 63);
+    tableName = tableName.toLowerCase();
+  } else {
+    tableName = tableName.toLowerCase();
+  }
+  if (
+    !skipReservedKeywordsEscaping &&
+    reservedANSIKeywordsMap[provider.toUpperCase()][tableName.toUpperCase()]
+  ) {
+    tableName = `_${tableName}`;
+  }
+  if (isDataLakeProvider(provider)) {
+    // do not trim tableName if provider is datalake
+    return tableName;
+  }
+ 
+  return tableName.substr(0, 127);
+}
+ 
+function safeColumnName(options, name = "") {
+  const { provider } = options;
+  const skipReservedKeywordsEscaping =
+    options.integrationOptions.skipReservedKeywordsEscaping || false;
+  let columnName = name;
+  Iif (columnName === "") {
+    throw new Error("Column name cannot be empty.");
+  }
+  if (provider === "snowflake") {
+    columnName = columnName.toUpperCase();
+  } else if (provider === "postgres") {
+    columnName = columnName.substr(0, 63);
+    columnName = columnName.toLowerCase();
+  } else {
+    columnName = columnName.toLowerCase();
+  }
+  if (
+    !skipReservedKeywordsEscaping &&
+    reservedANSIKeywordsMap[provider.toUpperCase()][columnName.toUpperCase()]
+  ) {
+    columnName = `_${columnName}`;
+  }
+  if (isDataLakeProvider(provider)) {
+    // do not trim columnName if provider is datalake
+    return columnName;
+  }
+  return columnName.substr(0, 127);
+}
+ 
+/* transformColumnName convert keys like this &4yasdfa(84224_fs9##_____*3q to _4yasdfa_84224_fs9_3q
+  it removes symbols and joins continuous letters and numbers with single underscore and if first char is a number will append a underscore before the first number
+  few more examples
+  omega     to omega
+  omega v2  to omega_v_2
+  9mega     to _9_mega
+  mega&     to mega
+  ome$ga    to ome_ga
+  omega$    to omega
+  ome_ ga   to ome_ga
+  9mega________-________90 to _9_mega_90
+  it also handles char's where its ascii values are more than 127
+  example:
+  Cízǔ to C_z
+  CamelCase123Key to camel_case_123_key
+  1CComega to _1_c_comega
+  path to $1,00,000 to path_to_1_00_000
+  return an empty string if it couldn't find a char if its ascii value doesnt belong to numbers or english alphabets
+*/
+function transformName(provider, name = "") {
+  const extractedValues = [];
+  let extractedValue = "";
+  for (let i = 0; i < name.length; i += 1) {
+    const c = name[i];
+    const asciiValue = c.charCodeAt(0);
+    if (
+      (asciiValue >= 65 && asciiValue <= 90) ||
+      (asciiValue >= 97 && asciiValue <= 122) ||
+      (asciiValue >= 48 && asciiValue <= 57)
+    ) {
+      extractedValue += c;
+    } else {
+      if (extractedValue !== "") {
+        extractedValues.push(extractedValue);
+      }
+      extractedValue = "";
+    }
+  }
+  if (extractedValue !== "") {
+    extractedValues.push(extractedValue);
+  }
+  let key = extractedValues.join("_");
+  if (name.startsWith("_")) {
+    // do not remove leading underscores to allow esacaping rudder keywords with underscore
+    // _timestamp -> _timestamp
+    // __timestamp -> __timestamp
+    key = name.match(/^_*/)[0] + _.snakeCase(key.replace(/^_*/, ""));
+  } else {
+    key = _.snakeCase(key);
+  }
+ 
+  if (key !== "" && key.charCodeAt(0) >= 48 && key.charCodeAt(0) <= 57) {
+    key = `_${key}`;
+  }
+  if (provider === "postgres") {
+    key = key.substr(0, 63);
+  }
+  return key;
+}
+ 
+/* converts special characters other than '\' or '$' to _ 
+  adds _ if word doesnot starts with alphabet or _
+  Cízǔ to C_z_
+  CamelCase123Key to camelcase123key
+  1CComega to _1ccomega
+  path to $1,00,000 to path_to_$1_00_000
+  return an empty string if it couldn't find a char
+*/
+function transformNameToBlendoCase(provider, name = "") {
+  let key = name.replace(/[^a-zA-Z0-9\\$]/g, "_");
+ 
+  const re = /^[a-zA-Z_].*/;
+  if (!re.test(key)) {
+    key = `_${key}`;
+  }
+  Iif (provider === "postgres") {
+    key = key.substr(0, 63);
+  }
+  return key.toLowerCase();
+}
+ 
+function toBlendoCase(name = "") {
+  return name.trim().toLowerCase();
+}
+ 
+function transformTableName(options, name = "") {
+  const useBlendoCasing = options.integrationOptions.useBlendoCasing || false;
+  return useBlendoCasing ? toBlendoCase(name) : transformName("", name);
+}
+ 
+function transformColumnName(options, name = "") {
+  const { provider } = options;
+  const useBlendoCasing = options.integrationOptions.useBlendoCasing || false;
+  return useBlendoCasing
+    ? transformNameToBlendoCase(provider, name)
+    : transformName(provider, name);
+}
+ 
+module.exports = {
+  safeColumnName,
+  safeTableName,
+  transformColumnName,
+  transformTableName
+};
+ 
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 00000000000..03f704a609c Binary files /dev/null and b/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 00000000000..16de10c4349 --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,170 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 00000000000..6f5bc1f1933 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,21109 @@ +TN: +SF:routerUtils.js +FN:8,(anonymous_0) +FN:15,(anonymous_1) +FN:22,sendToDestination +FNF:3 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,sendToDestination +DA:3,1 +DA:4,1 +DA:5,1 +DA:7,1 +DA:8,1 +DA:9,0 +DA:10,0 +DA:12,0 +DA:15,1 +DA:16,0 +DA:17,0 +DA:19,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:34,0 +DA:37,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:48,0 +DA:55,0 +DA:58,1 +LF:25 +LH:7 +BRDA:9,0,0,0 +BRDA:9,0,1,0 +BRDA:10,1,0,0 +BRDA:10,1,1,0 +BRDA:16,2,0,0 +BRDA:16,2,1,0 +BRDA:27,3,0,0 +BRDA:27,3,1,0 +BRDA:39,4,0,0 +BRDA:39,4,1,0 +BRDA:39,5,0,0 +BRDA:39,5,1,0 +BRDA:52,6,0,0 +BRDA:52,6,1,0 +BRF:14 +BRH:0 +end_of_record +TN: +SF:testRouter.js +FN:13,(anonymous_0) +FN:21,(anonymous_1) +FN:34,(anonymous_2) +FN:38,(anonymous_3) +FN:42,(anonymous_4) +FN:43,capitalize +FN:50,(anonymous_6) +FN:55,(anonymous_7) +FN:62,(anonymous_8) +FN:71,(anonymous_9) +FN:86,(anonymous_10) +FN:210,(anonymous_11) +FN:211,(anonymous_12) +FN:217,(anonymous_13) +FNF:14 +FNH:9 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:2,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:2,(anonymous_4) +FNDA:40,capitalize +FNDA:22,(anonymous_6) +FNDA:18,(anonymous_7) +FNDA:3,(anonymous_8) +FNDA:2,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:91,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:10,1 +DA:11,1 +DA:13,1 +DA:14,0 +DA:15,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:26,0 +DA:29,0 +DA:32,1 +DA:34,1 +DA:35,2 +DA:38,1 +DA:39,1 +DA:42,1 +DA:44,40 +DA:48,2 +DA:49,2 +DA:50,2 +DA:51,22 +DA:54,2 +DA:55,2 +DA:56,18 +DA:58,2 +DA:59,2 +DA:62,1 +DA:63,3 +DA:64,3 +DA:65,3 +DA:66,1 +DA:68,2 +DA:69,2 +DA:70,2 +DA:72,2 +DA:73,2 +DA:79,2 +DA:80,2 +DA:82,2 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:90,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:107,0 +DA:109,0 +DA:111,0 +DA:112,0 +DA:117,0 +DA:123,2 +DA:124,2 +DA:125,2 +DA:126,2 +DA:127,2 +DA:128,2 +DA:129,1 +DA:131,1 +DA:134,0 +DA:135,0 +DA:140,0 +DA:146,2 +DA:148,0 +DA:149,0 +DA:150,0 +DA:152,0 +DA:154,0 +DA:156,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:165,0 +DA:166,0 +DA:169,0 +DA:170,0 +DA:186,0 +DA:192,0 +DA:197,2 +DA:200,2 +DA:203,1 +DA:206,1 +DA:210,1 +DA:211,91 +DA:212,0 +DA:213,0 +DA:217,1 +DA:218,0 +DA:221,1 +LF:102 +LH:53 +BRDA:20,0,0,0 +BRDA:20,0,1,0 +BRDA:22,1,0,0 +BRDA:22,1,1,0 +BRDA:44,2,0,4 +BRDA:44,2,1,36 +BRDA:65,3,0,1 +BRDA:65,3,1,2 +BRDA:65,4,0,3 +BRDA:65,4,1,2 +BRDA:82,5,0,0 +BRDA:82,5,1,2 +BRDA:84,6,0,0 +BRDA:84,6,1,0 +BRDA:90,7,0,0 +BRDA:90,7,1,0 +BRDA:90,7,2,0 +BRDA:90,7,3,0 +BRDA:95,8,0,0 +BRDA:95,8,1,0 +BRDA:103,9,0,0 +BRDA:103,9,1,0 +BRDA:113,10,0,0 +BRDA:113,10,1,0 +BRDA:123,11,0,2 +BRDA:123,11,1,0 +BRDA:124,12,0,2 +BRDA:124,12,1,0 +BRDA:128,13,0,1 +BRDA:128,13,1,1 +BRDA:136,14,0,0 +BRDA:136,14,1,0 +BRDA:146,15,0,0 +BRDA:146,15,1,2 +BRDA:146,16,0,2 +BRDA:146,16,1,2 +BRDA:148,17,0,0 +BRDA:148,17,1,0 +BRDA:160,18,0,0 +BRDA:160,18,1,0 +BRDA:162,19,0,0 +BRDA:162,19,1,0 +BRDA:165,20,0,0 +BRDA:165,20,1,0 +BRDA:204,21,0,1 +BRDA:204,21,1,0 +BRF:46 +BRH:15 +end_of_record +TN: +SF:adapters\network.js +FN:48,(anonymous_0) +FN:74,(anonymous_1) +FN:93,(anonymous_2) +FN:113,(anonymous_3) +FN:133,(anonymous_4) +FN:153,(anonymous_5) +FN:170,(anonymous_6) +FN:198,(anonymous_7) +FNF:8 +FNH:2 +FNDA:0,(anonymous_0) +FNDA:27,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:26,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +DA:4,7 +DA:5,7 +DA:6,7 +DA:7,7 +DA:8,7 +DA:11,7 +DA:12,7 +DA:14,7 +DA:48,7 +DA:51,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:61,0 +DA:63,0 +DA:74,7 +DA:76,27 +DA:77,27 +DA:78,22 +DA:80,5 +DA:82,27 +DA:93,7 +DA:95,0 +DA:96,0 +DA:97,0 +DA:99,0 +DA:101,0 +DA:113,7 +DA:115,26 +DA:116,26 +DA:117,26 +DA:119,0 +DA:121,26 +DA:133,7 +DA:135,0 +DA:136,0 +DA:137,0 +DA:139,0 +DA:141,0 +DA:153,7 +DA:155,0 +DA:156,0 +DA:157,0 +DA:159,0 +DA:161,0 +DA:170,7 +DA:171,0 +DA:172,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:183,0 +DA:185,0 +DA:187,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:201,0 +DA:205,0 +DA:208,0 +DA:210,0 +DA:212,0 +DA:219,0 +DA:220,0 +DA:222,7 +LF:72 +LH:25 +BRDA:11,0,0,7 +BRDA:11,0,1,7 +BRDA:12,1,0,7 +BRDA:12,1,1,7 +BRDA:177,2,0,0 +BRDA:177,2,1,0 +BRDA:183,3,0,0 +BRDA:183,3,1,0 +BRDA:183,3,2,0 +BRDA:183,3,3,0 +BRDA:183,3,4,0 +BRDA:183,3,5,0 +BRF:12 +BRH:4 +end_of_record +TN: +SF:adapters\utils\networkUtils.js +FN:13,(anonymous_0) +FN:76,(anonymous_1) +FN:88,(anonymous_2) +FN:139,(anonymous_3) +FNF:4 +FNH:1 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:8,(anonymous_3) +DA:2,6 +DA:3,6 +DA:9,6 +DA:10,6 +DA:11,6 +DA:13,6 +DA:14,0 +DA:72,0 +DA:76,6 +DA:77,0 +DA:78,0 +DA:80,0 +DA:82,0 +DA:84,0 +DA:88,6 +DA:89,0 +DA:95,0 +DA:99,0 +DA:108,0 +DA:110,0 +DA:116,0 +DA:126,0 +DA:127,0 +DA:129,0 +DA:131,0 +DA:139,6 +DA:140,8 +DA:141,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:159,0 +DA:165,8 +DA:166,8 +DA:172,6 +LF:38 +LH:13 +BRDA:72,0,0,0 +BRDA:72,0,1,0 +BRDA:77,1,0,0 +BRDA:77,1,1,0 +BRDA:80,2,0,0 +BRDA:80,2,1,0 +BRDA:95,3,0,0 +BRDA:95,3,1,0 +BRDA:96,4,0,0 +BRDA:96,4,1,0 +BRDA:110,5,0,0 +BRDA:110,5,1,0 +BRDA:111,6,0,0 +BRDA:111,6,1,0 +BRDA:111,6,2,0 +BRDA:111,6,3,0 +BRDA:129,7,0,0 +BRDA:129,7,1,0 +BRDA:140,8,0,0 +BRDA:140,8,1,8 +BRDA:143,9,0,0 +BRDA:143,9,1,0 +BRDA:143,10,0,0 +BRDA:143,10,1,0 +BRDA:151,11,0,0 +BRDA:151,11,1,0 +BRDA:154,12,0,0 +BRDA:154,12,1,0 +BRDA:155,13,0,0 +BRDA:155,13,1,0 +BRDA:167,14,0,8 +BRDA:167,14,1,0 +BRDA:168,15,0,8 +BRDA:168,15,1,0 +BRF:34 +BRH:3 +end_of_record +TN: +SF:cdk\heap\transform.js +FN:1,commonPostMapper +FNF:1 +FNH:1 +FNDA:2,commonPostMapper +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:7,2 +DA:12,2 +DA:15,1 +LF:7 +LH:7 +BRDA:4,0,0,2 +BRDA:4,0,1,0 +BRDA:4,1,0,2 +BRDA:4,1,1,2 +BRF:4 +BRH:3 +end_of_record +TN: +SF:constants\destinationCanonicalNames.js +FNF:0 +FNH:0 +DA:1,70 +DA:5,70 +DA:33,70 +LF:3 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:constants\index.js +FNF:0 +FNH:0 +DA:1,56 +DA:12,56 +DA:20,56 +DA:24,56 +DA:26,56 +DA:49,56 +DA:51,56 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:util\stats.js +FN:15,(anonymous_0) +FN:21,(anonymous_1) +FN:27,(anonymous_2) +FN:33,(anonymous_3) +FN:39,(anonymous_4) +FNF:5 +FNH:1 +FNDA:0,(anonymous_0) +FNDA:16,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +DA:1,70 +DA:3,70 +DA:4,70 +DA:5,70 +DA:7,70 +DA:15,70 +DA:16,0 +DA:17,0 +DA:21,70 +DA:22,16 +DA:23,16 +DA:27,70 +DA:28,0 +DA:29,0 +DA:33,70 +DA:34,0 +DA:35,0 +DA:39,70 +DA:40,0 +DA:41,0 +DA:45,70 +LF:21 +LH:13 +BRDA:4,0,0,70 +BRDA:4,0,1,70 +BRDA:5,1,0,70 +BRDA:5,1,1,70 +BRDA:15,2,0,0 +BRDA:16,3,0,0 +BRDA:16,3,1,0 +BRDA:21,4,0,0 +BRDA:21,5,0,6 +BRDA:22,6,0,16 +BRDA:22,6,1,0 +BRDA:27,7,0,0 +BRDA:27,8,0,0 +BRDA:28,9,0,0 +BRDA:28,9,1,0 +BRDA:33,10,0,0 +BRDA:34,11,0,0 +BRDA:34,11,1,0 +BRDA:39,12,0,0 +BRDA:40,13,0,0 +BRDA:40,13,1,0 +BRF:21 +BRH:6 +end_of_record +TN: +SF:v0\destinations\active_campaign\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:23,1 +DA:50,1 +DA:52,1 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\active_campaign\transform.js +FN:20,(anonymous_0) +FN:53,(anonymous_1) +FN:75,(anonymous_2) +FN:118,(anonymous_3) +FN:144,(anonymous_4) +FN:146,(anonymous_5) +FN:156,(anonymous_6) +FN:167,(anonymous_7) +FN:196,(anonymous_8) +FN:214,(anonymous_9) +FN:223,(anonymous_10) +FN:273,(anonymous_11) +FN:286,(anonymous_12) +FN:287,(anonymous_13) +FN:294,(anonymous_14) +FN:308,(anonymous_15) +FN:312,(anonymous_16) +FN:327,(anonymous_17) +FN:343,(anonymous_18) +FN:353,(anonymous_19) +FN:374,(anonymous_20) +FN:387,(anonymous_21) +FN:414,(anonymous_22) +FN:421,(anonymous_23) +FN:443,(anonymous_24) +FN:488,(anonymous_25) +FN:512,(anonymous_26) +FN:558,(anonymous_27) +FN:591,(anonymous_28) +FN:596,(anonymous_29) +FN:603,(anonymous_30) +FNF:31 +FNH:28 +FNDA:7,(anonymous_0) +FNDA:3,(anonymous_1) +FNDA:3,(anonymous_2) +FNDA:15,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:9,(anonymous_6) +FNDA:6,(anonymous_7) +FNDA:9,(anonymous_8) +FNDA:9,(anonymous_9) +FNDA:3,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:3,(anonymous_12) +FNDA:15,(anonymous_13) +FNDA:12,(anonymous_14) +FNDA:12,(anonymous_15) +FNDA:6,(anonymous_16) +FNDA:3,(anonymous_17) +FNDA:9,(anonymous_18) +FNDA:9,(anonymous_19) +FNDA:6,(anonymous_20) +FNDA:3,(anonymous_21) +FNDA:2,(anonymous_22) +FNDA:1,(anonymous_23) +FNDA:2,(anonymous_24) +FNDA:1,(anonymous_25) +FNDA:2,(anonymous_26) +FNDA:7,(anonymous_27) +FNDA:7,(anonymous_28) +FNDA:1,(anonymous_29) +FNDA:2,(anonymous_30) +DA:3,1 +DA:4,1 +DA:5,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:20,1 +DA:21,7 +DA:22,7 +DA:23,7 +DA:26,5 +DA:27,5 +DA:28,5 +DA:32,5 +DA:33,5 +DA:36,2 +DA:37,2 +DA:38,2 +DA:42,2 +DA:43,2 +DA:45,0 +DA:47,7 +DA:50,0 +DA:53,1 +DA:54,3 +DA:55,3 +DA:58,3 +DA:64,3 +DA:65,3 +DA:66,0 +DA:68,3 +DA:69,3 +DA:70,0 +DA:72,3 +DA:75,1 +DA:81,3 +DA:82,3 +DA:89,3 +DA:92,3 +DA:93,0 +DA:99,3 +DA:102,3 +DA:108,3 +DA:109,3 +DA:110,0 +DA:113,3 +DA:114,3 +DA:118,3 +DA:119,15 +DA:125,3 +DA:126,3 +DA:127,0 +DA:130,0 +DA:131,0 +DA:134,0 +DA:140,0 +DA:141,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,0 +DA:156,3 +DA:157,9 +DA:158,3 +DA:165,3 +DA:166,3 +DA:168,6 +DA:169,6 +DA:176,6 +DA:182,6 +DA:183,6 +DA:184,0 +DA:187,6 +DA:195,3 +DA:197,9 +DA:198,9 +DA:204,9 +DA:210,9 +DA:211,9 +DA:214,3 +DA:215,9 +DA:216,0 +DA:223,1 +DA:224,3 +DA:228,3 +DA:232,3 +DA:233,0 +DA:235,3 +DA:239,3 +DA:242,3 +DA:247,3 +DA:248,3 +DA:249,0 +DA:251,3 +DA:255,3 +DA:256,3 +DA:259,3 +DA:260,0 +DA:261,0 +DA:264,0 +DA:269,0 +DA:270,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:277,0 +DA:284,3 +DA:286,3 +DA:287,3 +DA:288,15 +DA:292,3 +DA:293,3 +DA:294,3 +DA:296,12 +DA:297,12 +DA:307,3 +DA:308,3 +DA:310,12 +DA:311,3 +DA:312,3 +DA:313,6 +DA:316,9 +DA:318,12 +DA:324,3 +DA:327,1 +DA:334,3 +DA:337,3 +DA:338,0 +DA:341,3 +DA:342,3 +DA:343,3 +DA:344,9 +DA:347,0 +DA:352,3 +DA:353,3 +DA:354,9 +DA:355,6 +DA:356,6 +DA:363,6 +DA:369,6 +DA:370,6 +DA:373,3 +DA:374,3 +DA:375,6 +DA:376,0 +DA:387,1 +DA:389,3 +DA:390,3 +DA:392,3 +DA:394,3 +DA:396,3 +DA:398,3 +DA:403,3 +DA:404,3 +DA:405,3 +DA:409,3 +DA:414,1 +DA:415,2 +DA:418,2 +DA:421,1 +DA:426,1 +DA:427,1 +DA:433,1 +DA:434,1 +DA:435,0 +DA:438,1 +DA:439,0 +DA:441,1 +DA:442,1 +DA:443,1 +DA:444,2 +DA:448,1 +DA:450,1 +DA:451,1 +DA:456,1 +DA:462,1 +DA:463,1 +DA:464,0 +DA:467,1 +DA:468,0 +DA:478,1 +DA:479,1 +DA:480,1 +DA:481,1 +DA:482,0 +DA:484,1 +DA:485,1 +DA:488,1 +DA:492,1 +DA:493,1 +DA:498,1 +DA:500,1 +DA:501,0 +DA:504,1 +DA:505,0 +DA:510,1 +DA:511,1 +DA:512,1 +DA:513,2 +DA:517,1 +DA:519,1 +DA:520,1 +DA:525,1 +DA:531,1 +DA:532,1 +DA:533,0 +DA:544,1 +DA:545,1 +DA:546,1 +DA:547,1 +DA:548,0 +DA:550,1 +DA:552,1 +DA:558,1 +DA:559,7 +DA:560,0 +DA:565,7 +DA:568,7 +DA:570,3 +DA:571,3 +DA:572,3 +DA:574,2 +DA:575,2 +DA:576,2 +DA:578,1 +DA:579,1 +DA:580,1 +DA:582,1 +DA:583,1 +DA:584,1 +DA:586,0 +DA:588,7 +DA:591,1 +DA:592,7 +DA:593,7 +DA:596,1 +DA:597,1 +DA:598,0 +DA:599,0 +DA:602,1 +DA:604,2 +DA:605,2 +DA:607,0 +DA:614,2 +DA:620,0 +DA:632,1 +DA:635,1 +LF:249 +LH:200 +BRDA:21,0,0,7 +BRDA:21,0,1,0 +BRDA:23,1,0,3 +BRDA:23,1,1,5 +BRDA:23,1,2,1 +BRDA:23,1,3,2 +BRDA:23,1,4,0 +BRDA:65,2,0,0 +BRDA:65,2,1,3 +BRDA:69,3,0,0 +BRDA:69,3,1,3 +BRDA:89,4,0,3 +BRDA:89,4,1,3 +BRDA:92,5,0,0 +BRDA:92,5,1,3 +BRDA:92,6,0,3 +BRDA:92,6,1,0 +BRDA:109,7,0,0 +BRDA:109,7,1,3 +BRDA:114,8,0,3 +BRDA:114,8,1,0 +BRDA:126,9,0,0 +BRDA:126,9,1,3 +BRDA:145,10,0,0 +BRDA:145,10,1,0 +BRDA:145,11,0,0 +BRDA:145,11,1,0 +BRDA:157,12,0,6 +BRDA:157,12,1,3 +BRDA:165,13,0,3 +BRDA:165,13,1,0 +BRDA:183,14,0,0 +BRDA:183,14,1,6 +BRDA:187,15,0,6 +BRDA:187,15,1,0 +BRDA:215,16,0,0 +BRDA:215,16,1,9 +BRDA:228,17,0,3 +BRDA:228,17,1,3 +BRDA:232,18,0,0 +BRDA:232,18,1,3 +BRDA:248,19,0,0 +BRDA:248,19,1,3 +BRDA:252,20,0,3 +BRDA:252,20,1,0 +BRDA:259,21,0,0 +BRDA:259,21,1,3 +BRDA:274,22,0,0 +BRDA:274,22,1,0 +BRDA:274,23,0,0 +BRDA:274,23,1,0 +BRDA:296,24,0,12 +BRDA:296,24,1,0 +BRDA:310,25,0,3 +BRDA:310,25,1,9 +BRDA:334,26,0,0 +BRDA:334,26,1,3 +BRDA:337,27,0,0 +BRDA:337,27,1,3 +BRDA:342,28,0,3 +BRDA:342,28,1,0 +BRDA:354,29,0,6 +BRDA:354,29,1,3 +BRDA:354,30,0,9 +BRDA:354,30,1,6 +BRDA:360,31,0,3 +BRDA:360,31,1,3 +BRDA:375,32,0,0 +BRDA:375,32,1,6 +BRDA:434,33,0,0 +BRDA:434,33,1,1 +BRDA:438,34,0,0 +BRDA:438,34,1,1 +BRDA:439,35,0,0 +BRDA:439,35,1,0 +BRDA:448,36,0,1 +BRDA:448,36,1,0 +BRDA:463,37,0,0 +BRDA:463,37,1,1 +BRDA:467,38,0,0 +BRDA:467,38,1,1 +BRDA:470,39,0,0 +BRDA:470,39,1,0 +BRDA:481,40,0,0 +BRDA:481,40,1,1 +BRDA:500,41,0,0 +BRDA:500,41,1,1 +BRDA:504,42,0,0 +BRDA:504,42,1,1 +BRDA:507,43,0,0 +BRDA:507,43,1,0 +BRDA:517,44,0,1 +BRDA:517,44,1,0 +BRDA:532,45,0,0 +BRDA:532,45,1,1 +BRDA:535,46,0,0 +BRDA:535,46,1,0 +BRDA:547,47,0,0 +BRDA:547,47,1,1 +BRDA:559,48,0,0 +BRDA:559,48,1,7 +BRDA:568,49,0,3 +BRDA:568,49,1,2 +BRDA:568,49,2,1 +BRDA:568,49,3,1 +BRDA:568,49,4,0 +BRDA:597,50,0,0 +BRDA:597,50,1,1 +BRDA:597,51,0,1 +BRDA:597,51,1,1 +BRDA:605,52,0,0 +BRDA:605,52,1,2 +BRDA:622,53,0,0 +BRDA:622,53,1,0 +BRDA:624,54,0,0 +BRDA:624,54,1,0 +BRDA:627,55,0,0 +BRDA:627,55,1,0 +BRF:118 +BRH:59 +end_of_record +TN: +SF:v0\destinations\active_campaign\util.js +FN:6,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:3,1 +DA:4,1 +DA:6,1 +DA:7,0 +DA:8,0 +DA:15,0 +DA:16,0 +DA:20,1 +LF:8 +LH:4 +BRDA:7,0,0,0 +BRDA:7,0,1,0 +BRDA:12,1,0,0 +BRDA:12,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:v0\destinations\adj\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:8,1 +DA:10,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\adj\transform.js +FN:18,responseBuilderSimple +FN:48,(anonymous_1) +FN:76,(anonymous_2) +FN:97,(anonymous_3) +FN:100,(anonymous_4) +FN:107,(anonymous_5) +FNF:6 +FNH:6 +FNDA:16,responseBuilderSimple +FNDA:18,(anonymous_1) +FNDA:18,(anonymous_2) +FNDA:18,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:2,(anonymous_5) +DA:1,1 +DA:2,1 +DA:14,1 +DA:16,1 +DA:19,16 +DA:20,15 +DA:21,15 +DA:22,15 +DA:27,1 +DA:29,14 +DA:30,7 +DA:31,7 +DA:32,7 +DA:33,6 +DA:34,6 +DA:36,1 +DA:38,13 +DA:39,10 +DA:41,13 +DA:42,13 +DA:43,12 +DA:44,12 +DA:47,12 +DA:48,9 +DA:49,18 +DA:51,9 +DA:55,3 +DA:58,12 +DA:59,12 +DA:60,12 +DA:61,12 +DA:62,12 +DA:63,12 +DA:64,12 +DA:65,12 +DA:66,12 +DA:69,1 +DA:70,1 +DA:72,0 +DA:76,1 +DA:77,18 +DA:78,1 +DA:83,17 +DA:85,17 +DA:87,16 +DA:88,16 +DA:90,1 +DA:94,16 +DA:97,1 +DA:98,18 +DA:100,1 +DA:101,1 +DA:102,0 +DA:103,0 +DA:106,1 +DA:108,2 +DA:109,2 +DA:111,0 +DA:118,2 +DA:124,0 +DA:136,1 +DA:139,1 +LF:62 +LH:57 +BRDA:22,0,0,1 +BRDA:22,0,1,14 +BRDA:23,1,0,15 +BRDA:23,1,1,15 +BRDA:23,1,2,14 +BRDA:29,2,0,7 +BRDA:29,2,1,7 +BRDA:32,3,0,6 +BRDA:32,3,1,1 +BRDA:38,4,0,10 +BRDA:38,4,1,3 +BRDA:39,5,0,10 +BRDA:39,5,1,3 +BRDA:42,6,0,12 +BRDA:42,6,1,1 +BRDA:42,7,0,13 +BRDA:42,7,1,13 +BRDA:42,7,2,13 +BRDA:47,8,0,9 +BRDA:47,8,1,3 +BRDA:64,9,0,10 +BRDA:64,9,1,2 +BRDA:69,10,0,1 +BRDA:69,10,1,0 +BRDA:69,11,0,1 +BRDA:69,11,1,1 +BRDA:77,12,0,1 +BRDA:77,12,1,17 +BRDA:85,13,0,16 +BRDA:85,13,1,1 +BRDA:101,14,0,0 +BRDA:101,14,1,1 +BRDA:101,15,0,1 +BRDA:101,15,1,1 +BRDA:109,16,0,0 +BRDA:109,16,1,2 +BRDA:126,17,0,0 +BRDA:126,17,1,0 +BRDA:128,18,0,0 +BRDA:128,18,1,0 +BRDA:131,19,0,0 +BRDA:131,19,1,0 +BRF:42 +BRH:33 +end_of_record +TN: +SF:v0\destinations\airship\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:21,1 +DA:32,1 +DA:44,1 +DA:46,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\airship\transform.js +FN:28,(anonymous_0) +FN:59,(anonymous_1) +FN:130,(anonymous_2) +FN:190,(anonymous_3) +FN:219,(anonymous_4) +FN:291,(anonymous_5) +FN:319,(anonymous_6) +FN:326,(anonymous_7) +FNF:8 +FNH:8 +FNDA:7,(anonymous_0) +FNDA:52,(anonymous_1) +FNDA:9,(anonymous_2) +FNDA:8,(anonymous_3) +FNDA:65,(anonymous_4) +FNDA:25,(anonymous_5) +FNDA:1,(anonymous_6) +FNDA:3,(anonymous_7) +DA:1,1 +DA:11,1 +DA:26,1 +DA:28,1 +DA:29,7 +DA:30,7 +DA:32,7 +DA:33,1 +DA:38,6 +DA:40,6 +DA:42,6 +DA:43,6 +DA:44,1 +DA:51,5 +DA:52,5 +DA:53,5 +DA:54,5 +DA:57,5 +DA:58,5 +DA:59,5 +DA:61,52 +DA:62,12 +DA:63,12 +DA:64,8 +DA:66,12 +DA:67,4 +DA:71,52 +DA:72,40 +DA:73,40 +DA:74,40 +DA:75,40 +DA:76,20 +DA:78,20 +DA:80,40 +DA:81,40 +DA:82,40 +DA:88,5 +DA:90,5 +DA:94,4 +DA:95,4 +DA:96,0 +DA:97,4 +DA:98,4 +DA:99,4 +DA:104,4 +DA:105,4 +DA:106,4 +DA:109,5 +DA:110,4 +DA:111,4 +DA:115,4 +DA:120,4 +DA:121,4 +DA:124,4 +DA:127,5 +DA:130,1 +DA:131,9 +DA:132,9 +DA:133,1 +DA:136,8 +DA:137,8 +DA:138,8 +DA:139,8 +DA:145,8 +DA:146,5 +DA:149,8 +DA:150,8 +DA:151,1 +DA:153,8 +DA:155,8 +DA:156,2 +DA:157,1 +DA:162,1 +DA:167,6 +DA:169,6 +DA:171,6 +DA:172,6 +DA:173,6 +DA:174,6 +DA:175,6 +DA:176,6 +DA:183,6 +DA:184,6 +DA:185,6 +DA:186,6 +DA:187,6 +DA:190,1 +DA:191,8 +DA:192,8 +DA:194,8 +DA:195,1 +DA:200,7 +DA:202,7 +DA:204,7 +DA:205,7 +DA:206,1 +DA:212,6 +DA:213,6 +DA:214,6 +DA:215,6 +DA:217,6 +DA:218,6 +DA:219,6 +DA:221,65 +DA:222,15 +DA:223,15 +DA:224,10 +DA:226,15 +DA:227,5 +DA:231,65 +DA:232,50 +DA:233,50 +DA:234,50 +DA:235,50 +DA:236,25 +DA:238,25 +DA:240,50 +DA:241,50 +DA:242,50 +DA:248,6 +DA:250,6 +DA:254,5 +DA:255,0 +DA:256,5 +DA:257,0 +DA:259,5 +DA:260,5 +DA:261,5 +DA:266,5 +DA:267,5 +DA:268,5 +DA:271,6 +DA:272,5 +DA:273,5 +DA:277,5 +DA:282,5 +DA:283,5 +DA:286,5 +DA:288,6 +DA:291,1 +DA:292,25 +DA:293,25 +DA:294,0 +DA:300,25 +DA:303,25 +DA:305,7 +DA:306,5 +DA:308,9 +DA:309,6 +DA:311,8 +DA:312,6 +DA:314,1 +DA:316,17 +DA:319,1 +DA:320,1 +DA:321,0 +DA:322,0 +DA:325,1 +DA:327,3 +DA:328,3 +DA:330,0 +DA:337,3 +DA:343,0 +DA:355,1 +DA:358,1 +LF:165 +LH:157 +BRDA:32,0,0,1 +BRDA:32,0,1,6 +BRDA:40,1,0,2 +BRDA:40,1,1,4 +BRDA:43,2,0,1 +BRDA:43,2,1,5 +BRDA:61,3,0,12 +BRDA:61,3,1,40 +BRDA:63,4,0,8 +BRDA:63,4,1,4 +BRDA:66,5,0,4 +BRDA:66,5,1,8 +BRDA:71,6,0,40 +BRDA:71,6,1,12 +BRDA:75,7,0,20 +BRDA:75,7,1,20 +BRDA:90,8,0,4 +BRDA:90,8,1,1 +BRDA:91,9,0,5 +BRDA:91,9,1,1 +BRDA:94,10,0,0 +BRDA:94,10,1,4 +BRDA:95,11,0,0 +BRDA:95,11,1,4 +BRDA:109,12,0,4 +BRDA:109,12,1,1 +BRDA:132,13,0,1 +BRDA:132,13,1,8 +BRDA:145,14,0,5 +BRDA:145,14,1,3 +BRDA:150,15,0,1 +BRDA:150,15,1,7 +BRDA:155,16,0,2 +BRDA:155,16,1,6 +BRDA:155,17,0,8 +BRDA:155,17,1,7 +BRDA:156,18,0,1 +BRDA:156,18,1,1 +BRDA:169,19,0,1 +BRDA:169,19,1,5 +BRDA:173,20,0,6 +BRDA:173,20,1,0 +BRDA:194,21,0,1 +BRDA:194,21,1,7 +BRDA:202,22,0,2 +BRDA:202,22,1,5 +BRDA:205,23,0,1 +BRDA:205,23,1,6 +BRDA:221,24,0,15 +BRDA:221,24,1,50 +BRDA:223,25,0,10 +BRDA:223,25,1,5 +BRDA:226,26,0,5 +BRDA:226,26,1,10 +BRDA:231,27,0,50 +BRDA:231,27,1,15 +BRDA:235,28,0,25 +BRDA:235,28,1,25 +BRDA:250,29,0,5 +BRDA:250,29,1,1 +BRDA:251,30,0,6 +BRDA:251,30,1,1 +BRDA:254,31,0,0 +BRDA:254,31,1,5 +BRDA:256,32,0,0 +BRDA:256,32,1,5 +BRDA:271,33,0,5 +BRDA:271,33,1,1 +BRDA:293,34,0,0 +BRDA:293,34,1,25 +BRDA:303,35,0,7 +BRDA:303,35,1,9 +BRDA:303,35,2,8 +BRDA:303,35,3,1 +BRDA:320,36,0,0 +BRDA:320,36,1,1 +BRDA:320,37,0,1 +BRDA:320,37,1,1 +BRDA:328,38,0,0 +BRDA:328,38,1,3 +BRDA:345,39,0,0 +BRDA:345,39,1,0 +BRDA:347,40,0,0 +BRDA:347,40,1,0 +BRDA:350,41,0,0 +BRDA:350,41,1,0 +BRF:86 +BRH:72 +end_of_record +TN: +SF:v0\destinations\algolia\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:4,1 +DA:7,1 +DA:8,1 +DA:9,1 +DA:10,1 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\algolia\transform.js +FN:24,(anonymous_0) +FN:91,(anonymous_1) +FN:119,(anonymous_2) +FN:128,(anonymous_3) +FN:135,(anonymous_4) +FNF:5 +FNH:5 +FNDA:10,(anonymous_0) +FNDA:10,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:2,(anonymous_4) +DA:1,1 +DA:2,1 +DA:13,1 +DA:15,1 +DA:22,1 +DA:24,1 +DA:25,10 +DA:26,10 +DA:27,0 +DA:29,10 +DA:30,10 +DA:31,10 +DA:32,10 +DA:33,10 +DA:36,10 +DA:37,1 +DA:39,9 +DA:41,8 +DA:42,5 +DA:43,5 +DA:44,5 +DA:48,5 +DA:49,5 +DA:50,5 +DA:51,5 +DA:52,5 +DA:54,5 +DA:55,3 +DA:56,3 +DA:59,5 +DA:60,0 +DA:68,8 +DA:69,1 +DA:71,7 +DA:72,0 +DA:77,7 +DA:78,5 +DA:80,5 +DA:81,5 +DA:82,5 +DA:83,5 +DA:84,5 +DA:88,5 +DA:91,1 +DA:92,10 +DA:93,10 +DA:94,0 +DA:100,10 +DA:101,0 +DA:103,10 +DA:104,0 +DA:106,10 +DA:109,10 +DA:111,10 +DA:112,5 +DA:114,0 +DA:116,5 +DA:119,1 +DA:120,1 +DA:121,0 +DA:122,0 +DA:125,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:130,1 +DA:134,1 +DA:135,1 +DA:136,2 +DA:137,2 +DA:139,2 +DA:140,2 +DA:141,2 +DA:143,0 +DA:157,1 +DA:159,1 +DA:160,1 +DA:161,1 +DA:165,1 +DA:167,1 +DA:172,1 +DA:175,1 +LF:83 +LH:73 +BRDA:26,0,0,0 +BRDA:26,0,1,10 +BRDA:34,1,0,10 +BRDA:34,1,1,9 +BRDA:36,2,0,1 +BRDA:36,2,1,9 +BRDA:41,3,0,5 +BRDA:41,3,1,3 +BRDA:41,4,0,8 +BRDA:41,4,1,3 +BRDA:43,5,0,5 +BRDA:43,5,1,0 +BRDA:50,6,0,5 +BRDA:50,6,1,0 +BRDA:54,7,0,3 +BRDA:54,7,1,2 +BRDA:59,8,0,0 +BRDA:59,8,1,5 +BRDA:59,9,0,5 +BRDA:59,9,1,3 +BRDA:59,9,2,3 +BRDA:68,10,0,1 +BRDA:68,10,1,7 +BRDA:68,11,0,8 +BRDA:68,11,1,6 +BRDA:71,12,0,0 +BRDA:71,12,1,7 +BRDA:71,13,0,7 +BRDA:71,13,1,2 +BRDA:77,14,0,5 +BRDA:77,14,1,2 +BRDA:93,15,0,0 +BRDA:93,15,1,10 +BRDA:100,16,0,0 +BRDA:100,16,1,10 +BRDA:103,17,0,0 +BRDA:103,17,1,10 +BRDA:109,18,0,10 +BRDA:109,18,1,0 +BRDA:120,19,0,0 +BRDA:120,19,1,1 +BRDA:120,20,0,1 +BRDA:120,20,1,1 +BRDA:146,21,0,0 +BRDA:146,21,1,0 +BRDA:148,22,0,0 +BRDA:148,22,1,0 +BRDA:151,23,0,0 +BRDA:151,23,1,0 +BRDA:157,24,0,1 +BRDA:157,24,1,0 +BRF:51 +BRH:34 +end_of_record +TN: +SF:v0\destinations\algolia\util.js +FN:5,(anonymous_0) +FN:9,(anonymous_1) +FN:21,(anonymous_2) +FN:63,(anonymous_3) +FN:67,(anonymous_4) +FN:89,(anonymous_5) +FN:96,(anonymous_6) +FNF:7 +FNH:7 +FNDA:10,(anonymous_0) +FNDA:10,(anonymous_1) +FNDA:9,(anonymous_2) +FNDA:5,(anonymous_3) +FNDA:10,(anonymous_4) +FNDA:5,(anonymous_5) +FNDA:6,(anonymous_6) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,10 +DA:7,10 +DA:8,10 +DA:9,8 +DA:10,10 +DA:11,10 +DA:12,10 +DA:13,10 +DA:18,10 +DA:21,1 +DA:22,9 +DA:23,9 +DA:24,9 +DA:25,1 +DA:30,8 +DA:31,0 +DA:32,0 +DA:34,8 +DA:35,5 +DA:36,5 +DA:37,0 +DA:38,0 +DA:41,8 +DA:42,0 +DA:43,0 +DA:45,8 +DA:46,0 +DA:48,8 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:55,8 +DA:56,0 +DA:58,8 +DA:59,0 +DA:61,8 +DA:63,1 +DA:64,5 +DA:65,5 +DA:66,5 +DA:67,5 +DA:68,10 +DA:69,10 +DA:70,6 +DA:71,6 +DA:72,6 +DA:74,0 +DA:79,4 +DA:82,0 +DA:86,5 +DA:89,1 +DA:90,5 +DA:91,5 +DA:92,3 +DA:93,0 +DA:94,0 +DA:96,3 +DA:97,6 +DA:98,5 +DA:100,1 +DA:101,1 +DA:105,5 +DA:106,3 +DA:108,5 +DA:109,2 +DA:111,5 +DA:112,2 +DA:113,0 +DA:119,5 +DA:120,3 +DA:124,2 +DA:130,3 +DA:133,1 +LF:78 +LH:60 +BRDA:8,0,0,8 +BRDA:8,0,1,2 +BRDA:10,1,0,10 +BRDA:10,1,1,0 +BRDA:10,2,0,10 +BRDA:10,2,1,10 +BRDA:12,3,0,10 +BRDA:12,3,1,0 +BRDA:24,4,0,1 +BRDA:24,4,1,8 +BRDA:30,5,0,0 +BRDA:30,5,1,8 +BRDA:30,6,0,8 +BRDA:30,6,1,2 +BRDA:34,7,0,5 +BRDA:34,7,1,3 +BRDA:36,8,0,0 +BRDA:36,8,1,5 +BRDA:36,9,0,5 +BRDA:36,9,1,5 +BRDA:41,10,0,0 +BRDA:41,10,1,8 +BRDA:41,11,0,8 +BRDA:41,11,1,0 +BRDA:45,12,0,0 +BRDA:45,12,1,8 +BRDA:45,13,0,8 +BRDA:45,13,1,0 +BRDA:48,14,0,0 +BRDA:48,14,1,8 +BRDA:50,15,0,0 +BRDA:50,15,1,0 +BRDA:55,16,0,0 +BRDA:55,16,1,8 +BRDA:55,17,0,8 +BRDA:55,17,1,2 +BRDA:58,18,0,0 +BRDA:58,18,1,8 +BRDA:58,19,0,8 +BRDA:58,19,1,2 +BRDA:66,20,0,5 +BRDA:66,20,1,0 +BRDA:68,21,0,10 +BRDA:68,21,1,0 +BRDA:69,22,0,6 +BRDA:69,22,1,4 +BRDA:70,23,0,6 +BRDA:70,23,1,0 +BRDA:91,24,0,3 +BRDA:91,24,1,2 +BRDA:92,25,0,0 +BRDA:92,25,1,3 +BRDA:97,26,0,5 +BRDA:97,26,1,1 +BRDA:97,27,0,6 +BRDA:97,27,1,5 +BRDA:105,28,0,3 +BRDA:105,28,1,2 +BRDA:108,29,0,2 +BRDA:108,29,1,3 +BRDA:111,30,0,2 +BRDA:111,30,1,3 +BRDA:111,31,0,5 +BRDA:111,31,1,3 +BRDA:112,32,0,0 +BRDA:112,32,1,2 +BRDA:119,33,0,3 +BRDA:119,33,1,2 +BRDA:120,34,0,2 +BRDA:120,34,1,1 +BRDA:121,35,0,3 +BRDA:121,35,1,2 +BRDA:121,35,2,2 +BRDA:121,35,3,1 +BRF:74 +BRH:56 +end_of_record +TN: +SF:v0\destinations\am\config.js +FN:118,(anonymous_0) +FNF:1 +FNH:1 +FNDA:51,(anonymous_0) +DA:1,3 +DA:3,3 +DA:39,3 +DA:110,3 +DA:111,3 +DA:113,3 +DA:115,3 +DA:116,3 +DA:117,3 +DA:118,3 +DA:119,51 +DA:121,3 +DA:123,3 +LF:13 +LH:13 +BRDA:115,0,0,3 +BRDA:115,0,1,1 +BRF:2 +BRH:2 +end_of_record +TN: +SF:v0\destinations\am\transform.js +FN:49,(anonymous_0) +FN:62,(anonymous_1) +FN:67,(anonymous_2) +FN:72,(anonymous_3) +FN:77,(anonymous_4) +FN:82,(anonymous_5) +FN:87,getSessionId +FN:98,addMinIdlength +FN:102,setPriceQuanityInPayload +FN:118,createRevenuePayload +FN:128,updateTraitsObject +FN:135,prepareTraitsConfig +FN:137,(anonymous_12) +FN:144,handleTraits +FN:182,updateConfigProperty +FN:190,(anonymous_15) +FN:244,responseBuilderSimple +FN:303,(anonymous_17) +FN:337,(anonymous_18) +FN:340,(anonymous_19) +FN:528,processSingleMessage +FN:674,createProductPurchasedEvent +FN:689,isProductArrayInPayload +FN:697,getProductPurchasedEvents +FN:703,(anonymous_24) +FN:717,trackRevenueEvent +FN:757,process +FN:766,(anonymous_27) +FN:776,(anonymous_28) +FN:782,getBatchEvents +FN:852,batch +FN:862,(anonymous_31) +FN:934,(anonymous_32) +FN:941,(anonymous_33) +FN:975,(anonymous_34) +FNF:35 +FNH:33 +FNDA:123,(anonymous_0) +FNDA:90,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:22,(anonymous_3) +FNDA:3,(anonymous_4) +FNDA:8,(anonymous_5) +FNDA:65,getSessionId +FNDA:65,addMinIdlength +FNDA:15,setPriceQuanityInPayload +FNDA:15,createRevenuePayload +FNDA:16,updateTraitsObject +FNDA:8,prepareTraitsConfig +FNDA:16,(anonymous_12) +FNDA:17,handleTraits +FNDA:134,updateConfigProperty +FNDA:1702,(anonymous_15) +FNDA:69,responseBuilderSimple +FNDA:42,(anonymous_17) +FNDA:101,(anonymous_18) +FNDA:40,(anonymous_19) +FNDA:70,processSingleMessage +FNDA:10,createProductPurchasedEvent +FNDA:19,isProductArrayInPayload +FNDA:8,getProductPurchasedEvents +FNDA:10,(anonymous_24) +FNDA:11,trackRevenueEvent +FNDA:60,process +FNDA:21,(anonymous_27) +FNDA:70,(anonymous_28) +FNDA:22,getBatchEvents +FNDA:5,batch +FNDA:33,(anonymous_31) +FNDA:1,(anonymous_32) +FNDA:2,(anonymous_33) +FNDA:0,(anonymous_34) +DA:4,3 +DA:5,3 +DA:11,3 +DA:12,3 +DA:31,3 +DA:32,3 +DA:40,3 +DA:42,3 +DA:44,3 +DA:46,3 +DA:47,3 +DA:49,3 +DA:51,123 +DA:53,8 +DA:54,8 +DA:57,115 +DA:59,123 +DA:62,3 +DA:63,90 +DA:64,90 +DA:67,3 +DA:68,0 +DA:69,0 +DA:72,3 +DA:73,22 +DA:74,22 +DA:77,3 +DA:78,3 +DA:79,3 +DA:82,3 +DA:83,8 +DA:84,8 +DA:88,65 +DA:89,65 +DA:90,14 +DA:91,13 +DA:93,1 +DA:95,51 +DA:99,65 +DA:105,15 +DA:106,15 +DA:107,15 +DA:109,0 +DA:110,0 +DA:112,15 +DA:113,15 +DA:114,15 +DA:115,15 +DA:119,15 +DA:120,15 +DA:124,15 +DA:125,15 +DA:129,16 +DA:130,16 +DA:131,16 +DA:132,16 +DA:136,8 +DA:137,8 +DA:138,16 +DA:139,16 +DA:141,8 +DA:145,17 +DA:147,17 +DA:148,2 +DA:149,2 +DA:155,17 +DA:156,2 +DA:157,2 +DA:163,17 +DA:164,2 +DA:165,2 +DA:171,17 +DA:172,2 +DA:173,2 +DA:179,17 +DA:189,134 +DA:190,134 +DA:192,1702 +DA:193,434 +DA:194,434 +DA:195,434 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:204,434 +DA:207,434 +DA:208,4 +DA:209,4 +DA:212,430 +DA:218,1268 +DA:220,650 +DA:221,650 +DA:222,12 +DA:224,638 +DA:225,638 +DA:226,600 +DA:227,600 +DA:228,78 +DA:233,618 +DA:234,618 +DA:235,9 +DA:237,609 +DA:252,69 +DA:253,69 +DA:254,69 +DA:255,69 +DA:256,69 +DA:257,69 +DA:261,69 +DA:264,69 +DA:266,69 +DA:267,4 +DA:268,4 +DA:272,4 +DA:274,0 +DA:284,69 +DA:293,69 +DA:294,69 +DA:301,69 +DA:303,69 +DA:304,42 +DA:305,42 +DA:311,69 +DA:312,69 +DA:318,69 +DA:321,21 +DA:323,21 +DA:325,21 +DA:328,18 +DA:329,18 +DA:330,17 +DA:332,18 +DA:336,18 +DA:337,17 +DA:338,101 +DA:339,8 +DA:340,8 +DA:341,40 +DA:344,40 +DA:345,36 +DA:353,93 +DA:359,21 +DA:362,3 +DA:363,3 +DA:364,3 +DA:365,3 +DA:372,21 +DA:374,4 +DA:375,4 +DA:377,44 +DA:378,44 +DA:380,44 +DA:381,41 +DA:387,44 +DA:388,44 +DA:389,44 +DA:391,15 +DA:393,15 +DA:394,15 +DA:395,15 +DA:396,15 +DA:397,15 +DA:400,44 +DA:406,69 +DA:407,69 +DA:409,69 +DA:414,4 +DA:415,4 +DA:416,1 +DA:417,1 +DA:418,1 +DA:420,4 +DA:421,4 +DA:422,4 +DA:423,4 +DA:424,4 +DA:428,4 +DA:429,4 +DA:431,65 +DA:432,15 +DA:433,14 +DA:440,15 +DA:441,15 +DA:442,15 +DA:444,15 +DA:445,13 +DA:446,5 +DA:447,5 +DA:448,8 +DA:449,8 +DA:454,65 +DA:459,65 +DA:465,51 +DA:467,65 +DA:469,65 +DA:482,65 +DA:483,65 +DA:484,65 +DA:485,65 +DA:486,22 +DA:487,22 +DA:490,65 +DA:491,65 +DA:492,65 +DA:493,65 +DA:494,65 +DA:495,65 +DA:498,65 +DA:499,65 +DA:504,65 +DA:508,65 +DA:509,3 +DA:510,3 +DA:511,3 +DA:512,3 +DA:513,3 +DA:514,3 +DA:518,3 +DA:520,65 +DA:523,69 +DA:529,70 +DA:536,70 +DA:537,70 +DA:539,70 +DA:540,70 +DA:542,18 +DA:543,18 +DA:544,18 +DA:545,18 +DA:547,4 +DA:550,4 +DA:554,4 +DA:555,4 +DA:557,5 +DA:561,5 +DA:566,5 +DA:567,5 +DA:569,4 +DA:570,4 +DA:571,4 +DA:575,4 +DA:578,4 +DA:579,4 +DA:580,4 +DA:581,4 +DA:582,4 +DA:587,4 +DA:594,3 +DA:595,3 +DA:596,3 +DA:598,3 +DA:600,1 +DA:601,1 +DA:615,3 +DA:617,4 +DA:620,4 +DA:621,4 +DA:622,4 +DA:624,35 +DA:625,35 +DA:626,0 +DA:638,35 +DA:645,0 +DA:646,0 +DA:649,35 +DA:651,0 +DA:652,0 +DA:664,69 +DA:675,10 +DA:677,10 +DA:679,10 +DA:681,10 +DA:682,8 +DA:685,10 +DA:686,10 +DA:691,19 +DA:694,19 +DA:698,8 +DA:699,8 +DA:700,5 +DA:703,5 +DA:704,10 +DA:705,10 +DA:711,10 +DA:714,8 +DA:718,11 +DA:719,11 +DA:721,11 +DA:722,5 +DA:724,3 +DA:727,2 +DA:729,6 +DA:733,2 +DA:736,11 +DA:737,5 +DA:740,11 +DA:742,11 +DA:746,8 +DA:750,8 +DA:751,5 +DA:754,11 +DA:758,60 +DA:759,60 +DA:760,60 +DA:761,60 +DA:762,60 +DA:763,25 +DA:764,25 +DA:765,11 +DA:766,11 +DA:767,21 +DA:770,14 +DA:773,35 +DA:776,60 +DA:777,70 +DA:779,59 +DA:783,22 +DA:785,22 +DA:786,22 +DA:788,22 +DA:789,22 +DA:790,22 +DA:793,22 +DA:796,22 +DA:810,22 +DA:811,1 +DA:814,22 +DA:816,22 +DA:817,22 +DA:818,5 +DA:819,5 +DA:820,5 +DA:824,5 +DA:825,5 +DA:829,17 +DA:835,17 +DA:836,17 +DA:837,17 +DA:842,17 +DA:846,0 +DA:849,22 +DA:853,5 +DA:854,5 +DA:862,5 +DA:863,33 +DA:864,33 +DA:865,33 +DA:866,33 +DA:867,33 +DA:873,33 +DA:881,33 +DA:882,0 +DA:887,33 +DA:897,11 +DA:898,11 +DA:899,11 +DA:900,11 +DA:901,11 +DA:904,22 +DA:910,22 +DA:913,0 +DA:914,0 +DA:915,0 +DA:916,0 +DA:917,0 +DA:927,5 +DA:928,5 +DA:929,5 +DA:931,5 +DA:934,3 +DA:935,1 +DA:936,0 +DA:937,0 +DA:940,1 +DA:942,2 +DA:943,2 +DA:945,0 +DA:952,2 +DA:958,0 +DA:963,0 +DA:972,1 +DA:975,3 +DA:976,0 +DA:983,3 +LF:386 +LH:358 +BRDA:51,0,0,8 +BRDA:51,0,1,115 +BRDA:89,1,0,14 +BRDA:89,1,1,51 +BRDA:90,2,0,13 +BRDA:90,2,1,1 +BRDA:105,3,0,15 +BRDA:105,3,1,0 +BRDA:107,4,0,15 +BRDA:107,4,1,0 +BRDA:121,5,0,15 +BRDA:121,5,1,15 +BRDA:121,5,2,15 +BRDA:147,6,0,2 +BRDA:147,6,1,15 +BRDA:155,7,0,2 +BRDA:155,7,1,15 +BRDA:163,8,0,2 +BRDA:163,8,1,15 +BRDA:171,9,0,2 +BRDA:171,9,1,15 +BRDA:192,10,0,434 +BRDA:192,10,1,1268 +BRDA:194,11,0,434 +BRDA:194,11,1,0 +BRDA:195,12,0,0 +BRDA:195,12,1,434 +BRDA:197,13,0,0 +BRDA:197,13,1,0 +BRDA:199,14,0,0 +BRDA:199,14,1,0 +BRDA:199,15,0,0 +BRDA:199,15,1,0 +BRDA:199,15,2,0 +BRDA:207,16,0,4 +BRDA:207,16,1,430 +BRDA:218,17,0,650 +BRDA:218,17,1,618 +BRDA:221,18,0,12 +BRDA:221,18,1,638 +BRDA:225,19,0,600 +BRDA:225,19,1,38 +BRDA:227,20,0,78 +BRDA:227,20,1,522 +BRDA:227,21,0,600 +BRDA:227,21,1,522 +BRDA:227,21,2,522 +BRDA:234,22,0,9 +BRDA:234,22,1,609 +BRDA:264,23,0,69 +BRDA:264,23,1,0 +BRDA:266,24,0,4 +BRDA:266,24,1,65 +BRDA:272,25,0,0 +BRDA:272,25,1,4 +BRDA:293,26,0,69 +BRDA:293,26,1,56 +BRDA:311,27,0,69 +BRDA:311,27,1,69 +BRDA:318,28,0,18 +BRDA:318,28,1,21 +BRDA:318,28,2,4 +BRDA:318,28,3,44 +BRDA:325,29,0,18 +BRDA:325,29,1,3 +BRDA:329,30,0,17 +BRDA:329,30,1,1 +BRDA:336,31,0,17 +BRDA:336,31,1,1 +BRDA:338,32,0,8 +BRDA:338,32,1,93 +BRDA:344,33,0,36 +BRDA:344,33,1,4 +BRDA:359,34,0,3 +BRDA:359,34,1,18 +BRDA:362,35,0,3 +BRDA:362,35,1,0 +BRDA:362,36,0,3 +BRDA:362,36,1,3 +BRDA:362,36,2,3 +BRDA:380,37,0,41 +BRDA:380,37,1,3 +BRDA:389,38,0,15 +BRDA:389,38,1,29 +BRDA:393,39,0,15 +BRDA:393,39,1,0 +BRDA:400,40,0,44 +BRDA:400,40,1,1 +BRDA:409,41,0,4 +BRDA:409,41,1,65 +BRDA:415,42,0,1 +BRDA:415,42,1,3 +BRDA:431,43,0,15 +BRDA:431,43,1,50 +BRDA:432,44,0,14 +BRDA:432,44,1,1 +BRDA:444,45,0,13 +BRDA:444,45,1,2 +BRDA:445,46,0,5 +BRDA:445,46,1,8 +BRDA:448,47,0,8 +BRDA:448,47,1,0 +BRDA:459,48,0,51 +BRDA:459,48,1,14 +BRDA:460,49,0,65 +BRDA:460,49,1,51 +BRDA:460,49,2,51 +BRDA:460,49,3,51 +BRDA:482,50,0,65 +BRDA:482,50,1,0 +BRDA:485,51,0,22 +BRDA:485,51,1,43 +BRDA:508,52,0,3 +BRDA:508,52,1,62 +BRDA:508,53,0,65 +BRDA:508,53,1,3 +BRDA:536,54,0,70 +BRDA:536,54,1,69 +BRDA:540,55,0,18 +BRDA:540,55,1,4 +BRDA:540,55,2,5 +BRDA:540,55,3,4 +BRDA:540,55,4,4 +BRDA:540,55,5,35 +BRDA:540,55,6,0 +BRDA:547,56,0,4 +BRDA:547,56,1,0 +BRDA:547,56,2,0 +BRDA:552,57,0,4 +BRDA:552,57,1,0 +BRDA:557,58,0,5 +BRDA:557,58,1,5 +BRDA:557,58,2,0 +BRDA:557,58,3,0 +BRDA:564,59,0,5 +BRDA:564,59,1,5 +BRDA:564,59,2,0 +BRDA:580,60,0,4 +BRDA:580,60,1,0 +BRDA:580,61,0,4 +BRDA:580,61,1,4 +BRDA:587,62,0,3 +BRDA:587,62,1,1 +BRDA:588,63,0,4 +BRDA:588,63,1,4 +BRDA:588,63,2,4 +BRDA:588,63,3,4 +BRDA:588,63,4,1 +BRDA:625,64,0,0 +BRDA:625,64,1,35 +BRDA:638,65,0,0 +BRDA:638,65,1,35 +BRDA:639,66,0,35 +BRDA:639,66,1,26 +BRDA:639,66,2,11 +BRDA:681,67,0,8 +BRDA:681,67,1,2 +BRDA:691,68,0,19 +BRDA:691,68,1,12 +BRDA:691,68,2,12 +BRDA:699,69,0,5 +BRDA:699,69,1,3 +BRDA:721,70,0,5 +BRDA:721,70,1,6 +BRDA:722,71,0,3 +BRDA:722,71,1,2 +BRDA:729,72,0,2 +BRDA:729,72,1,4 +BRDA:736,73,0,5 +BRDA:736,73,1,6 +BRDA:742,74,0,8 +BRDA:742,74,1,3 +BRDA:743,75,0,11 +BRDA:743,75,1,5 +BRDA:750,76,0,5 +BRDA:750,76,1,3 +BRDA:762,77,0,25 +BRDA:762,77,1,35 +BRDA:764,78,0,11 +BRDA:764,78,1,14 +BRDA:764,79,0,25 +BRDA:764,79,1,16 +BRDA:785,80,0,22 +BRDA:785,80,1,5 +BRDA:786,81,0,22 +BRDA:786,81,1,5 +BRDA:788,82,0,22 +BRDA:788,82,1,0 +BRDA:793,83,0,13 +BRDA:793,83,1,9 +BRDA:810,84,0,1 +BRDA:810,84,1,21 +BRDA:810,85,0,22 +BRDA:810,85,1,9 +BRDA:810,85,2,9 +BRDA:817,86,0,5 +BRDA:817,86,1,17 +BRDA:818,87,0,5 +BRDA:818,87,1,0 +BRDA:829,88,0,17 +BRDA:829,88,1,0 +BRDA:830,89,0,17 +BRDA:830,89,1,17 +BRDA:868,90,0,15 +BRDA:868,90,1,18 +BRDA:868,91,0,33 +BRDA:868,91,1,25 +BRDA:870,92,0,10 +BRDA:870,92,1,8 +BRDA:874,93,0,15 +BRDA:874,93,1,18 +BRDA:874,94,0,33 +BRDA:874,94,1,25 +BRDA:876,95,0,10 +BRDA:876,95,1,8 +BRDA:881,96,0,0 +BRDA:881,96,1,33 +BRDA:881,97,0,33 +BRDA:881,97,1,25 +BRDA:881,97,2,5 +BRDA:887,98,0,11 +BRDA:887,98,1,22 +BRDA:888,99,0,33 +BRDA:888,99,1,25 +BRDA:888,99,2,15 +BRDA:888,99,3,10 +BRDA:888,99,4,23 +BRDA:888,99,5,10 +BRDA:888,99,6,10 +BRDA:888,99,7,2 +BRDA:910,100,0,0 +BRDA:910,100,1,22 +BRDA:927,101,0,5 +BRDA:927,101,1,0 +BRDA:927,102,0,5 +BRDA:927,102,1,5 +BRDA:935,103,0,0 +BRDA:935,103,1,1 +BRDA:935,104,0,1 +BRDA:935,104,1,1 +BRDA:943,105,0,0 +BRDA:943,105,1,2 +BRDA:965,106,0,0 +BRDA:965,106,1,0 +BRDA:966,107,0,0 +BRDA:966,107,1,0 +BRF:246 +BRH:207 +end_of_record +TN: +SF:v0\destinations\am\utils.js +FN:16,getInfoFromUA +FN:22,getOSName +FN:30,getOSVersion +FN:39,getDeviceModel +FN:48,getDeviceManufacturer +FN:57,getPlatform +FN:66,getBrand +FN:74,getEventId +FNF:8 +FNH:8 +FNDA:84,getInfoFromUA +FNDA:60,getOSName +FNDA:56,getOSVersion +FNDA:60,getDeviceModel +FNDA:60,getDeviceManufacturer +FNDA:60,getPlatform +FNDA:65,getBrand +FNDA:69,getEventId +DA:11,3 +DA:12,3 +DA:13,3 +DA:14,3 +DA:17,84 +DA:18,84 +DA:19,84 +DA:23,60 +DA:24,60 +DA:25,22 +DA:27,38 +DA:31,56 +DA:33,56 +DA:34,18 +DA:36,38 +DA:40,60 +DA:42,60 +DA:43,22 +DA:45,38 +DA:49,60 +DA:51,60 +DA:52,22 +DA:54,38 +DA:58,60 +DA:59,60 +DA:67,65 +DA:68,3 +DA:69,3 +DA:71,62 +DA:75,69 +DA:77,69 +DA:78,9 +DA:79,1 +DA:80,8 +DA:82,61 +DA:85,3 +LF:36 +LH:36 +BRDA:18,0,0,84 +BRDA:18,0,1,0 +BRDA:19,1,0,84 +BRDA:19,1,1,22 +BRDA:24,2,0,22 +BRDA:24,2,1,38 +BRDA:24,3,0,60 +BRDA:24,3,1,35 +BRDA:33,4,0,18 +BRDA:33,4,1,38 +BRDA:33,5,0,56 +BRDA:33,5,1,31 +BRDA:42,6,0,22 +BRDA:42,6,1,38 +BRDA:42,7,0,60 +BRDA:42,7,1,35 +BRDA:51,8,0,22 +BRDA:51,8,1,38 +BRDA:51,9,0,60 +BRDA:51,9,1,35 +BRDA:59,10,0,35 +BRDA:59,10,1,25 +BRDA:60,11,0,22 +BRDA:60,11,1,13 +BRDA:67,12,0,3 +BRDA:67,12,1,62 +BRDA:77,13,0,9 +BRDA:77,13,1,60 +BRDA:78,14,0,1 +BRDA:78,14,1,8 +BRF:30 +BRH:29 +end_of_record +TN: +SF:v0\destinations\appcues\config.js +FN:21,getEndpoint +FNF:1 +FNH:1 +FNDA:11,getEndpoint +DA:1,1 +DA:3,1 +DA:22,11 +DA:25,1 +DA:27,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\appcues\transform.js +FN:16,buildResponse +FN:28,processTrackEvent +FN:43,processPage +FN:69,process +FN:120,(anonymous_4) +FN:127,(anonymous_5) +FNF:6 +FNH:6 +FNDA:11,buildResponse +FNDA:3,processTrackEvent +FNDA:4,processPage +FNDA:14,process +FNDA:1,(anonymous_4) +FNDA:2,(anonymous_5) +DA:2,1 +DA:12,1 +DA:14,1 +DA:17,11 +DA:18,11 +DA:19,11 +DA:20,11 +DA:29,3 +DA:34,3 +DA:35,3 +DA:37,3 +DA:44,4 +DA:50,4 +DA:51,4 +DA:52,4 +DA:55,4 +DA:57,4 +DA:61,4 +DA:63,4 +DA:70,14 +DA:72,14 +DA:73,1 +DA:79,13 +DA:80,1 +DA:86,12 +DA:88,12 +DA:90,2 +DA:96,4 +DA:97,4 +DA:104,1 +DA:105,1 +DA:111,4 +DA:116,1 +DA:120,1 +DA:121,1 +DA:122,0 +DA:123,0 +DA:126,1 +DA:128,2 +DA:129,2 +DA:131,0 +DA:138,2 +DA:144,0 +DA:156,1 +DA:159,1 +LF:45 +LH:41 +BRDA:72,0,0,1 +BRDA:72,0,1,13 +BRDA:79,1,0,1 +BRDA:79,1,1,12 +BRDA:88,2,0,2 +BRDA:88,2,1,4 +BRDA:88,2,2,1 +BRDA:88,2,3,4 +BRDA:88,2,4,1 +BRDA:121,3,0,0 +BRDA:121,3,1,1 +BRDA:121,4,0,1 +BRDA:121,4,1,1 +BRDA:129,5,0,0 +BRDA:129,5,1,2 +BRDA:146,6,0,0 +BRDA:146,6,1,0 +BRDA:148,7,0,0 +BRDA:148,7,1,0 +BRDA:151,8,0,0 +BRDA:151,8,1,0 +BRF:21 +BRH:13 +end_of_record +TN: +SF:v0\destinations\azure_event_hub\transform.js +FN:1,process +FNF:1 +FNH:1 +FNDA:5,process +DA:2,5 +DA:6,5 +DA:9,1 +LF:3 +LH:3 +BRDA:4,0,0,5 +BRDA:4,0,1,0 +BRF:2 +BRH:1 +end_of_record +TN: +SF:v0\destinations\azure_synapse\transform.js +FN:5,processSingleMessage +FN:9,getDataTypeOverride +FN:11,process +FNF:3 +FNH:3 +FNDA:124,processSingleMessage +FNDA:2917,getDataTypeOverride +FNDA:124,process +DA:1,3 +DA:3,3 +DA:6,124 +DA:12,124 +DA:13,124 +DA:14,124 +DA:15,124 +DA:25,3 +LF:8 +LH:8 +BRDA:12,0,0,124 +BRDA:12,0,1,0 +BRDA:21,1,0,6 +BRDA:21,1,1,118 +BRF:4 +BRH:3 +end_of_record +TN: +SF:v0\destinations\blueshift\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:20,1 +DA:32,1 +DA:47,1 +DA:48,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\blueshift\transform.js +FN:24,checkValidEventName +FN:30,(anonymous_1) +FN:42,(anonymous_2) +FN:91,(anonymous_3) +FN:125,(anonymous_4) +FN:156,(anonymous_5) +FN:184,(anonymous_6) +FN:191,(anonymous_7) +FNF:8 +FNH:8 +FNDA:8,checkValidEventName +FNDA:12,(anonymous_1) +FNDA:9,(anonymous_2) +FNDA:5,(anonymous_3) +FNDA:5,(anonymous_4) +FNDA:21,(anonymous_5) +FNDA:1,(anonymous_6) +FNDA:3,(anonymous_7) +DA:1,1 +DA:13,1 +DA:22,1 +DA:25,8 +DA:26,2 +DA:27,6 +DA:30,1 +DA:32,12 +DA:34,4 +DA:35,4 +DA:37,8 +DA:39,12 +DA:42,1 +DA:43,9 +DA:44,9 +DA:45,0 +DA:51,9 +DA:52,1 +DA:57,8 +DA:59,8 +DA:61,0 +DA:64,8 +DA:65,8 +DA:66,3 +DA:68,8 +DA:69,8 +DA:70,2 +DA:75,6 +DA:77,6 +DA:78,6 +DA:79,6 +DA:81,6 +DA:82,6 +DA:83,6 +DA:87,6 +DA:88,6 +DA:91,1 +DA:92,5 +DA:93,1 +DA:98,4 +DA:100,3 +DA:102,0 +DA:105,3 +DA:111,3 +DA:112,3 +DA:113,3 +DA:115,3 +DA:116,3 +DA:117,3 +DA:121,3 +DA:122,3 +DA:125,1 +DA:126,5 +DA:127,1 +DA:133,4 +DA:135,3 +DA:137,0 +DA:139,3 +DA:140,3 +DA:142,3 +DA:143,3 +DA:144,3 +DA:146,3 +DA:147,3 +DA:148,3 +DA:152,3 +DA:153,3 +DA:156,1 +DA:157,21 +DA:158,21 +DA:159,1 +DA:165,20 +DA:166,20 +DA:168,20 +DA:170,9 +DA:171,6 +DA:173,5 +DA:174,3 +DA:176,5 +DA:177,3 +DA:179,1 +DA:181,12 +DA:184,1 +DA:185,1 +DA:186,0 +DA:187,0 +DA:190,1 +DA:192,3 +DA:193,3 +DA:195,0 +DA:202,3 +DA:208,0 +DA:220,1 +DA:223,1 +LF:94 +LH:86 +BRDA:25,0,0,2 +BRDA:25,0,1,6 +BRDA:25,1,0,8 +BRDA:25,1,1,7 +BRDA:25,1,2,6 +BRDA:32,2,0,4 +BRDA:32,2,1,8 +BRDA:44,3,0,0 +BRDA:44,3,1,9 +BRDA:51,4,0,1 +BRDA:51,4,1,8 +BRDA:59,5,0,0 +BRDA:59,5,1,8 +BRDA:65,6,0,3 +BRDA:65,6,1,5 +BRDA:69,7,0,2 +BRDA:69,7,1,6 +BRDA:92,8,0,1 +BRDA:92,8,1,4 +BRDA:100,9,0,0 +BRDA:100,9,1,3 +BRDA:126,10,0,1 +BRDA:126,10,1,4 +BRDA:135,11,0,0 +BRDA:135,11,1,3 +BRDA:158,12,0,1 +BRDA:158,12,1,20 +BRDA:168,13,0,9 +BRDA:168,13,1,5 +BRDA:168,13,2,5 +BRDA:168,13,3,1 +BRDA:185,14,0,0 +BRDA:185,14,1,1 +BRDA:185,15,0,1 +BRDA:185,15,1,1 +BRDA:193,16,0,0 +BRDA:193,16,1,3 +BRDA:210,17,0,0 +BRDA:210,17,1,0 +BRDA:212,18,0,0 +BRDA:212,18,1,0 +BRDA:215,19,0,0 +BRDA:215,19,1,0 +BRF:43 +BRH:31 +end_of_record +TN: +SF:v0\destinations\bq\transform.js +FN:5,processSingleMessage +FN:9,getDataTypeOverride +FN:11,process +FNF:3 +FNH:3 +FNDA:124,processSingleMessage +FNDA:2917,getDataTypeOverride +FNDA:124,process +DA:1,3 +DA:3,3 +DA:6,124 +DA:12,124 +DA:13,124 +DA:14,124 +DA:15,124 +DA:16,124 +DA:27,3 +LF:9 +LH:9 +BRDA:12,0,0,124 +BRDA:12,0,1,0 +BRDA:13,1,0,124 +BRDA:13,1,1,124 +BRDA:23,2,0,6 +BRDA:23,2,1,118 +BRF:6 +BRH:5 +end_of_record +TN: +SF:v0\destinations\bqstream\transform.js +FN:5,(anonymous_0) +FN:17,(anonymous_1) +FNF:2 +FNH:2 +FNDA:2,(anonymous_0) +FNDA:2,(anonymous_1) +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,2 +DA:12,1 +DA:14,1 +DA:17,1 +DA:18,2 +DA:19,2 +DA:21,2 +DA:22,0 +DA:24,2 +DA:25,0 +DA:31,2 +DA:32,2 +DA:33,2 +DA:34,2 +DA:35,1 +DA:37,2 +DA:45,1 +LF:20 +LH:18 +BRDA:6,0,0,1 +BRDA:6,0,1,1 +BRDA:7,1,0,2 +BRDA:7,1,1,1 +BRDA:7,1,2,1 +BRDA:7,1,3,1 +BRDA:21,2,0,0 +BRDA:21,2,1,2 +BRDA:24,3,0,0 +BRDA:24,3,1,2 +BRDA:24,4,0,2 +BRDA:24,4,1,2 +BRDA:34,5,0,1 +BRDA:34,5,1,1 +BRF:14 +BRH:12 +end_of_record +TN: +SF:v0\destinations\branch\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:7,1 +LF:3 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\branch\transform.js +FN:17,responseBuilder +FN:42,getCategoryAndName +FN:48,(anonymous_2) +FN:61,getUserData +FN:110,mapPayload +FN:117,(anonymous_5) +FN:130,(anonymous_6) +FN:151,getCommonPayload +FN:172,(anonymous_8) +FN:178,(anonymous_9) +FN:207,(anonymous_10) +FN:227,processMessage +FN:245,process +FN:250,(anonymous_13) +FN:257,(anonymous_14) +FNF:15 +FNH:13 +FNDA:12,responseBuilder +FNDA:12,getCategoryAndName +FNDA:180,(anonymous_2) +FNDA:12,getUserData +FNDA:13,mapPayload +FNDA:50,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:12,getCommonPayload +FNDA:13,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:27,(anonymous_10) +FNDA:14,processMessage +FNDA:14,process +FNDA:1,(anonymous_13) +FNDA:2,(anonymous_14) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:15,1 +DA:18,12 +DA:20,12 +DA:21,4 +DA:23,8 +DA:25,12 +DA:27,12 +DA:32,12 +DA:43,12 +DA:44,20 +DA:45,20 +DA:46,20 +DA:48,20 +DA:49,180 +DA:50,8 +DA:51,8 +DA:54,20 +DA:55,8 +DA:58,4 +DA:64,12 +DA:66,12 +DA:79,12 +DA:80,11 +DA:81,9 +DA:85,9 +DA:87,2 +DA:88,2 +DA:90,2 +DA:96,12 +DA:97,12 +DA:98,10 +DA:99,7 +DA:100,3 +DA:101,3 +DA:105,12 +DA:107,12 +DA:111,13 +DA:112,13 +DA:113,13 +DA:115,13 +DA:116,13 +DA:117,5 +DA:118,50 +DA:119,5 +DA:120,5 +DA:121,5 +DA:122,5 +DA:124,45 +DA:128,13 +DA:129,8 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:136,0 +DA:141,13 +DA:142,8 +DA:144,13 +DA:152,12 +DA:154,12 +DA:155,12 +DA:156,12 +DA:157,12 +DA:160,12 +DA:162,8 +DA:165,8 +DA:167,4 +DA:168,4 +DA:171,12 +DA:172,9 +DA:173,13 +DA:174,0 +DA:175,0 +DA:176,0 +DA:178,0 +DA:179,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:188,0 +DA:189,0 +DA:192,13 +DA:197,13 +DA:198,13 +DA:199,13 +DA:202,9 +DA:203,9 +DA:204,9 +DA:205,9 +DA:207,9 +DA:208,27 +DA:209,14 +DA:213,12 +DA:214,12 +DA:216,12 +DA:228,14 +DA:230,9 +DA:231,1 +DA:233,8 +DA:234,8 +DA:236,4 +DA:237,4 +DA:239,1 +DA:241,12 +DA:242,12 +DA:246,14 +DA:247,14 +DA:250,1 +DA:251,1 +DA:252,0 +DA:253,0 +DA:256,1 +DA:258,2 +DA:259,2 +DA:261,0 +DA:268,2 +DA:274,0 +DA:286,1 +DA:289,1 +LF:124 +LH:104 +BRDA:20,0,0,4 +BRDA:20,0,1,8 +BRDA:49,1,0,8 +BRDA:49,1,1,172 +BRDA:54,2,0,8 +BRDA:54,2,1,12 +BRDA:54,3,0,20 +BRDA:54,3,1,8 +BRDA:79,4,0,11 +BRDA:79,4,1,1 +BRDA:80,5,0,9 +BRDA:80,5,1,2 +BRDA:82,6,0,9 +BRDA:82,6,1,9 +BRDA:86,7,0,9 +BRDA:86,7,1,9 +BRDA:87,8,0,2 +BRDA:87,8,1,0 +BRDA:89,9,0,2 +BRDA:89,9,1,2 +BRDA:91,10,0,2 +BRDA:91,10,1,2 +BRDA:97,11,0,10 +BRDA:97,11,1,2 +BRDA:98,12,0,7 +BRDA:98,12,1,3 +BRDA:100,13,0,3 +BRDA:100,13,1,0 +BRDA:116,14,0,5 +BRDA:116,14,1,8 +BRDA:118,15,0,5 +BRDA:118,15,1,45 +BRDA:128,16,0,8 +BRDA:128,16,1,5 +BRDA:129,17,0,0 +BRDA:129,17,1,8 +BRDA:131,18,0,0 +BRDA:131,18,1,0 +BRDA:141,19,0,8 +BRDA:141,19,1,5 +BRDA:160,20,0,8 +BRDA:160,20,1,4 +BRDA:162,21,0,5 +BRDA:162,21,1,3 +BRDA:171,22,0,9 +BRDA:171,22,1,3 +BRDA:173,23,0,0 +BRDA:173,23,1,13 +BRDA:208,24,0,14 +BRDA:208,24,1,13 +BRDA:228,25,0,9 +BRDA:228,25,1,4 +BRDA:228,25,2,1 +BRDA:230,26,0,1 +BRDA:230,26,1,8 +BRDA:251,27,0,0 +BRDA:251,27,1,1 +BRDA:251,28,0,1 +BRDA:251,28,1,1 +BRDA:259,29,0,0 +BRDA:259,29,1,2 +BRDA:276,30,0,0 +BRDA:276,30,1,0 +BRDA:278,31,0,0 +BRDA:278,31,1,0 +BRDA:281,32,0,0 +BRDA:281,32,1,0 +BRF:67 +BRH:53 +end_of_record +TN: +SF:v0\destinations\branch\data\eventMapping.js +FNF:0 +FNH:0 +DA:1,1 +DA:32,1 +DA:59,1 +DA:73,1 +DA:87,1 +DA:93,1 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\braze\config.js +FN:12,getIdentifyEndpoint +FN:16,getTrackEndPoint +FNF:2 +FNH:2 +FNDA:6,getIdentifyEndpoint +FNDA:14,getTrackEndPoint +DA:1,2 +DA:3,2 +DA:13,6 +DA:17,14 +DA:20,2 +DA:22,2 +DA:26,2 +DA:27,2 +DA:29,2 +DA:31,2 +LF:10 +LH:10 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\braze\transform.js +FN:31,formatGender +FN:50,buildResponse +FN:66,setAliasObjectWithAnonId +FN:76,setExternalId +FN:85,setExternalIdOrAliasObject +FN:95,getIdentifyPayload +FN:103,getUserAttributesObject +FN:115,(anonymous_7) +FN:140,(anonymous_8) +FN:154,processIdentify +FN:169,processTrackWithUserAttributes +FN:183,handleReservedProperties +FN:195,(anonymous_12) +FN:201,addMandatoryEventProperties +FN:207,addMandatoryPurchaseProperties +FN:226,getPurchaseObjs +FN:234,(anonymous_16) +FN:259,processTrackEvent +FN:337,processGroup +FN:365,process +FN:468,formatBatchResponse +FN:476,batch +FN:668,(anonymous_22) +FN:675,(anonymous_23) +FNF:24 +FNH:24 +FNDA:1,formatGender +FNDA:20,buildResponse +FNDA:23,setAliasObjectWithAnonId +FNDA:13,setExternalId +FNDA:23,setExternalIdOrAliasObject +FNDA:6,getIdentifyPayload +FNDA:15,getUserAttributesObject +FNDA:126,(anonymous_7) +FNDA:36,(anonymous_8) +FNDA:6,processIdentify +FNDA:6,processTrackWithUserAttributes +FNDA:6,handleReservedProperties +FNDA:36,(anonymous_12) +FNDA:6,addMandatoryEventProperties +FNDA:5,addMandatoryPurchaseProperties +FNDA:3,getPurchaseObjs +FNDA:6,(anonymous_16) +FNDA:9,processTrackEvent +FNDA:1,processGroup +FNDA:16,process +FNDA:6,formatBatchResponse +FNDA:3,batch +FNDA:1,(anonymous_22) +FNDA:2,(anonymous_23) +DA:2,2 +DA:4,2 +DA:16,2 +DA:17,2 +DA:18,2 +DA:29,2 +DA:33,1 +DA:34,1 +DA:38,0 +DA:39,0 +DA:43,0 +DA:44,0 +DA:47,0 +DA:51,20 +DA:52,20 +DA:53,20 +DA:54,20 +DA:55,20 +DA:67,23 +DA:68,23 +DA:73,23 +DA:78,13 +DA:79,13 +DA:80,10 +DA:82,13 +DA:86,23 +DA:87,23 +DA:88,6 +DA:91,17 +DA:92,17 +DA:96,6 +DA:97,6 +DA:98,6 +DA:99,6 +DA:105,15 +DA:107,15 +DA:110,15 +DA:111,1 +DA:115,14 +DA:116,126 +DA:117,126 +DA:119,12 +DA:120,1 +DA:122,12 +DA:127,14 +DA:138,14 +DA:140,12 +DA:142,36 +DA:143,24 +DA:144,24 +DA:145,24 +DA:151,14 +DA:156,6 +DA:157,6 +DA:158,1 +DA:161,6 +DA:170,6 +DA:171,6 +DA:172,5 +DA:173,5 +DA:180,1 +DA:186,6 +DA:195,6 +DA:196,36 +DA:198,6 +DA:202,6 +DA:203,6 +DA:204,6 +DA:214,5 +DA:215,4 +DA:223,1 +DA:227,3 +DA:228,3 +DA:230,3 +DA:232,3 +DA:234,3 +DA:235,6 +DA:236,6 +DA:237,6 +DA:238,5 +DA:239,0 +DA:241,5 +DA:248,5 +DA:249,4 +DA:250,4 +DA:256,3 +DA:260,9 +DA:262,9 +DA:263,0 +DA:265,9 +DA:266,9 +DA:270,9 +DA:271,9 +DA:272,6 +DA:273,6 +DA:276,9 +DA:280,3 +DA:282,3 +DA:284,2 +DA:285,2 +DA:287,2 +DA:288,2 +DA:290,2 +DA:291,2 +DA:302,1 +DA:313,6 +DA:314,6 +DA:317,6 +DA:318,6 +DA:320,6 +DA:321,6 +DA:322,6 +DA:324,6 +DA:338,1 +DA:339,1 +DA:340,1 +DA:341,0 +DA:352,1 +DA:353,1 +DA:354,1 +DA:366,16 +DA:368,16 +DA:369,16 +DA:372,16 +DA:374,16 +DA:375,8 +DA:376,8 +DA:377,2 +DA:379,6 +DA:383,16 +DA:384,16 +DA:386,7 +DA:392,6 +DA:393,6 +DA:395,2 +DA:397,2 +DA:403,2 +DA:404,2 +DA:406,0 +DA:408,0 +DA:414,0 +DA:415,0 +DA:417,6 +DA:418,6 +DA:419,6 +DA:420,6 +DA:423,6 +DA:429,6 +DA:430,5 +DA:432,6 +DA:434,1 +DA:435,1 +DA:436,1 +DA:438,0 +DA:451,15 +DA:469,6 +DA:470,6 +DA:471,6 +DA:472,6 +DA:473,6 +DA:477,3 +DA:483,3 +DA:484,3 +DA:485,3 +DA:486,3 +DA:487,3 +DA:488,3 +DA:489,3 +DA:491,3 +DA:493,181 +DA:494,181 +DA:497,181 +DA:500,181 +DA:501,181 +DA:503,181 +DA:507,181 +DA:509,160 +DA:510,3 +DA:514,160 +DA:517,160 +DA:523,160 +DA:524,1 +DA:529,1 +DA:530,1 +DA:531,1 +DA:532,1 +DA:535,1 +DA:536,1 +DA:538,1 +DA:539,1 +DA:541,1 +DA:542,0 +DA:544,1 +DA:546,1 +DA:547,1 +DA:552,1 +DA:553,1 +DA:554,1 +DA:555,1 +DA:560,160 +DA:561,159 +DA:564,160 +DA:565,114 +DA:568,160 +DA:569,1 +DA:573,160 +DA:576,21 +DA:577,2 +DA:579,21 +DA:581,21 +DA:583,21 +DA:585,0 +DA:586,0 +DA:587,0 +DA:588,0 +DA:591,0 +DA:592,0 +DA:594,0 +DA:595,0 +DA:600,0 +DA:601,0 +DA:606,21 +DA:607,21 +DA:610,21 +DA:615,3 +DA:616,3 +DA:617,3 +DA:618,2 +DA:619,2 +DA:620,2 +DA:623,2 +DA:624,2 +DA:626,2 +DA:627,2 +DA:637,3 +DA:642,3 +DA:643,3 +DA:644,3 +DA:645,3 +DA:648,3 +DA:649,3 +DA:651,3 +DA:652,3 +DA:654,3 +DA:655,1 +DA:657,3 +DA:659,3 +DA:660,3 +DA:665,3 +DA:668,2 +DA:669,1 +DA:670,0 +DA:671,0 +DA:674,1 +DA:676,2 +DA:677,2 +DA:679,0 +DA:686,2 +DA:692,0 +DA:697,0 +DA:706,1 +DA:709,2 +LF:262 +LH:233 +BRDA:33,0,0,1 +BRDA:33,0,1,0 +BRDA:38,1,0,0 +BRDA:38,1,1,0 +BRDA:43,2,0,0 +BRDA:43,2,1,0 +BRDA:53,3,0,20 +BRDA:53,3,1,12 +BRDA:62,4,0,20 +BRDA:62,4,1,12 +BRDA:67,5,0,23 +BRDA:67,5,1,0 +BRDA:78,6,0,13 +BRDA:78,6,1,13 +BRDA:79,7,0,10 +BRDA:79,7,1,3 +BRDA:87,8,0,6 +BRDA:87,8,1,17 +BRDA:87,9,0,23 +BRDA:87,9,1,17 +BRDA:110,10,0,1 +BRDA:110,10,1,14 +BRDA:117,11,0,12 +BRDA:117,11,1,114 +BRDA:119,12,0,1 +BRDA:119,12,1,11 +BRDA:138,13,0,12 +BRDA:138,13,1,2 +BRDA:142,14,0,24 +BRDA:142,14,1,12 +BRDA:144,15,0,24 +BRDA:144,15,1,0 +BRDA:157,16,0,1 +BRDA:157,16,1,5 +BRDA:171,17,0,5 +BRDA:171,17,1,1 +BRDA:171,18,0,6 +BRDA:171,18,1,6 +BRDA:214,19,0,4 +BRDA:214,19,1,1 +BRDA:232,20,0,3 +BRDA:232,20,1,0 +BRDA:235,21,0,6 +BRDA:235,21,1,0 +BRDA:237,22,0,5 +BRDA:237,22,1,1 +BRDA:237,23,0,6 +BRDA:237,23,1,6 +BRDA:237,23,2,5 +BRDA:238,24,0,0 +BRDA:238,24,1,5 +BRDA:238,25,0,5 +BRDA:238,25,1,5 +BRDA:244,26,0,5 +BRDA:244,26,1,1 +BRDA:248,27,0,4 +BRDA:248,27,1,1 +BRDA:256,28,0,1 +BRDA:256,28,1,2 +BRDA:262,29,0,0 +BRDA:262,29,1,9 +BRDA:271,30,0,6 +BRDA:271,30,1,3 +BRDA:271,31,0,9 +BRDA:271,31,1,9 +BRDA:276,32,0,3 +BRDA:276,32,1,6 +BRDA:277,33,0,9 +BRDA:277,33,1,7 +BRDA:282,34,0,2 +BRDA:282,34,1,1 +BRDA:321,35,0,6 +BRDA:321,35,1,0 +BRDA:340,36,0,0 +BRDA:340,36,1,1 +BRDA:374,37,0,8 +BRDA:374,37,1,8 +BRDA:376,38,0,2 +BRDA:376,38,1,6 +BRDA:384,39,0,7 +BRDA:384,39,1,2 +BRDA:384,39,2,0 +BRDA:384,39,3,6 +BRDA:384,39,4,1 +BRDA:384,39,5,0 +BRDA:396,40,0,2 +BRDA:396,40,1,2 +BRDA:396,40,2,2 +BRDA:407,41,0,0 +BRDA:407,41,1,0 +BRDA:407,41,2,0 +BRDA:418,42,0,6 +BRDA:418,42,1,0 +BRDA:429,43,0,5 +BRDA:429,43,1,1 +BRDA:501,44,0,160 +BRDA:501,44,1,21 +BRDA:501,45,0,181 +BRDA:501,45,1,181 +BRDA:507,46,0,160 +BRDA:507,46,1,21 +BRDA:509,47,0,3 +BRDA:509,47,1,157 +BRDA:518,48,0,159 +BRDA:518,48,1,1 +BRDA:519,49,0,114 +BRDA:519,49,1,46 +BRDA:520,50,0,1 +BRDA:520,50,1,159 +BRDA:523,51,0,1 +BRDA:523,51,1,159 +BRDA:524,52,0,1 +BRDA:524,52,1,0 +BRDA:525,53,0,1 +BRDA:525,53,1,0 +BRDA:525,53,2,0 +BRDA:535,54,0,1 +BRDA:535,54,1,0 +BRDA:538,55,0,1 +BRDA:538,55,1,0 +BRDA:541,56,0,0 +BRDA:541,56,1,1 +BRDA:560,57,0,159 +BRDA:560,57,1,1 +BRDA:564,58,0,114 +BRDA:564,58,1,46 +BRDA:568,59,0,1 +BRDA:568,59,1,159 +BRDA:576,60,0,2 +BRDA:576,60,1,19 +BRDA:581,61,0,21 +BRDA:581,61,1,0 +BRDA:583,62,0,0 +BRDA:583,62,1,21 +BRDA:591,63,0,0 +BRDA:591,63,1,0 +BRDA:606,64,0,21 +BRDA:606,64,1,0 +BRDA:617,65,0,2 +BRDA:617,65,1,1 +BRDA:637,66,0,3 +BRDA:637,66,1,0 +BRDA:638,67,0,3 +BRDA:638,67,1,0 +BRDA:638,67,2,0 +BRDA:648,68,0,3 +BRDA:648,68,1,0 +BRDA:651,69,0,3 +BRDA:651,69,1,0 +BRDA:654,70,0,1 +BRDA:654,70,1,2 +BRDA:669,71,0,0 +BRDA:669,71,1,1 +BRDA:669,72,0,1 +BRDA:669,72,1,1 +BRDA:677,73,0,0 +BRDA:677,73,1,2 +BRDA:699,74,0,0 +BRDA:699,74,1,0 +BRDA:700,75,0,0 +BRDA:700,75,1,0 +BRF:161 +BRH:120 +end_of_record +TN: +SF:v0\destinations\candu\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:4,1 +DA:9,1 +DA:11,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\candu\transform.js +FN:12,(anonymous_0) +FN:31,(anonymous_1) +FN:60,(anonymous_2) +FN:63,(anonymous_3) +FN:70,(anonymous_4) +FNF:5 +FNH:5 +FNDA:6,(anonymous_0) +FNDA:10,(anonymous_1) +FNDA:10,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:1,(anonymous_4) +DA:1,1 +DA:9,1 +DA:10,1 +DA:12,1 +DA:13,6 +DA:14,6 +DA:17,6 +DA:18,5 +DA:20,6 +DA:21,6 +DA:22,6 +DA:23,6 +DA:24,6 +DA:28,6 +DA:31,1 +DA:32,10 +DA:33,1 +DA:34,9 +DA:35,1 +DA:40,8 +DA:41,8 +DA:42,8 +DA:44,3 +DA:45,3 +DA:46,3 +DA:48,4 +DA:49,3 +DA:50,3 +DA:52,1 +DA:57,6 +DA:60,1 +DA:61,10 +DA:63,1 +DA:64,1 +DA:65,0 +DA:66,0 +DA:69,1 +DA:71,1 +DA:72,1 +DA:74,0 +DA:81,1 +DA:87,0 +DA:99,1 +DA:102,1 +LF:44 +LH:40 +BRDA:17,0,0,5 +BRDA:17,0,1,1 +BRDA:32,1,0,1 +BRDA:32,1,1,9 +BRDA:34,2,0,1 +BRDA:34,2,1,8 +BRDA:42,3,0,3 +BRDA:42,3,1,4 +BRDA:42,3,2,1 +BRDA:64,4,0,0 +BRDA:64,4,1,1 +BRDA:64,5,0,1 +BRDA:64,5,1,1 +BRDA:72,6,0,0 +BRDA:72,6,1,1 +BRDA:89,7,0,0 +BRDA:89,7,1,0 +BRDA:91,8,0,0 +BRDA:91,8,1,0 +BRDA:94,9,0,0 +BRDA:94,9,1,0 +BRF:21 +BRH:13 +end_of_record +TN: +SF:v0\destinations\clevertap\config.js +FN:3,(anonymous_0) +FNF:1 +FNH:1 +FNDA:18,(anonymous_0) +DA:1,2 +DA:3,2 +DA:4,18 +DA:5,18 +DA:6,0 +DA:9,18 +DA:12,2 +DA:22,2 +DA:45,2 +DA:47,2 +LF:10 +LH:9 +BRDA:5,0,0,0 +BRDA:5,0,1,18 +BRDA:5,1,0,18 +BRDA:5,1,1,1 +BRF:4 +BRH:3 +end_of_record +TN: +SF:v0\destinations\clevertap\transform.js +FN:45,(anonymous_0) +FN:62,(anonymous_1) +FN:93,(anonymous_2) +FN:113,(anonymous_3) +FN:130,(anonymous_4) +FN:137,(anonymous_5) +FN:160,(anonymous_6) +FN:274,(anonymous_7) +FN:303,(anonymous_8) +FN:307,(anonymous_9) +FN:314,(anonymous_10) +FNF:11 +FNH:11 +FNDA:18,(anonymous_0) +FNDA:3,(anonymous_1) +FNDA:5,(anonymous_2) +FNDA:2,(anonymous_3) +FNDA:6,(anonymous_4) +FNDA:8,(anonymous_5) +FNDA:17,(anonymous_6) +FNDA:19,(anonymous_7) +FNDA:19,(anonymous_8) +FNDA:1,(anonymous_9) +FNDA:2,(anonymous_10) +DA:3,2 +DA:4,2 +DA:10,2 +DA:24,2 +DA:45,2 +DA:46,18 +DA:50,18 +DA:51,18 +DA:52,18 +DA:57,18 +DA:58,18 +DA:62,2 +DA:63,3 +DA:64,3 +DA:65,3 +DA:72,3 +DA:73,0 +DA:77,3 +DA:78,2 +DA:80,2 +DA:81,2 +DA:83,1 +DA:85,1 +DA:87,3 +DA:93,2 +DA:94,5 +DA:106,5 +DA:107,1 +DA:109,5 +DA:113,2 +DA:114,2 +DA:115,2 +DA:116,2 +DA:118,1 +DA:119,1 +DA:121,1 +DA:124,0 +DA:126,2 +DA:130,2 +DA:131,6 +DA:132,6 +DA:137,2 +DA:138,8 +DA:140,8 +DA:145,2 +DA:150,8 +DA:157,8 +DA:160,2 +DA:165,17 +DA:166,8 +DA:167,8 +DA:168,3 +DA:174,3 +DA:175,3 +DA:176,3 +DA:177,3 +DA:179,3 +DA:184,2 +DA:185,2 +DA:197,2 +DA:198,2 +DA:199,2 +DA:200,2 +DA:203,5 +DA:208,9 +DA:212,1 +DA:221,8 +DA:225,1 +DA:234,1 +DA:245,7 +DA:247,8 +DA:250,8 +DA:251,2 +DA:253,6 +DA:257,8 +DA:258,1 +DA:261,8 +DA:266,14 +DA:267,14 +DA:270,0 +DA:274,2 +DA:275,19 +DA:276,1 +DA:281,18 +DA:284,18 +DA:286,8 +DA:287,8 +DA:289,2 +DA:290,2 +DA:292,1 +DA:293,1 +DA:295,6 +DA:296,6 +DA:298,1 +DA:300,17 +DA:303,2 +DA:304,19 +DA:307,2 +DA:308,1 +DA:309,0 +DA:310,0 +DA:313,1 +DA:315,2 +DA:316,2 +DA:318,0 +DA:325,2 +DA:331,0 +DA:343,1 +DA:346,2 +LF:109 +LH:102 +BRDA:68,0,0,3 +BRDA:68,0,1,3 +BRDA:72,1,0,0 +BRDA:72,1,1,3 +BRDA:72,2,0,3 +BRDA:72,2,1,0 +BRDA:77,3,0,2 +BRDA:77,3,1,1 +BRDA:80,4,0,2 +BRDA:80,4,1,0 +BRDA:83,5,0,1 +BRDA:83,5,1,0 +BRDA:99,6,0,5 +BRDA:99,6,1,4 +BRDA:106,7,0,1 +BRDA:106,7,1,4 +BRDA:106,8,0,5 +BRDA:106,8,1,1 +BRDA:116,9,0,1 +BRDA:116,9,1,1 +BRDA:119,10,0,1 +BRDA:119,10,1,0 +BRDA:140,11,0,2 +BRDA:140,11,1,6 +BRDA:141,12,0,8 +BRDA:141,12,1,2 +BRDA:141,12,2,2 +BRDA:165,13,0,8 +BRDA:165,13,1,9 +BRDA:167,14,0,3 +BRDA:167,14,1,5 +BRDA:176,15,0,3 +BRDA:176,15,1,0 +BRDA:179,16,0,2 +BRDA:179,16,1,1 +BRDA:180,17,0,3 +BRDA:180,17,1,2 +BRDA:180,17,2,2 +BRDA:180,17,3,1 +BRDA:184,18,0,1 +BRDA:184,18,1,1 +BRDA:208,19,0,1 +BRDA:208,19,1,8 +BRDA:209,20,0,9 +BRDA:209,20,1,2 +BRDA:221,21,0,1 +BRDA:221,21,1,7 +BRDA:222,22,0,8 +BRDA:222,22,1,5 +BRDA:250,23,0,2 +BRDA:250,23,1,6 +BRDA:257,24,0,1 +BRDA:257,24,1,7 +BRDA:257,25,0,8 +BRDA:257,25,1,1 +BRDA:266,26,0,14 +BRDA:266,26,1,0 +BRDA:275,27,0,1 +BRDA:275,27,1,18 +BRDA:284,28,0,8 +BRDA:284,28,1,2 +BRDA:284,28,2,1 +BRDA:284,28,3,6 +BRDA:284,28,4,1 +BRDA:308,29,0,0 +BRDA:308,29,1,1 +BRDA:308,30,0,1 +BRDA:308,30,1,1 +BRDA:316,31,0,0 +BRDA:316,31,1,2 +BRDA:333,32,0,0 +BRDA:333,32,1,0 +BRDA:335,33,0,0 +BRDA:335,33,1,0 +BRDA:338,34,0,0 +BRDA:338,34,1,0 +BRF:76 +BRH:61 +end_of_record +TN: +SF:v0\destinations\clickhouse\transform.js +FN:6,processSingleMessage +FN:10,getDataTypeOverride +FN:45,process +FNF:3 +FNH:3 +FNDA:124,processSingleMessage +FNDA:2931,getDataTypeOverride +FNDA:124,process +DA:1,3 +DA:2,3 +DA:4,3 +DA:7,124 +DA:11,2931 +DA:12,2915 +DA:14,16 +DA:16,14 +DA:17,0 +DA:20,14 +DA:21,14 +DA:22,14 +DA:23,24 +DA:24,24 +DA:25,10 +DA:26,0 +DA:28,10 +DA:29,3 +DA:31,3 +DA:33,7 +DA:35,4 +DA:37,3 +DA:40,14 +DA:42,2 +DA:46,124 +DA:47,124 +DA:48,124 +DA:50,124 +DA:51,124 +DA:62,3 +LF:30 +LH:28 +BRDA:11,0,0,2915 +BRDA:11,0,1,16 +BRDA:14,1,0,14 +BRDA:14,1,1,2 +BRDA:16,2,0,0 +BRDA:16,2,1,14 +BRDA:24,3,0,10 +BRDA:24,3,1,14 +BRDA:25,4,0,0 +BRDA:25,4,1,10 +BRDA:28,5,0,3 +BRDA:28,5,1,7 +BRDA:28,6,0,10 +BRDA:28,6,1,3 +BRDA:33,7,0,4 +BRDA:33,7,1,3 +BRDA:33,8,0,7 +BRDA:33,8,1,4 +BRDA:46,9,0,124 +BRDA:46,9,1,0 +BRDA:50,10,0,124 +BRDA:50,10,1,124 +BRDA:58,11,0,6 +BRDA:58,11,1,118 +BRF:24 +BRH:21 +end_of_record +TN: +SF:v0\destinations\confluent_cloud\transform.js +FN:1,process +FNF:1 +FNH:1 +FNDA:5,process +DA:2,5 +DA:6,5 +DA:9,1 +LF:3 +LH:3 +BRDA:4,0,0,5 +BRDA:4,0,1,0 +BRF:2 +BRH:1 +end_of_record +TN: +SF:v0\destinations\customerio\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:4,1 +DA:6,1 +DA:8,1 +DA:11,1 +DA:14,1 +DA:16,1 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\customerio\transform.js +FN:40,(anonymous_0) +FN:53,(anonymous_1) +FN:55,(anonymous_2) +FN:58,(anonymous_3) +FN:64,responseBuilder +FN:98,(anonymous_5) +FN:121,(anonymous_6) +FN:261,processSingleMessage +FN:307,process +FN:319,(anonymous_9) +FN:326,(anonymous_10) +FNF:11 +FNH:11 +FNDA:58,(anonymous_0) +FNDA:6,(anonymous_1) +FNDA:6,(anonymous_2) +FNDA:30,(anonymous_3) +FNDA:46,responseBuilder +FNDA:19,(anonymous_5) +FNDA:6,(anonymous_6) +FNDA:46,processSingleMessage +FNDA:46,process +FNDA:1,(anonymous_9) +FNDA:2,(anonymous_10) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:10,1 +DA:22,1 +DA:31,1 +DA:32,1 +DA:34,1 +DA:40,1 +DA:41,58 +DA:49,1 +DA:53,1 +DA:54,6 +DA:55,6 +DA:56,6 +DA:57,6 +DA:58,6 +DA:59,30 +DA:65,46 +DA:68,46 +DA:70,46 +DA:71,46 +DA:72,2 +DA:73,2 +DA:76,46 +DA:77,46 +DA:78,46 +DA:79,46 +DA:85,46 +DA:87,6 +DA:88,0 +DA:92,6 +DA:93,6 +DA:95,6 +DA:96,6 +DA:97,6 +DA:98,6 +DA:102,19 +DA:108,12 +DA:109,12 +DA:119,6 +DA:120,3 +DA:121,3 +DA:122,6 +DA:123,6 +DA:128,6 +DA:130,6 +DA:131,0 +DA:139,6 +DA:140,6 +DA:151,6 +DA:152,4 +DA:154,6 +DA:155,6 +DA:156,40 +DA:158,0 +DA:159,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:172,40 +DA:176,40 +DA:177,8 +DA:178,6 +DA:183,6 +DA:184,6 +DA:186,6 +DA:188,2 +DA:192,32 +DA:193,14 +DA:194,14 +DA:195,14 +DA:196,14 +DA:197,14 +DA:199,14 +DA:204,14 +DA:205,14 +DA:207,18 +DA:208,18 +DA:209,18 +DA:210,18 +DA:211,18 +DA:212,18 +DA:224,32 +DA:225,26 +DA:226,14 +DA:228,12 +DA:231,6 +DA:233,6 +DA:235,1 +DA:240,5 +DA:244,6 +DA:245,6 +DA:246,0 +DA:248,6 +DA:250,6 +DA:253,38 +DA:254,38 +DA:255,38 +DA:256,38 +DA:258,38 +DA:262,46 +DA:265,46 +DA:267,6 +DA:268,6 +DA:270,3 +DA:271,3 +DA:272,3 +DA:274,1 +DA:275,1 +DA:276,1 +DA:278,36 +DA:279,36 +DA:280,36 +DA:282,0 +DA:283,0 +DA:285,0 +DA:286,0 +DA:288,46 +DA:297,44 +DA:298,14 +DA:304,44 +DA:308,46 +DA:309,46 +DA:310,46 +DA:311,44 +DA:312,44 +DA:314,44 +DA:316,44 +DA:319,1 +DA:320,1 +DA:321,0 +DA:322,0 +DA:325,1 +DA:327,2 +DA:328,2 +DA:330,0 +DA:337,2 +DA:343,0 +DA:356,1 +DA:359,1 +LF:145 +LH:126 +BRDA:42,0,0,58 +BRDA:42,0,1,26 +BRDA:42,0,2,26 +BRDA:42,0,3,10 +BRDA:54,1,0,6 +BRDA:54,1,1,0 +BRDA:71,2,0,2 +BRDA:71,2,1,44 +BRDA:78,3,0,46 +BRDA:78,3,1,8 +BRDA:85,4,0,6 +BRDA:85,4,1,40 +BRDA:87,5,0,0 +BRDA:87,5,1,6 +BRDA:92,6,0,6 +BRDA:92,6,1,0 +BRDA:95,7,0,6 +BRDA:95,7,1,0 +BRDA:97,8,0,6 +BRDA:97,8,1,0 +BRDA:102,9,0,12 +BRDA:102,9,1,7 +BRDA:103,10,0,19 +BRDA:103,10,1,15 +BRDA:103,10,2,15 +BRDA:103,10,3,15 +BRDA:119,11,0,3 +BRDA:119,11,1,3 +BRDA:130,12,0,0 +BRDA:130,12,1,6 +BRDA:139,13,0,6 +BRDA:139,13,1,0 +BRDA:151,14,0,4 +BRDA:151,14,1,2 +BRDA:151,15,0,6 +BRDA:151,15,1,6 +BRDA:156,16,0,0 +BRDA:156,16,1,40 +BRDA:158,17,0,0 +BRDA:158,17,1,0 +BRDA:158,18,0,0 +BRDA:158,18,1,0 +BRDA:176,19,0,8 +BRDA:176,19,1,32 +BRDA:177,20,0,6 +BRDA:177,20,1,2 +BRDA:177,21,0,8 +BRDA:177,21,1,6 +BRDA:192,22,0,14 +BRDA:192,22,1,18 +BRDA:192,23,0,32 +BRDA:192,23,1,22 +BRDA:192,23,2,20 +BRDA:193,24,0,14 +BRDA:193,24,1,2 +BRDA:196,25,0,14 +BRDA:196,25,1,0 +BRDA:211,26,0,18 +BRDA:211,26,1,0 +BRDA:224,27,0,26 +BRDA:224,27,1,6 +BRDA:225,28,0,14 +BRDA:225,28,1,12 +BRDA:225,29,0,26 +BRDA:225,29,1,20 +BRDA:233,30,0,1 +BRDA:233,30,1,5 +BRDA:236,31,0,1 +BRDA:236,31,1,0 +BRDA:244,32,0,6 +BRDA:244,32,1,0 +BRDA:245,33,0,0 +BRDA:245,33,1,6 +BRDA:265,34,0,6 +BRDA:265,34,1,3 +BRDA:265,34,2,1 +BRDA:265,34,3,36 +BRDA:265,34,4,0 +BRDA:265,34,5,0 +BRDA:271,35,0,3 +BRDA:271,35,1,0 +BRDA:275,36,0,1 +BRDA:275,36,1,0 +BRDA:297,37,0,14 +BRDA:297,37,1,30 +BRDA:311,38,0,44 +BRDA:311,38,1,0 +BRDA:320,39,0,0 +BRDA:320,39,1,1 +BRDA:320,40,0,1 +BRDA:320,40,1,1 +BRDA:328,41,0,0 +BRDA:328,41,1,2 +BRDA:346,42,0,0 +BRDA:346,42,1,0 +BRDA:348,43,0,0 +BRDA:348,43,1,0 +BRDA:351,44,0,0 +BRDA:351,44,1,0 +BRF:99 +BRH:69 +end_of_record +TN: +SF:v0\destinations\delighted\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:8,1 +DA:10,1 +DA:12,1 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\delighted\transform.js +FN:30,(anonymous_0) +FN:85,(anonymous_1) +FN:148,(anonymous_2) +FN:192,(anonymous_3) +FN:224,(anonymous_4) +FN:231,(anonymous_5) +FNF:6 +FNH:6 +FNDA:4,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:4,(anonymous_2) +FNDA:12,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:2,(anonymous_5) +DA:1,1 +DA:15,1 +DA:16,1 +DA:23,1 +DA:28,1 +DA:30,1 +DA:31,4 +DA:32,4 +DA:33,0 +DA:36,4 +DA:37,4 +DA:38,4 +DA:39,3 +DA:41,3 +DA:43,3 +DA:44,2 +DA:45,0 +DA:46,0 +DA:48,1 +DA:49,0 +DA:50,0 +DA:51,0 +DA:55,3 +DA:56,3 +DA:57,3 +DA:58,3 +DA:59,3 +DA:60,3 +DA:61,3 +DA:64,3 +DA:65,3 +DA:68,3 +DA:73,3 +DA:74,3 +DA:75,3 +DA:79,3 +DA:80,3 +DA:81,3 +DA:82,3 +DA:85,1 +DA:87,4 +DA:88,4 +DA:89,1 +DA:95,3 +DA:96,3 +DA:97,1 +DA:100,2 +DA:101,2 +DA:103,2 +DA:106,2 +DA:108,2 +DA:109,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:115,1 +DA:116,1 +DA:117,1 +DA:122,1 +DA:123,1 +DA:129,1 +DA:130,1 +DA:136,1 +DA:137,1 +DA:138,1 +DA:142,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:148,1 +DA:150,4 +DA:151,4 +DA:153,4 +DA:154,4 +DA:155,1 +DA:157,3 +DA:158,3 +DA:159,3 +DA:160,0 +DA:163,3 +DA:164,3 +DA:165,2 +DA:166,2 +DA:169,3 +DA:170,3 +DA:171,0 +DA:172,0 +DA:174,3 +DA:175,1 +DA:180,2 +DA:181,2 +DA:182,2 +DA:183,2 +DA:184,2 +DA:188,2 +DA:189,2 +DA:192,1 +DA:193,12 +DA:194,12 +DA:195,0 +DA:201,12 +DA:202,0 +DA:205,12 +DA:208,12 +DA:210,4 +DA:211,3 +DA:213,4 +DA:214,1 +DA:216,4 +DA:217,2 +DA:219,0 +DA:221,6 +DA:224,1 +DA:225,1 +DA:226,0 +DA:227,0 +DA:230,1 +DA:232,2 +DA:233,2 +DA:239,0 +DA:251,1 +DA:254,1 +LF:123 +LH:108 +BRDA:32,0,0,0 +BRDA:32,0,1,4 +BRDA:36,1,0,4 +BRDA:36,1,1,2 +BRDA:43,2,0,2 +BRDA:43,2,1,1 +BRDA:43,3,0,3 +BRDA:43,3,1,2 +BRDA:44,4,0,0 +BRDA:44,4,1,2 +BRDA:48,5,0,0 +BRDA:48,5,1,1 +BRDA:48,6,0,1 +BRDA:48,6,1,1 +BRDA:49,7,0,0 +BRDA:49,7,1,0 +BRDA:57,8,0,3 +BRDA:57,8,1,3 +BRDA:58,9,0,3 +BRDA:58,9,1,0 +BRDA:61,10,0,3 +BRDA:61,10,1,0 +BRDA:62,11,0,3 +BRDA:62,11,1,0 +BRDA:64,12,0,3 +BRDA:64,12,1,0 +BRDA:88,13,0,1 +BRDA:88,13,1,3 +BRDA:96,14,0,1 +BRDA:96,14,1,2 +BRDA:100,15,0,2 +BRDA:100,15,1,2 +BRDA:108,16,0,1 +BRDA:108,16,1,1 +BRDA:115,17,0,1 +BRDA:115,17,1,0 +BRDA:116,18,0,1 +BRDA:116,18,1,1 +BRDA:116,18,2,1 +BRDA:129,19,0,1 +BRDA:129,19,1,0 +BRDA:150,20,0,4 +BRDA:150,20,1,3 +BRDA:154,21,0,1 +BRDA:154,21,1,3 +BRDA:159,22,0,0 +BRDA:159,22,1,3 +BRDA:163,23,0,3 +BRDA:163,23,1,2 +BRDA:163,23,2,2 +BRDA:164,24,0,2 +BRDA:164,24,1,1 +BRDA:169,25,0,3 +BRDA:169,25,1,1 +BRDA:169,25,2,0 +BRDA:170,26,0,0 +BRDA:170,26,1,3 +BRDA:174,27,0,1 +BRDA:174,27,1,2 +BRDA:174,28,0,3 +BRDA:174,28,1,1 +BRDA:194,29,0,0 +BRDA:194,29,1,12 +BRDA:201,30,0,0 +BRDA:201,30,1,12 +BRDA:208,31,0,4 +BRDA:208,31,1,4 +BRDA:208,31,2,4 +BRDA:208,31,3,0 +BRDA:225,32,0,0 +BRDA:225,32,1,1 +BRDA:225,33,0,1 +BRDA:225,33,1,1 +BRDA:241,34,0,0 +BRDA:241,34,1,0 +BRDA:243,35,0,0 +BRDA:243,35,1,0 +BRDA:246,36,0,0 +BRDA:246,36,1,0 +BRF:79 +BRH:55 +end_of_record +TN: +SF:v0\destinations\delighted\util.js +FN:5,(anonymous_0) +FN:9,(anonymous_1) +FN:14,(anonymous_2) +FN:39,(anonymous_3) +FN:92,(anonymous_4) +FN:98,(anonymous_5) +FNF:6 +FNH:6 +FNDA:8,(anonymous_0) +FNDA:5,(anonymous_1) +FNDA:6,(anonymous_2) +FNDA:2,(anonymous_3) +FNDA:4,(anonymous_4) +FNDA:4,(anonymous_5) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:6,8 +DA:7,8 +DA:9,1 +DA:10,5 +DA:11,5 +DA:14,1 +DA:15,6 +DA:16,4 +DA:17,0 +DA:22,2 +DA:23,2 +DA:24,1 +DA:30,0 +DA:33,5 +DA:39,1 +DA:40,2 +DA:41,2 +DA:42,2 +DA:43,0 +DA:44,0 +DA:47,2 +DA:49,2 +DA:50,2 +DA:57,2 +DA:63,2 +DA:65,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:76,0 +DA:77,0 +DA:80,0 +DA:81,0 +DA:83,0 +DA:86,0 +DA:92,1 +DA:93,4 +DA:94,4 +DA:95,0 +DA:97,4 +DA:98,4 +DA:99,4 +DA:100,3 +DA:101,3 +DA:105,4 +DA:108,1 +LF:52 +LH:35 +BRDA:15,0,0,4 +BRDA:15,0,1,2 +BRDA:16,1,0,0 +BRDA:16,1,1,4 +BRDA:22,2,0,2 +BRDA:22,2,1,0 +BRDA:23,3,0,1 +BRDA:23,3,1,1 +BRDA:34,4,0,1 +BRDA:34,4,1,4 +BRDA:41,5,0,2 +BRDA:41,5,1,0 +BRDA:43,6,0,0 +BRDA:43,6,1,0 +BRDA:57,7,0,2 +BRDA:57,7,1,0 +BRDA:58,8,0,2 +BRDA:58,8,1,2 +BRDA:58,8,2,2 +BRDA:58,8,3,2 +BRDA:69,9,0,0 +BRDA:69,9,1,0 +BRDA:69,10,0,0 +BRDA:69,10,1,0 +BRDA:71,11,0,0 +BRDA:71,11,1,0 +BRDA:71,11,2,0 +BRDA:71,11,3,0 +BRDA:71,11,4,0 +BRDA:71,11,5,0 +BRDA:71,11,6,0 +BRDA:94,12,0,0 +BRDA:94,12,1,4 +BRDA:99,13,0,3 +BRDA:99,13,1,1 +BRDA:99,14,0,4 +BRDA:99,14,1,3 +BRDA:100,15,0,3 +BRDA:100,15,1,0 +BRF:39 +BRH:20 +end_of_record +TN: +SF:v0\destinations\drip\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:13,1 +DA:41,1 +DA:50,1 +DA:60,1 +DA:69,1 +DA:71,1 +LF:9 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\drip\transform.js +FN:37,(anonymous_0) +FN:54,(anonymous_1) +FN:121,(anonymous_2) +FN:221,(anonymous_3) +FN:252,(anonymous_4) +FN:259,(anonymous_5) +FNF:6 +FNH:5 +FNDA:5,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:9,(anonymous_2) +FNDA:14,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:2,(anonymous_5) +DA:1,1 +DA:16,1 +DA:17,1 +DA:28,1 +DA:35,1 +DA:37,1 +DA:38,5 +DA:40,5 +DA:41,5 +DA:42,1 +DA:43,1 +DA:46,5 +DA:47,5 +DA:48,1 +DA:51,4 +DA:52,4 +DA:53,0 +DA:54,0 +DA:55,0 +DA:57,0 +DA:60,4 +DA:61,4 +DA:62,4 +DA:64,4 +DA:65,2 +DA:66,2 +DA:67,2 +DA:68,2 +DA:69,2 +DA:72,4 +DA:73,2 +DA:74,2 +DA:80,2 +DA:81,2 +DA:85,4 +DA:86,4 +DA:89,4 +DA:90,4 +DA:91,4 +DA:95,4 +DA:97,4 +DA:98,4 +DA:99,1 +DA:100,1 +DA:101,0 +DA:104,1 +DA:105,1 +DA:107,1 +DA:108,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:116,3 +DA:117,3 +DA:118,3 +DA:121,1 +DA:122,9 +DA:124,9 +DA:129,9 +DA:130,0 +DA:131,0 +DA:133,9 +DA:134,0 +DA:137,9 +DA:138,9 +DA:139,1 +DA:141,8 +DA:143,8 +DA:144,6 +DA:145,5 +DA:146,0 +DA:152,7 +DA:153,2 +DA:154,2 +DA:155,2 +DA:157,2 +DA:158,0 +DA:159,0 +DA:161,2 +DA:162,2 +DA:163,1 +DA:164,1 +DA:165,1 +DA:168,2 +DA:169,2 +DA:170,2 +DA:171,2 +DA:175,2 +DA:176,2 +DA:177,2 +DA:178,2 +DA:181,5 +DA:182,5 +DA:183,5 +DA:184,5 +DA:185,5 +DA:186,0 +DA:187,0 +DA:190,5 +DA:191,1 +DA:192,1 +DA:198,1 +DA:199,1 +DA:205,5 +DA:206,5 +DA:209,5 +DA:210,5 +DA:211,5 +DA:215,5 +DA:216,5 +DA:217,5 +DA:218,5 +DA:221,1 +DA:222,14 +DA:223,14 +DA:224,0 +DA:229,14 +DA:230,0 +DA:232,14 +DA:233,0 +DA:236,14 +DA:239,14 +DA:241,5 +DA:242,4 +DA:244,9 +DA:245,7 +DA:247,0 +DA:249,11 +DA:252,1 +DA:253,1 +DA:254,0 +DA:255,0 +DA:258,1 +DA:260,2 +DA:261,2 +DA:267,0 +DA:279,1 +DA:282,1 +LF:138 +LH:118 +BRDA:41,0,0,1 +BRDA:41,0,1,4 +BRDA:47,1,0,1 +BRDA:47,1,1,4 +BRDA:47,2,0,5 +BRDA:47,2,1,5 +BRDA:52,3,0,0 +BRDA:52,3,1,4 +BRDA:52,4,0,4 +BRDA:52,4,1,0 +BRDA:64,5,0,2 +BRDA:64,5,1,2 +BRDA:64,6,0,4 +BRDA:64,6,1,2 +BRDA:66,7,0,2 +BRDA:66,7,1,0 +BRDA:66,8,0,2 +BRDA:66,8,1,2 +BRDA:72,9,0,2 +BRDA:72,9,1,2 +BRDA:80,10,0,2 +BRDA:80,10,1,0 +BRDA:97,11,0,4 +BRDA:97,11,1,4 +BRDA:98,12,0,1 +BRDA:98,12,1,3 +BRDA:98,13,0,4 +BRDA:98,13,1,1 +BRDA:100,14,0,0 +BRDA:100,14,1,1 +BRDA:129,15,0,0 +BRDA:129,15,1,9 +BRDA:133,16,0,0 +BRDA:133,16,1,9 +BRDA:133,17,0,9 +BRDA:133,17,1,9 +BRDA:138,18,0,1 +BRDA:138,18,1,8 +BRDA:143,19,0,6 +BRDA:143,19,1,2 +BRDA:143,20,0,8 +BRDA:143,20,1,6 +BRDA:145,21,0,0 +BRDA:145,21,1,5 +BRDA:152,22,0,2 +BRDA:152,22,1,5 +BRDA:157,23,0,0 +BRDA:157,23,1,2 +BRDA:157,24,0,2 +BRDA:157,24,1,2 +BRDA:162,25,0,1 +BRDA:162,25,1,1 +BRDA:164,26,0,1 +BRDA:164,26,1,0 +BRDA:164,27,0,1 +BRDA:164,27,1,1 +BRDA:185,28,0,0 +BRDA:185,28,1,5 +BRDA:185,29,0,5 +BRDA:185,29,1,5 +BRDA:190,30,0,1 +BRDA:190,30,1,4 +BRDA:198,31,0,1 +BRDA:198,31,1,0 +BRDA:223,32,0,0 +BRDA:223,32,1,14 +BRDA:229,33,0,0 +BRDA:229,33,1,14 +BRDA:232,34,0,0 +BRDA:232,34,1,14 +BRDA:239,35,0,5 +BRDA:239,35,1,9 +BRDA:239,35,2,0 +BRDA:253,36,0,0 +BRDA:253,36,1,1 +BRDA:253,37,0,1 +BRDA:253,37,1,1 +BRDA:269,38,0,0 +BRDA:269,38,1,0 +BRDA:271,39,0,0 +BRDA:271,39,1,0 +BRDA:274,40,0,0 +BRDA:274,40,1,0 +BRF:83 +BRH:60 +end_of_record +TN: +SF:v0\destinations\drip\util.js +FN:10,(anonymous_0) +FN:15,(anonymous_1) +FN:20,(anonymous_2) +FN:53,(anonymous_3) +FN:82,(anonymous_4) +FN:85,(anonymous_5) +FNF:6 +FNH:6 +FNDA:14,(anonymous_0) +FNDA:7,(anonymous_1) +FNDA:6,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:1,(anonymous_5) +DA:1,1 +DA:2,1 +DA:7,1 +DA:8,1 +DA:10,1 +DA:11,14 +DA:12,14 +DA:15,1 +DA:16,7 +DA:17,7 +DA:20,1 +DA:21,6 +DA:23,6 +DA:24,6 +DA:33,5 +DA:34,5 +DA:36,0 +DA:38,1 +DA:39,1 +DA:40,1 +DA:41,0 +DA:42,0 +DA:46,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:65,1 +DA:66,1 +DA:68,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:75,0 +DA:82,1 +DA:83,1 +DA:84,1 +DA:85,1 +DA:86,1 +DA:87,1 +DA:88,1 +DA:90,0 +DA:96,1 +DA:99,1 +LF:44 +LH:34 +BRDA:33,0,0,5 +BRDA:33,0,1,0 +BRDA:33,1,0,5 +BRDA:33,1,1,5 +BRDA:40,2,0,0 +BRDA:40,2,1,1 +BRDA:41,3,0,0 +BRDA:41,3,1,0 +BRDA:42,4,0,0 +BRDA:42,4,1,0 +BRDA:65,5,0,1 +BRDA:65,5,1,0 +BRDA:66,6,0,1 +BRDA:66,6,1,0 +BRDA:72,7,0,0 +BRDA:72,7,1,0 +BRDA:72,8,0,0 +BRDA:72,8,1,0 +BRDA:84,9,0,1 +BRDA:84,9,1,0 +BRDA:87,10,0,1 +BRDA:87,10,1,0 +BRDA:87,11,0,1 +BRDA:87,11,1,1 +BRF:24 +BRH:10 +end_of_record +TN: +SF:v0\destinations\eventbridge\transform.js +FN:8,getResouceList +FN:13,(anonymous_1) +FN:23,process +FN:52,(anonymous_3) +FN:59,(anonymous_4) +FNF:5 +FNH:3 +FNDA:2,getResouceList +FNDA:4,(anonymous_1) +FNDA:3,process +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +DA:6,1 +DA:10,2 +DA:11,2 +DA:12,2 +DA:13,2 +DA:14,4 +DA:15,4 +DA:16,4 +DA:20,2 +DA:26,3 +DA:27,3 +DA:28,2 +DA:38,1 +DA:44,1 +DA:49,2 +DA:52,1 +DA:53,0 +DA:54,0 +DA:55,0 +DA:58,0 +DA:60,0 +DA:61,0 +DA:63,0 +DA:70,0 +DA:76,0 +DA:88,0 +DA:91,1 +LF:27 +LH:17 +BRDA:12,0,0,2 +BRDA:12,0,1,0 +BRDA:15,1,0,4 +BRDA:15,1,1,0 +BRDA:27,2,0,2 +BRDA:27,2,1,1 +BRDA:27,3,0,3 +BRDA:27,3,1,3 +BRDA:34,4,0,2 +BRDA:34,4,1,1 +BRDA:45,5,0,1 +BRDA:45,5,1,0 +BRDA:46,6,0,1 +BRDA:46,6,1,1 +BRDA:53,7,0,0 +BRDA:53,7,1,0 +BRDA:53,8,0,0 +BRDA:53,8,1,0 +BRDA:61,9,0,0 +BRDA:61,9,1,0 +BRDA:78,10,0,0 +BRDA:78,10,1,0 +BRDA:80,11,0,0 +BRDA:80,11,1,0 +BRDA:83,12,0,0 +BRDA:83,12,1,0 +BRF:26 +BRH:11 +end_of_record +TN: +SF:v0\destinations\facebook_pixel\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:58,1 +DA:59,1 +DA:69,1 +DA:70,1 +DA:79,1 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\facebook_pixel\transform.js +FN:34,(anonymous_0) +FN:52,(anonymous_1) +FN:76,(anonymous_2) +FN:96,(anonymous_3) +FN:117,(anonymous_4) +FN:146,(anonymous_5) +FN:152,(anonymous_6) +FN:179,(anonymous_7) +FN:200,(anonymous_8) +FN:227,(anonymous_9) +FN:302,(anonymous_10) +FN:349,(anonymous_11) +FN:381,(anonymous_12) +FN:594,(anonymous_13) +FN:669,(anonymous_14) +FN:737,(anonymous_15) +FN:741,(anonymous_16) +FN:748,(anonymous_17) +FNF:18 +FNH:18 +FNDA:11,(anonymous_0) +FNDA:15,(anonymous_1) +FNDA:5,(anonymous_2) +FNDA:6,(anonymous_3) +FNDA:11,(anonymous_4) +FNDA:4,(anonymous_5) +FNDA:4,(anonymous_6) +FNDA:6,(anonymous_7) +FNDA:5,(anonymous_8) +FNDA:4,(anonymous_9) +FNDA:31,(anonymous_10) +FNDA:255,(anonymous_11) +FNDA:34,(anonymous_12) +FNDA:38,(anonymous_13) +FNDA:28,(anonymous_14) +FNDA:38,(anonymous_15) +FNDA:1,(anonymous_16) +FNDA:2,(anonymous_17) +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:12,1 +DA:13,1 +DA:27,1 +DA:34,1 +DA:35,11 +DA:36,11 +DA:37,10 +DA:39,1 +DA:52,1 +DA:53,15 +DA:54,15 +DA:60,0 +DA:63,15 +DA:64,15 +DA:65,2 +DA:66,2 +DA:67,2 +DA:68,2 +DA:72,13 +DA:73,8 +DA:75,13 +DA:76,13 +DA:77,5 +DA:78,2 +DA:80,5 +DA:82,13 +DA:83,2 +DA:86,13 +DA:96,1 +DA:97,6 +DA:98,6 +DA:99,6 +DA:100,6 +DA:101,6 +DA:102,6 +DA:103,6 +DA:104,6 +DA:106,12 +DA:107,12 +DA:110,12 +DA:115,12 +DA:117,6 +DA:118,11 +DA:119,1 +DA:126,0 +DA:128,5 +DA:146,1 +DA:148,4 +DA:149,4 +DA:150,4 +DA:151,4 +DA:152,2 +DA:153,4 +DA:154,4 +DA:155,4 +DA:156,4 +DA:157,4 +DA:164,0 +DA:169,4 +DA:170,2 +DA:172,2 +DA:173,2 +DA:177,2 +DA:179,4 +DA:180,6 +DA:181,0 +DA:187,4 +DA:200,1 +DA:201,5 +DA:202,5 +DA:208,5 +DA:210,5 +DA:211,5 +DA:212,5 +DA:213,5 +DA:216,4 +DA:227,4 +DA:228,4 +DA:229,0 +DA:235,4 +DA:302,1 +DA:311,31 +DA:327,31 +DA:328,31 +DA:329,31 +DA:330,31 +DA:331,31 +DA:332,31 +DA:333,31 +DA:334,31 +DA:335,31 +DA:339,31 +DA:340,31 +DA:341,31 +DA:345,31 +DA:346,31 +DA:347,31 +DA:349,31 +DA:350,255 +DA:352,255 +DA:353,255 +DA:354,9 +DA:357,255 +DA:363,3 +DA:364,2 +DA:369,1 +DA:372,255 +DA:373,255 +DA:374,212 +DA:378,31 +DA:381,1 +DA:387,34 +DA:388,34 +DA:398,34 +DA:399,34 +DA:401,34 +DA:403,34 +DA:408,34 +DA:409,34 +DA:410,34 +DA:411,3 +DA:413,3 +DA:416,34 +DA:419,34 +DA:420,34 +DA:422,34 +DA:428,34 +DA:430,0 +DA:431,0 +DA:432,0 +DA:435,34 +DA:436,31 +DA:444,31 +DA:445,1 +DA:447,31 +DA:448,0 +DA:453,31 +DA:462,31 +DA:463,31 +DA:464,21 +DA:466,4 +DA:470,4 +DA:471,4 +DA:473,1 +DA:477,1 +DA:478,1 +DA:480,4 +DA:484,3 +DA:485,3 +DA:487,5 +DA:491,4 +DA:492,4 +DA:494,2 +DA:498,2 +DA:499,2 +DA:501,1 +DA:505,1 +DA:506,1 +DA:509,2 +DA:510,2 +DA:511,2 +DA:513,2 +DA:514,2 +DA:515,2 +DA:517,0 +DA:519,19 +DA:523,10 +DA:524,10 +DA:525,2 +DA:529,10 +DA:530,8 +DA:533,8 +DA:537,3 +DA:539,32 +DA:540,1 +DA:541,1 +DA:542,1 +DA:552,32 +DA:557,3 +DA:558,1 +DA:561,2 +DA:562,1 +DA:564,1 +DA:569,31 +DA:570,31 +DA:571,31 +DA:572,31 +DA:573,31 +DA:578,31 +DA:584,31 +DA:585,1 +DA:587,31 +DA:588,31 +DA:591,0 +DA:594,1 +DA:595,38 +DA:596,0 +DA:602,38 +DA:603,38 +DA:604,38 +DA:605,38 +DA:607,38 +DA:609,38 +DA:612,38 +DA:614,2 +DA:617,2 +DA:625,36 +DA:626,36 +DA:634,36 +DA:635,10 +DA:642,36 +DA:644,36 +DA:646,36 +DA:648,36 +DA:650,4 +DA:651,3 +DA:652,3 +DA:654,1 +DA:661,3 +DA:662,3 +DA:664,29 +DA:665,1 +DA:667,28 +DA:668,28 +DA:669,28 +DA:670,28 +DA:671,4 +DA:673,28 +DA:676,28 +DA:678,28 +DA:681,4 +DA:682,4 +DA:684,1 +DA:685,1 +DA:688,4 +DA:689,4 +DA:692,5 +DA:693,5 +DA:696,2 +DA:697,2 +DA:700,1 +DA:701,1 +DA:714,2 +DA:715,2 +DA:716,2 +DA:718,1 +DA:719,1 +DA:721,8 +DA:722,8 +DA:724,28 +DA:726,0 +DA:729,34 +DA:737,1 +DA:738,38 +DA:741,1 +DA:742,1 +DA:743,0 +DA:744,0 +DA:747,1 +DA:749,2 +DA:750,2 +DA:752,0 +DA:759,2 +DA:765,0 +DA:777,1 +DA:780,1 +LF:270 +LH:253 +BRDA:35,0,0,11 +BRDA:35,0,1,1 +BRDA:36,1,0,10 +BRDA:36,1,1,1 +BRDA:54,2,0,0 +BRDA:54,2,1,15 +BRDA:55,3,0,15 +BRDA:55,3,1,15 +BRDA:55,3,2,0 +BRDA:55,3,3,0 +BRDA:64,4,0,2 +BRDA:64,4,1,13 +BRDA:66,5,0,2 +BRDA:66,5,1,0 +BRDA:66,6,0,2 +BRDA:66,6,1,2 +BRDA:66,6,2,2 +BRDA:67,7,0,2 +BRDA:67,7,1,0 +BRDA:72,8,0,8 +BRDA:72,8,1,5 +BRDA:77,9,0,2 +BRDA:77,9,1,3 +BRDA:82,10,0,2 +BRDA:82,10,1,11 +BRDA:103,11,0,6 +BRDA:103,11,1,0 +BRDA:103,12,0,6 +BRDA:103,12,1,6 +BRDA:103,12,2,6 +BRDA:106,13,0,12 +BRDA:106,13,1,12 +BRDA:106,13,2,1 +BRDA:106,13,3,1 +BRDA:112,14,0,12 +BRDA:112,14,1,0 +BRDA:112,14,2,0 +BRDA:113,15,0,12 +BRDA:113,15,1,0 +BRDA:118,16,0,1 +BRDA:118,16,1,10 +BRDA:132,17,0,5 +BRDA:132,17,1,0 +BRDA:151,18,0,2 +BRDA:151,18,1,2 +BRDA:151,19,0,4 +BRDA:151,19,1,2 +BRDA:151,19,2,2 +BRDA:153,20,0,4 +BRDA:153,20,1,0 +BRDA:154,21,0,4 +BRDA:154,21,1,0 +BRDA:154,21,2,0 +BRDA:154,21,3,0 +BRDA:155,22,0,4 +BRDA:155,22,1,0 +BRDA:159,23,0,4 +BRDA:159,23,1,4 +BRDA:159,23,2,0 +BRDA:169,24,0,2 +BRDA:169,24,1,2 +BRDA:172,25,0,2 +BRDA:172,25,1,0 +BRDA:174,26,0,2 +BRDA:174,26,1,0 +BRDA:180,27,0,0 +BRDA:180,27,1,6 +BRDA:203,28,0,5 +BRDA:203,28,1,5 +BRDA:203,28,2,1 +BRDA:203,28,3,0 +BRDA:210,29,0,5 +BRDA:210,29,1,5 +BRDA:210,29,2,4 +BRDA:211,30,0,5 +BRDA:211,30,1,0 +BRDA:212,31,0,5 +BRDA:212,31,1,0 +BRDA:213,32,0,4 +BRDA:213,32,1,1 +BRDA:219,33,0,4 +BRDA:219,33,1,4 +BRDA:219,33,2,1 +BRDA:219,33,3,0 +BRDA:223,34,0,4 +BRDA:223,34,1,0 +BRDA:228,35,0,0 +BRDA:228,35,1,4 +BRDA:327,36,0,31 +BRDA:327,36,1,0 +BRDA:328,37,0,31 +BRDA:328,37,1,0 +BRDA:329,38,0,31 +BRDA:329,38,1,0 +BRDA:352,39,0,255 +BRDA:352,39,1,251 +BRDA:353,40,0,9 +BRDA:353,40,1,246 +BRDA:353,41,0,255 +BRDA:353,41,1,13 +BRDA:357,42,0,3 +BRDA:357,42,1,252 +BRDA:363,43,0,2 +BRDA:363,43,1,1 +BRDA:365,44,0,0 +BRDA:365,44,1,2 +BRDA:365,45,0,2 +BRDA:365,45,1,0 +BRDA:372,46,0,255 +BRDA:372,46,1,251 +BRDA:373,47,0,212 +BRDA:373,47,1,43 +BRDA:373,48,0,255 +BRDA:373,48,1,223 +BRDA:373,48,2,219 +BRDA:408,49,0,34 +BRDA:408,49,1,0 +BRDA:409,50,0,3 +BRDA:409,50,1,31 +BRDA:410,51,0,3 +BRDA:410,51,1,31 +BRDA:410,52,0,34 +BRDA:410,52,1,3 +BRDA:410,52,2,3 +BRDA:412,53,0,0 +BRDA:412,53,1,3 +BRDA:412,54,0,3 +BRDA:412,54,1,0 +BRDA:414,55,0,0 +BRDA:414,55,1,3 +BRDA:414,56,0,3 +BRDA:414,56,1,0 +BRDA:428,57,0,0 +BRDA:428,57,1,34 +BRDA:431,58,0,0 +BRDA:431,58,1,0 +BRDA:435,59,0,31 +BRDA:435,59,1,3 +BRDA:444,60,0,1 +BRDA:444,60,1,30 +BRDA:444,61,0,31 +BRDA:444,61,1,1 +BRDA:447,62,0,0 +BRDA:447,62,1,31 +BRDA:447,63,0,31 +BRDA:447,63,1,0 +BRDA:462,64,0,31 +BRDA:462,64,1,0 +BRDA:463,65,0,21 +BRDA:463,65,1,10 +BRDA:464,66,0,4 +BRDA:464,66,1,1 +BRDA:464,66,2,4 +BRDA:464,66,3,5 +BRDA:464,66,4,2 +BRDA:464,66,5,1 +BRDA:464,66,6,1 +BRDA:464,66,7,2 +BRDA:464,66,8,2 +BRDA:464,66,9,0 +BRDA:519,67,0,15 +BRDA:519,67,1,4 +BRDA:520,68,0,15 +BRDA:520,68,1,6 +BRDA:524,69,0,2 +BRDA:524,69,1,8 +BRDA:524,70,0,10 +BRDA:524,70,1,8 +BRDA:525,71,0,1 +BRDA:525,71,1,1 +BRDA:529,72,0,8 +BRDA:529,72,1,2 +BRDA:530,73,0,8 +BRDA:530,73,1,0 +BRDA:539,74,0,1 +BRDA:539,74,1,31 +BRDA:541,75,0,1 +BRDA:541,75,1,0 +BRDA:541,76,0,1 +BRDA:541,76,1,1 +BRDA:552,77,0,3 +BRDA:552,77,1,29 +BRDA:553,78,0,32 +BRDA:553,78,1,29 +BRDA:553,78,2,8 +BRDA:557,79,0,1 +BRDA:557,79,1,2 +BRDA:561,80,0,1 +BRDA:561,80,1,1 +BRDA:569,81,0,31 +BRDA:569,81,1,0 +BRDA:569,82,0,31 +BRDA:569,82,1,31 +BRDA:584,83,0,1 +BRDA:584,83,1,30 +BRDA:595,84,0,0 +BRDA:595,84,1,38 +BRDA:602,85,0,38 +BRDA:602,85,1,13 +BRDA:603,86,0,38 +BRDA:603,86,1,0 +BRDA:612,87,0,2 +BRDA:612,87,1,36 +BRDA:612,88,0,38 +BRDA:612,88,1,36 +BRDA:625,89,0,36 +BRDA:625,89,1,0 +BRDA:634,90,0,10 +BRDA:634,90,1,26 +BRDA:648,91,0,4 +BRDA:648,91,1,3 +BRDA:648,91,2,3 +BRDA:648,91,3,29 +BRDA:648,91,4,0 +BRDA:650,92,0,3 +BRDA:650,92,1,1 +BRDA:664,93,0,1 +BRDA:664,93,1,28 +BRDA:668,94,0,28 +BRDA:668,94,1,0 +BRDA:670,95,0,4 +BRDA:670,95,1,24 +BRDA:676,96,0,4 +BRDA:676,96,1,24 +BRDA:678,97,0,3 +BRDA:678,97,1,4 +BRDA:678,97,2,1 +BRDA:678,97,3,4 +BRDA:678,97,4,4 +BRDA:678,97,5,5 +BRDA:678,97,6,5 +BRDA:678,97,7,2 +BRDA:678,97,8,2 +BRDA:678,97,9,1 +BRDA:678,97,10,1 +BRDA:678,97,11,0 +BRDA:678,97,12,0 +BRDA:678,97,13,0 +BRDA:678,97,14,0 +BRDA:678,97,15,0 +BRDA:678,97,16,0 +BRDA:678,97,17,0 +BRDA:678,97,18,0 +BRDA:678,97,19,2 +BRDA:678,97,20,2 +BRDA:678,97,21,2 +BRDA:678,97,22,2 +BRDA:678,97,23,1 +BRDA:678,97,24,8 +BRDA:742,98,0,0 +BRDA:742,98,1,1 +BRDA:742,99,0,1 +BRDA:742,99,1,1 +BRDA:750,100,0,0 +BRDA:750,100,1,2 +BRDA:767,101,0,0 +BRDA:767,101,1,0 +BRDA:769,102,0,0 +BRDA:769,102,1,0 +BRDA:772,103,0,0 +BRDA:772,103,1,0 +BRF:261 +BRH:195 +end_of_record +TN: +SF:v0\destinations\fb\config.js +FN:4,(anonymous_0) +FNF:1 +FNH:1 +FNDA:5,(anonymous_0) +DA:1,1 +DA:2,1 +DA:4,5 +DA:6,1 +DA:10,1 +DA:14,1 +DA:18,1 +DA:22,1 +DA:26,1 +LF:9 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\fb\transform.js +FN:46,sanityCheckPayloadForTypesAndModifications +FN:57,(anonymous_1) +FN:133,getCorrectedTypedValue +FN:150,processEventTypeGeneric +FN:164,(anonymous_4) +FN:222,responseBuilderSimple +FN:239,buildBaseEvent +FN:260,(anonymous_7) +FN:297,processSingleMessage +FN:344,process +FN:352,(anonymous_10) +FN:359,(anonymous_11) +FNF:12 +FNH:12 +FNDA:9,sanityCheckPayloadForTypesAndModifications +FNDA:81,(anonymous_1) +FNDA:28,getCorrectedTypedValue +FNDA:14,processEventTypeGeneric +FNDA:202,(anonymous_4) +FNDA:9,responseBuilderSimple +FNDA:16,buildBaseEvent +FNDA:450,(anonymous_7) +FNDA:16,processSingleMessage +FNDA:16,process +FNDA:1,(anonymous_10) +FNDA:2,(anonymous_11) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:15,1 +DA:23,1 +DA:24,1 +DA:31,1 +DA:32,1 +DA:43,1 +DA:44,1 +DA:48,9 +DA:49,9 +DA:51,9 +DA:52,9 +DA:53,9 +DA:54,9 +DA:56,9 +DA:57,9 +DA:58,81 +DA:64,36 +DA:65,15 +DA:66,15 +DA:68,36 +DA:71,18 +DA:72,3 +DA:74,3 +DA:76,3 +DA:77,3 +DA:78,3 +DA:81,18 +DA:83,9 +DA:84,3 +DA:85,3 +DA:89,9 +DA:91,9 +DA:92,0 +DA:93,0 +DA:95,9 +DA:97,9 +DA:98,0 +DA:99,0 +DA:103,9 +DA:105,0 +DA:110,9 +DA:111,9 +DA:114,9 +DA:115,0 +DA:121,9 +DA:122,9 +DA:125,9 +DA:126,9 +DA:130,9 +DA:134,28 +DA:136,28 +DA:137,25 +DA:140,3 +DA:151,14 +DA:154,14 +DA:156,14 +DA:157,14 +DA:158,14 +DA:159,2 +DA:164,12 +DA:165,202 +DA:166,202 +DA:168,0 +DA:169,0 +DA:171,0 +DA:173,0 +DA:174,0 +DA:180,202 +DA:181,22 +DA:182,22 +DA:184,22 +DA:185,5 +DA:186,5 +DA:187,5 +DA:189,5 +DA:190,5 +DA:191,5 +DA:192,11 +DA:193,11 +DA:200,9 +DA:201,9 +DA:204,17 +DA:205,17 +DA:206,17 +DA:207,17 +DA:215,180 +DA:219,9 +DA:223,9 +DA:227,9 +DA:229,9 +DA:230,9 +DA:231,9 +DA:232,9 +DA:233,9 +DA:234,9 +DA:236,9 +DA:240,16 +DA:241,16 +DA:242,16 +DA:244,16 +DA:245,16 +DA:246,16 +DA:247,13 +DA:248,3 +DA:249,2 +DA:252,1 +DA:258,15 +DA:260,15 +DA:261,450 +DA:262,450 +DA:263,450 +DA:264,151 +DA:265,151 +DA:266,73 +DA:268,73 +DA:270,30 +DA:272,0 +DA:273,0 +DA:275,30 +DA:276,30 +DA:278,30 +DA:281,43 +DA:282,43 +DA:284,73 +DA:286,78 +DA:288,30 +DA:290,48 +DA:294,15 +DA:299,16 +DA:300,15 +DA:301,15 +DA:303,15 +DA:305,9 +DA:306,9 +DA:307,1 +DA:312,8 +DA:313,3 +DA:315,6 +DA:316,6 +DA:318,5 +DA:320,1 +DA:321,1 +DA:322,0 +DA:328,6 +DA:329,6 +DA:332,0 +DA:333,0 +DA:334,0 +DA:336,0 +DA:337,0 +DA:340,9 +DA:341,9 +DA:345,16 +DA:346,9 +DA:347,0 +DA:349,9 +DA:352,1 +DA:353,1 +DA:354,0 +DA:355,0 +DA:358,1 +DA:360,2 +DA:361,2 +DA:363,0 +DA:370,2 +DA:376,2 +DA:388,1 +DA:391,1 +LF:172 +LH:149 +BRDA:52,0,0,9 +BRDA:52,0,1,0 +BRDA:54,1,0,9 +BRDA:54,1,1,0 +BRDA:58,2,0,9 +BRDA:58,2,1,18 +BRDA:58,2,2,27 +BRDA:58,2,3,36 +BRDA:58,2,4,36 +BRDA:58,2,5,9 +BRDA:58,2,6,18 +BRDA:58,2,7,9 +BRDA:58,2,8,9 +BRDA:58,2,9,9 +BRDA:58,2,10,0 +BRDA:64,3,0,15 +BRDA:64,3,1,21 +BRDA:64,4,0,36 +BRDA:64,4,1,15 +BRDA:71,5,0,3 +BRDA:71,5,1,15 +BRDA:71,6,0,18 +BRDA:71,6,1,3 +BRDA:77,7,0,3 +BRDA:77,7,1,0 +BRDA:83,8,0,3 +BRDA:83,8,1,6 +BRDA:83,9,0,9 +BRDA:83,9,1,3 +BRDA:86,10,0,0 +BRDA:86,10,1,3 +BRDA:91,11,0,0 +BRDA:91,11,1,9 +BRDA:91,12,0,9 +BRDA:91,12,1,0 +BRDA:97,13,0,0 +BRDA:97,13,1,9 +BRDA:97,14,0,9 +BRDA:97,14,1,0 +BRDA:110,15,0,9 +BRDA:110,15,1,0 +BRDA:110,16,0,9 +BRDA:110,16,1,0 +BRDA:114,17,0,0 +BRDA:114,17,1,9 +BRDA:114,18,0,9 +BRDA:114,18,1,0 +BRDA:114,18,2,0 +BRDA:121,19,0,9 +BRDA:121,19,1,0 +BRDA:125,20,0,9 +BRDA:125,20,1,0 +BRDA:136,21,0,25 +BRDA:136,21,1,3 +BRDA:142,22,0,2 +BRDA:142,22,1,1 +BRDA:157,23,0,14 +BRDA:157,23,1,0 +BRDA:158,24,0,2 +BRDA:158,24,1,12 +BRDA:158,25,0,14 +BRDA:158,25,1,8 +BRDA:166,26,0,0 +BRDA:166,26,1,202 +BRDA:169,27,0,0 +BRDA:169,27,1,0 +BRDA:173,28,0,0 +BRDA:173,28,1,0 +BRDA:180,29,0,22 +BRDA:180,29,1,180 +BRDA:184,30,0,5 +BRDA:184,30,1,17 +BRDA:194,31,0,11 +BRDA:194,31,1,0 +BRDA:210,32,0,17 +BRDA:210,32,1,0 +BRDA:232,33,0,3 +BRDA:232,33,1,6 +BRDA:244,34,0,16 +BRDA:244,34,1,1 +BRDA:246,35,0,13 +BRDA:246,35,1,3 +BRDA:248,36,0,2 +BRDA:248,36,1,1 +BRDA:263,37,0,151 +BRDA:263,37,1,299 +BRDA:265,38,0,73 +BRDA:265,38,1,78 +BRDA:265,39,0,151 +BRDA:265,39,1,103 +BRDA:268,40,0,30 +BRDA:268,40,1,43 +BRDA:270,41,0,0 +BRDA:270,41,1,30 +BRDA:273,42,0,0 +BRDA:273,42,1,0 +BRDA:276,43,0,0 +BRDA:276,43,1,30 +BRDA:285,44,0,73 +BRDA:285,44,1,0 +BRDA:286,45,0,30 +BRDA:286,45,1,48 +BRDA:288,46,0,30 +BRDA:288,46,1,0 +BRDA:290,47,0,48 +BRDA:290,47,1,0 +BRDA:303,48,0,9 +BRDA:303,48,1,6 +BRDA:303,48,2,0 +BRDA:303,48,3,0 +BRDA:305,49,0,9 +BRDA:305,49,1,9 +BRDA:306,50,0,1 +BRDA:306,50,1,8 +BRDA:316,51,0,5 +BRDA:316,51,1,1 +BRDA:316,52,0,6 +BRDA:316,52,1,6 +BRDA:321,53,0,0 +BRDA:321,53,1,1 +BRDA:346,54,0,0 +BRDA:346,54,1,9 +BRDA:353,55,0,0 +BRDA:353,55,1,1 +BRDA:353,56,0,1 +BRDA:353,56,1,1 +BRDA:361,57,0,0 +BRDA:361,57,1,2 +BRDA:378,58,0,1 +BRDA:378,58,1,1 +BRDA:380,59,0,0 +BRDA:380,59,1,1 +BRDA:383,60,0,2 +BRDA:383,60,1,0 +BRF:134 +BRH:95 +end_of_record +TN: +SF:v0\destinations\fb_custom_audience\config.js +FN:3,getEndPoint +FNF:1 +FNH:1 +FNDA:17,getEndPoint +DA:1,1 +DA:4,17 +DA:7,1 +DA:25,1 +DA:36,1 +DA:94,1 +DA:95,1 +DA:97,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\fb_custom_audience\transform.js +FN:29,(anonymous_0) +FN:41,(anonymous_1) +FN:45,(anonymous_2) +FN:67,(anonymous_3) +FN:152,(anonymous_4) +FN:162,(anonymous_5) +FN:164,(anonymous_6) +FN:212,(anonymous_7) +FN:239,(anonymous_8) +FN:298,(anonymous_9) +FN:351,(anonymous_10) +FN:373,(anonymous_11) +FN:388,(anonymous_12) +FN:401,(anonymous_13) +FN:405,(anonymous_14) +FN:410,(anonymous_15) +FN:421,(anonymous_16) +FNF:17 +FNH:15 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:17,(anonymous_2) +FNDA:37,(anonymous_3) +FNDA:18,(anonymous_4) +FNDA:18,(anonymous_5) +FNDA:172,(anonymous_6) +FNDA:18,(anonymous_7) +FNDA:18,(anonymous_8) +FNDA:10,(anonymous_9) +FNDA:8,(anonymous_10) +FNDA:10,(anonymous_11) +FNDA:17,(anonymous_12) +FNDA:10,(anonymous_13) +FNDA:1,(anonymous_14) +FNDA:2,(anonymous_15) +FNDA:4,(anonymous_16) +DA:1,1 +DA:2,1 +DA:16,1 +DA:25,1 +DA:27,1 +DA:29,1 +DA:30,0 +DA:31,0 +DA:32,0 +DA:38,0 +DA:41,0 +DA:42,0 +DA:45,1 +DA:46,17 +DA:47,17 +DA:48,17 +DA:49,17 +DA:51,17 +DA:52,9 +DA:54,17 +DA:55,8 +DA:58,17 +DA:59,17 +DA:62,0 +DA:67,1 +DA:70,37 +DA:71,37 +DA:73,4 +DA:74,4 +DA:77,3 +DA:79,3 +DA:80,3 +DA:82,3 +DA:87,3 +DA:89,4 +DA:90,4 +DA:92,4 +DA:93,4 +DA:94,4 +DA:96,0 +DA:98,4 +DA:100,4 +DA:101,4 +DA:102,0 +DA:104,4 +DA:106,4 +DA:110,3 +DA:111,0 +DA:115,3 +DA:119,3 +DA:121,3 +DA:122,3 +DA:124,3 +DA:125,3 +DA:127,3 +DA:128,3 +DA:129,3 +DA:132,3 +DA:136,3 +DA:138,0 +DA:139,0 +DA:141,0 +DA:146,37 +DA:152,1 +DA:159,18 +DA:162,18 +DA:163,18 +DA:164,18 +DA:166,172 +DA:167,172 +DA:168,1 +DA:170,172 +DA:171,171 +DA:172,59 +DA:174,37 +DA:180,22 +DA:184,112 +DA:186,171 +DA:192,54 +DA:193,54 +DA:195,117 +DA:198,1 +DA:204,17 +DA:207,17 +DA:212,1 +DA:220,18 +DA:221,18 +DA:222,18 +DA:224,0 +DA:227,18 +DA:234,17 +DA:239,1 +DA:253,18 +DA:255,18 +DA:258,18 +DA:260,0 +DA:263,18 +DA:265,18 +DA:266,18 +DA:268,18 +DA:271,18 +DA:272,18 +DA:276,18 +DA:277,8 +DA:280,18 +DA:281,18 +DA:283,18 +DA:284,18 +DA:286,18 +DA:295,17 +DA:298,1 +DA:300,10 +DA:301,10 +DA:302,10 +DA:303,10 +DA:304,10 +DA:305,10 +DA:306,0 +DA:311,10 +DA:313,10 +DA:314,0 +DA:316,10 +DA:317,0 +DA:319,10 +DA:321,10 +DA:322,0 +DA:325,10 +DA:327,10 +DA:328,0 +DA:332,10 +DA:333,1 +DA:337,10 +DA:338,0 +DA:343,10 +DA:346,10 +DA:347,8 +DA:351,8 +DA:352,8 +DA:359,8 +DA:363,8 +DA:368,10 +DA:369,10 +DA:373,10 +DA:374,10 +DA:381,9 +DA:385,9 +DA:388,9 +DA:389,17 +DA:392,9 +DA:393,0 +DA:398,9 +DA:401,1 +DA:402,10 +DA:405,1 +DA:406,1 +DA:407,0 +DA:408,0 +DA:410,1 +DA:411,2 +DA:412,2 +DA:414,0 +DA:420,2 +DA:421,2 +DA:422,4 +DA:428,2 +DA:430,0 +DA:438,1 +DA:441,1 +LF:168 +LH:142 +BRDA:31,0,0,0 +BRDA:31,0,1,0 +BRDA:38,1,0,0 +BRDA:38,1,1,0 +BRDA:46,2,0,17 +BRDA:46,2,1,0 +BRDA:51,3,0,9 +BRDA:51,3,1,8 +BRDA:54,4,0,8 +BRDA:54,4,1,9 +BRDA:71,5,0,4 +BRDA:71,5,1,3 +BRDA:71,5,2,3 +BRDA:71,5,3,4 +BRDA:71,5,4,4 +BRDA:71,5,5,4 +BRDA:71,5,6,0 +BRDA:71,5,7,0 +BRDA:71,5,8,3 +BRDA:71,5,9,3 +BRDA:71,5,10,3 +BRDA:71,5,11,3 +BRDA:71,5,12,3 +BRDA:71,5,13,3 +BRDA:71,5,14,0 +BRDA:71,5,15,0 +BRDA:83,6,0,3 +BRDA:83,6,1,0 +BRDA:83,7,0,3 +BRDA:83,7,1,0 +BRDA:93,8,0,4 +BRDA:93,8,1,0 +BRDA:101,9,0,0 +BRDA:101,9,1,4 +BRDA:110,10,0,0 +BRDA:110,10,1,3 +BRDA:167,11,0,1 +BRDA:167,11,1,171 +BRDA:167,12,0,172 +BRDA:167,12,1,11 +BRDA:170,13,0,171 +BRDA:170,13,1,1 +BRDA:171,14,0,59 +BRDA:171,14,1,112 +BRDA:172,15,0,37 +BRDA:172,15,1,22 +BRDA:186,16,0,54 +BRDA:186,16,1,117 +BRDA:187,17,0,171 +BRDA:187,17,1,59 +BRDA:187,17,2,54 +BRDA:221,18,0,18 +BRDA:221,18,1,0 +BRDA:242,19,0,0 +BRDA:258,20,0,0 +BRDA:258,20,1,18 +BRDA:271,21,0,18 +BRDA:271,21,1,0 +BRDA:276,22,0,8 +BRDA:276,22,1,10 +BRDA:276,23,0,18 +BRDA:276,23,1,18 +BRDA:276,23,2,8 +BRDA:280,24,0,18 +BRDA:280,24,1,0 +BRDA:280,25,0,18 +BRDA:280,25,1,18 +BRDA:280,25,2,18 +BRDA:283,26,0,18 +BRDA:283,26,1,0 +BRDA:305,27,0,0 +BRDA:305,27,1,10 +BRDA:313,28,0,0 +BRDA:313,28,1,10 +BRDA:316,29,0,0 +BRDA:316,29,1,10 +BRDA:321,30,0,0 +BRDA:321,30,1,10 +BRDA:327,31,0,0 +BRDA:327,31,1,10 +BRDA:332,32,0,1 +BRDA:332,32,1,9 +BRDA:337,33,0,0 +BRDA:337,33,1,10 +BRDA:346,34,0,8 +BRDA:346,34,1,2 +BRDA:368,35,0,10 +BRDA:368,35,1,0 +BRDA:392,36,0,0 +BRDA:392,36,1,9 +BRDA:406,37,0,0 +BRDA:406,37,1,1 +BRDA:406,38,0,1 +BRDA:406,38,1,1 +BRDA:412,39,0,0 +BRDA:412,39,1,2 +BRDA:434,40,0,0 +BRDA:434,40,1,0 +BRF:98 +BRH:66 +end_of_record +TN: +SF:v0\destinations\firehose\transform.js +FN:8,getDeliveryStreamMapTo +FN:19,process +FN:30,(anonymous_2) +FN:37,(anonymous_3) +FNF:4 +FNH:2 +FNDA:6,getDeliveryStreamMapTo +FNDA:6,process +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +DA:6,1 +DA:9,6 +DA:10,6 +DA:11,6 +DA:12,6 +DA:20,6 +DA:21,6 +DA:22,5 +DA:28,1 +DA:30,1 +DA:31,0 +DA:32,0 +DA:33,0 +DA:36,0 +DA:38,0 +DA:39,0 +DA:41,0 +DA:48,0 +DA:54,0 +DA:66,0 +DA:69,1 +LF:21 +LH:11 +BRDA:13,0,0,6 +BRDA:13,0,1,4 +BRDA:13,0,2,2 +BRDA:13,1,0,6 +BRDA:13,1,1,0 +BRDA:21,2,0,5 +BRDA:21,2,1,1 +BRDA:31,3,0,0 +BRDA:31,3,1,0 +BRDA:31,4,0,0 +BRDA:31,4,1,0 +BRDA:39,5,0,0 +BRDA:39,5,1,0 +BRDA:56,6,0,0 +BRDA:56,6,1,0 +BRDA:58,7,0,0 +BRDA:58,7,1,0 +BRDA:61,8,0,0 +BRDA:61,8,1,0 +BRF:19 +BRH:6 +end_of_record +TN: +SF:v0\destinations\ga\config.js +FN:179,(anonymous_0) +FNF:1 +FNH:1 +FNDA:29,(anonymous_0) +DA:1,1 +DA:3,1 +DA:54,1 +DA:173,1 +DA:175,1 +DA:177,1 +DA:178,1 +DA:179,1 +DA:180,29 +DA:182,1 +DA:184,1 +LF:11 +LH:11 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\ga\transform.js +FN:32,getParamsFromConfig +FN:38,(anonymous_1) +FN:43,(anonymous_2) +FN:55,getProductLevelCustomParams +FN:61,(anonymous_4) +FN:70,getCustomParamKeys +FN:81,(anonymous_6) +FN:90,(anonymous_7) +FN:103,getCustomParamsFromOldConfig +FN:107,(anonymous_9) +FN:119,checkmd5 +FN:127,processPageViews +FN:172,setProductLevelProperties +FN:214,responseBuilderSimple +FN:296,(anonymous_14) +FN:380,processIdentify +FN:434,processNonEComGenericEvent +FN:456,processPromotionEvent +FN:494,processPaymentRelatedEvent +FN:517,processRefundEvent +FN:543,processSharingEvent +FN:556,(anonymous_21) +FN:569,processProductListEvent +FN:605,(anonymous_23) +FN:609,(anonymous_24) +FN:615,(anonymous_25) +FN:619,(anonymous_26) +FN:657,processProductEvent +FN:722,processTransactionEvent +FN:804,processEComGenericEvent +FN:863,processSingleMessage +FN:1030,process +FN:1033,(anonymous_32) +FN:1039,(anonymous_33) +FNF:34 +FNH:32 +FNDA:162,getParamsFromConfig +FNDA:320,(anonymous_1) +FNDA:320,(anonymous_2) +FNDA:35,getProductLevelCustomParams +FNDA:140,(anonymous_4) +FNDA:31,getCustomParamKeys +FNDA:62,(anonymous_6) +FNDA:62,(anonymous_7) +FNDA:0,getCustomParamsFromOldConfig +FNDA:0,(anonymous_9) +FNDA:1,checkmd5 +FNDA:54,processPageViews +FNDA:10,setProductLevelProperties +FNDA:54,responseBuilderSimple +FNDA:208,(anonymous_14) +FNDA:8,processIdentify +FNDA:11,processNonEComGenericEvent +FNDA:2,processPromotionEvent +FNDA:2,processPaymentRelatedEvent +FNDA:5,processRefundEvent +FNDA:2,processSharingEvent +FNDA:2,(anonymous_21) +FNDA:6,processProductListEvent +FNDA:4,(anonymous_23) +FNDA:4,(anonymous_24) +FNDA:3,(anonymous_25) +FNDA:3,(anonymous_26) +FNDA:6,processProductEvent +FNDA:7,processTransactionEvent +FNDA:1,processEComGenericEvent +FNDA:57,processSingleMessage +FNDA:57,process +FNDA:1,(anonymous_32) +FNDA:2,(anonymous_33) +DA:2,1 +DA:3,1 +DA:4,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:28,1 +DA:30,1 +DA:33,162 +DA:34,162 +DA:35,162 +DA:36,162 +DA:37,162 +DA:38,160 +DA:39,320 +DA:42,162 +DA:43,162 +DA:44,320 +DA:45,320 +DA:46,320 +DA:47,320 +DA:52,162 +DA:56,35 +DA:59,35 +DA:60,35 +DA:61,35 +DA:62,140 +DA:67,35 +DA:71,31 +DA:72,31 +DA:73,31 +DA:74,31 +DA:80,31 +DA:81,31 +DA:82,62 +DA:83,62 +DA:84,62 +DA:89,31 +DA:90,31 +DA:91,62 +DA:92,62 +DA:93,62 +DA:97,31 +DA:100,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:111,0 +DA:112,0 +DA:116,0 +DA:120,1 +DA:121,1 +DA:123,0 +DA:131,54 +DA:132,54 +DA:133,54 +DA:134,50 +DA:136,50 +DA:137,4 +DA:138,4 +DA:139,4 +DA:140,4 +DA:141,4 +DA:142,4 +DA:143,1 +DA:146,4 +DA:148,0 +DA:162,54 +DA:169,54 +DA:178,10 +DA:179,10 +DA:180,20 +DA:181,20 +DA:183,20 +DA:184,10 +DA:186,10 +DA:190,20 +DA:191,20 +DA:192,20 +DA:198,20 +DA:199,20 +DA:200,20 +DA:201,20 +DA:202,20 +DA:203,20 +DA:204,20 +DA:205,20 +DA:207,10 +DA:228,54 +DA:229,54 +DA:230,54 +DA:231,54 +DA:232,54 +DA:233,54 +DA:234,54 +DA:237,54 +DA:238,0 +DA:241,54 +DA:248,54 +DA:249,53 +DA:251,54 +DA:252,48 +DA:254,54 +DA:255,49 +DA:258,54 +DA:260,54 +DA:261,54 +DA:262,54 +DA:263,54 +DA:264,54 +DA:265,53 +DA:266,53 +DA:267,53 +DA:269,54 +DA:270,3 +DA:271,3 +DA:272,3 +DA:273,3 +DA:274,3 +DA:275,3 +DA:276,3 +DA:279,54 +DA:280,54 +DA:281,54 +DA:282,0 +DA:285,54 +DA:286,54 +DA:287,0 +DA:292,54 +DA:293,54 +DA:295,54 +DA:296,54 +DA:297,208 +DA:300,54 +DA:301,50 +DA:302,50 +DA:306,54 +DA:309,54 +DA:311,54 +DA:314,54 +DA:315,54 +DA:318,54 +DA:323,54 +DA:325,54 +DA:331,54 +DA:337,54 +DA:338,54 +DA:340,54 +DA:341,52 +DA:343,54 +DA:349,54 +DA:350,1 +DA:357,53 +DA:364,54 +DA:366,54 +DA:369,54 +DA:371,54 +DA:372,54 +DA:373,54 +DA:374,54 +DA:375,54 +DA:377,54 +DA:382,8 +DA:383,1 +DA:384,1 +DA:385,1 +DA:387,0 +DA:393,8 +DA:394,8 +DA:395,8 +DA:397,8 +DA:398,7 +DA:400,1 +DA:403,8 +DA:405,8 +DA:407,8 +DA:411,6 +DA:413,2 +DA:416,8 +DA:435,11 +DA:436,11 +DA:438,11 +DA:442,11 +DA:452,11 +DA:457,2 +DA:461,2 +DA:465,2 +DA:467,1 +DA:468,1 +DA:470,1 +DA:471,1 +DA:473,0 +DA:475,2 +DA:476,2 +DA:477,2 +DA:478,2 +DA:480,1 +DA:481,1 +DA:483,1 +DA:484,1 +DA:486,0 +DA:490,2 +DA:495,2 +DA:496,2 +DA:498,2 +DA:500,1 +DA:501,1 +DA:503,1 +DA:504,1 +DA:506,2 +DA:507,2 +DA:511,0 +DA:518,5 +DA:521,5 +DA:522,5 +DA:524,5 +DA:525,5 +DA:526,3 +DA:532,3 +DA:535,2 +DA:538,5 +DA:544,2 +DA:547,2 +DA:548,2 +DA:549,2 +DA:551,1 +DA:552,1 +DA:554,1 +DA:555,1 +DA:556,1 +DA:557,2 +DA:559,1 +DA:560,1 +DA:563,0 +DA:565,2 +DA:570,6 +DA:571,6 +DA:572,6 +DA:573,6 +DA:577,6 +DA:578,6 +DA:581,3 +DA:582,3 +DA:584,3 +DA:585,3 +DA:587,0 +DA:599,6 +DA:600,6 +DA:601,6 +DA:602,6 +DA:603,6 +DA:606,4 +DA:610,4 +DA:613,6 +DA:616,3 +DA:620,3 +DA:623,6 +DA:624,5 +DA:625,5 +DA:626,9 +DA:627,9 +DA:629,9 +DA:630,2 +DA:632,7 +DA:636,9 +DA:641,9 +DA:642,9 +DA:643,9 +DA:644,9 +DA:646,9 +DA:647,9 +DA:648,9 +DA:649,9 +DA:653,6 +DA:658,6 +DA:659,6 +DA:660,6 +DA:665,6 +DA:669,6 +DA:670,6 +DA:672,1 +DA:673,1 +DA:675,2 +DA:676,2 +DA:680,1 +DA:681,1 +DA:684,2 +DA:685,2 +DA:687,0 +DA:703,6 +DA:704,6 +DA:709,6 +DA:710,6 +DA:712,6 +DA:713,6 +DA:715,0 +DA:718,6 +DA:723,7 +DA:724,7 +DA:725,7 +DA:726,7 +DA:729,7 +DA:731,1 +DA:732,1 +DA:734,1 +DA:735,1 +DA:737,1 +DA:738,1 +DA:740,4 +DA:741,4 +DA:743,0 +DA:758,7 +DA:760,7 +DA:762,5 +DA:764,4 +DA:766,2 +DA:769,1 +DA:772,2 +DA:775,7 +DA:777,7 +DA:778,6 +DA:784,6 +DA:787,1 +DA:800,6 +DA:805,1 +DA:806,1 +DA:807,1 +DA:808,1 +DA:809,1 +DA:811,1 +DA:813,1 +DA:814,1 +DA:816,0 +DA:817,0 +DA:819,0 +DA:820,0 +DA:822,0 +DA:823,0 +DA:825,0 +DA:826,0 +DA:828,0 +DA:829,0 +DA:831,0 +DA:832,0 +DA:834,0 +DA:847,1 +DA:849,1 +DA:850,1 +DA:856,1 +DA:858,1 +DA:865,57 +DA:866,57 +DA:867,0 +DA:878,57 +DA:880,57 +DA:881,57 +DA:882,57 +DA:883,57 +DA:885,9 +DA:886,8 +DA:887,8 +DA:889,1 +DA:902,8 +DA:904,4 +DA:905,4 +DA:906,4 +DA:908,1 +DA:909,1 +DA:910,1 +DA:912,42 +DA:913,42 +DA:914,0 +DA:926,42 +DA:927,41 +DA:928,41 +DA:931,41 +DA:932,41 +DA:933,41 +DA:936,41 +DA:937,41 +DA:938,41 +DA:940,41 +DA:942,41 +DA:943,41 +DA:944,41 +DA:946,6 +DA:950,6 +DA:952,2 +DA:956,2 +DA:958,6 +DA:962,6 +DA:964,7 +DA:968,6 +DA:970,2 +DA:974,2 +DA:976,5 +DA:980,5 +DA:982,1 +DA:986,1 +DA:988,2 +DA:989,2 +DA:991,10 +DA:995,10 +DA:998,1 +DA:999,1 +DA:1001,41 +DA:1002,41 +DA:1003,41 +DA:1007,1 +DA:1020,54 +DA:1031,57 +DA:1033,1 +DA:1034,1 +DA:1035,0 +DA:1036,0 +DA:1039,1 +DA:1040,2 +DA:1041,2 +DA:1043,0 +DA:1050,2 +DA:1056,0 +DA:1061,0 +DA:1069,1 +DA:1071,1 +LF:427 +LH:383 +BRDA:37,0,0,160 +BRDA:37,0,1,2 +BRDA:48,1,0,272 +BRDA:48,1,1,48 +BRDA:59,2,0,35 +BRDA:59,2,1,0 +BRDA:59,3,0,35 +BRDA:59,3,1,35 +BRDA:71,4,0,31 +BRDA:71,4,1,0 +BRDA:80,5,0,31 +BRDA:80,5,1,0 +BRDA:80,6,0,31 +BRDA:80,6,1,31 +BRDA:89,7,0,31 +BRDA:89,7,1,0 +BRDA:89,8,0,31 +BRDA:89,8,1,31 +BRDA:106,9,0,0 +BRDA:106,9,1,0 +BRDA:106,10,0,0 +BRDA:106,10,1,0 +BRDA:106,10,2,0 +BRDA:108,11,0,0 +BRDA:108,11,1,0 +BRDA:108,12,0,0 +BRDA:108,12,1,0 +BRDA:111,13,0,0 +BRDA:111,13,1,0 +BRDA:111,14,0,0 +BRDA:111,14,1,0 +BRDA:120,15,0,1 +BRDA:120,15,1,0 +BRDA:120,16,0,1 +BRDA:120,16,1,1 +BRDA:132,17,0,54 +BRDA:132,17,1,0 +BRDA:133,18,0,50 +BRDA:133,18,1,4 +BRDA:136,19,0,4 +BRDA:136,19,1,46 +BRDA:142,20,0,1 +BRDA:142,20,1,3 +BRDA:142,21,0,4 +BRDA:142,21,1,1 +BRDA:183,22,0,10 +BRDA:183,22,1,10 +BRDA:183,23,0,20 +BRDA:183,23,1,10 +BRDA:190,24,0,20 +BRDA:190,24,1,0 +BRDA:205,25,0,20 +BRDA:205,25,1,0 +BRDA:230,26,0,54 +BRDA:230,26,1,0 +BRDA:231,27,0,54 +BRDA:231,27,1,1 +BRDA:232,28,0,54 +BRDA:232,28,1,6 +BRDA:233,29,0,54 +BRDA:233,29,1,1 +BRDA:234,30,0,54 +BRDA:234,30,1,0 +BRDA:237,31,0,0 +BRDA:237,31,1,54 +BRDA:237,32,0,54 +BRDA:237,32,1,2 +BRDA:245,33,0,54 +BRDA:245,33,1,54 +BRDA:248,34,0,53 +BRDA:248,34,1,1 +BRDA:251,35,0,48 +BRDA:251,35,1,6 +BRDA:254,36,0,49 +BRDA:254,36,1,5 +BRDA:254,37,0,54 +BRDA:254,37,1,53 +BRDA:260,38,0,54 +BRDA:260,38,1,0 +BRDA:262,39,0,54 +BRDA:262,39,1,54 +BRDA:263,40,0,54 +BRDA:263,40,1,53 +BRDA:264,41,0,53 +BRDA:264,41,1,1 +BRDA:265,42,0,53 +BRDA:265,42,1,52 +BRDA:266,43,0,53 +BRDA:266,43,1,53 +BRDA:267,44,0,53 +BRDA:267,44,1,53 +BRDA:269,45,0,3 +BRDA:269,45,1,51 +BRDA:271,46,0,3 +BRDA:271,46,1,3 +BRDA:272,47,0,3 +BRDA:272,47,1,3 +BRDA:273,48,0,3 +BRDA:273,48,1,3 +BRDA:274,49,0,3 +BRDA:274,49,1,3 +BRDA:275,50,0,3 +BRDA:275,50,1,3 +BRDA:279,51,0,54 +BRDA:279,51,1,0 +BRDA:281,52,0,0 +BRDA:281,52,1,54 +BRDA:281,53,0,54 +BRDA:281,53,1,0 +BRDA:286,54,0,0 +BRDA:286,54,1,54 +BRDA:286,55,0,54 +BRDA:286,55,1,0 +BRDA:300,56,0,50 +BRDA:300,56,1,4 +BRDA:338,57,0,54 +BRDA:338,57,1,0 +BRDA:340,58,0,52 +BRDA:340,58,1,2 +BRDA:340,59,0,54 +BRDA:340,59,1,52 +BRDA:340,59,2,52 +BRDA:343,60,0,54 +BRDA:343,60,1,0 +BRDA:344,61,0,1 +BRDA:344,61,1,53 +BRDA:349,62,0,1 +BRDA:349,62,1,53 +BRDA:351,63,0,1 +BRDA:351,63,1,1 +BRDA:351,63,2,1 +BRDA:351,63,3,1 +BRDA:351,63,4,1 +BRDA:358,64,0,53 +BRDA:358,64,1,52 +BRDA:358,64,2,51 +BRDA:358,64,3,51 +BRDA:358,64,4,1 +BRDA:364,65,0,54 +BRDA:364,65,1,54 +BRDA:366,66,0,54 +BRDA:366,66,1,0 +BRDA:374,67,0,54 +BRDA:374,67,1,4 +BRDA:382,68,0,1 +BRDA:382,68,1,7 +BRDA:385,69,0,0 +BRDA:385,69,1,1 +BRDA:394,70,0,8 +BRDA:394,70,1,1 +BRDA:395,71,0,8 +BRDA:395,71,1,0 +BRDA:397,72,0,7 +BRDA:397,72,1,1 +BRDA:403,73,0,8 +BRDA:403,73,1,0 +BRDA:407,74,0,6 +BRDA:407,74,1,2 +BRDA:408,75,0,8 +BRDA:408,75,1,7 +BRDA:436,76,0,11 +BRDA:436,76,1,0 +BRDA:438,77,0,0 +BRDA:438,77,1,11 +BRDA:438,78,0,11 +BRDA:438,78,1,10 +BRDA:445,79,0,1 +BRDA:445,79,1,10 +BRDA:445,80,0,11 +BRDA:445,80,1,10 +BRDA:449,81,0,0 +BRDA:449,81,1,11 +BRDA:465,82,0,1 +BRDA:465,82,1,1 +BRDA:465,82,2,0 +BRDA:476,83,0,2 +BRDA:476,83,1,0 +BRDA:477,84,0,2 +BRDA:477,84,1,0 +BRDA:478,85,0,1 +BRDA:478,85,1,1 +BRDA:478,85,2,0 +BRDA:496,86,0,2 +BRDA:496,86,1,0 +BRDA:498,87,0,1 +BRDA:498,87,1,1 +BRDA:506,88,0,2 +BRDA:506,88,1,0 +BRDA:522,89,0,5 +BRDA:522,89,1,0 +BRDA:525,90,0,3 +BRDA:525,90,1,2 +BRDA:525,91,0,5 +BRDA:525,91,1,4 +BRDA:548,92,0,2 +BRDA:548,92,1,2 +BRDA:549,93,0,1 +BRDA:549,93,1,1 +BRDA:549,93,2,0 +BRDA:572,94,0,6 +BRDA:572,94,1,0 +BRDA:577,95,0,6 +BRDA:577,95,1,0 +BRDA:578,96,0,2 +BRDA:578,96,1,3 +BRDA:578,96,2,3 +BRDA:578,96,3,0 +BRDA:601,97,0,2 +BRDA:601,97,1,4 +BRDA:602,98,0,3 +BRDA:602,98,1,3 +BRDA:606,99,0,4 +BRDA:606,99,1,4 +BRDA:616,100,0,3 +BRDA:616,100,1,3 +BRDA:623,101,0,5 +BRDA:623,101,1,1 +BRDA:623,102,0,6 +BRDA:623,102,1,6 +BRDA:629,103,0,2 +BRDA:629,103,1,7 +BRDA:629,104,0,9 +BRDA:629,104,1,7 +BRDA:645,105,0,5 +BRDA:645,105,1,4 +BRDA:645,106,0,9 +BRDA:645,106,1,6 +BRDA:649,107,0,9 +BRDA:649,107,1,5 +BRDA:660,108,0,6 +BRDA:660,108,1,0 +BRDA:669,109,0,6 +BRDA:669,109,1,0 +BRDA:670,110,0,1 +BRDA:670,110,1,2 +BRDA:670,110,2,1 +BRDA:670,110,3,1 +BRDA:670,110,4,1 +BRDA:670,110,5,2 +BRDA:670,110,6,2 +BRDA:670,110,7,0 +BRDA:712,111,0,6 +BRDA:712,111,1,0 +BRDA:712,112,0,6 +BRDA:712,112,1,0 +BRDA:726,113,0,7 +BRDA:726,113,1,0 +BRDA:729,114,0,1 +BRDA:729,114,1,1 +BRDA:729,114,2,1 +BRDA:729,114,3,4 +BRDA:729,114,4,0 +BRDA:760,115,0,5 +BRDA:760,115,1,2 +BRDA:760,116,0,7 +BRDA:760,116,1,2 +BRDA:762,117,0,4 +BRDA:762,117,1,1 +BRDA:762,118,0,5 +BRDA:762,118,1,1 +BRDA:764,119,0,2 +BRDA:764,119,1,2 +BRDA:764,120,0,4 +BRDA:764,120,1,2 +BRDA:777,121,0,6 +BRDA:777,121,1,1 +BRDA:777,122,0,7 +BRDA:777,122,1,7 +BRDA:808,123,0,1 +BRDA:808,123,1,0 +BRDA:809,124,0,1 +BRDA:809,124,1,0 +BRDA:811,125,0,1 +BRDA:811,125,1,0 +BRDA:811,125,2,0 +BRDA:811,125,3,0 +BRDA:811,125,4,0 +BRDA:811,125,5,0 +BRDA:811,125,6,0 +BRDA:811,125,7,0 +BRDA:849,126,0,1 +BRDA:849,126,1,0 +BRDA:849,127,0,1 +BRDA:849,127,1,1 +BRDA:865,128,0,57 +BRDA:865,128,1,0 +BRDA:866,129,0,0 +BRDA:866,129,1,57 +BRDA:881,130,0,57 +BRDA:881,130,1,1 +BRDA:882,131,0,57 +BRDA:882,131,1,1 +BRDA:883,132,0,9 +BRDA:883,132,1,4 +BRDA:883,132,2,1 +BRDA:883,132,3,42 +BRDA:883,132,4,1 +BRDA:885,133,0,8 +BRDA:885,133,1,1 +BRDA:913,134,0,0 +BRDA:913,134,1,42 +BRDA:913,135,0,42 +BRDA:913,135,1,0 +BRDA:926,136,0,41 +BRDA:926,136,1,1 +BRDA:928,137,0,31 +BRDA:928,137,1,10 +BRDA:936,138,0,41 +BRDA:936,138,1,0 +BRDA:938,139,0,41 +BRDA:938,139,1,40 +BRDA:938,139,2,37 +BRDA:942,140,0,41 +BRDA:942,140,1,28 +BRDA:944,141,0,6 +BRDA:944,141,1,2 +BRDA:944,141,2,6 +BRDA:944,141,3,7 +BRDA:944,141,4,2 +BRDA:944,141,5,5 +BRDA:944,141,6,1 +BRDA:944,141,7,2 +BRDA:944,141,8,10 +BRDA:1001,142,0,40 +BRDA:1001,142,1,1 +BRDA:1002,143,0,41 +BRDA:1002,143,1,41 +BRDA:1034,144,0,0 +BRDA:1034,144,1,1 +BRDA:1034,145,0,1 +BRDA:1034,145,1,1 +BRDA:1041,146,0,0 +BRDA:1041,146,1,2 +BRDA:1063,147,0,0 +BRDA:1063,147,1,0 +BRDA:1064,148,0,0 +BRDA:1064,148,1,0 +BRF:337 +BRH:259 +end_of_record +TN: +SF:v0\destinations\ga360\config.js +FN:179,(anonymous_0) +FNF:1 +FNH:1 +FNDA:29,(anonymous_0) +DA:1,1 +DA:3,1 +DA:54,1 +DA:173,1 +DA:175,1 +DA:177,1 +DA:178,1 +DA:179,1 +DA:180,29 +DA:183,1 +LF:10 +LH:10 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\ga360\transform.js +FN:26,getParamsFromConfig +FN:32,(anonymous_1) +FN:37,(anonymous_2) +FN:49,getProductLevelCustomParams +FN:55,(anonymous_4) +FN:64,getCustomParamKeys +FN:75,(anonymous_6) +FN:84,(anonymous_7) +FN:97,getCustomParamsFromOldConfig +FN:101,(anonymous_9) +FN:114,processPageViews +FN:147,setProductLevelProperties +FN:189,responseBuilderSimple +FN:252,(anonymous_13) +FN:331,processIdentify +FN:363,processNonEComGenericEvent +FN:385,processPromotionEvent +FN:423,processPaymentRelatedEvent +FN:446,processRefundEvent +FN:472,processSharingEvent +FN:485,(anonymous_20) +FN:498,processProductListEvent +FN:523,(anonymous_22) +FN:528,(anonymous_23) +FN:572,processProductEvent +FN:627,processTransactionEvent +FN:692,processEComGenericEvent +FN:741,processSingleMessage +FN:868,process +FN:882,(anonymous_29) +FN:889,(anonymous_30) +FNF:31 +FNH:29 +FNDA:153,getParamsFromConfig +FNDA:302,(anonymous_1) +FNDA:302,(anonymous_2) +FNDA:33,getProductLevelCustomParams +FNDA:132,(anonymous_4) +FNDA:30,getCustomParamKeys +FNDA:60,(anonymous_6) +FNDA:60,(anonymous_7) +FNDA:0,getCustomParamsFromOldConfig +FNDA:0,(anonymous_9) +FNDA:51,processPageViews +FNDA:10,setProductLevelProperties +FNDA:51,responseBuilderSimple +FNDA:204,(anonymous_13) +FNDA:7,processIdentify +FNDA:11,processNonEComGenericEvent +FNDA:2,processPromotionEvent +FNDA:2,processPaymentRelatedEvent +FNDA:5,processRefundEvent +FNDA:2,processSharingEvent +FNDA:2,(anonymous_20) +FNDA:5,processProductListEvent +FNDA:4,(anonymous_22) +FNDA:2,(anonymous_23) +FNDA:6,processProductEvent +FNDA:7,processTransactionEvent +FNDA:1,processEComGenericEvent +FNDA:55,processSingleMessage +FNDA:55,process +FNDA:1,(anonymous_29) +FNDA:2,(anonymous_30) +DA:1,1 +DA:2,1 +DA:3,1 +DA:10,1 +DA:22,1 +DA:24,1 +DA:27,153 +DA:28,153 +DA:29,153 +DA:30,153 +DA:31,153 +DA:32,151 +DA:33,302 +DA:36,153 +DA:37,153 +DA:38,302 +DA:39,302 +DA:40,302 +DA:41,302 +DA:46,153 +DA:50,33 +DA:53,33 +DA:54,33 +DA:55,33 +DA:56,132 +DA:61,33 +DA:65,30 +DA:66,30 +DA:67,30 +DA:68,30 +DA:74,30 +DA:75,30 +DA:76,60 +DA:77,60 +DA:78,60 +DA:83,30 +DA:84,30 +DA:85,60 +DA:86,60 +DA:87,60 +DA:91,30 +DA:94,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:105,0 +DA:106,0 +DA:110,0 +DA:118,51 +DA:119,51 +DA:120,51 +DA:121,48 +DA:123,48 +DA:124,4 +DA:125,4 +DA:126,4 +DA:127,4 +DA:128,4 +DA:129,4 +DA:130,1 +DA:133,0 +DA:137,51 +DA:144,51 +DA:153,10 +DA:154,10 +DA:155,20 +DA:156,20 +DA:158,20 +DA:159,10 +DA:161,10 +DA:165,20 +DA:166,20 +DA:167,20 +DA:173,20 +DA:174,20 +DA:175,20 +DA:176,20 +DA:177,20 +DA:178,20 +DA:179,20 +DA:180,20 +DA:182,10 +DA:203,51 +DA:204,51 +DA:205,51 +DA:206,51 +DA:207,51 +DA:208,51 +DA:211,51 +DA:212,0 +DA:215,51 +DA:222,51 +DA:223,50 +DA:225,51 +DA:226,45 +DA:228,51 +DA:229,47 +DA:232,51 +DA:233,51 +DA:234,51 +DA:235,51 +DA:236,51 +DA:237,50 +DA:238,50 +DA:239,50 +DA:241,51 +DA:242,3 +DA:243,3 +DA:244,3 +DA:245,3 +DA:246,3 +DA:247,3 +DA:251,51 +DA:252,51 +DA:253,204 +DA:256,51 +DA:257,47 +DA:261,51 +DA:263,51 +DA:266,51 +DA:268,51 +DA:271,51 +DA:272,51 +DA:275,51 +DA:280,51 +DA:282,51 +DA:288,51 +DA:294,51 +DA:295,51 +DA:297,51 +DA:298,49 +DA:300,51 +DA:306,51 +DA:307,1 +DA:313,50 +DA:320,51 +DA:322,51 +DA:323,51 +DA:324,51 +DA:325,51 +DA:326,51 +DA:328,51 +DA:335,7 +DA:336,7 +DA:337,7 +DA:339,7 +DA:340,6 +DA:342,1 +DA:345,7 +DA:346,7 +DA:350,6 +DA:352,1 +DA:355,7 +DA:364,11 +DA:365,11 +DA:367,11 +DA:371,11 +DA:381,11 +DA:386,2 +DA:390,2 +DA:394,2 +DA:396,1 +DA:397,1 +DA:399,1 +DA:400,1 +DA:402,0 +DA:404,2 +DA:405,2 +DA:406,2 +DA:407,2 +DA:409,1 +DA:410,1 +DA:412,1 +DA:413,1 +DA:415,0 +DA:419,2 +DA:424,2 +DA:425,2 +DA:427,2 +DA:429,1 +DA:430,1 +DA:432,1 +DA:433,1 +DA:435,2 +DA:436,2 +DA:440,0 +DA:447,5 +DA:450,5 +DA:451,5 +DA:453,5 +DA:454,5 +DA:455,3 +DA:461,3 +DA:464,2 +DA:467,5 +DA:473,2 +DA:476,2 +DA:477,2 +DA:478,2 +DA:480,1 +DA:481,1 +DA:483,1 +DA:484,1 +DA:485,1 +DA:486,2 +DA:488,1 +DA:489,1 +DA:492,0 +DA:494,2 +DA:499,5 +DA:500,5 +DA:501,5 +DA:502,5 +DA:506,5 +DA:507,5 +DA:510,2 +DA:511,2 +DA:513,3 +DA:514,3 +DA:516,0 +DA:518,5 +DA:519,5 +DA:520,5 +DA:521,5 +DA:522,5 +DA:524,4 +DA:527,5 +DA:529,2 +DA:532,5 +DA:533,4 +DA:534,4 +DA:535,7 +DA:536,7 +DA:538,7 +DA:539,2 +DA:541,5 +DA:545,7 +DA:550,7 +DA:551,7 +DA:552,7 +DA:553,7 +DA:555,7 +DA:556,7 +DA:557,7 +DA:558,7 +DA:562,1 +DA:568,4 +DA:573,6 +DA:574,6 +DA:575,6 +DA:580,6 +DA:584,6 +DA:585,6 +DA:587,1 +DA:588,1 +DA:590,2 +DA:591,2 +DA:595,1 +DA:596,1 +DA:599,2 +DA:600,2 +DA:602,0 +DA:608,6 +DA:609,6 +DA:614,6 +DA:615,6 +DA:617,6 +DA:618,6 +DA:620,0 +DA:623,6 +DA:628,7 +DA:629,7 +DA:630,7 +DA:631,7 +DA:634,7 +DA:636,1 +DA:637,1 +DA:639,1 +DA:640,1 +DA:642,1 +DA:643,1 +DA:645,4 +DA:646,4 +DA:648,0 +DA:652,7 +DA:654,7 +DA:656,5 +DA:658,4 +DA:660,2 +DA:663,1 +DA:666,2 +DA:669,7 +DA:671,7 +DA:672,6 +DA:678,6 +DA:681,1 +DA:688,6 +DA:693,1 +DA:694,1 +DA:695,1 +DA:696,1 +DA:697,1 +DA:699,1 +DA:701,1 +DA:702,1 +DA:704,0 +DA:705,0 +DA:707,0 +DA:708,0 +DA:710,0 +DA:711,0 +DA:713,0 +DA:714,0 +DA:716,0 +DA:717,0 +DA:719,0 +DA:720,0 +DA:722,0 +DA:725,1 +DA:727,1 +DA:728,1 +DA:734,1 +DA:736,1 +DA:743,55 +DA:744,55 +DA:745,0 +DA:747,55 +DA:749,55 +DA:750,55 +DA:751,55 +DA:752,55 +DA:754,8 +DA:755,7 +DA:756,7 +DA:758,1 +DA:760,7 +DA:762,4 +DA:763,4 +DA:764,4 +DA:766,1 +DA:767,1 +DA:768,1 +DA:770,41 +DA:771,41 +DA:772,0 +DA:774,41 +DA:775,40 +DA:776,40 +DA:779,40 +DA:780,40 +DA:781,40 +DA:784,40 +DA:785,40 +DA:786,40 +DA:788,40 +DA:790,40 +DA:791,40 +DA:792,40 +DA:794,5 +DA:798,4 +DA:800,2 +DA:804,2 +DA:806,6 +DA:810,6 +DA:812,7 +DA:816,6 +DA:818,2 +DA:822,2 +DA:824,5 +DA:828,5 +DA:830,1 +DA:834,1 +DA:836,2 +DA:837,2 +DA:839,10 +DA:843,10 +DA:846,1 +DA:847,1 +DA:849,39 +DA:850,39 +DA:851,39 +DA:855,1 +DA:858,51 +DA:870,55 +DA:871,55 +DA:873,4 +DA:879,51 +DA:882,1 +DA:883,1 +DA:884,0 +DA:885,0 +DA:888,1 +DA:890,2 +DA:891,2 +DA:893,0 +DA:900,2 +DA:906,0 +DA:918,1 +DA:921,1 +LF:402 +LH:363 +BRDA:31,0,0,151 +BRDA:31,0,1,2 +BRDA:42,1,0,260 +BRDA:42,1,1,42 +BRDA:53,2,0,33 +BRDA:53,2,1,0 +BRDA:53,3,0,33 +BRDA:53,3,1,33 +BRDA:65,4,0,30 +BRDA:65,4,1,0 +BRDA:74,5,0,30 +BRDA:74,5,1,0 +BRDA:74,6,0,30 +BRDA:74,6,1,30 +BRDA:83,7,0,30 +BRDA:83,7,1,0 +BRDA:83,8,0,30 +BRDA:83,8,1,30 +BRDA:100,9,0,0 +BRDA:100,9,1,0 +BRDA:100,10,0,0 +BRDA:100,10,1,0 +BRDA:100,10,2,0 +BRDA:102,11,0,0 +BRDA:102,11,1,0 +BRDA:102,12,0,0 +BRDA:102,12,1,0 +BRDA:105,13,0,0 +BRDA:105,13,1,0 +BRDA:105,14,0,0 +BRDA:105,14,1,0 +BRDA:119,15,0,51 +BRDA:119,15,1,0 +BRDA:120,16,0,48 +BRDA:120,16,1,3 +BRDA:123,17,0,4 +BRDA:123,17,1,44 +BRDA:129,18,0,1 +BRDA:129,18,1,3 +BRDA:129,19,0,4 +BRDA:129,19,1,1 +BRDA:158,20,0,10 +BRDA:158,20,1,10 +BRDA:158,21,0,20 +BRDA:158,21,1,10 +BRDA:165,22,0,20 +BRDA:165,22,1,0 +BRDA:180,23,0,20 +BRDA:180,23,1,0 +BRDA:205,24,0,51 +BRDA:205,24,1,1 +BRDA:206,25,0,51 +BRDA:206,25,1,6 +BRDA:207,26,0,51 +BRDA:207,26,1,1 +BRDA:208,27,0,51 +BRDA:208,27,1,0 +BRDA:211,28,0,0 +BRDA:211,28,1,51 +BRDA:211,29,0,51 +BRDA:211,29,1,2 +BRDA:222,30,0,50 +BRDA:222,30,1,1 +BRDA:225,31,0,45 +BRDA:225,31,1,6 +BRDA:228,32,0,47 +BRDA:228,32,1,4 +BRDA:228,33,0,51 +BRDA:228,33,1,50 +BRDA:232,34,0,51 +BRDA:232,34,1,0 +BRDA:236,35,0,50 +BRDA:236,35,1,1 +BRDA:241,36,0,3 +BRDA:241,36,1,48 +BRDA:256,37,0,47 +BRDA:256,37,1,4 +BRDA:295,38,0,51 +BRDA:295,38,1,0 +BRDA:297,39,0,49 +BRDA:297,39,1,2 +BRDA:297,40,0,51 +BRDA:297,40,1,49 +BRDA:297,40,2,49 +BRDA:300,41,0,51 +BRDA:300,41,1,0 +BRDA:301,42,0,1 +BRDA:301,42,1,50 +BRDA:306,43,0,1 +BRDA:306,43,1,50 +BRDA:308,44,0,1 +BRDA:308,44,1,1 +BRDA:308,44,2,1 +BRDA:308,44,3,1 +BRDA:314,45,0,50 +BRDA:314,45,1,49 +BRDA:314,45,2,48 +BRDA:314,45,3,1 +BRDA:325,46,0,51 +BRDA:325,46,1,4 +BRDA:336,47,0,7 +BRDA:336,47,1,1 +BRDA:337,48,0,7 +BRDA:337,48,1,0 +BRDA:339,49,0,6 +BRDA:339,49,1,1 +BRDA:345,50,0,7 +BRDA:345,50,1,0 +BRDA:346,51,0,6 +BRDA:346,51,1,1 +BRDA:347,52,0,7 +BRDA:347,52,1,6 +BRDA:365,53,0,11 +BRDA:365,53,1,0 +BRDA:367,54,0,0 +BRDA:367,54,1,11 +BRDA:367,55,0,11 +BRDA:367,55,1,10 +BRDA:374,56,0,1 +BRDA:374,56,1,10 +BRDA:374,57,0,11 +BRDA:374,57,1,10 +BRDA:378,58,0,0 +BRDA:378,58,1,11 +BRDA:394,59,0,1 +BRDA:394,59,1,1 +BRDA:394,59,2,0 +BRDA:405,60,0,2 +BRDA:405,60,1,0 +BRDA:406,61,0,2 +BRDA:406,61,1,0 +BRDA:407,62,0,1 +BRDA:407,62,1,1 +BRDA:407,62,2,0 +BRDA:425,63,0,2 +BRDA:425,63,1,0 +BRDA:427,64,0,1 +BRDA:427,64,1,1 +BRDA:435,65,0,2 +BRDA:435,65,1,0 +BRDA:451,66,0,5 +BRDA:451,66,1,0 +BRDA:454,67,0,3 +BRDA:454,67,1,2 +BRDA:454,68,0,5 +BRDA:454,68,1,4 +BRDA:477,69,0,2 +BRDA:477,69,1,2 +BRDA:478,70,0,1 +BRDA:478,70,1,1 +BRDA:478,70,2,0 +BRDA:501,71,0,5 +BRDA:501,71,1,0 +BRDA:506,72,0,5 +BRDA:506,72,1,0 +BRDA:507,73,0,1 +BRDA:507,73,1,2 +BRDA:507,73,2,3 +BRDA:507,73,3,0 +BRDA:520,74,0,5 +BRDA:520,74,1,3 +BRDA:521,75,0,5 +BRDA:521,75,1,3 +BRDA:532,76,0,4 +BRDA:532,76,1,1 +BRDA:532,77,0,5 +BRDA:532,77,1,5 +BRDA:538,78,0,2 +BRDA:538,78,1,5 +BRDA:538,79,0,7 +BRDA:538,79,1,5 +BRDA:554,80,0,3 +BRDA:554,80,1,4 +BRDA:554,81,0,7 +BRDA:554,81,1,4 +BRDA:558,82,0,7 +BRDA:558,82,1,3 +BRDA:575,83,0,6 +BRDA:575,83,1,0 +BRDA:584,84,0,6 +BRDA:584,84,1,0 +BRDA:585,85,0,1 +BRDA:585,85,1,2 +BRDA:585,85,2,1 +BRDA:585,85,3,1 +BRDA:585,85,4,1 +BRDA:585,85,5,2 +BRDA:585,85,6,2 +BRDA:585,85,7,0 +BRDA:617,86,0,6 +BRDA:617,86,1,0 +BRDA:617,87,0,6 +BRDA:617,87,1,0 +BRDA:631,88,0,7 +BRDA:631,88,1,0 +BRDA:634,89,0,1 +BRDA:634,89,1,1 +BRDA:634,89,2,1 +BRDA:634,89,3,4 +BRDA:634,89,4,0 +BRDA:654,90,0,5 +BRDA:654,90,1,2 +BRDA:654,91,0,7 +BRDA:654,91,1,2 +BRDA:656,92,0,4 +BRDA:656,92,1,1 +BRDA:656,93,0,5 +BRDA:656,93,1,1 +BRDA:658,94,0,2 +BRDA:658,94,1,2 +BRDA:658,95,0,4 +BRDA:658,95,1,2 +BRDA:671,96,0,6 +BRDA:671,96,1,1 +BRDA:671,97,0,7 +BRDA:671,97,1,7 +BRDA:696,98,0,1 +BRDA:696,98,1,0 +BRDA:697,99,0,1 +BRDA:697,99,1,0 +BRDA:699,100,0,1 +BRDA:699,100,1,0 +BRDA:699,100,2,0 +BRDA:699,100,3,0 +BRDA:699,100,4,0 +BRDA:699,100,5,0 +BRDA:699,100,6,0 +BRDA:699,100,7,0 +BRDA:727,101,0,1 +BRDA:727,101,1,0 +BRDA:727,102,0,1 +BRDA:727,102,1,1 +BRDA:743,103,0,55 +BRDA:743,103,1,0 +BRDA:744,104,0,0 +BRDA:744,104,1,55 +BRDA:750,105,0,55 +BRDA:750,105,1,1 +BRDA:751,106,0,55 +BRDA:751,106,1,1 +BRDA:752,107,0,8 +BRDA:752,107,1,4 +BRDA:752,107,2,1 +BRDA:752,107,3,41 +BRDA:752,107,4,1 +BRDA:754,108,0,7 +BRDA:754,108,1,1 +BRDA:771,109,0,0 +BRDA:771,109,1,41 +BRDA:771,110,0,41 +BRDA:771,110,1,0 +BRDA:774,111,0,40 +BRDA:774,111,1,1 +BRDA:776,112,0,30 +BRDA:776,112,1,10 +BRDA:784,113,0,40 +BRDA:784,113,1,0 +BRDA:786,114,0,40 +BRDA:786,114,1,39 +BRDA:786,114,2,36 +BRDA:790,115,0,40 +BRDA:790,115,1,28 +BRDA:792,116,0,5 +BRDA:792,116,1,2 +BRDA:792,116,2,6 +BRDA:792,116,3,7 +BRDA:792,116,4,2 +BRDA:792,116,5,5 +BRDA:792,116,6,1 +BRDA:792,116,7,2 +BRDA:792,116,8,10 +BRDA:849,117,0,38 +BRDA:849,117,1,1 +BRDA:850,118,0,39 +BRDA:850,118,1,39 +BRDA:874,119,0,4 +BRDA:874,119,1,0 +BRDA:875,120,0,4 +BRDA:875,120,1,4 +BRDA:883,121,0,0 +BRDA:883,121,1,1 +BRDA:883,122,0,1 +BRDA:883,122,1,1 +BRDA:891,123,0,0 +BRDA:891,123,1,2 +BRDA:908,124,0,0 +BRDA:908,124,1,0 +BRDA:910,125,0,0 +BRDA:910,125,1,0 +BRDA:913,126,0,0 +BRDA:913,126,1,0 +BRF:291 +BRH:219 +end_of_record +TN: +SF:v0\destinations\ga4\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:58,1 +DA:108,1 +DA:110,1 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\ga4\transform.js +FN:34,trackResponseBuilder +FN:405,process +FNF:2 +FNH:2 +FNDA:67,trackResponseBuilder +FNDA:72,process +DA:1,1 +DA:2,1 +DA:14,1 +DA:21,1 +DA:32,1 +DA:35,67 +DA:36,67 +DA:37,1 +DA:41,66 +DA:44,66 +DA:45,2 +DA:52,64 +DA:53,64 +DA:54,63 +DA:57,62 +DA:60,59 +DA:62,59 +DA:63,1 +DA:68,58 +DA:70,3 +DA:74,3 +DA:75,1 +DA:80,2 +DA:82,0 +DA:85,60 +DA:86,60 +DA:89,50 +DA:92,1 +DA:93,1 +DA:97,1 +DA:99,1 +DA:100,1 +DA:104,1 +DA:105,1 +DA:108,1 +DA:109,1 +DA:113,1 +DA:114,1 +DA:116,4 +DA:117,4 +DA:121,4 +DA:122,4 +DA:125,1 +DA:126,1 +DA:130,1 +DA:131,1 +DA:133,1 +DA:134,1 +DA:138,1 +DA:139,1 +DA:141,5 +DA:142,5 +DA:146,5 +DA:147,2 +DA:149,1 +DA:150,1 +DA:154,1 +DA:155,1 +DA:157,2 +DA:158,2 +DA:162,2 +DA:163,2 +DA:165,1 +DA:166,1 +DA:170,1 +DA:171,1 +DA:173,2 +DA:177,2 +DA:178,1 +DA:180,1 +DA:182,2 +DA:183,2 +DA:185,1 +DA:186,1 +DA:190,1 +DA:191,1 +DA:193,2 +DA:194,2 +DA:198,2 +DA:199,2 +DA:202,1 +DA:203,1 +DA:207,1 +DA:208,1 +DA:211,2 +DA:212,2 +DA:216,2 +DA:218,2 +DA:219,2 +DA:223,2 +DA:226,2 +DA:227,2 +DA:231,2 +DA:234,2 +DA:235,2 +DA:239,2 +DA:241,1 +DA:242,1 +DA:246,1 +DA:248,2 +DA:249,2 +DA:253,2 +DA:255,2 +DA:256,2 +DA:260,2 +DA:262,2 +DA:263,2 +DA:267,2 +DA:269,2 +DA:270,2 +DA:274,2 +DA:276,2 +DA:277,2 +DA:281,2 +DA:283,2 +DA:284,2 +DA:288,2 +DA:290,1 +DA:291,1 +DA:293,1 +DA:294,1 +DA:296,1 +DA:297,1 +DA:301,1 +DA:303,2 +DA:304,2 +DA:308,2 +DA:309,2 +DA:311,0 +DA:316,10 +DA:317,1 +DA:323,9 +DA:324,1 +DA:330,8 +DA:333,8 +DA:334,8 +DA:340,8 +DA:341,5 +DA:342,5 +DA:349,55 +DA:351,55 +DA:352,50 +DA:355,55 +DA:356,13 +DA:360,55 +DA:361,55 +DA:367,55 +DA:368,2 +DA:369,2 +DA:372,55 +DA:374,55 +DA:375,55 +DA:378,55 +DA:379,55 +DA:380,55 +DA:381,55 +DA:385,55 +DA:390,55 +DA:392,54 +DA:393,54 +DA:395,1 +DA:396,1 +DA:398,0 +DA:401,55 +DA:402,55 +DA:406,72 +DA:407,72 +DA:409,72 +DA:410,0 +DA:412,72 +DA:413,1 +DA:415,71 +DA:416,1 +DA:418,70 +DA:419,1 +DA:422,69 +DA:423,1 +DA:429,68 +DA:431,68 +DA:433,65 +DA:434,53 +DA:437,2 +DA:438,2 +DA:439,2 +DA:441,1 +DA:443,55 +DA:446,1 +LF:187 +LH:183 +BRDA:36,0,0,1 +BRDA:36,0,1,66 +BRDA:44,1,0,2 +BRDA:44,1,1,64 +BRDA:53,2,0,63 +BRDA:53,2,1,1 +BRDA:57,3,0,59 +BRDA:57,3,1,3 +BRDA:57,3,2,0 +BRDA:61,4,0,59 +BRDA:61,4,1,5 +BRDA:62,5,0,1 +BRDA:62,5,1,58 +BRDA:74,6,0,1 +BRDA:74,6,1,2 +BRDA:86,7,0,50 +BRDA:86,7,1,10 +BRDA:89,8,0,1 +BRDA:89,8,1,1 +BRDA:89,8,2,1 +BRDA:89,8,3,4 +BRDA:89,8,4,1 +BRDA:89,8,5,1 +BRDA:89,8,6,5 +BRDA:89,8,7,1 +BRDA:89,8,8,2 +BRDA:89,8,9,1 +BRDA:89,8,10,2 +BRDA:89,8,11,1 +BRDA:89,8,12,2 +BRDA:89,8,13,1 +BRDA:89,8,14,2 +BRDA:89,8,15,2 +BRDA:89,8,16,2 +BRDA:89,8,17,2 +BRDA:89,8,18,1 +BRDA:89,8,19,2 +BRDA:89,8,20,2 +BRDA:89,8,21,2 +BRDA:89,8,22,2 +BRDA:89,8,23,2 +BRDA:89,8,24,2 +BRDA:89,8,25,1 +BRDA:89,8,26,1 +BRDA:89,8,27,1 +BRDA:89,8,28,2 +BRDA:89,8,29,0 +BRDA:177,9,0,1 +BRDA:177,9,1,1 +BRDA:316,10,0,1 +BRDA:316,10,1,9 +BRDA:323,11,0,1 +BRDA:323,11,1,8 +BRDA:340,12,0,5 +BRDA:340,12,1,3 +BRDA:351,13,0,50 +BRDA:351,13,1,5 +BRDA:355,14,0,13 +BRDA:355,14,1,42 +BRDA:367,15,0,2 +BRDA:367,15,1,53 +BRDA:390,16,0,54 +BRDA:390,16,1,1 +BRDA:390,16,2,0 +BRDA:409,17,0,0 +BRDA:409,17,1,72 +BRDA:412,18,0,1 +BRDA:412,18,1,71 +BRDA:415,19,0,1 +BRDA:415,19,1,70 +BRDA:415,20,0,71 +BRDA:415,20,1,67 +BRDA:418,21,0,1 +BRDA:418,21,1,69 +BRDA:418,22,0,70 +BRDA:418,22,1,4 +BRDA:422,23,0,1 +BRDA:422,23,1,68 +BRDA:431,24,0,65 +BRDA:431,24,1,2 +BRDA:431,24,2,1 +BRF:81 +BRH:77 +end_of_record +TN: +SF:v0\destinations\ga4\utils.js +FN:26,msUnixTimestamp +FN:58,isReservedEventName +FN:103,removeReservedParameterPrefixNames +FN:110,(anonymous_3) +FN:111,(anonymous_4) +FN:144,removeReservedUserPropertyPrefixNames +FN:151,(anonymous_6) +FN:152,(anonymous_7) +FN:174,isReservedWebCustomEventName +FN:197,isReservedWebCustomPrefixName +FN:201,(anonymous_10) +FN:244,getDestinationItemProperties +FN:255,(anonymous_12) +FN:287,(anonymous_13) +FN:319,(anonymous_14) +FNF:15 +FNH:13 +FNDA:63,msUnixTimestamp +FNDA:66,isReservedEventName +FNDA:55,removeReservedParameterPrefixNames +FNDA:135,(anonymous_3) +FNDA:399,(anonymous_4) +FNDA:55,removeReservedUserPropertyPrefixNames +FNDA:3,(anonymous_6) +FNDA:9,(anonymous_7) +FNDA:10,isReservedWebCustomEventName +FNDA:9,isReservedWebCustomPrefixName +FNDA:42,(anonymous_10) +FNDA:25,getDestinationItemProperties +FNDA:21,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +DA:1,1 +DA:2,1 +DA:3,1 +DA:7,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:27,63 +DA:28,63 +DA:30,63 +DA:33,63 +DA:34,1 +DA:40,62 +DA:41,1 +DA:42,1 +DA:49,61 +DA:59,66 +DA:84,66 +DA:93,1 +DA:104,55 +DA:106,55 +DA:107,5 +DA:110,50 +DA:111,135 +DA:112,399 +DA:113,4 +DA:115,395 +DA:119,135 +DA:121,4 +DA:131,1 +DA:145,55 +DA:147,55 +DA:148,53 +DA:151,2 +DA:152,3 +DA:153,9 +DA:154,1 +DA:156,8 +DA:160,3 +DA:162,1 +DA:175,10 +DA:188,10 +DA:198,9 +DA:201,9 +DA:202,42 +DA:203,1 +DA:205,41 +DA:209,1 +DA:246,25 +DA:247,25 +DA:248,1 +DA:253,24 +DA:254,21 +DA:255,21 +DA:256,21 +DA:260,21 +DA:264,1 +DA:267,20 +DA:268,20 +DA:274,20 +DA:275,20 +DA:276,20 +DA:279,20 +DA:281,3 +DA:282,1 +DA:284,22 +DA:287,1 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:295,0 +DA:296,0 +DA:312,0 +DA:319,1 +DA:320,0 +DA:321,0 +DA:322,0 +DA:325,1 +LF:80 +LH:70 +BRDA:33,0,0,1 +BRDA:33,0,1,62 +BRDA:40,1,0,1 +BRDA:40,1,1,61 +BRDA:41,2,0,1 +BRDA:41,2,1,0 +BRDA:106,3,0,5 +BRDA:106,3,1,50 +BRDA:112,4,0,4 +BRDA:112,4,1,395 +BRDA:119,5,0,4 +BRDA:119,5,1,131 +BRDA:147,6,0,53 +BRDA:147,6,1,2 +BRDA:153,7,0,1 +BRDA:153,7,1,8 +BRDA:160,8,0,1 +BRDA:160,8,1,2 +BRDA:202,9,0,1 +BRDA:202,9,1,41 +BRDA:247,10,0,1 +BRDA:247,10,1,24 +BRDA:247,11,0,25 +BRDA:247,11,1,2 +BRDA:247,11,2,25 +BRDA:247,11,3,23 +BRDA:253,12,0,21 +BRDA:253,12,1,3 +BRDA:253,13,0,24 +BRDA:253,13,1,22 +BRDA:260,14,0,1 +BRDA:260,14,1,20 +BRDA:261,15,0,21 +BRDA:261,15,1,1 +BRDA:274,16,0,20 +BRDA:274,16,1,0 +BRDA:281,17,0,1 +BRDA:281,17,1,2 +BRDA:281,18,0,3 +BRDA:281,18,1,1 +BRDA:290,19,0,0 +BRDA:290,19,1,0 +BRDA:295,20,0,0 +BRDA:295,20,1,0 +BRF:44 +BRH:38 +end_of_record +TN: +SF:v0\destinations\gainsight\config.js +FN:3,(anonymous_0) +FN:4,(anonymous_1) +FN:7,(anonymous_2) +FN:9,(anonymous_3) +FN:11,(anonymous_4) +FN:14,(anonymous_5) +FN:16,(anonymous_6) +FN:24,(anonymous_7) +FNF:8 +FNH:8 +FNDA:10,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:7,(anonymous_2) +FNDA:3,(anonymous_3) +FNDA:2,(anonymous_4) +FNDA:1,(anonymous_5) +FNDA:1,(anonymous_6) +FNDA:2,(anonymous_7) +DA:1,1 +DA:3,10 +DA:4,4 +DA:6,1 +DA:7,7 +DA:9,3 +DA:12,2 +DA:14,1 +DA:16,1 +DA:19,1 +DA:24,1 +DA:25,2 +DA:41,1 +DA:43,1 +DA:72,1 +DA:107,1 +LF:16 +LH:16 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\gainsight\transform.js +FN:38,(anonymous_0) +FN:88,(anonymous_1) +FN:146,(anonymous_2) +FN:217,(anonymous_3) +FN:244,(anonymous_4) +FN:251,(anonymous_5) +FNF:6 +FNH:6 +FNDA:6,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:3,(anonymous_2) +FNDA:11,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:2,(anonymous_5) +DA:2,1 +DA:3,1 +DA:4,1 +DA:11,1 +DA:24,1 +DA:32,1 +DA:38,1 +DA:39,6 +DA:44,6 +DA:45,1 +DA:48,5 +DA:49,5 +DA:51,5 +DA:58,5 +DA:59,5 +DA:61,5 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:69,1 +DA:72,5 +DA:73,5 +DA:74,5 +DA:75,5 +DA:79,5 +DA:80,5 +DA:88,1 +DA:89,2 +DA:90,2 +DA:91,2 +DA:92,0 +DA:95,2 +DA:96,2 +DA:97,0 +DA:100,2 +DA:102,2 +DA:103,2 +DA:105,2 +DA:112,2 +DA:113,2 +DA:114,2 +DA:117,2 +DA:118,1 +DA:120,1 +DA:123,2 +DA:129,2 +DA:130,2 +DA:131,2 +DA:132,2 +DA:136,2 +DA:137,2 +DA:146,1 +DA:149,3 +DA:150,3 +DA:151,0 +DA:154,3 +DA:160,3 +DA:166,3 +DA:167,0 +DA:169,3 +DA:175,3 +DA:176,0 +DA:182,3 +DA:186,3 +DA:187,2 +DA:190,3 +DA:191,3 +DA:193,3 +DA:194,3 +DA:195,3 +DA:196,3 +DA:197,3 +DA:204,3 +DA:205,2 +DA:208,3 +DA:209,3 +DA:211,3 +DA:217,1 +DA:218,11 +DA:219,11 +DA:220,0 +DA:225,11 +DA:228,11 +DA:230,6 +DA:231,5 +DA:233,2 +DA:234,2 +DA:236,3 +DA:237,3 +DA:239,0 +DA:241,10 +DA:244,1 +DA:245,1 +DA:246,0 +DA:247,0 +DA:250,1 +DA:252,2 +DA:253,2 +DA:259,0 +DA:271,1 +DA:274,1 +LF:102 +LH:92 +BRDA:44,0,0,1 +BRDA:44,0,1,5 +BRDA:61,1,0,1 +BRDA:61,1,1,4 +BRDA:65,2,0,0 +BRDA:65,2,1,1 +BRDA:66,3,0,0 +BRDA:66,3,1,0 +BRDA:66,4,0,0 +BRDA:66,4,1,0 +BRDA:67,5,0,1 +BRDA:67,5,1,0 +BRDA:67,6,0,1 +BRDA:67,6,1,0 +BRDA:91,7,0,0 +BRDA:91,7,1,2 +BRDA:96,8,0,0 +BRDA:96,8,1,2 +BRDA:117,9,0,1 +BRDA:117,9,1,1 +BRDA:150,10,0,0 +BRDA:150,10,1,3 +BRDA:166,11,0,0 +BRDA:166,11,1,3 +BRDA:166,12,0,3 +BRDA:166,12,1,3 +BRDA:175,13,0,0 +BRDA:175,13,1,3 +BRDA:175,14,0,3 +BRDA:175,14,1,3 +BRDA:186,15,0,2 +BRDA:186,15,1,1 +BRDA:204,16,0,2 +BRDA:204,16,1,1 +BRDA:208,17,0,3 +BRDA:208,17,1,0 +BRDA:219,18,0,0 +BRDA:219,18,1,11 +BRDA:228,19,0,6 +BRDA:228,19,1,2 +BRDA:228,19,2,3 +BRDA:228,19,3,0 +BRDA:245,20,0,0 +BRDA:245,20,1,1 +BRDA:245,21,0,1 +BRDA:245,21,1,1 +BRDA:261,22,0,0 +BRDA:261,22,1,0 +BRDA:263,23,0,0 +BRDA:263,23,1,0 +BRDA:266,24,0,0 +BRDA:266,24,1,0 +BRF:52 +BRH:30 +end_of_record +TN: +SF:v0\destinations\gainsight\util.js +FN:6,(anonymous_0) +FN:12,(anonymous_1) +FN:41,(anonymous_2) +FN:72,(anonymous_3) +FN:114,(anonymous_4) +FN:118,(anonymous_5) +FN:127,(anonymous_6) +FN:139,(anonymous_7) +FN:141,(anonymous_8) +FNF:9 +FNH:9 +FNDA:1,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:7,(anonymous_4) +FNDA:28,(anonymous_5) +FNDA:16,(anonymous_6) +FNDA:11,(anonymous_7) +FNDA:17,(anonymous_8) +DA:1,1 +DA:2,1 +DA:3,1 +DA:7,1 +DA:8,1 +DA:12,1 +DA:14,2 +DA:15,2 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:32,0 +DA:35,2 +DA:36,0 +DA:38,2 +DA:41,1 +DA:43,1 +DA:44,1 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:63,0 +DA:66,1 +DA:67,0 +DA:69,1 +DA:72,1 +DA:74,1 +DA:75,1 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:97,0 +DA:100,1 +DA:101,0 +DA:103,1 +DA:114,1 +DA:115,7 +DA:117,7 +DA:118,5 +DA:119,28 +DA:120,28 +DA:123,5 +DA:126,2 +DA:127,2 +DA:128,16 +DA:129,13 +DA:130,3 +DA:131,2 +DA:133,1 +DA:136,2 +DA:139,1 +DA:140,11 +DA:141,11 +DA:142,17 +DA:143,0 +DA:145,17 +DA:147,11 +DA:150,1 +LF:64 +LH:42 +BRDA:28,0,0,0 +BRDA:28,0,1,0 +BRDA:28,1,0,0 +BRDA:28,1,1,0 +BRDA:35,2,0,0 +BRDA:35,2,1,2 +BRDA:35,3,0,2 +BRDA:35,3,1,2 +BRDA:35,3,2,2 +BRDA:59,4,0,0 +BRDA:59,4,1,0 +BRDA:59,5,0,0 +BRDA:59,5,1,0 +BRDA:66,6,0,0 +BRDA:66,6,1,1 +BRDA:66,7,0,1 +BRDA:66,7,1,1 +BRDA:66,7,2,1 +BRDA:93,8,0,0 +BRDA:93,8,1,0 +BRDA:93,9,0,0 +BRDA:93,9,1,0 +BRDA:100,10,0,0 +BRDA:100,10,1,1 +BRDA:100,11,0,1 +BRDA:100,11,1,1 +BRDA:100,11,2,1 +BRDA:117,12,0,5 +BRDA:117,12,1,2 +BRDA:117,13,0,7 +BRDA:117,13,1,7 +BRDA:119,14,0,28 +BRDA:119,14,1,0 +BRDA:128,15,0,13 +BRDA:128,15,1,3 +BRDA:130,16,0,2 +BRDA:130,16,1,1 +BRDA:142,17,0,0 +BRDA:142,17,1,17 +BRF:39 +BRH:22 +end_of_record +TN: +SF:v0\destinations\gainsight_px\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:4,1 +DA:10,1 +DA:16,1 +DA:18,1 +DA:50,1 +DA:81,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\gainsight_px\transform.js +FN:37,(anonymous_0) +FN:105,(anonymous_1) +FN:197,(anonymous_2) +FN:238,(anonymous_3) +FN:275,(anonymous_4) +FN:282,(anonymous_5) +FNF:6 +FNH:6 +FNDA:4,(anonymous_0) +FNDA:3,(anonymous_1) +FNDA:6,(anonymous_2) +FNDA:13,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:2,(anonymous_5) +DA:2,1 +DA:17,1 +DA:24,1 +DA:32,1 +DA:37,1 +DA:38,4 +DA:39,4 +DA:40,1 +DA:46,3 +DA:47,3 +DA:52,3 +DA:54,3 +DA:55,3 +DA:59,3 +DA:60,1 +DA:61,1 +DA:62,1 +DA:64,3 +DA:65,3 +DA:72,3 +DA:78,3 +DA:79,3 +DA:86,3 +DA:88,2 +DA:89,2 +DA:90,2 +DA:91,2 +DA:95,1 +DA:96,1 +DA:97,1 +DA:98,1 +DA:99,1 +DA:105,1 +DA:106,3 +DA:107,3 +DA:108,0 +DA:111,3 +DA:116,3 +DA:117,1 +DA:120,2 +DA:121,2 +DA:122,1 +DA:125,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:140,1 +DA:146,1 +DA:147,1 +DA:154,1 +DA:156,1 +DA:158,1 +DA:163,1 +DA:164,0 +DA:168,0 +DA:169,0 +DA:173,0 +DA:174,0 +DA:179,1 +DA:180,1 +DA:181,1 +DA:185,1 +DA:186,1 +DA:189,1 +DA:197,1 +DA:198,6 +DA:201,5 +DA:203,5 +DA:204,3 +DA:212,5 +DA:213,2 +DA:216,5 +DA:224,5 +DA:225,5 +DA:226,5 +DA:227,5 +DA:231,5 +DA:232,5 +DA:238,1 +DA:239,13 +DA:240,13 +DA:241,0 +DA:247,13 +DA:248,13 +DA:249,0 +DA:252,13 +DA:253,0 +DA:256,13 +DA:259,13 +DA:261,4 +DA:262,3 +DA:264,6 +DA:265,5 +DA:267,3 +DA:268,1 +DA:270,0 +DA:272,9 +DA:275,1 +DA:276,1 +DA:277,0 +DA:278,0 +DA:281,1 +DA:283,2 +DA:284,2 +DA:290,0 +DA:302,1 +DA:305,1 +LF:107 +LH:94 +BRDA:39,0,0,1 +BRDA:39,0,1,3 +BRDA:59,1,0,1 +BRDA:59,1,1,2 +BRDA:59,2,0,3 +BRDA:59,2,1,1 +BRDA:86,3,0,2 +BRDA:86,3,1,1 +BRDA:107,4,0,0 +BRDA:107,4,1,3 +BRDA:116,5,0,1 +BRDA:116,5,1,2 +BRDA:121,6,0,1 +BRDA:121,6,1,1 +BRDA:149,7,0,0 +BRDA:149,7,1,1 +BRDA:156,8,0,1 +BRDA:156,8,1,0 +BRDA:163,9,0,0 +BRDA:163,9,1,1 +BRDA:173,10,0,0 +BRDA:173,10,1,0 +BRDA:203,11,0,3 +BRDA:203,11,1,2 +BRDA:203,12,0,5 +BRDA:203,12,1,2 +BRDA:212,13,0,2 +BRDA:212,13,1,3 +BRDA:212,14,0,5 +BRDA:212,14,1,5 +BRDA:221,15,0,5 +BRDA:221,15,1,0 +BRDA:240,16,0,0 +BRDA:240,16,1,13 +BRDA:248,17,0,0 +BRDA:248,17,1,13 +BRDA:252,18,0,0 +BRDA:252,18,1,13 +BRDA:259,19,0,4 +BRDA:259,19,1,6 +BRDA:259,19,2,3 +BRDA:259,19,3,0 +BRDA:276,20,0,0 +BRDA:276,20,1,1 +BRDA:276,21,0,1 +BRDA:276,21,1,1 +BRDA:292,22,0,0 +BRDA:292,22,1,0 +BRDA:294,23,0,0 +BRDA:294,23,1,0 +BRDA:297,24,0,0 +BRDA:297,24,1,0 +BRF:52 +BRH:34 +end_of_record +TN: +SF:v0\destinations\gainsight_px\util.js +FN:5,(anonymous_0) +FN:35,(anonymous_1) +FN:65,(anonymous_2) +FN:83,(anonymous_3) +FN:112,(anonymous_4) +FN:115,(anonymous_5) +FN:129,(anonymous_6) +FN:131,(anonymous_7) +FNF:8 +FNH:7 +FNDA:2,(anonymous_0) +FNDA:7,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:4,(anonymous_4) +FNDA:6,(anonymous_5) +FNDA:5,(anonymous_6) +FNDA:24,(anonymous_7) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:11,2 +DA:12,2 +DA:14,2 +DA:15,2 +DA:19,2 +DA:21,2 +DA:22,2 +DA:25,0 +DA:35,1 +DA:36,7 +DA:37,7 +DA:39,7 +DA:40,1 +DA:41,1 +DA:45,7 +DA:46,7 +DA:52,5 +DA:53,5 +DA:55,0 +DA:57,2 +DA:65,1 +DA:67,0 +DA:68,0 +DA:74,0 +DA:75,0 +DA:77,0 +DA:79,0 +DA:83,1 +DA:85,1 +DA:86,1 +DA:96,1 +DA:97,1 +DA:99,0 +DA:101,0 +DA:112,1 +DA:113,4 +DA:114,4 +DA:115,4 +DA:116,6 +DA:117,3 +DA:120,4 +DA:129,1 +DA:130,5 +DA:131,5 +DA:132,24 +DA:133,7 +DA:135,17 +DA:138,5 +DA:141,1 +LF:53 +LH:43 +BRDA:9,0,0,2 +BRDA:14,1,0,2 +BRDA:14,1,1,0 +BRDA:14,2,0,2 +BRDA:14,2,1,2 +BRDA:15,3,0,2 +BRDA:15,3,1,0 +BRDA:21,4,0,2 +BRDA:21,4,1,0 +BRDA:39,5,0,1 +BRDA:39,5,1,6 +BRDA:52,6,0,5 +BRDA:52,6,1,0 +BRDA:52,7,0,5 +BRDA:52,7,1,5 +BRDA:74,8,0,0 +BRDA:74,8,1,0 +BRDA:74,9,0,0 +BRDA:74,9,1,0 +BRDA:96,10,0,1 +BRDA:96,10,1,0 +BRDA:96,11,0,1 +BRDA:96,11,1,1 +BRDA:116,12,0,3 +BRDA:116,12,1,3 +BRDA:132,13,0,7 +BRDA:132,13,1,17 +BRF:27 +BRH:18 +end_of_record +TN: +SF:v0\destinations\google_adwords_enhanced_conversions\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:9,1 +DA:13,1 +DA:20,1 +DA:21,1 +LF:7 +LH:7 +BRDA:9,0,0,0 +BRDA:9,0,1,1 +BRF:2 +BRH:1 +end_of_record +TN: +SF:v0\destinations\google_adwords_enhanced_conversions\transform.js +FN:23,(anonymous_0) +FN:25,(anonymous_1) +FN:47,(anonymous_2) +FN:59,(anonymous_3) +FN:86,(anonymous_4) +FN:91,(anonymous_5) +FN:133,(anonymous_6) +FN:140,(anonymous_7) +FN:162,(anonymous_8) +FN:165,(anonymous_9) +FN:172,(anonymous_10) +FNF:11 +FNH:11 +FNDA:2,(anonymous_0) +FNDA:32,(anonymous_1) +FNDA:7,(anonymous_2) +FNDA:7,(anonymous_3) +FNDA:11,(anonymous_4) +FNDA:16,(anonymous_5) +FNDA:12,(anonymous_6) +FNDA:13,(anonymous_7) +FNDA:13,(anonymous_8) +FNDA:1,(anonymous_9) +FNDA:2,(anonymous_10) +DA:3,1 +DA:4,1 +DA:12,1 +DA:13,1 +DA:15,1 +DA:23,1 +DA:24,2 +DA:25,2 +DA:26,32 +DA:27,28 +DA:28,10 +DA:31,32 +DA:33,2 +DA:47,1 +DA:49,7 +DA:50,7 +DA:51,1 +DA:56,6 +DA:59,1 +DA:60,7 +DA:61,7 +DA:62,7 +DA:63,7 +DA:64,7 +DA:65,7 +DA:66,6 +DA:71,6 +DA:72,6 +DA:73,6 +DA:74,5 +DA:75,5 +DA:77,1 +DA:83,5 +DA:86,1 +DA:87,11 +DA:88,11 +DA:89,11 +DA:90,11 +DA:91,16 +DA:92,9 +DA:94,11 +DA:95,2 +DA:102,9 +DA:103,9 +DA:105,9 +DA:106,2 +DA:110,9 +DA:111,9 +DA:113,1 +DA:121,8 +DA:122,8 +DA:123,1 +DA:130,7 +DA:132,7 +DA:133,7 +DA:134,12 +DA:135,0 +DA:137,7 +DA:140,1 +DA:141,13 +DA:142,13 +DA:143,0 +DA:150,13 +DA:151,2 +DA:158,11 +DA:162,1 +DA:163,13 +DA:165,1 +DA:166,1 +DA:167,0 +DA:168,0 +DA:171,1 +DA:173,2 +DA:174,2 +DA:180,1 +DA:193,1 +DA:196,1 +LF:77 +LH:73 +BRDA:26,0,0,28 +BRDA:26,0,1,4 +BRDA:27,1,0,10 +BRDA:27,1,1,18 +BRDA:50,2,0,1 +BRDA:50,2,1,6 +BRDA:72,3,0,6 +BRDA:72,3,1,0 +BRDA:73,4,0,5 +BRDA:73,4,1,1 +BRDA:91,5,0,9 +BRDA:91,5,1,2 +BRDA:94,6,0,2 +BRDA:94,6,1,9 +BRDA:94,7,0,11 +BRDA:94,7,1,11 +BRDA:94,7,2,11 +BRDA:105,8,0,2 +BRDA:105,8,1,7 +BRDA:122,9,0,1 +BRDA:122,9,1,7 +BRDA:134,10,0,12 +BRDA:134,10,1,0 +BRDA:142,11,0,0 +BRDA:142,11,1,13 +BRDA:150,12,0,2 +BRDA:150,12,1,11 +BRDA:166,13,0,0 +BRDA:166,13,1,1 +BRDA:166,14,0,1 +BRDA:166,14,1,1 +BRDA:183,15,0,0 +BRDA:183,15,1,1 +BRDA:185,16,0,0 +BRDA:185,16,1,1 +BRDA:187,17,0,1 +BRDA:187,17,1,0 +BRDA:188,18,0,1 +BRDA:188,18,1,0 +BRF:39 +BRH:31 +end_of_record +TN: +SF:v0\destinations\google_adwords_remarketing_lists\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:4,1 +DA:8,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:19,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\google_adwords_remarketing_lists\transform.js +FN:24,(anonymous_0) +FN:25,(anonymous_1) +FN:44,(anonymous_2) +FN:64,(anonymous_3) +FN:99,(anonymous_4) +FN:111,(anonymous_5) +FN:123,(anonymous_6) +FN:158,(anonymous_7) +FN:164,(anonymous_8) +FN:188,(anonymous_9) +FN:199,(anonymous_10) +FN:220,(anonymous_11) +FN:258,(anonymous_12) +FN:272,(anonymous_13) +FN:275,(anonymous_14) +FN:282,(anonymous_15) +FNF:16 +FNH:16 +FNDA:365,(anonymous_0) +FNDA:2193,(anonymous_1) +FNDA:23,(anonymous_2) +FNDA:23,(anonymous_3) +FNDA:25,(anonymous_4) +FNDA:365,(anonymous_5) +FNDA:1068,(anonymous_6) +FNDA:20,(anonymous_7) +FNDA:26,(anonymous_8) +FNDA:42,(anonymous_9) +FNDA:26,(anonymous_10) +FNDA:22,(anonymous_11) +FNDA:23,(anonymous_12) +FNDA:22,(anonymous_13) +FNDA:1,(anonymous_14) +FNDA:4,(anonymous_15) +DA:1,1 +DA:2,1 +DA:13,1 +DA:14,1 +DA:22,1 +DA:24,1 +DA:25,365 +DA:26,2193 +DA:28,1451 +DA:44,1 +DA:46,23 +DA:47,23 +DA:48,1 +DA:53,22 +DA:64,1 +DA:65,23 +DA:66,23 +DA:67,23 +DA:68,23 +DA:69,23 +DA:70,23 +DA:71,22 +DA:72,22 +DA:77,22 +DA:78,2 +DA:79,1 +DA:80,1 +DA:82,1 +DA:88,21 +DA:99,1 +DA:100,25 +DA:101,25 +DA:102,25 +DA:104,25 +DA:105,6 +DA:107,19 +DA:109,25 +DA:111,25 +DA:112,365 +DA:113,365 +DA:116,365 +DA:117,9 +DA:118,4 +DA:120,5 +DA:123,356 +DA:124,1068 +DA:125,356 +DA:127,356 +DA:128,356 +DA:129,712 +DA:130,705 +DA:136,7 +DA:145,25 +DA:158,1 +DA:159,20 +DA:160,20 +DA:162,20 +DA:163,20 +DA:164,20 +DA:165,26 +DA:166,25 +DA:170,25 +DA:171,2 +DA:174,2 +DA:177,23 +DA:178,23 +DA:180,23 +DA:185,23 +DA:188,15 +DA:189,42 +DA:192,42 +DA:193,42 +DA:195,15 +DA:196,15 +DA:199,8 +DA:200,26 +DA:203,26 +DA:204,26 +DA:206,8 +DA:207,8 +DA:211,1 +DA:217,20 +DA:220,1 +DA:221,22 +DA:222,22 +DA:223,1 +DA:230,21 +DA:231,0 +DA:238,21 +DA:239,1 +DA:246,20 +DA:247,20 +DA:249,20 +DA:250,3 +DA:258,17 +DA:259,23 +DA:261,15 +DA:264,0 +DA:272,1 +DA:273,22 +DA:275,1 +DA:276,1 +DA:277,0 +DA:278,0 +DA:281,1 +DA:283,4 +DA:284,4 +DA:290,0 +DA:303,1 +DA:306,1 +LF:110 +LH:105 +BRDA:26,0,0,1451 +BRDA:26,0,1,742 +BRDA:26,1,0,2193 +BRDA:26,1,1,1455 +BRDA:47,2,0,1 +BRDA:47,2,1,22 +BRDA:77,3,0,2 +BRDA:77,3,1,20 +BRDA:78,4,0,1 +BRDA:78,4,1,1 +BRDA:104,5,0,6 +BRDA:104,5,1,19 +BRDA:109,6,0,25 +BRDA:109,6,1,0 +BRDA:112,7,0,365 +BRDA:112,7,1,0 +BRDA:116,8,0,9 +BRDA:116,8,1,356 +BRDA:117,9,0,4 +BRDA:117,9,1,5 +BRDA:124,10,0,356 +BRDA:124,10,1,712 +BRDA:127,11,0,356 +BRDA:127,11,1,0 +BRDA:129,12,0,705 +BRDA:129,12,1,7 +BRDA:165,13,0,25 +BRDA:165,13,1,1 +BRDA:170,14,0,2 +BRDA:170,14,1,23 +BRDA:185,15,0,15 +BRDA:185,15,1,8 +BRDA:185,15,2,0 +BRDA:222,16,0,1 +BRDA:222,16,1,21 +BRDA:230,17,0,0 +BRDA:230,17,1,21 +BRDA:238,18,0,1 +BRDA:238,18,1,20 +BRDA:246,19,0,20 +BRDA:246,19,1,0 +BRDA:249,20,0,3 +BRDA:249,20,1,17 +BRDA:276,21,0,0 +BRDA:276,21,1,1 +BRDA:276,22,0,1 +BRDA:276,22,1,1 +BRDA:293,23,0,0 +BRDA:293,23,1,0 +BRDA:295,24,0,0 +BRDA:295,24,1,0 +BRDA:297,25,0,0 +BRDA:297,25,1,0 +BRDA:298,26,0,0 +BRDA:298,26,1,0 +BRF:55 +BRH:40 +end_of_record +TN: +SF:v0\destinations\googlepubsub\transform.js +FN:5,process +FN:21,(anonymous_1) +FN:28,(anonymous_2) +FNF:3 +FNH:1 +FNDA:13,process +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +DA:1,1 +DA:3,1 +DA:6,13 +DA:7,13 +DA:8,13 +DA:9,10 +DA:11,10 +DA:18,3 +DA:21,1 +DA:22,0 +DA:23,0 +DA:24,0 +DA:27,0 +DA:29,0 +DA:30,0 +DA:36,0 +DA:48,0 +DA:51,1 +LF:18 +LH:10 +BRDA:8,0,0,10 +BRDA:8,0,1,3 +BRDA:12,1,0,10 +BRDA:12,1,1,7 +BRDA:22,2,0,0 +BRDA:22,2,1,0 +BRDA:22,3,0,0 +BRDA:22,3,1,0 +BRDA:38,4,0,0 +BRDA:38,4,1,0 +BRDA:40,5,0,0 +BRDA:40,5,1,0 +BRDA:43,6,0,0 +BRDA:43,6,1,0 +BRF:14 +BRH:4 +end_of_record +TN: +SF:v0\destinations\googlepubsub\util.js +FN:10,(anonymous_0) +FN:19,(anonymous_1) +FN:37,(anonymous_2) +FN:43,generateAttributesMap +FN:49,(anonymous_4) +FN:63,getAttributeValueOrNull +FN:72,(anonymous_6) +FN:107,(anonymous_7) +FNF:8 +FNH:8 +FNDA:6,(anonymous_0) +FNDA:13,(anonymous_1) +FNDA:10,(anonymous_2) +FNDA:10,generateAttributesMap +FNDA:8,(anonymous_4) +FNDA:6,getAttributeValueOrNull +FNDA:4,(anonymous_6) +FNDA:6,(anonymous_7) +DA:7,1 +DA:9,1 +DA:10,1 +DA:11,6 +DA:19,1 +DA:20,13 +DA:21,13 +DA:22,13 +DA:24,13 +DA:37,1 +DA:44,10 +DA:45,5 +DA:48,5 +DA:49,5 +DA:50,8 +DA:51,8 +DA:52,8 +DA:53,2 +DA:55,6 +DA:59,5 +DA:65,6 +DA:66,6 +DA:67,2 +DA:71,4 +DA:72,4 +DA:73,4 +DA:74,4 +DA:75,4 +DA:76,4 +DA:77,4 +DA:78,4 +DA:81,0 +DA:84,4 +DA:85,4 +DA:87,0 +DA:91,10 +DA:93,10 +DA:94,10 +DA:95,5 +DA:99,5 +DA:103,5 +DA:104,0 +DA:107,5 +DA:108,6 +DA:109,6 +DA:110,6 +DA:111,6 +DA:112,6 +DA:115,5 +DA:118,1 +LF:50 +LH:47 +BRDA:11,0,0,6 +BRDA:11,0,1,0 +BRDA:25,1,0,13 +BRDA:25,1,1,11 +BRDA:25,1,2,4 +BRDA:25,2,0,8 +BRDA:25,2,1,5 +BRDA:44,3,0,5 +BRDA:44,3,1,5 +BRDA:44,4,0,10 +BRDA:44,4,1,5 +BRDA:51,5,0,8 +BRDA:51,5,1,0 +BRDA:52,6,0,2 +BRDA:52,6,1,6 +BRDA:66,7,0,2 +BRDA:66,7,1,4 +BRDA:74,8,0,4 +BRDA:74,8,1,0 +BRDA:75,9,0,4 +BRDA:75,9,1,1 +BRDA:76,10,0,4 +BRDA:76,10,1,0 +BRDA:84,11,0,4 +BRDA:84,11,1,0 +BRDA:94,12,0,5 +BRDA:94,12,1,5 +BRDA:94,13,0,10 +BRDA:94,13,1,5 +BRDA:99,14,0,5 +BRDA:99,14,1,4 +BRDA:99,14,2,0 +BRDA:99,15,0,3 +BRDA:99,15,1,2 +BRDA:103,16,0,0 +BRDA:103,16,1,5 +BRDA:103,17,0,5 +BRDA:103,17,1,5 +BRDA:109,18,0,6 +BRDA:109,18,1,0 +BRF:40 +BRH:32 +end_of_record +TN: +SF:v0\destinations\googlesheets\transform.js +FN:21,(anonymous_0) +FN:43,(anonymous_1) +FN:61,(anonymous_2) +FN:67,(anonymous_3) +FN:91,(anonymous_4) +FN:107,(anonymous_5) +FN:114,(anonymous_6) +FNF:7 +FNH:5 +FNDA:149,(anonymous_0) +FNDA:5,(anonymous_1) +FNDA:70,(anonymous_2) +FNDA:149,(anonymous_3) +FNDA:6,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +DA:1,1 +DA:7,1 +DA:9,1 +DA:21,1 +DA:23,149 +DA:24,149 +DA:25,51 +DA:27,149 +DA:43,1 +DA:44,5 +DA:45,5 +DA:46,5 +DA:47,5 +DA:54,5 +DA:58,5 +DA:60,5 +DA:61,5 +DA:64,70 +DA:65,70 +DA:67,56 +DA:68,149 +DA:73,149 +DA:74,13 +DA:76,136 +DA:80,70 +DA:84,70 +DA:87,5 +DA:91,1 +DA:92,6 +DA:93,6 +DA:94,5 +DA:102,5 +DA:104,1 +DA:107,1 +DA:108,0 +DA:109,0 +DA:110,0 +DA:113,0 +DA:115,0 +DA:116,0 +DA:118,0 +DA:125,0 +DA:131,0 +DA:143,0 +DA:146,1 +LF:45 +LH:35 +BRDA:24,0,0,51 +BRDA:24,0,1,98 +BRDA:25,1,0,51 +BRDA:25,1,1,40 +BRDA:56,2,0,5 +BRDA:56,2,1,4 +BRDA:60,3,0,5 +BRDA:60,3,1,0 +BRDA:65,4,0,56 +BRDA:65,4,1,14 +BRDA:73,5,0,13 +BRDA:73,5,1,136 +BRDA:82,6,0,70 +BRDA:82,6,1,43 +BRDA:93,7,0,5 +BRDA:93,7,1,1 +BRDA:108,8,0,0 +BRDA:108,8,1,0 +BRDA:108,9,0,0 +BRDA:108,9,1,0 +BRDA:116,10,0,0 +BRDA:116,10,1,0 +BRDA:133,11,0,0 +BRDA:133,11,1,0 +BRDA:135,12,0,0 +BRDA:135,12,1,0 +BRDA:138,13,0,0 +BRDA:138,13,1,0 +BRF:28 +BRH:15 +end_of_record +TN: +SF:v0\destinations\hs\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:9,1 +DA:10,1 +DA:11,1 +DA:13,1 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\hs\transform.js +FN:29,getKey +FN:36,getTraits +FN:45,getProperties +FN:70,(anonymous_3) +FN:78,getTransformedJSON +FN:93,(anonymous_5) +FN:98,(anonymous_6) +FN:115,getPropertyValueForIdentify +FN:116,(anonymous_8) +FN:121,responseBuilderSimple +FN:154,processTrack +FN:186,processIdentify +FN:212,processSingleMessage +FN:237,process +FN:241,batchEvents +FN:246,(anonymous_15) +FN:282,(anonymous_16) +FN:294,(anonymous_17) +FN:333,(anonymous_18) +FN:345,(anonymous_19) +FN:352,(anonymous_20) +FNF:21 +FNH:21 +FNDA:28,getKey +FNDA:14,getTraits +FNDA:11,getProperties +FNDA:1494,(anonymous_3) +FNDA:13,getTransformedJSON +FNDA:110,(anonymous_5) +FNDA:28,(anonymous_6) +FNDA:5,getPropertyValueForIdentify +FNDA:11,(anonymous_8) +FNDA:11,responseBuilderSimple +FNDA:6,processTrack +FNDA:8,processIdentify +FNDA:15,processSingleMessage +FNDA:12,process +FNDA:1,batchEvents +FNDA:4,(anonymous_15) +FNDA:1,(anonymous_16) +FNDA:3,(anonymous_17) +FNDA:1,(anonymous_18) +FNDA:1,(anonymous_19) +FNDA:4,(anonymous_20) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:16,1 +DA:22,1 +DA:23,1 +DA:25,1 +DA:27,1 +DA:30,28 +DA:31,28 +DA:32,28 +DA:33,28 +DA:37,14 +DA:38,14 +DA:39,1 +DA:42,14 +DA:46,11 +DA:48,11 +DA:49,11 +DA:50,11 +DA:51,11 +DA:55,2 +DA:56,2 +DA:63,0 +DA:69,9 +DA:70,9 +DA:71,1494 +DA:73,9 +DA:75,9 +DA:84,13 +DA:85,13 +DA:86,13 +DA:88,13 +DA:89,13 +DA:90,13 +DA:91,10 +DA:93,11 +DA:94,110 +DA:95,22 +DA:98,11 +DA:99,28 +DA:100,28 +DA:101,1 +DA:102,1 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:108,1 +DA:112,11 +DA:116,5 +DA:117,11 +DA:122,11 +DA:123,11 +DA:125,11 +DA:126,11 +DA:128,11 +DA:129,5 +DA:130,5 +DA:131,5 +DA:132,5 +DA:133,5 +DA:134,5 +DA:136,0 +DA:138,5 +DA:139,5 +DA:141,6 +DA:143,11 +DA:146,11 +DA:147,11 +DA:148,11 +DA:149,11 +DA:151,11 +DA:155,6 +DA:160,6 +DA:165,2 +DA:167,6 +DA:174,6 +DA:187,8 +DA:188,8 +DA:190,8 +DA:191,1 +DA:194,8 +DA:195,1 +DA:197,7 +DA:203,5 +DA:204,5 +DA:215,15 +DA:216,0 +DA:219,15 +DA:221,6 +DA:222,6 +DA:224,8 +DA:225,5 +DA:227,1 +DA:233,11 +DA:238,12 +DA:242,1 +DA:243,1 +DA:244,1 +DA:245,1 +DA:246,1 +DA:248,4 +DA:249,1 +DA:250,1 +DA:252,1 +DA:253,1 +DA:254,1 +DA:255,1 +DA:256,1 +DA:257,1 +DA:259,1 +DA:260,1 +DA:262,1 +DA:270,3 +DA:272,4 +DA:276,1 +DA:277,1 +DA:282,1 +DA:283,1 +DA:284,1 +DA:288,1 +DA:289,1 +DA:290,1 +DA:292,1 +DA:294,1 +DA:295,3 +DA:298,3 +DA:299,3 +DA:303,3 +DA:306,1 +DA:310,1 +DA:311,1 +DA:314,1 +DA:315,1 +DA:320,1 +DA:330,1 +DA:333,1 +DA:334,1 +DA:335,0 +DA:336,0 +DA:339,1 +DA:340,1 +DA:342,1 +DA:345,1 +DA:346,1 +DA:348,1 +DA:349,1 +DA:351,1 +DA:353,4 +DA:354,4 +DA:356,1 +DA:363,3 +DA:374,0 +DA:385,1 +DA:386,1 +DA:387,1 +DA:389,1 +DA:392,1 +LF:160 +LH:150 +BRDA:38,0,0,1 +BRDA:38,0,1,13 +BRDA:38,1,0,14 +BRDA:38,1,1,14 +BRDA:46,2,0,11 +BRDA:46,2,1,0 +BRDA:55,3,0,2 +BRDA:55,3,1,0 +BRDA:57,4,0,2 +BRDA:57,4,1,0 +BRDA:57,4,2,0 +BRDA:60,5,0,2 +BRDA:60,5,1,0 +BRDA:88,6,0,13 +BRDA:88,6,1,0 +BRDA:90,7,0,10 +BRDA:90,7,1,3 +BRDA:94,8,0,22 +BRDA:94,8,1,88 +BRDA:100,9,0,1 +BRDA:100,9,1,27 +BRDA:100,10,0,28 +BRDA:100,10,1,6 +BRDA:102,11,0,0 +BRDA:102,11,1,1 +BRDA:128,12,0,5 +BRDA:128,12,1,6 +BRDA:133,13,0,5 +BRDA:133,13,1,0 +BRDA:160,14,0,2 +BRDA:160,14,1,4 +BRDA:161,15,0,6 +BRDA:161,15,1,5 +BRDA:161,15,2,4 +BRDA:165,16,0,2 +BRDA:165,16,1,1 +BRDA:190,17,0,1 +BRDA:190,17,1,7 +BRDA:194,18,0,1 +BRDA:194,18,1,7 +BRDA:194,19,0,8 +BRDA:194,19,1,8 +BRDA:215,20,0,0 +BRDA:215,20,1,15 +BRDA:219,21,0,6 +BRDA:219,21,1,8 +BRDA:219,21,2,1 +BRDA:248,22,0,1 +BRDA:248,22,1,3 +BRDA:272,23,0,1 +BRDA:272,23,1,3 +BRDA:273,24,0,4 +BRDA:273,24,1,4 +BRDA:273,24,2,4 +BRDA:334,25,0,0 +BRDA:334,25,1,1 +BRDA:334,26,0,1 +BRDA:334,26,1,1 +BRDA:348,27,0,1 +BRDA:348,27,1,0 +BRDA:354,28,0,1 +BRDA:354,28,1,3 +BRDA:377,29,0,0 +BRDA:377,29,1,0 +BRDA:378,30,0,0 +BRDA:378,30,1,0 +BRDA:386,31,0,1 +BRDA:386,31,1,0 +BRF:68 +BRH:52 +end_of_record +TN: +SF:v0\destinations\hs\util.js +FN:3,(anonymous_0) +FN:12,(anonymous_1) +FN:13,(anonymous_2) +FN:16,(anonymous_3) +FNF:4 +FNH:3 +FNDA:0,(anonymous_0) +FNDA:3,(anonymous_1) +FNDA:3,(anonymous_2) +FNDA:6,(anonymous_3) +DA:1,1 +DA:3,1 +DA:4,0 +DA:8,0 +DA:9,0 +DA:12,1 +DA:13,3 +DA:14,3 +DA:16,6 +DA:20,1 +LF:10 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\indicative\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:8,1 +DA:16,1 +DA:18,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\indicative\transform.js +FN:14,(anonymous_0) +FN:18,(anonymous_1) +FN:29,(anonymous_2) +FN:55,(anonymous_3) +FN:68,(anonymous_4) +FN:78,(anonymous_5) +FN:88,(anonymous_6) +FN:103,(anonymous_7) +FN:127,(anonymous_8) +FN:193,(anonymous_9) +FN:197,(anonymous_10) +FN:204,(anonymous_11) +FNF:12 +FNH:12 +FNDA:19,(anonymous_0) +FNDA:439,(anonymous_1) +FNDA:44,(anonymous_2) +FNDA:31,(anonymous_3) +FNDA:277,(anonymous_4) +FNDA:30,(anonymous_5) +FNDA:420,(anonymous_6) +FNDA:24,(anonymous_7) +FNDA:22,(anonymous_8) +FNDA:22,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:2,(anonymous_11) +DA:1,1 +DA:2,1 +DA:3,1 +DA:12,1 +DA:14,1 +DA:15,19 +DA:18,19 +DA:20,439 +DA:22,376 +DA:23,63 +DA:24,11 +DA:26,10 +DA:28,10 +DA:29,10 +DA:30,44 +DA:32,5 +DA:33,39 +DA:37,37 +DA:42,10 +DA:43,2 +DA:47,10 +DA:49,7 +DA:50,7 +DA:55,7 +DA:58,31 +DA:61,30 +DA:66,7 +DA:67,37 +DA:68,37 +DA:69,277 +DA:72,276 +DA:78,7 +DA:79,30 +DA:88,52 +DA:90,420 +DA:99,19 +DA:100,19 +DA:103,1 +DA:104,24 +DA:105,24 +DA:106,24 +DA:109,19 +DA:111,24 +DA:112,24 +DA:113,24 +DA:114,24 +DA:115,24 +DA:119,24 +DA:120,24 +DA:121,24 +DA:124,0 +DA:127,1 +DA:128,22 +DA:129,1 +DA:134,21 +DA:135,21 +DA:138,21 +DA:139,21 +DA:141,1 +DA:142,1 +DA:144,5 +DA:145,5 +DA:147,5 +DA:148,5 +DA:150,1 +DA:151,1 +DA:153,8 +DA:154,8 +DA:156,1 +DA:160,20 +DA:161,13 +DA:162,1 +DA:164,13 +DA:172,20 +DA:174,20 +DA:175,5 +DA:178,5 +DA:180,4 +DA:190,20 +DA:193,1 +DA:194,22 +DA:197,1 +DA:198,1 +DA:199,0 +DA:200,0 +DA:203,1 +DA:205,2 +DA:206,2 +DA:208,0 +DA:215,2 +DA:221,0 +DA:233,1 +DA:236,1 +LF:93 +LH:88 +BRDA:20,0,0,376 +BRDA:20,0,1,63 +BRDA:23,1,0,11 +BRDA:23,1,1,52 +BRDA:24,2,0,10 +BRDA:24,2,1,1 +BRDA:30,3,0,5 +BRDA:30,3,1,39 +BRDA:33,4,0,2 +BRDA:33,4,1,37 +BRDA:42,5,0,2 +BRDA:42,5,1,8 +BRDA:47,6,0,7 +BRDA:47,6,1,3 +BRDA:58,7,0,30 +BRDA:58,7,1,1 +BRDA:69,8,0,276 +BRDA:69,8,1,1 +BRDA:79,9,0,30 +BRDA:79,9,1,0 +BRDA:90,10,0,172 +BRDA:90,10,1,248 +BRDA:105,11,0,24 +BRDA:105,11,1,0 +BRDA:106,12,0,19 +BRDA:106,12,1,5 +BRDA:128,13,0,1 +BRDA:128,13,1,21 +BRDA:139,14,0,1 +BRDA:139,14,1,5 +BRDA:139,14,2,5 +BRDA:139,14,3,1 +BRDA:139,14,4,8 +BRDA:139,14,5,1 +BRDA:160,15,0,13 +BRDA:160,15,1,7 +BRDA:160,16,0,20 +BRDA:160,16,1,15 +BRDA:161,17,0,1 +BRDA:161,17,1,12 +BRDA:174,18,0,5 +BRDA:174,18,1,15 +BRDA:178,19,0,4 +BRDA:178,19,1,1 +BRDA:198,20,0,0 +BRDA:198,20,1,1 +BRDA:198,21,0,1 +BRDA:198,21,1,1 +BRDA:206,22,0,0 +BRDA:206,22,1,2 +BRDA:223,23,0,0 +BRDA:223,23,1,0 +BRDA:225,24,0,0 +BRDA:225,24,1,0 +BRDA:228,25,0,0 +BRDA:228,25,1,0 +BRF:56 +BRH:46 +end_of_record +TN: +SF:v0\destinations\intercom\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:6,1 +DA:8,1 +DA:12,1 +DA:28,1 +DA:30,1 +DA:43,1 +DA:45,1 +LF:9 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\intercom\transform.js +FN:22,getCompanyAttribute +FN:26,(anonymous_1) +FN:46,validateIdentify +FN:68,(anonymous_3) +FN:78,validateTrack +FN:83,(anonymous_5) +FN:95,validateAndBuildResponse +FN:125,processSingleMessage +FN:164,process +FN:177,(anonymous_9) +FN:184,(anonymous_10) +FNF:11 +FNH:11 +FNDA:3,getCompanyAttribute +FNDA:8,(anonymous_1) +FNDA:13,validateIdentify +FNDA:100,(anonymous_3) +FNDA:3,validateTrack +FNDA:6,(anonymous_5) +FNDA:16,validateAndBuildResponse +FNDA:16,processSingleMessage +FNDA:16,process +FNDA:1,(anonymous_9) +FNDA:2,(anonymous_10) +DA:1,1 +DA:2,1 +DA:3,1 +DA:9,1 +DA:20,1 +DA:23,3 +DA:24,3 +DA:25,2 +DA:26,2 +DA:28,8 +DA:29,3 +DA:30,3 +DA:31,2 +DA:36,2 +DA:43,3 +DA:47,13 +DA:49,13 +DA:50,13 +DA:51,11 +DA:52,7 +DA:53,7 +DA:54,7 +DA:55,2 +DA:57,5 +DA:61,11 +DA:62,3 +DA:67,11 +DA:68,10 +DA:69,100 +DA:73,11 +DA:75,2 +DA:80,3 +DA:81,2 +DA:82,2 +DA:83,1 +DA:84,6 +DA:85,6 +DA:86,4 +DA:90,2 +DA:92,1 +DA:96,16 +DA:97,16 +DA:98,16 +DA:100,13 +DA:103,11 +DA:105,3 +DA:108,2 +DA:110,0 +DA:113,13 +DA:114,13 +DA:115,13 +DA:121,13 +DA:122,13 +DA:126,16 +DA:127,0 +DA:132,16 +DA:133,16 +DA:136,16 +DA:138,13 +DA:139,13 +DA:141,3 +DA:142,3 +DA:147,0 +DA:152,16 +DA:153,1 +DA:154,1 +DA:156,15 +DA:158,16 +DA:159,1 +DA:161,16 +DA:166,16 +DA:167,16 +DA:169,3 +DA:174,13 +DA:177,1 +DA:178,1 +DA:179,0 +DA:180,0 +DA:183,1 +DA:185,2 +DA:186,2 +DA:188,0 +DA:195,2 +DA:201,0 +DA:213,1 +DA:216,1 +LF:86 +LH:79 +BRDA:24,0,0,2 +BRDA:24,0,1,1 +BRDA:24,1,0,3 +BRDA:24,1,1,1 +BRDA:28,2,0,3 +BRDA:28,2,1,5 +BRDA:30,3,0,2 +BRDA:30,3,1,1 +BRDA:37,4,0,2 +BRDA:37,4,1,1 +BRDA:50,5,0,11 +BRDA:50,5,1,2 +BRDA:50,6,0,13 +BRDA:50,6,1,10 +BRDA:51,7,0,7 +BRDA:51,7,1,4 +BRDA:51,8,0,11 +BRDA:51,8,1,4 +BRDA:54,9,0,2 +BRDA:54,9,1,5 +BRDA:54,10,0,7 +BRDA:54,10,1,3 +BRDA:57,11,0,5 +BRDA:57,11,1,4 +BRDA:61,12,0,3 +BRDA:61,12,1,8 +BRDA:67,13,0,10 +BRDA:67,13,1,1 +BRDA:80,14,0,2 +BRDA:80,14,1,1 +BRDA:80,15,0,3 +BRDA:80,15,1,2 +BRDA:82,16,0,1 +BRDA:82,16,1,1 +BRDA:85,17,0,4 +BRDA:85,17,1,2 +BRDA:85,18,0,6 +BRDA:85,18,1,5 +BRDA:85,18,2,4 +BRDA:98,19,0,13 +BRDA:98,19,1,3 +BRDA:98,19,2,0 +BRDA:126,20,0,0 +BRDA:126,20,1,16 +BRDA:136,21,0,13 +BRDA:136,21,1,3 +BRDA:136,21,2,0 +BRDA:152,22,0,1 +BRDA:152,22,1,15 +BRDA:158,23,0,1 +BRDA:158,23,1,15 +BRDA:158,24,0,16 +BRDA:158,24,1,1 +BRDA:170,25,0,3 +BRDA:170,25,1,0 +BRDA:171,26,0,3 +BRDA:171,26,1,3 +BRDA:178,27,0,0 +BRDA:178,27,1,1 +BRDA:178,28,0,1 +BRDA:178,28,1,1 +BRDA:186,29,0,0 +BRDA:186,29,1,2 +BRDA:203,30,0,0 +BRDA:203,30,1,0 +BRDA:205,31,0,0 +BRDA:205,31,1,0 +BRDA:208,32,0,0 +BRDA:208,32,1,0 +BRF:69 +BRH:57 +end_of_record +TN: +SF:v0\destinations\iterable\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:68,1 +LF:9 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\iterable\transform.js +FN:25,validateMandatoryField +FN:31,constructPayloadItem +FN:153,(anonymous_2) +FN:203,(anonymous_3) +FN:242,responseBuilderSimple +FN:254,responseBuilderSimpleForIdentify +FN:281,processSingleMessage +FN:332,process +FN:336,batchEvents +FN:340,(anonymous_9) +FN:352,(anonymous_10) +FN:393,getEventChunks +FN:431,(anonymous_12) +FN:444,(anonymous_13) +FNF:14 +FNH:14 +FNDA:32,validateMandatoryField +FNDA:41,constructPayloadItem +FNDA:2,(anonymous_2) +FNDA:8,(anonymous_3) +FNDA:36,responseBuilderSimple +FNDA:5,responseBuilderSimpleForIdentify +FNDA:37,processSingleMessage +FNDA:37,process +FNDA:2,batchEvents +FNDA:2,(anonymous_9) +FNDA:6,(anonymous_10) +FNDA:7,getEventChunks +FNDA:1,(anonymous_12) +FNDA:7,(anonymous_13) +DA:1,1 +DA:2,1 +DA:10,1 +DA:22,1 +DA:23,1 +DA:26,32 +DA:27,1 +DA:32,41 +DA:33,41 +DA:35,41 +DA:37,3 +DA:41,3 +DA:45,3 +DA:46,3 +DA:47,2 +DA:49,1 +DA:51,3 +DA:53,2 +DA:57,2 +DA:58,2 +DA:61,11 +DA:62,3 +DA:64,11 +DA:65,11 +DA:66,11 +DA:67,11 +DA:68,10 +DA:70,8 +DA:71,3 +DA:72,5 +DA:77,2 +DA:78,3 +DA:82,1 +DA:84,2 +DA:86,6 +DA:87,6 +DA:88,1 +DA:90,5 +DA:92,6 +DA:93,6 +DA:94,1 +DA:96,6 +DA:97,1 +DA:99,6 +DA:101,4 +DA:102,2 +DA:103,2 +DA:108,1 +DA:109,1 +DA:113,1 +DA:115,0 +DA:117,4 +DA:118,4 +DA:119,1 +DA:121,3 +DA:123,4 +DA:124,4 +DA:125,1 +DA:127,4 +DA:128,1 +DA:130,4 +DA:132,3 +DA:133,3 +DA:134,3 +DA:135,3 +DA:136,1 +DA:138,3 +DA:139,1 +DA:141,3 +DA:143,1 +DA:144,1 +DA:148,1 +DA:149,1 +DA:150,1 +DA:151,1 +DA:152,1 +DA:153,1 +DA:154,2 +DA:158,2 +DA:159,2 +DA:161,2 +DA:162,2 +DA:163,2 +DA:164,2 +DA:167,0 +DA:171,0 +DA:172,0 +DA:174,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:180,1 +DA:181,1 +DA:182,1 +DA:183,1 +DA:184,1 +DA:186,1 +DA:187,1 +DA:189,1 +DA:190,1 +DA:192,1 +DA:194,5 +DA:198,5 +DA:199,5 +DA:200,5 +DA:201,5 +DA:202,5 +DA:203,4 +DA:204,8 +DA:208,8 +DA:209,6 +DA:211,8 +DA:212,8 +DA:213,8 +DA:214,8 +DA:217,1 +DA:221,1 +DA:222,0 +DA:224,1 +DA:225,1 +DA:226,1 +DA:227,1 +DA:230,5 +DA:231,5 +DA:233,4 +DA:234,2 +DA:236,0 +DA:239,36 +DA:243,36 +DA:244,36 +DA:245,36 +DA:246,36 +DA:247,31 +DA:251,31 +DA:255,5 +DA:256,5 +DA:258,5 +DA:259,3 +DA:260,3 +DA:265,2 +DA:266,2 +DA:267,2 +DA:274,5 +DA:278,5 +DA:282,37 +DA:283,37 +DA:285,37 +DA:287,11 +DA:288,11 +DA:290,8 +DA:291,8 +DA:293,4 +DA:294,4 +DA:296,9 +DA:297,9 +DA:299,1 +DA:300,1 +DA:303,5 +DA:304,5 +DA:306,3 +DA:308,9 +DA:310,4 +DA:311,4 +DA:313,1 +DA:315,36 +DA:317,31 +DA:323,5 +DA:329,26 +DA:333,37 +DA:337,2 +DA:340,2 +DA:341,2 +DA:342,2 +DA:346,2 +DA:347,2 +DA:349,2 +DA:352,2 +DA:353,6 +DA:354,6 +DA:357,2 +DA:358,1 +DA:361,1 +DA:364,1 +DA:367,1 +DA:370,2 +DA:375,2 +DA:380,2 +DA:390,2 +DA:401,7 +DA:402,3 +DA:403,4 +DA:405,3 +DA:408,1 +DA:409,1 +DA:411,1 +DA:412,1 +DA:413,1 +DA:414,1 +DA:415,1 +DA:416,1 +DA:418,1 +DA:419,1 +DA:421,1 +DA:431,1 +DA:432,1 +DA:433,0 +DA:434,0 +DA:437,1 +DA:438,1 +DA:439,1 +DA:440,1 +DA:441,1 +DA:442,1 +DA:443,1 +DA:445,7 +DA:446,7 +DA:448,0 +DA:455,0 +DA:460,0 +DA:461,0 +DA:463,0 +DA:468,0 +DA:469,0 +DA:473,7 +DA:485,7 +DA:490,1 +DA:491,1 +DA:493,7 +DA:498,1 +DA:499,1 +DA:503,0 +DA:515,1 +DA:516,1 +DA:517,1 +DA:520,1 +DA:521,1 +DA:522,1 +DA:524,1 +DA:526,1 +DA:531,1 +DA:534,1 +LF:241 +LH:221 +BRDA:26,0,0,1 +BRDA:26,0,1,31 +BRDA:26,1,0,32 +BRDA:26,1,1,5 +BRDA:35,2,0,3 +BRDA:35,2,1,2 +BRDA:35,2,2,11 +BRDA:35,2,3,8 +BRDA:35,2,4,4 +BRDA:35,2,5,3 +BRDA:35,2,6,1 +BRDA:35,2,7,5 +BRDA:35,2,8,4 +BRDA:35,2,9,0 +BRDA:46,3,0,2 +BRDA:46,3,1,1 +BRDA:61,4,0,3 +BRDA:61,4,1,8 +BRDA:70,5,0,3 +BRDA:70,5,1,5 +BRDA:72,6,0,2 +BRDA:72,6,1,3 +BRDA:73,7,0,5 +BRDA:73,7,1,4 +BRDA:73,7,2,4 +BRDA:73,7,3,2 +BRDA:78,8,0,1 +BRDA:78,8,1,2 +BRDA:79,9,0,3 +BRDA:79,9,1,1 +BRDA:79,9,2,1 +BRDA:79,9,3,0 +BRDA:87,10,0,1 +BRDA:87,10,1,5 +BRDA:93,11,0,1 +BRDA:93,11,1,5 +BRDA:96,12,0,1 +BRDA:96,12,1,5 +BRDA:101,13,0,2 +BRDA:101,13,1,2 +BRDA:103,14,0,1 +BRDA:103,14,1,1 +BRDA:104,15,0,2 +BRDA:104,15,1,1 +BRDA:104,15,2,1 +BRDA:104,15,3,0 +BRDA:109,16,0,1 +BRDA:109,16,1,0 +BRDA:110,17,0,1 +BRDA:110,17,1,1 +BRDA:110,17,2,1 +BRDA:110,17,3,0 +BRDA:118,18,0,1 +BRDA:118,18,1,3 +BRDA:124,19,0,1 +BRDA:124,19,1,3 +BRDA:127,20,0,1 +BRDA:127,20,1,3 +BRDA:135,21,0,1 +BRDA:135,21,1,2 +BRDA:138,22,0,1 +BRDA:138,22,1,2 +BRDA:152,23,0,1 +BRDA:152,23,1,0 +BRDA:158,24,0,2 +BRDA:158,24,1,0 +BRDA:158,25,0,2 +BRDA:158,25,1,2 +BRDA:171,26,0,0 +BRDA:171,26,1,0 +BRDA:171,27,0,0 +BRDA:171,27,1,0 +BRDA:183,28,0,1 +BRDA:183,28,1,0 +BRDA:186,29,0,1 +BRDA:186,29,1,0 +BRDA:189,30,0,1 +BRDA:189,30,1,0 +BRDA:202,31,0,4 +BRDA:202,31,1,1 +BRDA:208,32,0,6 +BRDA:208,32,1,2 +BRDA:208,33,0,8 +BRDA:208,33,1,8 +BRDA:221,34,0,0 +BRDA:221,34,1,1 +BRDA:221,35,0,1 +BRDA:221,35,1,0 +BRDA:258,36,0,3 +BRDA:258,36,1,2 +BRDA:265,37,0,2 +BRDA:265,37,1,0 +BRDA:285,38,0,11 +BRDA:285,38,1,8 +BRDA:285,38,2,4 +BRDA:285,38,3,9 +BRDA:285,38,4,4 +BRDA:285,38,5,1 +BRDA:297,39,0,1 +BRDA:297,39,1,5 +BRDA:297,39,2,5 +BRDA:297,39,3,3 +BRDA:317,40,0,5 +BRDA:317,40,1,26 +BRDA:318,41,0,31 +BRDA:318,41,1,10 +BRDA:318,41,2,10 +BRDA:318,41,3,3 +BRDA:318,41,4,7 +BRDA:318,41,5,2 +BRDA:357,42,0,1 +BRDA:357,42,1,1 +BRDA:401,43,0,3 +BRDA:401,43,1,4 +BRDA:403,44,0,3 +BRDA:403,44,1,1 +BRDA:432,45,0,0 +BRDA:432,45,1,1 +BRDA:432,46,0,1 +BRDA:432,46,1,1 +BRDA:446,47,0,0 +BRDA:446,47,1,7 +BRDA:455,48,0,0 +BRDA:455,48,1,0 +BRDA:456,49,0,0 +BRDA:456,49,1,0 +BRDA:456,49,2,0 +BRDA:463,50,0,0 +BRDA:463,50,1,0 +BRDA:464,51,0,0 +BRDA:464,51,1,0 +BRDA:464,51,2,0 +BRDA:485,52,0,1 +BRDA:485,52,1,6 +BRDA:486,53,0,7 +BRDA:486,53,1,6 +BRDA:486,53,2,6 +BRDA:493,54,0,1 +BRDA:493,54,1,6 +BRDA:494,55,0,7 +BRDA:494,55,1,7 +BRDA:494,55,2,7 +BRDA:506,56,0,0 +BRDA:506,56,1,0 +BRDA:507,57,0,0 +BRDA:507,57,1,0 +BRDA:516,58,0,1 +BRDA:516,58,1,0 +BRDA:521,59,0,1 +BRDA:521,59,1,0 +BRF:150 +BRH:115 +end_of_record +TN: +SF:v0\destinations\kafka\transform.js +FN:1,batch +FN:5,(anonymous_1) +FN:18,process +FNF:3 +FNH:3 +FNDA:1,batch +FNDA:4,(anonymous_1) +FNDA:5,process +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,4 +DA:7,4 +DA:9,1 +DA:15,1 +DA:19,5 +DA:23,5 +DA:26,1 +LF:11 +LH:11 +BRDA:21,0,0,5 +BRDA:21,0,1,0 +BRF:2 +BRH:1 +end_of_record +TN: +SF:v0\destinations\keen\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\keen\transform.js +FN:17,addAddons +FN:62,buildResponse +FN:78,processTrack +FN:108,processPage +FN:129,process +FN:149,(anonymous_5) +FN:156,(anonymous_6) +FNF:7 +FNH:7 +FNDA:4,addAddons +FNDA:4,buildResponse +FNDA:4,processTrack +FNDA:2,processPage +FNDA:5,process +FNDA:1,(anonymous_5) +FNDA:2,(anonymous_6) +DA:3,1 +DA:4,1 +DA:5,1 +DA:14,1 +DA:15,1 +DA:18,4 +DA:19,4 +DA:20,4 +DA:26,4 +DA:27,4 +DA:33,4 +DA:34,0 +DA:41,4 +DA:47,0 +DA:57,4 +DA:63,4 +DA:64,4 +DA:65,4 +DA:66,4 +DA:67,4 +DA:71,4 +DA:72,4 +DA:75,4 +DA:79,4 +DA:80,4 +DA:81,4 +DA:82,4 +DA:87,4 +DA:88,4 +DA:93,4 +DA:94,4 +DA:97,4 +DA:100,4 +DA:102,4 +DA:104,4 +DA:105,4 +DA:109,2 +DA:110,2 +DA:114,2 +DA:116,2 +DA:117,2 +DA:120,2 +DA:121,0 +DA:124,2 +DA:126,2 +DA:131,5 +DA:132,5 +DA:134,5 +DA:136,2 +DA:137,2 +DA:139,2 +DA:140,2 +DA:142,1 +DA:145,4 +DA:146,4 +DA:149,1 +DA:150,1 +DA:151,0 +DA:152,0 +DA:155,1 +DA:157,2 +DA:158,2 +DA:160,0 +DA:167,2 +DA:173,0 +DA:185,1 +DA:188,1 +LF:67 +LH:60 +BRDA:19,0,0,4 +BRDA:19,0,1,0 +BRDA:19,1,0,4 +BRDA:19,1,1,4 +BRDA:19,1,2,4 +BRDA:26,2,0,4 +BRDA:26,2,1,0 +BRDA:26,3,0,4 +BRDA:26,3,1,4 +BRDA:33,4,0,0 +BRDA:33,4,1,4 +BRDA:33,5,0,4 +BRDA:33,5,1,4 +BRDA:33,5,2,2 +BRDA:41,6,0,0 +BRDA:41,6,1,4 +BRDA:42,7,0,4 +BRDA:42,7,1,4 +BRDA:42,7,2,2 +BRDA:42,7,3,2 +BRDA:71,8,0,4 +BRDA:71,8,1,0 +BRDA:82,9,0,4 +BRDA:82,9,1,0 +BRDA:83,10,0,4 +BRDA:83,10,1,0 +BRDA:87,11,0,4 +BRDA:87,11,1,0 +BRDA:110,12,0,2 +BRDA:110,12,1,0 +BRDA:116,13,0,2 +BRDA:116,13,1,0 +BRDA:120,14,0,0 +BRDA:120,14,1,2 +BRDA:120,15,0,2 +BRDA:120,15,1,0 +BRDA:134,16,0,2 +BRDA:134,16,1,2 +BRDA:134,16,2,1 +BRDA:150,17,0,0 +BRDA:150,17,1,1 +BRDA:150,18,0,1 +BRDA:150,18,1,1 +BRDA:158,19,0,0 +BRDA:158,19,1,2 +BRDA:175,20,0,0 +BRDA:175,20,1,0 +BRDA:177,21,0,0 +BRDA:177,21,1,0 +BRDA:180,22,0,0 +BRDA:180,22,1,0 +BRF:51 +BRH:31 +end_of_record +TN: +SF:v0\destinations\kinesis\transform.js +FN:1,process +FNF:1 +FNH:1 +FNDA:5,process +DA:2,5 +DA:6,5 +DA:9,1 +LF:3 +LH:3 +BRDA:4,0,0,5 +BRDA:4,0,1,0 +BRF:2 +BRH:1 +end_of_record +TN: +SF:v0\destinations\kissmetrics\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:11,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\kissmetrics\transform.js +FN:25,toUnixTimestamp +FN:31,flatten +FN:39,step +FN:77,clean +FN:131,prefix +FN:133,(anonymous_5) +FN:146,getCurrency +FN:163,getRevenue +FN:175,buildResponse +FN:203,processIdentify +FN:222,processTrack +FN:264,(anonymous_11) +FN:277,processPage +FN:298,processScreen +FN:319,processAlias +FN:332,process +FN:352,(anonymous_16) +FN:374,(anonymous_17) +FN:381,(anonymous_18) +FNF:19 +FNH:16 +FNDA:7,toUnixTimestamp +FNDA:0,flatten +FNDA:0,step +FNDA:7,clean +FNDA:6,prefix +FNDA:37,(anonymous_5) +FNDA:4,getCurrency +FNDA:4,getRevenue +FNDA:10,buildResponse +FNDA:3,processIdentify +FNDA:4,processTrack +FNDA:2,(anonymous_11) +FNDA:2,processPage +FNDA:0,processScreen +FNDA:1,processAlias +FNDA:8,process +FNDA:4,(anonymous_16) +FNDA:1,(anonymous_17) +FNDA:2,(anonymous_18) +DA:9,1 +DA:10,1 +DA:11,1 +DA:12,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:26,7 +DA:27,7 +DA:32,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:37,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:46,0 +DA:47,0 +DA:49,0 +DA:51,0 +DA:52,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:66,0 +DA:71,0 +DA:73,0 +DA:78,7 +DA:80,7 +DA:81,35 +DA:82,35 +DA:83,35 +DA:86,35 +DA:87,0 +DA:88,0 +DA:92,35 +DA:93,0 +DA:94,0 +DA:98,35 +DA:99,7 +DA:100,7 +DA:105,28 +DA:106,28 +DA:107,28 +DA:112,0 +DA:113,0 +DA:114,0 +DA:117,0 +DA:118,0 +DA:119,0 +DA:123,0 +DA:124,0 +DA:127,7 +DA:132,6 +DA:133,6 +DA:134,37 +DA:135,0 +DA:136,37 +DA:137,2 +DA:138,2 +DA:140,35 +DA:143,6 +DA:147,4 +DA:148,2 +DA:149,2 +DA:151,0 +DA:152,0 +DA:155,0 +DA:156,0 +DA:158,0 +DA:159,0 +DA:164,4 +DA:165,4 +DA:168,4 +DA:169,0 +DA:172,4 +DA:176,10 +DA:177,10 +DA:178,10 +DA:179,10 +DA:180,10 +DA:183,10 +DA:204,3 +DA:205,3 +DA:208,3 +DA:209,3 +DA:211,3 +DA:214,3 +DA:215,3 +DA:216,3 +DA:217,3 +DA:219,3 +DA:223,4 +DA:224,4 +DA:225,4 +DA:226,4 +DA:227,4 +DA:228,4 +DA:232,4 +DA:233,4 +DA:235,4 +DA:236,4 +DA:237,2 +DA:240,4 +DA:241,4 +DA:242,1 +DA:245,4 +DA:247,4 +DA:248,4 +DA:249,2 +DA:251,4 +DA:252,2 +DA:255,4 +DA:256,4 +DA:257,4 +DA:258,4 +DA:259,4 +DA:261,4 +DA:262,4 +DA:263,4 +DA:264,1 +DA:265,2 +DA:266,2 +DA:267,2 +DA:268,2 +DA:270,2 +DA:271,2 +DA:274,4 +DA:278,2 +DA:279,2 +DA:283,2 +DA:285,2 +DA:286,0 +DA:289,2 +DA:290,0 +DA:293,2 +DA:295,2 +DA:299,0 +DA:300,0 +DA:304,0 +DA:306,0 +DA:307,0 +DA:310,0 +DA:311,0 +DA:314,0 +DA:316,0 +DA:320,1 +DA:321,1 +DA:322,1 +DA:323,1 +DA:325,1 +DA:326,1 +DA:327,1 +DA:328,1 +DA:329,1 +DA:333,8 +DA:336,8 +DA:337,8 +DA:339,8 +DA:341,2 +DA:342,2 +DA:343,2 +DA:344,2 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:351,2 +DA:352,2 +DA:353,4 +DA:354,4 +DA:356,2 +DA:358,3 +DA:359,3 +DA:360,3 +DA:361,3 +DA:363,1 +DA:364,1 +DA:365,1 +DA:366,1 +DA:368,0 +DA:369,0 +DA:371,8 +DA:374,1 +DA:375,1 +DA:376,0 +DA:377,0 +DA:380,1 +DA:382,2 +DA:383,2 +DA:385,0 +DA:392,2 +DA:398,0 +DA:410,1 +DA:413,1 +LF:201 +LH:136 +BRDA:32,0,0,0 +BRDA:32,0,1,0 +BRDA:34,1,0,0 +BRDA:34,1,1,0 +BRDA:41,2,0,0 +BRDA:41,2,1,0 +BRDA:43,3,0,0 +BRDA:43,3,1,0 +BRDA:46,4,0,0 +BRDA:46,4,1,0 +BRDA:49,5,0,0 +BRDA:49,5,1,0 +BRDA:51,6,0,0 +BRDA:51,6,1,0 +BRDA:56,7,0,0 +BRDA:56,7,1,0 +BRDA:61,8,0,0 +BRDA:61,8,1,0 +BRDA:61,9,0,0 +BRDA:61,9,1,0 +BRDA:61,9,2,0 +BRDA:61,9,3,0 +BRDA:81,10,0,35 +BRDA:81,10,1,0 +BRDA:83,11,0,0 +BRDA:83,11,1,35 +BRDA:83,12,0,35 +BRDA:83,12,1,35 +BRDA:86,13,0,0 +BRDA:86,13,1,35 +BRDA:92,14,0,0 +BRDA:92,14,1,35 +BRDA:98,15,0,7 +BRDA:98,15,1,28 +BRDA:105,16,0,28 +BRDA:105,16,1,0 +BRDA:118,17,0,0 +BRDA:118,17,1,0 +BRDA:134,18,0,0 +BRDA:134,18,1,37 +BRDA:136,19,0,2 +BRDA:136,19,1,35 +BRDA:147,20,0,2 +BRDA:147,20,1,2 +BRDA:148,21,0,2 +BRDA:148,21,1,0 +BRDA:151,22,0,0 +BRDA:151,22,1,0 +BRDA:158,23,0,0 +BRDA:158,23,1,0 +BRDA:168,24,0,0 +BRDA:168,24,1,4 +BRDA:168,25,0,4 +BRDA:168,25,1,2 +BRDA:168,25,2,0 +BRDA:179,26,0,1 +BRDA:179,26,1,9 +BRDA:206,27,0,3 +BRDA:206,27,1,0 +BRDA:215,28,0,0 +BRDA:215,28,1,3 +BRDA:227,29,0,4 +BRDA:227,29,1,0 +BRDA:236,30,0,2 +BRDA:236,30,1,2 +BRDA:241,31,0,1 +BRDA:241,31,1,3 +BRDA:247,32,0,4 +BRDA:247,32,1,0 +BRDA:248,33,0,2 +BRDA:248,33,1,2 +BRDA:251,34,0,2 +BRDA:251,34,1,2 +BRDA:256,35,0,0 +BRDA:256,35,1,4 +BRDA:263,36,0,1 +BRDA:263,36,1,3 +BRDA:266,37,0,2 +BRDA:266,37,1,0 +BRDA:268,38,0,0 +BRDA:268,38,1,2 +BRDA:279,39,0,2 +BRDA:279,39,1,0 +BRDA:285,40,0,0 +BRDA:285,40,1,2 +BRDA:289,41,0,0 +BRDA:289,41,1,2 +BRDA:289,42,0,2 +BRDA:289,42,1,0 +BRDA:300,43,0,0 +BRDA:300,43,1,0 +BRDA:306,44,0,0 +BRDA:306,44,1,0 +BRDA:310,45,0,0 +BRDA:310,45,1,0 +BRDA:310,46,0,0 +BRDA:310,46,1,0 +BRDA:339,47,0,2 +BRDA:339,47,1,0 +BRDA:339,47,2,2 +BRDA:339,47,3,3 +BRDA:339,47,4,1 +BRDA:339,47,5,0 +BRDA:375,48,0,0 +BRDA:375,48,1,1 +BRDA:375,49,0,1 +BRDA:375,49,1,1 +BRDA:383,50,0,0 +BRDA:383,50,1,2 +BRDA:400,51,0,0 +BRDA:400,51,1,0 +BRDA:402,52,0,0 +BRDA:402,52,1,0 +BRDA:405,53,0,0 +BRDA:405,53,1,0 +BRF:115 +BRH:49 +end_of_record +TN: +SF:v0\destinations\klaviyo\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:8,1 +DA:18,1 +DA:39,1 +DA:45,1 +DA:51,1 +DA:56,1 +DA:61,1 +DA:63,1 +LF:10 +LH:10 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\klaviyo\transform.js +FN:43,(anonymous_0) +FN:101,(anonymous_1) +FN:163,(anonymous_2) +FN:178,(anonymous_3) +FN:207,(anonymous_4) +FN:271,(anonymous_5) +FN:339,(anonymous_6) +FN:370,(anonymous_7) +FN:375,(anonymous_8) +FN:382,(anonymous_9) +FNF:10 +FNH:10 +FNDA:4,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:6,(anonymous_2) +FNDA:6,(anonymous_3) +FNDA:2,(anonymous_4) +FNDA:1,(anonymous_5) +FNDA:12,(anonymous_6) +FNDA:12,(anonymous_7) +FNDA:1,(anonymous_8) +FNDA:2,(anonymous_9) +DA:4,1 +DA:5,1 +DA:6,1 +DA:11,1 +DA:21,1 +DA:38,1 +DA:43,1 +DA:45,4 +DA:46,4 +DA:47,4 +DA:52,4 +DA:57,4 +DA:58,0 +DA:59,0 +DA:62,4 +DA:63,2 +DA:66,2 +DA:67,2 +DA:70,2 +DA:74,4 +DA:76,4 +DA:77,4 +DA:90,0 +DA:101,1 +DA:103,4 +DA:104,4 +DA:108,2 +DA:109,2 +DA:110,2 +DA:118,2 +DA:123,4 +DA:124,4 +DA:125,1 +DA:126,1 +DA:129,4 +DA:134,4 +DA:140,4 +DA:141,4 +DA:142,0 +DA:143,0 +DA:146,4 +DA:150,4 +DA:151,4 +DA:152,4 +DA:153,4 +DA:154,4 +DA:163,1 +DA:164,6 +DA:169,6 +DA:175,6 +DA:176,6 +DA:178,1 +DA:179,6 +DA:180,6 +DA:181,6 +DA:182,6 +DA:183,3 +DA:184,3 +DA:185,3 +DA:186,3 +DA:188,3 +DA:189,3 +DA:193,1 +DA:198,2 +DA:199,2 +DA:205,2 +DA:206,1 +DA:207,1 +DA:208,2 +DA:212,2 +DA:213,2 +DA:214,2 +DA:217,1 +DA:218,0 +DA:220,1 +DA:224,2 +DA:225,2 +DA:231,2 +DA:232,0 +DA:238,2 +DA:239,0 +DA:242,3 +DA:243,3 +DA:244,3 +DA:245,1 +DA:246,1 +DA:248,3 +DA:249,3 +DA:250,0 +DA:251,0 +DA:253,3 +DA:255,5 +DA:256,0 +DA:258,5 +DA:259,5 +DA:260,5 +DA:261,5 +DA:262,5 +DA:271,1 +DA:272,1 +DA:276,1 +DA:278,1 +DA:282,1 +DA:288,1 +DA:289,1 +DA:290,0 +DA:291,0 +DA:293,1 +DA:295,1 +DA:296,0 +DA:298,1 +DA:299,0 +DA:302,1 +DA:303,1 +DA:316,0 +DA:319,1 +DA:320,1 +DA:321,1 +DA:325,1 +DA:326,1 +DA:330,1 +DA:333,1 +DA:334,1 +DA:335,1 +DA:339,1 +DA:340,12 +DA:341,0 +DA:346,12 +DA:350,12 +DA:352,4 +DA:353,4 +DA:354,4 +DA:357,6 +DA:358,6 +DA:359,5 +DA:361,1 +DA:362,1 +DA:363,1 +DA:365,1 +DA:367,10 +DA:370,1 +DA:371,12 +DA:372,10 +DA:375,1 +DA:376,1 +DA:377,0 +DA:378,0 +DA:381,1 +DA:383,2 +DA:384,2 +DA:386,0 +DA:393,2 +DA:399,0 +DA:411,1 +DA:414,1 +LF:155 +LH:134 +BRDA:46,0,0,4 +BRDA:46,0,1,0 +BRDA:57,1,0,0 +BRDA:57,1,1,4 +BRDA:62,2,0,2 +BRDA:62,2,1,2 +BRDA:67,3,0,0 +BRDA:67,3,1,2 +BRDA:70,4,0,2 +BRDA:70,4,1,0 +BRDA:104,5,0,2 +BRDA:104,5,1,2 +BRDA:105,6,0,4 +BRDA:105,6,1,4 +BRDA:105,6,2,2 +BRDA:109,7,0,2 +BRDA:109,7,1,0 +BRDA:124,8,0,1 +BRDA:124,8,1,3 +BRDA:141,9,0,0 +BRDA:141,9,1,4 +BRDA:181,10,0,6 +BRDA:181,10,1,0 +BRDA:182,11,0,3 +BRDA:182,11,1,3 +BRDA:182,12,0,6 +BRDA:182,12,1,3 +BRDA:189,13,0,1 +BRDA:189,13,1,2 +BRDA:190,14,0,3 +BRDA:190,14,1,1 +BRDA:205,15,0,1 +BRDA:205,15,1,1 +BRDA:205,16,0,2 +BRDA:205,16,1,1 +BRDA:213,17,0,2 +BRDA:213,17,1,0 +BRDA:217,18,0,0 +BRDA:217,18,1,1 +BRDA:231,19,0,0 +BRDA:231,19,1,2 +BRDA:238,20,0,0 +BRDA:238,20,1,2 +BRDA:244,21,0,1 +BRDA:244,21,1,2 +BRDA:244,22,0,3 +BRDA:244,22,1,3 +BRDA:249,23,0,0 +BRDA:249,23,1,3 +BRDA:255,24,0,0 +BRDA:255,24,1,5 +BRDA:289,25,0,0 +BRDA:289,25,1,1 +BRDA:293,26,0,1 +BRDA:293,26,1,0 +BRDA:295,27,0,0 +BRDA:295,27,1,1 +BRDA:298,28,0,0 +BRDA:298,28,1,1 +BRDA:340,29,0,0 +BRDA:340,29,1,12 +BRDA:350,30,0,4 +BRDA:350,30,1,2 +BRDA:350,30,2,6 +BRDA:350,30,3,1 +BRDA:350,30,4,1 +BRDA:376,31,0,0 +BRDA:376,31,1,1 +BRDA:376,32,0,1 +BRDA:376,32,1,1 +BRDA:384,33,0,0 +BRDA:384,33,1,2 +BRDA:401,34,0,0 +BRDA:401,34,1,0 +BRDA:403,35,0,0 +BRDA:403,35,1,0 +BRDA:406,36,0,0 +BRDA:406,36,1,0 +BRF:78 +BRH:52 +end_of_record +TN: +SF:v0\destinations\kustomer\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:12,1 +DA:14,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\kustomer\transform.js +FN:28,(anonymous_0) +FN:96,(anonymous_1) +FN:217,(anonymous_2) +FN:244,(anonymous_3) +FN:248,(anonymous_4) +FN:255,(anonymous_5) +FNF:6 +FNH:6 +FNDA:6,(anonymous_0) +FNDA:14,(anonymous_1) +FNDA:14,(anonymous_2) +FNDA:14,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:2,(anonymous_5) +DA:2,1 +DA:3,1 +DA:8,1 +DA:19,1 +DA:24,1 +DA:28,1 +DA:29,6 +DA:34,6 +DA:35,6 +DA:36,6 +DA:37,6 +DA:39,6 +DA:40,3 +DA:43,6 +DA:44,4 +DA:52,6 +DA:53,4 +DA:61,6 +DA:62,5 +DA:69,6 +DA:70,6 +DA:72,5 +DA:73,2 +DA:75,3 +DA:76,3 +DA:81,5 +DA:82,5 +DA:91,6 +DA:96,1 +DA:97,14 +DA:99,14 +DA:110,14 +DA:111,6 +DA:112,6 +DA:113,6 +DA:114,6 +DA:115,6 +DA:116,1 +DA:123,6 +DA:124,4 +DA:132,6 +DA:133,5 +DA:141,6 +DA:142,4 +DA:151,6 +DA:152,4 +DA:156,2 +DA:158,6 +DA:167,8 +DA:168,8 +DA:170,8 +DA:172,3 +DA:173,1 +DA:175,3 +DA:177,2 +DA:178,1 +DA:180,2 +DA:182,8 +DA:183,8 +DA:184,0 +DA:186,8 +DA:193,8 +DA:194,0 +DA:195,0 +DA:196,0 +DA:200,14 +DA:201,14 +DA:202,14 +DA:203,14 +DA:206,14 +DA:210,14 +DA:211,14 +DA:214,0 +DA:217,1 +DA:218,14 +DA:219,0 +DA:225,14 +DA:227,6 +DA:228,6 +DA:230,3 +DA:231,3 +DA:233,2 +DA:234,2 +DA:236,3 +DA:237,3 +DA:239,0 +DA:241,14 +DA:244,1 +DA:245,14 +DA:248,1 +DA:249,1 +DA:250,0 +DA:251,0 +DA:254,1 +DA:256,2 +DA:257,2 +DA:259,0 +DA:266,2 +DA:272,0 +DA:284,1 +DA:287,1 +LF:101 +LH:90 +BRDA:39,0,0,3 +BRDA:39,0,1,3 +BRDA:39,1,0,6 +BRDA:39,1,1,3 +BRDA:39,1,2,3 +BRDA:43,2,0,4 +BRDA:43,2,1,2 +BRDA:43,3,0,6 +BRDA:43,3,1,4 +BRDA:52,4,0,4 +BRDA:52,4,1,2 +BRDA:52,5,0,6 +BRDA:52,5,1,4 +BRDA:61,6,0,5 +BRDA:61,6,1,1 +BRDA:70,7,0,5 +BRDA:70,7,1,1 +BRDA:72,8,0,2 +BRDA:72,8,1,3 +BRDA:77,9,0,3 +BRDA:77,9,1,0 +BRDA:77,10,0,3 +BRDA:77,10,1,0 +BRDA:77,10,2,0 +BRDA:77,10,3,0 +BRDA:78,11,0,3 +BRDA:78,11,1,0 +BRDA:78,12,0,3 +BRDA:78,12,1,0 +BRDA:78,13,0,3 +BRDA:78,13,1,0 +BRDA:78,14,0,3 +BRDA:78,14,1,0 +BRDA:81,15,0,5 +BRDA:81,15,1,0 +BRDA:110,16,0,6 +BRDA:110,16,1,8 +BRDA:115,17,0,1 +BRDA:115,17,1,5 +BRDA:123,18,0,4 +BRDA:123,18,1,2 +BRDA:123,19,0,6 +BRDA:123,19,1,5 +BRDA:132,20,0,5 +BRDA:132,20,1,1 +BRDA:132,21,0,6 +BRDA:132,21,1,5 +BRDA:141,22,0,4 +BRDA:141,22,1,2 +BRDA:141,23,0,6 +BRDA:141,23,1,4 +BRDA:151,24,0,4 +BRDA:151,24,1,2 +BRDA:170,25,0,3 +BRDA:170,25,1,2 +BRDA:172,26,0,1 +BRDA:172,26,1,2 +BRDA:177,27,0,1 +BRDA:177,27,1,1 +BRDA:183,28,0,0 +BRDA:183,28,1,8 +BRDA:193,29,0,0 +BRDA:193,29,1,8 +BRDA:195,30,0,0 +BRDA:195,30,1,0 +BRDA:200,31,0,14 +BRDA:200,31,1,0 +BRDA:203,32,0,2 +BRDA:203,32,1,12 +BRDA:218,33,0,0 +BRDA:218,33,1,14 +BRDA:225,34,0,6 +BRDA:225,34,1,3 +BRDA:225,34,2,2 +BRDA:225,34,3,3 +BRDA:225,34,4,0 +BRDA:249,35,0,0 +BRDA:249,35,1,1 +BRDA:249,36,0,1 +BRDA:249,36,1,1 +BRDA:257,37,0,0 +BRDA:257,37,1,2 +BRDA:274,38,0,0 +BRDA:274,38,1,0 +BRDA:276,39,0,0 +BRDA:276,39,1,0 +BRDA:279,40,0,0 +BRDA:279,40,1,0 +BRF:88 +BRH:64 +end_of_record +TN: +SF:v0\destinations\kustomer\util.js +FN:23,(anonymous_0) +FN:30,(anonymous_1) +FN:39,(anonymous_2) +FN:48,(anonymous_3) +FN:53,(anonymous_4) +FN:54,(anonymous_5) +FN:58,(anonymous_6) +FN:63,(anonymous_7) +FN:68,(anonymous_8) +FN:82,(anonymous_9) +FN:110,(anonymous_10) +FN:136,(anonymous_11) +FNF:12 +FNH:2 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:13,(anonymous_10) +FNDA:13,(anonymous_11) +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:20,1 +DA:24,0 +DA:25,0 +DA:30,1 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:36,0 +DA:39,1 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:45,0 +DA:48,1 +DA:49,0 +DA:50,0 +DA:53,1 +DA:54,0 +DA:55,0 +DA:58,1 +DA:59,0 +DA:60,0 +DA:63,1 +DA:64,0 +DA:65,0 +DA:68,1 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:91,0 +DA:92,0 +DA:95,0 +DA:96,0 +DA:100,0 +DA:105,0 +DA:107,0 +DA:110,1 +DA:111,13 +DA:112,13 +DA:114,1 +DA:115,1 +DA:120,0 +DA:127,12 +DA:129,0 +DA:136,1 +DA:138,13 +DA:139,13 +DA:145,0 +DA:146,0 +DA:148,0 +DA:150,13 +DA:153,1 +LF:72 +LH:25 +BRDA:33,0,0,0 +BRDA:33,0,1,0 +BRDA:42,1,0,0 +BRDA:42,1,1,0 +BRDA:76,2,0,0 +BRDA:76,2,1,0 +BRDA:81,3,0,0 +BRDA:81,3,1,0 +BRDA:81,4,0,0 +BRDA:81,4,1,0 +BRDA:83,5,0,0 +BRDA:83,5,1,0 +BRDA:85,6,0,0 +BRDA:85,6,1,0 +BRDA:87,7,0,0 +BRDA:87,7,1,0 +BRDA:91,8,0,0 +BRDA:91,8,1,0 +BRDA:95,9,0,0 +BRDA:95,9,1,0 +BRDA:112,10,0,1 +BRDA:112,10,1,12 +BRDA:112,10,2,0 +BRDA:114,11,0,1 +BRDA:114,11,1,0 +BRDA:114,12,0,1 +BRDA:114,12,1,1 +BRDA:114,12,2,1 +BRDA:122,13,0,0 +BRDA:122,13,1,0 +BRDA:130,14,0,0 +BRDA:130,14,1,0 +BRDA:131,15,0,0 +BRDA:131,15,1,0 +BRDA:145,16,0,0 +BRDA:145,16,1,0 +BRF:36 +BRH:6 +end_of_record +TN: +SF:v0\destinations\leanplum\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:26,1 +DA:27,1 +DA:29,1 +DA:31,1 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\leanplum\transform.js +FN:18,preparePayload +FN:49,responseBuilderSimple +FN:65,startSession +FN:69,processSingleMessage +FN:107,process +FN:120,(anonymous_5) +FN:127,(anonymous_6) +FNF:7 +FNH:7 +FNDA:29,preparePayload +FNDA:29,responseBuilderSimple +FNDA:13,startSession +FNDA:16,processSingleMessage +FNDA:16,process +FNDA:1,(anonymous_5) +FNDA:2,(anonymous_6) +DA:1,1 +DA:7,1 +DA:16,1 +DA:19,29 +DA:20,29 +DA:27,27 +DA:28,0 +DA:31,27 +DA:32,27 +DA:37,27 +DA:38,1 +DA:39,1 +DA:41,27 +DA:42,27 +DA:43,27 +DA:46,27 +DA:50,29 +DA:51,29 +DA:52,29 +DA:53,29 +DA:56,29 +DA:57,29 +DA:58,27 +DA:62,27 +DA:66,13 +DA:70,16 +DA:71,0 +DA:76,16 +DA:79,16 +DA:81,2 +DA:82,2 +DA:84,1 +DA:85,1 +DA:87,2 +DA:88,2 +DA:90,11 +DA:91,11 +DA:93,0 +DA:97,16 +DA:100,14 +DA:101,13 +DA:104,1 +DA:109,16 +DA:110,16 +DA:112,2 +DA:117,14 +DA:120,1 +DA:121,1 +DA:122,0 +DA:123,0 +DA:126,1 +DA:128,2 +DA:129,2 +DA:131,0 +DA:138,2 +DA:144,0 +DA:156,1 +DA:159,1 +LF:58 +LH:51 +BRDA:27,0,0,0 +BRDA:27,0,1,27 +BRDA:31,1,0,27 +BRDA:31,1,1,0 +BRDA:37,2,0,1 +BRDA:37,2,1,26 +BRDA:41,3,0,27 +BRDA:41,3,1,0 +BRDA:70,4,0,0 +BRDA:70,4,1,16 +BRDA:79,5,0,2 +BRDA:79,5,1,1 +BRDA:79,5,2,2 +BRDA:79,5,3,11 +BRDA:79,5,4,0 +BRDA:100,6,0,13 +BRDA:100,6,1,1 +BRDA:113,7,0,2 +BRDA:113,7,1,0 +BRDA:114,8,0,2 +BRDA:114,8,1,2 +BRDA:121,9,0,0 +BRDA:121,9,1,1 +BRDA:121,10,0,1 +BRDA:121,10,1,1 +BRDA:129,11,0,0 +BRDA:129,11,1,2 +BRDA:146,12,0,0 +BRDA:146,12,1,0 +BRDA:148,13,0,0 +BRDA:148,13,1,0 +BRDA:151,14,0,0 +BRDA:151,14,1,0 +BRF:33 +BRH:19 +end_of_record +TN: +SF:v0\destinations\mailchimp\config.js +FN:1,(anonymous_0) +FNF:1 +FNH:1 +FNDA:28,(anonymous_0) +DA:1,1 +DA:2,28 +DA:3,28 +DA:4,28 +DA:7,1 +DA:13,1 +DA:18,1 +DA:26,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\mailchimp\transform.js +FN:24,filterTagValue +FN:33,getMailChimpEndpoint +FN:37,checkIfMailExists +FN:59,checkIfDoubleOptIn +FN:78,getSubscribeUserUrl +FN:83,getUpdateUserTraitsUrl +FN:88,responseBuilderSimple +FN:120,getPayload +FN:130,(anonymous_8) +FN:137,(anonymous_9) +FN:153,(anonymous_10) +FN:173,getTransformedJSON +FN:203,getMailChimpConfig +FN:206,(anonymous_13) +FN:237,processIdentify +FN:243,processSingleMessage +FN:251,process +FN:255,(anonymous_17) +FN:262,(anonymous_18) +FNF:19 +FNH:19 +FNDA:13,filterTagValue +FNDA:28,getMailChimpEndpoint +FNDA:17,checkIfMailExists +FNDA:2,checkIfDoubleOptIn +FNDA:2,getSubscribeUserUrl +FNDA:7,getUpdateUserTraitsUrl +FNDA:9,responseBuilderSimple +FNDA:8,getPayload +FNDA:3,(anonymous_8) +FNDA:6,(anonymous_9) +FNDA:16,(anonymous_10) +FNDA:11,getTransformedJSON +FNDA:11,getMailChimpConfig +FNDA:35,(anonymous_13) +FNDA:11,processIdentify +FNDA:12,processSingleMessage +FNDA:12,process +FNDA:1,(anonymous_17) +FNDA:2,(anonymous_18) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:10,1 +DA:20,1 +DA:21,1 +DA:25,13 +DA:26,13 +DA:27,13 +DA:28,7 +DA:30,6 +DA:34,28 +DA:38,17 +DA:39,0 +DA:41,17 +DA:42,17 +DA:44,17 +DA:45,17 +DA:46,17 +DA:52,13 +DA:54,4 +DA:56,17 +DA:61,2 +DA:62,2 +DA:63,2 +DA:70,1 +DA:75,1 +DA:79,2 +DA:84,7 +DA:85,7 +DA:89,9 +DA:90,9 +DA:92,9 +DA:93,9 +DA:94,7 +DA:95,7 +DA:97,2 +DA:98,2 +DA:100,9 +DA:101,9 +DA:104,9 +DA:105,1 +DA:110,8 +DA:127,8 +DA:128,3 +DA:129,3 +DA:130,3 +DA:131,3 +DA:132,3 +DA:134,0 +DA:137,3 +DA:138,6 +DA:139,3 +DA:140,3 +DA:141,2 +DA:142,2 +DA:145,3 +DA:148,5 +DA:149,5 +DA:150,5 +DA:151,5 +DA:153,5 +DA:154,16 +DA:155,5 +DA:157,11 +DA:158,11 +DA:162,5 +DA:163,2 +DA:164,1 +DA:168,4 +DA:170,0 +DA:174,11 +DA:175,11 +DA:176,2 +DA:177,2 +DA:180,9 +DA:182,9 +DA:186,9 +DA:187,9 +DA:188,1 +DA:191,8 +DA:193,8 +DA:200,7 +DA:204,11 +DA:205,11 +DA:206,11 +DA:207,35 +DA:209,11 +DA:210,11 +DA:212,11 +DA:213,11 +DA:215,11 +DA:216,11 +DA:218,2 +DA:220,2 +DA:222,0 +DA:223,0 +DA:227,11 +DA:228,11 +DA:229,0 +DA:230,0 +DA:231,0 +DA:234,11 +DA:238,11 +DA:239,11 +DA:240,9 +DA:244,12 +DA:245,1 +DA:248,11 +DA:252,12 +DA:255,1 +DA:256,1 +DA:257,0 +DA:258,0 +DA:261,1 +DA:263,2 +DA:264,2 +DA:266,0 +DA:273,2 +DA:279,0 +DA:291,1 +DA:294,1 +LF:123 +LH:111 +BRDA:27,0,0,7 +BRDA:27,0,1,6 +BRDA:38,1,0,0 +BRDA:38,1,1,17 +BRDA:72,2,0,1 +BRDA:72,2,1,0 +BRDA:93,3,0,7 +BRDA:93,3,1,2 +BRDA:104,4,0,1 +BRDA:104,4,1,8 +BRDA:104,5,0,9 +BRDA:104,5,1,6 +BRDA:116,6,0,8 +BRDA:116,6,1,0 +BRDA:127,7,0,3 +BRDA:127,7,1,5 +BRDA:127,8,0,8 +BRDA:127,8,1,3 +BRDA:131,9,0,3 +BRDA:131,9,1,0 +BRDA:138,10,0,3 +BRDA:138,10,1,3 +BRDA:140,11,0,2 +BRDA:140,11,1,1 +BRDA:149,12,0,5 +BRDA:149,12,1,0 +BRDA:154,13,0,5 +BRDA:154,13,1,11 +BRDA:162,14,0,2 +BRDA:162,14,1,3 +BRDA:164,15,0,0 +BRDA:164,15,1,1 +BRDA:175,16,0,2 +BRDA:175,16,1,9 +BRDA:182,17,0,3 +BRDA:182,17,1,6 +BRDA:187,18,0,1 +BRDA:187,18,1,8 +BRDA:207,19,0,11 +BRDA:207,19,1,11 +BRDA:207,19,2,11 +BRDA:207,19,3,2 +BRDA:207,19,4,0 +BRDA:228,20,0,0 +BRDA:228,20,1,11 +BRDA:230,21,0,0 +BRDA:230,21,1,0 +BRDA:244,22,0,1 +BRDA:244,22,1,11 +BRDA:256,23,0,0 +BRDA:256,23,1,1 +BRDA:256,24,0,1 +BRDA:256,24,1,1 +BRDA:264,25,0,0 +BRDA:264,25,1,2 +BRDA:281,26,0,0 +BRDA:281,26,1,0 +BRDA:283,27,0,0 +BRDA:283,27,1,0 +BRDA:286,28,0,0 +BRDA:286,28,1,0 +BRF:61 +BRH:43 +end_of_record +TN: +SF:v0\destinations\marketo\config.js +FN:14,(anonymous_0) +FNF:1 +FNH:1 +FNDA:27,(anonymous_0) +DA:1,2 +DA:3,2 +DA:7,2 +DA:8,2 +DA:9,2 +DA:11,2 +DA:12,2 +DA:14,2 +DA:15,27 +DA:48,2 +LF:10 +LH:10 +BRDA:42,0,0,2 +BRDA:42,0,1,25 +BRF:2 +BRH:2 +end_of_record +TN: +SF:v0\destinations\marketo\transform.js +FN:55,(anonymous_0) +FN:56,(anonymous_1) +FN:97,(anonymous_2) +FN:103,(anonymous_3) +FN:145,(anonymous_4) +FN:146,(anonymous_5) +FN:177,(anonymous_6) +FN:183,(anonymous_7) +FN:210,(anonymous_8) +FN:309,(anonymous_9) +FN:336,(anonymous_10) +FN:395,(anonymous_11) +FN:467,(anonymous_12) +FN:499,(anonymous_13) +FN:508,(anonymous_14) +FN:550,(anonymous_15) +FN:567,(anonymous_16) +FN:584,(anonymous_17) +FN:605,(anonymous_18) +FN:617,(anonymous_19) +FNF:20 +FNH:14 +FNDA:14,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:7,(anonymous_6) +FNDA:4,(anonymous_7) +FNDA:8,(anonymous_8) +FNDA:3,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:9,(anonymous_11) +FNDA:7,(anonymous_12) +FNDA:8,(anonymous_13) +FNDA:14,(anonymous_14) +FNDA:12,(anonymous_15) +FNDA:2,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:3,(anonymous_19) +DA:4,2 +DA:5,2 +DA:6,2 +DA:14,2 +DA:29,2 +DA:30,2 +DA:31,2 +DA:36,2 +DA:41,2 +DA:43,2 +DA:44,2 +DA:45,2 +DA:55,2 +DA:56,14 +DA:57,4 +DA:58,4 +DA:68,4 +DA:73,3 +DA:74,3 +DA:75,3 +DA:77,0 +DA:78,0 +DA:97,2 +DA:103,0 +DA:104,0 +DA:105,0 +DA:109,0 +DA:110,0 +DA:125,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:136,0 +DA:145,2 +DA:146,0 +DA:147,0 +DA:148,0 +DA:156,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:164,0 +DA:167,0 +DA:177,2 +DA:183,7 +DA:184,4 +DA:185,4 +DA:195,4 +DA:200,4 +DA:201,4 +DA:202,4 +DA:203,4 +DA:206,0 +DA:210,2 +DA:219,8 +DA:220,8 +DA:228,8 +DA:230,8 +DA:231,7 +DA:235,8 +DA:237,7 +DA:238,0 +DA:241,7 +DA:251,8 +DA:253,0 +DA:254,0 +DA:261,0 +DA:276,8 +DA:283,0 +DA:299,8 +DA:309,2 +DA:311,3 +DA:312,1 +DA:315,3 +DA:317,3 +DA:318,3 +DA:319,1 +DA:331,2 +DA:333,2 +DA:335,2 +DA:336,1 +DA:337,1 +DA:338,1 +DA:340,1 +DA:342,1 +DA:345,2 +DA:346,2 +DA:350,2 +DA:351,1 +DA:353,2 +DA:354,2 +DA:360,2 +DA:361,1 +DA:366,1 +DA:367,1 +DA:372,1 +DA:373,1 +DA:375,1 +DA:376,1 +DA:383,2 +DA:395,2 +DA:411,9 +DA:413,9 +DA:414,9 +DA:415,1 +DA:428,8 +DA:429,8 +DA:430,1 +DA:443,7 +DA:444,7 +DA:448,7 +DA:449,1 +DA:463,6 +DA:466,6 +DA:467,6 +DA:469,7 +DA:470,1 +DA:471,1 +DA:472,1 +DA:477,6 +DA:490,6 +DA:492,6 +DA:499,2 +DA:500,8 +DA:501,8 +DA:502,8 +DA:503,8 +DA:504,8 +DA:505,8 +DA:508,2 +DA:509,14 +DA:510,1 +DA:521,13 +DA:522,13 +DA:525,13 +DA:527,3 +DA:528,2 +DA:530,9 +DA:531,6 +DA:533,1 +DA:547,8 +DA:550,2 +DA:551,12 +DA:552,11 +DA:553,0 +DA:563,11 +DA:564,5 +DA:567,2 +DA:570,2 +DA:571,0 +DA:572,0 +DA:575,2 +DA:576,2 +DA:578,0 +DA:583,0 +DA:584,0 +DA:589,0 +DA:593,2 +DA:594,0 +DA:604,0 +DA:605,0 +DA:610,0 +DA:616,2 +DA:618,3 +DA:619,3 +DA:625,0 +DA:630,0 +DA:639,2 +DA:642,2 +LF:170 +LH:129 +BRDA:73,0,0,3 +BRDA:73,0,1,0 +BRDA:103,1,0,0 +BRDA:103,1,1,0 +BRDA:104,2,0,0 +BRDA:104,2,1,0 +BRDA:116,3,0,0 +BRDA:116,3,1,0 +BRDA:130,4,0,0 +BRDA:130,4,1,0 +BRDA:132,5,0,0 +BRDA:132,5,1,0 +BRDA:132,6,0,0 +BRDA:132,6,1,0 +BRDA:132,6,2,0 +BRDA:161,7,0,0 +BRDA:161,7,1,0 +BRDA:163,8,0,0 +BRDA:163,8,1,0 +BRDA:163,9,0,0 +BRDA:163,9,1,0 +BRDA:163,9,2,0 +BRDA:183,10,0,7 +BRDA:183,10,1,6 +BRDA:189,11,0,4 +BRDA:189,11,1,3 +BRDA:190,12,0,1 +BRDA:190,12,1,3 +BRDA:200,13,0,4 +BRDA:200,13,1,0 +BRDA:202,14,0,4 +BRDA:202,14,1,0 +BRDA:202,15,0,4 +BRDA:202,15,1,4 +BRDA:202,15,2,4 +BRDA:230,16,0,7 +BRDA:230,16,1,1 +BRDA:235,17,0,7 +BRDA:235,17,1,1 +BRDA:237,18,0,0 +BRDA:237,18,1,7 +BRDA:251,19,0,0 +BRDA:251,19,1,8 +BRDA:253,20,0,0 +BRDA:253,20,1,0 +BRDA:276,21,0,0 +BRDA:276,21,1,8 +BRDA:311,22,0,1 +BRDA:311,22,1,2 +BRDA:318,23,0,1 +BRDA:318,23,1,2 +BRDA:335,24,0,1 +BRDA:335,24,1,1 +BRDA:350,25,0,1 +BRDA:350,25,1,1 +BRDA:360,26,0,1 +BRDA:360,26,1,1 +BRDA:366,27,0,1 +BRDA:366,27,1,0 +BRDA:372,28,0,1 +BRDA:372,28,1,0 +BRDA:414,29,0,1 +BRDA:414,29,1,8 +BRDA:414,30,0,9 +BRDA:414,30,1,2 +BRDA:429,31,0,1 +BRDA:429,31,1,7 +BRDA:448,32,0,1 +BRDA:448,32,1,6 +BRDA:469,33,0,1 +BRDA:469,33,1,6 +BRDA:471,34,0,1 +BRDA:471,34,1,0 +BRDA:509,35,0,1 +BRDA:509,35,1,13 +BRDA:525,36,0,3 +BRDA:525,36,1,9 +BRDA:525,36,2,1 +BRDA:552,37,0,0 +BRDA:552,37,1,11 +BRDA:570,38,0,0 +BRDA:570,38,1,2 +BRDA:570,39,0,2 +BRDA:570,39,1,2 +BRDA:585,40,0,0 +BRDA:585,40,1,0 +BRDA:586,41,0,0 +BRDA:586,41,1,0 +BRDA:593,42,0,0 +BRDA:593,42,1,2 +BRDA:632,43,0,0 +BRDA:632,43,1,0 +BRDA:633,44,0,0 +BRDA:633,44,1,0 +BRF:94 +BRH:52 +end_of_record +TN: +SF:v0\destinations\marketo\util.js +FN:20,(anonymous_0) +FN:75,(anonymous_1) +FN:111,(anonymous_2) +FN:123,(anonymous_3) +FN:130,(anonymous_4) +FN:164,(anonymous_5) +FNF:6 +FNH:3 +FNDA:1,(anonymous_0) +FNDA:8,(anonymous_1) +FNDA:8,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +DA:5,2 +DA:9,2 +DA:10,2 +DA:11,2 +DA:12,2 +DA:14,2 +DA:15,2 +DA:16,2 +DA:17,2 +DA:20,2 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,0 +DA:42,1 +DA:43,0 +DA:57,1 +DA:58,1 +DA:75,2 +DA:76,8 +DA:77,8 +DA:79,8 +DA:80,3 +DA:83,5 +DA:84,4 +DA:87,1 +DA:88,1 +DA:92,0 +DA:111,2 +DA:112,8 +DA:113,8 +DA:114,8 +DA:123,2 +DA:124,0 +DA:125,0 +DA:126,0 +DA:130,2 +DA:131,0 +DA:132,0 +DA:134,0 +DA:135,0 +DA:151,0 +DA:157,0 +DA:164,2 +DA:165,0 +DA:166,0 +DA:167,0 +DA:170,2 +LF:48 +LH:33 +BRDA:27,0,0,0 +BRDA:27,0,1,1 +BRDA:27,1,0,1 +BRDA:27,1,1,1 +BRDA:42,2,0,0 +BRDA:42,2,1,1 +BRDA:42,3,0,1 +BRDA:42,3,1,1 +BRDA:57,4,0,1 +BRDA:57,4,1,0 +BRDA:57,5,0,1 +BRDA:57,5,1,1 +BRDA:77,6,0,8 +BRDA:77,6,1,0 +BRDA:79,7,0,3 +BRDA:79,7,1,5 +BRDA:79,8,0,8 +BRDA:79,8,1,8 +BRDA:83,9,0,4 +BRDA:83,9,1,1 +BRDA:83,10,0,5 +BRDA:83,10,1,5 +BRDA:87,11,0,1 +BRDA:87,11,1,0 +BRDA:87,12,0,1 +BRDA:87,12,1,1 +BRDA:134,13,0,0 +BRDA:134,13,1,0 +BRF:28 +BRH:21 +end_of_record +TN: +SF:v0\destinations\moengage\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:12,1 +DA:18,1 +DA:24,1 +DA:42,1 +DA:44,1 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\moengage\transform.js +FN:21,responseBuilderSimple +FN:92,(anonymous_1) +FN:135,(anonymous_2) +FN:139,(anonymous_3) +FN:146,(anonymous_4) +FNF:5 +FNH:5 +FNDA:12,responseBuilderSimple +FNDA:13,(anonymous_1) +FNDA:13,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:2,(anonymous_4) +DA:1,1 +DA:2,1 +DA:9,1 +DA:19,1 +DA:22,12 +DA:23,12 +DA:24,12 +DA:26,12 +DA:28,1 +DA:29,1 +DA:31,9 +DA:32,9 +DA:34,1 +DA:35,1 +DA:37,1 +DA:39,11 +DA:40,11 +DA:47,11 +DA:48,11 +DA:49,11 +DA:52,6 +DA:53,6 +DA:58,6 +DA:59,6 +DA:62,1 +DA:63,1 +DA:68,1 +DA:69,1 +DA:72,4 +DA:73,4 +DA:79,4 +DA:81,0 +DA:84,11 +DA:87,0 +DA:89,11 +DA:92,1 +DA:93,13 +DA:94,1 +DA:100,12 +DA:103,12 +DA:105,7 +DA:106,7 +DA:109,6 +DA:115,1 +DA:122,6 +DA:124,4 +DA:126,4 +DA:127,4 +DA:129,1 +DA:132,10 +DA:135,1 +DA:136,13 +DA:139,1 +DA:140,1 +DA:141,0 +DA:142,0 +DA:145,1 +DA:147,2 +DA:148,2 +DA:150,0 +DA:157,2 +DA:163,0 +DA:175,1 +DA:178,1 +LF:64 +LH:58 +BRDA:26,0,0,1 +BRDA:26,0,1,9 +BRDA:26,0,2,1 +BRDA:26,0,3,1 +BRDA:47,1,0,11 +BRDA:47,1,1,1 +BRDA:48,2,0,11 +BRDA:48,2,1,0 +BRDA:49,3,0,6 +BRDA:49,3,1,1 +BRDA:49,3,2,4 +BRDA:49,3,3,0 +BRDA:93,4,0,1 +BRDA:93,4,1,12 +BRDA:103,5,0,7 +BRDA:103,5,1,4 +BRDA:103,5,2,1 +BRDA:109,6,0,1 +BRDA:109,6,1,5 +BRDA:110,7,0,6 +BRDA:110,7,1,1 +BRDA:110,7,2,1 +BRDA:140,8,0,0 +BRDA:140,8,1,1 +BRDA:140,9,0,1 +BRDA:140,9,1,1 +BRDA:148,10,0,0 +BRDA:148,10,1,2 +BRDA:165,11,0,0 +BRDA:165,11,1,0 +BRDA:167,12,0,0 +BRDA:167,12,1,0 +BRDA:170,13,0,0 +BRDA:170,13,1,0 +BRF:34 +BRH:24 +end_of_record +TN: +SF:v0\destinations\monetate\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:20,1 +DA:21,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\monetate\transform.js +FN:17,(anonymous_0) +FN:34,(anonymous_1) +FN:50,(anonymous_2) +FN:56,(anonymous_3) +FN:75,(anonymous_4) +FN:102,(anonymous_5) +FN:126,responseBuilder +FN:142,(anonymous_7) +FN:147,(anonymous_8) +FN:171,track +FN:205,(anonymous_10) +FN:215,(anonymous_11) +FN:259,(anonymous_12) +FN:274,(anonymous_13) +FN:293,(anonymous_14) +FN:309,(anonymous_15) +FN:344,page +FN:350,screen +FN:356,process +FN:377,(anonymous_19) +FN:384,(anonymous_20) +FNF:21 +FNH:21 +FNDA:29,(anonymous_0) +FNDA:205,(anonymous_1) +FNDA:205,(anonymous_2) +FNDA:32,(anonymous_3) +FNDA:72,(anonymous_4) +FNDA:72,(anonymous_5) +FNDA:21,responseBuilder +FNDA:29,(anonymous_7) +FNDA:136,(anonymous_8) +FNDA:20,track +FNDA:6,(anonymous_10) +FNDA:4,(anonymous_11) +FNDA:4,(anonymous_12) +FNDA:2,(anonymous_13) +FNDA:6,(anonymous_14) +FNDA:4,(anonymous_15) +FNDA:7,page +FNDA:2,screen +FNDA:32,process +FNDA:1,(anonymous_19) +FNDA:2,(anonymous_20) +DA:1,1 +DA:2,1 +DA:12,1 +DA:13,1 +DA:15,1 +DA:17,1 +DA:18,29 +DA:19,0 +DA:22,29 +DA:23,29 +DA:25,29 +DA:26,29 +DA:28,0 +DA:29,0 +DA:31,29 +DA:34,1 +DA:36,205 +DA:37,34 +DA:38,171 +DA:41,99 +DA:42,99 +DA:45,72 +DA:47,205 +DA:50,1 +DA:52,205 +DA:53,173 +DA:54,32 +DA:55,32 +DA:56,32 +DA:57,32 +DA:58,32 +DA:59,32 +DA:60,3 +DA:65,0 +DA:68,32 +DA:69,29 +DA:72,205 +DA:75,1 +DA:76,72 +DA:79,72 +DA:83,72 +DA:84,72 +DA:85,205 +DA:87,205 +DA:88,205 +DA:89,205 +DA:90,166 +DA:91,39 +DA:94,9 +DA:95,9 +DA:99,72 +DA:102,1 +DA:104,72 +DA:105,29 +DA:108,72 +DA:111,0 +DA:115,72 +DA:120,72 +DA:121,63 +DA:127,21 +DA:128,21 +DA:131,21 +DA:133,21 +DA:134,21 +DA:135,21 +DA:139,21 +DA:142,1 +DA:144,29 +DA:145,29 +DA:147,29 +DA:148,136 +DA:150,136 +DA:151,136 +DA:153,82 +DA:154,72 +DA:156,10 +DA:158,54 +DA:160,0 +DA:166,29 +DA:168,0 +DA:172,20 +DA:174,20 +DA:175,19 +DA:177,1 +DA:181,20 +DA:182,20 +DA:183,20 +DA:184,20 +DA:185,5 +DA:186,3 +DA:187,3 +DA:197,2 +DA:202,15 +DA:203,4 +DA:204,3 +DA:205,6 +DA:207,3 +DA:208,1 +DA:213,2 +DA:216,4 +DA:220,1 +DA:225,11 +DA:226,4 +DA:227,4 +DA:228,4 +DA:234,2 +DA:251,2 +DA:256,7 +DA:257,2 +DA:258,2 +DA:260,4 +DA:266,2 +DA:267,1 +DA:272,1 +DA:275,2 +DA:276,2 +DA:277,2 +DA:278,2 +DA:288,5 +DA:289,3 +DA:290,3 +DA:291,3 +DA:292,3 +DA:294,6 +DA:300,3 +DA:301,1 +DA:306,2 +DA:310,4 +DA:311,4 +DA:312,4 +DA:313,4 +DA:341,12 +DA:345,7 +DA:347,7 +DA:351,2 +DA:353,2 +DA:358,32 +DA:359,32 +DA:362,32 +DA:363,31 +DA:365,20 +DA:367,7 +DA:369,2 +DA:371,2 +DA:374,1 +DA:377,1 +DA:378,1 +DA:379,0 +DA:380,0 +DA:383,1 +DA:385,2 +DA:386,2 +DA:388,0 +DA:395,2 +DA:401,0 +DA:413,1 +DA:416,1 +LF:157 +LH:146 +BRDA:18,0,0,0 +BRDA:18,0,1,29 +BRDA:23,1,0,29 +BRDA:23,1,1,0 +BRDA:36,2,0,34 +BRDA:36,2,1,171 +BRDA:38,3,0,99 +BRDA:38,3,1,72 +BRDA:52,4,0,173 +BRDA:52,4,1,32 +BRDA:54,5,0,32 +BRDA:54,5,1,0 +BRDA:57,6,0,32 +BRDA:57,6,1,0 +BRDA:59,7,0,3 +BRDA:59,7,1,29 +BRDA:68,8,0,29 +BRDA:68,8,1,3 +BRDA:79,9,0,72 +BRDA:79,9,1,0 +BRDA:79,10,0,72 +BRDA:79,10,1,72 +BRDA:89,11,0,166 +BRDA:89,11,1,39 +BRDA:91,12,0,9 +BRDA:91,12,1,30 +BRDA:104,13,0,29 +BRDA:104,13,1,43 +BRDA:104,14,0,72 +BRDA:104,14,1,29 +BRDA:108,15,0,0 +BRDA:108,15,1,72 +BRDA:120,16,0,63 +BRDA:120,16,1,9 +BRDA:120,17,0,72 +BRDA:120,17,1,72 +BRDA:120,17,2,72 +BRDA:127,18,0,21 +BRDA:127,18,1,0 +BRDA:144,19,0,29 +BRDA:144,19,1,0 +BRDA:144,20,0,29 +BRDA:144,20,1,29 +BRDA:151,21,0,82 +BRDA:151,21,1,54 +BRDA:153,22,0,72 +BRDA:153,22,1,10 +BRDA:158,23,0,0 +BRDA:158,23,1,54 +BRDA:174,24,0,19 +BRDA:174,24,1,1 +BRDA:182,25,0,20 +BRDA:182,25,1,0 +BRDA:183,26,0,20 +BRDA:183,26,1,0 +BRDA:184,27,0,5 +BRDA:184,27,1,15 +BRDA:185,28,0,3 +BRDA:185,28,1,2 +BRDA:186,29,0,3 +BRDA:186,29,1,2 +BRDA:202,30,0,4 +BRDA:202,30,1,11 +BRDA:203,31,0,3 +BRDA:203,31,1,1 +BRDA:203,32,0,4 +BRDA:203,32,1,4 +BRDA:207,33,0,1 +BRDA:207,33,1,2 +BRDA:225,34,0,4 +BRDA:225,34,1,7 +BRDA:226,35,0,4 +BRDA:226,35,1,1 +BRDA:227,36,0,4 +BRDA:227,36,1,2 +BRDA:228,37,0,2 +BRDA:228,37,1,2 +BRDA:229,38,0,4 +BRDA:229,38,1,3 +BRDA:229,38,2,2 +BRDA:229,38,3,2 +BRDA:238,39,0,2 +BRDA:238,39,1,0 +BRDA:243,40,0,2 +BRDA:243,40,1,0 +BRDA:256,41,0,2 +BRDA:256,41,1,5 +BRDA:257,42,0,2 +BRDA:257,42,1,0 +BRDA:257,43,0,2 +BRDA:257,43,1,2 +BRDA:260,44,0,4 +BRDA:260,44,1,4 +BRDA:260,44,2,2 +BRDA:260,44,3,2 +BRDA:260,44,4,2 +BRDA:266,45,0,1 +BRDA:266,45,1,1 +BRDA:276,46,0,2 +BRDA:276,46,1,1 +BRDA:276,46,2,1 +BRDA:277,47,0,2 +BRDA:277,47,1,2 +BRDA:279,48,0,2 +BRDA:279,48,1,0 +BRDA:282,49,0,2 +BRDA:282,49,1,0 +BRDA:288,50,0,3 +BRDA:288,50,1,2 +BRDA:291,51,0,3 +BRDA:291,51,1,0 +BRDA:291,52,0,3 +BRDA:291,52,1,3 +BRDA:291,52,2,3 +BRDA:294,53,0,6 +BRDA:294,53,1,6 +BRDA:294,53,2,4 +BRDA:294,53,3,4 +BRDA:294,53,4,4 +BRDA:300,54,0,1 +BRDA:300,54,1,2 +BRDA:311,55,0,4 +BRDA:311,55,1,2 +BRDA:311,55,2,2 +BRDA:312,56,0,4 +BRDA:312,56,1,0 +BRDA:314,57,0,4 +BRDA:314,57,1,0 +BRDA:317,58,0,4 +BRDA:317,58,1,0 +BRDA:359,59,0,31 +BRDA:359,59,1,1 +BRDA:362,60,0,31 +BRDA:362,60,1,1 +BRDA:363,61,0,20 +BRDA:363,61,1,7 +BRDA:363,61,2,2 +BRDA:363,61,3,2 +BRDA:378,62,0,0 +BRDA:378,62,1,1 +BRDA:378,63,0,1 +BRDA:378,63,1,1 +BRDA:386,64,0,0 +BRDA:386,64,1,2 +BRDA:403,65,0,0 +BRDA:403,65,1,0 +BRDA:405,66,0,0 +BRDA:405,66,1,0 +BRDA:408,67,0,0 +BRDA:408,67,1,0 +BRF:150 +BRH:122 +end_of_record +TN: +SF:v0\destinations\mp\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:18,1 +DA:20,1 +DA:41,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\mp\transform.js +FN:34,getEventTime +FN:38,responseBuilderSimple +FN:95,processRevenueEvents +FN:115,getEventValueForTrackEvent +FN:150,processTrack +FN:159,getTransformedJSON +FN:192,processIdentifyEvents +FN:287,processPageOrScreenEvents +FN:322,processAliasEvents +FN:340,processGroupEvents +FN:348,(anonymous_10) +FN:396,processSingleMessage +FN:422,process +FN:430,(anonymous_13) +FN:437,(anonymous_14) +FNF:15 +FNH:15 +FNDA:4,getEventTime +FNDA:45,responseBuilderSimple +FNDA:4,processRevenueEvents +FNDA:9,getEventValueForTrackEvent +FNDA:9,processTrack +FNDA:17,getTransformedJSON +FNDA:17,processIdentifyEvents +FNDA:7,processPageOrScreenEvents +FNDA:3,processAliasEvents +FNDA:3,processGroupEvents +FNDA:2,(anonymous_10) +FNDA:40,processSingleMessage +FNDA:40,process +FNDA:1,(anonymous_13) +FNDA:2,(anonymous_14) +DA:1,1 +DA:2,1 +DA:3,1 +DA:20,1 +DA:25,1 +DA:27,1 +DA:29,1 +DA:30,1 +DA:32,1 +DA:35,4 +DA:39,45 +DA:41,45 +DA:45,45 +DA:50,18 +DA:51,18 +DA:52,15 +DA:56,3 +DA:57,1 +DA:62,2 +DA:66,2 +DA:67,1 +DA:73,1 +DA:81,43 +DA:85,43 +DA:86,43 +DA:87,43 +DA:88,43 +DA:89,43 +DA:90,43 +DA:92,43 +DA:96,4 +DA:97,4 +DA:101,4 +DA:107,4 +DA:116,9 +DA:120,9 +DA:122,9 +DA:131,9 +DA:132,8 +DA:133,8 +DA:134,8 +DA:137,9 +DA:142,9 +DA:151,9 +DA:152,9 +DA:153,4 +DA:155,9 +DA:156,7 +DA:160,17 +DA:161,17 +DA:162,17 +DA:163,14 +DA:166,17 +DA:178,17 +DA:179,10 +DA:180,7 +DA:181,7 +DA:183,10 +DA:184,4 +DA:185,4 +DA:189,17 +DA:193,17 +DA:195,17 +DA:197,17 +DA:202,17 +DA:203,17 +DA:205,3 +DA:206,2 +DA:207,2 +DA:208,1 +DA:209,1 +DA:210,1 +DA:212,3 +DA:214,17 +DA:215,14 +DA:216,14 +DA:217,14 +DA:219,17 +DA:221,17 +DA:228,17 +DA:229,1 +DA:231,17 +DA:235,17 +DA:257,2 +DA:264,2 +DA:271,2 +DA:276,2 +DA:281,2 +DA:284,17 +DA:288,7 +DA:292,7 +DA:293,7 +DA:302,7 +DA:303,7 +DA:305,7 +DA:306,2 +DA:308,7 +DA:309,4 +DA:310,4 +DA:311,4 +DA:314,7 +DA:315,7 +DA:319,7 +DA:323,3 +DA:324,1 +DA:329,2 +DA:337,2 +DA:341,3 +DA:342,3 +DA:347,3 +DA:348,2 +DA:349,2 +DA:350,2 +DA:351,2 +DA:358,2 +DA:364,2 +DA:366,2 +DA:375,2 +DA:382,2 +DA:387,2 +DA:391,1 +DA:393,2 +DA:397,40 +DA:398,0 +DA:403,40 +DA:405,9 +DA:408,7 +DA:411,17 +DA:413,3 +DA:415,3 +DA:418,1 +DA:423,40 +DA:430,1 +DA:431,1 +DA:432,0 +DA:433,0 +DA:436,1 +DA:438,2 +DA:439,2 +DA:441,0 +DA:448,2 +DA:454,0 +DA:466,1 +DA:469,1 +LF:144 +LH:139 +BRDA:41,0,0,10 +BRDA:41,0,1,35 +BRDA:45,1,0,18 +BRDA:45,1,1,27 +BRDA:46,2,0,45 +BRDA:46,2,1,26 +BRDA:46,2,2,22 +BRDA:51,3,0,15 +BRDA:51,3,1,3 +BRDA:53,4,0,1 +BRDA:53,4,1,14 +BRDA:56,5,0,1 +BRDA:56,5,1,2 +BRDA:63,6,0,1 +BRDA:63,6,1,1 +BRDA:66,7,0,1 +BRDA:66,7,1,1 +BRDA:89,8,0,43 +BRDA:89,8,1,2 +BRDA:104,9,0,4 +BRDA:104,9,1,4 +BRDA:127,10,0,9 +BRDA:127,10,1,6 +BRDA:131,11,0,8 +BRDA:131,11,1,1 +BRDA:131,12,0,9 +BRDA:131,12,1,8 +BRDA:152,13,0,4 +BRDA:152,13,1,5 +BRDA:152,14,0,9 +BRDA:152,14,1,9 +BRDA:162,15,0,14 +BRDA:162,15,1,3 +BRDA:178,16,0,10 +BRDA:178,16,1,7 +BRDA:179,17,0,7 +BRDA:179,17,1,3 +BRDA:183,18,0,4 +BRDA:183,18,1,6 +BRDA:203,19,0,3 +BRDA:203,19,1,14 +BRDA:203,20,0,17 +BRDA:203,20,1,3 +BRDA:205,21,0,2 +BRDA:205,21,1,1 +BRDA:208,22,0,1 +BRDA:208,22,1,0 +BRDA:214,23,0,14 +BRDA:214,23,1,3 +BRDA:214,24,0,17 +BRDA:214,24,1,14 +BRDA:224,25,0,17 +BRDA:224,25,1,15 +BRDA:225,26,0,17 +BRDA:225,26,1,3 +BRDA:228,27,0,1 +BRDA:228,27,1,16 +BRDA:235,28,0,2 +BRDA:235,28,1,15 +BRDA:235,29,0,17 +BRDA:235,29,1,2 +BRDA:235,29,2,2 +BRDA:272,30,0,2 +BRDA:272,30,1,0 +BRDA:298,31,0,7 +BRDA:298,31,1,1 +BRDA:302,32,0,7 +BRDA:302,32,1,0 +BRDA:305,33,0,2 +BRDA:305,33,1,5 +BRDA:308,34,0,4 +BRDA:308,34,1,3 +BRDA:308,35,0,7 +BRDA:308,35,1,4 +BRDA:314,36,0,4 +BRDA:314,36,1,3 +BRDA:323,37,0,1 +BRDA:323,37,1,2 +BRDA:323,38,0,3 +BRDA:323,38,1,2 +BRDA:332,39,0,2 +BRDA:332,39,1,1 +BRDA:347,40,0,2 +BRDA:347,40,1,1 +BRDA:350,41,0,2 +BRDA:350,41,1,0 +BRDA:353,42,0,2 +BRDA:353,42,1,1 +BRDA:383,43,0,1 +BRDA:383,43,1,1 +BRDA:397,44,0,0 +BRDA:397,44,1,40 +BRDA:403,45,0,9 +BRDA:403,45,1,3 +BRDA:403,45,2,7 +BRDA:403,45,3,17 +BRDA:403,45,4,3 +BRDA:403,45,5,3 +BRDA:403,45,6,1 +BRDA:431,46,0,0 +BRDA:431,46,1,1 +BRDA:431,47,0,1 +BRDA:431,47,1,1 +BRDA:439,48,0,0 +BRDA:439,48,1,2 +BRDA:456,49,0,0 +BRDA:456,49,1,0 +BRDA:458,50,0,0 +BRDA:458,50,1,0 +BRDA:461,51,0,0 +BRDA:461,51,1,0 +BRF:111 +BRH:98 +end_of_record +TN: +SF:v0\destinations\mssql\transform.js +FN:5,processSingleMessage +FN:9,getDataTypeOverride +FN:11,process +FNF:3 +FNH:3 +FNDA:124,processSingleMessage +FNDA:2917,getDataTypeOverride +FNDA:124,process +DA:1,3 +DA:3,3 +DA:6,124 +DA:12,124 +DA:13,124 +DA:14,124 +DA:15,124 +DA:25,3 +LF:8 +LH:8 +BRDA:12,0,0,124 +BRDA:12,0,1,0 +BRDA:21,1,0,6 +BRDA:21,1,1,118 +BRF:4 +BRH:3 +end_of_record +TN: +SF:v0\destinations\ometria\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:4,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:53,1 +DA:64,1 +DA:90,1 +DA:108,1 +DA:114,1 +DA:124,1 +DA:134,1 +DA:298,1 +LF:14 +LH:14 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\ometria\transform.js +FN:40,(anonymous_0) +FN:123,(anonymous_1) +FN:216,(anonymous_2) +FN:238,(anonymous_3) +FN:262,(anonymous_4) +FN:270,(anonymous_5) +FN:277,(anonymous_6) +FNF:7 +FNH:7 +FNDA:7,(anonymous_0) +FNDA:6,(anonymous_1) +FNDA:13,(anonymous_2) +FNDA:11,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:1,(anonymous_5) +FNDA:2,(anonymous_6) +DA:3,1 +DA:18,1 +DA:32,1 +DA:38,1 +DA:40,1 +DA:41,7 +DA:42,7 +DA:44,7 +DA:45,7 +DA:46,7 +DA:47,7 +DA:53,7 +DA:54,7 +DA:58,7 +DA:61,7 +DA:62,7 +DA:63,7 +DA:67,0 +DA:69,7 +DA:70,7 +DA:73,7 +DA:74,7 +DA:76,7 +DA:80,0 +DA:82,7 +DA:86,0 +DA:90,7 +DA:91,0 +DA:93,7 +DA:94,7 +DA:103,7 +DA:107,7 +DA:108,3 +DA:109,3 +DA:110,3 +DA:111,2 +DA:112,2 +DA:114,1 +DA:115,1 +DA:116,1 +DA:120,7 +DA:123,1 +DA:124,6 +DA:125,6 +DA:126,0 +DA:129,6 +DA:130,6 +DA:131,6 +DA:132,5 +DA:133,5 +DA:134,0 +DA:136,5 +DA:137,5 +DA:138,0 +DA:144,5 +DA:154,5 +DA:155,0 +DA:161,5 +DA:162,5 +DA:163,5 +DA:164,5 +DA:165,5 +DA:166,5 +DA:167,5 +DA:173,5 +DA:174,5 +DA:177,5 +DA:178,5 +DA:179,4 +DA:180,4 +DA:181,4 +DA:184,5 +DA:185,1 +DA:187,5 +DA:188,2 +DA:190,5 +DA:194,1 +DA:195,1 +DA:196,0 +DA:198,1 +DA:199,0 +DA:201,1 +DA:202,1 +DA:203,1 +DA:204,1 +DA:205,1 +DA:211,1 +DA:213,1 +DA:216,1 +DA:217,13 +DA:218,0 +DA:220,13 +DA:222,13 +DA:224,7 +DA:225,7 +DA:227,6 +DA:228,6 +DA:230,0 +DA:232,13 +DA:238,1 +DA:239,11 +DA:240,11 +DA:241,0 +DA:247,11 +DA:248,0 +DA:251,11 +DA:252,11 +DA:253,11 +DA:254,11 +DA:255,11 +DA:256,11 +DA:259,11 +DA:262,1 +DA:263,1 +DA:264,0 +DA:265,0 +DA:267,1 +DA:268,1 +DA:269,1 +DA:270,1 +DA:271,1 +DA:272,1 +DA:276,1 +DA:277,1 +DA:278,2 +DA:279,2 +DA:280,2 +DA:281,2 +DA:283,0 +DA:297,1 +DA:299,1 +DA:300,1 +DA:301,1 +DA:304,1 +DA:305,1 +DA:310,1 +DA:313,1 +LF:137 +LH:120 +BRDA:45,0,0,7 +BRDA:45,0,1,0 +BRDA:53,1,0,7 +BRDA:53,1,1,0 +BRDA:62,2,0,7 +BRDA:62,2,1,0 +BRDA:63,3,0,0 +BRDA:63,3,1,7 +BRDA:64,4,0,7 +BRDA:64,4,1,0 +BRDA:69,5,0,7 +BRDA:69,5,1,0 +BRDA:73,6,0,7 +BRDA:73,6,1,4 +BRDA:75,7,0,7 +BRDA:75,7,1,6 +BRDA:76,8,0,0 +BRDA:76,8,1,7 +BRDA:77,9,0,7 +BRDA:77,9,1,0 +BRDA:82,10,0,0 +BRDA:82,10,1,7 +BRDA:83,11,0,7 +BRDA:83,11,1,0 +BRDA:90,12,0,0 +BRDA:90,12,1,7 +BRDA:107,13,0,3 +BRDA:107,13,1,4 +BRDA:110,14,0,2 +BRDA:110,14,1,1 +BRDA:110,15,0,3 +BRDA:110,15,1,3 +BRDA:111,16,0,2 +BRDA:111,16,1,0 +BRDA:112,17,0,2 +BRDA:112,17,1,0 +BRDA:114,18,0,1 +BRDA:114,18,1,0 +BRDA:115,19,0,1 +BRDA:115,19,1,0 +BRDA:116,20,0,1 +BRDA:116,20,1,0 +BRDA:125,21,0,0 +BRDA:125,21,1,6 +BRDA:131,22,0,5 +BRDA:131,22,1,1 +BRDA:133,23,0,0 +BRDA:133,23,1,5 +BRDA:137,24,0,0 +BRDA:137,24,1,5 +BRDA:154,25,0,0 +BRDA:154,25,1,5 +BRDA:154,26,0,5 +BRDA:154,26,1,5 +BRDA:165,27,0,5 +BRDA:165,27,1,0 +BRDA:173,28,0,5 +BRDA:173,28,1,0 +BRDA:178,29,0,4 +BRDA:178,29,1,1 +BRDA:180,30,0,4 +BRDA:180,30,1,0 +BRDA:180,31,0,4 +BRDA:180,31,1,4 +BRDA:184,32,0,1 +BRDA:184,32,1,4 +BRDA:187,33,0,2 +BRDA:187,33,1,3 +BRDA:195,34,0,0 +BRDA:195,34,1,1 +BRDA:198,35,0,0 +BRDA:198,35,1,1 +BRDA:203,36,0,1 +BRDA:203,36,1,0 +BRDA:217,37,0,0 +BRDA:217,37,1,13 +BRDA:222,38,0,7 +BRDA:222,38,1,6 +BRDA:222,38,2,0 +BRDA:240,39,0,0 +BRDA:240,39,1,11 +BRDA:247,40,0,0 +BRDA:247,40,1,11 +BRDA:263,41,0,0 +BRDA:263,41,1,1 +BRDA:263,42,0,1 +BRDA:263,42,1,1 +BRDA:286,43,0,0 +BRDA:286,43,1,0 +BRDA:288,44,0,0 +BRDA:288,44,1,0 +BRDA:291,45,0,0 +BRDA:291,45,1,0 +BRDA:297,46,0,1 +BRDA:297,46,1,0 +BRF:95 +BRH:57 +end_of_record +TN: +SF:v0\destinations\ometria\util.js +FN:17,(anonymous_0) +FN:22,(anonymous_1) +FN:27,(anonymous_2) +FN:30,(anonymous_3) +FN:44,(anonymous_4) +FN:47,(anonymous_5) +FN:92,(anonymous_6) +FN:114,(anonymous_7) +FNF:8 +FNH:8 +FNDA:6,(anonymous_0) +FNDA:2,(anonymous_1) +FNDA:3,(anonymous_2) +FNDA:3,(anonymous_3) +FNDA:4,(anonymous_4) +FNDA:4,(anonymous_5) +FNDA:3,(anonymous_6) +FNDA:7,(anonymous_7) +DA:5,1 +DA:6,1 +DA:15,1 +DA:17,1 +DA:18,6 +DA:19,6 +DA:22,1 +DA:23,2 +DA:24,2 +DA:27,1 +DA:28,3 +DA:29,3 +DA:30,3 +DA:31,3 +DA:32,3 +DA:33,3 +DA:35,0 +DA:41,3 +DA:44,1 +DA:45,4 +DA:46,4 +DA:47,4 +DA:48,4 +DA:49,4 +DA:54,4 +DA:55,4 +DA:56,1 +DA:58,3 +DA:59,3 +DA:60,3 +DA:63,4 +DA:64,4 +DA:65,4 +DA:71,4 +DA:72,0 +DA:75,4 +DA:79,0 +DA:81,4 +DA:83,0 +DA:89,4 +DA:92,1 +DA:93,3 +DA:94,2 +DA:95,2 +DA:97,1 +DA:111,1 +DA:114,1 +DA:115,7 +DA:116,7 +DA:117,0 +DA:118,0 +DA:120,7 +DA:121,0 +DA:122,0 +DA:124,7 +DA:128,0 +DA:129,0 +DA:131,7 +DA:135,0 +DA:136,0 +DA:138,7 +DA:142,0 +DA:143,0 +DA:145,7 +DA:148,1 +LF:65 +LH:51 +BRDA:29,0,0,3 +BRDA:29,0,1,0 +BRDA:32,1,0,3 +BRDA:32,1,1,0 +BRDA:32,2,0,3 +BRDA:32,2,1,3 +BRDA:32,2,2,3 +BRDA:46,3,0,4 +BRDA:46,3,1,0 +BRDA:49,4,0,4 +BRDA:49,4,1,0 +BRDA:50,5,0,4 +BRDA:50,5,1,4 +BRDA:50,5,2,4 +BRDA:50,5,3,4 +BRDA:55,6,0,1 +BRDA:55,6,1,3 +BRDA:55,7,0,4 +BRDA:55,7,1,3 +BRDA:59,8,0,3 +BRDA:59,8,1,0 +BRDA:59,9,0,3 +BRDA:59,9,1,3 +BRDA:63,10,0,4 +BRDA:63,10,1,0 +BRDA:71,11,0,0 +BRDA:71,11,1,4 +BRDA:75,12,0,0 +BRDA:75,12,1,4 +BRDA:76,13,0,4 +BRDA:76,13,1,0 +BRDA:93,14,0,2 +BRDA:93,14,1,1 +BRDA:116,15,0,0 +BRDA:116,15,1,7 +BRDA:116,16,0,7 +BRDA:116,16,1,0 +BRDA:120,17,0,0 +BRDA:120,17,1,7 +BRDA:120,18,0,7 +BRDA:120,18,1,2 +BRDA:124,19,0,0 +BRDA:124,19,1,7 +BRDA:125,20,0,7 +BRDA:125,20,1,0 +BRDA:131,21,0,0 +BRDA:131,21,1,7 +BRDA:132,22,0,7 +BRDA:132,22,1,0 +BRDA:138,23,0,0 +BRDA:138,23,1,7 +BRDA:139,24,0,7 +BRDA:139,24,1,0 +BRF:53 +BRH:35 +end_of_record +TN: +SF:v0\destinations\pardot\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:10,1 +DA:17,1 +DA:19,1 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\pardot\transform.js +FN:65,(anonymous_0) +FN:77,(anonymous_1) +FN:90,(anonymous_2) +FN:103,(anonymous_3) +FN:127,(anonymous_4) +FN:164,(anonymous_5) +FN:199,(anonymous_6) +FN:203,(anonymous_7) +FN:210,(anonymous_8) +FNF:9 +FNH:9 +FNDA:5,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:4,(anonymous_2) +FNDA:4,(anonymous_3) +FNDA:5,(anonymous_4) +FNDA:5,(anonymous_5) +FNDA:5,(anonymous_6) +FNDA:1,(anonymous_7) +FNDA:5,(anonymous_8) +DA:36,1 +DA:37,1 +DA:38,1 +DA:48,1 +DA:49,1 +DA:51,1 +DA:52,1 +DA:65,1 +DA:67,5 +DA:68,5 +DA:69,1 +DA:74,4 +DA:77,1 +DA:78,4 +DA:79,4 +DA:80,4 +DA:81,4 +DA:82,4 +DA:86,4 +DA:87,4 +DA:90,1 +DA:91,4 +DA:103,1 +DA:104,4 +DA:105,4 +DA:106,4 +DA:107,2 +DA:108,2 +DA:111,2 +DA:113,1 +DA:114,1 +DA:116,1 +DA:117,1 +DA:119,0 +DA:122,0 +DA:124,2 +DA:127,1 +DA:128,5 +DA:129,5 +DA:131,4 +DA:132,4 +DA:133,4 +DA:135,4 +DA:136,4 +DA:137,4 +DA:138,0 +DA:150,4 +DA:157,4 +DA:158,4 +DA:161,4 +DA:164,1 +DA:166,5 +DA:167,0 +DA:172,5 +DA:173,0 +DA:179,5 +DA:180,0 +DA:186,5 +DA:187,5 +DA:189,5 +DA:191,0 +DA:196,4 +DA:199,1 +DA:200,5 +DA:203,1 +DA:204,1 +DA:205,0 +DA:206,0 +DA:209,1 +DA:211,5 +DA:212,5 +DA:218,1 +DA:231,1 +DA:234,1 +LF:74 +LH:65 +BRDA:68,0,0,1 +BRDA:68,0,1,4 +BRDA:91,1,0,4 +BRDA:91,1,1,2 +BRDA:91,1,2,2 +BRDA:91,1,3,2 +BRDA:106,2,0,2 +BRDA:106,2,1,2 +BRDA:111,3,0,1 +BRDA:111,3,1,1 +BRDA:111,3,2,0 +BRDA:132,4,0,2 +BRDA:132,4,1,2 +BRDA:132,5,0,4 +BRDA:132,5,1,2 +BRDA:137,6,0,0 +BRDA:137,6,1,4 +BRDA:137,7,0,4 +BRDA:137,7,1,2 +BRDA:157,8,0,4 +BRDA:157,8,1,0 +BRDA:166,9,0,0 +BRDA:166,9,1,5 +BRDA:172,10,0,0 +BRDA:172,10,1,5 +BRDA:179,11,0,0 +BRDA:179,11,1,5 +BRDA:186,12,0,5 +BRDA:186,12,1,0 +BRDA:204,13,0,0 +BRDA:204,13,1,1 +BRDA:204,14,0,1 +BRDA:204,14,1,1 +BRDA:221,15,0,0 +BRDA:221,15,1,1 +BRDA:223,16,0,0 +BRDA:223,16,1,1 +BRDA:225,17,0,1 +BRDA:225,17,1,0 +BRDA:226,18,0,1 +BRDA:226,18,1,0 +BRF:41 +BRH:29 +end_of_record +TN: +SF:v0\destinations\personalize\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:8,1 +DA:10,1 +LF:3 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\personalize\transform.js +FN:15,(anonymous_0) +FN:38,(anonymous_1) +FN:110,(anonymous_2) +FN:129,(anonymous_3) +FN:164,(anonymous_4) +FN:183,(anonymous_5) +FN:213,(anonymous_6) +FN:236,(anonymous_7) +FN:273,(anonymous_8) +FN:277,(anonymous_9) +FN:284,(anonymous_10) +FNF:11 +FNH:9 +FNDA:14,(anonymous_0) +FNDA:35,(anonymous_1) +FNDA:5,(anonymous_2) +FNDA:7,(anonymous_3) +FNDA:20,(anonymous_4) +FNDA:5,(anonymous_5) +FNDA:4,(anonymous_6) +FNDA:27,(anonymous_7) +FNDA:27,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +DA:1,1 +DA:2,1 +DA:3,1 +DA:13,1 +DA:15,1 +DA:16,14 +DA:17,14 +DA:19,14 +DA:20,1 +DA:23,13 +DA:24,1 +DA:30,12 +DA:33,12 +DA:38,12 +DA:40,35 +DA:41,35 +DA:45,24 +DA:46,0 +DA:49,24 +DA:50,11 +DA:51,9 +DA:55,0 +DA:60,9 +DA:66,2 +DA:67,7 +DA:68,4 +DA:71,4 +DA:77,3 +DA:79,3 +DA:80,0 +DA:84,12 +DA:91,12 +DA:92,12 +DA:107,12 +DA:110,1 +DA:111,5 +DA:112,5 +DA:113,5 +DA:115,5 +DA:116,1 +DA:120,4 +DA:121,1 +DA:126,3 +DA:129,3 +DA:132,7 +DA:133,5 +DA:136,2 +DA:138,2 +DA:141,7 +DA:142,1 +DA:144,6 +DA:146,4 +DA:148,2 +DA:151,2 +DA:152,1 +DA:157,1 +DA:161,1 +DA:164,1 +DA:167,20 +DA:169,14 +DA:170,12 +DA:172,5 +DA:173,1 +DA:175,1 +DA:180,13 +DA:183,1 +DA:184,5 +DA:185,5 +DA:187,5 +DA:189,5 +DA:190,1 +DA:196,4 +DA:197,1 +DA:202,3 +DA:203,1 +DA:209,2 +DA:213,2 +DA:214,4 +DA:215,4 +DA:216,1 +DA:218,3 +DA:220,3 +DA:223,1 +DA:224,0 +DA:229,1 +DA:233,1 +DA:236,1 +DA:239,27 +DA:240,27 +DA:241,27 +DA:242,1 +DA:248,26 +DA:249,26 +DA:251,5 +DA:252,1 +DA:254,20 +DA:255,13 +DA:257,1 +DA:260,14 +DA:261,2 +DA:267,12 +DA:270,14 +DA:273,1 +DA:274,27 +DA:277,1 +DA:278,0 +DA:279,0 +DA:280,0 +DA:283,0 +DA:285,0 +DA:286,0 +DA:288,0 +DA:295,0 +DA:301,0 +DA:314,0 +DA:317,1 +LF:116 +LH:102 +BRDA:19,0,0,1 +BRDA:19,0,1,13 +BRDA:19,1,0,14 +BRDA:19,1,1,13 +BRDA:19,1,2,13 +BRDA:23,2,0,1 +BRDA:23,2,1,12 +BRDA:40,3,0,35 +BRDA:40,3,1,35 +BRDA:41,4,0,24 +BRDA:41,4,1,11 +BRDA:42,5,0,35 +BRDA:42,5,1,26 +BRDA:45,6,0,0 +BRDA:45,6,1,24 +BRDA:50,7,0,9 +BRDA:50,7,1,2 +BRDA:51,8,0,0 +BRDA:51,8,1,9 +BRDA:52,9,0,9 +BRDA:52,9,1,8 +BRDA:52,9,2,1 +BRDA:60,10,0,2 +BRDA:60,10,1,7 +BRDA:62,11,0,9 +BRDA:62,11,1,5 +BRDA:67,12,0,4 +BRDA:67,12,1,3 +BRDA:68,13,0,2 +BRDA:68,13,1,2 +BRDA:77,14,0,3 +BRDA:77,14,1,0 +BRDA:85,15,0,1 +BRDA:85,15,1,11 +BRDA:85,16,0,12 +BRDA:85,16,1,2 +BRDA:85,16,2,1 +BRDA:94,17,0,1 +BRDA:94,17,1,11 +BRDA:94,18,0,12 +BRDA:94,18,1,2 +BRDA:94,18,2,1 +BRDA:94,18,3,1 +BRDA:102,19,0,12 +BRDA:102,19,1,1 +BRDA:115,20,0,1 +BRDA:115,20,1,4 +BRDA:120,21,0,1 +BRDA:120,21,1,3 +BRDA:132,22,0,5 +BRDA:132,22,1,2 +BRDA:133,23,0,5 +BRDA:133,23,1,5 +BRDA:136,24,0,2 +BRDA:136,24,1,0 +BRDA:136,25,0,2 +BRDA:136,25,1,0 +BRDA:141,26,0,1 +BRDA:141,26,1,6 +BRDA:144,27,0,4 +BRDA:144,27,1,2 +BRDA:151,28,0,1 +BRDA:151,28,1,1 +BRDA:167,29,0,14 +BRDA:167,29,1,5 +BRDA:167,29,2,1 +BRDA:189,30,0,1 +BRDA:189,30,1,4 +BRDA:196,31,0,1 +BRDA:196,31,1,3 +BRDA:202,32,0,1 +BRDA:202,32,1,2 +BRDA:214,33,0,4 +BRDA:214,33,1,4 +BRDA:215,34,0,1 +BRDA:215,34,1,3 +BRDA:218,35,0,3 +BRDA:218,35,1,0 +BRDA:223,36,0,0 +BRDA:223,36,1,1 +BRDA:240,37,0,27 +BRDA:240,37,1,0 +BRDA:241,38,0,1 +BRDA:241,38,1,26 +BRDA:249,39,0,5 +BRDA:249,39,1,20 +BRDA:249,39,2,1 +BRDA:260,40,0,2 +BRDA:260,40,1,12 +BRDA:260,41,0,14 +BRDA:260,41,1,14 +BRDA:278,42,0,0 +BRDA:278,42,1,0 +BRDA:278,43,0,0 +BRDA:278,43,1,0 +BRDA:286,44,0,0 +BRDA:286,44,1,0 +BRDA:304,45,0,0 +BRDA:304,45,1,0 +BRDA:306,46,0,0 +BRDA:306,46,1,0 +BRDA:309,47,0,0 +BRDA:309,47,1,0 +BRF:103 +BRH:83 +end_of_record +TN: +SF:v0\destinations\postgres\transform.js +FN:5,processSingleMessage +FN:9,getDataTypeOverride +FN:16,process +FNF:3 +FNH:3 +FNDA:124,processSingleMessage +FNDA:2917,getDataTypeOverride +FNDA:124,process +DA:1,3 +DA:3,3 +DA:6,124 +DA:10,2917 +DA:11,1 +DA:13,2916 +DA:17,124 +DA:18,124 +DA:19,124 +DA:20,124 +DA:30,3 +LF:11 +LH:11 +BRDA:10,0,0,1 +BRDA:10,0,1,2916 +BRDA:17,1,0,124 +BRDA:17,1,1,0 +BRDA:26,2,0,6 +BRDA:26,2,1,118 +BRF:6 +BRH:5 +end_of_record +TN: +SF:v0\destinations\posthog\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:42,1 +DA:44,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\posthog\transform.js +FN:24,(anonymous_0) +FN:70,(anonymous_1) +FN:129,(anonymous_2) +FN:142,(anonymous_3) +FN:146,(anonymous_4) +FN:153,(anonymous_5) +FNF:6 +FNH:6 +FNDA:11,(anonymous_0) +FNDA:11,(anonymous_1) +FNDA:11,(anonymous_2) +FNDA:11,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:2,(anonymous_5) +DA:1,1 +DA:6,1 +DA:21,1 +DA:24,1 +DA:25,11 +DA:26,11 +DA:27,11 +DA:41,11 +DA:44,11 +DA:49,5 +DA:50,5 +DA:51,5 +DA:52,5 +DA:53,5 +DA:57,11 +DA:58,1 +DA:62,11 +DA:63,11 +DA:64,5 +DA:67,11 +DA:70,1 +DA:73,11 +DA:74,1 +DA:79,10 +DA:81,11 +DA:83,0 +DA:86,11 +DA:91,11 +DA:94,1 +DA:98,11 +DA:99,9 +DA:101,11 +DA:105,11 +DA:109,11 +DA:110,6 +DA:113,11 +DA:118,11 +DA:119,11 +DA:121,11 +DA:122,11 +DA:125,11 +DA:126,11 +DA:129,1 +DA:130,11 +DA:131,0 +DA:134,11 +DA:135,11 +DA:136,0 +DA:139,11 +DA:142,1 +DA:143,11 +DA:146,1 +DA:147,1 +DA:148,0 +DA:149,0 +DA:152,1 +DA:154,2 +DA:155,2 +DA:157,0 +DA:164,2 +DA:170,0 +DA:182,1 +DA:185,1 +LF:63 +LH:56 +BRDA:44,0,0,5 +BRDA:44,0,1,6 +BRDA:45,1,0,11 +BRDA:45,1,1,5 +BRDA:45,1,2,5 +BRDA:57,2,0,1 +BRDA:57,2,1,10 +BRDA:63,3,0,5 +BRDA:63,3,1,6 +BRDA:73,4,0,1 +BRDA:73,4,1,10 +BRDA:73,5,0,11 +BRDA:73,5,1,2 +BRDA:81,6,0,0 +BRDA:81,6,1,11 +BRDA:91,7,0,1 +BRDA:91,7,1,10 +BRDA:91,8,0,11 +BRDA:91,8,1,2 +BRDA:98,9,0,9 +BRDA:98,9,1,2 +BRDA:101,10,0,11 +BRDA:101,10,1,0 +BRDA:102,11,0,11 +BRDA:102,11,1,11 +BRDA:109,12,0,6 +BRDA:109,12,1,5 +BRDA:119,13,0,11 +BRDA:119,13,1,2 +BRDA:130,14,0,0 +BRDA:130,14,1,11 +BRDA:135,15,0,0 +BRDA:135,15,1,11 +BRDA:147,16,0,0 +BRDA:147,16,1,1 +BRDA:147,17,0,1 +BRDA:147,17,1,1 +BRDA:155,18,0,0 +BRDA:155,18,1,2 +BRDA:172,19,0,0 +BRDA:172,19,1,0 +BRDA:174,20,0,0 +BRDA:174,20,1,0 +BRDA:177,21,0,0 +BRDA:177,21,1,0 +BRF:45 +BRH:33 +end_of_record +TN: +SF:v0\destinations\profitwell\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:5,1 +DA:16,1 +DA:17,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\profitwell\transform.js +FN:26,(anonymous_0) +FN:61,(anonymous_1) +FN:241,(anonymous_2) +FN:264,(anonymous_3) +FN:271,(anonymous_4) +FNF:5 +FNH:5 +FNDA:13,(anonymous_0) +FNDA:6,(anonymous_1) +FNDA:14,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:1,(anonymous_4) +DA:1,1 +DA:2,1 +DA:7,1 +DA:19,1 +DA:24,1 +DA:26,1 +DA:27,13 +DA:28,13 +DA:30,13 +DA:31,1 +DA:34,12 +DA:39,12 +DA:42,12 +DA:43,1 +DA:49,11 +DA:50,11 +DA:57,11 +DA:59,11 +DA:60,6 +DA:61,6 +DA:62,6 +DA:63,6 +DA:64,4 +DA:65,4 +DA:66,4 +DA:68,2 +DA:73,0 +DA:74,0 +DA:75,0 +DA:77,2 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:84,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:93,0 +DA:95,2 +DA:98,6 +DA:102,2 +DA:103,1 +DA:105,1 +DA:106,1 +DA:111,1 +DA:118,0 +DA:120,1 +DA:124,0 +DA:126,1 +DA:133,0 +DA:135,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:145,1 +DA:146,1 +DA:150,4 +DA:151,4 +DA:152,3 +DA:159,1 +DA:161,2 +DA:168,1 +DA:170,2 +DA:174,2 +DA:175,2 +DA:177,2 +DA:181,2 +DA:182,2 +DA:187,5 +DA:188,5 +DA:189,0 +DA:196,5 +DA:197,2 +DA:201,3 +DA:202,3 +DA:206,3 +DA:213,0 +DA:215,3 +DA:216,0 +DA:218,3 +DA:225,0 +DA:227,3 +DA:231,3 +DA:232,3 +DA:233,3 +DA:237,3 +DA:238,3 +DA:241,1 +DA:242,14 +DA:243,14 +DA:244,0 +DA:247,14 +DA:248,1 +DA:251,13 +DA:254,13 +DA:256,13 +DA:257,6 +DA:259,0 +DA:261,6 +DA:264,1 +DA:265,1 +DA:266,0 +DA:267,0 +DA:270,1 +DA:272,1 +DA:274,1 +DA:280,0 +DA:292,1 +DA:295,1 +LF:111 +LH:86 +BRDA:30,0,0,1 +BRDA:30,0,1,12 +BRDA:30,1,0,13 +BRDA:30,1,1,5 +BRDA:39,2,0,12 +BRDA:39,2,1,11 +BRDA:42,3,0,1 +BRDA:42,3,1,11 +BRDA:42,4,0,12 +BRDA:42,4,1,7 +BRDA:49,5,0,11 +BRDA:49,5,1,3 +BRDA:59,6,0,6 +BRDA:59,6,1,5 +BRDA:62,7,0,6 +BRDA:62,7,1,0 +BRDA:62,8,0,6 +BRDA:62,8,1,6 +BRDA:63,9,0,4 +BRDA:63,9,1,2 +BRDA:63,10,0,6 +BRDA:63,10,1,5 +BRDA:68,11,0,0 +BRDA:68,11,1,2 +BRDA:69,12,0,2 +BRDA:69,12,1,1 +BRDA:69,12,2,1 +BRDA:78,13,0,0 +BRDA:78,13,1,0 +BRDA:78,14,0,0 +BRDA:78,14,1,0 +BRDA:79,15,0,0 +BRDA:79,15,1,0 +BRDA:79,16,0,0 +BRDA:79,16,1,0 +BRDA:84,17,0,0 +BRDA:84,17,1,0 +BRDA:85,18,0,0 +BRDA:85,18,1,0 +BRDA:85,18,2,0 +BRDA:98,19,0,2 +BRDA:98,19,1,4 +BRDA:102,20,0,1 +BRDA:102,20,1,1 +BRDA:111,21,0,0 +BRDA:111,21,1,1 +BRDA:112,22,0,1 +BRDA:112,22,1,1 +BRDA:114,23,0,1 +BRDA:114,23,1,0 +BRDA:120,24,0,0 +BRDA:120,24,1,1 +BRDA:121,25,0,1 +BRDA:121,25,1,1 +BRDA:126,26,0,0 +BRDA:126,26,1,1 +BRDA:127,27,0,1 +BRDA:127,27,1,1 +BRDA:129,28,0,1 +BRDA:129,28,1,0 +BRDA:150,29,0,4 +BRDA:150,29,1,0 +BRDA:152,30,0,1 +BRDA:152,30,1,2 +BRDA:153,31,0,3 +BRDA:153,31,1,3 +BRDA:155,32,0,3 +BRDA:155,32,1,1 +BRDA:161,33,0,1 +BRDA:161,33,1,1 +BRDA:162,34,0,2 +BRDA:162,34,1,2 +BRDA:164,35,0,2 +BRDA:164,35,1,1 +BRDA:175,36,0,2 +BRDA:175,36,1,0 +BRDA:188,37,0,0 +BRDA:188,37,1,5 +BRDA:196,38,0,2 +BRDA:196,38,1,3 +BRDA:206,39,0,0 +BRDA:206,39,1,3 +BRDA:207,40,0,3 +BRDA:207,40,1,3 +BRDA:209,41,0,3 +BRDA:209,41,1,0 +BRDA:215,42,0,0 +BRDA:215,42,1,3 +BRDA:215,43,0,3 +BRDA:215,43,1,3 +BRDA:218,44,0,0 +BRDA:218,44,1,3 +BRDA:219,45,0,3 +BRDA:219,45,1,3 +BRDA:221,46,0,3 +BRDA:221,46,1,0 +BRDA:243,47,0,0 +BRDA:243,47,1,14 +BRDA:247,48,0,1 +BRDA:247,48,1,13 +BRDA:254,49,0,13 +BRDA:254,49,1,0 +BRDA:265,50,0,0 +BRDA:265,50,1,1 +BRDA:265,51,0,1 +BRDA:265,51,1,1 +BRDA:282,52,0,0 +BRDA:282,52,1,0 +BRDA:284,53,0,0 +BRDA:284,53,1,0 +BRDA:287,54,0,0 +BRDA:287,54,1,0 +BRF:112 +BRH:75 +end_of_record +TN: +SF:v0\destinations\profitwell\utils.js +FN:167,(anonymous_0) +FN:177,(anonymous_1) +FN:191,(anonymous_2) +FNF:3 +FNH:3 +FNDA:11,(anonymous_0) +FNDA:6,(anonymous_1) +FNDA:4,(anonymous_2) +DA:1,1 +DA:2,1 +DA:4,1 +DA:167,1 +DA:168,11 +DA:173,11 +DA:174,11 +DA:177,1 +DA:178,6 +DA:179,3 +DA:181,3 +DA:182,3 +DA:183,3 +DA:185,0 +DA:191,1 +DA:192,4 +DA:195,1 +LF:17 +LH:16 +BRDA:178,0,0,3 +BRDA:178,0,1,3 +BRDA:182,1,0,3 +BRDA:182,1,1,0 +BRF:4 +BRH:3 +end_of_record +TN: +SF:v0\destinations\redis\transform.js +FN:10,(anonymous_0) +FN:11,(anonymous_1) +FN:23,(anonymous_2) +FNF:3 +FNH:3 +FNDA:5,(anonymous_0) +FNDA:49,(anonymous_1) +FNDA:5,(anonymous_2) +DA:1,1 +DA:2,1 +DA:4,1 +DA:5,1 +DA:10,1 +DA:11,5 +DA:12,49 +DA:14,4 +DA:15,4 +DA:17,45 +DA:19,45 +DA:23,1 +DA:24,5 +DA:25,5 +DA:27,5 +DA:28,0 +DA:31,5 +DA:32,0 +DA:35,5 +DA:36,5 +DA:38,5 +DA:43,5 +DA:44,5 +DA:50,5 +DA:51,2 +DA:60,5 +DA:62,5 +DA:63,1 +DA:66,4 +DA:70,4 +DA:73,1 +LF:31 +LH:29 +BRDA:12,0,0,4 +BRDA:12,0,1,45 +BRDA:12,1,0,49 +BRDA:12,1,1,49 +BRDA:19,2,0,4 +BRDA:19,2,1,41 +BRDA:25,3,0,5 +BRDA:25,3,1,5 +BRDA:25,3,2,5 +BRDA:27,4,0,0 +BRDA:27,4,1,5 +BRDA:31,5,0,0 +BRDA:31,5,1,5 +BRDA:36,6,0,1 +BRDA:36,6,1,4 +BRDA:43,7,0,5 +BRDA:43,7,1,0 +BRDA:43,8,0,5 +BRDA:43,8,1,5 +BRDA:50,9,0,2 +BRDA:50,9,1,3 +BRDA:62,10,0,1 +BRDA:62,10,1,4 +BRF:23 +BRH:20 +end_of_record +TN: +SF:v0\destinations\rs\transform.js +FN:7,processSingleMessage +FN:11,getDataTypeOverride +FN:21,process +FNF:3 +FNH:3 +FNDA:124,processSingleMessage +FNDA:2917,getDataTypeOverride +FNDA:124,process +DA:1,3 +DA:4,3 +DA:5,3 +DA:8,124 +DA:12,2917 +DA:13,0 +DA:14,0 +DA:15,0 +DA:18,2917 +DA:22,124 +DA:23,124 +DA:25,124 +DA:26,124 +DA:27,124 +DA:38,3 +LF:15 +LH:12 +BRDA:12,0,0,0 +BRDA:12,0,1,2917 +BRDA:12,1,0,2917 +BRDA:12,1,1,0 +BRDA:13,2,0,0 +BRDA:13,2,1,0 +BRDA:14,3,0,0 +BRDA:14,3,1,0 +BRDA:22,4,0,124 +BRDA:22,4,1,0 +BRDA:25,5,0,124 +BRDA:25,5,1,124 +BRDA:34,6,0,6 +BRDA:34,6,1,118 +BRF:14 +BRH:7 +end_of_record +TN: +SF:v0\destinations\s3\transform.js +FN:1,process +FNF:1 +FNH:1 +FNDA:2,process +DA:2,2 +DA:5,1 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\s3_datalake\transform.js +FN:6,processSingleMessage +FN:10,getDataTypeOverride +FN:12,process +FNF:3 +FNH:3 +FNDA:123,processSingleMessage +FNDA:2895,getDataTypeOverride +FNDA:123,process +DA:1,3 +DA:4,3 +DA:7,123 +DA:13,123 +DA:14,123 +DA:15,123 +DA:16,123 +DA:26,3 +LF:8 +LH:8 +BRDA:13,0,0,123 +BRDA:13,0,1,0 +BRDA:22,1,0,6 +BRDA:22,1,1,117 +BRF:4 +BRH:3 +end_of_record +TN: +SF:v0\destinations\salesforce\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:12,1 +DA:14,1 +DA:16,1 +DA:18,1 +DA:20,1 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\salesforce\transform.js +FN:28,getSFDCHeader +FN:63,responseBuilderSimple +FN:92,(anonymous_2) +FN:112,getSaleforceIdForRecord +FN:143,getSalesforceIdFromPayload +FN:157,(anonymous_5) +FN:266,processIdentify +FN:300,(anonymous_7) +FN:318,processSingleMessage +FN:328,process +FN:339,(anonymous_10) +FN:350,(anonymous_11) +FN:359,(anonymous_12) +FN:367,(anonymous_13) +FNF:14 +FNH:11 +FNDA:10,getSFDCHeader +FNDA:10,responseBuilderSimple +FNDA:69,(anonymous_2) +FNDA:0,getSaleforceIdForRecord +FNDA:10,getSalesforceIdFromPayload +FNDA:2,(anonymous_5) +FNDA:10,processIdentify +FNDA:10,(anonymous_7) +FNDA:11,processSingleMessage +FNDA:9,process +FNDA:1,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:3,(anonymous_13) +DA:1,1 +DA:2,1 +DA:3,1 +DA:10,1 +DA:22,1 +DA:23,1 +DA:30,10 +DA:31,1 +DA:33,9 +DA:35,10 +DA:43,10 +DA:44,10 +DA:46,0 +DA:47,0 +DA:53,10 +DA:70,10 +DA:74,10 +DA:75,10 +DA:76,2 +DA:81,10 +DA:84,10 +DA:88,8 +DA:92,8 +DA:93,69 +DA:94,2 +DA:99,10 +DA:100,10 +DA:104,10 +DA:105,10 +DA:106,10 +DA:107,10 +DA:109,10 +DA:118,0 +DA:120,0 +DA:124,0 +DA:149,10 +DA:152,10 +DA:153,10 +DA:156,10 +DA:157,2 +DA:158,2 +DA:159,2 +DA:160,2 +DA:169,10 +DA:170,0 +DA:172,0 +DA:178,0 +DA:184,0 +DA:185,0 +DA:188,0 +DA:189,0 +DA:197,0 +DA:205,10 +DA:209,8 +DA:211,8 +DA:212,0 +DA:215,8 +DA:219,8 +DA:220,8 +DA:224,0 +DA:230,8 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:241,0 +DA:244,0 +DA:245,0 +DA:250,0 +DA:256,8 +DA:262,10 +DA:268,10 +DA:272,10 +DA:273,10 +DA:274,0 +DA:279,10 +DA:280,10 +DA:281,10 +DA:286,0 +DA:290,10 +DA:293,10 +DA:300,10 +DA:302,10 +DA:313,10 +DA:320,11 +DA:321,10 +DA:323,1 +DA:325,10 +DA:330,9 +DA:331,9 +DA:336,8 +DA:339,1 +DA:340,1 +DA:341,0 +DA:342,0 +DA:346,1 +DA:347,1 +DA:349,0 +DA:350,0 +DA:354,0 +DA:357,1 +DA:358,0 +DA:359,0 +DA:363,0 +DA:366,1 +DA:368,3 +DA:369,3 +DA:371,1 +DA:379,2 +DA:389,0 +DA:397,1 +DA:400,1 +LF:112 +LH:78 +BRDA:30,0,0,1 +BRDA:30,0,1,9 +BRDA:49,1,0,0 +BRDA:49,1,1,0 +BRDA:75,2,0,2 +BRDA:75,2,1,8 +BRDA:84,3,0,8 +BRDA:84,3,1,2 +BRDA:84,4,0,10 +BRDA:84,4,1,9 +BRDA:84,4,2,8 +BRDA:93,5,0,2 +BRDA:93,5,1,67 +BRDA:93,6,0,69 +BRDA:93,6,1,4 +BRDA:156,7,0,2 +BRDA:156,7,1,8 +BRDA:156,8,0,10 +BRDA:156,8,1,2 +BRDA:156,8,2,2 +BRDA:159,9,0,2 +BRDA:159,9,1,0 +BRDA:169,10,0,0 +BRDA:169,10,1,10 +BRDA:172,11,0,0 +BRDA:172,11,1,0 +BRDA:173,12,0,0 +BRDA:173,12,1,0 +BRDA:173,12,2,0 +BRDA:173,12,3,0 +BRDA:188,13,0,0 +BRDA:188,13,1,0 +BRDA:205,14,0,8 +BRDA:205,14,1,2 +BRDA:205,15,0,10 +BRDA:205,15,1,8 +BRDA:211,16,0,0 +BRDA:211,16,1,8 +BRDA:225,17,0,0 +BRDA:225,17,1,0 +BRDA:226,18,0,0 +BRDA:226,18,1,0 +BRDA:230,19,0,0 +BRDA:230,19,1,8 +BRDA:231,20,0,8 +BRDA:231,20,1,8 +BRDA:237,21,0,0 +BRDA:237,21,1,0 +BRDA:238,22,0,0 +BRDA:238,22,1,0 +BRDA:244,23,0,0 +BRDA:244,23,1,0 +BRDA:244,24,0,0 +BRDA:244,24,1,0 +BRDA:268,25,0,9 +BRDA:268,25,1,1 +BRDA:273,26,0,0 +BRDA:273,26,1,10 +BRDA:281,27,0,0 +BRDA:281,27,1,10 +BRDA:282,28,0,10 +BRDA:282,28,1,0 +BRDA:282,28,2,0 +BRDA:320,29,0,10 +BRDA:320,29,1,1 +BRDA:340,30,0,0 +BRDA:340,30,1,1 +BRDA:340,31,0,1 +BRDA:340,31,1,1 +BRDA:357,32,0,0 +BRDA:357,32,1,1 +BRDA:369,33,0,1 +BRDA:369,33,1,2 +BRDA:391,34,0,0 +BRDA:391,34,1,0 +BRDA:392,35,0,0 +BRDA:392,35,1,0 +BRF:77 +BRH:41 +end_of_record +TN: +SF:v0\destinations\segment\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:7,1 +LF:3 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\segment\transform.js +FN:10,responseBuilderSimple +FN:30,getTransformedJSON +FN:54,getSegmentConfig +FN:57,(anonymous_3) +FN:71,processSingleMessage +FN:81,process +FNF:6 +FNH:6 +FNDA:5,responseBuilderSimple +FNDA:5,getTransformedJSON +FNDA:5,getSegmentConfig +FNDA:5,(anonymous_3) +FNDA:5,processSingleMessage +FNDA:5,process +DA:1,1 +DA:2,1 +DA:8,1 +DA:11,5 +DA:15,5 +DA:16,5 +DA:20,5 +DA:21,5 +DA:22,5 +DA:23,5 +DA:24,5 +DA:25,5 +DA:27,5 +DA:31,5 +DA:32,5 +DA:33,5 +DA:34,5 +DA:35,0 +DA:37,5 +DA:40,5 +DA:41,5 +DA:43,5 +DA:55,5 +DA:56,5 +DA:57,5 +DA:58,5 +DA:60,5 +DA:61,5 +DA:63,0 +DA:67,5 +DA:68,5 +DA:72,5 +DA:73,5 +DA:74,5 +DA:77,5 +DA:78,5 +DA:82,5 +DA:85,1 +LF:38 +LH:36 +BRDA:34,0,0,0 +BRDA:34,0,1,5 +BRDA:34,1,0,5 +BRDA:34,1,1,4 +BRDA:37,2,0,4 +BRDA:37,2,1,1 +BRDA:40,3,0,2 +BRDA:40,3,1,3 +BRDA:58,4,0,5 +BRDA:58,4,1,0 +BRF:10 +BRH:8 +end_of_record +TN: +SF:v0\destinations\sendgrid\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:7,1 +DA:11,1 +DA:13,1 +DA:32,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\sendgrid\transform.js +FN:32,(anonymous_0) +FN:109,(anonymous_1) +FN:134,(anonymous_2) +FN:141,(anonymous_3) +FNF:4 +FNH:4 +FNDA:8,(anonymous_0) +FNDA:8,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:1,(anonymous_3) +DA:2,1 +DA:14,1 +DA:21,1 +DA:30,1 +DA:32,1 +DA:33,8 +DA:34,8 +DA:35,0 +DA:37,8 +DA:38,8 +DA:39,1 +DA:41,7 +DA:42,7 +DA:43,7 +DA:44,0 +DA:46,0 +DA:50,0 +DA:51,0 +DA:53,0 +DA:60,7 +DA:61,7 +DA:62,7 +DA:63,7 +DA:68,4 +DA:70,7 +DA:71,7 +DA:74,7 +DA:79,0 +DA:81,7 +DA:82,7 +DA:83,7 +DA:84,7 +DA:85,7 +DA:86,7 +DA:87,7 +DA:93,7 +DA:94,0 +DA:97,7 +DA:98,7 +DA:99,7 +DA:100,7 +DA:104,7 +DA:105,7 +DA:106,7 +DA:107,7 +DA:109,1 +DA:110,8 +DA:111,8 +DA:112,0 +DA:118,8 +DA:119,0 +DA:121,8 +DA:124,8 +DA:126,8 +DA:127,7 +DA:129,0 +DA:131,7 +DA:134,1 +DA:135,1 +DA:136,0 +DA:137,0 +DA:140,1 +DA:142,1 +DA:143,1 +DA:149,0 +DA:161,1 +DA:164,1 +LF:67 +LH:53 +BRDA:34,0,0,0 +BRDA:34,0,1,8 +BRDA:38,1,0,1 +BRDA:38,1,1,7 +BRDA:43,2,0,0 +BRDA:43,2,1,7 +BRDA:44,3,0,0 +BRDA:44,3,1,0 +BRDA:50,4,0,0 +BRDA:50,4,1,0 +BRDA:63,5,0,4 +BRDA:63,5,1,3 +BRDA:64,6,0,7 +BRDA:64,6,1,4 +BRDA:64,6,2,4 +BRDA:72,7,0,4 +BRDA:72,7,1,3 +BRDA:74,8,0,0 +BRDA:74,8,1,7 +BRDA:75,9,0,7 +BRDA:75,9,1,0 +BRDA:75,9,2,0 +BRDA:85,10,0,7 +BRDA:85,10,1,0 +BRDA:93,11,0,0 +BRDA:93,11,1,7 +BRDA:111,12,0,0 +BRDA:111,12,1,8 +BRDA:118,13,0,0 +BRDA:118,13,1,8 +BRDA:124,14,0,8 +BRDA:124,14,1,0 +BRDA:135,15,0,0 +BRDA:135,15,1,1 +BRDA:135,16,0,1 +BRDA:135,16,1,1 +BRDA:151,17,0,0 +BRDA:151,17,1,0 +BRDA:153,18,0,0 +BRDA:153,18,1,0 +BRDA:156,19,0,0 +BRDA:156,19,1,0 +BRF:42 +BRH:21 +end_of_record +TN: +SF:v0\destinations\sendgrid\util.js +FN:11,(anonymous_0) +FN:16,(anonymous_1) +FN:36,(anonymous_2) +FN:41,(anonymous_3) +FN:44,(anonymous_4) +FN:56,(anonymous_5) +FN:71,(anonymous_6) +FN:101,(anonymous_7) +FN:103,(anonymous_8) +FN:116,(anonymous_9) +FN:119,(anonymous_10) +FN:133,(anonymous_11) +FN:137,(anonymous_12) +FN:150,(anonymous_13) +FN:154,(anonymous_14) +FN:167,(anonymous_15) +FN:220,(anonymous_16) +FN:249,(anonymous_17) +FN:287,(anonymous_18) +FN:318,(anonymous_19) +FNF:20 +FNH:18 +FNDA:0,(anonymous_0) +FNDA:7,(anonymous_1) +FNDA:7,(anonymous_2) +FNDA:7,(anonymous_3) +FNDA:14,(anonymous_4) +FNDA:3,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:8,(anonymous_7) +FNDA:9,(anonymous_8) +FNDA:7,(anonymous_9) +FNDA:12,(anonymous_10) +FNDA:7,(anonymous_11) +FNDA:7,(anonymous_12) +FNDA:7,(anonymous_13) +FNDA:5,(anonymous_14) +FNDA:7,(anonymous_15) +FNDA:28,(anonymous_16) +FNDA:7,(anonymous_17) +FNDA:21,(anonymous_18) +FNDA:7,(anonymous_19) +DA:1,1 +DA:9,1 +DA:11,1 +DA:12,0 +DA:13,0 +DA:16,1 +DA:17,7 +DA:18,7 +DA:19,0 +DA:22,7 +DA:23,0 +DA:28,7 +DA:29,0 +DA:31,7 +DA:32,0 +DA:36,1 +DA:37,7 +DA:40,7 +DA:41,7 +DA:42,7 +DA:43,7 +DA:44,7 +DA:45,14 +DA:46,7 +DA:50,0 +DA:52,7 +DA:55,7 +DA:56,3 +DA:57,3 +DA:58,0 +DA:59,0 +DA:61,3 +DA:65,0 +DA:66,0 +DA:70,7 +DA:71,0 +DA:72,0 +DA:73,0 +DA:76,0 +DA:78,7 +DA:79,0 +DA:81,7 +DA:82,0 +DA:84,7 +DA:85,0 +DA:87,7 +DA:88,0 +DA:89,0 +DA:91,7 +DA:92,0 +DA:93,0 +DA:95,7 +DA:96,3 +DA:98,7 +DA:101,1 +DA:102,8 +DA:103,8 +DA:104,9 +DA:109,7 +DA:110,7 +DA:113,8 +DA:116,1 +DA:117,7 +DA:118,7 +DA:119,4 +DA:120,12 +DA:126,8 +DA:130,7 +DA:133,1 +DA:134,7 +DA:135,7 +DA:136,7 +DA:137,7 +DA:138,7 +DA:139,7 +DA:140,0 +DA:141,0 +DA:147,7 +DA:150,1 +DA:151,7 +DA:152,7 +DA:153,3 +DA:154,3 +DA:155,5 +DA:156,3 +DA:157,2 +DA:158,0 +DA:164,7 +DA:167,1 +DA:168,7 +DA:169,7 +DA:177,7 +DA:178,7 +DA:179,7 +DA:180,7 +DA:182,7 +DA:183,1 +DA:184,1 +DA:185,1 +DA:188,0 +DA:189,0 +DA:192,0 +DA:193,0 +DA:196,0 +DA:197,0 +DA:201,1 +DA:202,1 +DA:204,1 +DA:205,0 +DA:207,1 +DA:208,0 +DA:210,1 +DA:211,0 +DA:214,7 +DA:220,7 +DA:221,28 +DA:222,27 +DA:225,7 +DA:226,2 +DA:228,7 +DA:229,7 +DA:231,7 +DA:234,7 +DA:237,7 +DA:238,6 +DA:240,7 +DA:241,7 +DA:243,7 +DA:244,6 +DA:246,7 +DA:249,1 +DA:250,7 +DA:251,7 +DA:257,7 +DA:258,7 +DA:261,7 +DA:262,7 +DA:265,7 +DA:266,7 +DA:268,7 +DA:270,7 +DA:272,7 +DA:275,7 +DA:276,7 +DA:278,7 +DA:280,7 +DA:281,7 +DA:283,7 +DA:286,7 +DA:287,7 +DA:288,21 +DA:293,7 +DA:297,7 +DA:298,7 +DA:300,7 +DA:301,7 +DA:303,7 +DA:304,7 +DA:306,7 +DA:310,7 +DA:312,7 +DA:313,7 +DA:315,7 +DA:318,1 +DA:319,7 +DA:320,7 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:326,7 +DA:327,0 +DA:329,7 +DA:333,7 +DA:334,7 +DA:335,3 +DA:337,4 +DA:341,7 +DA:342,7 +DA:343,7 +DA:344,7 +DA:346,0 +DA:349,7 +DA:350,7 +DA:352,7 +DA:353,2 +DA:354,2 +DA:357,2 +DA:361,7 +DA:364,1 +LF:190 +LH:150 +BRDA:17,0,0,7 +BRDA:17,0,1,0 +BRDA:18,1,0,0 +BRDA:18,1,1,7 +BRDA:18,2,0,7 +BRDA:18,2,1,7 +BRDA:18,2,2,7 +BRDA:22,3,0,0 +BRDA:22,3,1,7 +BRDA:22,4,0,7 +BRDA:22,4,1,7 +BRDA:28,5,0,0 +BRDA:28,5,1,7 +BRDA:31,6,0,0 +BRDA:31,6,1,7 +BRDA:31,7,0,7 +BRDA:31,7,1,7 +BRDA:40,8,0,7 +BRDA:40,8,1,0 +BRDA:43,9,0,7 +BRDA:43,9,1,0 +BRDA:43,10,0,7 +BRDA:43,10,1,7 +BRDA:43,10,2,0 +BRDA:45,11,0,7 +BRDA:45,11,1,7 +BRDA:55,12,0,3 +BRDA:55,12,1,4 +BRDA:57,13,0,0 +BRDA:57,13,1,3 +BRDA:57,14,0,3 +BRDA:57,14,1,3 +BRDA:61,15,0,0 +BRDA:61,15,1,3 +BRDA:62,16,0,3 +BRDA:62,16,1,0 +BRDA:70,17,0,0 +BRDA:70,17,1,7 +BRDA:72,18,0,0 +BRDA:72,18,1,0 +BRDA:78,19,0,0 +BRDA:78,19,1,7 +BRDA:78,20,0,7 +BRDA:78,20,1,0 +BRDA:81,21,0,0 +BRDA:81,21,1,7 +BRDA:81,22,0,7 +BRDA:81,22,1,7 +BRDA:84,23,0,0 +BRDA:84,23,1,7 +BRDA:87,24,0,0 +BRDA:87,24,1,7 +BRDA:87,25,0,7 +BRDA:87,25,1,7 +BRDA:91,26,0,0 +BRDA:91,26,1,7 +BRDA:91,27,0,7 +BRDA:91,27,1,7 +BRDA:91,27,2,4 +BRDA:95,28,0,3 +BRDA:95,28,1,4 +BRDA:104,29,0,7 +BRDA:104,29,1,2 +BRDA:105,30,0,9 +BRDA:105,30,1,9 +BRDA:105,30,2,9 +BRDA:118,31,0,4 +BRDA:118,31,1,3 +BRDA:118,32,0,7 +BRDA:118,32,1,4 +BRDA:120,33,0,8 +BRDA:120,33,1,4 +BRDA:121,34,0,12 +BRDA:121,34,1,12 +BRDA:121,34,2,12 +BRDA:121,34,3,8 +BRDA:135,35,0,7 +BRDA:135,35,1,0 +BRDA:135,36,0,7 +BRDA:135,36,1,7 +BRDA:138,37,0,7 +BRDA:138,37,1,0 +BRDA:138,38,0,7 +BRDA:138,38,1,7 +BRDA:140,39,0,0 +BRDA:140,39,1,0 +BRDA:152,40,0,3 +BRDA:152,40,1,4 +BRDA:152,41,0,7 +BRDA:152,41,1,3 +BRDA:155,42,0,3 +BRDA:155,42,1,2 +BRDA:155,43,0,5 +BRDA:155,43,1,5 +BRDA:157,44,0,0 +BRDA:157,44,1,2 +BRDA:182,45,0,1 +BRDA:182,45,1,6 +BRDA:184,46,0,1 +BRDA:184,46,1,0 +BRDA:188,47,0,0 +BRDA:188,47,1,0 +BRDA:192,48,0,0 +BRDA:192,48,1,0 +BRDA:196,49,0,0 +BRDA:196,49,1,0 +BRDA:201,50,0,1 +BRDA:201,50,1,0 +BRDA:204,51,0,0 +BRDA:204,51,1,1 +BRDA:207,52,0,0 +BRDA:207,52,1,1 +BRDA:210,53,0,0 +BRDA:210,53,1,1 +BRDA:221,54,0,27 +BRDA:221,54,1,1 +BRDA:225,55,0,2 +BRDA:225,55,1,5 +BRDA:228,56,0,7 +BRDA:228,56,1,0 +BRDA:237,57,0,6 +BRDA:237,57,1,1 +BRDA:240,58,0,7 +BRDA:240,58,1,0 +BRDA:243,59,0,6 +BRDA:243,59,1,1 +BRDA:263,60,0,7 +BRDA:263,60,1,7 +BRDA:267,61,0,7 +BRDA:267,61,1,7 +BRDA:269,62,0,7 +BRDA:269,62,1,7 +BRDA:271,63,0,7 +BRDA:271,63,1,7 +BRDA:273,64,0,7 +BRDA:273,64,1,7 +BRDA:277,65,0,7 +BRDA:277,65,1,7 +BRDA:279,66,0,7 +BRDA:279,66,1,7 +BRDA:280,67,0,7 +BRDA:280,67,1,7 +BRDA:282,68,0,7 +BRDA:282,68,1,7 +BRDA:284,69,0,7 +BRDA:284,69,1,7 +BRDA:297,70,0,7 +BRDA:297,70,1,0 +BRDA:300,71,0,7 +BRDA:300,71,1,0 +BRDA:303,72,0,7 +BRDA:303,72,1,0 +BRDA:306,73,0,7 +BRDA:306,73,1,0 +BRDA:307,74,0,7 +BRDA:307,74,1,7 +BRDA:312,75,0,7 +BRDA:312,75,1,0 +BRDA:320,76,0,0 +BRDA:320,76,1,7 +BRDA:323,77,0,0 +BRDA:323,77,1,0 +BRDA:326,78,0,0 +BRDA:326,78,1,7 +BRDA:326,79,0,7 +BRDA:326,79,1,0 +BRDA:329,80,0,7 +BRDA:329,80,1,0 +BRDA:330,81,0,7 +BRDA:330,81,1,0 +BRDA:330,81,2,0 +BRDA:334,82,0,3 +BRDA:334,82,1,4 +BRDA:341,83,0,7 +BRDA:341,83,1,0 +BRDA:341,84,0,7 +BRDA:341,84,1,0 +BRDA:341,84,2,0 +BRDA:343,85,0,7 +BRDA:343,85,1,0 +BRDA:349,86,0,7 +BRDA:349,86,1,0 +BRDA:349,87,0,7 +BRDA:349,87,1,0 +BRDA:349,87,2,0 +BRDA:352,88,0,2 +BRDA:352,88,1,5 +BRDA:354,89,0,2 +BRDA:354,89,1,0 +BRDA:357,90,0,0 +BRDA:357,90,1,2 +BRF:191 +BRH:131 +end_of_record +TN: +SF:v0\destinations\sfmc\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:9,1 +DA:20,1 +DA:22,1 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\sfmc\transform.js +FN:24,(anonymous_0) +FN:59,(anonymous_1) +FN:80,(anonymous_2) +FN:144,(anonymous_3) +FN:169,(anonymous_4) +FN:231,(anonymous_5) +FN:258,(anonymous_6) +FN:263,(anonymous_7) +FN:270,(anonymous_8) +FNF:9 +FNH:9 +FNDA:12,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:8,(anonymous_2) +FNDA:3,(anonymous_3) +FNDA:12,(anonymous_4) +FNDA:14,(anonymous_5) +FNDA:14,(anonymous_6) +FNDA:1,(anonymous_7) +FNDA:2,(anonymous_8) +DA:2,1 +DA:3,1 +DA:4,1 +DA:19,1 +DA:20,1 +DA:24,1 +DA:25,12 +DA:26,12 +DA:37,12 +DA:38,12 +DA:40,0 +DA:42,0 +DA:43,0 +DA:48,0 +DA:49,0 +DA:59,1 +DA:60,4 +DA:61,4 +DA:62,4 +DA:65,4 +DA:67,4 +DA:68,1 +DA:70,3 +DA:71,3 +DA:75,3 +DA:80,1 +DA:92,8 +DA:94,8 +DA:95,1 +DA:98,7 +DA:99,7 +DA:100,7 +DA:106,7 +DA:107,4 +DA:111,7 +DA:117,7 +DA:124,4 +DA:125,4 +DA:131,3 +DA:133,1 +DA:134,1 +DA:135,1 +DA:143,2 +DA:144,2 +DA:145,3 +DA:146,3 +DA:147,3 +DA:149,1 +DA:152,3 +DA:153,2 +DA:155,1 +DA:158,2 +DA:159,2 +DA:166,7 +DA:169,1 +DA:179,12 +DA:181,12 +DA:183,12 +DA:185,12 +DA:187,12 +DA:189,12 +DA:191,4 +DA:197,3 +DA:205,3 +DA:208,8 +DA:209,2 +DA:212,6 +DA:216,5 +DA:228,1 +DA:231,1 +DA:232,14 +DA:233,1 +DA:239,13 +DA:242,13 +DA:244,6 +DA:245,6 +DA:247,6 +DA:248,6 +DA:250,1 +DA:254,12 +DA:255,7 +DA:258,1 +DA:259,14 +DA:260,7 +DA:263,1 +DA:264,1 +DA:265,0 +DA:266,0 +DA:269,1 +DA:271,2 +DA:272,2 +DA:274,0 +DA:281,2 +DA:287,1 +DA:299,1 +DA:302,1 +LF:96 +LH:88 +BRDA:37,0,0,12 +BRDA:37,0,1,0 +BRDA:37,1,0,12 +BRDA:37,1,1,12 +BRDA:42,2,0,0 +BRDA:42,2,1,0 +BRDA:65,3,0,4 +BRDA:65,3,1,1 +BRDA:67,4,0,1 +BRDA:67,4,1,3 +BRDA:92,5,0,8 +BRDA:92,5,1,1 +BRDA:94,6,0,1 +BRDA:94,6,1,7 +BRDA:106,7,0,4 +BRDA:106,7,1,3 +BRDA:117,8,0,4 +BRDA:117,8,1,3 +BRDA:118,9,0,7 +BRDA:118,9,1,4 +BRDA:118,9,2,4 +BRDA:118,9,3,3 +BRDA:118,9,4,2 +BRDA:131,10,0,1 +BRDA:131,10,1,2 +BRDA:131,11,0,3 +BRDA:131,11,1,3 +BRDA:147,12,0,1 +BRDA:147,12,1,2 +BRDA:152,13,0,2 +BRDA:152,13,1,1 +BRDA:189,14,0,4 +BRDA:189,14,1,8 +BRDA:189,15,0,12 +BRDA:189,15,1,6 +BRDA:208,16,0,2 +BRDA:208,16,1,6 +BRDA:208,17,0,8 +BRDA:208,17,1,2 +BRDA:212,18,0,5 +BRDA:212,18,1,1 +BRDA:213,19,0,6 +BRDA:213,19,1,6 +BRDA:223,20,0,5 +BRDA:223,20,1,3 +BRDA:232,21,0,1 +BRDA:232,21,1,13 +BRDA:242,22,0,6 +BRDA:242,22,1,6 +BRDA:242,22,2,1 +BRDA:264,23,0,0 +BRDA:264,23,1,1 +BRDA:264,24,0,1 +BRDA:264,24,1,1 +BRDA:272,25,0,0 +BRDA:272,25,1,2 +BRDA:289,26,0,1 +BRDA:289,26,1,0 +BRDA:291,27,0,0 +BRDA:291,27,1,0 +BRDA:294,28,0,1 +BRDA:294,28,1,0 +BRF:62 +BRH:53 +end_of_record +TN: +SF:v0\destinations\slack\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:4,1 +LF:3 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\slack\transform.js +FN:20,stringifyJSON +FN:22,(anonymous_1) +FN:39,getName +FN:69,buildResponse +FN:90,buildDefaultTraitTemplate +FN:93,(anonymous_5) +FN:98,(anonymous_6) +FN:107,getWhiteListedTraits +FN:108,(anonymous_8) +FN:121,processIdentify +FN:175,processTrack +FN:196,(anonymous_11) +FN:234,(anonymous_12) +FN:304,process +FN:339,(anonymous_14) +FN:346,(anonymous_15) +FNF:16 +FNH:13 +FNDA:6,stringifyJSON +FNDA:26,(anonymous_1) +FNDA:4,getName +FNDA:4,buildResponse +FNDA:0,buildDefaultTraitTemplate +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:4,getWhiteListedTraits +FNDA:8,(anonymous_8) +FNDA:2,processIdentify +FNDA:3,processTrack +FNDA:6,(anonymous_11) +FNDA:4,(anonymous_12) +FNDA:8,process +FNDA:1,(anonymous_14) +FNDA:2,(anonymous_15) +DA:3,1 +DA:4,1 +DA:6,1 +DA:8,1 +DA:16,1 +DA:21,6 +DA:22,6 +DA:23,26 +DA:24,26 +DA:25,16 +DA:26,4 +DA:29,10 +DA:33,6 +DA:34,6 +DA:40,4 +DA:42,4 +DA:43,4 +DA:56,0 +DA:62,4 +DA:63,4 +DA:70,4 +DA:71,4 +DA:72,4 +DA:73,4 +DA:74,4 +DA:75,4 +DA:76,4 +DA:83,4 +DA:84,4 +DA:85,4 +DA:91,0 +DA:93,0 +DA:94,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:104,0 +DA:108,4 +DA:109,8 +DA:116,4 +DA:123,2 +DA:124,2 +DA:126,2 +DA:128,2 +DA:129,2 +DA:136,2 +DA:147,2 +DA:162,2 +DA:164,2 +DA:171,2 +DA:172,2 +DA:177,3 +DA:178,3 +DA:179,3 +DA:181,3 +DA:182,1 +DA:184,2 +DA:185,2 +DA:186,2 +DA:188,2 +DA:196,2 +DA:197,6 +DA:202,6 +DA:207,6 +DA:208,2 +DA:209,2 +DA:213,2 +DA:219,2 +DA:223,2 +DA:225,0 +DA:226,0 +DA:231,2 +DA:234,2 +DA:235,4 +DA:240,4 +DA:245,4 +DA:246,2 +DA:247,2 +DA:251,2 +DA:253,0 +DA:254,0 +DA:259,2 +DA:261,2 +DA:266,2 +DA:269,2 +DA:271,2 +DA:280,2 +DA:281,2 +DA:291,2 +DA:293,2 +DA:294,2 +DA:295,2 +DA:301,0 +DA:305,8 +DA:306,8 +DA:307,8 +DA:309,8 +DA:310,8 +DA:311,1 +DA:316,7 +DA:317,7 +DA:319,7 +DA:321,2 +DA:322,2 +DA:323,2 +DA:324,2 +DA:326,3 +DA:327,2 +DA:328,2 +DA:329,2 +DA:331,2 +DA:332,2 +DA:334,4 +DA:335,4 +DA:336,4 +DA:339,1 +DA:340,1 +DA:341,0 +DA:342,0 +DA:345,1 +DA:347,2 +DA:348,2 +DA:350,0 +DA:357,2 +DA:363,1 +DA:375,1 +DA:378,1 +LF:128 +LH:111 +BRDA:23,0,0,26 +BRDA:23,0,1,0 +BRDA:24,1,0,16 +BRDA:24,1,1,10 +BRDA:24,2,0,26 +BRDA:24,2,1,16 +BRDA:25,3,0,4 +BRDA:25,3,1,12 +BRDA:42,4,0,4 +BRDA:42,4,1,0 +BRDA:44,5,0,4 +BRDA:44,5,1,0 +BRDA:44,5,2,0 +BRDA:44,5,3,0 +BRDA:44,5,4,0 +BRDA:44,5,5,0 +BRDA:44,5,6,0 +BRDA:45,6,0,0 +BRDA:45,6,1,0 +BRDA:46,7,0,0 +BRDA:46,7,1,0 +BRDA:51,8,0,0 +BRDA:51,8,1,0 +BRDA:53,9,0,0 +BRDA:53,9,1,0 +BRDA:57,10,0,0 +BRDA:57,10,1,0 +BRDA:57,10,2,0 +BRDA:57,11,0,0 +BRDA:57,11,1,0 +BRDA:58,12,0,0 +BRDA:58,12,1,0 +BRDA:75,13,0,4 +BRDA:75,13,1,0 +BRDA:97,14,0,0 +BRDA:97,14,1,0 +BRDA:99,15,0,0 +BRDA:99,15,1,0 +BRDA:109,16,0,4 +BRDA:109,16,1,4 +BRDA:110,17,0,4 +BRDA:110,17,1,4 +BRDA:111,18,0,4 +BRDA:111,18,1,0 +BRDA:137,19,0,2 +BRDA:137,19,1,0 +BRDA:137,20,0,2 +BRDA:137,20,1,0 +BRDA:138,21,0,0 +BRDA:138,21,1,2 +BRDA:144,22,0,0 +BRDA:144,22,1,0 +BRDA:149,23,0,2 +BRDA:149,23,1,0 +BRDA:149,24,0,2 +BRDA:149,24,1,0 +BRDA:150,25,0,0 +BRDA:150,25,1,2 +BRDA:156,26,0,0 +BRDA:156,26,1,0 +BRDA:162,27,0,2 +BRDA:162,27,1,0 +BRDA:181,28,0,1 +BRDA:181,28,1,2 +BRDA:197,29,0,2 +BRDA:197,29,1,4 +BRDA:198,30,0,2 +BRDA:198,30,1,0 +BRDA:202,31,0,2 +BRDA:202,31,1,4 +BRDA:203,32,0,2 +BRDA:203,32,1,0 +BRDA:207,33,0,2 +BRDA:207,33,1,4 +BRDA:207,34,0,6 +BRDA:207,34,1,2 +BRDA:208,35,0,2 +BRDA:208,35,1,0 +BRDA:219,36,0,2 +BRDA:219,36,1,0 +BRDA:220,37,0,2 +BRDA:220,37,1,2 +BRDA:225,38,0,0 +BRDA:225,38,1,0 +BRDA:235,39,0,2 +BRDA:235,39,1,2 +BRDA:236,40,0,2 +BRDA:236,40,1,0 +BRDA:240,41,0,2 +BRDA:240,41,1,2 +BRDA:241,42,0,2 +BRDA:241,42,1,0 +BRDA:245,43,0,2 +BRDA:245,43,1,2 +BRDA:245,44,0,4 +BRDA:245,44,1,2 +BRDA:246,45,0,2 +BRDA:246,45,1,0 +BRDA:247,46,0,2 +BRDA:247,46,1,0 +BRDA:248,47,0,2 +BRDA:248,47,1,2 +BRDA:253,48,0,0 +BRDA:253,48,1,0 +BRDA:264,49,0,2 +BRDA:264,49,1,0 +BRDA:272,50,0,2 +BRDA:272,50,1,0 +BRDA:273,51,0,2 +BRDA:273,51,1,0 +BRDA:280,52,0,2 +BRDA:280,52,1,0 +BRDA:286,53,0,2 +BRDA:286,53,1,0 +BRDA:294,54,0,2 +BRDA:294,54,1,0 +BRDA:294,55,0,2 +BRDA:294,55,1,2 +BRDA:310,56,0,1 +BRDA:310,56,1,7 +BRDA:319,57,0,2 +BRDA:319,57,1,3 +BRDA:319,57,2,2 +BRDA:340,58,0,0 +BRDA:340,58,1,1 +BRDA:340,59,0,1 +BRDA:340,59,1,1 +BRDA:348,60,0,0 +BRDA:348,60,1,2 +BRDA:365,61,0,1 +BRDA:365,61,1,0 +BRDA:367,62,0,0 +BRDA:367,62,1,0 +BRDA:370,63,0,1 +BRDA:370,63,1,0 +BRF:135 +BRH:71 +end_of_record +TN: +SF:v0\destinations\snapchat_conversion\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:32,1 +DA:76,1 +DA:78,1 +LF:7 +LH:7 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\snapchat_conversion\transform.js +FN:35,trackResponseBuilder +FN:269,process +FN:291,batchEvents +FN:295,(anonymous_3) +FN:307,(anonymous_4) +FN:339,getEventChunks +FN:344,(anonymous_6) +FN:354,(anonymous_7) +FNF:8 +FNH:8 +FNDA:26,trackResponseBuilder +FNDA:27,process +FNDA:1,batchEvents +FNDA:1,(anonymous_3) +FNDA:3,(anonymous_4) +FNDA:3,getEventChunks +FNDA:1,(anonymous_6) +FNDA:3,(anonymous_7) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:17,1 +DA:24,1 +DA:33,1 +DA:36,26 +DA:37,26 +DA:38,1 +DA:40,25 +DA:42,25 +DA:43,25 +DA:44,25 +DA:45,25 +DA:49,13 +DA:53,12 +DA:56,25 +DA:60,1 +DA:66,24 +DA:67,2 +DA:68,1 +DA:70,1 +DA:76,22 +DA:80,22 +DA:83,7 +DA:87,7 +DA:88,7 +DA:90,1 +DA:94,1 +DA:95,1 +DA:96,1 +DA:97,1 +DA:100,1 +DA:104,1 +DA:105,1 +DA:107,1 +DA:111,1 +DA:112,1 +DA:115,4 +DA:119,4 +DA:120,4 +DA:122,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:129,1 +DA:131,1 +DA:135,1 +DA:136,1 +DA:138,2 +DA:142,2 +DA:143,2 +DA:144,2 +DA:145,2 +DA:147,1 +DA:151,1 +DA:152,1 +DA:155,1 +DA:159,1 +DA:160,1 +DA:163,0 +DA:167,0 +DA:168,0 +DA:170,2 +DA:174,2 +DA:175,2 +DA:178,0 +DA:184,22 +DA:185,1 +DA:188,22 +DA:194,22 +DA:199,22 +DA:200,22 +DA:203,22 +DA:210,22 +DA:216,0 +DA:221,22 +DA:222,22 +DA:223,22 +DA:224,22 +DA:225,22 +DA:227,22 +DA:228,22 +DA:229,0 +DA:235,22 +DA:236,22 +DA:237,22 +DA:242,22 +DA:243,22 +DA:244,3 +DA:245,3 +DA:247,22 +DA:248,7 +DA:249,7 +DA:251,22 +DA:252,12 +DA:255,22 +DA:258,22 +DA:259,22 +DA:260,22 +DA:264,22 +DA:265,22 +DA:266,22 +DA:270,27 +DA:272,27 +DA:273,0 +DA:279,27 +DA:281,27 +DA:283,26 +DA:284,22 +DA:286,1 +DA:288,22 +DA:292,1 +DA:295,1 +DA:296,1 +DA:297,1 +DA:301,1 +DA:302,1 +DA:304,1 +DA:307,1 +DA:308,3 +DA:309,3 +DA:312,1 +DA:316,1 +DA:317,1 +DA:321,1 +DA:326,1 +DA:336,1 +DA:341,3 +DA:344,1 +DA:345,1 +DA:346,0 +DA:347,0 +DA:350,1 +DA:351,1 +DA:352,1 +DA:353,1 +DA:355,3 +DA:356,3 +DA:358,0 +DA:360,0 +DA:365,0 +DA:366,0 +DA:370,3 +DA:379,3 +DA:384,1 +DA:385,1 +DA:389,0 +DA:400,1 +DA:401,1 +DA:402,1 +DA:404,1 +DA:407,1 +LF:155 +LH:141 +BRDA:37,0,0,1 +BRDA:37,0,1,25 +BRDA:45,1,0,13 +BRDA:45,1,1,12 +BRDA:46,2,0,25 +BRDA:46,2,1,23 +BRDA:49,3,0,2 +BRDA:49,3,1,11 +BRDA:56,4,0,1 +BRDA:56,4,1,24 +BRDA:57,5,0,25 +BRDA:57,5,1,22 +BRDA:57,5,2,16 +BRDA:66,6,0,2 +BRDA:66,6,1,22 +BRDA:66,7,0,24 +BRDA:66,7,1,9 +BRDA:66,8,0,9 +BRDA:66,8,1,8 +BRDA:67,9,0,1 +BRDA:67,9,1,1 +BRDA:76,10,0,22 +BRDA:76,10,1,0 +BRDA:80,11,0,7 +BRDA:80,11,1,1 +BRDA:80,11,2,1 +BRDA:80,11,3,1 +BRDA:80,11,4,4 +BRDA:80,11,5,1 +BRDA:80,11,6,1 +BRDA:80,11,7,2 +BRDA:80,11,8,1 +BRDA:80,11,9,1 +BRDA:80,11,10,0 +BRDA:80,11,11,2 +BRDA:184,12,0,1 +BRDA:184,12,1,21 +BRDA:210,13,0,0 +BRDA:210,13,1,22 +BRDA:211,14,0,22 +BRDA:211,14,1,0 +BRDA:211,14,2,0 +BRDA:211,14,3,0 +BRDA:214,15,0,0 +BRDA:214,15,1,0 +BRDA:223,16,0,22 +BRDA:223,16,1,0 +BRDA:228,17,0,0 +BRDA:228,17,1,22 +BRDA:236,18,0,22 +BRDA:236,18,1,0 +BRDA:243,19,0,3 +BRDA:243,19,1,19 +BRDA:247,20,0,7 +BRDA:247,20,1,15 +BRDA:251,21,0,12 +BRDA:251,21,1,10 +BRDA:272,22,0,0 +BRDA:272,22,1,27 +BRDA:281,23,0,26 +BRDA:281,23,1,1 +BRDA:345,24,0,0 +BRDA:345,24,1,1 +BRDA:345,25,0,1 +BRDA:345,25,1,1 +BRDA:356,26,0,0 +BRDA:356,26,1,3 +BRDA:360,27,0,0 +BRDA:360,27,1,0 +BRDA:361,28,0,0 +BRDA:361,28,1,0 +BRDA:361,28,2,0 +BRDA:379,29,0,1 +BRDA:379,29,1,2 +BRDA:380,30,0,3 +BRDA:380,30,1,3 +BRDA:380,30,2,3 +BRDA:392,31,0,0 +BRDA:392,31,1,0 +BRDA:393,32,0,0 +BRDA:393,32,1,0 +BRDA:401,33,0,1 +BRDA:401,33,1,0 +BRF:83 +BRH:59 +end_of_record +TN: +SF:v0\destinations\snapchat_conversion\util.js +FN:14,msUnixTimestamp +FN:19,getHashedValue +FN:28,getNormalizedPhoneNumber +FN:51,getDataUseValue +FN:67,getItemIds +FN:71,(anonymous_5) +FN:84,getPriceSum +FN:88,(anonymous_7) +FNF:8 +FNH:8 +FNDA:22,msUnixTimestamp +FNDA:110,getHashedValue +FNDA:22,getNormalizedPhoneNumber +FNDA:22,getDataUseValue +FNDA:4,getItemIds +FNDA:8,(anonymous_5) +FNDA:4,getPriceSum +FNDA:8,(anonymous_7) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:7,1 +DA:15,22 +DA:16,22 +DA:20,110 +DA:21,44 +DA:22,44 +DA:23,44 +DA:25,0 +DA:29,22 +DA:30,22 +DA:31,22 +DA:32,0 +DA:34,22 +DA:35,22 +DA:36,22 +DA:37,264 +DA:38,66 +DA:39,66 +DA:40,198 +DA:41,0 +DA:42,0 +DA:44,198 +DA:47,22 +DA:52,22 +DA:54,22 +DA:55,22 +DA:56,22 +DA:57,0 +DA:58,0 +DA:61,22 +DA:62,0 +DA:63,0 +DA:68,4 +DA:69,4 +DA:70,4 +DA:71,4 +DA:72,8 +DA:73,8 +DA:74,8 +DA:76,0 +DA:80,0 +DA:82,4 +DA:85,4 +DA:86,4 +DA:87,4 +DA:88,4 +DA:89,8 +DA:90,8 +DA:91,8 +DA:95,0 +DA:97,4 +DA:100,1 +LF:56 +LH:45 +BRDA:20,0,0,44 +BRDA:20,0,1,66 +BRDA:22,1,0,44 +BRDA:22,1,1,0 +BRDA:31,2,0,0 +BRDA:31,2,1,22 +BRDA:35,3,0,22 +BRDA:35,3,1,0 +BRDA:37,4,0,66 +BRDA:37,4,1,198 +BRDA:40,5,0,0 +BRDA:40,5,1,198 +BRDA:40,6,0,198 +BRDA:40,6,1,0 +BRDA:54,7,0,22 +BRDA:54,7,1,0 +BRDA:55,8,0,22 +BRDA:55,8,1,0 +BRDA:57,9,0,0 +BRDA:57,9,1,0 +BRDA:61,10,0,0 +BRDA:61,10,1,22 +BRDA:70,11,0,4 +BRDA:70,11,1,0 +BRDA:70,12,0,4 +BRDA:70,12,1,4 +BRDA:73,13,0,8 +BRDA:73,13,1,0 +BRDA:87,14,0,4 +BRDA:87,14,1,0 +BRDA:87,15,0,4 +BRDA:87,15,1,4 +BRDA:90,16,0,8 +BRDA:90,16,1,0 +BRDA:90,17,0,8 +BRDA:90,17,1,8 +BRF:36 +BRH:22 +end_of_record +TN: +SF:v0\destinations\snowflake\transform.js +FN:5,processSingleMessage +FN:9,getDataTypeOverride +FN:16,process +FNF:3 +FNH:3 +FNDA:124,processSingleMessage +FNDA:2917,getDataTypeOverride +FNDA:124,process +DA:1,3 +DA:3,3 +DA:6,124 +DA:10,2917 +DA:11,1 +DA:13,2916 +DA:17,124 +DA:18,124 +DA:19,124 +DA:20,124 +DA:21,124 +DA:32,3 +LF:12 +LH:12 +BRDA:10,0,0,1 +BRDA:10,0,1,2916 +BRDA:17,1,0,124 +BRDA:17,1,1,0 +BRDA:18,2,0,124 +BRDA:18,2,1,124 +BRDA:28,3,0,6 +BRDA:28,3,1,118 +BRF:8 +BRH:7 +end_of_record +TN: +SF:v0\destinations\tiktok_ads\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:4,1 +DA:6,1 +DA:7,1 +DA:9,1 +DA:16,1 +DA:33,1 +DA:35,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\tiktok_ads\transform.js +FN:27,checkIfValidPhoneNumber +FN:36,(anonymous_1) +FN:116,(anonymous_2) +FN:147,batchEvents +FN:151,(anonymous_4) +FN:163,(anonymous_5) +FN:199,getEventChunks +FN:230,(anonymous_7) +FN:241,(anonymous_8) +FNF:9 +FNH:9 +FNDA:4,checkIfValidPhoneNumber +FNDA:23,(anonymous_1) +FNDA:25,(anonymous_2) +FNDA:1,batchEvents +FNDA:1,(anonymous_4) +FNDA:4,(anonymous_5) +FNDA:5,getEventChunks +FNDA:1,(anonymous_7) +FNDA:5,(anonymous_8) +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:18,1 +DA:25,1 +DA:31,4 +DA:33,4 +DA:36,1 +DA:37,23 +DA:39,23 +DA:40,23 +DA:41,23 +DA:42,1 +DA:45,22 +DA:46,1 +DA:48,21 +DA:50,21 +DA:52,21 +DA:53,21 +DA:54,21 +DA:57,21 +DA:60,21 +DA:61,21 +DA:62,1 +DA:65,21 +DA:66,21 +DA:67,1 +DA:70,21 +DA:76,21 +DA:77,4 +DA:78,4 +DA:79,4 +DA:82,4 +DA:83,4 +DA:84,4 +DA:89,4 +DA:90,4 +DA:91,4 +DA:92,3 +DA:96,1 +DA:104,20 +DA:105,20 +DA:110,20 +DA:111,20 +DA:112,20 +DA:113,20 +DA:116,1 +DA:117,25 +DA:119,25 +DA:120,0 +DA:123,25 +DA:124,0 +DA:127,25 +DA:128,1 +DA:134,24 +DA:137,24 +DA:139,23 +DA:140,20 +DA:142,1 +DA:144,20 +DA:148,1 +DA:151,1 +DA:152,1 +DA:153,1 +DA:157,1 +DA:158,1 +DA:160,1 +DA:163,1 +DA:165,4 +DA:166,4 +DA:167,4 +DA:168,4 +DA:171,1 +DA:176,1 +DA:177,1 +DA:181,1 +DA:186,1 +DA:196,1 +DA:202,5 +DA:203,1 +DA:204,1 +DA:205,1 +DA:207,1 +DA:208,1 +DA:209,1 +DA:210,1 +DA:211,1 +DA:212,1 +DA:214,1 +DA:215,1 +DA:217,1 +DA:226,4 +DA:230,1 +DA:231,1 +DA:232,0 +DA:233,0 +DA:236,1 +DA:237,1 +DA:238,1 +DA:239,1 +DA:240,1 +DA:242,5 +DA:243,5 +DA:245,0 +DA:247,0 +DA:252,0 +DA:253,0 +DA:257,5 +DA:267,5 +DA:272,1 +DA:273,1 +DA:277,0 +DA:288,1 +DA:289,1 +DA:290,1 +DA:292,1 +DA:295,1 +LF:118 +LH:109 +BRDA:40,0,0,22 +BRDA:40,0,1,1 +BRDA:41,1,0,1 +BRDA:41,1,1,22 +BRDA:45,2,0,1 +BRDA:45,2,1,21 +BRDA:53,3,0,21 +BRDA:53,3,1,0 +BRDA:61,4,0,1 +BRDA:61,4,1,20 +BRDA:61,5,0,21 +BRDA:61,5,1,1 +BRDA:66,6,0,1 +BRDA:66,6,1,20 +BRDA:66,7,0,21 +BRDA:66,7,1,1 +BRDA:76,8,0,4 +BRDA:76,8,1,17 +BRDA:78,9,0,4 +BRDA:78,9,1,0 +BRDA:83,10,0,4 +BRDA:83,10,1,0 +BRDA:90,11,0,4 +BRDA:90,11,1,0 +BRDA:91,12,0,3 +BRDA:91,12,1,1 +BRDA:119,13,0,0 +BRDA:119,13,1,25 +BRDA:123,14,0,0 +BRDA:123,14,1,25 +BRDA:127,15,0,1 +BRDA:127,15,1,24 +BRDA:137,16,0,23 +BRDA:137,16,1,1 +BRDA:202,17,0,1 +BRDA:202,17,1,4 +BRDA:231,18,0,0 +BRDA:231,18,1,1 +BRDA:231,19,0,1 +BRDA:231,19,1,1 +BRDA:243,20,0,0 +BRDA:243,20,1,5 +BRDA:247,21,0,0 +BRDA:247,21,1,0 +BRDA:248,22,0,0 +BRDA:248,22,1,0 +BRDA:248,22,2,0 +BRDA:267,23,0,1 +BRDA:267,23,1,4 +BRDA:268,24,0,5 +BRDA:268,24,1,5 +BRDA:268,24,2,5 +BRDA:280,25,0,0 +BRDA:280,25,1,0 +BRDA:281,26,0,0 +BRDA:281,26,1,0 +BRDA:289,27,0,1 +BRDA:289,27,1,0 +BRF:58 +BRH:40 +end_of_record +TN: +SF:v0\destinations\trengo\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:9,1 +LF:3 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\trengo\transform.js +FN:34,(anonymous_0) +FN:57,(anonymous_1) +FN:81,(anonymous_2) +FN:131,(anonymous_3) +FN:199,(anonymous_4) +FN:264,(anonymous_5) +FN:377,(anonymous_6) +FN:389,(anonymous_7) +FN:394,(anonymous_8) +FN:401,(anonymous_9) +FNF:10 +FNH:10 +FNDA:10,(anonymous_0) +FNDA:4,(anonymous_1) +FNDA:15,(anonymous_2) +FNDA:11,(anonymous_3) +FNDA:10,(anonymous_4) +FNDA:18,(anonymous_5) +FNDA:18,(anonymous_6) +FNDA:18,(anonymous_7) +FNDA:1,(anonymous_8) +FNDA:2,(anonymous_9) +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:11,1 +DA:22,1 +DA:34,1 +DA:35,10 +DA:36,10 +DA:37,10 +DA:38,10 +DA:39,1 +DA:45,9 +DA:57,1 +DA:58,4 +DA:62,0 +DA:81,1 +DA:83,15 +DA:84,15 +DA:91,0 +DA:92,0 +DA:94,0 +DA:99,15 +DA:106,13 +DA:107,13 +DA:108,2 +DA:112,11 +DA:113,8 +DA:115,3 +DA:117,2 +DA:131,1 +DA:141,11 +DA:142,11 +DA:149,11 +DA:153,4 +DA:158,4 +DA:159,4 +DA:168,7 +DA:169,7 +DA:171,7 +DA:172,6 +DA:174,2 +DA:180,4 +DA:181,3 +DA:186,1 +DA:189,1 +DA:190,1 +DA:196,5 +DA:199,1 +DA:201,10 +DA:202,9 +DA:203,9 +DA:204,9 +DA:205,8 +DA:206,7 +DA:207,0 +DA:213,7 +DA:214,0 +DA:221,8 +DA:223,7 +DA:224,4 +DA:225,4 +DA:226,4 +DA:231,4 +DA:233,0 +DA:240,8 +DA:245,8 +DA:246,8 +DA:251,8 +DA:264,1 +DA:268,18 +DA:272,0 +DA:278,18 +DA:279,18 +DA:282,18 +DA:286,18 +DA:288,18 +DA:292,8 +DA:295,7 +DA:302,4 +DA:307,3 +DA:308,3 +DA:321,1 +DA:322,1 +DA:333,10 +DA:346,13 +DA:347,13 +DA:348,13 +DA:350,13 +DA:351,1 +DA:353,12 +DA:356,13 +DA:361,13 +DA:362,13 +DA:365,0 +DA:377,1 +DA:378,18 +DA:379,0 +DA:381,18 +DA:382,18 +DA:383,0 +DA:385,18 +DA:386,13 +DA:389,1 +DA:390,18 +DA:391,13 +DA:394,1 +DA:395,1 +DA:396,0 +DA:397,0 +DA:400,1 +DA:402,2 +DA:403,2 +DA:405,0 +DA:412,2 +DA:418,0 +DA:430,1 +DA:433,1 +LF:119 +LH:104 +BRDA:38,0,0,1 +BRDA:38,0,1,9 +BRDA:45,1,0,9 +BRDA:45,1,1,0 +BRDA:58,2,0,0 +BRDA:58,2,1,4 +BRDA:59,3,0,4 +BRDA:59,3,1,2 +BRDA:59,3,2,4 +BRDA:59,3,3,2 +BRDA:91,4,0,0 +BRDA:91,4,1,0 +BRDA:91,5,0,0 +BRDA:91,5,1,0 +BRDA:99,6,0,13 +BRDA:99,6,1,2 +BRDA:100,7,0,15 +BRDA:100,7,1,15 +BRDA:100,7,2,13 +BRDA:100,7,3,13 +BRDA:100,7,4,13 +BRDA:107,8,0,2 +BRDA:107,8,1,11 +BRDA:112,9,0,8 +BRDA:112,9,1,3 +BRDA:136,10,0,0 +BRDA:142,11,0,11 +BRDA:142,11,1,0 +BRDA:149,12,0,4 +BRDA:149,12,1,7 +BRDA:156,13,0,4 +BRDA:156,13,1,4 +BRDA:161,14,0,4 +BRDA:161,14,1,4 +BRDA:169,15,0,7 +BRDA:169,15,1,0 +BRDA:172,16,0,2 +BRDA:172,16,1,4 +BRDA:180,17,0,3 +BRDA:180,17,1,1 +BRDA:204,18,0,8 +BRDA:204,18,1,1 +BRDA:206,19,0,0 +BRDA:206,19,1,7 +BRDA:213,20,0,0 +BRDA:213,20,1,7 +BRDA:221,21,0,7 +BRDA:221,21,1,1 +BRDA:223,22,0,4 +BRDA:223,22,1,3 +BRDA:223,23,0,7 +BRDA:223,23,1,4 +BRDA:242,24,0,8 +BRDA:242,24,1,3 +BRDA:268,25,0,0 +BRDA:268,25,1,18 +BRDA:269,26,0,18 +BRDA:269,26,1,18 +BRDA:288,27,0,8 +BRDA:288,27,1,10 +BRDA:292,28,0,7 +BRDA:292,28,1,1 +BRDA:298,29,0,2 +BRDA:298,29,1,5 +BRDA:302,30,0,3 +BRDA:302,30,1,1 +BRDA:311,31,0,2 +BRDA:311,31,1,1 +BRDA:325,32,0,0 +BRDA:325,32,1,1 +BRDA:336,33,0,8 +BRDA:336,33,1,2 +BRDA:346,34,0,13 +BRDA:346,34,1,0 +BRDA:350,35,0,1 +BRDA:350,35,1,12 +BRDA:378,36,0,0 +BRDA:378,36,1,18 +BRDA:382,37,0,0 +BRDA:382,37,1,18 +BRDA:382,38,0,18 +BRDA:382,38,1,10 +BRDA:395,39,0,0 +BRDA:395,39,1,1 +BRDA:395,40,0,1 +BRDA:395,40,1,1 +BRDA:403,41,0,0 +BRDA:403,41,1,2 +BRDA:420,42,0,0 +BRDA:420,42,1,0 +BRDA:422,43,0,0 +BRDA:422,43,1,0 +BRDA:425,44,0,0 +BRDA:425,44,1,0 +BRF:94 +BRH:70 +end_of_record +TN: +SF:v0\destinations\webhook\transform.js +FN:18,(anonymous_0) +FN:25,process +FN:77,(anonymous_2) +FN:130,(anonymous_3) +FN:137,(anonymous_4) +FNF:5 +FNH:5 +FNDA:2,(anonymous_0) +FNDA:14,process +FNDA:3,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:2,(anonymous_4) +DA:1,1 +DA:2,1 +DA:15,1 +DA:16,1 +DA:18,1 +DA:19,2 +DA:20,0 +DA:22,2 +DA:26,14 +DA:27,14 +DA:29,14 +DA:33,2 +DA:35,14 +DA:36,14 +DA:37,14 +DA:38,14 +DA:40,14 +DA:41,14 +DA:42,2 +DA:44,2 +DA:46,12 +DA:47,1 +DA:49,11 +DA:51,12 +DA:52,12 +DA:57,14 +DA:74,14 +DA:75,14 +DA:76,1 +DA:77,1 +DA:78,3 +DA:79,3 +DA:80,1 +DA:85,1 +DA:86,1 +DA:90,14 +DA:91,14 +DA:101,14 +DA:102,3 +DA:103,3 +DA:114,14 +DA:115,3 +DA:116,3 +DA:119,14 +DA:121,0 +DA:123,0 +DA:130,1 +DA:131,1 +DA:132,0 +DA:133,0 +DA:136,1 +DA:138,2 +DA:139,2 +DA:141,0 +DA:148,2 +DA:154,0 +DA:166,1 +DA:169,1 +LF:58 +LH:51 +BRDA:19,0,0,0 +BRDA:19,0,1,2 +BRDA:29,1,0,2 +BRDA:29,1,1,12 +BRDA:30,2,0,14 +BRDA:30,2,1,14 +BRDA:40,3,0,14 +BRDA:40,3,1,0 +BRDA:41,4,0,2 +BRDA:41,4,1,12 +BRDA:46,5,0,1 +BRDA:46,5,1,11 +BRDA:75,6,0,1 +BRDA:75,6,1,13 +BRDA:76,7,0,1 +BRDA:76,7,1,0 +BRDA:79,8,0,1 +BRDA:79,8,1,2 +BRDA:79,9,0,3 +BRDA:79,9,1,3 +BRDA:85,10,0,1 +BRDA:85,10,1,0 +BRDA:101,11,0,3 +BRDA:101,11,1,11 +BRDA:101,12,0,14 +BRDA:101,12,1,3 +BRDA:114,13,0,3 +BRDA:114,13,1,11 +BRDA:114,14,0,14 +BRDA:114,14,1,3 +BRDA:124,15,0,0 +BRDA:124,15,1,0 +BRDA:125,16,0,0 +BRDA:125,16,1,0 +BRDA:131,17,0,0 +BRDA:131,17,1,1 +BRDA:131,18,0,1 +BRDA:131,18,1,1 +BRDA:139,19,0,0 +BRDA:139,19,1,2 +BRDA:156,20,0,0 +BRDA:156,20,1,0 +BRDA:158,21,0,0 +BRDA:158,21,1,0 +BRDA:161,22,0,0 +BRDA:161,22,1,0 +BRF:46 +BRH:30 +end_of_record +TN: +SF:v0\destinations\zendesk\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:21,1 +DA:41,1 +DA:43,1 +DA:44,1 +DA:45,1 +DA:47,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\destinations\zendesk\transform.js +FN:29,responseBuilder +FN:48,createUserFields +FN:52,(anonymous_2) +FN:76,checkAndCreateUserFields +FN:92,(anonymous_4) +FN:98,(anonymous_5) +FN:110,getIdentifyPayload +FN:133,(anonymous_7) +FN:135,(anonymous_8) +FN:148,getUserId +FN:176,isUserAlreadyAssociated +FN:190,createUser +FN:228,getUserMembershipPayload +FN:260,createOrganization +FN:285,(anonymous_14) +FN:288,(anonymous_15) +FN:321,validateUserId +FN:330,processIdentify +FN:397,processTrack +FN:448,processGroup +FN:506,processSingleMessage +FN:530,process +FN:536,(anonymous_22) +FN:543,(anonymous_23) +FNF:24 +FNH:24 +FNDA:12,responseBuilder +FNDA:3,createUserFields +FNDA:3,(anonymous_2) +FNDA:10,checkAndCreateUserFields +FNDA:26,(anonymous_4) +FNDA:30,(anonymous_5) +FNDA:8,getIdentifyPayload +FNDA:24,(anonymous_7) +FNDA:3,(anonymous_8) +FNDA:5,getUserId +FNDA:2,isUserAlreadyAssociated +FNDA:2,createUser +FNDA:2,getUserMembershipPayload +FNDA:2,createOrganization +FNDA:6,(anonymous_14) +FNDA:2,(anonymous_15) +FNDA:15,validateUserId +FNDA:8,processIdentify +FNDA:4,processTrack +FNDA:3,processGroup +FNDA:16,processSingleMessage +FNDA:16,process +FNDA:1,(anonymous_22) +FNDA:2,(anonymous_23) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:13,1 +DA:24,1 +DA:25,1 +DA:30,12 +DA:32,12 +DA:39,12 +DA:40,12 +DA:41,12 +DA:42,12 +DA:43,12 +DA:45,12 +DA:51,3 +DA:52,3 +DA:54,3 +DA:63,3 +DA:64,3 +DA:65,3 +DA:66,3 +DA:69,0 +DA:70,0 +DA:82,10 +DA:84,10 +DA:85,10 +DA:87,10 +DA:88,10 +DA:89,10 +DA:90,10 +DA:92,26 +DA:93,10 +DA:96,10 +DA:97,10 +DA:98,30 +DA:101,10 +DA:102,3 +DA:106,0 +DA:111,8 +DA:114,8 +DA:118,8 +DA:119,7 +DA:120,0 +DA:122,7 +DA:125,7 +DA:127,7 +DA:128,7 +DA:132,7 +DA:133,24 +DA:135,7 +DA:136,3 +DA:139,7 +DA:141,7 +DA:142,5 +DA:145,7 +DA:150,5 +DA:153,5 +DA:154,5 +DA:156,5 +DA:158,5 +DA:159,5 +DA:160,5 +DA:161,1 +DA:162,1 +DA:165,4 +DA:166,4 +DA:172,0 +DA:177,2 +DA:178,2 +DA:179,2 +DA:180,2 +DA:185,0 +DA:187,2 +DA:192,2 +DA:195,2 +DA:196,2 +DA:198,2 +DA:199,2 +DA:200,2 +DA:202,2 +DA:203,2 +DA:204,2 +DA:205,2 +DA:207,2 +DA:208,2 +DA:210,2 +DA:211,0 +DA:212,0 +DA:218,2 +DA:219,2 +DA:220,2 +DA:222,0 +DA:223,0 +DA:224,0 +DA:235,2 +DA:236,2 +DA:237,2 +DA:238,0 +DA:239,0 +DA:245,0 +DA:247,0 +DA:250,2 +DA:257,2 +DA:266,2 +DA:272,2 +DA:273,2 +DA:274,2 +DA:276,2 +DA:277,2 +DA:283,2 +DA:284,2 +DA:286,6 +DA:288,2 +DA:289,2 +DA:296,2 +DA:298,2 +DA:299,0 +DA:302,2 +DA:303,2 +DA:305,2 +DA:306,2 +DA:308,2 +DA:309,0 +DA:310,0 +DA:313,2 +DA:314,2 +DA:316,0 +DA:317,0 +DA:322,15 +DA:323,1 +DA:331,8 +DA:332,8 +DA:334,8 +DA:341,8 +DA:347,7 +DA:348,7 +DA:350,7 +DA:351,7 +DA:357,3 +DA:358,3 +DA:359,3 +DA:360,2 +DA:361,2 +DA:362,2 +DA:363,2 +DA:364,2 +DA:369,2 +DA:372,2 +DA:373,2 +DA:375,2 +DA:376,2 +DA:377,2 +DA:383,2 +DA:384,2 +DA:388,0 +DA:393,7 +DA:394,7 +DA:398,4 +DA:399,4 +DA:401,4 +DA:402,4 +DA:404,4 +DA:405,1 +DA:409,3 +DA:410,3 +DA:411,3 +DA:412,3 +DA:413,2 +DA:418,2 +DA:419,0 +DA:421,2 +DA:422,0 +DA:424,2 +DA:425,2 +DA:427,3 +DA:428,3 +DA:430,3 +DA:431,3 +DA:432,3 +DA:433,3 +DA:434,3 +DA:436,3 +DA:437,3 +DA:438,3 +DA:439,3 +DA:441,3 +DA:442,3 +DA:444,3 +DA:445,3 +DA:449,3 +DA:450,2 +DA:454,2 +DA:455,0 +DA:461,0 +DA:463,2 +DA:469,2 +DA:470,0 +DA:477,2 +DA:483,2 +DA:485,2 +DA:486,2 +DA:487,0 +DA:503,2 +DA:507,16 +DA:508,16 +DA:509,16 +DA:510,16 +DA:511,16 +DA:518,16 +DA:520,8 +DA:522,3 +DA:524,4 +DA:526,1 +DA:531,16 +DA:532,16 +DA:533,12 +DA:536,1 +DA:537,1 +DA:538,0 +DA:539,0 +DA:542,1 +DA:544,2 +DA:545,2 +DA:547,0 +DA:554,2 +DA:560,0 +DA:573,1 +DA:576,1 +LF:229 +LH:198 +BRDA:65,0,0,3 +BRDA:65,0,1,0 +BRDA:69,1,0,0 +BRDA:69,1,1,0 +BRDA:69,2,0,0 +BRDA:69,2,1,0 +BRDA:90,3,0,10 +BRDA:90,3,1,0 +BRDA:90,4,0,10 +BRDA:90,4,1,10 +BRDA:98,5,0,30 +BRDA:98,5,1,7 +BRDA:101,6,0,3 +BRDA:101,6,1,7 +BRDA:106,7,0,0 +BRDA:106,7,1,0 +BRDA:114,8,0,0 +BRDA:114,8,1,8 +BRDA:119,9,0,0 +BRDA:119,9,1,7 +BRDA:123,10,0,7 +BRDA:123,10,1,4 +BRDA:123,10,2,4 +BRDA:127,11,0,7 +BRDA:127,11,1,0 +BRDA:133,12,0,24 +BRDA:133,12,1,7 +BRDA:141,13,0,5 +BRDA:141,13,1,2 +BRDA:150,14,0,2 +BRDA:150,14,1,3 +BRDA:160,15,0,1 +BRDA:160,15,1,4 +BRDA:160,16,0,5 +BRDA:160,16,1,5 +BRDA:160,16,2,4 +BRDA:180,17,0,0 +BRDA:180,17,1,2 +BRDA:181,18,0,2 +BRDA:181,18,1,0 +BRDA:181,18,2,0 +BRDA:192,19,0,0 +BRDA:192,19,1,2 +BRDA:199,20,0,2 +BRDA:199,20,1,0 +BRDA:210,21,0,0 +BRDA:210,21,1,2 +BRDA:210,22,0,2 +BRDA:210,22,1,2 +BRDA:210,22,2,2 +BRDA:214,23,0,0 +BRDA:214,23,1,0 +BRDA:214,23,2,0 +BRDA:224,24,0,0 +BRDA:224,24,1,0 +BRDA:237,25,0,0 +BRDA:237,25,1,2 +BRDA:238,26,0,0 +BRDA:238,26,1,0 +BRDA:238,27,0,0 +BRDA:238,27,1,0 +BRDA:276,28,0,2 +BRDA:276,28,1,0 +BRDA:286,29,0,6 +BRDA:286,29,1,2 +BRDA:298,30,0,0 +BRDA:298,30,1,2 +BRDA:298,31,0,2 +BRDA:298,31,1,2 +BRDA:308,32,0,0 +BRDA:308,32,1,2 +BRDA:308,33,0,2 +BRDA:308,33,1,2 +BRDA:322,34,0,1 +BRDA:322,34,1,14 +BRDA:351,35,0,3 +BRDA:351,35,1,4 +BRDA:352,36,0,7 +BRDA:352,36,1,4 +BRDA:352,36,2,4 +BRDA:352,36,3,3 +BRDA:359,37,0,2 +BRDA:359,37,1,1 +BRDA:364,38,0,2 +BRDA:364,38,1,0 +BRDA:365,39,0,2 +BRDA:365,39,1,2 +BRDA:365,39,2,2 +BRDA:369,40,0,2 +BRDA:369,40,1,0 +BRDA:401,41,0,4 +BRDA:401,41,1,0 +BRDA:402,42,0,3 +BRDA:402,42,1,1 +BRDA:404,43,0,1 +BRDA:404,43,1,3 +BRDA:412,44,0,2 +BRDA:412,44,1,1 +BRDA:412,45,0,3 +BRDA:412,45,1,3 +BRDA:412,45,2,1 +BRDA:418,46,0,0 +BRDA:418,46,1,2 +BRDA:421,47,0,0 +BRDA:421,47,1,2 +BRDA:427,48,0,3 +BRDA:427,48,1,1 +BRDA:428,49,0,3 +BRDA:428,49,1,0 +BRDA:454,50,0,0 +BRDA:454,50,1,2 +BRDA:454,51,0,2 +BRDA:454,51,1,2 +BRDA:469,52,0,0 +BRDA:469,52,1,2 +BRDA:486,53,0,0 +BRDA:486,53,1,2 +BRDA:518,54,0,8 +BRDA:518,54,1,3 +BRDA:518,54,2,4 +BRDA:518,54,3,1 +BRDA:537,55,0,0 +BRDA:537,55,1,1 +BRDA:537,56,0,1 +BRDA:537,56,1,1 +BRDA:545,57,0,0 +BRDA:545,57,1,2 +BRDA:563,58,0,0 +BRDA:563,58,1,0 +BRDA:565,59,0,0 +BRDA:565,59,1,0 +BRDA:568,60,0,0 +BRDA:568,60,1,0 +BRF:133 +BRH:86 +end_of_record +TN: +SF:v0\sources\message.js +FN:6,(anonymous_0) +FN:19,(anonymous_1) +FN:26,(anonymous_2) +FN:30,(anonymous_3) +FN:34,(anonymous_4) +FN:38,(anonymous_5) +FN:39,(anonymous_6) +FN:45,(anonymous_7) +FN:60,(anonymous_8) +FN:61,(anonymous_9) +FN:68,(anonymous_10) +FN:83,(anonymous_11) +FNF:12 +FNH:12 +FNDA:72,(anonymous_0) +FNDA:72,(anonymous_1) +FNDA:71,(anonymous_2) +FNDA:72,(anonymous_3) +FNDA:185,(anonymous_4) +FNDA:40,(anonymous_5) +FNDA:807,(anonymous_6) +FNDA:849,(anonymous_7) +FNDA:32,(anonymous_8) +FNDA:184,(anonymous_9) +FNDA:184,(anonymous_10) +FNDA:2,(anonymous_11) +DA:1,7 +DA:2,7 +DA:4,7 +DA:6,7 +DA:7,72 +DA:20,72 +DA:21,72 +DA:27,71 +DA:31,72 +DA:35,185 +DA:39,40 +DA:40,807 +DA:41,807 +DA:42,807 +DA:43,765 +DA:45,807 +DA:46,849 +DA:49,849 +DA:54,370 +DA:61,32 +DA:62,184 +DA:63,184 +DA:64,184 +DA:65,184 +DA:66,184 +DA:68,184 +DA:69,184 +DA:72,184 +DA:77,95 +DA:84,2 +DA:88,7 +LF:31 +LH:31 +BRDA:42,0,0,765 +BRDA:42,0,1,42 +BRDA:49,1,0,370 +BRDA:49,1,1,479 +BRDA:50,2,0,849 +BRDA:50,2,1,842 +BRDA:50,2,2,389 +BRDA:50,2,3,389 +BRDA:65,3,0,184 +BRDA:65,3,1,0 +BRDA:72,4,0,95 +BRDA:72,4,1,89 +BRDA:73,5,0,184 +BRDA:73,5,1,173 +BRDA:73,5,2,111 +BRDA:73,5,3,111 +BRF:16 +BRH:15 +end_of_record +TN: +SF:v0\sources\appcenter\transform.js +FN:11,guidGenerator +FN:12,(anonymous_1) +FN:18,processEvent +FN:54,process +FNF:4 +FNH:0 +FNDA:0,guidGenerator +FNDA:0,(anonymous_1) +FNDA:0,processEvent +FNDA:0,process +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:9,1 +DA:12,0 +DA:14,0 +DA:15,0 +DA:19,0 +DA:20,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:32,0 +DA:33,0 +DA:39,0 +DA:41,0 +DA:43,0 +DA:44,0 +DA:47,0 +DA:50,0 +DA:51,0 +DA:55,0 +DA:56,0 +DA:59,0 +DA:62,1 +LF:28 +LH:6 +BRDA:22,0,0,0 +BRDA:22,0,1,0 +BRDA:22,1,0,0 +BRDA:22,1,1,0 +BRDA:24,2,0,0 +BRDA:24,2,1,0 +BRDA:24,3,0,0 +BRDA:24,3,1,0 +BRDA:26,4,0,0 +BRDA:26,4,1,0 +BRDA:27,5,0,0 +BRDA:27,5,1,0 +BRDA:27,5,2,0 +BRDA:27,5,3,0 +BRDA:33,6,0,0 +BRDA:33,6,1,0 +BRDA:34,7,0,0 +BRDA:34,7,1,0 +BRDA:34,7,2,0 +BRDA:34,7,3,0 +BRF:20 +BRH:0 +end_of_record +TN: +SF:v0\sources\appsflyer\transform.js +FN:16,processEvent +FN:34,(anonymous_1) +FN:82,process +FNF:3 +FNH:3 +FNDA:8,processEvent +FNDA:112,(anonymous_1) +FNDA:8,process +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:6,1 +DA:14,1 +DA:17,8 +DA:19,8 +DA:20,7 +DA:21,7 +DA:23,7 +DA:25,7 +DA:27,7 +DA:28,7 +DA:31,7 +DA:34,7 +DA:35,112 +DA:36,107 +DA:40,7 +DA:41,4 +DA:44,7 +DA:45,7 +DA:46,6 +DA:47,1 +DA:48,1 +DA:51,7 +DA:52,7 +DA:55,7 +DA:56,7 +DA:59,7 +DA:60,7 +DA:63,7 +DA:64,7 +DA:71,7 +DA:72,7 +DA:75,7 +DA:77,7 +DA:79,1 +DA:83,8 +DA:84,7 +DA:85,7 +DA:88,1 +LF:42 +LH:42 +BRDA:19,0,0,7 +BRDA:19,0,1,1 +BRDA:35,1,0,107 +BRDA:35,1,1,5 +BRDA:35,2,0,112 +BRDA:35,2,1,112 +BRDA:40,3,0,4 +BRDA:40,3,1,3 +BRDA:44,4,0,7 +BRDA:44,4,1,0 +BRDA:45,5,0,6 +BRDA:45,5,1,1 +BRDA:47,6,0,1 +BRDA:47,6,1,0 +BRDA:51,7,0,7 +BRDA:51,7,1,0 +BRDA:51,8,0,7 +BRDA:51,8,1,7 +BRDA:55,9,0,7 +BRDA:55,9,1,0 +BRDA:55,10,0,7 +BRDA:55,10,1,7 +BRDA:59,11,0,7 +BRDA:59,11,1,0 +BRDA:63,12,0,7 +BRDA:63,12,1,0 +BRDA:71,13,0,7 +BRDA:71,13,1,0 +BRDA:71,14,0,7 +BRDA:71,14,1,7 +BRF:30 +BRH:23 +end_of_record +TN: +SF:v0\sources\auth0\transform.js +FN:19,(anonymous_0) +FN:20,(anonymous_1) +FN:21,(anonymous_2) +FN:22,(anonymous_3) +FN:24,processEvent +FN:56,process +FN:62,(anonymous_6) +FNF:7 +FNH:7 +FNDA:22,(anonymous_0) +FNDA:22,(anonymous_1) +FNDA:22,(anonymous_2) +FNDA:3,(anonymous_3) +FNDA:4,processEvent +FNDA:1,process +FNDA:4,(anonymous_6) +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:8,1 +DA:11,1 +DA:19,22 +DA:20,22 +DA:21,22 +DA:22,3 +DA:25,4 +DA:27,4 +DA:28,3 +DA:29,3 +DA:32,3 +DA:34,3 +DA:35,3 +DA:37,3 +DA:39,3 +DA:40,2 +DA:41,2 +DA:44,3 +DA:45,3 +DA:48,3 +DA:49,3 +DA:51,0 +DA:53,1 +DA:57,1 +DA:58,1 +DA:59,1 +DA:60,0 +DA:62,1 +DA:63,4 +DA:64,4 +DA:65,3 +DA:66,3 +DA:76,1 +DA:77,0 +DA:79,1 +DA:83,1 +LF:40 +LH:37 +BRDA:21,0,0,22 +BRDA:21,0,1,22 +BRDA:27,1,0,3 +BRDA:27,1,1,1 +BRDA:34,2,0,3 +BRDA:34,2,1,0 +BRDA:39,3,0,2 +BRDA:39,3,1,1 +BRDA:44,4,0,3 +BRDA:44,4,1,0 +BRDA:44,5,0,3 +BRDA:44,5,1,3 +BRDA:48,6,0,3 +BRDA:48,6,1,0 +BRDA:48,7,0,3 +BRDA:48,7,1,3 +BRDA:59,8,0,0 +BRDA:59,8,1,1 +BRDA:65,9,0,3 +BRDA:65,9,1,0 +BRDA:76,10,0,0 +BRDA:76,10,1,1 +BRF:22 +BRH:16 +end_of_record +TN: +SF:v0\sources\braze\transform.js +FN:25,(anonymous_0) +FN:53,(anonymous_1) +FN:72,(anonymous_2) +FN:80,(anonymous_3) +FNF:4 +FNH:4 +FNDA:11,(anonymous_0) +FNDA:89,(anonymous_1) +FNDA:1,(anonymous_2) +FNDA:11,(anonymous_3) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:9,1 +DA:14,1 +DA:21,1 +DA:25,1 +DA:26,11 +DA:28,11 +DA:29,11 +DA:30,11 +DA:33,11 +DA:36,11 +DA:37,11 +DA:40,11 +DA:43,11 +DA:44,11 +DA:52,11 +DA:53,11 +DA:54,89 +DA:56,62 +DA:62,11 +DA:63,11 +DA:67,0 +DA:69,0 +DA:72,1 +DA:73,1 +DA:77,1 +DA:80,1 +DA:81,11 +DA:82,11 +DA:83,11 +DA:84,11 +DA:94,1 +DA:95,0 +DA:97,1 +DA:101,1 +LF:40 +LH:37 +BRDA:28,0,0,11 +BRDA:28,0,1,0 +BRDA:36,1,0,11 +BRDA:36,1,1,11 +BRDA:43,2,0,11 +BRDA:43,2,1,0 +BRDA:52,3,0,11 +BRDA:52,3,1,0 +BRDA:54,4,0,62 +BRDA:54,4,1,27 +BRDA:62,5,0,11 +BRDA:62,5,1,0 +BRDA:62,6,0,11 +BRDA:62,6,1,0 +BRDA:77,7,0,1 +BRDA:77,7,1,0 +BRDA:77,8,0,1 +BRDA:77,8,1,1 +BRDA:83,9,0,11 +BRDA:83,9,1,0 +BRDA:94,10,0,0 +BRDA:94,10,1,1 +BRF:22 +BRH:14 +end_of_record +TN: +SF:v0\sources\customerio\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:6,1 +DA:21,1 +DA:32,1 +DA:44,1 +DA:52,1 +DA:60,1 +DA:69,1 +LF:8 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\sources\customerio\transform.js +FN:10,process +FNF:1 +FNH:1 +FNDA:19,process +DA:1,1 +DA:2,1 +DA:4,1 +DA:7,1 +DA:8,1 +DA:11,19 +DA:15,19 +DA:16,19 +DA:18,19 +DA:19,19 +DA:21,0 +DA:23,19 +DA:25,19 +DA:27,19 +DA:28,19 +DA:29,19 +DA:30,19 +DA:34,19 +DA:35,0 +DA:40,0 +DA:44,19 +DA:47,1 +LF:22 +LH:19 +BRDA:19,0,0,0 +BRDA:19,0,1,19 +BRDA:27,1,0,19 +BRDA:27,1,1,0 +BRDA:34,2,0,0 +BRDA:34,2,1,19 +BRDA:34,3,0,19 +BRDA:34,3,1,19 +BRDA:35,4,0,0 +BRDA:35,4,1,0 +BRDA:36,5,0,0 +BRDA:36,5,1,0 +BRDA:36,5,2,0 +BRF:13 +BRH:5 +end_of_record +TN: +SF:v0\sources\iterable\transform.js +FN:11,process +FNF:1 +FNH:1 +FNDA:30,process +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:7,1 +DA:13,30 +DA:14,2 +DA:16,28 +DA:19,28 +DA:21,28 +DA:23,28 +DA:25,28 +DA:27,28 +DA:29,28 +DA:30,27 +DA:31,27 +DA:32,27 +DA:36,27 +DA:40,27 +DA:41,26 +DA:44,27 +DA:47,1 +LF:22 +LH:22 +BRDA:13,0,0,2 +BRDA:13,0,1,28 +BRDA:13,1,0,30 +BRDA:13,1,1,29 +BRDA:29,2,0,27 +BRDA:29,2,1,0 +BRDA:40,3,0,26 +BRDA:40,3,1,1 +BRDA:40,4,0,27 +BRDA:40,4,1,27 +BRF:10 +BRH:9 +end_of_record +TN: +SF:v0\sources\segment\transform.js +FN:1,process +FNF:1 +FNH:1 +FNDA:1,process +DA:2,1 +DA:5,1 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\sources\shopify\config.js +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:5,1 +DA:11,1 +DA:18,1 +DA:25,1 +DA:39,1 +DA:43,1 +DA:47,1 +DA:51,1 +DA:53,1 +DA:58,1 +DA:70,1 +DA:86,1 +DA:104,1 +LF:16 +LH:16 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\sources\shopify\transform.js +FN:24,(anonymous_0) +FN:35,(anonymous_1) +FN:42,(anonymous_2) +FN:77,(anonymous_3) +FN:83,(anonymous_4) +FN:93,(anonymous_5) +FN:117,(anonymous_6) +FN:160,(anonymous_7) +FNF:8 +FNH:8 +FNDA:1,(anonymous_0) +FNDA:1,(anonymous_1) +FNDA:64,(anonymous_2) +FNDA:2,(anonymous_3) +FNDA:42,(anonymous_4) +FNDA:37,(anonymous_5) +FNDA:5,(anonymous_6) +FNDA:5,(anonymous_7) +DA:1,1 +DA:7,1 +DA:12,1 +DA:13,1 +DA:14,1 +DA:22,1 +DA:24,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:30,1 +DA:32,1 +DA:35,1 +DA:36,1 +DA:37,1 +DA:38,1 +DA:40,1 +DA:41,1 +DA:42,1 +DA:43,64 +DA:46,1 +DA:47,1 +DA:48,1 +DA:53,1 +DA:56,1 +DA:58,1 +DA:59,1 +DA:64,1 +DA:65,0 +DA:67,1 +DA:68,0 +DA:70,1 +DA:71,0 +DA:74,1 +DA:77,1 +DA:78,2 +DA:79,2 +DA:80,2 +DA:81,2 +DA:84,42 +DA:94,37 +DA:96,2 +DA:97,2 +DA:98,2 +DA:99,2 +DA:100,1 +DA:105,2 +DA:106,1 +DA:108,2 +DA:109,1 +DA:111,2 +DA:112,0 +DA:114,2 +DA:117,1 +DA:119,5 +DA:120,5 +DA:122,5 +DA:125,1 +DA:126,1 +DA:131,1 +DA:132,1 +DA:134,3 +DA:135,1 +DA:137,2 +DA:138,2 +DA:141,4 +DA:142,2 +DA:144,4 +DA:145,1 +DA:146,1 +DA:147,1 +DA:150,4 +DA:151,4 +DA:152,4 +DA:156,4 +DA:157,4 +DA:160,1 +DA:161,5 +DA:162,4 +DA:165,1 +LF:81 +LH:77 +BRDA:28,0,0,1 +BRDA:28,0,1,0 +BRDA:47,1,0,1 +BRDA:47,1,1,0 +BRDA:53,2,0,1 +BRDA:53,2,1,0 +BRDA:58,3,0,1 +BRDA:58,3,1,0 +BRDA:64,4,0,0 +BRDA:64,4,1,1 +BRDA:67,5,0,0 +BRDA:67,5,1,1 +BRDA:70,6,0,0 +BRDA:70,6,1,1 +BRDA:70,7,0,1 +BRDA:70,7,1,0 +BRDA:99,8,0,1 +BRDA:99,8,1,1 +BRDA:105,9,0,1 +BRDA:105,9,1,1 +BRDA:108,10,0,1 +BRDA:108,10,1,1 +BRDA:111,11,0,0 +BRDA:111,11,1,2 +BRDA:111,12,0,2 +BRDA:111,12,1,2 +BRDA:122,13,0,1 +BRDA:122,13,1,1 +BRDA:122,13,2,0 +BRDA:122,13,3,1 +BRDA:122,13,4,1 +BRDA:122,13,5,1 +BRDA:122,13,6,3 +BRDA:134,14,0,1 +BRDA:134,14,1,2 +BRDA:141,15,0,2 +BRDA:141,15,1,2 +BRDA:144,16,0,1 +BRDA:144,16,1,3 +BRDA:146,17,0,1 +BRDA:146,17,1,0 +BRF:41 +BRH:30 +end_of_record +TN: +SF:v0\sources\shopify\util.js +FN:21,(anonymous_0) +FN:41,(anonymous_1) +FN:46,(anonymous_2) +FN:51,(anonymous_3) +FN:60,(anonymous_4) +FN:74,(anonymous_5) +FN:78,(anonymous_6) +FNF:7 +FNH:7 +FNDA:5,(anonymous_0) +FNDA:3,(anonymous_1) +FNDA:3,(anonymous_2) +FNDA:3,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:1,(anonymous_5) +FNDA:4,(anonymous_6) +DA:7,1 +DA:13,1 +DA:21,1 +DA:22,5 +DA:23,5 +DA:24,5 +DA:25,0 +DA:27,5 +DA:28,5 +DA:29,0 +DA:35,5 +DA:36,0 +DA:38,5 +DA:41,1 +DA:42,3 +DA:43,3 +DA:46,1 +DA:47,3 +DA:48,0 +DA:50,3 +DA:51,3 +DA:52,3 +DA:53,3 +DA:54,3 +DA:55,3 +DA:57,3 +DA:60,1 +DA:61,1 +DA:62,1 +DA:63,1 +DA:64,1 +DA:70,1 +DA:71,1 +DA:74,1 +DA:75,1 +DA:77,1 +DA:78,1 +DA:79,4 +DA:80,1 +DA:81,1 +DA:83,3 +DA:85,1 +DA:88,1 +LF:43 +LH:39 +BRDA:24,0,0,0 +BRDA:24,0,1,5 +BRDA:28,1,0,0 +BRDA:28,1,1,5 +BRDA:28,2,0,5 +BRDA:28,2,1,5 +BRDA:35,3,0,0 +BRDA:35,3,1,5 +BRDA:43,4,0,3 +BRDA:43,4,1,0 +BRDA:43,5,0,3 +BRDA:43,5,1,3 +BRDA:43,6,0,3 +BRDA:43,6,1,3 +BRDA:47,7,0,0 +BRDA:47,7,1,3 +BRDA:47,8,0,3 +BRDA:47,8,1,3 +BRDA:79,9,0,1 +BRDA:79,9,1,3 +BRF:20 +BRH:15 +end_of_record +TN: +SF:v0\util\cache.js +FN:4,(anonymous_0) +FN:12,(anonymous_1) +FN:18,(anonymous_2) +FNF:3 +FNH:3 +FNDA:6,(anonymous_0) +FNDA:21,(anonymous_1) +FNDA:7,(anonymous_2) +DA:1,2 +DA:5,6 +DA:13,21 +DA:14,21 +DA:15,13 +DA:18,8 +DA:20,7 +DA:21,7 +DA:23,7 +DA:28,2 +LF:10 +LH:10 +BRDA:14,0,0,13 +BRDA:14,0,1,8 +BRDA:20,1,0,7 +BRDA:20,1,1,0 +BRF:4 +BRH:3 +end_of_record +TN: +SF:v0\util\constant.js +FNF:0 +FNH:0 +DA:1,70 +DA:5,70 +DA:9,70 +DA:11,70 +DA:50,70 +LF:5 +LH:5 +BRDA:1,0,0,0 +BRDA:1,0,1,70 +BRDA:5,1,0,0 +BRDA:5,1,1,70 +BRF:4 +BRH:2 +end_of_record +TN: +SF:v0\util\error.js +FN:2,ErrorBuilder +FN:6,(anonymous_1) +FN:10,(anonymous_2) +FN:15,(anonymous_3) +FN:20,(anonymous_4) +FN:25,(anonymous_5) +FN:33,(anonymous_6) +FN:39,(anonymous_7) +FN:44,(anonymous_8) +FNF:9 +FNH:7 +FNDA:28,ErrorBuilder +FNDA:28,(anonymous_1) +FNDA:28,(anonymous_2) +FNDA:1,(anonymous_3) +FNDA:1,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:12,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:28,(anonymous_8) +DA:3,28 +DA:4,28 +DA:6,28 +DA:7,28 +DA:8,28 +DA:10,28 +DA:11,28 +DA:12,28 +DA:15,28 +DA:16,1 +DA:17,1 +DA:20,28 +DA:21,1 +DA:22,1 +DA:25,28 +DA:26,0 +DA:30,0 +DA:33,28 +DA:34,12 +DA:35,12 +DA:39,28 +DA:40,0 +DA:41,0 +DA:44,28 +DA:47,14 +LF:25 +LH:21 +BRF:0 +BRH:0 +end_of_record +TN: +SF:v0\util\index.js +FN:29,(anonymous_0) +FN:30,(anonymous_1) +FN:31,(anonymous_2) +FN:32,(anonymous_3) +FN:33,(anonymous_4) +FN:35,(anonymous_5) +FN:36,(anonymous_6) +FN:37,(anonymous_7) +FN:38,(anonymous_8) +FN:40,(anonymous_9) +FN:41,(anonymous_10) +FN:41,(anonymous_11) +FN:47,(anonymous_12) +FN:55,(anonymous_13) +FN:59,(anonymous_14) +FN:73,(anonymous_15) +FN:84,(anonymous_16) +FN:89,isEmpty +FN:98,isEmptyObject +FN:107,(anonymous_19) +FN:115,(anonymous_20) +FN:126,(anonymous_21) +FN:130,(anonymous_22) +FN:154,flattenJson +FN:159,recurse +FN:172,(anonymous_25) +FN:186,(anonymous_26) +FN:205,(anonymous_27) +FN:218,(anonymous_28) +FN:229,(anonymous_29) +FN:234,(anonymous_30) +FN:284,(anonymous_31) +FN:303,(anonymous_32) +FN:325,(anonymous_33) +FN:342,(anonymous_34) +FN:370,(anonymous_35) +FN:379,(anonymous_36) +FN:382,(anonymous_37) +FN:393,(anonymous_38) +FN:394,(anonymous_39) +FN:402,(anonymous_40) +FN:436,(anonymous_41) +FN:450,(anonymous_42) +FN:565,(anonymous_43) +FN:593,(anonymous_44) +FN:621,(anonymous_45) +FN:639,(anonymous_46) +FN:656,(anonymous_47) +FN:697,(anonymous_48) +FN:753,getDestinationExternalID +FN:760,(anonymous_50) +FN:771,(anonymous_51) +FN:779,(anonymous_52) +FN:790,(anonymous_53) +FN:799,(anonymous_54) +FN:804,getBrowserInfo +FN:809,getInfoFromUA +FN:815,getDeviceModel +FN:839,getValuesAsArrayFromConfig +FN:843,(anonymous_59) +FN:854,toUnixTimestamp +FN:861,getTimeDifference +FN:877,getFirstAndLastName +FN:897,getFullName +FN:937,extractCustomFields +FN:940,(anonymous_65) +FN:943,(anonymous_66) +FN:946,(anonymous_67) +FN:954,(anonymous_68) +FN:957,(anonymous_69) +FN:970,deleteObjectProperty +FN:991,toTitleCase +FN:993,(anonymous_72) +FN:1003,(anonymous_73) +FN:1013,checkEmptyStringInarray +FN:1014,(anonymous_75) +FN:1018,getStringValueOfJSON +FN:1020,(anonymous_77) +FN:1029,(anonymous_78) +FN:1037,checkSubsetOfArray +FN:1038,(anonymous_80) +FN:1043,returnArrayOfSubarrays +FN:1055,addExternalIdToTraits +FN:1064,(anonymous_83) +FN:1071,(anonymous_84) +FN:1083,generateErrorObject +FN:1115,isHttpStatusSuccess +FN:1124,isHttpStatusRetryable +FN:1132,generateUUID +FN:1141,(anonymous_89) +FN:1148,(anonymous_90) +FN:1153,(anonymous_91) +FN:1161,isAppleFamily +FN:1166,removeHyphens +FN:1170,isCdkDestination +FN:1208,getValidDynamicFormConfig +FN:1215,(anonymous_96) +FNF:97 +FNH:79 +FNDA:15595,(anonymous_0) +FNDA:576,(anonymous_1) +FNDA:9274,(anonymous_2) +FNDA:13028,(anonymous_3) +FNDA:584,(anonymous_4) +FNDA:311,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:1368,(anonymous_7) +FNDA:7,(anonymous_8) +FNDA:22,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:2,(anonymous_11) +FNDA:11,(anonymous_12) +FNDA:11,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:81,(anonymous_16) +FNDA:371,isEmpty +FNDA:243,isEmptyObject +FNDA:242,(anonymous_19) +FNDA:333,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:101,flattenJson +FNDA:1364,recurse +FNDA:1194,(anonymous_25) +FNDA:4,(anonymous_26) +FNDA:0,(anonymous_27) +FNDA:93,(anonymous_28) +FNDA:87,(anonymous_29) +FNDA:3,(anonymous_30) +FNDA:1080,(anonymous_31) +FNDA:30,(anonymous_32) +FNDA:100,(anonymous_33) +FNDA:6,(anonymous_34) +FNDA:174,(anonymous_35) +FNDA:46,(anonymous_36) +FNDA:232,(anonymous_37) +FNDA:0,(anonymous_38) +FNDA:0,(anonymous_39) +FNDA:11475,(anonymous_40) +FNDA:2160,(anonymous_41) +FNDA:8694,(anonymous_42) +FNDA:167,(anonymous_43) +FNDA:141,(anonymous_44) +FNDA:0,(anonymous_45) +FNDA:891,(anonymous_46) +FNDA:1087,(anonymous_47) +FNDA:8694,(anonymous_48) +FNDA:370,getDestinationExternalID +FNDA:79,(anonymous_50) +FNDA:9,(anonymous_51) +FNDA:2,(anonymous_52) +FNDA:80,(anonymous_53) +FNDA:0,(anonymous_54) +FNDA:31,getBrowserInfo +FNDA:5,getInfoFromUA +FNDA:5,getDeviceModel +FNDA:3,getValuesAsArrayFromConfig +FNDA:2,(anonymous_59) +FNDA:38,toUnixTimestamp +FNDA:18,getTimeDifference +FNDA:8,getFirstAndLastName +FNDA:14,getFullName +FNDA:219,extractCustomFields +FNDA:267,(anonymous_65) +FNDA:1202,(anonymous_66) +FNDA:616,(anonymous_67) +FNDA:184,(anonymous_68) +FNDA:137,(anonymous_69) +FNDA:16,deleteObjectProperty +FNDA:7,toTitleCase +FNDA:131,(anonymous_72) +FNDA:245,(anonymous_73) +FNDA:0,checkEmptyStringInarray +FNDA:0,(anonymous_75) +FNDA:4,getStringValueOfJSON +FNDA:14,(anonymous_77) +FNDA:0,(anonymous_78) +FNDA:10,checkSubsetOfArray +FNDA:100,(anonymous_80) +FNDA:43,returnArrayOfSubarrays +FNDA:16,addExternalIdToTraits +FNDA:4,(anonymous_83) +FNDA:188,(anonymous_84) +FNDA:0,generateErrorObject +FNDA:8,isHttpStatusSuccess +FNDA:0,isHttpStatusRetryable +FNDA:11,generateUUID +FNDA:341,(anonymous_89) +FNDA:0,(anonymous_90) +FNDA:0,(anonymous_91) +FNDA:48,isAppleFamily +FNDA:36,removeHyphens +FNDA:0,isCdkDestination +FNDA:46,getValidDynamicFormConfig +FNDA:47,(anonymous_96) +DA:8,70 +DA:10,70 +DA:11,70 +DA:12,70 +DA:13,70 +DA:14,70 +DA:15,70 +DA:16,70 +DA:17,70 +DA:18,70 +DA:19,70 +DA:22,70 +DA:23,70 +DA:24,70 +DA:29,15595 +DA:30,576 +DA:31,9274 +DA:32,13028 +DA:33,70 +DA:34,584 +DA:35,311 +DA:36,70 +DA:37,1368 +DA:38,70 +DA:39,7 +DA:40,70 +DA:41,70 +DA:47,70 +DA:48,11 +DA:49,11 +DA:51,6 +DA:55,70 +DA:56,11 +DA:59,70 +DA:60,0 +DA:61,0 +DA:73,70 +DA:74,0 +DA:75,0 +DA:76,0 +DA:78,0 +DA:79,0 +DA:81,0 +DA:84,70 +DA:85,81 +DA:86,24 +DA:90,371 +DA:99,243 +DA:100,5 +DA:101,5 +DA:103,238 +DA:107,70 +DA:113,242 +DA:114,242 +DA:115,216 +DA:116,333 +DA:117,325 +DA:121,242 +DA:126,70 +DA:127,0 +DA:130,0 +DA:131,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:140,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:150,0 +DA:155,101 +DA:161,1364 +DA:162,1097 +DA:163,267 +DA:164,40 +DA:165,69 +DA:167,40 +DA:168,3 +DA:171,227 +DA:172,227 +DA:173,1194 +DA:174,1194 +DA:176,227 +DA:180,101 +DA:181,101 +DA:186,70 +DA:187,4 +DA:188,4 +DA:189,3 +DA:192,3 +DA:193,3 +DA:194,3 +DA:195,3 +DA:196,3 +DA:198,3 +DA:200,1 +DA:205,70 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:218,70 +DA:219,93 +DA:221,93 +DA:222,11 +DA:226,82 +DA:229,70 +DA:230,87 +DA:234,70 +DA:235,3 +DA:240,3 +DA:242,0 +DA:247,0 +DA:249,0 +DA:257,70 +DA:263,70 +DA:269,70 +DA:275,70 +DA:284,70 +DA:285,1080 +DA:303,70 +DA:304,30 +DA:325,70 +DA:331,100 +DA:342,70 +DA:349,6 +DA:355,70 +DA:364,70 +DA:370,70 +DA:371,174 +DA:372,39 +DA:374,135 +DA:379,70 +DA:380,46 +DA:381,46 +DA:382,46 +DA:383,232 +DA:384,232 +DA:388,46 +DA:393,70 +DA:394,0 +DA:395,0 +DA:396,0 +DA:399,0 +DA:402,70 +DA:403,11475 +DA:404,5828 +DA:405,0 +DA:410,5828 +DA:411,11996 +DA:412,11996 +DA:415,3726 +DA:418,5647 +DA:421,5647 +DA:425,0 +DA:427,2102 +DA:436,70 +DA:437,2160 +DA:438,2160 +DA:439,2156 +DA:441,4 +DA:450,70 +DA:451,8694 +DA:452,7740 +DA:464,954 +DA:467,954 +DA:468,455 +DA:471,499 +DA:474,499 +DA:475,380 +DA:477,38 +DA:478,38 +DA:480,44 +DA:483,44 +DA:485,4 +DA:486,4 +DA:488,0 +DA:489,0 +DA:491,0 +DA:492,0 +DA:494,0 +DA:495,0 +DA:499,8 +DA:500,0 +DA:502,8 +DA:504,13 +DA:509,3 +DA:511,13 +DA:512,13 +DA:513,1 +DA:515,12 +DA:517,70 +DA:518,70 +DA:520,108 +DA:521,108 +DA:523,0 +DA:524,0 +DA:526,2 +DA:527,2 +DA:529,84 +DA:533,84 +DA:535,3 +DA:536,3 +DA:538,4 +DA:539,4 +DA:541,2 +DA:544,2 +DA:546,0 +DA:547,0 +DA:549,0 +DA:551,0 +DA:556,498 +DA:557,12 +DA:558,12 +DA:562,498 +DA:563,22 +DA:565,22 +DA:566,167 +DA:569,0 +DA:590,498 +DA:591,71 +DA:592,71 +DA:593,71 +DA:594,141 +DA:599,0 +DA:602,0 +DA:603,0 +DA:606,141 +DA:607,70 +DA:608,70 +DA:609,70 +DA:613,0 +DA:615,71 +DA:618,498 +DA:619,0 +DA:620,0 +DA:621,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:628,0 +DA:629,0 +DA:633,498 +DA:639,70 +DA:640,891 +DA:641,891 +DA:642,891 +DA:643,4427 +DA:647,4427 +DA:648,7 +DA:652,884 +DA:656,70 +DA:658,1087 +DA:663,1087 +DA:697,1087 +DA:704,8694 +DA:707,8694 +DA:710,8694 +DA:718,8693 +DA:719,4700 +DA:721,4687 +DA:724,13 +DA:726,3993 +DA:728,11 +DA:734,1075 +DA:738,0 +DA:754,370 +DA:755,370 +DA:756,370 +DA:757,67 +DA:759,370 +DA:760,67 +DA:761,79 +DA:762,51 +DA:766,370 +DA:771,70 +DA:772,9 +DA:773,9 +DA:774,9 +DA:775,9 +DA:776,2 +DA:778,9 +DA:779,9 +DA:780,2 +DA:781,2 +DA:782,2 +DA:783,2 +DA:787,9 +DA:790,70 +DA:791,80 +DA:792,80 +DA:799,70 +DA:800,0 +DA:801,0 +DA:805,31 +DA:806,31 +DA:810,5 +DA:811,5 +DA:812,5 +DA:816,5 +DA:818,5 +DA:819,5 +DA:821,0 +DA:840,3 +DA:841,3 +DA:843,2 +DA:844,2 +DA:845,2 +DA:846,2 +DA:850,3 +DA:855,38 +DA:856,38 +DA:857,38 +DA:862,18 +DA:863,18 +DA:864,18 +DA:865,18 +DA:866,18 +DA:867,18 +DA:868,18 +DA:869,18 +DA:870,18 +DA:871,18 +DA:879,8 +DA:880,7 +DA:882,8 +DA:899,14 +DA:900,14 +DA:901,14 +DA:902,14 +DA:903,7 +DA:905,14 +DA:938,219 +DA:939,219 +DA:940,211 +DA:941,267 +DA:942,267 +DA:943,157 +DA:944,1202 +DA:946,157 +DA:947,616 +DA:948,616 +DA:953,8 +DA:954,8 +DA:955,184 +DA:957,8 +DA:958,137 +DA:959,137 +DA:963,0 +DA:966,219 +DA:972,16 +DA:973,6 +DA:975,10 +DA:976,10 +DA:978,10 +DA:979,0 +DA:981,0 +DA:982,0 +DA:986,10 +DA:992,7 +DA:993,7 +DA:994,131 +DA:995,131 +DA:996,131 +DA:1004,245 +DA:1006,131 +DA:1008,7 +DA:1014,0 +DA:1015,0 +DA:1019,4 +DA:1020,4 +DA:1022,14 +DA:1023,14 +DA:1026,4 +DA:1029,70 +DA:1030,0 +DA:1038,100 +DA:1039,10 +DA:1044,43 +DA:1045,43 +DA:1046,43 +DA:1047,43 +DA:1048,88 +DA:1050,43 +DA:1056,16 +DA:1057,16 +DA:1058,16 +DA:1064,70 +DA:1065,4 +DA:1066,4 +DA:1067,4 +DA:1072,188 +DA:1073,188 +DA:1086,0 +DA:1087,0 +DA:1089,0 +DA:1090,0 +DA:1091,0 +DA:1092,0 +DA:1098,0 +DA:1105,0 +DA:1106,0 +DA:1108,0 +DA:1116,8 +DA:1125,0 +DA:1134,11 +DA:1135,11 +DA:1139,0 +DA:1141,11 +DA:1142,341 +DA:1143,341 +DA:1144,341 +DA:1148,70 +DA:1149,0 +DA:1150,0 +DA:1153,70 +DA:1154,0 +DA:1162,48 +DA:1163,48 +DA:1167,36 +DA:1172,0 +DA:1215,46 +DA:1216,47 +DA:1221,46 +DA:1222,1 +DA:1227,46 +DA:1234,70 +LF:434 +LH:342 +BRDA:32,0,0,13028 +BRDA:32,0,1,8698 +BRDA:34,1,0,584 +BRDA:34,1,1,576 +BRDA:34,1,2,576 +BRDA:56,2,0,6 +BRDA:56,2,1,5 +BRDA:56,3,0,11 +BRDA:56,3,1,9 +BRDA:61,4,0,0 +BRDA:61,4,1,0 +BRDA:61,4,2,0 +BRDA:75,5,0,0 +BRDA:75,5,1,0 +BRDA:78,6,0,0 +BRDA:78,6,1,0 +BRDA:85,7,0,57 +BRDA:85,7,1,24 +BRDA:85,8,0,81 +BRDA:85,8,1,24 +BRDA:99,9,0,5 +BRDA:99,9,1,238 +BRDA:109,10,0,14 +BRDA:110,11,0,14 +BRDA:111,12,0,69 +BRDA:114,13,0,216 +BRDA:114,13,1,26 +BRDA:116,14,0,8 +BRDA:116,14,1,325 +BRDA:117,15,0,57 +BRDA:117,15,1,268 +BRDA:127,16,0,0 +BRDA:127,16,1,0 +BRDA:133,17,0,0 +BRDA:133,17,1,0 +BRDA:133,18,0,0 +BRDA:133,18,1,0 +BRDA:136,19,0,0 +BRDA:136,19,1,0 +BRDA:140,20,0,0 +BRDA:140,20,1,0 +BRDA:142,21,0,0 +BRDA:142,21,1,0 +BRDA:161,22,0,1097 +BRDA:161,22,1,267 +BRDA:163,23,0,40 +BRDA:163,23,1,227 +BRDA:167,24,0,3 +BRDA:167,24,1,37 +BRDA:174,25,0,434 +BRDA:174,25,1,760 +BRDA:176,26,0,1 +BRDA:176,26,1,226 +BRDA:176,27,0,227 +BRDA:176,27,1,3 +BRDA:188,28,0,3 +BRDA:188,28,1,1 +BRDA:197,29,0,0 +BRDA:197,29,1,3 +BRDA:210,30,0,0 +BRDA:210,30,1,0 +BRDA:211,31,0,0 +BRDA:211,31,1,0 +BRDA:221,32,0,11 +BRDA:221,32,1,82 +BRDA:235,33,0,3 +BRDA:235,33,1,0 +BRDA:236,34,0,3 +BRDA:236,34,1,0 +BRDA:236,34,2,0 +BRDA:242,35,0,0 +BRDA:242,35,1,0 +BRDA:243,36,0,0 +BRDA:243,36,1,0 +BRDA:243,36,2,0 +BRDA:329,37,0,93 +BRDA:347,38,0,6 +BRDA:371,39,0,39 +BRDA:371,39,1,135 +BRDA:371,40,0,174 +BRDA:371,40,1,174 +BRDA:395,41,0,0 +BRDA:395,41,1,0 +BRDA:403,42,0,5828 +BRDA:403,42,1,5647 +BRDA:403,43,0,11475 +BRDA:403,43,1,5828 +BRDA:404,44,0,0 +BRDA:404,44,1,5828 +BRDA:412,45,0,3726 +BRDA:412,45,1,8270 +BRDA:412,46,0,11996 +BRDA:412,46,1,8270 +BRDA:412,46,2,8270 +BRDA:418,47,0,5647 +BRDA:418,47,1,0 +BRDA:438,48,0,2156 +BRDA:438,48,1,4 +BRDA:450,49,0,0 +BRDA:451,50,0,7740 +BRDA:451,50,1,954 +BRDA:467,51,0,455 +BRDA:467,51,1,499 +BRDA:468,52,0,455 +BRDA:468,52,1,452 +BRDA:474,53,0,380 +BRDA:474,53,1,119 +BRDA:475,54,0,38 +BRDA:475,54,1,44 +BRDA:475,54,2,4 +BRDA:475,54,3,0 +BRDA:475,54,4,0 +BRDA:475,54,5,0 +BRDA:475,54,6,8 +BRDA:475,54,7,13 +BRDA:475,54,8,70 +BRDA:475,54,9,108 +BRDA:475,54,10,0 +BRDA:475,54,11,2 +BRDA:475,54,12,84 +BRDA:475,54,13,3 +BRDA:475,54,14,4 +BRDA:475,54,15,2 +BRDA:475,54,16,0 +BRDA:475,54,17,0 +BRDA:499,55,0,0 +BRDA:499,55,1,8 +BRDA:504,56,0,3 +BRDA:504,56,1,10 +BRDA:505,57,0,13 +BRDA:505,57,1,8 +BRDA:505,57,2,5 +BRDA:511,58,0,13 +BRDA:511,58,1,0 +BRDA:512,59,0,1 +BRDA:512,59,1,12 +BRDA:530,60,0,0 +BRDA:530,60,1,84 +BRDA:530,61,0,84 +BRDA:530,61,1,0 +BRDA:546,62,0,0 +BRDA:546,62,1,0 +BRDA:556,63,0,12 +BRDA:556,63,1,486 +BRDA:562,64,0,22 +BRDA:562,64,1,476 +BRDA:563,65,0,22 +BRDA:563,65,1,0 +BRDA:590,66,0,71 +BRDA:590,66,1,427 +BRDA:592,67,0,71 +BRDA:592,67,1,0 +BRDA:594,68,0,0 +BRDA:594,68,1,141 +BRDA:595,69,0,141 +BRDA:595,69,1,141 +BRDA:595,69,2,141 +BRDA:606,70,0,70 +BRDA:606,70,1,71 +BRDA:615,71,0,1 +BRDA:615,71,1,70 +BRDA:618,72,0,0 +BRDA:618,72,1,498 +BRDA:620,73,0,0 +BRDA:620,73,1,0 +BRDA:622,74,0,0 +BRDA:622,74,1,0 +BRDA:628,75,0,0 +BRDA:628,75,1,0 +BRDA:639,76,0,0 +BRDA:640,77,0,891 +BRDA:640,77,1,0 +BRDA:647,78,0,7 +BRDA:647,78,1,4420 +BRDA:656,79,0,1019 +BRDA:658,80,0,1087 +BRDA:658,80,1,0 +BRDA:658,81,0,1087 +BRDA:658,81,1,1087 +BRDA:707,82,0,850 +BRDA:707,82,1,7844 +BRDA:711,83,0,537 +BRDA:711,83,1,8157 +BRDA:718,84,0,4700 +BRDA:718,84,1,3993 +BRDA:718,85,0,8693 +BRDA:718,85,1,4063 +BRDA:718,85,2,4057 +BRDA:719,86,0,4687 +BRDA:719,86,1,13 +BRDA:726,87,0,11 +BRDA:726,87,1,3982 +BRDA:756,88,0,67 +BRDA:756,88,1,303 +BRDA:756,89,0,370 +BRDA:756,89,1,370 +BRDA:759,90,0,67 +BRDA:759,90,1,303 +BRDA:761,91,0,51 +BRDA:761,91,1,28 +BRDA:775,92,0,2 +BRDA:775,92,1,7 +BRDA:775,93,0,9 +BRDA:775,93,1,9 +BRDA:778,94,0,9 +BRDA:778,94,1,0 +BRDA:781,95,0,2 +BRDA:781,95,1,0 +BRDA:793,96,0,80 +BRDA:793,96,1,73 +BRDA:793,96,2,43 +BRDA:793,96,3,30 +BRDA:801,97,0,0 +BRDA:801,97,1,0 +BRDA:801,97,2,0 +BRDA:811,98,0,5 +BRDA:811,98,1,0 +BRDA:812,99,0,5 +BRDA:812,99,1,0 +BRDA:818,100,0,5 +BRDA:818,100,1,0 +BRDA:818,101,0,5 +BRDA:818,101,1,5 +BRDA:841,102,0,2 +BRDA:841,102,1,1 +BRDA:841,103,0,3 +BRDA:841,103,1,2 +BRDA:841,103,2,2 +BRDA:845,104,0,2 +BRDA:845,104,1,0 +BRDA:877,105,0,0 +BRDA:879,106,0,7 +BRDA:879,106,1,1 +BRDA:884,107,0,8 +BRDA:884,107,1,8 +BRDA:885,108,0,7 +BRDA:885,108,1,1 +BRDA:885,109,0,8 +BRDA:885,109,1,7 +BRDA:887,110,0,8 +BRDA:887,110,1,8 +BRDA:888,111,0,7 +BRDA:888,111,1,1 +BRDA:888,112,0,8 +BRDA:888,112,1,7 +BRDA:902,113,0,7 +BRDA:902,113,1,7 +BRDA:902,114,0,14 +BRDA:902,114,1,14 +BRDA:902,114,2,11 +BRDA:939,115,0,211 +BRDA:939,115,1,8 +BRDA:942,116,0,157 +BRDA:942,116,1,110 +BRDA:944,117,0,616 +BRDA:944,117,1,586 +BRDA:947,118,0,616 +BRDA:947,118,1,0 +BRDA:953,119,0,8 +BRDA:953,119,1,0 +BRDA:955,120,0,137 +BRDA:955,120,1,47 +BRDA:958,121,0,137 +BRDA:958,121,1,0 +BRDA:972,122,0,6 +BRDA:972,122,1,10 +BRDA:972,123,0,16 +BRDA:972,123,1,16 +BRDA:975,124,0,10 +BRDA:975,124,1,0 +BRDA:981,125,0,0 +BRDA:981,125,1,0 +BRDA:1022,126,0,14 +BRDA:1022,126,1,0 +BRDA:1066,127,0,4 +BRDA:1066,127,1,0 +BRDA:1086,128,0,0 +BRDA:1086,128,1,0 +BRDA:1091,129,0,0 +BRDA:1091,129,1,0 +BRDA:1099,130,0,0 +BRDA:1099,130,1,0 +BRDA:1105,131,0,0 +BRDA:1105,131,1,0 +BRDA:1106,132,0,0 +BRDA:1106,132,1,0 +BRDA:1116,133,0,8 +BRDA:1116,133,1,8 +BRDA:1125,134,0,0 +BRDA:1125,134,1,0 +BRDA:1135,135,0,0 +BRDA:1135,135,1,11 +BRDA:1136,136,0,11 +BRDA:1136,136,1,0 +BRDA:1144,137,0,330 +BRDA:1144,137,1,11 +BRDA:1150,138,0,0 +BRDA:1150,138,1,0 +BRDA:1150,138,2,0 +BRDA:1155,139,0,0 +BRDA:1155,139,1,0 +BRDA:1155,139,2,0 +BRDA:1173,140,0,0 +BRDA:1173,140,1,0 +BRDA:1173,140,2,0 +BRDA:1173,140,3,0 +BRDA:1217,141,0,47 +BRDA:1217,141,1,33 +BRDA:1217,141,2,46 +BRDA:1217,141,3,32 +BRDA:1221,142,0,1 +BRDA:1221,142,1,45 +BRF:312 +BRH:208 +end_of_record +TN: +SF:warehouse\identity.js +FN:10,getMergePropColumns +FN:35,getMergeRulesTableName +FN:56,getMergeRuleEvent +FNF:3 +FNH:1 +FNDA:0,getMergePropColumns +FNDA:0,getMergeRulesTableName +FNDA:952,getMergeRuleEvent +DA:1,10 +DA:2,10 +DA:4,10 +DA:5,10 +DA:6,10 +DA:11,0 +DA:12,0 +DA:16,0 +DA:19,0 +DA:20,0 +DA:23,0 +DA:24,0 +DA:30,0 +DA:36,0 +DA:37,0 +DA:41,0 +DA:44,0 +DA:45,0 +DA:47,0 +DA:48,0 +DA:52,0 +DA:57,952 +DA:58,952 +DA:59,952 +DA:62,0 +DA:63,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:72,0 +DA:75,0 +DA:81,0 +DA:86,0 +DA:90,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:99,0 +DA:101,0 +DA:102,0 +DA:105,0 +DA:106,0 +DA:109,0 +DA:112,0 +DA:116,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:129,0 +DA:137,0 +DA:140,10 +LF:55 +LH:9 +BRDA:12,0,0,0 +BRDA:12,0,1,0 +BRDA:13,1,0,0 +BRDA:13,1,1,0 +BRDA:19,2,0,0 +BRDA:19,2,1,0 +BRDA:37,3,0,0 +BRDA:37,3,1,0 +BRDA:38,4,0,0 +BRDA:38,4,1,0 +BRDA:44,5,0,0 +BRDA:44,5,1,0 +BRDA:56,6,0,0 +BRDA:58,7,0,952 +BRDA:58,7,1,0 +BRDA:62,8,0,0 +BRDA:62,8,1,0 +BRDA:67,9,0,0 +BRDA:67,9,1,0 +BRDA:68,10,0,0 +BRDA:68,10,1,0 +BRDA:69,11,0,0 +BRDA:69,11,1,0 +BRDA:75,12,0,0 +BRDA:75,12,1,0 +BRDA:76,13,0,0 +BRDA:76,13,1,0 +BRDA:76,13,2,0 +BRDA:76,13,3,0 +BRDA:94,14,0,0 +BRDA:94,14,1,0 +BRDA:97,15,0,0 +BRDA:97,15,1,0 +BRDA:105,16,0,0 +BRDA:105,16,1,0 +BRDA:122,17,0,0 +BRDA:122,17,1,0 +BRDA:135,18,0,0 +BRDA:135,18,1,0 +BRF:39 +BRH:1 +end_of_record +TN: +SF:warehouse\index.js +FN:34,(anonymous_0) +FN:81,excludeRudderCreatedTableNames +FN:118,setDataFromColumnMappingAndComputeColumnTypes +FN:127,(anonymous_3) +FN:181,setDataFromInputAndComputeColumnTypes +FN:192,(anonymous_5) +FN:248,getColumns +FN:257,(anonymous_7) +FN:290,storeRudderEvent +FN:484,enhanceContextWithSourceDestInfo +FN:500,processWarehouseMessage +FNF:11 +FNH:11 +FNDA:49089,(anonymous_0) +FNDA:287,excludeRudderCreatedTableNames +FNDA:2586,setDataFromColumnMappingAndComputeColumnTypes +FNDA:12784,(anonymous_3) +FNDA:7328,setDataFromInputAndComputeColumnTypes +FNDA:44899,(anonymous_5) +FNDA:1412,getColumns +FNDA:59434,(anonymous_7) +FNDA:981,storeRudderEvent +FNDA:991,enhanceContextWithSourceDestInfo +FNDA:991,processWarehouseMessage +DA:2,10 +DA:3,10 +DA:4,10 +DA:12,10 +DA:13,10 +DA:15,10 +DA:16,10 +DA:17,10 +DA:18,10 +DA:19,10 +DA:20,10 +DA:21,10 +DA:22,10 +DA:23,10 +DA:24,10 +DA:26,10 +DA:32,10 +DA:34,10 +DA:35,49089 +DA:36,49089 +DA:38,5815 +DA:40,16066 +DA:42,27208 +DA:44,27208 +DA:45,3871 +DA:47,23337 +DA:51,23328 +DA:53,9 +DA:56,10 +DA:65,10 +DA:67,10 +DA:85,287 +DA:90,5 +DA:92,282 +DA:126,2586 +DA:127,2586 +DA:128,12784 +DA:130,12784 +DA:131,2019 +DA:133,10765 +DA:136,12776 +DA:138,12776 +DA:142,997 +DA:144,997 +DA:145,997 +DA:147,11779 +DA:148,11779 +DA:149,3868 +DA:152,11779 +DA:154,11779 +DA:191,7328 +DA:192,6689 +DA:193,44899 +DA:197,4803 +DA:208,40096 +DA:210,40096 +DA:211,3022 +DA:213,37074 +DA:218,8 +DA:221,37074 +DA:222,37074 +DA:223,0 +DA:225,37074 +DA:226,37074 +DA:227,37074 +DA:229,37074 +DA:233,1699 +DA:236,35375 +DA:238,35375 +DA:249,1412 +DA:250,1412 +DA:251,1412 +DA:253,1412 +DA:254,177 +DA:255,177 +DA:257,1412 +DA:258,59434 +DA:264,1412 +DA:269,7 +DA:273,1405 +DA:276,10 +DA:291,981 +DA:292,48 +DA:294,48 +DA:296,48 +DA:485,991 +DA:486,0 +DA:488,991 +DA:489,943 +DA:491,48 +DA:492,48 +DA:493,48 +DA:494,48 +DA:495,48 +DA:497,48 +DA:501,991 +DA:502,991 +DA:515,991 +DA:519,991 +DA:520,991 +DA:521,991 +DA:523,991 +DA:525,991 +DA:526,6 +DA:527,6 +DA:531,991 +DA:533,991 +DA:534,6 +DA:541,991 +DA:544,319 +DA:545,319 +DA:547,319 +DA:556,319 +DA:564,319 +DA:574,319 +DA:575,319 +DA:579,319 +DA:582,319 +DA:583,317 +DA:585,317 +DA:587,317 +DA:595,309 +DA:602,309 +DA:610,309 +DA:621,311 +DA:622,24 +DA:624,287 +DA:625,287 +DA:627,287 +DA:635,287 +DA:643,287 +DA:653,287 +DA:657,287 +DA:671,280 +DA:677,280 +DA:678,280 +DA:679,0 +DA:683,280 +DA:687,144 +DA:688,144 +DA:689,144 +DA:697,144 +DA:705,144 +DA:716,144 +DA:727,144 +DA:728,144 +DA:729,0 +DA:730,0 +DA:731,0 +DA:732,0 +DA:733,0 +DA:737,144 +DA:738,144 +DA:739,144 +DA:747,144 +DA:754,144 +DA:762,144 +DA:769,144 +DA:770,144 +DA:771,0 +DA:777,144 +DA:778,0 +DA:780,144 +DA:781,144 +DA:782,144 +DA:791,144 +DA:792,144 +DA:798,144 +DA:803,144 +DA:806,144 +DA:814,144 +DA:819,144 +DA:823,280 +DA:824,280 +DA:825,280 +DA:834,280 +DA:843,280 +DA:851,280 +DA:853,280 +DA:854,144 +DA:862,136 +DA:863,136 +DA:873,280 +DA:878,280 +DA:881,280 +DA:882,280 +DA:883,0 +DA:887,280 +DA:890,120 +DA:891,120 +DA:892,120 +DA:900,120 +DA:909,120 +DA:917,120 +DA:925,120 +DA:927,120 +DA:932,120 +DA:935,120 +DA:936,120 +DA:937,0 +DA:941,120 +DA:944,128 +DA:945,128 +DA:946,128 +DA:954,128 +DA:963,128 +DA:971,128 +DA:979,128 +DA:981,128 +DA:986,128 +DA:989,128 +DA:990,128 +DA:991,0 +DA:995,128 +DA:998,0 +DA:999,0 +DA:1000,0 +DA:1002,0 +DA:1005,0 +DA:1007,976 +DA:1010,10 +LF:221 +LH:203 +BRDA:27,0,0,10 +BRDA:27,0,1,9 +BRDA:32,1,0,10 +BRDA:32,1,1,10 +BRDA:36,2,0,5815 +BRDA:36,2,1,16066 +BRDA:36,2,2,27208 +BRDA:38,3,0,5758 +BRDA:38,3,1,57 +BRDA:44,4,0,3871 +BRDA:44,4,1,23337 +BRDA:47,5,0,23328 +BRDA:47,5,1,9 +BRDA:48,6,0,23337 +BRDA:48,6,1,23328 +BRDA:51,7,0,23328 +BRDA:51,7,1,11646 +BRDA:83,8,0,0 +BRDA:85,9,0,5 +BRDA:85,9,1,282 +BRDA:86,10,0,287 +BRDA:86,10,1,287 +BRDA:86,10,2,7 +BRDA:126,11,0,0 +BRDA:126,11,1,2586 +BRDA:130,12,0,2019 +BRDA:130,12,1,10765 +BRDA:138,13,0,997 +BRDA:138,13,1,11779 +BRDA:138,14,0,12776 +BRDA:138,14,1,12331 +BRDA:148,15,0,3868 +BRDA:148,15,1,7911 +BRDA:188,16,0,1390 +BRDA:189,17,0,2525 +BRDA:191,18,0,639 +BRDA:191,18,1,6689 +BRDA:191,19,0,7328 +BRDA:191,19,1,6737 +BRDA:193,20,0,4803 +BRDA:193,20,1,40096 +BRDA:194,21,0,44899 +BRDA:194,21,1,4811 +BRDA:194,21,2,248 +BRDA:210,22,0,3022 +BRDA:210,22,1,37074 +BRDA:213,23,0,8 +BRDA:213,23,1,37066 +BRDA:214,24,0,37074 +BRDA:214,24,1,648 +BRDA:214,24,2,16 +BRDA:222,25,0,0 +BRDA:222,25,1,37074 +BRDA:226,26,0,37074 +BRDA:226,26,1,0 +BRDA:229,27,0,1699 +BRDA:229,27,1,35375 +BRDA:230,28,0,37074 +BRDA:230,28,1,37074 +BRDA:250,29,0,176 +BRDA:250,29,1,1236 +BRDA:253,30,0,177 +BRDA:253,30,1,1235 +BRDA:258,31,0,59434 +BRDA:258,31,1,0 +BRDA:264,32,0,7 +BRDA:264,32,1,1405 +BRDA:265,33,0,1412 +BRDA:265,33,1,22 +BRDA:265,33,2,14 +BRDA:291,34,0,48 +BRDA:291,34,1,933 +BRDA:485,35,0,0 +BRDA:485,35,1,991 +BRDA:488,36,0,943 +BRDA:488,36,1,48 +BRDA:491,37,0,48 +BRDA:491,37,1,0 +BRDA:516,38,0,3 +BRDA:516,38,1,988 +BRDA:516,39,0,991 +BRDA:516,39,1,991 +BRDA:521,40,0,991 +BRDA:521,40,1,989 +BRDA:523,41,0,991 +BRDA:523,41,1,989 +BRDA:525,42,0,6 +BRDA:525,42,1,985 +BRDA:533,43,0,6 +BRDA:533,43,1,985 +BRDA:533,44,0,991 +BRDA:533,44,1,985 +BRDA:535,45,0,0 +BRDA:535,45,1,6 +BRDA:535,46,0,6 +BRDA:535,46,1,0 +BRDA:541,47,0,319 +BRDA:541,47,1,144 +BRDA:541,47,2,144 +BRDA:541,47,3,280 +BRDA:541,47,4,120 +BRDA:541,47,5,128 +BRDA:541,47,6,0 +BRDA:541,47,7,0 +BRDA:582,48,0,317 +BRDA:582,48,1,2 +BRDA:621,49,0,24 +BRDA:621,49,1,287 +BRDA:678,50,0,0 +BRDA:678,50,1,280 +BRDA:701,51,0,144 +BRDA:701,51,1,0 +BRDA:728,52,0,0 +BRDA:728,52,1,144 +BRDA:770,53,0,0 +BRDA:770,53,1,144 +BRDA:777,54,0,0 +BRDA:777,54,1,144 +BRDA:800,55,0,144 +BRDA:800,55,1,0 +BRDA:853,56,0,144 +BRDA:853,56,1,136 +BRDA:862,57,0,136 +BRDA:862,57,1,0 +BRDA:882,58,0,0 +BRDA:882,58,1,280 +BRDA:936,59,0,0 +BRDA:936,59,1,120 +BRDA:990,60,0,0 +BRDA:990,60,1,128 +BRDA:999,61,0,0 +BRDA:999,61,1,0 +BRF:132 +BRH:109 +end_of_record +TN: +SF:warehouse\util.js +FN:12,(anonymous_0) +FN:21,(anonymous_1) +FN:33,validTimestamp +FN:44,getVersionedUtils +FN:55,isRudderSourcesEvent +FN:59,(anonymous_5) +FNF:6 +FNH:6 +FNDA:54238,(anonymous_0) +FNDA:54449,(anonymous_1) +FNDA:28193,validTimestamp +FNDA:991,getVersionedUtils +FNDA:22,isRudderSourcesEvent +FNDA:72,(anonymous_5) +DA:1,10 +DA:2,10 +DA:4,10 +DA:5,10 +DA:7,10 +DA:8,10 +DA:10,10 +DA:12,10 +DA:13,54238 +DA:14,54238 +DA:21,10 +DA:22,54449 +DA:28,10 +DA:34,28193 +DA:36,4856 +DA:37,4856 +DA:38,4856 +DA:41,23337 +DA:45,991 +DA:47,0 +DA:49,991 +DA:51,0 +DA:56,22 +DA:59,10 +DA:60,72 +DA:61,40 +DA:62,40 +DA:63,8 +DA:65,32 +DA:67,32 +DA:70,10 +LF:31 +LH:29 +BRDA:15,0,0,54238 +BRDA:15,0,1,53950 +BRDA:15,0,2,39808 +BRDA:15,0,3,14142 +BRDA:34,1,0,4856 +BRDA:34,1,1,23337 +BRDA:37,2,0,4856 +BRDA:37,2,1,0 +BRDA:37,3,0,4856 +BRDA:37,3,1,4856 +BRDA:45,4,0,0 +BRDA:45,4,1,991 +BRDA:45,4,2,0 +BRDA:56,5,0,22 +BRDA:56,5,1,15 +BRDA:60,6,0,40 +BRDA:60,6,1,32 +BRDA:62,7,0,8 +BRDA:62,7,1,32 +BRDA:62,8,0,40 +BRDA:62,8,1,40 +BRDA:67,9,0,32 +BRDA:67,9,1,16 +BRF:23 +BRH:20 +end_of_record +TN: +SF:warehouse\config\WHAliasConfig.js +FNF:0 +FNH:0 +DA:1,10 +DA:5,10 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:warehouse\config\WHDefaultConfig.js +FN:12,(anonymous_0) +FNF:1 +FNH:1 +FNDA:991,(anonymous_0) +DA:1,10 +DA:3,10 +DA:13,991 +DA:18,10 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:warehouse\config\WHGroupConfig.js +FNF:0 +FNH:0 +DA:1,10 +DA:5,10 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:warehouse\config\WHPageConfig.js +FN:4,(anonymous_0) +FNF:1 +FNH:1 +FNDA:144,(anonymous_0) +DA:1,10 +DA:3,10 +DA:4,144 +DA:7,10 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:warehouse\config\WHScreenConfig.js +FN:4,(anonymous_0) +FNF:1 +FNH:1 +FNDA:136,(anonymous_0) +DA:1,10 +DA:3,10 +DA:4,136 +DA:7,10 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:warehouse\config\WHTrackConfig.js +FNF:0 +FNH:0 +DA:1,10 +DA:5,10 +LF:2 +LH:2 +BRF:0 +BRH:0 +end_of_record +TN: +SF:warehouse\config\WHTrackEventTableConfig.js +FN:4,(anonymous_0) +FNF:1 +FNH:1 +FNDA:287,(anonymous_0) +DA:1,10 +DA:3,10 +DA:5,287 +DA:12,10 +LF:4 +LH:4 +BRDA:5,0,0,32 +BRDA:5,0,1,255 +BRDA:5,1,0,287 +BRDA:5,1,1,287 +BRF:4 +BRH:4 +end_of_record +TN: +SF:warehouse\config\WHTracksTableConfig.js +FN:5,(anonymous_0) +FNF:1 +FNH:1 +FNDA:317,(anonymous_0) +DA:1,10 +DA:2,10 +DA:4,10 +DA:6,317 +DA:12,10 +LF:5 +LH:5 +BRDA:6,0,0,40 +BRDA:6,0,1,277 +BRDA:6,1,0,317 +BRDA:6,1,1,317 +BRF:4 +BRH:4 +end_of_record +TN: +SF:warehouse\config\WHUserConfig.js +FN:4,(anonymous_0) +FNF:1 +FNH:1 +FNDA:144,(anonymous_0) +DA:1,10 +DA:3,10 +DA:5,144 +DA:10,10 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:warehouse\config\helpers.js +FN:4,(anonymous_0) +FN:8,(anonymous_1) +FN:12,(anonymous_2) +FN:24,isDataLakeProvider +FNF:4 +FNH:3 +FNDA:0,(anonymous_0) +FNDA:1599,(anonymous_1) +FNDA:1415,(anonymous_2) +FNDA:52826,isDataLakeProvider +DA:1,10 +DA:2,10 +DA:4,10 +DA:5,0 +DA:8,10 +DA:9,1599 +DA:12,10 +DA:13,1415 +DA:14,1415 +DA:15,1599 +DA:16,1599 +DA:17,1351 +DA:21,1415 +DA:25,52826 +DA:32,10 +LF:15 +LH:14 +BRDA:5,0,0,0 +BRDA:5,0,1,0 +BRDA:16,1,0,1351 +BRDA:16,1,1,248 +BRDA:26,2,0,52826 +BRDA:26,2,1,45021 +BRDA:26,2,2,45021 +BRF:7 +BRH:5 +end_of_record +TN: +SF:warehouse\v1\util.js +FN:6,safeTableName +FN:36,safeColumnName +FN:84,transformName +FN:133,transformNameToBlendoCase +FN:146,toBlendoCase +FN:150,transformTableName +FN:155,transformColumnName +FNF:7 +FNH:7 +FNDA:1412,safeTableName +FNDA:51400,safeColumnName +FNDA:37638,transformName +FNDA:40,transformNameToBlendoCase +FNDA:2,toBlendoCase +FNDA:319,transformTableName +FNDA:37361,transformColumnName +DA:1,10 +DA:3,10 +DA:4,10 +DA:7,1412 +DA:9,1412 +DA:10,1412 +DA:11,1412 +DA:12,0 +DA:14,1412 +DA:15,176 +DA:16,1236 +DA:17,177 +DA:18,177 +DA:20,1059 +DA:22,1412 +DA:26,16 +DA:28,1412 +DA:30,175 +DA:33,1237 +DA:37,51400 +DA:39,51400 +DA:40,51400 +DA:41,51400 +DA:42,0 +DA:44,51400 +DA:45,5798 +DA:46,45602 +DA:47,5637 +DA:48,5637 +DA:50,39965 +DA:52,51400 +DA:56,9200 +DA:58,51400 +DA:60,7623 +DA:62,43777 +DA:85,37638 +DA:86,37638 +DA:87,37638 +DA:88,424941 +DA:89,424941 +DA:90,424941 +DA:95,396381 +DA:97,28560 +DA:98,26387 +DA:100,28560 +DA:103,37638 +DA:104,37182 +DA:106,37638 +DA:107,37638 +DA:111,55 +DA:113,37583 +DA:116,37638 +DA:117,349 +DA:119,37638 +DA:120,3880 +DA:122,37638 +DA:134,40 +DA:136,40 +DA:137,40 +DA:138,2 +DA:140,40 +DA:141,0 +DA:143,40 +DA:147,2 +DA:151,319 +DA:152,319 +DA:156,37361 +DA:157,37361 +DA:158,37361 +DA:163,10 +LF:70 +LH:67 +BRDA:6,0,0,0 +BRDA:9,1,0,1412 +BRDA:9,1,1,1409 +BRDA:11,2,0,0 +BRDA:11,2,1,1412 +BRDA:14,3,0,176 +BRDA:14,3,1,1236 +BRDA:16,4,0,177 +BRDA:16,4,1,1059 +BRDA:22,5,0,16 +BRDA:22,5,1,1396 +BRDA:23,6,0,1412 +BRDA:23,6,1,1409 +BRDA:28,7,0,175 +BRDA:28,7,1,1237 +BRDA:36,8,0,0 +BRDA:39,9,0,51400 +BRDA:39,9,1,51331 +BRDA:41,10,0,0 +BRDA:41,10,1,51400 +BRDA:44,11,0,5798 +BRDA:44,11,1,45602 +BRDA:46,12,0,5637 +BRDA:46,12,1,39965 +BRDA:52,13,0,9200 +BRDA:52,13,1,42200 +BRDA:53,14,0,51400 +BRDA:53,14,1,51331 +BRDA:58,15,0,7623 +BRDA:58,15,1,43777 +BRDA:84,16,0,0 +BRDA:90,17,0,396381 +BRDA:90,17,1,28560 +BRDA:91,18,0,424941 +BRDA:91,18,1,406409 +BRDA:91,18,2,316270 +BRDA:91,18,3,270594 +BRDA:91,18,4,45900 +BRDA:91,18,5,44708 +BRDA:97,19,0,26387 +BRDA:97,19,1,2173 +BRDA:103,20,0,37182 +BRDA:103,20,1,456 +BRDA:107,21,0,55 +BRDA:107,21,1,37583 +BRDA:116,22,0,349 +BRDA:116,22,1,37289 +BRDA:116,23,0,37638 +BRDA:116,23,1,37614 +BRDA:116,23,2,37614 +BRDA:119,24,0,3880 +BRDA:119,24,1,33758 +BRDA:133,25,0,0 +BRDA:137,26,0,2 +BRDA:137,26,1,38 +BRDA:140,27,0,0 +BRDA:140,27,1,40 +BRDA:146,28,0,0 +BRDA:150,29,0,24 +BRDA:151,30,0,319 +BRDA:151,30,1,317 +BRDA:152,31,0,2 +BRDA:152,31,1,317 +BRDA:155,32,0,0 +BRDA:157,33,0,37361 +BRDA:157,33,1,37321 +BRDA:158,34,0,40 +BRDA:158,34,1,37321 +BRF:68 +BRH:59 +end_of_record diff --git a/jest.config.js b/jest.config.js index f126aee9ca9..07ba4bfaa53 100644 --- a/jest.config.js +++ b/jest.config.js @@ -79,7 +79,11 @@ module.exports = { // moduleNameMapper: {}, // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - modulePathIgnorePatterns: ['/test/__mocks__/axios.js'], + modulePathIgnorePatterns: [ + '/test/__mocks__/axios.js', + '/dist/', + '/dist-test/', + ], // Activates notifications for test results notify: true, diff --git a/jest.config.typescript.js b/jest.config.typescript.js index 7350f1e19d1..64e07de0da6 100644 --- a/jest.config.typescript.js +++ b/jest.config.typescript.js @@ -78,7 +78,11 @@ module.exports = { // moduleNameMapper: {}, // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - modulePathIgnorePatterns: ['/test/__mocks__/axios.js'], + modulePathIgnorePatterns: [ + '/test/__mocks__/axios.js', + '/dist/', + '/dist-test/', + ], // Activates notifications for test results notify: true, @@ -128,7 +132,7 @@ module.exports = { // snapshotSerializers: [], // The test environment that will be used for testing - testEnvironment: 'node', + testEnvironment: 'allure-jest/node', // Options that will be passed to the testEnvironment // testEnvironmentOptions: {}, diff --git a/jest.default.config.js b/jest.default.config.js index d1b5390b9e7..8661387a772 100644 --- a/jest.default.config.js +++ b/jest.default.config.js @@ -79,7 +79,7 @@ module.exports = { // moduleNameMapper: {}, // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], + modulePathIgnorePatterns: ['/dist/', '/dist-test/'], // Activates notifications for test results notify: true, diff --git a/package-lock.json b/package-lock.json index 5f9e7229f6d..1b1e68d9412 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rudder-transformer", - "version": "1.86.0", + "version": "1.93.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "rudder-transformer", - "version": "1.86.0", + "version": "1.93.0", "license": "ISC", "dependencies": { "@amplitude/ua-parser-js": "0.7.24", @@ -15,23 +15,24 @@ "@aws-sdk/credential-providers": "^3.391.0", "@aws-sdk/lib-storage": "^3.637.0", "@bugsnag/js": "^7.20.2", - "@datadog/pprof": "^3.1.0", + "@datadog/pprof": "^5.5.1", "@koa/router": "^12.0.0", "@ndhoule/extend": "^2.0.0", "@pyroscope/nodejs": "^0.2.9", - "@rudderstack/integrations-lib": "^0.2.13", - "@rudderstack/json-template-engine": "^0.18.0", + "@rudderstack/integrations-lib": "^0.2.25", + "@rudderstack/json-template-engine": "^0.19.5", "@rudderstack/workflow-engine": "^0.8.13", "@shopify/jest-koa-mocks": "^5.1.1", - "ajv": "^8.12.0", + "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^2.1.1", "amazon-dsp-formatter": "^1.0.2", - "axios": "^1.7.3", + "axios": "^1.7.9", "btoa": "^1.2.1", "component-each": "^0.2.6", "crypto-js": "^4.2.0", "dotenv": "^16.0.3", + "fast-xml-parser": "^4.5.1", "flat": "^5.0.2", "form-data": "^4.0.0", "get-value": "^3.0.1", @@ -41,22 +42,21 @@ "ioredis": "^5.3.2", "is": "^3.3.0", "is-ip": "^3.1.0", - "isolated-vm": "4.5.0", + "isolated-vm": "5.0.3", "js-sha1": "^0.6.0", "json-diff": "^1.0.3", "json-size": "^1.0.0", "jsontoxml": "^1.0.1", - "jstoxml": "^5.0.2", - "koa": "^2.15.3", + "koa": "^2.15.4", "koa-bodyparser": "^4.4.0", "koa2-swagger-ui": "^5.7.0", - "libphonenumber-js": "^1.11.12", + "libphonenumber-js": "^1.11.18", "lodash": "^4.17.21", "match-json": "^1.3.5", "md5": "^2.3.0", "modclean": "^3.0.0-beta.1", "moment": "^2.29.4", - "moment-timezone": "^0.5.43", + "moment-timezone": "^0.5.47", "node-cache": "^5.1.2", "node-fetch": "^2.6.12", "oauth-1.0a": "^2.2.6", @@ -69,12 +69,12 @@ "sha256": "^0.2.0", "sqlstring": "^2.3.3", "stacktrace-parser": "^0.1.10", - "statsd-client": "^0.4.7", "truncate-utf8-bytes": "^1.0.2", "ua-parser-js": "^1.0.37", "unset-value": "^2.0.1", "uuid": "^9.0.1", "valid-url": "^1.0.9", + "validator": "^13.12.0", "zod": "^3.22.4" }, "devDependencies": { @@ -90,6 +90,7 @@ "@types/supertest": "^6.0.2", "@typescript-eslint/eslint-plugin": "^5.61.0", "@typescript-eslint/parser": "^5.59.2", + "allure-jest": "^3.0.7", "axios-mock-adapter": "^1.22.0", "benchmark-suite": "^0.1.8", "commander": "^10.0.1", @@ -109,6 +110,8 @@ "http-terminator": "^3.2.0", "husky": "^9.1.6", "jest": "^29.5.0", + "jest-diff": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-sonar": "^0.2.16", "jest-when": "^3.5.2", "lint-staged": "^13.2.2", @@ -124,64 +127,51 @@ "typescript": "^5.0.4" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@amplitude/ua-parser-js": { "version": "0.7.24", + "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.24.tgz", + "integrity": "sha512-VbQuJymJ20WEw0HtI2np7EdC3NJGUWi8+Xdbc7uk8WfMIF308T0howpzkQ3JFMN7ejnrcSM/OyNGveeE3TP3TA==", "license": "MIT", "engines": { "node": "*" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.6", + "version": "11.7.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", + "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", "dev": true, "license": "MIT", "dependencies": { "@jsdevtools/ono": "^7.1.3", - "call-me-maybe": "^1.0.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" } }, "node_modules/@apidevtools/openapi-schemas": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", "dev": true, "license": "MIT", "engines": { @@ -190,6 +180,9 @@ }, "node_modules/@apidevtools/swagger-cli": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-cli/-/swagger-cli-4.0.4.tgz", + "integrity": "sha512-hdDT3B6GLVovCsRZYDi3+wMcB1HfetTU20l2DC8zD3iFRNMC6QNAZG5fo/6PYeHWBEv7ri4MvnlKodhNB0nt7g==", + "deprecated": "This package has been abandoned. Please switch to using the actively maintained @redocly/cli", "dev": true, "license": "MIT", "dependencies": { @@ -207,6 +200,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -221,6 +216,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { @@ -229,6 +226,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -237,6 +236,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -252,6 +253,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/cliui": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "license": "ISC", "dependencies": { @@ -262,6 +265,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -273,11 +278,15 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/@apidevtools/swagger-cli/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -290,6 +299,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -298,6 +309,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { @@ -310,6 +323,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -321,6 +336,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -335,6 +352,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -346,6 +365,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -357,6 +378,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { @@ -370,11 +393,15 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/y18n": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, "license": "ISC" }, "node_modules/@apidevtools/swagger-cli/node_modules/yargs": { "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "license": "MIT", "dependencies": { @@ -396,6 +423,8 @@ }, "node_modules/@apidevtools/swagger-cli/node_modules/yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "license": "ISC", "dependencies": { @@ -408,21 +437,25 @@ }, "node_modules/@apidevtools/swagger-methods": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", "dev": true, "license": "MIT" }, "node_modules/@apidevtools/swagger-parser": { - "version": "10.1.0", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz", + "integrity": "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==", "dev": true, "license": "MIT", "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.6", + "@apidevtools/json-schema-ref-parser": "11.7.2", "@apidevtools/openapi-schemas": "^2.1.0", "@apidevtools/swagger-methods": "^3.0.2", "@jsdevtools/ono": "^7.1.3", - "ajv": "^8.6.3", + "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", - "call-me-maybe": "^1.0.1" + "call-me-maybe": "^1.0.2" }, "peerDependencies": { "openapi-types": ">=7" @@ -430,20 +463,22 @@ }, "node_modules/@aws-crypto/crc32": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-crypto/crc32/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@aws-crypto/crc32c": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", @@ -453,6 +488,8 @@ }, "node_modules/@aws-crypto/sha1-browser": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/supports-web-crypto": "^5.2.0", @@ -463,4569 +500,1682 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-crypto/util": { + "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.650.0.tgz", - "integrity": "sha512-ng9Ta7emTgIAnUW52wi2KcNbAudGQPiXuPKJwtw67WQei3gHMpxvgCCRXP7AiB+LyB/fBURxraDkO5N+sPZp0w==", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.650.0", - "@aws-sdk/client-sts": "3.650.0", - "@aws-sdk/core": "3.649.0", - "@aws-sdk/credential-provider-node": "3.650.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.650.0.tgz", - "integrity": "sha512-6J7IS0f8ovhvbIAZaynOYP+jPX8344UlTjwHxjaXHgFvI8axu3+NslKtEEV5oHLhgzDvrKbinsu5lgE2n4Sqng==", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.649.0", - "@aws-sdk/credential-provider-node": "3.650.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", + "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.650.0" + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sts": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.650.0.tgz", - "integrity": "sha512-ISK0ZQYA7O5/WYgslpWy956lUBudGC9d7eL0FFbiL0j50N80Gx3RUv22ezvZgxJWE0W3DqNr4CE19sPYn4Lw8g==", + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.650.0", - "@aws-sdk/core": "3.649.0", - "@aws-sdk/credential-provider-node": "3.650.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.649.0.tgz", - "integrity": "sha512-IY43r256LhKAvdEVQO/FPdUyVpcZS5EVxh/WHVdNzuN1bNLoUK2rIzuZqVA0EGguvCxoXVmQv9m50GvG7cGktg==", + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/types": "^3.4.0", - "bowser": "^2.11.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.649.0.tgz", - "integrity": "sha512-x5DiLpZDG/AJmCIBnE3Xhpwy35QIo3WqNiOpw6ExVs1NydbM/e90zFPSfhME0FM66D/WorigvluBxxwjxDm/GA==", + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "license": "Apache-2.0", "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.758.0.tgz", + "integrity": "sha512-8bOXVYtf/0OUN0jXTIHLv3V0TAS6kvvCRAy7nmiL/fDde0O+ChW1WZU7CVPAOtFEpFCdKskDcxFspM7m1k6qyg==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-node": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/client-personalize": { - "version": "3.642.0", + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-personalize/-/client-personalize-3.758.0.tgz", + "integrity": "sha512-DHySS2YZD3NK6dd1lA6L0y/3Ktkygls3Lk6htCI0MvjZo3BsNmL8iS2lfj5kn1CP53QkN+6658hqvTsjSbywSg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-node": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/client-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz", - "integrity": "sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw==", + "node_modules/@aws-sdk/client-s3": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.758.0.tgz", + "integrity": "sha512-f8SlhU9/93OC/WEI6xVJf/x/GoQFj9a/xXK6QCtr5fvCjfSLgMVFmKTiIl/tgtDRzxUDc8YS6EGtbHjJ3Y/atg==", + "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-node": "3.758.0", + "@aws-sdk/middleware-bucket-endpoint": "3.734.0", + "@aws-sdk/middleware-expect-continue": "3.734.0", + "@aws-sdk/middleware-flexible-checksums": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-location-constraint": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-sdk-s3": "3.758.0", + "@aws-sdk/middleware-ssec": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/signature-v4-multi-region": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@aws-sdk/xml-builder": "3.734.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/eventstream-serde-browser": "^4.0.1", + "@smithy/eventstream-serde-config-resolver": "^4.0.1", + "@smithy/eventstream-serde-node": "^4.0.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-blob-browser": "^4.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/hash-stream-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/md5-js": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", + "@smithy/util-waiter": "^4.0.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", + "node_modules/@aws-sdk/client-sso": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.758.0.tgz", + "integrity": "sha512-BoGO6IIWrLyLxQG6txJw6RT2urmbtlwfggapNCrNPyYjlXpzTSJhBYjndg7TpDATFd0SXL0zm8y/tXsUXNkdYQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "node_modules/@aws-sdk/core": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.758.0.tgz", + "integrity": "sha512-0RswbdR9jt/XKemaLNuxi2gGr4xGlHyGxkTdhSQzCyUe9A9OPCoLl3rIESRguQEech+oJnbHk/wuiwHqTuP9sg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.5", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz", - "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==", + "node_modules/@aws-sdk/core/node_modules/fast-xml-parser": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", + "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "license": "MIT", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" + "strnum": "^1.0.5" }, - "engines": { - "node": ">=16.0.0" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz", - "integrity": "sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz", - "integrity": "sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-ini": "3.637.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.758.0.tgz", + "integrity": "sha512-y/rHZqyChlEkNRr59gn4hv0gjhJwGmdCdW0JI1K9p3P9p7EurWGjr2M6+goTn3ilOlcAwrl5oFKR5jLt27TkOA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.758.0.tgz", + "integrity": "sha512-N27eFoRrO6MeUNumtNHDW9WOiwfd59LPXPqDrIa3kWL/s+fOKFHb9xIcF++bAwtcZnAxKkgpDCUP+INNZskE+w==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz", - "integrity": "sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA==", + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.758.0.tgz", + "integrity": "sha512-Xt9/U8qUCiw1hihztWkNeIR+arg6P+yda10OuCHX6kFVx3auTlU7+hCqs3UxqniGU4dguHuftf3mRpi5/GJ33Q==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.637.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.758.0.tgz", + "integrity": "sha512-cymSKMcP5d+OsgetoIZ5QCe1wnp2Q/tq+uIxVdh9MbfdBBEnl9Ecq6dH6VlYS89sp4QKuxHxkWXVnbXU3Q19Aw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-env": "3.758.0", + "@aws-sdk/credential-provider-http": "3.758.0", + "@aws-sdk/credential-provider-process": "3.758.0", + "@aws-sdk/credential-provider-sso": "3.758.0", + "@aws-sdk/credential-provider-web-identity": "3.758.0", + "@aws-sdk/nested-clients": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.758.0.tgz", + "integrity": "sha512-+DaMv63wiq7pJrhIQzZYMn4hSarKiizDoJRvyR7WGhnn0oQ/getX9Z0VNCV3i7lIFoLNTb7WMmQ9k7+z/uD5EQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/credential-provider-env": "3.758.0", + "@aws-sdk/credential-provider-http": "3.758.0", + "@aws-sdk/credential-provider-ini": "3.758.0", + "@aws-sdk/credential-provider-process": "3.758.0", + "@aws-sdk/credential-provider-sso": "3.758.0", + "@aws-sdk/credential-provider-web-identity": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.758.0.tgz", + "integrity": "sha512-AzcY74QTPqcbXWVgjpPZ3HOmxQZYPROIBz2YINF0OQk0MhezDWV/O7Xec+K1+MPGQO3qS6EDrUUlnPLjsqieHA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.758.0.tgz", + "integrity": "sha512-x0FYJqcOLUCv8GLLFDYMXRAQKGjoM+L0BG4BiHYZRDf24yQWFCAZsCQAYKo6XZYh2qznbsW6f//qpyJ5b0QVKQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/client-sso": "3.758.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/token-providers": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.758.0.tgz", + "integrity": "sha512-XGguXhBqiCXMXRxcfCAVPlMbm3VyJTou79r/3mxWddHWF0XbhaQiBIbUz6vobVTD25YQRbWSmSch7VA8kI5Lrw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/nested-clients": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "node_modules/@aws-sdk/credential-providers": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.758.0.tgz", + "integrity": "sha512-BaGVBdm9ynsErIc/mLuUwJ1OQcL/pkhCuAm24jpsif3evZ5wgyZnEAZB2yRin+mQnQaQT3L+KvTbdKGfjL8+fQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@aws-sdk/client-cognito-identity": "3.758.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-cognito-identity": "3.758.0", + "@aws-sdk/credential-provider-env": "3.758.0", + "@aws-sdk/credential-provider-http": "3.758.0", + "@aws-sdk/credential-provider-ini": "3.758.0", + "@aws-sdk/credential-provider-node": "3.758.0", + "@aws-sdk/credential-provider-process": "3.758.0", + "@aws-sdk/credential-provider-sso": "3.758.0", + "@aws-sdk/credential-provider-web-identity": "3.758.0", + "@aws-sdk/nested-clients": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.5", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "node_modules/@aws-sdk/lib-storage": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.758.0.tgz", + "integrity": "sha512-g07y7rA505zaTJNPTmvW4zYJA3gThFDE1be7kBUKhTKAdwv8jVSbOiAy2AhClXs2evSUoQiFFtD1xWxLRXPPRQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/smithy-client": "^4.1.6", + "buffer": "5.6.0", + "events": "3.3.0", + "stream-browserify": "3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" + "@aws-sdk/client-s3": "^3.758.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.734.0.tgz", + "integrity": "sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-arn-parser": "3.723.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.734.0.tgz", + "integrity": "sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.758.0.tgz", + "integrity": "sha512-o8Rk71S08YTKLoSobucjnbj97OCGaXgpEDNKXpXaavUM5xLNoHCLSUPRCiEN86Ivqxg1n17Y2nSRhfbsveOXXA==", + "license": "Apache-2.0", "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz", + "integrity": "sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-personalize/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.637.0.tgz", - "integrity": "sha512-y6UC94fsMvhKbf0dzfnjVP1HePeGjplfcYfilZU1COIJLyTkMcUv4XcT4I407CGIrvgEafONHkiC09ygqUauNA==", + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.734.0.tgz", + "integrity": "sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-bucket-endpoint": "3.620.0", - "@aws-sdk/middleware-expect-continue": "3.620.0", - "@aws-sdk/middleware-flexible-checksums": "3.620.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-location-constraint": "3.609.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-sdk-s3": "3.635.0", - "@aws-sdk/middleware-ssec": "3.609.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/signature-v4-multi-region": "3.635.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@aws-sdk/xml-builder": "3.609.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/eventstream-serde-browser": "^3.0.6", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.5", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-blob-browser": "^3.1.2", - "@smithy/hash-node": "^3.0.3", - "@smithy/hash-stream-node": "^3.1.2", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/md5-js": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz", - "integrity": "sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw==", + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz", + "integrity": "sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz", + "integrity": "sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.758.0.tgz", + "integrity": "sha512-6mJ2zyyHPYSV6bAcaFpsdoXZJeQlR1QgBnZZ6juY/+dcYiuyWCdyLUbGzSZSE7GTfx6i+9+QWFeoIMlWKgU63A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-arn-parser": "3.723.0", + "@smithy/core": "^3.1.5", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz", - "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==", + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.734.0.tgz", + "integrity": "sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz", - "integrity": "sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw==", + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.758.0.tgz", + "integrity": "sha512-iNyehQXtQlj69JCgfaOssgZD4HeYGOwxcaKeG6F+40cwBjTAi0+Ph1yfDwqk2qiBPIRWJ/9l2LodZbxiBqgrwg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@smithy/core": "^3.1.5", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz", - "integrity": "sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA==", + "node_modules/@aws-sdk/nested-clients": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.758.0.tgz", + "integrity": "sha512-YZ5s7PSvyF3Mt2h1EQulCG93uybprNGbBkPmVuy/HMMfbFTt4iL3SbKjxqvOZelm86epFfj7pvK7FliI2WOEcg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-ini": "3.637.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz", + "integrity": "sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz", - "integrity": "sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA==", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.758.0.tgz", + "integrity": "sha512-0RPCo8fYJcrenJ6bRtiUbFOSgQ1CX/GpvwtLU2Fam1tS9h2klKK8d74caeV6A1mIUvBU7bhyQ0wMGlwMtn3EYw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.637.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/middleware-sdk-s3": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "node_modules/@aws-sdk/token-providers": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.758.0.tgz", + "integrity": "sha512-ckptN1tNrIfQUaGWm/ayW1ddG+imbKN7HHhjFdS4VfItsP0QQOB0+Ov+tpgb4MoNR4JaUghMIVStjIeHN2ks1w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/nested-clients": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "node_modules/@aws-sdk/types": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.734.0.tgz", + "integrity": "sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.723.0.tgz", + "integrity": "sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.743.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.743.0.tgz", + "integrity": "sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "@smithy/util-endpoints": "^3.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.723.0.tgz", + "integrity": "sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz", + "integrity": "sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@aws-sdk/types": "3.734.0", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.758.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.758.0.tgz", + "integrity": "sha512-A5EZw85V6WhoKMV2hbuFRvb9NPlxEErb4HPO6/SPXYY4QrjprIzScHxikqcWv1w4J3apB1wto9LPU3IMsYtfrw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "node_modules/@aws-sdk/xml-builder": { + "version": "3.734.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.734.0.tgz", + "integrity": "sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "license": "Apache-2.0", + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "license": "Apache-2.0", + "node_modules/@babel/core": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", + "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.9", + "@babel/types": "^7.26.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.650.0.tgz", - "integrity": "sha512-YKm14gCMChD/jlCisFlsVqB8HJujR41bl4Fup2crHwNJxhD/9LTnzwMiVVlBqlXr41Sfa6fSxczX2AMP8NM14A==", - "license": "Apache-2.0", + "node_modules/@babel/generator": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", + "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.649.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "license": "Apache-2.0", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/client-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz", - "integrity": "sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw==", + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz", - "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz", - "integrity": "sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz", - "integrity": "sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-ini": "3.637.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "node_modules/@babel/helpers": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", + "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz", - "integrity": "sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA==", + "node_modules/@babel/parser": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", + "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/client-sso": "3.637.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@babel/types": "^7.26.9" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=16.0.0" + "node": ">=6.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=16.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@babel/helper-plugin-utils": "^7.12.13" }, - "engines": { - "node": ">=16.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.649.0.tgz", - "integrity": "sha512-IY43r256LhKAvdEVQO/FPdUyVpcZS5EVxh/WHVdNzuN1bNLoUK2rIzuZqVA0EGguvCxoXVmQv9m50GvG7cGktg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/types": "^3.4.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.649.0.tgz", - "integrity": "sha512-x5DiLpZDG/AJmCIBnE3Xhpwy35QIo3WqNiOpw6ExVs1NydbM/e90zFPSfhME0FM66D/WorigvluBxxwjxDm/GA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/client-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz", - "integrity": "sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz", - "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz", - "integrity": "sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz", - "integrity": "sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-ini": "3.637.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz", - "integrity": "sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA==", - "dependencies": { - "@aws-sdk/client-sso": "3.637.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.649.0.tgz", - "integrity": "sha512-dheG/X2y25RHE7K+TlS32kcy7TgDg1OpWV44BQRoE0OBPAWmFR1D1qjjTZ7WWrdqRPKzcnDj1qED8ncyncOX8g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^2.4.1", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/property-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.1", - "@smithy/signature-v4": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/util-middleware": "^3.0.4", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.650.0.tgz", - "integrity": "sha512-QwtRKWKE6vv78Be3Lm5GmFkSl2DGWSOXPZYgkbo8GsD6SP0ParUvJvUE8wsPS5c4tUXC9KuvJAwYAYNFN10Fnw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.650.0", - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.649.0.tgz", - "integrity": "sha512-tViwzM1dauksA3fdRjsg0T8mcHklDa8EfveyiQKK6pUJopkqV6FQx+X5QNda0t/LrdEVlFZvwHNdXqOEfc83TA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.649.0.tgz", - "integrity": "sha512-ODAJ+AJJq6ozbns6ejGbicpsQ0dyMOpnGlg0J9J0jITQ05DKQZ581hdB8APDOZ9N8FstShP6dLZflSj8jb5fNA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/util-stream": "^3.1.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.650.0.tgz", - "integrity": "sha512-uBra5YjzS/gWSekAogfqJfY6c+oKQkkou7Cjc4d/cpMNvQtF1IBdekJ7NaE1RfsDEz3uH1+Myd07YWZAJo/2Qw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.649.0", - "@aws-sdk/credential-provider-http": "3.649.0", - "@aws-sdk/credential-provider-ini": "3.650.0", - "@aws-sdk/credential-provider-process": "3.649.0", - "@aws-sdk/credential-provider-sso": "3.650.0", - "@aws-sdk/credential-provider-web-identity": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@smithy/credential-provider-imds": "^3.2.1", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.650.0.tgz", - "integrity": "sha512-6J7IS0f8ovhvbIAZaynOYP+jPX8344UlTjwHxjaXHgFvI8axu3+NslKtEEV5oHLhgzDvrKbinsu5lgE2n4Sqng==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.649.0", - "@aws-sdk/credential-provider-node": "3.650.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.650.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/client-sts": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.650.0.tgz", - "integrity": "sha512-ISK0ZQYA7O5/WYgslpWy956lUBudGC9d7eL0FFbiL0j50N80Gx3RUv22ezvZgxJWE0W3DqNr4CE19sPYn4Lw8g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.650.0", - "@aws-sdk/core": "3.649.0", - "@aws-sdk/credential-provider-node": "3.650.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.650.0.tgz", - "integrity": "sha512-x2M9buZxIsKuUbuDgkGHhAKYBpn0/rYdKlwuFuOhXyyAcnhvPj0lgNF2KE4ld/GF1mKr7FF/uV3G9lM6PFaYmA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.649.0", - "@aws-sdk/credential-provider-http": "3.649.0", - "@aws-sdk/credential-provider-process": "3.649.0", - "@aws-sdk/credential-provider-sso": "3.650.0", - "@aws-sdk/credential-provider-web-identity": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@smithy/credential-provider-imds": "^3.2.1", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.650.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.649.0.tgz", - "integrity": "sha512-XVk3WsDa0g3kQFPmnCH/LaCtGY/0R2NDv7gscYZSXiBZcG/fixasglTprgWSp8zcA0t7tEIGu9suyjz8ZwhymQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.649.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.649.0.tgz", - "integrity": "sha512-IY43r256LhKAvdEVQO/FPdUyVpcZS5EVxh/WHVdNzuN1bNLoUK2rIzuZqVA0EGguvCxoXVmQv9m50GvG7cGktg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/types": "^3.4.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.649.0.tgz", - "integrity": "sha512-x5DiLpZDG/AJmCIBnE3Xhpwy35QIo3WqNiOpw6ExVs1NydbM/e90zFPSfhME0FM66D/WorigvluBxxwjxDm/GA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.649.0.tgz", - "integrity": "sha512-6VYPQpEVpU+6DDS/gLoI40ppuNM5RPIEprK30qZZxnhTr5wyrGOeJ7J7wbbwPOZ5dKwta290BiJDU2ipV8Y9BQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.650.0.tgz", - "integrity": "sha512-069nkhcwximbvyGiAC6Fr2G+yrG/p1S3NQ5BZ2cMzB1hgUKo6TvgFK7nriYI4ljMQ+UWxqPwIdTqiUmn2iJmhg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.650.0", - "@aws-sdk/token-providers": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.650.0.tgz", - "integrity": "sha512-6J7IS0f8ovhvbIAZaynOYP+jPX8344UlTjwHxjaXHgFvI8axu3+NslKtEEV5oHLhgzDvrKbinsu5lgE2n4Sqng==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.649.0", - "@aws-sdk/credential-provider-node": "3.650.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.650.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/client-sts": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.650.0.tgz", - "integrity": "sha512-ISK0ZQYA7O5/WYgslpWy956lUBudGC9d7eL0FFbiL0j50N80Gx3RUv22ezvZgxJWE0W3DqNr4CE19sPYn4Lw8g==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.650.0", - "@aws-sdk/core": "3.649.0", - "@aws-sdk/credential-provider-node": "3.650.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.649.0.tgz", - "integrity": "sha512-ZBqr+JuXI9RiN+4DSZykMx5gxpL8Dr3exIfFhxMiwAP3DQojwl0ub8ONjMuAjq9OvmX6n+jHZL6fBnNgnNFC8w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.649.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.649.0.tgz", - "integrity": "sha512-IY43r256LhKAvdEVQO/FPdUyVpcZS5EVxh/WHVdNzuN1bNLoUK2rIzuZqVA0EGguvCxoXVmQv9m50GvG7cGktg==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/types": "^3.4.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.649.0.tgz", - "integrity": "sha512-x5DiLpZDG/AJmCIBnE3Xhpwy35QIo3WqNiOpw6ExVs1NydbM/e90zFPSfhME0FM66D/WorigvluBxxwjxDm/GA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.650.0.tgz", - "integrity": "sha512-e99xHtzfL3fwS5j2gzMXRikoux/vNO3JKlxYSTnz/yfcReYRtRIz4iNrbqOzYFIQFlPS11ToXXXcwl6FOzNM7Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.650.0", - "@aws-sdk/client-sso": "3.650.0", - "@aws-sdk/client-sts": "3.650.0", - "@aws-sdk/credential-provider-cognito-identity": "3.650.0", - "@aws-sdk/credential-provider-env": "3.649.0", - "@aws-sdk/credential-provider-http": "3.649.0", - "@aws-sdk/credential-provider-ini": "3.650.0", - "@aws-sdk/credential-provider-node": "3.650.0", - "@aws-sdk/credential-provider-process": "3.649.0", - "@aws-sdk/credential-provider-sso": "3.650.0", - "@aws-sdk/credential-provider-web-identity": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@smithy/credential-provider-imds": "^3.2.1", - "@smithy/property-provider": "^3.1.4", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.650.0.tgz", - "integrity": "sha512-6J7IS0f8ovhvbIAZaynOYP+jPX8344UlTjwHxjaXHgFvI8axu3+NslKtEEV5oHLhgzDvrKbinsu5lgE2n4Sqng==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.649.0", - "@aws-sdk/credential-provider-node": "3.650.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.650.0" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sts": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.650.0.tgz", - "integrity": "sha512-ISK0ZQYA7O5/WYgslpWy956lUBudGC9d7eL0FFbiL0j50N80Gx3RUv22ezvZgxJWE0W3DqNr4CE19sPYn4Lw8g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.650.0", - "@aws-sdk/core": "3.649.0", - "@aws-sdk/credential-provider-node": "3.650.0", - "@aws-sdk/middleware-host-header": "3.649.0", - "@aws-sdk/middleware-logger": "3.649.0", - "@aws-sdk/middleware-recursion-detection": "3.649.0", - "@aws-sdk/middleware-user-agent": "3.649.0", - "@aws-sdk/region-config-resolver": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@aws-sdk/util-user-agent-browser": "3.649.0", - "@aws-sdk/util-user-agent-node": "3.649.0", - "@smithy/config-resolver": "^3.0.6", - "@smithy/core": "^2.4.1", - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/hash-node": "^3.0.4", - "@smithy/invalid-dependency": "^3.0.4", - "@smithy/middleware-content-length": "^3.0.6", - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.16", - "@smithy/util-defaults-mode-node": "^3.0.16", - "@smithy/util-endpoints": "^2.1.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.650.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.650.0.tgz", - "integrity": "sha512-x2M9buZxIsKuUbuDgkGHhAKYBpn0/rYdKlwuFuOhXyyAcnhvPj0lgNF2KE4ld/GF1mKr7FF/uV3G9lM6PFaYmA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.649.0", - "@aws-sdk/credential-provider-http": "3.649.0", - "@aws-sdk/credential-provider-process": "3.649.0", - "@aws-sdk/credential-provider-sso": "3.650.0", - "@aws-sdk/credential-provider-web-identity": "3.649.0", - "@aws-sdk/types": "3.649.0", - "@smithy/credential-provider-imds": "^3.2.1", - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.650.0" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.649.0.tgz", - "integrity": "sha512-XVk3WsDa0g3kQFPmnCH/LaCtGY/0R2NDv7gscYZSXiBZcG/fixasglTprgWSp8zcA0t7tEIGu9suyjz8ZwhymQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/property-provider": "^3.1.4", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.649.0" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.649.0.tgz", - "integrity": "sha512-IY43r256LhKAvdEVQO/FPdUyVpcZS5EVxh/WHVdNzuN1bNLoUK2rIzuZqVA0EGguvCxoXVmQv9m50GvG7cGktg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/types": "^3.4.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.649.0.tgz", - "integrity": "sha512-x5DiLpZDG/AJmCIBnE3Xhpwy35QIo3WqNiOpw6ExVs1NydbM/e90zFPSfhME0FM66D/WorigvluBxxwjxDm/GA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/lib-storage": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.637.0.tgz", - "integrity": "sha512-HiNGOP4a1QrCWwO1joKw4mCp19nLXoF9K52PislBaYDI35IlHC3DP6MeOg5zmElwtL1GtEHFBy5olfPWPsLyLg==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/smithy-client": "^3.2.0", - "buffer": "5.6.0", - "events": "3.3.0", - "stream-browserify": "3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-s3": "^3.637.0" - } - }, - "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.620.0.tgz", - "integrity": "sha512-eGLL0W6L3HDb3OACyetZYOWpHJ+gLo0TehQKeQyy2G8vTYXqNTeqYhuI6up9HVjBzU9eQiULVQETmgQs7TFaRg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-arn-parser": "3.568.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-bucket-endpoint/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.620.0.tgz", - "integrity": "sha512-QXeRFMLfyQ31nAHLbiTLtk0oHzG9QLMaof5jIfqcUwnOkO8YnQdeqzakrg1Alpy/VQ7aqzIi8qypkBe2KXZz0A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-expect-continue/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.620.0.tgz", - "integrity": "sha512-ftz+NW7qka2sVuwnnO1IzBku5ccP+s5qZGeRTPgrKB7OzRW85gthvIo1vQR2w+OwHFk7WJbbhhWwbCbktnP4UA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/crc32": "5.2.0", - "@aws-crypto/crc32c": "5.2.0", - "@aws-sdk/types": "3.609.0", - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-flexible-checksums/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.649.0.tgz", - "integrity": "sha512-PjAe2FocbicHVgNNwdSZ05upxIO7AgTPFtQLpnIAmoyzMcgv/zNB5fBn3uAnQSAeEPPCD+4SYVEUD1hw1ZBvEg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.609.0.tgz", - "integrity": "sha512-xzsdoTkszGVqGVPjUmgoP7TORiByLueMHieI1fhQL888WPdqctwAx3ES6d/bA9Q/i8jnc6hs+Fjhy8UvBTkE9A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-location-constraint/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.649.0.tgz", - "integrity": "sha512-qdqRx6q7lYC6KL/NT9x3ShTL0TBuxdkCczGzHzY3AnOoYUjnCDH7Vlq867O6MAvb4EnGNECFzIgtkZkQ4FhY5w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.649.0.tgz", - "integrity": "sha512-IPnO4wlmaLRf6IYmJW2i8gJ2+UPXX0hDRv1it7Qf8DpBW+lGyF2rnoN7NrFX0WIxdGOlJF1RcOr/HjXb2QeXfQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.635.0.tgz", - "integrity": "sha512-RLdYJPEV4JL/7NBoFUs7VlP90X++5FlJdxHz0DzCjmiD3qCviKy+Cym3qg1gBgHwucs5XisuClxDrGokhAdTQw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.635.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-arn-parser": "3.568.0", - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.609.0.tgz", - "integrity": "sha512-GZSD1s7+JswWOTamVap79QiDaIV7byJFssBW68GYjyRS5EBjNfwA/8s+6uE6g39R3ojyTbYOmvcANoZEhSULXg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-ssec/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.649.0.tgz", - "integrity": "sha512-q6sO10dnCXoxe9thobMJxekhJumzd1j6dxcE1+qJdYKHJr6yYgWbogJqrLCpWd30w0lEvnuAHK8lN2kWLdJxJw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@aws-sdk/util-endpoints": "3.649.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.649.0.tgz", - "integrity": "sha512-xURBvdQXvRvca5Du8IlC5FyCj3pkw8Z75+373J3Wb+vyg8GjD14HfKk1Je1HCCQDyIE9VB/scYDcm9ri0ppePw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.635.0.tgz", - "integrity": "sha512-J6QY4/invOkpogCHjSaDON1hF03viPpOnsrzVuCvJMmclS/iG62R4EY0wq1alYll0YmSdmKlpJwHMWwGtqK63Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.635.0", - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.649.0.tgz", - "integrity": "sha512-PuPw8RysbhJNlaD2d/PzOTf8sbf4Dsn2b7hwyGh7YVG3S75yTpxSAZxrnhKsz9fStgqFmnw/jUfV/G+uQAeTVw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.568.0.tgz", - "integrity": "sha512-XUKJWWo+KOB7fbnPP0+g/o5Ulku/X53t7i/h+sPHr5xxYTJJ9CYnbToo95mzxe7xWvkLrsNtJ8L+MnNn9INs2w==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.649.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.649.0.tgz", - "integrity": "sha512-bZI1Wc3R/KibdDVWFxX/N4AoJFG4VJ92Dp4WYmOrVD6VPkb8jPz7ZeiYc7YwPl8NoDjYyPneBV0lEoK/V8OKAA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.649.0", - "@smithy/types": "^3.4.0", - "@smithy/util-endpoints": "^2.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.609.0.tgz", - "integrity": "sha512-l9XxNcA4HX98rwCC2/KoiWcmEiRfZe4G+mYwDbCFT87JIMj6GBhLDkAzr/W8KAaA2IDr8Vc6J8fZPgVulxxfMA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/jsesc": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.6", - "dev": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.23.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@bugsnag/browser": { - "version": "7.22.3", - "license": "MIT", - "dependencies": { - "@bugsnag/core": "^7.19.0" - } - }, - "node_modules/@bugsnag/core": { - "version": "7.19.0", - "license": "MIT", - "dependencies": { - "@bugsnag/cuid": "^3.0.0", - "@bugsnag/safe-json-stringify": "^6.0.0", - "error-stack-parser": "^2.0.3", - "iserror": "0.0.2", - "stack-generator": "^2.0.3" - } - }, - "node_modules/@bugsnag/cuid": { - "version": "3.0.2", - "license": "MIT" - }, - "node_modules/@bugsnag/js": { - "version": "7.22.3", - "license": "MIT", - "dependencies": { - "@bugsnag/browser": "^7.22.3", - "@bugsnag/node": "^7.22.3" - } - }, - "node_modules/@bugsnag/node": { - "version": "7.22.3", - "license": "MIT", - "dependencies": { - "@bugsnag/core": "^7.19.0", - "byline": "^5.0.0", - "error-stack-parser": "^2.0.2", - "iserror": "^0.0.2", - "pump": "^3.0.0", - "stack-generator": "^2.0.3" - } - }, - "node_modules/@bugsnag/safe-json-stringify": { - "version": "6.0.0", - "license": "MIT" - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@commitlint/cli": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/format": "^17.8.1", - "@commitlint/lint": "^17.8.1", - "@commitlint/load": "^17.8.1", - "@commitlint/read": "^17.8.1", - "@commitlint/types": "^17.8.1", - "execa": "^5.0.0", - "lodash.isfunction": "^3.0.9", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/cli/node_modules/@commitlint/config-validator": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^17.8.1", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/cli/node_modules/@commitlint/execute-rule": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/cli/node_modules/@commitlint/load": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/config-validator": "^17.8.1", - "@commitlint/execute-rule": "^17.8.1", - "@commitlint/resolve-extends": "^17.8.1", - "@commitlint/types": "^17.8.1", - "@types/node": "20.5.1", - "chalk": "^4.1.0", - "cosmiconfig": "^8.0.0", - "cosmiconfig-typescript-loader": "^4.0.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0", - "resolve-from": "^5.0.0", - "ts-node": "^10.8.1", - "typescript": "^4.6.4 || ^5.2.2" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/cli/node_modules/@commitlint/resolve-extends": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/config-validator": "^17.8.1", - "@commitlint/types": "^17.8.1", - "import-fresh": "^3.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/cli/node_modules/@commitlint/types": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/cli/node_modules/@types/node": { - "version": "20.5.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@commitlint/cli/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@commitlint/cli/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/cli/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/cli/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@commitlint/cli/node_modules/cosmiconfig-typescript-loader": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=v14.21.3" - }, - "peerDependencies": { - "@types/node": "*", - "cosmiconfig": ">=7", - "ts-node": ">=10", - "typescript": ">=4" - } - }, - "node_modules/@commitlint/cli/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/cli/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/config-conventional": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-changelog-conventionalcommits": "^6.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "18.4.4", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@commitlint/types": "^18.4.4", - "ajv": "^8.11.0" - }, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/ensure": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^17.8.1", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.upperfirst": "^4.3.1" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/ensure/node_modules/@commitlint/types": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/ensure/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@commitlint/ensure/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/ensure/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/ensure/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@commitlint/ensure/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/ensure/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "18.4.4", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/format": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/types": "^17.8.1", - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/format/node_modules/@commitlint/types": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/@commitlint/format/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@commitlint/format/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/format/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/format/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@commitlint/format/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/format/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/is-ignored": { - "version": "17.8.1", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/types": "^17.8.1", - "semver": "7.5.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=v14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/is-ignored/node_modules/@commitlint/types": { - "version": "17.8.1", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=v14" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/is-ignored/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/is-ignored/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "@babel/helper-plugin-utils": "^7.10.4" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/is-ignored/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=7.0.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/is-ignored/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@commitlint/is-ignored/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/is-ignored/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/lint": { - "version": "17.8.1", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/is-ignored": "^17.8.1", - "@commitlint/parse": "^17.8.1", - "@commitlint/rules": "^17.8.1", - "@commitlint/types": "^17.8.1" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=v14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/lint/node_modules/@commitlint/types": { - "version": "17.8.1", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=v14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/lint/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@commitlint/lint/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@babel/template": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", + "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.9", + "@babel/types": "^7.26.9" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/lint/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/@babel/traverse": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", + "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.9", + "@babel/parser": "^7.26.9", + "@babel/template": "^7.26.9", + "@babel/types": "^7.26.9", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/lint/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@commitlint/lint/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@commitlint/lint/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@babel/types": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", + "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@commitlint/load": { - "version": "18.4.4", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, + "license": "MIT" + }, + "node_modules/@bugsnag/browser": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-7.25.0.tgz", + "integrity": "sha512-PzzWy5d9Ly1CU1KkxTB6ZaOw/dO+CYSfVtqxVJccy832e6+7rW/dvSw5Jy7rsNhgcKSKjZq86LtNkPSvritOLA==", "license": "MIT", - "optional": true, "dependencies": { - "@commitlint/config-validator": "^18.4.4", - "@commitlint/execute-rule": "^18.4.4", - "@commitlint/resolve-extends": "^18.4.4", - "@commitlint/types": "^18.4.4", - "chalk": "^4.1.0", - "cosmiconfig": "^8.3.6", - "cosmiconfig-typescript-loader": "^5.0.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=v18" + "@bugsnag/core": "^7.25.0" } }, - "node_modules/@commitlint/load/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, + "node_modules/@bugsnag/core": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-7.25.0.tgz", + "integrity": "sha512-JZLak1b5BVzy77CPcklViZrppac/pE07L3uSDmfSvFYSCGReXkik2txOgV05VlF9EDe36dtUAIIV7iAPDfFpQQ==", "license": "MIT", - "optional": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@bugsnag/cuid": "^3.0.0", + "@bugsnag/safe-json-stringify": "^6.0.0", + "error-stack-parser": "^2.0.3", + "iserror": "0.0.2", + "stack-generator": "^2.0.3" } }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "4.1.2", - "dev": true, + "node_modules/@bugsnag/cuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@bugsnag/cuid/-/cuid-3.2.1.tgz", + "integrity": "sha512-zpvN8xQ5rdRWakMd/BcVkdn2F8HKlDSbM3l7duueK590WmI1T0ObTLc1V/1e55r14WNjPd5AJTYX4yPEAFVi+Q==", + "license": "MIT" + }, + "node_modules/@bugsnag/js": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-7.25.0.tgz", + "integrity": "sha512-d8n8SyKdRUz8jMacRW1j/Sj/ckhKbIEp49+Dacp3CS8afRgfMZ//NXhUFFXITsDP5cXouaejR9fx4XVapYXNgg==", "license": "MIT", - "optional": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@bugsnag/browser": "^7.25.0", + "@bugsnag/node": "^7.25.0" } }, - "node_modules/@commitlint/load/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, + "node_modules/@bugsnag/node": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-7.25.0.tgz", + "integrity": "sha512-KlxBaJ8EREEsfKInybAjTO9LmdDXV3cUH5+XNXyqUZrcRVuPOu4j4xvljh+n24ifok/wbFZTKVXUzrN4iKIeIA==", "license": "MIT", - "optional": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@bugsnag/core": "^7.25.0", + "byline": "^5.0.0", + "error-stack-parser": "^2.0.2", + "iserror": "^0.0.2", + "pump": "^3.0.0", + "stack-generator": "^2.0.3" } }, - "node_modules/@commitlint/load/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "optional": true + "node_modules/@bugsnag/safe-json-stringify": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz", + "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==", + "license": "MIT" }, - "node_modules/@commitlint/load/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@commitlint/cli": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.8.1.tgz", + "integrity": "sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "@commitlint/format": "^17.8.1", + "@commitlint/lint": "^17.8.1", + "@commitlint/load": "^17.8.1", + "@commitlint/read": "^17.8.1", + "@commitlint/types": "^17.8.1", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, "engines": { - "node": ">=8" + "node": ">=v14" } }, - "node_modules/@commitlint/load/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@commitlint/config-conventional": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.8.1.tgz", + "integrity": "sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "has-flag": "^4.0.0" + "conventional-changelog-conventionalcommits": "^6.1.0" }, "engines": { - "node": ">=8" + "node": ">=v14" } }, - "node_modules/@commitlint/message": { + "node_modules/@commitlint/config-validator": { "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.8.1.tgz", + "integrity": "sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==", "dev": true, "license": "MIT", + "dependencies": { + "@commitlint/types": "^17.8.1", + "ajv": "^8.11.0" + }, "engines": { "node": ">=v14" } }, - "node_modules/@commitlint/parse": { + "node_modules/@commitlint/ensure": { "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.8.1.tgz", + "integrity": "sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==", "dev": true, "license": "MIT", "dependencies": { "@commitlint/types": "^17.8.1", - "conventional-changelog-angular": "^6.0.0", - "conventional-commits-parser": "^4.0.0" + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" }, "engines": { "node": ">=v14" } }, - "node_modules/@commitlint/parse/node_modules/@commitlint/types": { + "node_modules/@commitlint/execute-rule": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz", + "integrity": "sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format": { "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.8.1.tgz", + "integrity": "sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==", "dev": true, "license": "MIT", "dependencies": { + "@commitlint/types": "^17.8.1", "chalk": "^4.1.0" }, "engines": { "node": ">=v14" } }, - "node_modules/@commitlint/parse/node_modules/ansi-styles": { + "node_modules/@commitlint/format/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -5038,8 +2188,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@commitlint/parse/node_modules/chalk": { + "node_modules/@commitlint/format/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -5053,8 +2205,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@commitlint/parse/node_modules/color-convert": { + "node_modules/@commitlint/format/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5064,21 +2218,27 @@ "node": ">=7.0.0" } }, - "node_modules/@commitlint/parse/node_modules/color-name": { + "node_modules/@commitlint/format/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, - "node_modules/@commitlint/parse/node_modules/has-flag": { + "node_modules/@commitlint/format/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@commitlint/parse/node_modules/supports-color": { + "node_modules/@commitlint/format/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -5088,34 +2248,102 @@ "node": ">=8" } }, - "node_modules/@commitlint/read": { + "node_modules/@commitlint/is-ignored": { "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz", + "integrity": "sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/top-level": "^17.8.1", "@commitlint/types": "^17.8.1", - "fs-extra": "^11.0.0", - "git-raw-commits": "^2.0.11", - "minimist": "^1.2.6" + "semver": "7.5.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@commitlint/lint": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.8.1.tgz", + "integrity": "sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^17.8.1", + "@commitlint/parse": "^17.8.1", + "@commitlint/rules": "^17.8.1", + "@commitlint/types": "^17.8.1" }, "engines": { "node": ">=v14" } }, - "node_modules/@commitlint/read/node_modules/@commitlint/types": { + "node_modules/@commitlint/load": { "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.8.1.tgz", + "integrity": "sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0" + "@commitlint/config-validator": "^17.8.1", + "@commitlint/execute-rule": "^17.8.1", + "@commitlint/resolve-extends": "^17.8.1", + "@commitlint/types": "^17.8.1", + "@types/node": "20.5.1", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.2.2" }, "engines": { "node": ">=v14" } }, - "node_modules/@commitlint/read/node_modules/ansi-styles": { + "node_modules/@commitlint/load/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -5128,8 +2356,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@commitlint/read/node_modules/chalk": { + "node_modules/@commitlint/load/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -5143,8 +2373,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@commitlint/read/node_modules/color-convert": { + "node_modules/@commitlint/load/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5154,34 +2386,27 @@ "node": ">=7.0.0" } }, - "node_modules/@commitlint/read/node_modules/color-name": { + "node_modules/@commitlint/load/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, - "node_modules/@commitlint/read/node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@commitlint/read/node_modules/has-flag": { + "node_modules/@commitlint/load/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@commitlint/read/node_modules/supports-color": { + "node_modules/@commitlint/load/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -5191,115 +2416,102 @@ "node": ">=8" } }, - "node_modules/@commitlint/resolve-extends": { - "version": "18.4.4", + "node_modules/@commitlint/message": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.8.1.tgz", + "integrity": "sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "@commitlint/config-validator": "^18.4.4", - "@commitlint/types": "^18.4.4", - "import-fresh": "^3.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - }, "engines": { - "node": ">=v18" + "node": ">=v14" } }, - "node_modules/@commitlint/rules": { + "node_modules/@commitlint/parse": { "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.8.1.tgz", + "integrity": "sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==", "dev": true, "license": "MIT", "dependencies": { - "@commitlint/ensure": "^17.8.1", - "@commitlint/message": "^17.8.1", - "@commitlint/to-lines": "^17.8.1", "@commitlint/types": "^17.8.1", - "execa": "^5.0.0" + "conventional-changelog-angular": "^6.0.0", + "conventional-commits-parser": "^4.0.0" }, "engines": { "node": ">=v14" } }, - "node_modules/@commitlint/rules/node_modules/@commitlint/types": { + "node_modules/@commitlint/read": { "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.8.1.tgz", + "integrity": "sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.0" + "@commitlint/top-level": "^17.8.1", + "@commitlint/types": "^17.8.1", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" }, "engines": { "node": ">=v14" } }, - "node_modules/@commitlint/rules/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@commitlint/rules/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@commitlint/read/node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=14.14" } }, - "node_modules/@commitlint/rules/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/@commitlint/resolve-extends": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz", + "integrity": "sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@commitlint/config-validator": "^17.8.1", + "@commitlint/types": "^17.8.1", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@commitlint/rules/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@commitlint/rules/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=v14" } }, - "node_modules/@commitlint/rules/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@commitlint/rules": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.8.1.tgz", + "integrity": "sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@commitlint/ensure": "^17.8.1", + "@commitlint/message": "^17.8.1", + "@commitlint/to-lines": "^17.8.1", + "@commitlint/types": "^17.8.1", + "execa": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=v14" } }, "node_modules/@commitlint/to-lines": { "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.8.1.tgz", + "integrity": "sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==", "dev": true, "license": "MIT", "engines": { @@ -5308,6 +2520,8 @@ }, "node_modules/@commitlint/top-level": { "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.8.1.tgz", + "integrity": "sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==", "dev": true, "license": "MIT", "dependencies": { @@ -5318,22 +2532,24 @@ } }, "node_modules/@commitlint/types": { - "version": "18.4.4", + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.8.1.tgz", + "integrity": "sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "chalk": "^4.1.0" }, "engines": { - "node": ">=v18" + "node": ">=v14" } }, "node_modules/@commitlint/types/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5346,9 +2562,10 @@ }, "node_modules/@commitlint/types/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5362,9 +2579,10 @@ }, "node_modules/@commitlint/types/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5374,24 +2592,27 @@ }, "node_modules/@commitlint/types/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/@commitlint/types/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">=8" } }, "node_modules/@commitlint/types/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5401,6 +2622,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { @@ -5412,6 +2635,8 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5421,7 +2646,8 @@ }, "node_modules/@dabh/diagnostics": { "version": "2.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", @@ -5429,22 +2655,26 @@ } }, "node_modules/@datadog/pprof": { - "version": "3.2.0", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@datadog/pprof/-/pprof-5.5.1.tgz", + "integrity": "sha512-3pZVYqc5YkZJOj9Rc8kQ/wG4qlygcnnwFU/w0QKX6dEdJh+1+dWniuUu+GSEjy/H0jc14yhdT2eJJf/F2AnHNw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "delay": "^5.0.0", "node-gyp-build": "<4.0", "p-limit": "^3.1.0", - "pprof-format": "^2.0.7", + "pprof-format": "^2.1.0", "source-map": "^0.7.4" }, "engines": { - "node": ">=12" + "node": ">=16" } }, "node_modules/@dependents/detective-less": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-3.0.2.tgz", + "integrity": "sha512-1YUvQ+e0eeTWAHoN8Uz2x2U37jZs6IGutiIE5LXId7cxfUGhtZjzxE06FdUiuiRrW+UE0vNCdSNPH2lY4dQCOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5457,6 +2687,8 @@ }, "node_modules/@digitalroute/cz-conventional-changelog-for-jira": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@digitalroute/cz-conventional-changelog-for-jira/-/cz-conventional-changelog-for-jira-8.0.1.tgz", + "integrity": "sha512-I7uNQ2R5LnDYVhQ01sfNvaxqe1PutXyDl8Kltj4L8uDa1LTYqQgWWp3yEj3XYDNjhUjsAheHW0lsmF1oiAjWVg==", "dev": true, "license": "MIT", "dependencies": { @@ -5478,20 +2710,27 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -5499,6 +2738,8 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "license": "MIT", "dependencies": { "ajv": "^6.12.4", @@ -5520,6 +2761,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -5534,10 +2777,14 @@ }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/@eslint/js": { - "version": "8.56.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5545,16 +2792,27 @@ }, "node_modules/@ewoudenberg/difflib": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@ewoudenberg/difflib/-/difflib-0.1.0.tgz", + "integrity": "sha512-OU5P5mJyD3OoWYMWY+yIgwvgNS9cFAU10f+DDuvtogcWQOoJIsQ4Hy2McSfUfhKjq8L0FuWVb4Rt7kgA+XK86A==", "dependencies": { "heap": ">= 0.2.0" } }, + "node_modules/@hapi/bourne": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", + "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", + "license": "BSD-3-Clause" + }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -5563,6 +2821,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "license": "Apache-2.0", "engines": { "node": ">=12.22" @@ -5573,11 +2833,16 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "license": "BSD-3-Clause" }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5586,10 +2851,14 @@ }, "node_modules/@ioredis/commands": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", "license": "MIT" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, "license": "ISC", "dependencies": { @@ -5605,7 +2874,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -5617,6 +2888,8 @@ }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -5628,11 +2901,15 @@ }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -5649,6 +2926,8 @@ }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5663,6 +2942,8 @@ }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5679,6 +2960,8 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "license": "ISC", "dependencies": { @@ -5694,6 +2977,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { @@ -5702,6 +2987,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -5710,6 +2997,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -5722,6 +3011,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { @@ -5734,6 +3025,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -5745,6 +3038,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -5759,6 +3054,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -5770,6 +3067,8 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { @@ -5778,6 +3077,8 @@ }, "node_modules/@jest/console": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", "dependencies": { @@ -5794,6 +3095,8 @@ }, "node_modules/@jest/console/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -5808,6 +3111,8 @@ }, "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -5823,6 +3128,8 @@ }, "node_modules/@jest/console/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5834,11 +3141,15 @@ }, "node_modules/@jest/console/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -5847,6 +3158,8 @@ }, "node_modules/@jest/console/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -5858,6 +3171,8 @@ }, "node_modules/@jest/core": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", "dependencies": { @@ -5904,6 +3219,8 @@ }, "node_modules/@jest/core/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -5918,6 +3235,8 @@ }, "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -5933,6 +3252,8 @@ }, "node_modules/@jest/core/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5944,11 +3265,15 @@ }, "node_modules/@jest/core/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -5957,6 +3282,8 @@ }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -5968,6 +3295,8 @@ }, "node_modules/@jest/environment": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", "dependencies": { @@ -5982,6 +3311,8 @@ }, "node_modules/@jest/expect": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5994,6 +3325,8 @@ }, "node_modules/@jest/expect-utils": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", "dependencies": { @@ -6005,6 +3338,8 @@ }, "node_modules/@jest/fake-timers": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6021,6 +3356,8 @@ }, "node_modules/@jest/globals": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6035,6 +3372,8 @@ }, "node_modules/@jest/reporters": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", "dependencies": { @@ -6077,6 +3416,8 @@ }, "node_modules/@jest/reporters/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -6091,6 +3432,8 @@ }, "node_modules/@jest/reporters/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -6106,6 +3449,8 @@ }, "node_modules/@jest/reporters/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6117,11 +3462,16 @@ }, "node_modules/@jest/reporters/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/@jest/reporters/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -6141,6 +3491,8 @@ }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -6149,6 +3501,8 @@ }, "node_modules/@jest/reporters/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -6160,6 +3514,8 @@ }, "node_modules/@jest/schemas": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { @@ -6171,6 +3527,8 @@ }, "node_modules/@jest/source-map": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", "dependencies": { @@ -6184,6 +3542,8 @@ }, "node_modules/@jest/test-result": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", "dependencies": { @@ -6198,6 +3558,8 @@ }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", "dependencies": { @@ -6212,6 +3574,8 @@ }, "node_modules/@jest/transform": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -6237,6 +3601,8 @@ }, "node_modules/@jest/transform/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -6251,6 +3617,8 @@ }, "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -6266,6 +3634,8 @@ }, "node_modules/@jest/transform/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6277,11 +3647,15 @@ }, "node_modules/@jest/transform/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -6290,6 +3664,8 @@ }, "node_modules/@jest/transform/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -6301,6 +3677,8 @@ }, "node_modules/@jest/types": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "license": "MIT", "dependencies": { @@ -6317,6 +3695,8 @@ }, "node_modules/@jest/types/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -6331,6 +3711,8 @@ }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -6346,6 +3728,8 @@ }, "node_modules/@jest/types/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6357,11 +3741,15 @@ }, "node_modules/@jest/types/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -6370,6 +3758,8 @@ }, "node_modules/@jest/types/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -6380,20 +3770,24 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -6401,7 +3795,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", "engines": { @@ -6409,12 +3805,16 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6424,18 +3824,22 @@ }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true, "license": "MIT" }, "node_modules/@koa/router": { - "version": "12.0.1", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.2.tgz", + "integrity": "sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA==", "license": "MIT", "dependencies": { "debug": "^4.3.4", "http-errors": "^2.0.0", "koa-compose": "^4.1.0", "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" + "path-to-regexp": "^6.3.0" }, "engines": { "node": ">= 12" @@ -6443,6 +3847,8 @@ }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "license": "BSD-3-Clause", "dependencies": { "detect-libc": "^2.0.0", @@ -6461,6 +3867,8 @@ }, "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "license": "MIT", "dependencies": { "semver": "^6.0.0" @@ -6474,6 +3882,8 @@ }, "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -6481,10 +3891,14 @@ }, "node_modules/@ndhoule/extend": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ndhoule/extend/-/extend-2.0.0.tgz", + "integrity": "sha512-xb77tVVGDGwjy25a6RmBiiBQ9uvxhkG0OEpVkQ74oNFsy9u+4PGp5BIIblmJZmJBMgXiKxZtkr4GcmHCNVubBQ==", "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", @@ -6496,6 +3910,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "license": "MIT", "engines": { "node": ">= 8" @@ -6503,6 +3919,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -6514,6 +3932,8 @@ }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, "license": "MIT", "optional": true, @@ -6526,6 +3946,7 @@ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -6535,22 +3956,32 @@ }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.1", @@ -6559,26 +3990,38 @@ }, "node_modules/@protobufjs/float": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, "node_modules/@pyroscope/nodejs": { "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pyroscope/nodejs/-/nodejs-0.2.9.tgz", + "integrity": "sha512-pIw4pIqcNZTZxTUuV0OUI18UZEmx9lT2GaT75ny6FKVe2L1gxAwTCf5TKk8VsnUGY66buUkyaTHcTm7fy0BP/Q==", "license": "Apache-2.0", "dependencies": { "axios": "^0.28.0", @@ -6594,6 +4037,8 @@ }, "node_modules/@pyroscope/nodejs/node_modules/axios": { "version": "0.28.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.28.1.tgz", + "integrity": "sha512-iUcGA5a7p0mVb4Gm/sy+FSECNkPFT4y7wt6OM/CDpO/OnNCvSs3PoMG8ibrC9jRoGYU0gUK5pXVC4NPXq6lHRQ==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.0", @@ -6601,66 +4046,94 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT" + }, "node_modules/@rudderstack/integrations-lib": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/@rudderstack/integrations-lib/-/integrations-lib-0.2.13.tgz", - "integrity": "sha512-MBI+OQpnYAuOzRlbGCnUX6oVfQsYA7daZ8z07WmqQYQtWFOfd2yFbaxKclu+R/a8W7+jBo4gvbW+ScEW6h+Mgg==", + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/@rudderstack/integrations-lib/-/integrations-lib-0.2.25.tgz", + "integrity": "sha512-/GKqGlGrGWYxkZdqlyYgIK4mL6OK2ijkMcW3Lbg/INK7uZaR9/HFrc/cYX0JbGIb0b5Z49jc0lPO1+jLc3O5lg==", "license": "MIT", "dependencies": { "axios": "^1.4.0", - "axios-mock-adapter": "^1.22.0", - "crypto": "^1.0.1", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", + "fast-xml-parser": "^4.5.0", "get-value": "^3.0.1", "handlebars": "^4.7.8", + "jsonschema": "^1.5.0", "lodash": "^4.17.21", "moment": "^2.29.4", "moment-timezone": "^0.5.43", "set-value": "^4.1.0", "sha256": "^0.2.0", + "sqlstring": "^2.3.3", "tslib": "^2.4.0", - "winston": "^3.11.0" + "uuid": "^11.0.5", + "winston": "^3.11.0", + "zod": "^3.24.2" + } + }, + "node_modules/@rudderstack/integrations-lib/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" } }, "node_modules/@rudderstack/json-template-engine": { - "version": "0.18.0", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@rudderstack/json-template-engine/-/json-template-engine-0.19.5.tgz", + "integrity": "sha512-lA45cp8caboMECfNk/CXuP45hCx+W09mclEDiqqTQXilY1hdWp+r/zpcOBzFGZWSxIdrAp5cfhIYnUENx3XX5g==", "license": "MIT" }, "node_modules/@rudderstack/workflow-engine": { - "version": "0.8.13", + "version": "0.8.19", + "resolved": "https://registry.npmjs.org/@rudderstack/workflow-engine/-/workflow-engine-0.8.19.tgz", + "integrity": "sha512-w/AoIVlOvFahWBN6wtnwbQjAMGi15m8Lyw/2LuRaH7QO9Vl7yQhkNiyRiDq0MF6dQ9aiSzaxkoz0fowdrjMvPg==", "license": "MIT", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", - "@rudderstack/json-template-engine": "^0.17.1", + "@rudderstack/json-template-engine": "^0.19.5", "jsonata": "^2.0.5", "lodash": "^4.17.21", - "object-sizeof": "^2.6.4", - "yaml": "^2.4.3" + "object-sizeof": "^2.6.5", + "yaml": "^2.6.0" } }, - "node_modules/@rudderstack/workflow-engine/node_modules/@rudderstack/json-template-engine": { - "version": "0.17.1", - "license": "MIT" - }, "node_modules/@shopify/jest-koa-mocks": { - "version": "5.1.1", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@shopify/jest-koa-mocks/-/jest-koa-mocks-5.3.1.tgz", + "integrity": "sha512-BRxgfXmV1jMYXGhiGJamta22YoEJxL94qrxyZ/aXg2gWHjDjF6zpNapTfCUNbHJwOW7/tzylkHs53ac8xTZBBw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "license": "MIT", "dependencies": { "koa": "^2.13.4", "node-mocks-http": "^1.11.0" }, "engines": { - "node": "^14.17.0 || >=16.0.0" + "node": ">=18.12.0" } }, "node_modules/@sinclair/typebox": { "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true, "license": "MIT" }, "node_modules/@sindresorhus/is": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", "dev": true, "license": "MIT", "engines": { @@ -6668,7 +4141,9 @@ } }, "node_modules/@sinonjs/commons": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6677,6 +4152,8 @@ }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6684,945 +4161,754 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.2.tgz", - "integrity": "sha512-b5g+PNujlfqIib9BjkNB108NyO5aZM/RXjfOCXRCqXQ1oPnIkfvdORrztbGgCZdPe/BN/MKDlrGA7PafKPM2jw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.1.tgz", + "integrity": "sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/chunked-blob-reader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-3.0.0.tgz", - "integrity": "sha512-sbnURCwjF0gSToGlsBiAmd1lRCmSn72nu9axfJu5lIx6RUEgHu6GwTMbqCdhQSi0Pumcm5vFxsi9XWXb2mTaoA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/chunked-blob-reader-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-3.0.0.tgz", - "integrity": "sha512-VDkpCYW+peSuM4zJip5WDfqvg2Mo/e8yxOv3VF1m11y7B8KKMKVFtmZWDe36Fvk8rGuWrPZHHXZ7rR7uM5yWyg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.6.tgz", - "integrity": "sha512-j7HuVNoRd8EhcFp0MzcUb4fG40C7BcyshH+fAd3Jhd8bINNFvEQYBrZoS/SK6Pun9WPlfoI8uuU2SMz8DsEGlA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.1.tgz", - "integrity": "sha512-7cts7/Oni7aCHebHGiBeWoz5z+vmH+Vx2Z/UW3XtXMslcxI3PEwBZxNinepwZjixS3n12fPc247PHWmjU7ndsQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", + "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-retry": "^3.0.16", - "@smithy/middleware-serde": "^3.0.4", - "@smithy/protocol-http": "^4.1.1", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", + "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", "license": "Apache-2.0", "dependencies": { + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@smithy/config-resolver": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.0.1.tgz", + "integrity": "sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@smithy/core": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.5.tgz", + "integrity": "sha512-HLclGWPkCsekQgsyzxLhCQLa8THWXtB5PxyYN+2O6nkyLt550KQKTlbV2D1/j5dNIQapAZM1+qFnpBFxZQkgCA==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.1.tgz", - "integrity": "sha512-4z/oTWpRF2TqQI3aCM89/PWu3kim58XU4kOCTtuTJnoaS4KT95cPWMxbQfTN2vzcOe96SOKO8QouQW/+ESB1fQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz", + "integrity": "sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.5", - "@smithy/property-provider": "^3.1.4", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-codec": { - "version": "3.1.2", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz", + "integrity": "sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.6.tgz", - "integrity": "sha512-2hM54UWQUOrki4BtsUI1WzmD13/SeaqT/AB3EUJKbcver/WgKNaiJ5y5F5XXuVe6UekffVzuUDrBZVAA3AWRpQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz", + "integrity": "sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.5", - "@smithy/types": "^3.3.0", + "@smithy/eventstream-serde-universal": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz", - "integrity": "sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz", + "integrity": "sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.5.tgz", - "integrity": "sha512-+upXvnHNyZP095s11jF5dhGw/Ihzqwl5G+/KtMnoQOpdfC3B5HYCcDVG9EmgkhJMXJlM64PyN5gjJl0uXFQehQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz", + "integrity": "sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.5", - "@smithy/types": "^3.3.0", + "@smithy/eventstream-serde-universal": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.5.tgz", - "integrity": "sha512-5u/nXbyoh1s4QxrvNre9V6vfyoLWuiVvvd5TlZjGThIikc3G+uNiG9uOTCWweSRjv1asdDIWK7nOmN7le4RYHQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz", + "integrity": "sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA==", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^3.1.2", - "@smithy/types": "^3.3.0", + "@smithy/eventstream-codec": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.5.tgz", - "integrity": "sha512-DjRtGmK8pKQMIo9+JlAKUt14Z448bg8nAN04yKIvlrrpmpRSG57s5d2Y83npks1r4gPtTRNbAFdQCoj9l3P2KQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.1", - "@smithy/querystring-builder": "^3.0.4", - "@smithy/types": "^3.4.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-blob-browser": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-3.1.2.tgz", - "integrity": "sha512-hAbfqN2UbISltakCC2TP0kx4LqXBttEv2MqSPE98gVuDFMf05lU+TpC41QtqGP3Ff5A3GwZMPfKnEy0VmEUpmg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/chunked-blob-reader": "^3.0.0", - "@smithy/chunked-blob-reader-native": "^3.0.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.4.tgz", - "integrity": "sha512-6FgTVqEfCr9z/7+Em8BwSkJKA2y3krf1em134x3yr2NHWVCo2KYI8tcA53cjeO47y41jwF84ntsEE0Pe6pNKlg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.4.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/hash-node/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz", + "integrity": "sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA==", "license": "Apache-2.0", "dependencies": { + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@smithy/hash-blob-browser": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.1.tgz", + "integrity": "sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/chunked-blob-reader": "^5.0.0", + "@smithy/chunked-blob-reader-native": "^4.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/hash-node/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@smithy/hash-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.1.tgz", + "integrity": "sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/hash-stream-node": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-3.1.2.tgz", - "integrity": "sha512-PBgDMeEdDzi6JxKwbfBtwQG9eT9cVwsf0dZzLXoJF4sHKHs5HEo/3lJWpn6jibfJwT34I1EBXpBnZE8AxAft6g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/hash-stream-node/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/hash-stream-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/hash-stream-node/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.1.tgz", + "integrity": "sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/invalid-dependency": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.4.tgz", - "integrity": "sha512-MJBUrojC4SEXi9aJcnNOE3oNAuYNphgCGFXscaCj2TA/59BTcXhzHACP8jnnEU3n4yir/NSLKzxqez0T4x4tjA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/md5-js": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-3.0.3.tgz", - "integrity": "sha512-O/SAkGVwpWmelpj/8yDtsaVe6sINHLB1q8YE/+ZQbDxIw3SRLbTZuRaI10K12sVoENdnHqzPp5i3/H+BcZ3m3Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/md5-js/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz", + "integrity": "sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/md5-js/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/md5-js/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "node_modules/@smithy/md5-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.1.tgz", + "integrity": "sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-content-length": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.6.tgz", - "integrity": "sha512-AFyHCfe8rumkJkz+hCOVJmBagNBj05KypyDwDElA4TgMSA4eYDZRjVePFZuyABrJZFDc7uVj3dpFIDCEhf59SA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz", + "integrity": "sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.1.tgz", - "integrity": "sha512-Irv+soW8NKluAtFSEsF8O3iGyLxa5oOevJb/e1yNacV9H7JP/yHyJuKST5YY2ORS1+W34VR8EuUrOF+K29Pl4g==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.6.tgz", + "integrity": "sha512-ftpmkTHIFqgaFugcjzLZv3kzPEFsBFSnq1JsIkr2mwFzCraZVhQk2gqN51OOeRxqhbPTkRFj39Qd2V91E/mQxg==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^3.0.4", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", - "@smithy/url-parser": "^3.0.4", - "@smithy/util-middleware": "^3.0.4", + "@smithy/core": "^3.1.5", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-retry": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.16.tgz", - "integrity": "sha512-08kI36p1yB4CWO3Qi+UQxjzobt8iQJpnruF0K5BkbZmA/N/sJ51A1JJGJ36GgcbFyPfWw2FU48S5ZoqXt0h0jw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.7.tgz", + "integrity": "sha512-58j9XbUPLkqAcV1kHzVX/kAR16GT+j7DUZJqwzsxh1jtz7G82caZiGyyFgUvogVfNTg3TeAOIJepGc8TXF4AVQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.5", - "@smithy/protocol-http": "^4.1.1", - "@smithy/service-error-classification": "^3.0.4", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-retry": "^3.0.4", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-serde": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.4.tgz", - "integrity": "sha512-1lPDB2O6IJ50Ucxgn7XrvZXbbuI48HmPCcMTuSoXT1lDzuTUfIuBjgAjpD8YLVMfnrjdepi/q45556LA51Pubw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz", + "integrity": "sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/middleware-stack": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.4.tgz", - "integrity": "sha512-sLMRjtMCqtVcrOqaOZ10SUnlFE25BSlmLsi4bRSGFD7dgR54eqBjfqkVkPBQyrKBortfGM0+2DJoUPcGECR+nQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz", + "integrity": "sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/node-config-provider": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.5.tgz", - "integrity": "sha512-dq/oR3/LxgCgizVk7in7FGTm0w9a3qM4mg3IIXLTCHeW3fV+ipssSvBZ2bvEx1+asfQJTyCnVLeYf7JKfd9v3Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz", + "integrity": "sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.5", - "@smithy/types": "^3.4.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/node-http-handler": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.0.tgz", - "integrity": "sha512-5TFqaABbiY7uJMKbqR4OARjwI/l4TRoysDJ75pLpVQyO3EcmeloKYwDGyCtgB9WJniFx3BMkmGCB9+j+QiB+Ww==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.3.tgz", + "integrity": "sha512-dYCLeINNbYdvmMLtW0VdhW1biXt+PPCGazzT5ZjKw46mOtdgToQEwjqZSS9/EN8+tNs/RO0cEWG044+YZs97aA==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^3.1.2", - "@smithy/protocol-http": "^4.1.1", - "@smithy/querystring-builder": "^3.0.4", - "@smithy/types": "^3.4.0", + "@smithy/abort-controller": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/property-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.4.tgz", - "integrity": "sha512-BmhefQbfkSl9DeU0/e6k9N4sT5bya5etv2epvqLUz3eGyfRBhtQq60nDkc1WPp4c+KWrzK721cUc/3y0f2psPQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.1.tgz", + "integrity": "sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/protocol-http": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.1.tgz", - "integrity": "sha512-Fm5+8LkeIus83Y8jTL1XHsBGP8sPvE1rEVyKf/87kbOPTbzEDMcgOlzcmYXat2h+nC3wwPtRy8hFqtJS71+Wow==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.0.1.tgz", + "integrity": "sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/querystring-builder": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.4.tgz", - "integrity": "sha512-NEoPAsZPdpfVbF98qm8i5k1XMaRKeEnO47CaL5ja6Y1Z2DgJdwIJuJkTJypKm/IKfp8gc0uimIFLwhml8+/pAw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz", + "integrity": "sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.4.0", - "@smithy/util-uri-escape": "^3.0.0", + "@smithy/types": "^4.1.0", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/querystring-parser": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.4.tgz", - "integrity": "sha512-7CHPXffFcakFzhO0OZs/rn6fXlTHrSDdLhIT6/JIk1u2bvwguTL3fMCc1+CfcbXA7TOhjWXu3TcB1EGMqJQwHg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz", + "integrity": "sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/service-error-classification": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.4.tgz", - "integrity": "sha512-KciDHHKFVTb9A1KlJHBt2F26PBaDtoE23uTZy5qRvPzHPqrooXFi6fmx98lJb3Jl38PuUTqIuCUmmY3pacuMBQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz", + "integrity": "sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.4.0" + "@smithy/types": "^4.1.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.5.tgz", - "integrity": "sha512-6jxsJ4NOmY5Du4FD0enYegNJl4zTSuKLiChIMqIkh+LapxiP7lmz5lYUNLE9/4cvA65mbBmtdzZ8yxmcqM5igg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz", + "integrity": "sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/signature-v4": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.1.tgz", - "integrity": "sha512-SH9J9be81TMBNGCmjhrgMWu4YSpQ3uP1L06u/K9SDrE2YibUix1qxedPCxEQu02At0P0SrYDjvz+y91vLG0KRQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.4", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.0.1.tgz", + "integrity": "sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/smithy-client": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.3.0.tgz", - "integrity": "sha512-H32nVo8tIX82kB0xI2LBrIcj8jx/3/ITotNLbeG1UL0b3b440YPR/hUvqjFJiaB24pQrMjRbU8CugqH5sV0hkw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.6.tgz", + "integrity": "sha512-UYDolNg6h2O0L+cJjtgSyKKvEKCOa/8FHYJnBobyeoeWDmNpXjwOAtw16ezyeu1ETuuLEOZbrynK0ZY1Lx9Jbw==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-endpoint": "^3.1.1", - "@smithy/middleware-stack": "^3.0.4", - "@smithy/protocol-http": "^4.1.1", - "@smithy/types": "^3.4.0", - "@smithy/util-stream": "^3.1.4", + "@smithy/core": "^3.1.5", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/types": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.4.0.tgz", - "integrity": "sha512-0shOWSg/pnFXPcsSU8ZbaJ4JBHZJPPzLCJxafJvbMVFo9l1w81CqpgUqjlKGNHVrVB7fhIs+WS82JDTyzaLyLA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.1.0.tgz", + "integrity": "sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/url-parser": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.4.tgz", - "integrity": "sha512-XdXfObA8WrloavJYtDuzoDhJAYc5rOt+FirFmKBRKaihu7QtU/METAxJgSo7uMK6hUkx0vFnqxV75urtRaLkLg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.1.tgz", + "integrity": "sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^3.0.4", - "@smithy/types": "^3.4.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-base64/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@smithy/util-base64/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.16.tgz", - "integrity": "sha512-Os8ddfNBe7hmc5UMWZxygIHCyAqY0aWR8Wnp/aKbti3f8Df/r0J9ttMZIxeMjsFgtVjEryB0q7SGcwBsHk8WEw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.7.tgz", + "integrity": "sha512-CZgDDrYHLv0RUElOsmZtAnp1pIjwDVCSuZWOPhIOBvG36RDfX1Q9+6lS61xBf+qqvHoqRjHxgINeQz47cYFC2Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.4", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.16.tgz", - "integrity": "sha512-rNhFIYRtrOrrhRlj6RL8jWA6/dcwrbGYAmy8+OAHjjzQ6zdzUBB1P+3IuJAgwWN6Y5GxI+mVXlM/pOjaoIgHow==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.7.tgz", + "integrity": "sha512-79fQW3hnfCdrfIi1soPbK3zmooRFnLpSx3Vxi6nUlqaaQeC5dm8plt4OTNDNqEEEDkvKghZSaoti684dQFVrGQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^3.0.6", - "@smithy/credential-provider-imds": "^3.2.1", - "@smithy/node-config-provider": "^3.1.5", - "@smithy/property-provider": "^3.1.4", - "@smithy/smithy-client": "^3.3.0", - "@smithy/types": "^3.4.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-endpoints": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.0.tgz", - "integrity": "sha512-ilS7/0jcbS2ELdg0fM/4GVvOiuk8/U3bIFXUW25xE1Vh1Ol4DP6vVHQKqM40rCMizCLmJ9UxK+NeJrKlhI3HVA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz", + "integrity": "sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.5", - "@smithy/types": "^3.4.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-middleware": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.4.tgz", - "integrity": "sha512-uSXHTBhstb1c4nHdmQEdkNMv9LiRNaJ/lWV2U/GO+5F236YFpdPw+hyWI9Zc0Rp9XKzwD9kVZvhZmEgp0UCVnA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.1.tgz", + "integrity": "sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.4.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-retry": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.4.tgz", - "integrity": "sha512-JJr6g0tO1qO2tCQyK+n3J18r34ZpvatlFN5ULcLranFIBZPxqoivb77EPyNTVwTGMEvvq2qMnyjm4jMIxjdLFg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.1.tgz", + "integrity": "sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^3.0.4", - "@smithy/types": "^3.4.0", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-stream": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.4.tgz", - "integrity": "sha512-txU3EIDLhrBZdGfon6E9V6sZz/irYnKFMblz4TLVjyq8hObNHNS2n9a2t7GIrl7d85zgEPhwLE0gANpZsvpsKg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.2.tgz", + "integrity": "sha512-44PKEqQ303d3rlQuiDpcCcu//hV8sn+u2JBo84dWCE0rvgeiVl0IlLMagbU++o0jCWhYCsHaAt9wZuZqNe05Hw==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^3.2.5", - "@smithy/node-http-handler": "^3.2.0", - "@smithy/types": "^3.4.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, "node_modules/@smithy/util-waiter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.1.2.tgz", - "integrity": "sha512-4pP0EV3iTsexDx+8PPGAKCQpd/6hsQBaQhqWzU4hqKPHN5epPsxKbvUTIiYIHTxaKt6/kEaqPBpu/ufvfbrRzw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.2.tgz", + "integrity": "sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/types": "^3.3.0", + "@smithy/abort-controller": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true, "license": "MIT" }, "node_modules/@types/accepts": { "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7630,6 +4916,8 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -7642,6 +4930,8 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "license": "MIT", "dependencies": { @@ -7650,6 +4940,8 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -7658,7 +4950,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "license": "MIT", "dependencies": { @@ -7667,6 +4961,8 @@ }, "node_modules/@types/body-parser": { "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -7675,6 +4971,8 @@ }, "node_modules/@types/connect": { "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -7682,6 +4980,8 @@ }, "node_modules/@types/content-disposition": { "version": "0.5.8", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", + "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==", "license": "MIT" }, "node_modules/@types/cookiejar": { @@ -7692,7 +4992,9 @@ "license": "MIT" }, "node_modules/@types/cookies": { - "version": "0.7.10", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", + "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", "license": "MIT", "dependencies": { "@types/connect": "*", @@ -7702,17 +5004,21 @@ } }, "node_modules/@types/express": { - "version": "4.17.21", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", + "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", "license": "MIT", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", + "@types/express-serve-static-core": "^5.0.0", "@types/qs": "*", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -7722,7 +5028,10 @@ } }, "node_modules/@types/fast-json-stable-stringify": { - "version": "2.1.0", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.2.tgz", + "integrity": "sha512-vsxcbfLDdjytnCnHXtinE40Xl46Wr7l/VGRGt7ewJwCPMKEHOdEsTxXX8xwgoR7cbc+6dE8SB4jlMrOV2zAg7g==", + "deprecated": "This is a stub types definition. fast-json-stable-stringify provides its own type definitions, so you do not need this installed.", "dev": true, "license": "MIT", "dependencies": { @@ -7731,6 +5040,8 @@ }, "node_modules/@types/graceful-fs": { "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7738,20 +5049,28 @@ } }, "node_modules/@types/http-assert": { - "version": "1.5.5", + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.6.tgz", + "integrity": "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==", "license": "MIT" }, "node_modules/@types/http-errors": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "license": "MIT", "dependencies": { @@ -7760,6 +5079,8 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7767,7 +5088,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.11", + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7777,25 +5100,34 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "license": "MIT" }, "node_modules/@types/jsonpath": { "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@types/jsonpath/-/jsonpath-0.2.4.tgz", + "integrity": "sha512-K3hxB8Blw0qgW6ExKgMbXQv2UPZBoE2GqLpVY+yr7nMD2Pq86lsuIzyAaiQ7eMqFL5B6di6pxSkogLJEyEHoGA==", "dev": true, "license": "MIT" }, "node_modules/@types/keygrip": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", + "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==", "license": "MIT" }, "node_modules/@types/koa": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", + "license": "MIT", "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", @@ -7809,6 +5141,8 @@ }, "node_modules/@types/koa-bodyparser": { "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@types/koa-bodyparser/-/koa-bodyparser-4.3.12.tgz", + "integrity": "sha512-hKMmRMVP889gPIdLZmmtou/BijaU1tHPyMNmcK7FAHAdATnRcGQQy78EqTTxLH1D4FTsrxIzklAQCso9oGoebQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7817,13 +5151,17 @@ }, "node_modules/@types/koa-compose": { "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", + "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", "license": "MIT", "dependencies": { "@types/koa": "*" } }, "node_modules/@types/lodash": { - "version": "4.14.202", + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", + "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", "dev": true, "license": "MIT" }, @@ -7836,38 +5174,51 @@ }, "node_modules/@types/mime": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "20.10.7", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } + "version": "20.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", + "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", + "license": "MIT" }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.11", + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "license": "MIT" }, "node_modules/@types/semver": { - "version": "7.5.6", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "license": "MIT", "dependencies": { "@types/mime": "^1", @@ -7875,16 +5226,20 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "license": "MIT", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/stack-utils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, "license": "MIT" }, @@ -7914,10 +5269,13 @@ }, "node_modules/@types/triple-beam": { "version": "1.3.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, "node_modules/@types/yargs": { - "version": "17.0.32", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -7926,11 +5284,15 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", @@ -7963,6 +5325,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", @@ -7988,6 +5352,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", @@ -8003,6 +5369,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", @@ -8028,6 +5396,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -8039,6 +5409,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.62.0", @@ -8064,6 +5436,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -8088,6 +5462,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", @@ -8102,15 +5478,21 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, "node_modules/abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "license": "ISC" }, "node_modules/accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -8121,7 +5503,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -8132,26 +5516,37 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { - "version": "8.3.1", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } }, "node_modules/add-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", "dev": true, "license": "MIT" }, "node_modules/agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "dependencies": { "debug": "4" @@ -8161,13 +5556,14 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -8176,6 +5572,8 @@ }, "node_modules/ajv-draft-04": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", "license": "MIT", "peerDependencies": { "ajv": "^8.5.0" @@ -8188,6 +5586,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -8201,13 +5601,68 @@ } } }, + "node_modules/allure-jest": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/allure-jest/-/allure-jest-3.2.0.tgz", + "integrity": "sha512-j6Ymctv9gvp2JRrUU6pIuFu+2hKxu4Qa+xxzw29i0IHUUZTeOszTS+9DHtk+ejnvuUBFsNlV7LwjPMSj1w8Igw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "allure-js-commons": "3.2.0" + }, + "peerDependencies": { + "jest": ">=24.8.0", + "jest-circus": ">=24.8.0", + "jest-cli": ">=24.8.0", + "jest-environment-jsdom": ">=24.8.0", + "jest-environment-node": ">=24.8.0" + }, + "peerDependenciesMeta": { + "jest": { + "optional": true + }, + "jest-circus": { + "optional": true + }, + "jest-cli": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "jest-environment-node": { + "optional": true + } + } + }, + "node_modules/allure-js-commons": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/allure-js-commons/-/allure-js-commons-3.2.0.tgz", + "integrity": "sha512-UXRo3D6/XEIMosro+OldWj8phJ65eSOYaAUlThOpl6nJJ0sGngMpJYog+Z9FmZDo1BZn4edwLs4aAUaTgkz4Cg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "md5": "^2.3.0" + }, + "peerDependencies": { + "allure-playwright": "3.2.0" + }, + "peerDependenciesMeta": { + "allure-playwright": { + "optional": true + } + } + }, "node_modules/amazon-dsp-formatter": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/amazon-dsp-formatter/-/amazon-dsp-formatter-1.0.2.tgz", - "integrity": "sha512-CfsssMzLFh0IK6oz3j38ENGgp5LZ/q21YX4yXSavfI50CU2cJbupKOk+Bgg0sY67V0lWsYsmYrpkEI2aFG/duA==" + "integrity": "sha512-CfsssMzLFh0IK6oz3j38ENGgp5LZ/q21YX4yXSavfI50CU2cJbupKOk+Bgg0sY67V0lWsYsmYrpkEI2aFG/duA==", + "license": "MIT" }, "node_modules/ansi-align": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "license": "ISC", "dependencies": { @@ -8216,6 +5671,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8230,6 +5687,8 @@ }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -8241,6 +5700,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { "node": ">=8" @@ -8248,6 +5709,8 @@ }, "node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -8258,11 +5721,15 @@ }, "node_modules/any-promise": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -8275,15 +5742,22 @@ }, "node_modules/app-module-path": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", + "integrity": "sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/aproba": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "license": "ISC" }, "node_modules/are-we-there-yet": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", "license": "ISC", "dependencies": { "delegates": "^1.0.0", @@ -8295,6 +5769,8 @@ }, "node_modules/are-we-there-yet/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -8307,19 +5783,28 @@ }, "node_modules/arg": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8327,6 +5812,8 @@ }, "node_modules/array-find-index": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "dev": true, "license": "MIT", "engines": { @@ -8335,17 +5822,22 @@ }, "node_modules/array-ify": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true, "license": "MIT" }, "node_modules/array-includes": { - "version": "3.1.7", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -8357,20 +5849,25 @@ }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8380,13 +5877,15 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8396,13 +5895,15 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8412,16 +5913,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -8432,6 +5935,8 @@ }, "node_modules/arrify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, "license": "MIT", "engines": { @@ -8440,11 +5945,15 @@ }, "node_modules/asap": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, "license": "MIT" }, "node_modules/ast-module-types": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-4.0.0.tgz", + "integrity": "sha512-Kd0o8r6CDazJGCRzs8Ivpn0xj19oNKrULhoJFzhGjRsLpekF2zyZs9Ukz+JvZhWD6smszfepakTFhAaYpsI12g==", "dev": true, "license": "MIT", "engines": { @@ -8452,15 +5961,30 @@ } }, "node_modules/async": { - "version": "3.2.5", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, "license": "ISC", "engines": { @@ -8468,8 +5992,13 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -8479,10 +6008,14 @@ }, "node_modules/await-handler": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/await-handler/-/await-handler-1.1.2.tgz", + "integrity": "sha512-dihteGhwbJpT89kVbacWiyKeAZr+En0YGK6pAKQJLR0En9ZxSH2H4TTvfG4bBjzFq9gDAma4y9BrpDns6j5UiQ==", "license": "MIT" }, "node_modules/axios": { - "version": "1.7.5", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz", + "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -8492,6 +6025,9 @@ }, "node_modules/axios-mock-adapter": { "version": "1.22.0", + "resolved": "https://registry.npmjs.org/axios-mock-adapter/-/axios-mock-adapter-1.22.0.tgz", + "integrity": "sha512-dmI0KbkyAhntUR05YY96qg2H6gg0XMl2+qTW0xmYg6Up+BFBAJYRLROMXRdDEL06/Wqwa0TJThAYvFtSFdRCZw==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -8503,6 +6039,8 @@ }, "node_modules/babel-jest": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", "dependencies": { @@ -8523,6 +6061,8 @@ }, "node_modules/babel-jest/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -8537,6 +6077,8 @@ }, "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -8552,6 +6094,8 @@ }, "node_modules/babel-jest/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8563,11 +6107,15 @@ }, "node_modules/babel-jest/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -8576,6 +6124,8 @@ }, "node_modules/babel-jest/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -8587,6 +6137,8 @@ }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8602,6 +6154,8 @@ }, "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8617,6 +6171,8 @@ }, "node_modules/babel-plugin-istanbul/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -8625,6 +6181,8 @@ }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", "dependencies": { @@ -8638,22 +6196,27 @@ } }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -8661,6 +6224,8 @@ }, "node_modules/babel-preset-jest": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", "dependencies": { @@ -8676,10 +6241,14 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -8698,6 +6267,8 @@ }, "node_modules/benchmark-suite": { "version": "0.1.8", + "resolved": "https://registry.npmjs.org/benchmark-suite/-/benchmark-suite-0.1.8.tgz", + "integrity": "sha512-UDfWBQfeq/lXcsjuGAanOrX6AhP6HQSsutGS7CfStcbE1loLge7aQr5DT6n8r/4bUoiK+5RYwnogNu5UuTBMNg==", "dev": true, "license": "MIT", "dependencies": { @@ -8713,6 +6284,8 @@ }, "node_modules/bindings": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" @@ -8720,11 +6293,14 @@ }, "node_modules/bintrees": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==", "license": "MIT" }, "node_modules/bl": { "version": "4.1.0", - "dev": true, + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -8734,7 +6310,8 @@ }, "node_modules/bl/node_modules/readable-stream": { "version": "3.6.2", - "dev": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -8745,17 +6322,16 @@ "node": ">= 6" } }, - "node_modules/boolean": { - "version": "3.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/bowser": { "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", "license": "MIT" }, "node_modules/boxen": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8777,6 +6353,8 @@ }, "node_modules/boxen/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -8791,6 +6369,8 @@ }, "node_modules/boxen/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -8806,6 +6386,8 @@ }, "node_modules/boxen/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8817,11 +6399,15 @@ }, "node_modules/boxen/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/boxen/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -8830,6 +6416,8 @@ }, "node_modules/boxen/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -8841,6 +6429,8 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -8849,6 +6439,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -8858,7 +6450,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -8876,10 +6470,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -8890,6 +6484,8 @@ }, "node_modules/bs-logger": { "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, "license": "MIT", "dependencies": { @@ -8901,6 +6497,8 @@ }, "node_modules/bser": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -8909,6 +6507,8 @@ }, "node_modules/btoa": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "license": "(MIT OR Apache-2.0)", "bin": { "btoa": "bin/btoa.js" @@ -8919,6 +6519,8 @@ }, "node_modules/buffer": { "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", "license": "MIT", "dependencies": { "base64-js": "^1.0.2", @@ -8927,11 +6529,15 @@ }, "node_modules/buffer-from": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/builtin-modules": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "license": "MIT", "engines": { @@ -8943,6 +6549,8 @@ }, "node_modules/byline": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8950,6 +6558,8 @@ }, "node_modules/bytes": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -8957,6 +6567,8 @@ }, "node_modules/cache-content-type": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "license": "MIT", "dependencies": { "mime-types": "^2.1.18", @@ -8968,6 +6580,8 @@ }, "node_modules/cacheable-request": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8982,6 +6596,8 @@ }, "node_modules/cacheable-request/node_modules/get-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true, "license": "MIT", "engines": { @@ -8990,27 +6606,25 @@ }, "node_modules/cacheable-request/node_modules/json-buffer": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", "dev": true, "license": "MIT" }, "node_modules/cacheable-request/node_modules/keyv": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.0" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cachedir": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", "dev": true, "license": "MIT", "engines": { @@ -9018,12 +6632,47 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9031,11 +6680,15 @@ }, "node_modules/call-me-maybe": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", "dev": true, "license": "MIT" }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" @@ -9043,6 +6696,8 @@ }, "node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { @@ -9054,6 +6709,8 @@ }, "node_modules/camelcase-keys": { "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -9070,6 +6727,8 @@ }, "node_modules/camelcase-keys/node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -9077,7 +6736,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001576", + "version": "1.0.30001702", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001702.tgz", + "integrity": "sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==", "dev": true, "funding": [ { @@ -9097,6 +6758,8 @@ }, "node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", @@ -9109,6 +6772,8 @@ }, "node_modules/char-regex": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", "engines": { @@ -9117,11 +6782,15 @@ }, "node_modules/chardet": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true, "license": "MIT" }, "node_modules/charenc": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "license": "BSD-3-Clause", "engines": { "node": "*" @@ -9129,6 +6798,8 @@ }, "node_modules/check-more-types": { "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", "dev": true, "license": "MIT", "engines": { @@ -9137,6 +6808,8 @@ }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "license": "ISC", "engines": { "node": ">=10" @@ -9144,6 +6817,8 @@ }, "node_modules/ci-info": { "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -9157,12 +6832,16 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.3", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, "license": "MIT" }, "node_modules/clean-regexp": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, "license": "MIT", "dependencies": { @@ -9174,6 +6853,8 @@ }, "node_modules/cli-boxes": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true, "license": "MIT", "engines": { @@ -9185,6 +6866,8 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "license": "MIT", "dependencies": { @@ -9196,6 +6879,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "license": "MIT", "engines": { @@ -9207,6 +6892,8 @@ }, "node_modules/cli-truncate": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "license": "MIT", "dependencies": { @@ -9221,7 +6908,9 @@ } }, "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -9233,11 +6922,15 @@ }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -9254,6 +6947,8 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9268,6 +6963,8 @@ }, "node_modules/cli-width": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true, "license": "ISC", "engines": { @@ -9276,6 +6973,8 @@ }, "node_modules/cliui": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { @@ -9289,6 +6988,8 @@ }, "node_modules/clone": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "license": "MIT", "engines": { "node": ">=0.8" @@ -9296,6 +6997,8 @@ }, "node_modules/clone-response": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9304,6 +7007,8 @@ }, "node_modules/cluster-key-slot": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", "license": "Apache-2.0", "engines": { "node": ">=0.10.0" @@ -9311,6 +7016,8 @@ }, "node_modules/co": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "license": "MIT", "engines": { "iojs": ">= 1.0.0", @@ -9318,23 +7025,32 @@ } }, "node_modules/co-body": { - "version": "6.1.0", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.2.0.tgz", + "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==", "license": "MIT", "dependencies": { + "@hapi/bourne": "^3.0.0", "inflation": "^2.0.0", "qs": "^6.5.2", "raw-body": "^2.3.3", "type-is": "^1.6.16" + }, + "engines": { + "node": ">=8.0.0" } }, "node_modules/collect-v8-coverage": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true, "license": "MIT" }, "node_modules/color": { "version": "3.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" @@ -9342,6 +7058,8 @@ }, "node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "dependencies": { "color-name": "1.1.3" @@ -9349,11 +7067,14 @@ }, "node_modules/color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "license": "MIT" }, "node_modules/color-string": { "version": "1.9.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -9361,6 +7082,8 @@ }, "node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "license": "ISC", "bin": { "color-support": "bin.js" @@ -9368,11 +7091,15 @@ }, "node_modules/colorette": { "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/colors": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "license": "MIT", "engines": { "node": ">=0.1.90" @@ -9380,7 +7107,8 @@ }, "node_modules/colorspace": { "version": "1.1.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "dependencies": { "color": "^3.1.3", "text-hex": "1.0.x" @@ -9388,6 +7116,8 @@ }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -9398,6 +7128,8 @@ }, "node_modules/commander": { "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "license": "MIT", "engines": { @@ -9405,7 +7137,9 @@ } }, "node_modules/commitizen": { - "version": "4.3.0", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz", + "integrity": "sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==", "dev": true, "license": "MIT", "dependencies": { @@ -9427,217 +7161,62 @@ "bin": { "commitizen": "bin/commitizen", "cz": "bin/git-cz", - "git-cz": "bin/git-cz" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/commitizen/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/commitizen/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/commitizen/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/commitizen/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/commitizen/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/commitizen/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/commitizen/node_modules/inquirer": { - "version": "8.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/commitizen/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/commitlint": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@commitlint/cli": "^17.8.1", - "@commitlint/types": "^17.8.1" - }, - "bin": { - "commitlint": "cli.js" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/commitlint/node_modules/@commitlint/types": { - "version": "17.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0" - }, - "engines": { - "node": ">=v14" - } - }, - "node_modules/commitlint/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/commitlint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/commitlint/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" + "git-cz": "bin/git-cz" }, "engines": { - "node": ">=7.0.0" + "node": ">= 12" } }, - "node_modules/commitlint/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/commitlint/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/commitizen/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/commitlint/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/commitlint": { + "version": "17.8.1", + "resolved": "https://registry.npmjs.org/commitlint/-/commitlint-17.8.1.tgz", + "integrity": "sha512-X+VPJwZsQDeGj/DG1NsxhZEl+oMHKNC+1myZ/zauNDoo+7OuLHfTOUU1C1a4CjKW4b6T7NuoFcYfK0kRCjCtbA==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@commitlint/cli": "^17.8.1", + "@commitlint/types": "^17.8.1" + }, + "bin": { + "commitlint": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=v14" } }, "node_modules/commondir": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true, "license": "MIT" }, "node_modules/compare-func": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, "license": "MIT", "dependencies": { @@ -9647,6 +7226,8 @@ }, "node_modules/component-each": { "version": "0.2.6", + "resolved": "https://registry.npmjs.org/component-each/-/component-each-0.2.6.tgz", + "integrity": "sha512-IOXG+HZmbgaBS8Rqy+tAMrwsPdEY1BWcPcp0xI2ZOzKQhHvSVGrL7iCnoDU37TEKOCfaf4ywsR6GwAr0JivPjg==", "dependencies": { "component-type": "1.0.0", "to-function": "2.0.6" @@ -9654,6 +7235,8 @@ }, "node_modules/component-emitter": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, "license": "MIT", "funding": { @@ -9661,17 +7244,25 @@ } }, "node_modules/component-props": { - "version": "1.1.1" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/component-props/-/component-props-1.1.1.tgz", + "integrity": "sha512-69pIRJs9fCCHRqCz3390YF2LV1Lu6iEMZ5zuVqqUn+G20V9BNXlMs0cWawWeW9g4Ynmg29JmkG6R7/lUJoGd1Q==" }, "node_modules/component-type": { - "version": "1.0.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.0.0.tgz", + "integrity": "sha512-qzUg4SGDH6KFYlcklmeZwucbtosh/XGwuIffqXAhC1dZyjO7Xu1UuaxwKRY29EncuBj/DH+h6Zot3AdZS6xdFw==" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "license": "MIT" }, "node_modules/concat-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "engines": [ "node >= 6.0" @@ -9686,6 +7277,8 @@ }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { @@ -9699,14 +7292,20 @@ }, "node_modules/confusing-browser-globals": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", "license": "MIT" }, "node_modules/console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "license": "ISC" }, "node_modules/content-disposition": { "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -9717,6 +7316,8 @@ }, "node_modules/content-type": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -9724,6 +7325,8 @@ }, "node_modules/conventional-changelog": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-2.0.3.tgz", + "integrity": "sha512-4bcII9cJHSKb2qi9e8qGF6aJHLf/AB0dokhyR+X6QILTMl77s4l163vK+reXhajvfOYbbHQvsrWybr5+PKZwNA==", "dev": true, "license": "MIT", "dependencies": { @@ -9745,6 +7348,8 @@ }, "node_modules/conventional-changelog-angular": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz", + "integrity": "sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==", "dev": true, "license": "ISC", "dependencies": { @@ -9756,6 +7361,8 @@ }, "node_modules/conventional-changelog-atom": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", + "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", "dev": true, "license": "ISC", "dependencies": { @@ -9767,6 +7374,8 @@ }, "node_modules/conventional-changelog-codemirror": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", + "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", "dev": true, "license": "ISC", "dependencies": { @@ -9778,11 +7387,15 @@ }, "node_modules/conventional-changelog-config-spec": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", + "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", "dev": true, "license": "MIT" }, "node_modules/conventional-changelog-conventionalcommits": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-6.1.0.tgz", + "integrity": "sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==", "dev": true, "license": "ISC", "dependencies": { @@ -9794,6 +7407,8 @@ }, "node_modules/conventional-changelog-core": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", + "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9817,6 +7432,8 @@ }, "node_modules/conventional-changelog-core/node_modules/camelcase": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", "dev": true, "license": "MIT", "engines": { @@ -9825,6 +7442,8 @@ }, "node_modules/conventional-changelog-core/node_modules/camelcase-keys": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9838,6 +7457,8 @@ }, "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9857,6 +7478,8 @@ }, "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { @@ -9870,6 +7493,8 @@ }, "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser/node_modules/through2": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "license": "MIT", "dependencies": { @@ -9878,6 +7503,8 @@ }, "node_modules/conventional-changelog-core/node_modules/dargs": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha512-jyweV/k0rbv2WK4r9KLayuBrSh2Py0tNmV7LBoSMH4hMQyrG8OPyIOWB2VEx4DJKXWmK4lopYMVvORlDt2S8Aw==", "dev": true, "license": "MIT", "dependencies": { @@ -9889,6 +7516,8 @@ }, "node_modules/conventional-changelog-core/node_modules/git-raw-commits": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", + "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", "dev": true, "license": "MIT", "dependencies": { @@ -9907,6 +7536,8 @@ }, "node_modules/conventional-changelog-core/node_modules/git-raw-commits/node_modules/meow": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", "dev": true, "license": "MIT", "dependencies": { @@ -9926,6 +7557,8 @@ }, "node_modules/conventional-changelog-core/node_modules/git-raw-commits/node_modules/split2": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "license": "ISC", "dependencies": { @@ -9934,6 +7567,8 @@ }, "node_modules/conventional-changelog-core/node_modules/git-raw-commits/node_modules/through2": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9943,6 +7578,8 @@ }, "node_modules/conventional-changelog-core/node_modules/indent-string": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", "dev": true, "license": "MIT", "engines": { @@ -9951,6 +7588,8 @@ }, "node_modules/conventional-changelog-core/node_modules/map-obj": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", "dev": true, "license": "MIT", "engines": { @@ -9959,6 +7598,8 @@ }, "node_modules/conventional-changelog-core/node_modules/minimist-options": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9971,6 +7612,8 @@ }, "node_modules/conventional-changelog-core/node_modules/quick-lru": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", "dev": true, "license": "MIT", "engines": { @@ -9979,6 +7622,8 @@ }, "node_modules/conventional-changelog-core/node_modules/redent": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", "dev": true, "license": "MIT", "dependencies": { @@ -9991,6 +7636,8 @@ }, "node_modules/conventional-changelog-core/node_modules/strip-indent": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", "dev": true, "license": "MIT", "engines": { @@ -9999,6 +7646,8 @@ }, "node_modules/conventional-changelog-core/node_modules/through2": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10008,6 +7657,8 @@ }, "node_modules/conventional-changelog-ember": { "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", + "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", "dev": true, "license": "ISC", "dependencies": { @@ -10019,6 +7670,8 @@ }, "node_modules/conventional-changelog-eslint": { "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", "dev": true, "license": "ISC", "dependencies": { @@ -10030,6 +7683,8 @@ }, "node_modules/conventional-changelog-express": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", + "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", "dev": true, "license": "ISC", "dependencies": { @@ -10041,6 +7696,8 @@ }, "node_modules/conventional-changelog-jquery": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", + "integrity": "sha512-wbz5vVcvu/SPZTDFB21fF/xo5zFq6NQR42jhtUfOrrP1N/ZjNshhGb3expCGqHYdnUHzPevHeUafsVrdxVD5Og==", "dev": true, "license": "ISC", "dependencies": { @@ -10049,6 +7706,8 @@ }, "node_modules/conventional-changelog-jscs": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", + "integrity": "sha512-V8sey4tE0nJUlWGi2PZKDMfawYLf/+F165xhhDjcIoTEJDxssVV5PMVzTQzjS6U/dEX85fWkur+bs6imOqkIng==", "dev": true, "license": "ISC", "dependencies": { @@ -10057,6 +7716,8 @@ }, "node_modules/conventional-changelog-jshint": { "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", + "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", "dev": true, "license": "ISC", "dependencies": { @@ -10069,6 +7730,8 @@ }, "node_modules/conventional-changelog-preset-loader": { "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "dev": true, "license": "MIT", "engines": { @@ -10077,6 +7740,8 @@ }, "node_modules/conventional-changelog-writer": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz", + "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==", "dev": true, "license": "MIT", "dependencies": { @@ -10100,6 +7765,8 @@ }, "node_modules/conventional-changelog-writer/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { @@ -10113,6 +7780,8 @@ }, "node_modules/conventional-changelog-writer/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -10121,6 +7790,8 @@ }, "node_modules/conventional-changelog-writer/node_modules/through2": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "license": "MIT", "dependencies": { @@ -10129,6 +7800,8 @@ }, "node_modules/conventional-changelog/node_modules/compare-func": { "version": "1.3.4", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz", + "integrity": "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10138,6 +7811,8 @@ }, "node_modules/conventional-changelog/node_modules/conventional-changelog-angular": { "version": "1.6.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", + "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", "dev": true, "license": "ISC", "dependencies": { @@ -10147,11 +7822,15 @@ }, "node_modules/conventional-commit-types": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz", + "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", "dev": true, "license": "ISC" }, "node_modules/conventional-commits-filter": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", "dev": true, "license": "MIT", "dependencies": { @@ -10164,6 +7843,8 @@ }, "node_modules/conventional-commits-parser": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", + "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", "dev": true, "license": "MIT", "dependencies": { @@ -10181,6 +7862,8 @@ }, "node_modules/conventional-github-releaser": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/conventional-github-releaser/-/conventional-github-releaser-3.1.5.tgz", + "integrity": "sha512-VhPKbdN92b2ygnQLkuwHIfUaPAVrVfJVuQdxbmmVPkN927LDP98HthLWFVShh4pxqLK0nE66v78RERGJVeCzbg==", "dev": true, "license": "MIT", "dependencies": { @@ -10206,6 +7889,8 @@ }, "node_modules/conventional-github-releaser/node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -10214,6 +7899,8 @@ }, "node_modules/conventional-github-releaser/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10222,6 +7909,8 @@ }, "node_modules/conventional-github-releaser/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -10234,6 +7923,8 @@ }, "node_modules/conventional-github-releaser/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -10245,6 +7936,8 @@ }, "node_modules/conventional-github-releaser/node_modules/meow": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", + "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", "dev": true, "license": "MIT", "dependencies": { @@ -10269,6 +7962,8 @@ }, "node_modules/conventional-github-releaser/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -10283,6 +7978,8 @@ }, "node_modules/conventional-github-releaser/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -10294,6 +7991,8 @@ }, "node_modules/conventional-github-releaser/node_modules/read-pkg": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "license": "MIT", "dependencies": { @@ -10308,6 +8007,8 @@ }, "node_modules/conventional-github-releaser/node_modules/read-pkg-up": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "license": "MIT", "dependencies": { @@ -10324,6 +8025,8 @@ }, "node_modules/conventional-github-releaser/node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -10332,6 +8035,8 @@ }, "node_modules/conventional-github-releaser/node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -10340,6 +8045,8 @@ }, "node_modules/conventional-github-releaser/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -10348,6 +8055,8 @@ }, "node_modules/conventional-github-releaser/node_modules/type-fest": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -10359,6 +8068,8 @@ }, "node_modules/conventional-github-releaser/node_modules/yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "license": "ISC", "dependencies": { @@ -10371,6 +8082,8 @@ }, "node_modules/conventional-recommended-bump": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", "dev": true, "license": "MIT", "dependencies": { @@ -10392,6 +8105,8 @@ }, "node_modules/conventional-recommended-bump/node_modules/conventional-commits-parser": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10411,6 +8126,8 @@ }, "node_modules/conventional-recommended-bump/node_modules/git-semver-tags": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, "license": "MIT", "dependencies": { @@ -10426,6 +8143,8 @@ }, "node_modules/conventional-recommended-bump/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { @@ -10439,6 +8158,8 @@ }, "node_modules/conventional-recommended-bump/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -10447,6 +8168,8 @@ }, "node_modules/conventional-recommended-bump/node_modules/through2": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "license": "MIT", "dependencies": { @@ -10454,23 +8177,33 @@ } }, "node_modules/convert-hex": { - "version": "0.1.0" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/convert-hex/-/convert-hex-0.1.0.tgz", + "integrity": "sha512-w20BOb1PiR/sEJdS6wNrUjF5CSfscZFUp7R9NSlXH8h2wynzXVEPFPJECAnkNylZ+cvf3p7TyRUHggDmrwXT9A==" }, "node_modules/convert-source-map": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/convert-string": { - "version": "0.1.0" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/convert-string/-/convert-string-0.1.0.tgz", + "integrity": "sha512-1KX9ESmtl8xpT2LN2tFnKSbV4NiarbVi8DVb39ZriijvtTklyrT+4dT1wsGMHKD3CJUjXgvJzstm9qL9ICojGA==" }, "node_modules/cookiejar": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true, "license": "MIT" }, "node_modules/cookies": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", + "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -10482,15 +8215,21 @@ }, "node_modules/copy-to": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==", "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "license": "MIT", "dependencies": { @@ -10515,24 +8254,25 @@ } }, "node_modules/cosmiconfig-typescript-loader": { - "version": "5.0.0", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", + "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "jiti": "^1.19.1" - }, "engines": { - "node": ">=v16" + "node": ">=v14.21.3" }, "peerDependencies": { "@types/node": "*", - "cosmiconfig": ">=8.2", + "cosmiconfig": ">=7", + "ts-node": ">=10", "typescript": ">=4" } }, "node_modules/create-jest": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10553,6 +8293,8 @@ }, "node_modules/create-jest/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -10567,6 +8309,8 @@ }, "node_modules/create-jest/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -10582,6 +8326,8 @@ }, "node_modules/create-jest/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10593,11 +8339,15 @@ }, "node_modules/create-jest/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/create-jest/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -10606,6 +8356,8 @@ }, "node_modules/create-jest/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -10617,6 +8369,8 @@ }, "node_modules/create-require": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, "license": "MIT" }, @@ -10636,21 +8390,23 @@ }, "node_modules/crypt": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "license": "BSD-3-Clause", "engines": { "node": "*" } }, - "node_modules/crypto": { - "version": "1.0.1", - "license": "ISC" - }, "node_modules/crypto-js": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", "license": "MIT" }, "node_modules/currently-unhandled": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "dev": true, "license": "MIT", "dependencies": { @@ -10662,6 +8418,8 @@ }, "node_modules/cz-conventional-changelog": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", + "integrity": "sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==", "dev": true, "license": "MIT", "dependencies": { @@ -10681,14 +8439,69 @@ }, "node_modules/dargs": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dateformat": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true, "license": "MIT", "engines": { @@ -10696,10 +8509,12 @@ } }, "node_modules/debug": { - "version": "4.3.4", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -10712,6 +8527,8 @@ }, "node_modules/decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "license": "MIT", "engines": { @@ -10720,6 +8537,8 @@ }, "node_modules/decamelize-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, "license": "MIT", "dependencies": { @@ -10735,6 +8554,8 @@ }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, "license": "MIT", "engines": { @@ -10743,6 +8564,8 @@ }, "node_modules/decode-uri-component": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "license": "MIT", "engines": { @@ -10751,6 +8574,8 @@ }, "node_modules/decompress-response": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dev": true, "license": "MIT", "dependencies": { @@ -10762,16 +8587,21 @@ }, "node_modules/dedent": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true, "license": "MIT" }, "node_modules/deep-equal": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", "license": "MIT" }, "node_modules/deep-extend": { "version": "0.6.0", - "dev": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", "engines": { "node": ">=4.0.0" @@ -10779,10 +8609,14 @@ }, "node_modules/deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { @@ -10791,6 +8625,8 @@ }, "node_modules/defaults": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "dependencies": { "clone": "^1.0.2" @@ -10801,25 +8637,34 @@ }, "node_modules/defaults/node_modules/clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/define-data-property": { - "version": "1.1.1", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -10835,6 +8680,8 @@ }, "node_modules/delay": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", "license": "MIT", "engines": { "node": ">=10" @@ -10845,6 +8692,8 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -10852,10 +8701,14 @@ }, "node_modules/delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "license": "MIT" }, "node_modules/denque": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "license": "Apache-2.0", "engines": { "node": ">=0.10" @@ -10863,6 +8716,8 @@ }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -10870,6 +8725,8 @@ }, "node_modules/dependency-tree": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/dependency-tree/-/dependency-tree-9.0.0.tgz", + "integrity": "sha512-osYHZJ1fBSon3lNLw70amAXsQ+RGzXsPvk9HbBgTLbp/bQBmpH5mOmsUvqXU+YEWVU0ZLewsmzOET/8jWswjDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10888,11 +8745,15 @@ }, "node_modules/dependency-tree/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, "node_modules/dependency-tree/node_modules/detective-stylus": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-3.0.0.tgz", + "integrity": "sha512-1xYTzbrduExqMYmte7Qk99IRA3Aa6oV7PYzd+3yDcQXkmENvyGF/arripri6lxRDdNYEb4fZFuHtNRAXbz3iAA==", "dev": true, "license": "MIT", "engines": { @@ -10901,6 +8762,8 @@ }, "node_modules/dependency-tree/node_modules/module-definition": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-4.1.0.tgz", + "integrity": "sha512-rHXi/DpMcD2qcKbPCTklDbX9lBKJrUSl971TW5l6nMpqKCIlzJqmQ8cfEF5M923h2OOLHPDVlh5pJxNyV+AJlw==", "dev": true, "license": "MIT", "dependencies": { @@ -10916,6 +8779,8 @@ }, "node_modules/dependency-tree/node_modules/precinct": { "version": "9.2.1", + "resolved": "https://registry.npmjs.org/precinct/-/precinct-9.2.1.tgz", + "integrity": "sha512-uzKHaTyiVejWW7VJtHInb9KBUq9yl9ojxXGujhjhDmPon2wgZPBKQIKR+6csGqSlUeGXAA4MEFnU6DesxZib+A==", "dev": true, "license": "MIT", "dependencies": { @@ -10941,6 +8806,8 @@ }, "node_modules/dependency-tree/node_modules/precinct/node_modules/commander": { "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, "license": "MIT", "engines": { @@ -10949,6 +8816,8 @@ }, "node_modules/dependency-tree/node_modules/typescript": { "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "license": "Apache-2.0", "bin": { @@ -10961,6 +8830,8 @@ }, "node_modules/destroy": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", "engines": { "node": ">= 0.8", @@ -10969,6 +8840,8 @@ }, "node_modules/detect-file": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", "dev": true, "license": "MIT", "engines": { @@ -10977,6 +8850,8 @@ }, "node_modules/detect-indent": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, "license": "MIT", "engines": { @@ -10985,6 +8860,8 @@ }, "node_modules/detect-libc": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -10992,6 +8869,8 @@ }, "node_modules/detect-newline": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { @@ -11000,6 +8879,8 @@ }, "node_modules/detective-amd": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-4.2.0.tgz", + "integrity": "sha512-RbuEJHz78A8nW7CklkqTzd8lDCN42En53dgEIsya0DilpkwslamSZDasLg8dJyxbw46OxhSQeY+C2btdSkCvQQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11017,6 +8898,8 @@ }, "node_modules/detective-cjs": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-4.1.0.tgz", + "integrity": "sha512-QxzMwt5MfPLwS7mG30zvnmOvHLx5vyVvjsAV6gQOyuMoBR5G1DhS1eJZ4P10AlH+HSnk93mTcrg3l39+24XCtg==", "dev": true, "license": "MIT", "dependencies": { @@ -11029,6 +8912,8 @@ }, "node_modules/detective-es6": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-3.0.1.tgz", + "integrity": "sha512-evPeYIEdK1jK3Oji5p0hX4sPV/1vK+o4ihcWZkMQE6voypSW/cIBiynOLxQk5KOOQbdP8oOAsYqouMTYO5l1sw==", "dev": true, "license": "MIT", "dependencies": { @@ -11040,6 +8925,8 @@ }, "node_modules/detective-less": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/detective-less/-/detective-less-1.0.2.tgz", + "integrity": "sha512-Rps1xDkEEBSq3kLdsdnHZL1x2S4NGDcbrjmd4q+PykK5aJwDdP5MBgrJw1Xo+kyUHuv3JEzPqxr+Dj9ryeDRTA==", "dev": true, "license": "MIT", "dependencies": { @@ -11053,6 +8940,8 @@ }, "node_modules/detective-less/node_modules/node-source-walk": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", + "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", "dev": true, "license": "MIT", "dependencies": { @@ -11064,6 +8953,8 @@ }, "node_modules/detective-postcss": { "version": "6.1.3", + "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-6.1.3.tgz", + "integrity": "sha512-7BRVvE5pPEvk2ukUWNQ+H2XOq43xENWbH0LcdCE14mwgTBEAMoAx+Fc1rdp76SmyZ4Sp48HlV7VedUnP6GA1Tw==", "dev": true, "license": "MIT", "dependencies": { @@ -11077,6 +8968,8 @@ }, "node_modules/detective-sass": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-4.1.3.tgz", + "integrity": "sha512-xGRbwGaGte57gvEqM8B9GDiURY3El/H49vA6g9wFkxq9zalmTlTAuqWu+BsH0iwonGPruLt55tZZDEZqPc6lag==", "dev": true, "license": "MIT", "dependencies": { @@ -11089,6 +8982,8 @@ }, "node_modules/detective-scss": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-3.1.1.tgz", + "integrity": "sha512-FWkfru1jZBhUeuBsOeGKXKAVDrzYFSQFK2o2tuG/nCCFQ0U/EcXC157MNAcR5mmj+mCeneZzlkBOFJTesDjrww==", "dev": true, "license": "MIT", "dependencies": { @@ -11101,6 +8996,8 @@ }, "node_modules/detective-stylus": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-2.0.1.tgz", + "integrity": "sha512-/Tvs1pWLg8eYwwV6kZQY5IslGaYqc/GACxjcaGudiNtN5nKCH6o2WnJK3j0gA3huCnoQcbv8X7oz/c1lnvE3zQ==", "dev": true, "license": "MIT", "engines": { @@ -11109,6 +9006,8 @@ }, "node_modules/detective-typescript": { "version": "9.1.1", + "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-9.1.1.tgz", + "integrity": "sha512-Uc1yVutTF0RRm1YJ3g//i1Cn2vx1kwHj15cnzQP6ff5koNzQ0idc1zAC73ryaWEulA0ElRXFTq6wOqe8vUQ3MA==", "dev": true, "license": "MIT", "dependencies": { @@ -11123,6 +9022,8 @@ }, "node_modules/detective-typescript/node_modules/typescript": { "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "license": "Apache-2.0", "bin": { @@ -11135,6 +9036,8 @@ }, "node_modules/dezalgo": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "license": "ISC", "dependencies": { @@ -11144,6 +9047,8 @@ }, "node_modules/diff": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -11152,6 +9057,8 @@ }, "node_modules/diff-sequences": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { @@ -11160,6 +9067,8 @@ }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "license": "MIT", "dependencies": { "path-type": "^4.0.0" @@ -11170,6 +9079,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" @@ -11180,6 +9091,8 @@ }, "node_modules/dot-prop": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11190,17 +9103,21 @@ } }, "node_modules/dotenv": { - "version": "16.3.1", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "license": "BSD-2-Clause", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/dotgitignore": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", "dev": true, "license": "ISC", "dependencies": { @@ -11213,6 +9130,8 @@ }, "node_modules/dotgitignore/node_modules/find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "license": "MIT", "dependencies": { @@ -11224,6 +9143,8 @@ }, "node_modules/dotgitignore/node_modules/locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "license": "MIT", "dependencies": { @@ -11236,6 +9157,8 @@ }, "node_modules/dotgitignore/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -11250,6 +9173,8 @@ }, "node_modules/dotgitignore/node_modules/p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11261,6 +9186,8 @@ }, "node_modules/dotgitignore/node_modules/path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "license": "MIT", "engines": { @@ -11269,6 +9196,8 @@ }, "node_modules/dreamopt": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/dreamopt/-/dreamopt-0.8.0.tgz", + "integrity": "sha512-vyJTp8+mC+G+5dfgsY+r3ckxlz+QMX40VjPQsZc5gxVAxLmi64TBoVkP54A/pRAXMXsbu2GMMBrZPxNv23waMg==", "dependencies": { "wordwrap": ">=0.0.2" }, @@ -11276,18 +9205,38 @@ "node": ">=0.4.0" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer3": { "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/eastasianwidth": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, "node_modules/ejs": { @@ -11295,6 +9244,7 @@ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -11306,12 +9256,16 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.625", + "version": "1.5.112", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.112.tgz", + "integrity": "sha512-oen93kVyqSb3l+ziUgzIOlWt/oOuy4zRmpwestMn4rhFWAoFJeFuCVte9F2fASjeZZo7l/Cif9TiyrdW4CwEMA==", "dev": true, "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", "engines": { @@ -11323,10 +9277,14 @@ }, "node_modules/emoji-regex": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, "node_modules/empty-dir": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/empty-dir/-/empty-dir-1.0.0.tgz", + "integrity": "sha512-97qcDM6mUA1jAeX6cktw7akc5awIGA+VIkA5MygKOKA+c2Vseo/xwKN0JNJTUhZUtPwZboKVD2p1xu+sV/F4xA==", "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -11334,10 +9292,13 @@ }, "node_modules/enabled": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, "node_modules/encodeurl": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -11345,13 +9306,17 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, "license": "MIT", "dependencies": { @@ -11364,6 +9329,8 @@ }, "node_modules/entities": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz", + "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11375,6 +9342,8 @@ }, "node_modules/error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" @@ -11382,54 +9351,70 @@ }, "node_modules/error-stack-parser": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/es-abstract": { - "version": "1.22.3", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -11438,32 +9423,72 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -11474,10 +9499,14 @@ }, "node_modules/es6-promise": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.1", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -11486,10 +9515,14 @@ }, "node_modules/escape-html": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { "node": ">=0.8.0" @@ -11497,6 +9530,8 @@ }, "node_modules/escodegen": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11517,6 +9552,8 @@ }, "node_modules/escodegen/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11525,6 +9562,8 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "optional": true, @@ -11533,14 +9572,17 @@ } }, "node_modules/eslint": { - "version": "8.56.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -11587,6 +9629,8 @@ }, "node_modules/eslint-config-airbnb-base": { "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", "license": "MIT", "dependencies": { "confusing-browser-globals": "^1.0.10", @@ -11604,6 +9648,8 @@ }, "node_modules/eslint-config-airbnb-base/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11611,6 +9657,8 @@ }, "node_modules/eslint-config-airbnb-typescript": { "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", + "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", "license": "MIT", "dependencies": { "eslint-config-airbnb-base": "^15.0.0" @@ -11624,6 +9672,8 @@ }, "node_modules/eslint-config-prettier": { "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "license": "MIT", "bin": { @@ -11635,6 +9685,8 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "license": "MIT", "dependencies": { "debug": "^3.2.7", @@ -11644,13 +9696,17 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "license": "MIT", "dependencies": { "debug": "^3.2.7" @@ -11666,42 +9722,50 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { - "version": "2.29.1", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -11709,6 +9773,8 @@ }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" @@ -11719,6 +9785,8 @@ }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11726,6 +9794,8 @@ }, "node_modules/eslint-plugin-json": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-3.1.0.tgz", + "integrity": "sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==", "dev": true, "license": "MIT", "dependencies": { @@ -11737,10 +9807,11 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", + "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.9.1" @@ -11768,6 +9839,8 @@ }, "node_modules/eslint-plugin-sonarjs": { "version": "0.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.19.0.tgz", + "integrity": "sha512-6+s5oNk5TFtVlbRxqZN7FIGmjdPCYQKaTzFPmqieCmsU1kBYDzndTeQav0xtQNwZJWu5awWfTGe8Srq9xFOGnw==", "dev": true, "license": "LGPL-3.0", "engines": { @@ -11779,6 +9852,8 @@ }, "node_modules/eslint-plugin-unicorn": { "version": "46.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-46.0.1.tgz", + "integrity": "sha512-setGhMTiLAddg1asdwjZ3hekIN5zLznNa5zll7pBPwFOka6greCKDQydfqy4fqyUhndi74wpDzClSQMEcmOaew==", "dev": true, "license": "MIT", "dependencies": { @@ -11811,6 +9886,8 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -11823,6 +9900,8 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -11834,6 +9913,8 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -11848,6 +9929,8 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -11859,6 +9942,8 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/read-pkg": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "license": "MIT", "dependencies": { @@ -11873,6 +9958,8 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/read-pkg-up": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "license": "MIT", "dependencies": { @@ -11889,6 +9976,8 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -11897,6 +9986,8 @@ }, "node_modules/eslint-plugin-unicorn/node_modules/type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -11905,6 +9996,8 @@ }, "node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -11916,6 +10009,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -11926,6 +10021,8 @@ }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -11940,6 +10037,8 @@ }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -11953,6 +10052,8 @@ }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -11967,6 +10068,8 @@ }, "node_modules/eslint/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -11977,10 +10080,14 @@ }, "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "engines": { "node": ">=10" @@ -11991,6 +10098,8 @@ }, "node_modules/eslint/node_modules/eslint-scope": { "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", @@ -12005,6 +10114,8 @@ }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -12012,6 +10123,8 @@ }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -12019,10 +10132,14 @@ }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "license": "MIT" }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -12033,6 +10150,8 @@ }, "node_modules/espree": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", @@ -12048,6 +10167,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -12058,7 +10179,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" @@ -12069,6 +10192,8 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -12076,6 +10201,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -12086,6 +10213,8 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -12093,6 +10222,8 @@ }, "node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -12100,6 +10231,8 @@ }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -12107,11 +10240,15 @@ }, "node_modules/eventemitter3": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true, "license": "MIT" }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "license": "MIT", "engines": { "node": ">=0.8.x" @@ -12119,6 +10256,8 @@ }, "node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { @@ -12141,13 +10280,26 @@ }, "node_modules/exit": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, "node_modules/expand-tilde": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, "license": "MIT", "dependencies": { @@ -12159,6 +10311,8 @@ }, "node_modules/expect": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", "dependencies": { @@ -12174,6 +10328,8 @@ }, "node_modules/expose-gc": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/expose-gc/-/expose-gc-1.0.0.tgz", + "integrity": "sha512-ecOHrdm+zyOCGIwX18/1RHkUWgxDqGGRiGhaNC+42jReTtudbm2ID/DMa/wpaHwqy5YQHPZvsDqRM2F2iZ0uVA==", "dev": true, "license": "MIT", "engines": { @@ -12182,6 +10338,8 @@ }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "license": "MIT", "dependencies": { @@ -12195,22 +10353,28 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, "license": "Apache-2.0" }, "node_modules/fast-glob": { - "version": "3.3.2", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -12218,6 +10382,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -12228,50 +10394,71 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "license": "MIT" }, "node_modules/fast-printf": { - "version": "1.6.9", + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.10.tgz", + "integrity": "sha512-GwTgG9O4FVIdShhbVF3JxOgSBY2+ePGsu2V/UONgoCPzF9VY6ZdBMKsHKCYQHZwNk3qNouUolRDsgVxcVA5G1w==", "dev": true, "license": "BSD-3-Clause", - "dependencies": { - "boolean": "^3.1.4" - }, "engines": { "node": ">=10.0" } }, "node_modules/fast-safe-stringify": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true, "license": "MIT" }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" + "url": "https://github.com/sponsors/fastify" }, { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" } ], "license": "MIT", "dependencies": { - "strnum": "^1.0.5" + "strnum": "^1.1.1" }, "bin": { "fxparser": "src/cli/cli.js" } }, "node_modules/fastq": { - "version": "1.16.0", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -12279,6 +10466,8 @@ }, "node_modules/fb-watchman": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12287,10 +10476,13 @@ }, "node_modules/fecha": { "version": "4.2.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "node_modules/figures": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "license": "MIT", "dependencies": { @@ -12305,6 +10497,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" @@ -12315,6 +10509,8 @@ }, "node_modules/file-uri-to-path": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "license": "MIT" }, "node_modules/filelist": { @@ -12322,6 +10518,7 @@ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -12331,6 +10528,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -12340,6 +10538,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12349,6 +10548,8 @@ }, "node_modules/filing-cabinet": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-3.3.1.tgz", + "integrity": "sha512-renEK4Hh6DUl9Vl22Y3cxBq1yh8oNvbAdXnhih0wVpmea+uyKjC9K4QeRjUaybIiIewdzfum+Fg15ZqJ/GyCaA==", "dev": true, "license": "MIT", "dependencies": { @@ -12375,11 +10576,15 @@ }, "node_modules/filing-cabinet/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, "node_modules/filing-cabinet/node_modules/typescript": { "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true, "license": "Apache-2.0", "bin": { @@ -12392,6 +10597,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -12402,6 +10609,8 @@ }, "node_modules/find-node-modules": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", + "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", "dev": true, "license": "MIT", "dependencies": { @@ -12411,11 +10620,15 @@ }, "node_modules/find-root": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "dev": true, "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "license": "MIT", "dependencies": { "locate-path": "^6.0.0", @@ -12430,6 +10643,8 @@ }, "node_modules/findit2": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", + "integrity": "sha512-lg/Moejf4qXovVutL0Lz4IsaPoNYMuxt4PA0nGqFxnJ1CTTGGlEO2wKgoDpwknhvZ8k4Q2F+eesgkLbG2Mxfog==", "license": "MIT", "engines": { "node": ">=0.8.22" @@ -12437,6 +10652,8 @@ }, "node_modules/findup-sync": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12451,6 +10668,8 @@ }, "node_modules/flat": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "license": "BSD-3-Clause", "bin": { "flat": "cli.js" @@ -12458,6 +10677,8 @@ }, "node_modules/flat-cache": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "license": "MIT", "dependencies": { "flatted": "^3.2.9", @@ -12469,20 +10690,28 @@ } }, "node_modules/flatted": { - "version": "3.2.9", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "license": "ISC" }, "node_modules/flatten": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", "dev": true, "license": "MIT" }, "node_modules/fn.name": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { - "version": "1.15.6", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -12500,18 +10729,28 @@ } }, "node_modules/for-each": { - "version": "0.3.3", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { - "version": "3.1.1", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -12523,6 +10762,8 @@ }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -12533,11 +10774,14 @@ } }, "node_modules/form-data": { - "version": "4.0.0", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -12546,6 +10790,8 @@ }, "node_modules/formidable": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", + "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", "dev": true, "license": "MIT", "dependencies": { @@ -12560,6 +10806,8 @@ }, "node_modules/fresh": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -12567,6 +10815,8 @@ }, "node_modules/from2": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, "license": "MIT", "dependencies": { @@ -12574,8 +10824,16 @@ "readable-stream": "^2.0.0" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, "node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12590,6 +10848,8 @@ }, "node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "license": "ISC", "dependencies": { "minipass": "^3.0.0" @@ -12600,6 +10860,8 @@ }, "node_modules/fs-minipass/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -12610,39 +10872,37 @@ }, "node_modules/fs-minipass/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { - "version": "1.1.6", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -12653,6 +10913,8 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12660,6 +10922,9 @@ }, "node_modules/gauge": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -12678,6 +10943,8 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -12686,6 +10953,8 @@ }, "node_modules/get-amd-module-type": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-4.1.0.tgz", + "integrity": "sha512-0e/eK6vTGCnSfQ6eYs3wtH05KotJYIP7ZIZEueP/KlA+0dIAEs8bYFvOd/U56w1vfjhJqBagUxVMyy9Tr/cViQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12698,6 +10967,8 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -12705,13 +10976,24 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12719,11 +11001,15 @@ }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true, "license": "ISC" }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "license": "MIT", "engines": { @@ -12732,6 +11018,8 @@ }, "node_modules/get-pkg-repo": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha512-xPCyvcEOxCJDxhBfXDNH+zA7mIRGb2aY1gIUJWsZkpJbp1BLHl+/Sycg26Dv+ZbZAJkO61tzbBtqHUi30NGBvg==", "dev": true, "license": "MIT", "dependencies": { @@ -12747,6 +11035,8 @@ }, "node_modules/get-pkg-repo/node_modules/camelcase": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", "dev": true, "license": "MIT", "engines": { @@ -12755,6 +11045,8 @@ }, "node_modules/get-pkg-repo/node_modules/camelcase-keys": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12767,6 +11059,8 @@ }, "node_modules/get-pkg-repo/node_modules/find-up": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "dev": true, "license": "MIT", "dependencies": { @@ -12779,6 +11073,8 @@ }, "node_modules/get-pkg-repo/node_modules/indent-string": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", "dev": true, "license": "MIT", "dependencies": { @@ -12790,6 +11086,8 @@ }, "node_modules/get-pkg-repo/node_modules/load-json-file": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dev": true, "license": "MIT", "dependencies": { @@ -12805,6 +11103,8 @@ }, "node_modules/get-pkg-repo/node_modules/map-obj": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, "license": "MIT", "engines": { @@ -12813,6 +11113,8 @@ }, "node_modules/get-pkg-repo/node_modules/meow": { "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", "dev": true, "license": "MIT", "dependencies": { @@ -12833,6 +11135,8 @@ }, "node_modules/get-pkg-repo/node_modules/parse-json": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12844,6 +11148,8 @@ }, "node_modules/get-pkg-repo/node_modules/path-exists": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12855,6 +11161,8 @@ }, "node_modules/get-pkg-repo/node_modules/path-type": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dev": true, "license": "MIT", "dependencies": { @@ -12868,6 +11176,8 @@ }, "node_modules/get-pkg-repo/node_modules/read-pkg": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12881,6 +11191,8 @@ }, "node_modules/get-pkg-repo/node_modules/read-pkg-up": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dev": true, "license": "MIT", "dependencies": { @@ -12893,6 +11205,8 @@ }, "node_modules/get-pkg-repo/node_modules/redent": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", "dev": true, "license": "MIT", "dependencies": { @@ -12905,6 +11219,8 @@ }, "node_modules/get-pkg-repo/node_modules/strip-bom": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dev": true, "license": "MIT", "dependencies": { @@ -12916,6 +11232,8 @@ }, "node_modules/get-pkg-repo/node_modules/strip-indent": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", "dev": true, "license": "MIT", "dependencies": { @@ -12928,8 +11246,23 @@ "node": ">=0.10.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stdin": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", "dev": true, "license": "MIT", "engines": { @@ -12938,6 +11271,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", "engines": { @@ -12948,11 +11283,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -12963,6 +11301,8 @@ }, "node_modules/get-value": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", + "integrity": "sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==", "license": "MIT", "dependencies": { "isobject": "^3.0.1" @@ -12973,6 +11313,8 @@ }, "node_modules/gh-got": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-7.1.0.tgz", + "integrity": "sha512-KeWkkhresa7sbpzQLYzITMgez5rMigUsijhmSAHcLDORIMUbdlkdoZyaN1wQvIjmUZnyb/wkAPaXb4MQKX0mdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12985,6 +11327,8 @@ }, "node_modules/git-raw-commits": { "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, "license": "MIT", "dependencies": { @@ -13003,6 +11347,8 @@ }, "node_modules/git-raw-commits/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { @@ -13016,6 +11362,8 @@ }, "node_modules/git-raw-commits/node_modules/through2": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "license": "MIT", "dependencies": { @@ -13024,6 +11372,8 @@ }, "node_modules/git-remote-origin-url": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", "dev": true, "license": "MIT", "dependencies": { @@ -13036,6 +11386,8 @@ }, "node_modules/git-semver-tags": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", + "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", "dev": true, "license": "MIT", "dependencies": { @@ -13051,6 +11403,8 @@ }, "node_modules/git-semver-tags/node_modules/camelcase": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", "dev": true, "license": "MIT", "engines": { @@ -13059,6 +11413,8 @@ }, "node_modules/git-semver-tags/node_modules/camelcase-keys": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -13072,6 +11428,8 @@ }, "node_modules/git-semver-tags/node_modules/indent-string": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", "dev": true, "license": "MIT", "engines": { @@ -13080,6 +11438,8 @@ }, "node_modules/git-semver-tags/node_modules/map-obj": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", "dev": true, "license": "MIT", "engines": { @@ -13088,6 +11448,8 @@ }, "node_modules/git-semver-tags/node_modules/meow": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", "dev": true, "license": "MIT", "dependencies": { @@ -13107,6 +11469,8 @@ }, "node_modules/git-semver-tags/node_modules/minimist-options": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13119,6 +11483,8 @@ }, "node_modules/git-semver-tags/node_modules/quick-lru": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", "dev": true, "license": "MIT", "engines": { @@ -13127,6 +11493,8 @@ }, "node_modules/git-semver-tags/node_modules/redent": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", "dev": true, "license": "MIT", "dependencies": { @@ -13139,6 +11507,8 @@ }, "node_modules/git-semver-tags/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -13147,6 +11517,8 @@ }, "node_modules/git-semver-tags/node_modules/strip-indent": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", "dev": true, "license": "MIT", "engines": { @@ -13155,35 +11527,45 @@ }, "node_modules/gitconfiglocal": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", "dev": true, "license": "BSD", "dependencies": { "ini": "^1.3.2" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, "node_modules/glob": { - "version": "10.3.10", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "license": "ISC", "dependencies": { "is-glob": "^4.0.3" @@ -13194,6 +11576,8 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -13201,7 +11585,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -13216,6 +11602,8 @@ }, "node_modules/global-dirs": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "license": "MIT", "dependencies": { @@ -13227,6 +11615,8 @@ }, "node_modules/global-modules": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "license": "MIT", "dependencies": { @@ -13240,6 +11630,8 @@ }, "node_modules/global-prefix": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, "license": "MIT", "dependencies": { @@ -13255,6 +11647,8 @@ }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "license": "ISC", "dependencies": { @@ -13266,6 +11660,8 @@ }, "node_modules/globals": { "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "license": "MIT", "dependencies": { "type-fest": "^0.20.2" @@ -13278,10 +11674,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -13292,6 +11691,8 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "license": "MIT", "dependencies": { "array-union": "^2.1.0", @@ -13310,6 +11711,8 @@ }, "node_modules/gonzales-pe": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13323,10 +11726,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13334,6 +11739,8 @@ }, "node_modules/got": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", "dev": true, "license": "MIT", "dependencies": { @@ -13361,6 +11768,8 @@ }, "node_modules/got/node_modules/get-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", "dev": true, "license": "MIT", "engines": { @@ -13369,6 +11778,8 @@ }, "node_modules/got/node_modules/pify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", "engines": { @@ -13377,20 +11788,28 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "license": "MIT" }, "node_modules/growly": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", "dev": true, "license": "MIT" }, "node_modules/handlebars": { "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "license": "MIT", "dependencies": { "minimist": "^1.2.5", @@ -13410,6 +11829,8 @@ }, "node_modules/handlebars/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -13417,6 +11838,8 @@ }, "node_modules/hard-rejection": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, "license": "MIT", "engines": { @@ -13424,32 +11847,46 @@ } }, "node_modules/has-bigints": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -13459,6 +11896,8 @@ }, "node_modules/has-symbol-support-x": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", "dev": true, "license": "MIT", "engines": { @@ -13466,7 +11905,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -13477,6 +11918,8 @@ }, "node_modules/has-to-string-tag-x": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", "dev": true, "license": "MIT", "dependencies": { @@ -13487,10 +11930,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -13501,10 +11946,14 @@ }, "node_modules/has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "license": "ISC" }, "node_modules/has-value": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-2.0.2.tgz", + "integrity": "sha512-ybKOlcRsK2MqrM3Hmz/lQxXHZ6ejzSPzpNabKB45jb5qDgJvKPa3SdapTsTLwEb9WltgWpOmNax7i+DzNOk4TA==", "license": "MIT", "dependencies": { "get-value": "^3.0.0", @@ -13516,6 +11965,8 @@ }, "node_modules/has-values": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-2.0.1.tgz", + "integrity": "sha512-+QdH3jOmq9P8GfdjFg0eJudqx1FqU62NQJ4P16rOEHeRdl7ckgwn6uqQjzYE0ZoHVV/e5E2esuJ5Gl5+HUW19w==", "license": "MIT", "dependencies": { "kind-of": "^6.0.2" @@ -13525,7 +11976,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -13536,10 +11989,14 @@ }, "node_modules/heap": { "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", "license": "MIT" }, "node_modules/hexoid": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true, "license": "MIT", "engines": { @@ -13548,6 +12005,8 @@ }, "node_modules/homedir-polyfill": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "license": "MIT", "dependencies": { @@ -13559,15 +12018,21 @@ }, "node_modules/hosted-git-info": { "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "license": "ISC" }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/http-assert": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", "license": "MIT", "dependencies": { "deep-equal": "~1.0.1", @@ -13579,6 +12044,8 @@ }, "node_modules/http-assert/node_modules/depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -13586,6 +12053,8 @@ }, "node_modules/http-assert/node_modules/http-errors": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "license": "MIT", "dependencies": { "depd": "~1.1.2", @@ -13600,6 +12069,8 @@ }, "node_modules/http-assert/node_modules/statuses": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -13607,11 +12078,15 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/http-errors": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -13625,7 +12100,9 @@ } }, "node_modules/http-graceful-shutdown": { - "version": "3.1.13", + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/http-graceful-shutdown/-/http-graceful-shutdown-3.1.14.tgz", + "integrity": "sha512-aTbGAZDUtRt7gRmU+li7rt5WbJeemULZHLNrycJ1dRBU80Giut6NvzG8h5u1TW1zGHXkPGpEtoEKhPKogIRKdA==", "license": "MIT", "dependencies": { "debug": "^4.3.4" @@ -13636,6 +12113,8 @@ }, "node_modules/http-terminator": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/http-terminator/-/http-terminator-3.2.0.tgz", + "integrity": "sha512-JLjck1EzPaWjsmIf8bziM3p9fgR1Y3JoUKAkyYEbZmFrIvJM6I8vVJfBGWlEtV9IWOvzNnaTtjuwZeBY2kwB4g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -13650,6 +12129,8 @@ }, "node_modules/http-terminator/node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -13661,6 +12142,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "dependencies": { "agent-base": "6", @@ -13671,7 +12154,9 @@ } }, "node_modules/human-format": { - "version": "1.2.0", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/human-format/-/human-format-1.2.1.tgz", + "integrity": "sha512-o5Ldz62VWR5lYUZ8aVQaLKiN37NsHnmk3xjMoUjza3mGkk8MvMofgZT0T6HKSCKSJIir+AWk9Dx8KhxvZAUgCg==", "dev": true, "license": "ISC", "engines": { @@ -13680,6 +12165,8 @@ }, "node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -13687,10 +12174,11 @@ } }, "node_modules/husky": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", - "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, + "license": "MIT", "bin": { "husky": "bin.js" }, @@ -13703,6 +12191,8 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -13713,6 +12203,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -13730,14 +12222,18 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.0", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -13752,13 +12248,17 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/import-local": { - "version": "3.1.0", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -13777,6 +12277,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "license": "MIT", "engines": { "node": ">=0.8.19" @@ -13784,6 +12286,8 @@ }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -13792,11 +12296,15 @@ }, "node_modules/indexes-of": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", "dev": true, "license": "MIT" }, "node_modules/inflation": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", + "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -13804,6 +12312,9 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -13812,15 +12323,20 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "dev": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, "node_modules/inquirer": { - "version": "8.2.6", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13838,7 +12354,7 @@ "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6", - "wrap-ansi": "^6.0.1" + "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12.0.0" @@ -13846,6 +12362,8 @@ }, "node_modules/inquirer/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -13860,6 +12378,8 @@ }, "node_modules/inquirer/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -13875,6 +12395,8 @@ }, "node_modules/inquirer/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13886,11 +12408,15 @@ }, "node_modules/inquirer/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/inquirer/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -13899,6 +12425,8 @@ }, "node_modules/inquirer/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -13908,26 +12436,15 @@ "node": ">=8" } }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/internal-slot": { - "version": "1.0.6", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -13935,6 +12452,8 @@ }, "node_modules/into-stream": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13946,7 +12465,9 @@ } }, "node_modules/ioredis": { - "version": "5.3.2", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.5.0.tgz", + "integrity": "sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw==", "license": "MIT", "dependencies": { "@ioredis/commands": "^1.1.1", @@ -13969,6 +12490,8 @@ }, "node_modules/ip-regex": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", "license": "MIT", "engines": { "node": ">=8" @@ -13976,18 +12499,25 @@ }, "node_modules/is": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", "license": "MIT", "engines": { "node": "*" } }, "node_modules/is-array-buffer": { - "version": "3.0.2", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13995,24 +12525,52 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { - "version": "1.0.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14023,6 +12581,9 @@ }, "node_modules/is-buffer": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, "funding": [ { "type": "github", @@ -14044,6 +12605,8 @@ }, "node_modules/is-builtin-module": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "license": "MIT", "dependencies": { @@ -14058,6 +12621,8 @@ }, "node_modules/is-callable": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -14067,20 +12632,45 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { - "version": "1.0.5", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14091,6 +12681,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", "bin": { @@ -14105,13 +12697,32 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-finite": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", "dev": true, "license": "MIT", "engines": { @@ -14123,6 +12734,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "license": "MIT", "engines": { @@ -14134,6 +12747,8 @@ }, "node_modules/is-generator-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", "engines": { @@ -14141,10 +12756,15 @@ } }, "node_modules/is-generator-function": { - "version": "1.0.10", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -14155,6 +12775,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -14165,6 +12787,8 @@ }, "node_modules/is-interactive": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, "license": "MIT", "engines": { @@ -14173,6 +12797,8 @@ }, "node_modules/is-ip": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", "license": "MIT", "dependencies": { "ip-regex": "^4.0.0" @@ -14181,8 +12807,10 @@ "node": ">=8" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -14193,16 +12821,21 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { - "version": "1.0.7", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14213,6 +12846,8 @@ }, "node_modules/is-obj": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, "license": "MIT", "engines": { @@ -14221,6 +12856,8 @@ }, "node_modules/is-object": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true, "license": "MIT", "funding": { @@ -14229,6 +12866,8 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "license": "MIT", "engines": { "node": ">=8" @@ -14236,6 +12875,8 @@ }, "node_modules/is-plain-obj": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, "license": "MIT", "engines": { @@ -14244,6 +12885,8 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "license": "MIT", "dependencies": { "isobject": "^3.0.1" @@ -14254,17 +12897,23 @@ }, "node_modules/is-primitive": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-3.0.1.tgz", + "integrity": "sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-regex": { - "version": "1.1.4", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -14275,6 +12924,8 @@ }, "node_modules/is-regexp": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, "license": "MIT", "engines": { @@ -14283,22 +12934,43 @@ }, "node_modules/is-relative-path": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-relative-path/-/is-relative-path-1.0.2.tgz", + "integrity": "sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA==", "dev": true, "license": "MIT" }, "node_modules/is-retry-allowed": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14306,6 +12978,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "license": "MIT", "engines": { "node": ">=8" @@ -14315,10 +12989,13 @@ } }, "node_modules/is-string": { - "version": "1.0.7", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -14328,10 +13005,14 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -14342,6 +13023,8 @@ }, "node_modules/is-text-path": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, "license": "MIT", "dependencies": { @@ -14352,10 +13035,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -14366,6 +13051,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", "engines": { @@ -14377,11 +13064,15 @@ }, "node_modules/is-url": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", "dev": true, "license": "MIT" }, "node_modules/is-url-superb": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", + "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", "dev": true, "license": "MIT", "engines": { @@ -14393,14 +13084,49 @@ }, "node_modules/is-utf8": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", "dev": true, "license": "MIT" }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { - "version": "1.0.2", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -14408,6 +13134,8 @@ }, "node_modules/is-windows": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", "engines": { @@ -14416,6 +13144,8 @@ }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { @@ -14427,34 +13157,49 @@ }, "node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, "node_modules/iserror": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/iserror/-/iserror-0.0.2.tgz", + "integrity": "sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==", "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/isolated-vm": { - "version": "4.5.0", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/isolated-vm/-/isolated-vm-5.0.3.tgz", + "integrity": "sha512-GNqX0j7dkwdaNQfFogLLb/tSuPZbXtKlk5ldaJ084ngjaW9/bn34x9FQFL856p20KSZoubIIummmiJf+2hzhCw==", "hasInstallScript": true, "license": "ISC", + "dependencies": { + "prebuild-install": "^7.1.2" + }, "engines": { - "node": ">=10.4.0" + "node": ">=18.0.0" } }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -14462,13 +13207,15 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, @@ -14478,6 +13225,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14491,6 +13240,8 @@ }, "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -14499,6 +13250,8 @@ }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -14510,6 +13263,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14523,6 +13278,8 @@ }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -14530,7 +13287,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -14543,6 +13302,8 @@ }, "node_modules/isurl": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", "dev": true, "license": "MIT", "dependencies": { @@ -14554,15 +13315,14 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -14575,6 +13335,7 @@ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -14593,6 +13354,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -14608,6 +13370,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14624,6 +13387,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -14635,13 +13399,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jake/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -14651,6 +13417,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -14660,6 +13427,8 @@ }, "node_modules/jest": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -14685,6 +13454,8 @@ }, "node_modules/jest-changed-files": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", "dependencies": { @@ -14698,6 +13469,8 @@ }, "node_modules/jest-circus": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", "dependencies": { @@ -14728,6 +13501,8 @@ }, "node_modules/jest-circus/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -14742,6 +13517,8 @@ }, "node_modules/jest-circus/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -14757,6 +13534,8 @@ }, "node_modules/jest-circus/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14768,11 +13547,15 @@ }, "node_modules/jest-circus/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-circus/node_modules/dedent": { - "version": "1.5.1", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -14786,6 +13569,8 @@ }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -14794,6 +13579,8 @@ }, "node_modules/jest-circus/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -14805,6 +13592,8 @@ }, "node_modules/jest-cli": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { @@ -14837,6 +13626,8 @@ }, "node_modules/jest-cli/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -14851,6 +13642,8 @@ }, "node_modules/jest-cli/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -14866,6 +13659,8 @@ }, "node_modules/jest-cli/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14877,11 +13672,15 @@ }, "node_modules/jest-cli/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -14890,6 +13689,8 @@ }, "node_modules/jest-cli/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -14901,6 +13702,8 @@ }, "node_modules/jest-config": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14945,6 +13748,8 @@ }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -14959,6 +13764,8 @@ }, "node_modules/jest-config/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -14974,6 +13781,8 @@ }, "node_modules/jest-config/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14985,11 +13794,16 @@ }, "node_modules/jest-config/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-config/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -15009,6 +13823,8 @@ }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -15017,6 +13833,8 @@ }, "node_modules/jest-config/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15028,6 +13846,8 @@ }, "node_modules/jest-diff": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { @@ -15042,6 +13862,8 @@ }, "node_modules/jest-diff/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15056,6 +13878,8 @@ }, "node_modules/jest-diff/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -15071,6 +13895,8 @@ }, "node_modules/jest-diff/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15082,11 +13908,15 @@ }, "node_modules/jest-diff/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -15095,6 +13925,8 @@ }, "node_modules/jest-diff/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15106,6 +13938,8 @@ }, "node_modules/jest-docblock": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", "dependencies": { @@ -15117,6 +13951,8 @@ }, "node_modules/jest-each": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15132,6 +13968,8 @@ }, "node_modules/jest-each/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15146,6 +13984,8 @@ }, "node_modules/jest-each/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -15161,6 +14001,8 @@ }, "node_modules/jest-each/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15172,11 +14014,15 @@ }, "node_modules/jest-each/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -15185,6 +14031,8 @@ }, "node_modules/jest-each/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15196,6 +14044,8 @@ }, "node_modules/jest-environment-node": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", "dependencies": { @@ -15212,6 +14062,8 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", "engines": { @@ -15220,6 +14072,8 @@ }, "node_modules/jest-haste-map": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { @@ -15244,6 +14098,8 @@ }, "node_modules/jest-leak-detector": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", "dependencies": { @@ -15256,6 +14112,8 @@ }, "node_modules/jest-matcher-utils": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", "dependencies": { @@ -15270,6 +14128,8 @@ }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15284,6 +14144,8 @@ }, "node_modules/jest-matcher-utils/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -15299,6 +14161,8 @@ }, "node_modules/jest-matcher-utils/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15310,11 +14174,15 @@ }, "node_modules/jest-matcher-utils/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -15323,6 +14191,8 @@ }, "node_modules/jest-matcher-utils/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15334,6 +14204,8 @@ }, "node_modules/jest-message-util": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", "dependencies": { @@ -15353,6 +14225,8 @@ }, "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15367,6 +14241,8 @@ }, "node_modules/jest-message-util/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -15382,6 +14258,8 @@ }, "node_modules/jest-message-util/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15393,11 +14271,15 @@ }, "node_modules/jest-message-util/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -15406,6 +14288,8 @@ }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15417,6 +14301,8 @@ }, "node_modules/jest-mock": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", "dependencies": { @@ -15430,6 +14316,8 @@ }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", "engines": { @@ -15446,6 +14334,8 @@ }, "node_modules/jest-regex-util": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "license": "MIT", "engines": { @@ -15454,6 +14344,8 @@ }, "node_modules/jest-resolve": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", "dependencies": { @@ -15473,6 +14365,8 @@ }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { @@ -15485,6 +14379,8 @@ }, "node_modules/jest-resolve/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15499,6 +14395,8 @@ }, "node_modules/jest-resolve/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -15514,6 +14412,8 @@ }, "node_modules/jest-resolve/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15525,11 +14425,15 @@ }, "node_modules/jest-resolve/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -15538,6 +14442,8 @@ }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15549,6 +14455,8 @@ }, "node_modules/jest-runner": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15580,6 +14488,8 @@ }, "node_modules/jest-runner/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15594,6 +14504,8 @@ }, "node_modules/jest-runner/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -15609,6 +14521,8 @@ }, "node_modules/jest-runner/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15620,11 +14534,15 @@ }, "node_modules/jest-runner/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -15633,6 +14551,8 @@ }, "node_modules/jest-runner/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15644,6 +14564,8 @@ }, "node_modules/jest-runtime": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15676,6 +14598,8 @@ }, "node_modules/jest-runtime/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15690,6 +14614,8 @@ }, "node_modules/jest-runtime/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -15705,6 +14631,8 @@ }, "node_modules/jest-runtime/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15716,11 +14644,16 @@ }, "node_modules/jest-runtime/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-runtime/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -15740,6 +14673,8 @@ }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -15748,6 +14683,8 @@ }, "node_modules/jest-runtime/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15759,6 +14696,8 @@ }, "node_modules/jest-snapshot": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { @@ -15789,6 +14728,8 @@ }, "node_modules/jest-snapshot/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15803,6 +14744,8 @@ }, "node_modules/jest-snapshot/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -15818,6 +14761,8 @@ }, "node_modules/jest-snapshot/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15829,11 +14774,15 @@ }, "node_modules/jest-snapshot/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -15842,6 +14791,8 @@ }, "node_modules/jest-snapshot/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15853,6 +14804,8 @@ }, "node_modules/jest-sonar": { "version": "0.2.16", + "resolved": "https://registry.npmjs.org/jest-sonar/-/jest-sonar-0.2.16.tgz", + "integrity": "sha512-ES6Z9BbIVDELtbz+/b6pv41B2qOfp38cQpoCLqei21FtlkG/GzhyQ0M3egEIM+erpJOkpRKM8Tc8/YQtHdiTXA==", "dev": true, "license": "MIT", "dependencies": { @@ -15862,6 +14815,8 @@ }, "node_modules/jest-util": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", "dependencies": { @@ -15878,6 +14833,8 @@ }, "node_modules/jest-util/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15892,6 +14849,8 @@ }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -15907,6 +14866,8 @@ }, "node_modules/jest-util/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15918,11 +14879,15 @@ }, "node_modules/jest-util/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -15931,6 +14896,8 @@ }, "node_modules/jest-util/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -15942,6 +14909,8 @@ }, "node_modules/jest-validate": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", "dependencies": { @@ -15958,6 +14927,8 @@ }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -15972,6 +14943,8 @@ }, "node_modules/jest-validate/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -15987,6 +14960,8 @@ }, "node_modules/jest-validate/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15998,11 +14973,15 @@ }, "node_modules/jest-validate/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -16011,6 +14990,8 @@ }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -16022,6 +15003,8 @@ }, "node_modules/jest-watcher": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { @@ -16040,6 +15023,8 @@ }, "node_modules/jest-watcher/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -16054,6 +15039,8 @@ }, "node_modules/jest-watcher/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -16069,6 +15056,8 @@ }, "node_modules/jest-watcher/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16080,11 +15069,15 @@ }, "node_modules/jest-watcher/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -16093,6 +15086,8 @@ }, "node_modules/jest-watcher/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -16103,7 +15098,9 @@ } }, "node_modules/jest-when": { - "version": "3.6.0", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jest-when/-/jest-when-3.7.0.tgz", + "integrity": "sha512-aLbiyxmtksijcrKFir7n+t+XPbqSLV01eDkRyX28WM4VgA/iSc3mG8R8O2evDtOAa6SefrJiTIt/rTqqyrwVZg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -16112,6 +15109,8 @@ }, "node_modules/jest-worker": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { @@ -16126,6 +15125,8 @@ }, "node_modules/jest-worker/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -16134,6 +15135,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -16146,25 +15149,22 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jiti": { - "version": "1.21.0", - "dev": true, - "license": "MIT", - "optional": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, "node_modules/js-sha1": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/js-sha1/-/js-sha1-0.6.0.tgz", + "integrity": "sha512-01gwBFreYydzmU9BmZxpVk6svJJHrVxEN3IOiGl6VO93bVKYETJ0sIth6DASI6mIFdt7NmfX9UiByRzsYHGU9w==", "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -16174,7 +15174,9 @@ } }, "node_modules/jsesc": { - "version": "3.0.2", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { @@ -16186,10 +15188,14 @@ }, "node_modules/json-buffer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "license": "MIT" }, "node_modules/json-diff": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/json-diff/-/json-diff-1.0.6.tgz", + "integrity": "sha512-tcFIPRdlc35YkYdGxcamJjllUhXWv4n2rK9oJ2RsAzV4FBkuV4ojKEDgcZ+kpKxDmJKv+PFK65+1tVVOnSeEqA==", "license": "MIT", "dependencies": { "@ewoudenberg/difflib": "0.1.0", @@ -16205,19 +15211,27 @@ }, "node_modules/json-parse-better-errors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json-size": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-size/-/json-size-1.0.0.tgz", + "integrity": "sha512-sh8Ff4sNVI3FU1LjFXiNpcG9Er9bsn8WbeR79mGj4Ljd+/NBmxqYCV1sPzndUTGsWXa3LVUx3aLlZxpq1DzCBA==", "license": "MIT", "dependencies": { "utf8-length": "0.0.1" @@ -16225,15 +15239,21 @@ }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -16244,19 +15264,25 @@ } }, "node_modules/jsonata": { - "version": "2.0.5", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-2.0.6.tgz", + "integrity": "sha512-WhQB5tXQ32qjkx2GYHFw2XbL90u+LLzjofAYwi+86g6SyZeXHz9F1Q0amy3dWRYczshOC3Haok9J4pOCgHtwyQ==", "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/jsonc-parser": { - "version": "3.2.0", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, "license": "MIT" }, "node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16268,14 +15294,26 @@ }, "node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" ], "license": "MIT" }, + "node_modules/jsonschema": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", + "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", + "engines": { + "node": "*" + } + }, "node_modules/JSONStream": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "license": "(MIT OR Apache-2.0)", "dependencies": { @@ -16291,17 +15329,17 @@ }, "node_modules/jsontoxml": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jsontoxml/-/jsontoxml-1.0.1.tgz", + "integrity": "sha512-dtKGq0K8EWQBRqcAaePSgKR4Hyjfsz/LkurHSV3Cxk4H+h2fWDeaN2jzABz+ZmOJylgXS7FGeWmbZ6jgYUMdJQ==", "license": "MIT", "engines": { "node": ">=0.2.0" } }, - "node_modules/jstoxml": { - "version": "5.0.2", - "license": "MIT" - }, "node_modules/keygrip": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "license": "MIT", "dependencies": { "tsscmp": "1.0.6" @@ -16312,6 +15350,8 @@ }, "node_modules/keyv": { "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "license": "MIT", "dependencies": { "json-buffer": "3.0.1" @@ -16319,6 +15359,8 @@ }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -16326,6 +15368,8 @@ }, "node_modules/kleur": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "license": "MIT", "engines": { @@ -16333,9 +15377,10 @@ } }, "node_modules/koa": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.15.3.tgz", - "integrity": "sha512-j/8tY9j5t+GVMLeioLaxweJiKUayFhlGqNTzf2ZGwL0ZCQijd2RLHK0SLW5Tsko8YyyqCZC2cojIb0/s62qTAg==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.0.tgz", + "integrity": "sha512-Afhqq0Vq3W7C+/rW6IqHVBDLzqObwZ07JaUNUEF8yCQ6afiyFE3RAy+i7V0E46XOWlH7vPWn/x0vsZwNy6PWxw==", + "license": "MIT", "dependencies": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -16367,6 +15412,8 @@ }, "node_modules/koa-bodyparser": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz", + "integrity": "sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==", "license": "MIT", "dependencies": { "co-body": "^6.0.0", @@ -16379,10 +15426,14 @@ }, "node_modules/koa-compose": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", "license": "MIT" }, "node_modules/koa-convert": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "license": "MIT", "dependencies": { "co": "^4.6.0", @@ -16394,6 +15445,8 @@ }, "node_modules/koa/node_modules/http-errors": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "license": "MIT", "dependencies": { "depd": "~1.1.2", @@ -16408,6 +15461,8 @@ }, "node_modules/koa/node_modules/http-errors/node_modules/depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -16415,13 +15470,17 @@ }, "node_modules/koa/node_modules/statuses": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/koa2-swagger-ui": { - "version": "5.10.0", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/koa2-swagger-ui/-/koa2-swagger-ui-5.11.0.tgz", + "integrity": "sha512-EjmeK07RHjb+xje1fLVhQa66NWPrba9gZN/DDHo3Nc98raJ+dVxqrQADIHkZb3GAkdNdrrczb8x7n9euevxuJw==", "license": "MIT", "dependencies": { "handlebars": "^4.7.8", @@ -16434,6 +15493,8 @@ }, "node_modules/koa2-swagger-ui/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -16445,6 +15506,8 @@ }, "node_modules/koa2-swagger-ui/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -16455,6 +15518,8 @@ }, "node_modules/koa2-swagger-ui/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -16468,6 +15533,8 @@ }, "node_modules/koa2-swagger-ui/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -16478,6 +15545,8 @@ }, "node_modules/koa2-swagger-ui/node_modules/read-pkg": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", @@ -16491,6 +15560,8 @@ }, "node_modules/koa2-swagger-ui/node_modules/read-pkg-up": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "license": "MIT", "dependencies": { "find-up": "^4.1.0", @@ -16506,6 +15577,8 @@ }, "node_modules/koa2-swagger-ui/node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" @@ -16513,6 +15586,8 @@ }, "node_modules/koa2-swagger-ui/node_modules/type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" @@ -16520,10 +15595,13 @@ }, "node_modules/kuler": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, "node_modules/lazy-ass": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", "dev": true, "license": "MIT", "engines": { @@ -16532,6 +15610,8 @@ }, "node_modules/leven": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", "engines": { @@ -16540,6 +15620,8 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", @@ -16550,12 +15632,15 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.11.12", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.11.12.tgz", - "integrity": "sha512-QkJn9/D7zZ1ucvT++TQSvZuSA2xAWeUytU+DiEQwbPKLyrDpvbul2AFs1CGbRAPpSCCk47aRAb5DX5mmcayp4g==" + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.4.tgz", + "integrity": "sha512-vLmhg7Gan7idyAKfc6pvCtNzvar4/eIzrVVk3hjNFH5+fGqyjD0gQRovdTrDl20wsmZhBtmZpcsR0tOfquwb8g==", + "license": "MIT" }, "node_modules/lilconfig": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "license": "MIT", "engines": { @@ -16564,10 +15649,14 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, "node_modules/lint-staged": { "version": "13.3.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.3.0.tgz", + "integrity": "sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16594,6 +15683,8 @@ }, "node_modules/lint-staged/node_modules/chalk": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "license": "MIT", "engines": { @@ -16605,14 +15696,36 @@ }, "node_modules/lint-staged/node_modules/commander": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", "dev": true, "license": "MIT", "engines": { "node": ">=16" } }, + "node_modules/lint-staged/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/lint-staged/node_modules/execa": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, "license": "MIT", "dependencies": { @@ -16635,6 +15748,8 @@ }, "node_modules/lint-staged/node_modules/human-signals": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -16643,6 +15758,8 @@ }, "node_modules/lint-staged/node_modules/is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { @@ -16652,8 +15769,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lint-staged/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/lint-staged/node_modules/mimic-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "license": "MIT", "engines": { @@ -16663,8 +15796,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lint-staged/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.2.0", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16679,6 +15821,8 @@ }, "node_modules/lint-staged/node_modules/onetime": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16693,6 +15837,8 @@ }, "node_modules/lint-staged/node_modules/path-key": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", "engines": { @@ -16704,6 +15850,8 @@ }, "node_modules/lint-staged/node_modules/strip-final-newline": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", "engines": { @@ -16715,6 +15863,8 @@ }, "node_modules/lint-staged/node_modules/yaml": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", "dev": true, "license": "ISC", "engines": { @@ -16723,6 +15873,8 @@ }, "node_modules/listr2": { "version": "6.6.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-6.6.1.tgz", + "integrity": "sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==", "dev": true, "license": "MIT", "dependencies": { @@ -16746,7 +15898,9 @@ } }, "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -16758,6 +15912,8 @@ }, "node_modules/listr2/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -16769,16 +15925,22 @@ }, "node_modules/listr2/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/listr2/node_modules/eventemitter3": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, "license": "MIT" }, "node_modules/listr2/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -16795,6 +15957,8 @@ }, "node_modules/listr2/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16809,6 +15973,8 @@ }, "node_modules/listr2/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16825,6 +15991,8 @@ }, "node_modules/load-json-file": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "license": "MIT", "dependencies": { @@ -16839,6 +16007,8 @@ }, "node_modules/load-json-file/node_modules/parse-json": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", "dependencies": { @@ -16851,6 +16021,8 @@ }, "node_modules/load-json-file/node_modules/pify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", "engines": { @@ -16859,6 +16031,8 @@ }, "node_modules/load-json-file/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -16867,6 +16041,8 @@ }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", "dependencies": { "p-locate": "^5.0.0" @@ -16880,81 +16056,116 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash._reinterpolate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", "dev": true, "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true, "license": "MIT" }, "node_modules/lodash.defaults": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", "license": "MIT" }, "node_modules/lodash.isarguments": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", "license": "MIT" }, "node_modules/lodash.isfunction": { "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", "dev": true, "license": "MIT" }, "node_modules/lodash.ismatch": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true, "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true, "license": "MIT" }, "node_modules/lodash.kebabcase": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", "dev": true, "license": "MIT" }, "node_modules/lodash.map": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", "dev": true, "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, "node_modules/lodash.mergewith": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.snakecase": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", "dev": true, "license": "MIT" }, "node_modules/lodash.sortby": { "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "license": "MIT" }, "node_modules/lodash.startcase": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true, "license": "MIT" }, "node_modules/lodash.template": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", "dev": true, "license": "MIT", "dependencies": { @@ -16964,6 +16175,8 @@ }, "node_modules/lodash.templatesettings": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16972,15 +16185,21 @@ }, "node_modules/lodash.uniq": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "license": "MIT" }, "node_modules/lodash.upperfirst": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", "dev": true, "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { @@ -16996,6 +16215,8 @@ }, "node_modules/log-symbols/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -17010,6 +16231,8 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -17025,6 +16248,8 @@ }, "node_modules/log-symbols/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17036,11 +16261,15 @@ }, "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -17049,6 +16278,8 @@ }, "node_modules/log-symbols/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -17060,6 +16291,8 @@ }, "node_modules/log-update": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "license": "MIT", "dependencies": { @@ -17078,6 +16311,8 @@ }, "node_modules/log-update/node_modules/ansi-escapes": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", "dev": true, "license": "MIT", "dependencies": { @@ -17091,7 +16326,9 @@ } }, "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.0.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -17103,6 +16340,8 @@ }, "node_modules/log-update/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -17114,6 +16353,8 @@ }, "node_modules/log-update/node_modules/cli-cursor": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "license": "MIT", "dependencies": { @@ -17128,11 +16369,15 @@ }, "node_modules/log-update/node_modules/emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, "node_modules/log-update/node_modules/restore-cursor": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "license": "MIT", "dependencies": { @@ -17148,6 +16393,8 @@ }, "node_modules/log-update/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { @@ -17164,6 +16411,8 @@ }, "node_modules/log-update/node_modules/strip-ansi": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17178,6 +16427,8 @@ }, "node_modules/log-update/node_modules/type-fest": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -17189,6 +16440,8 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17204,8 +16457,9 @@ } }, "node_modules/logform": { - "version": "2.6.0", - "license": "MIT", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "dependencies": { "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", @@ -17219,11 +16473,15 @@ } }, "node_modules/long": { - "version": "5.2.3", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", + "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", "license": "Apache-2.0" }, "node_modules/longest": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", + "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", "dev": true, "license": "MIT", "engines": { @@ -17232,6 +16490,8 @@ }, "node_modules/loud-rejection": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17243,7 +16503,9 @@ } }, "node_modules/lowercase-keys": { - "version": "1.0.1", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==", "dev": true, "license": "MIT", "engines": { @@ -17252,6 +16514,8 @@ }, "node_modules/lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { @@ -17260,6 +16524,8 @@ }, "node_modules/madge": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/madge/-/madge-6.1.0.tgz", + "integrity": "sha512-irWhT5RpFOc6lkzGHKLihonCVgM0YtfNUh4IrFeW3EqHpnt/JHUG3z26j8PeJEktCGB4tmGOOOJi1Rl/ACWucQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17307,6 +16573,8 @@ }, "node_modules/madge/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -17321,6 +16589,8 @@ }, "node_modules/madge/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -17336,6 +16606,8 @@ }, "node_modules/madge/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17347,11 +16619,15 @@ }, "node_modules/madge/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/madge/node_modules/commander": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", "engines": { @@ -17360,6 +16636,8 @@ }, "node_modules/madge/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -17368,6 +16646,8 @@ }, "node_modules/madge/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -17379,6 +16659,8 @@ }, "node_modules/make-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { @@ -17393,11 +16675,15 @@ }, "node_modules/make-error": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, "license": "ISC" }, "node_modules/makeerror": { "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -17406,6 +16692,8 @@ }, "node_modules/map-obj": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, "license": "MIT", "engines": { @@ -17417,10 +16705,23 @@ }, "node_modules/match-json": { "version": "1.3.7", + "resolved": "https://registry.npmjs.org/match-json/-/match-json-1.3.7.tgz", + "integrity": "sha512-2/GIaio/oVWVHGdKOIbqfgqT5vH91K3c91l6EAsVydMAjB0iGy5PVABicKzNT1VAgHskZHbaZK9q96AmgTEqkw==", "license": "MIT" }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "license": "BSD-3-Clause", "dependencies": { "charenc": "0.0.2", @@ -17430,10 +16731,14 @@ }, "node_modules/md5/node_modules/is-buffer": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "license": "MIT" }, "node_modules/media-typer": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -17441,6 +16746,8 @@ }, "node_modules/meow": { "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -17465,6 +16772,8 @@ }, "node_modules/meow/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -17477,6 +16786,8 @@ }, "node_modules/meow/node_modules/hosted-git-info": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "license": "ISC", "dependencies": { @@ -17488,6 +16799,8 @@ }, "node_modules/meow/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -17499,6 +16812,8 @@ }, "node_modules/meow/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "license": "ISC", "dependencies": { @@ -17510,6 +16825,8 @@ }, "node_modules/meow/node_modules/normalize-package-data": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -17524,6 +16841,8 @@ }, "node_modules/meow/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -17538,6 +16857,8 @@ }, "node_modules/meow/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -17549,6 +16870,8 @@ }, "node_modules/meow/node_modules/read-pkg": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "license": "MIT", "dependencies": { @@ -17563,6 +16886,8 @@ }, "node_modules/meow/node_modules/read-pkg-up": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "license": "MIT", "dependencies": { @@ -17579,6 +16904,8 @@ }, "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -17587,11 +16914,15 @@ }, "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, "license": "ISC" }, "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -17603,6 +16934,8 @@ }, "node_modules/meow/node_modules/read-pkg/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -17611,6 +16944,8 @@ }, "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -17619,6 +16954,8 @@ }, "node_modules/meow/node_modules/type-fest": { "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -17630,16 +16967,22 @@ }, "node_modules/meow/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/merge": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", + "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", "dev": true, "license": "MIT" }, "node_modules/merge-descriptors": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -17647,11 +16990,15 @@ }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", "engines": { "node": ">= 8" @@ -17659,16 +17006,20 @@ }, "node_modules/methods": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { - "version": "4.0.5", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -17676,18 +17027,21 @@ } }, "node_modules/mime": { - "version": "2.6.0", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, "node_modules/mime-db": { "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -17695,6 +17049,8 @@ }, "node_modules/mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -17705,6 +17061,8 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { @@ -17713,6 +17071,8 @@ }, "node_modules/mimic-response": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true, "license": "MIT", "engines": { @@ -17721,6 +17081,8 @@ }, "node_modules/min-indent": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, "license": "MIT", "engines": { @@ -17729,6 +17091,8 @@ }, "node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -17739,6 +17103,8 @@ }, "node_modules/minimist": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17746,6 +17112,8 @@ }, "node_modules/minimist-options": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "license": "MIT", "dependencies": { @@ -17758,7 +17126,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "license": "ISC", "engines": { @@ -17767,6 +17137,8 @@ }, "node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "license": "MIT", "dependencies": { "minipass": "^3.0.0", @@ -17778,6 +17150,8 @@ }, "node_modules/minizlib/node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "license": "ISC", "dependencies": { "yallist": "^4.0.0" @@ -17788,10 +17162,14 @@ }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -17800,8 +17178,16 @@ "node": ">=10" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, "node_modules/mocked-env": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/mocked-env/-/mocked-env-1.3.5.tgz", + "integrity": "sha512-GyYY6ynVOdEoRlaGpaq8UYwdWkvrsU2xRme9B+WPSuJcNjh17+3QIxSYU6zwee0SbehhV6f06VZ4ahjG+9zdrA==", "dev": true, "license": "MIT", "dependencies": { @@ -17816,6 +17202,8 @@ }, "node_modules/mocked-env/node_modules/debug": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "license": "MIT", "dependencies": { @@ -17830,8 +17218,17 @@ } } }, + "node_modules/mocked-env/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, "node_modules/modclean": { "version": "3.0.0-beta.1", + "resolved": "https://registry.npmjs.org/modclean/-/modclean-3.0.0-beta.1.tgz", + "integrity": "sha512-NyJpuqXMUI190sZePU+dBcwlGaqhfFC+UL5WyNSxmNLOHATg9cVSgRpbY+mUbwUj7t5trb4vYscgXArKevYsdA==", "license": "MIT", "dependencies": { "await-handler": "^1.1.0", @@ -17856,10 +17253,13 @@ "node_modules/modclean-patterns-default": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/modclean-patterns-default/-/modclean-patterns-default-1.1.2.tgz", - "integrity": "sha512-h2+ES3SKl+JOtfptJjwJz5fdogFI0byYssw3lXoESNkOcXCnjCvvW6IbMagAKFmfWOx+n9esyomxWP1w4edZjg==" + "integrity": "sha512-h2+ES3SKl+JOtfptJjwJz5fdogFI0byYssw3lXoESNkOcXCnjCvvW6IbMagAKFmfWOx+n9esyomxWP1w4edZjg==", + "license": "MIT" }, "node_modules/modclean/node_modules/ansi-regex": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "license": "MIT", "engines": { "node": ">=4" @@ -17867,6 +17267,8 @@ }, "node_modules/modclean/node_modules/cli-cursor": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "license": "MIT", "dependencies": { "restore-cursor": "^2.0.0" @@ -17877,6 +17279,8 @@ }, "node_modules/modclean/node_modules/cli-spinners": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", "license": "MIT", "engines": { "node": ">=4" @@ -17884,10 +17288,15 @@ }, "node_modules/modclean/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, "node_modules/modclean/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -17906,6 +17315,8 @@ }, "node_modules/modclean/node_modules/log-symbols": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "license": "MIT", "dependencies": { "chalk": "^2.0.1" @@ -17916,6 +17327,8 @@ }, "node_modules/modclean/node_modules/mimic-fn": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "license": "MIT", "engines": { "node": ">=4" @@ -17923,6 +17336,8 @@ }, "node_modules/modclean/node_modules/onetime": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", "license": "MIT", "dependencies": { "mimic-fn": "^1.0.0" @@ -17933,6 +17348,8 @@ }, "node_modules/modclean/node_modules/ora": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz", + "integrity": "sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==", "license": "MIT", "dependencies": { "chalk": "^2.3.1", @@ -17948,6 +17365,8 @@ }, "node_modules/modclean/node_modules/restore-cursor": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", "license": "MIT", "dependencies": { "onetime": "^2.0.0", @@ -17959,6 +17378,9 @@ }, "node_modules/modclean/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -17969,6 +17391,8 @@ }, "node_modules/modclean/node_modules/strip-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" @@ -17979,6 +17403,8 @@ }, "node_modules/modify-values": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true, "license": "MIT", "engines": { @@ -17987,6 +17413,8 @@ }, "node_modules/module-definition": { "version": "3.4.0", + "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-3.4.0.tgz", + "integrity": "sha512-XxJ88R1v458pifaSkPNLUTdSPNVGMP2SXVncVmApGO+gAfrLANiYe6JofymCzVceGOMwQE2xogxBSc8uB7XegA==", "dev": true, "license": "MIT", "dependencies": { @@ -18002,6 +17430,8 @@ }, "node_modules/module-definition/node_modules/ast-module-types": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", + "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", "dev": true, "license": "MIT", "engines": { @@ -18010,6 +17440,8 @@ }, "node_modules/module-definition/node_modules/node-source-walk": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", + "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", "dev": true, "license": "MIT", "dependencies": { @@ -18021,6 +17453,8 @@ }, "node_modules/module-lookup-amd": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-7.0.1.tgz", + "integrity": "sha512-w9mCNlj0S8qviuHzpakaLVc+/7q50jl9a/kmJ/n8bmXQZgDPkQHnPBb8MUOYh3WpAYkXuNc2c+khsozhIp/amQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18039,11 +17473,16 @@ }, "node_modules/module-lookup-amd/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, "node_modules/module-lookup-amd/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -18063,13 +17502,17 @@ }, "node_modules/moment": { "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "license": "MIT", "engines": { "node": "*" } }, "node_modules/moment-timezone": { - "version": "0.5.44", + "version": "0.5.47", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.47.tgz", + "integrity": "sha512-UbNt/JAWS0m/NJOebR0QMRHBk0hu03r5dx9GK8Cs0AS3I81yDcOc9k+DytPItgVvBP7J6Mf6U2n3BPAacAV9oA==", "license": "MIT", "dependencies": { "moment": "^2.29.4" @@ -18079,20 +17522,28 @@ } }, "node_modules/ms": { - "version": "2.1.2", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/mute-stream": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true, "license": "ISC" }, "node_modules/nan": { - "version": "2.19.0", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", + "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -18108,16 +17559,28 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "license": "MIT" }, "node_modules/natural-compare-lite": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -18125,10 +17588,26 @@ }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "license": "MIT" }, + "node_modules/node-abi": { + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-cache": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", "license": "MIT", "dependencies": { "clone": "2.x" @@ -18139,6 +17618,8 @@ }, "node_modules/node-fetch": { "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -18157,6 +17638,8 @@ }, "node_modules/node-gyp-build": { "version": "3.9.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.9.0.tgz", + "integrity": "sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A==", "license": "MIT", "bin": { "node-gyp-build": "bin.js", @@ -18166,15 +17649,17 @@ }, "node_modules/node-int64": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true, "license": "MIT" }, "node_modules/node-mocks-http": { - "version": "1.14.1", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/node-mocks-http/-/node-mocks-http-1.16.2.tgz", + "integrity": "sha512-2Sh6YItRp1oqewZNlck3LaFp5vbyW2u51HX2p1VLxQ9U/bG90XV8JY9O7Nk+HDd6OOn/oV3nA5Tx5k4Rki0qlg==", "license": "MIT", "dependencies": { - "@types/express": "^4.17.21", - "@types/node": "^20.10.6", "accepts": "^1.3.7", "content-disposition": "^0.5.3", "depd": "^1.1.0", @@ -18188,27 +17673,33 @@ }, "engines": { "node": ">=14" + }, + "peerDependencies": { + "@types/express": "^4.17.21 || ^5.0.0", + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + }, + "@types/node": { + "optional": true + } } }, "node_modules/node-mocks-http/node_modules/depd": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/node-mocks-http/node_modules/mime": { - "version": "1.6.0", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/node-notifier": { "version": "10.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-10.0.1.tgz", + "integrity": "sha512-YX7TSyDukOZ0g+gmzjB6abKu+hTGvO8+8+gIFDsRCU2t8fLV/P2unmt+LGFaIa4y64aX98Qksa97rgz4vMNeLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18222,6 +17713,8 @@ }, "node_modules/node-notifier/node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", "bin": { @@ -18229,12 +17722,16 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, "node_modules/node-source-walk": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-5.0.2.tgz", + "integrity": "sha512-Y4jr/8SRS5hzEdZ7SGuvZGwfORvNsSsNRwDXx5WisiqzsVfeftDvRgfeqWNgZvWSJbgubTRVRYBzK6UO+ErqjA==", "dev": true, "license": "MIT", "dependencies": { @@ -18246,6 +17743,8 @@ }, "node_modules/nopt": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "license": "ISC", "dependencies": { "abbrev": "1" @@ -18259,6 +17758,8 @@ }, "node_modules/normalize-package-data": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", @@ -18269,6 +17770,8 @@ }, "node_modules/normalize-package-data/node_modules/semver": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "license": "ISC", "bin": { "semver": "bin/semver" @@ -18276,6 +17779,8 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -18284,6 +17789,8 @@ }, "node_modules/normalize-url": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "dev": true, "license": "MIT", "dependencies": { @@ -18297,6 +17804,8 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { @@ -18308,6 +17817,9 @@ }, "node_modules/npmlog": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", "license": "ISC", "dependencies": { "are-we-there-yet": "^2.0.0", @@ -18318,6 +17830,8 @@ }, "node_modules/number-is-nan": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, "license": "MIT", "engines": { @@ -18326,10 +17840,14 @@ }, "node_modules/oauth-1.0a": { "version": "2.2.6", + "resolved": "https://registry.npmjs.org/oauth-1.0a/-/oauth-1.0a-2.2.6.tgz", + "integrity": "sha512-6bkxv3N4Gu5lty4viIcIAnq5GbxECviMBeKR3WX/q87SPQ8E8aursPZUtsXDnxCs787af09WPRBLqYrf/lwoYQ==", "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -18337,27 +17855,38 @@ }, "node_modules/object-hash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { - "version": "1.13.1", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object-sizeof": { - "version": "2.6.4", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/object-sizeof/-/object-sizeof-2.6.5.tgz", + "integrity": "sha512-Mu3udRqIsKpneKjIEJ2U/s1KmEgpl+N6cEX1o+dDl2aZ+VW5piHqNgomqAk5YMsDoSkpcA8HnIKx1eqGTKzdfw==", "license": "MIT", "dependencies": { "buffer": "^6.0.3" @@ -18365,6 +17894,8 @@ }, "node_modules/object-sizeof/node_modules/buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -18386,12 +17917,16 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -18402,24 +17937,29 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -18429,22 +17969,29 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.7", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -18455,6 +18002,8 @@ }, "node_modules/on-finished": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -18465,6 +18014,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -18472,13 +18023,16 @@ }, "node_modules/one-time": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "dependencies": { "fn.name": "1.x.x" } }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { @@ -18492,24 +18046,30 @@ } }, "node_modules/only": { - "version": "0.0.2" + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" }, "node_modules/openapi-types": { "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", "dev": true, "license": "MIT", "peer": true }, "node_modules/optionator": { - "version": "0.9.3", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -18517,6 +18077,8 @@ }, "node_modules/ora": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18539,6 +18101,8 @@ }, "node_modules/ora/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -18553,6 +18117,8 @@ }, "node_modules/ora/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -18568,6 +18134,8 @@ }, "node_modules/ora/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18579,11 +18147,15 @@ }, "node_modules/ora/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/ora/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -18592,6 +18164,8 @@ }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -18603,14 +18177,35 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-cancelable": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", "dev": true, "license": "MIT", "engines": { @@ -18619,6 +18214,8 @@ }, "node_modules/p-finally": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, "license": "MIT", "engines": { @@ -18627,6 +18224,8 @@ }, "node_modules/p-is-promise": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==", "dev": true, "license": "MIT", "engines": { @@ -18635,6 +18234,8 @@ }, "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" @@ -18648,6 +18249,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", "dependencies": { "p-limit": "^3.0.2" @@ -18661,6 +18264,8 @@ }, "node_modules/p-timeout": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", "dev": true, "license": "MIT", "dependencies": { @@ -18672,6 +18277,8 @@ }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "license": "MIT", "engines": { "node": ">=6" @@ -18679,6 +18286,8 @@ }, "node_modules/p-wait-for": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-3.2.0.tgz", + "integrity": "sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==", "dev": true, "license": "MIT", "dependencies": { @@ -18693,6 +18302,8 @@ }, "node_modules/p-wait-for/node_modules/p-timeout": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dev": true, "license": "MIT", "dependencies": { @@ -18702,8 +18313,17 @@ "node": ">=8" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -18714,11 +18334,15 @@ }, "node_modules/parse-github-repo-url": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha512-bSWyzBKqcSL4RrncTpGsEKoJ7H8a4L3++ifTAbTFeMHyq2wRV+42DGmQcHIrJIvdcacjIOxEuKH/w4tthF17gg==", "dev": true, "license": "MIT" }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -18735,6 +18359,8 @@ }, "node_modules/parse-ms": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", "dev": true, "license": "MIT", "engines": { @@ -18743,6 +18369,8 @@ }, "node_modules/parse-passwd": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, "license": "MIT", "engines": { @@ -18751,10 +18379,14 @@ }, "node_modules/parse-static-imports": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parse-static-imports/-/parse-static-imports-1.1.0.tgz", + "integrity": "sha512-HlxrZcISCblEV0lzXmAHheH/8qEkKgmqkdxyHTPbSqsTUV8GzqmN1L+SSti+VbNPfbBO3bYLPHDiUs2avbAdbA==", "license": "MIT" }, "node_modules/parseurl": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -18762,6 +18394,8 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "license": "MIT", "engines": { "node": ">=8" @@ -18769,6 +18403,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -18776,6 +18412,8 @@ }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "license": "MIT", "engines": { "node": ">=8" @@ -18783,30 +18421,33 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.10.1", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "license": "ISC" }, "node_modules/path-to-regexp": { "version": "6.3.0", @@ -18816,18 +18457,23 @@ }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/picocolors": { - "version": "1.0.0", - "dev": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -18838,6 +18484,8 @@ }, "node_modules/pidtree": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, "license": "MIT", "bin": { @@ -18849,6 +18497,8 @@ }, "node_modules/pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "license": "MIT", "engines": { @@ -18857,6 +18507,8 @@ }, "node_modules/pinkie": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, "license": "MIT", "engines": { @@ -18865,6 +18517,8 @@ }, "node_modules/pinkie-promise": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "license": "MIT", "dependencies": { @@ -18876,6 +18530,8 @@ }, "node_modules/pirates": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "license": "MIT", "engines": { @@ -18884,6 +18540,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18895,6 +18553,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -18907,6 +18567,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -18918,6 +18580,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -18932,6 +18596,8 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -18943,14 +18609,27 @@ }, "node_modules/pluralize": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.33", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "dev": true, "funding": [ { @@ -18968,9 +18647,9 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -18978,6 +18657,8 @@ }, "node_modules/postcss-values-parser": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz", + "integrity": "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -18994,11 +18675,15 @@ }, "node_modules/postcss-values-parser/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/pprof": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pprof/-/pprof-4.0.0.tgz", + "integrity": "sha512-Yhfk7Y0G1MYsy97oXxmSG5nvbM1sCz9EALiNhW/isAv5Xf7svzP+1RfGeBlS6mLSgRJvgSLh6Mi5DaisQuPttw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -19017,11 +18702,15 @@ } }, "node_modules/pprof-format": { - "version": "2.0.7", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pprof-format/-/pprof-format-2.1.0.tgz", + "integrity": "sha512-0+G5bHH0RNr8E5hoZo/zJYsL92MhkZjwrHp3O2IxmY8RJL9ooKeuZ8Tm0ZNBw5sGZ9TiM71sthTjWoR2Vf5/xw==", "license": "MIT" }, "node_modules/pprof/node_modules/source-map": { "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "license": "BSD-3-Clause", "dependencies": { "whatwg-url": "^7.0.0" @@ -19032,6 +18721,8 @@ }, "node_modules/pprof/node_modules/tr46": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "license": "MIT", "dependencies": { "punycode": "^2.1.0" @@ -19039,10 +18730,14 @@ }, "node_modules/pprof/node_modules/webidl-conversions": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "license": "BSD-2-Clause" }, "node_modules/pprof/node_modules/whatwg-url": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "license": "MIT", "dependencies": { "lodash.sortby": "^4.7.0", @@ -19050,8 +18745,36 @@ "webidl-conversions": "^4.0.2" } }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/precinct": { "version": "8.3.1", + "resolved": "https://registry.npmjs.org/precinct/-/precinct-8.3.1.tgz", + "integrity": "sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -19078,6 +18801,8 @@ }, "node_modules/precinct/node_modules/@typescript-eslint/types": { "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", "dev": true, "license": "MIT", "engines": { @@ -19090,6 +18815,8 @@ }, "node_modules/precinct/node_modules/@typescript-eslint/typescript-estree": { "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -19116,6 +18843,8 @@ }, "node_modules/precinct/node_modules/@typescript-eslint/visitor-keys": { "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dev": true, "license": "MIT", "dependencies": { @@ -19132,6 +18861,8 @@ }, "node_modules/precinct/node_modules/ast-module-types": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz", + "integrity": "sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==", "dev": true, "license": "MIT", "engines": { @@ -19140,11 +18871,15 @@ }, "node_modules/precinct/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, "node_modules/precinct/node_modules/detective-amd": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-3.1.2.tgz", + "integrity": "sha512-jffU26dyqJ37JHR/o44La6CxtrDf3Rt9tvd2IbImJYxWKTMdBjctp37qoZ6ZcY80RHg+kzWz4bXn39e4P7cctQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19162,6 +18897,8 @@ }, "node_modules/precinct/node_modules/detective-cjs": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-3.1.3.tgz", + "integrity": "sha512-ljs7P0Yj9MK64B7G0eNl0ThWSYjhAaSYy+fQcpzaKalYl/UoQBOzOeLCSFEY1qEBhziZ3w7l46KG/nH+s+L7BQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19174,6 +18911,8 @@ }, "node_modules/precinct/node_modules/detective-es6": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-2.2.2.tgz", + "integrity": "sha512-eZUKCUsbHm8xoeoCM0z6JFwvDfJ5Ww5HANo+jPR7AzkFpW9Mun3t/TqIF2jjeWa2TFbAiGaWESykf2OQp3oeMw==", "dev": true, "license": "MIT", "dependencies": { @@ -19185,6 +18924,8 @@ }, "node_modules/precinct/node_modules/detective-postcss": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-4.0.0.tgz", + "integrity": "sha512-Fwc/g9VcrowODIAeKRWZfVA/EufxYL7XfuqJQFroBKGikKX83d2G7NFw6kDlSYGG3LNQIyVa+eWv1mqre+v4+A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -19199,6 +18940,8 @@ }, "node_modules/precinct/node_modules/detective-sass": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-3.0.2.tgz", + "integrity": "sha512-DNVYbaSlmti/eztFGSfBw4nZvwsTaVXEQ4NsT/uFckxhJrNRFUh24d76KzoCC3aarvpZP9m8sC2L1XbLej4F7g==", "dev": true, "license": "MIT", "dependencies": { @@ -19211,6 +18954,8 @@ }, "node_modules/precinct/node_modules/detective-scss": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-2.0.2.tgz", + "integrity": "sha512-hDWnWh/l0tht/7JQltumpVea/inmkBaanJUcXRB9kEEXVwVUMuZd6z7eusQ6GcBFrfifu3pX/XPyD7StjbAiBg==", "dev": true, "license": "MIT", "dependencies": { @@ -19223,11 +18968,15 @@ }, "node_modules/precinct/node_modules/detective-stylus": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-1.0.3.tgz", + "integrity": "sha512-4/bfIU5kqjwugymoxLXXLltzQNeQfxGoLm2eIaqtnkWxqbhap9puDVpJPVDx96hnptdERzS5Cy6p9N8/08A69Q==", "dev": true, "license": "MIT" }, "node_modules/precinct/node_modules/detective-typescript": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-7.0.2.tgz", + "integrity": "sha512-unqovnhxzvkCz3m1/W4QW4qGsvXCU06aU2BAm8tkza+xLnp9SOFnob2QsTxUv5PdnQKfDvWcv9YeOeFckWejwA==", "dev": true, "license": "MIT", "dependencies": { @@ -19242,11 +18991,15 @@ }, "node_modules/precinct/node_modules/detective-typescript/node_modules/ast-module-types": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-2.7.1.tgz", + "integrity": "sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw==", "dev": true, "license": "MIT" }, "node_modules/precinct/node_modules/eslint-visitor-keys": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -19255,6 +19008,8 @@ }, "node_modules/precinct/node_modules/get-amd-module-type": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-3.0.2.tgz", + "integrity": "sha512-PcuKwB8ouJnKuAPn6Hk3UtdfKoUV3zXRqVEvj8XGIXqjWfgd1j7QGdXy5Z9OdQfzVt1Sk29HVe/P+X74ccOuqw==", "dev": true, "license": "MIT", "dependencies": { @@ -19267,6 +19022,8 @@ }, "node_modules/precinct/node_modules/node-source-walk": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-4.3.0.tgz", + "integrity": "sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==", "dev": true, "license": "MIT", "dependencies": { @@ -19278,6 +19035,8 @@ }, "node_modules/precinct/node_modules/postcss-values-parser": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", "dev": true, "license": "MIT", "dependencies": { @@ -19291,6 +19050,8 @@ }, "node_modules/precinct/node_modules/typescript": { "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", "dev": true, "license": "Apache-2.0", "bin": { @@ -19303,6 +19064,8 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "license": "MIT", "engines": { "node": ">= 0.8.0" @@ -19310,6 +19073,8 @@ }, "node_modules/prepend-http": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", "dev": true, "license": "MIT", "engines": { @@ -19317,7 +19082,9 @@ } }, "node_modules/prettier": { - "version": "3.2.4", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, "license": "MIT", "bin": { @@ -19332,6 +19099,8 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "license": "MIT", "dependencies": { @@ -19343,6 +19112,8 @@ }, "node_modules/pretty-bytes": { "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", "engines": { @@ -19354,6 +19125,8 @@ }, "node_modules/pretty-format": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19367,6 +19140,8 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { @@ -19378,6 +19153,8 @@ }, "node_modules/pretty-ms": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -19392,11 +19169,15 @@ }, "node_modules/process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -19404,6 +19185,8 @@ }, "node_modules/prom-client": { "version": "14.2.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz", + "integrity": "sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==", "license": "Apache-2.0", "dependencies": { "tdigest": "^0.1.1" @@ -19414,6 +19197,8 @@ }, "node_modules/prompts": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -19426,6 +19211,8 @@ }, "node_modules/protobufjs": { "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -19448,10 +19235,14 @@ }, "node_modules/proxy-from-env": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, "node_modules/pump": { - "version": "3.0.0", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -19460,13 +19251,17 @@ }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { - "version": "6.0.4", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { @@ -19482,6 +19277,9 @@ }, "node_modules/q": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", "dev": true, "license": "MIT", "engines": { @@ -19490,10 +19288,12 @@ } }, "node_modules/qs": { - "version": "6.11.2", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -19504,6 +19304,8 @@ }, "node_modules/query-string": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dev": true, "license": "MIT", "dependencies": { @@ -19517,6 +19319,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -19535,6 +19339,8 @@ }, "node_modules/quick-lru": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, "license": "MIT", "engines": { @@ -19543,16 +19349,22 @@ }, "node_modules/quote-unquote": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", + "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==", "dev": true, "license": "MIT" }, "node_modules/ramda": { "version": "0.27.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", + "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", "dev": true, "license": "MIT" }, "node_modules/range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -19560,6 +19372,8 @@ }, "node_modules/raw-body": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -19573,7 +19387,8 @@ }, "node_modules/rc": { "version": "1.2.8", - "dev": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", @@ -19587,19 +19402,24 @@ }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", - "dev": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, "node_modules/read-pkg": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "license": "MIT", "dependencies": { @@ -19613,6 +19433,8 @@ }, "node_modules/read-pkg-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", "dev": true, "license": "MIT", "dependencies": { @@ -19625,6 +19447,8 @@ }, "node_modules/read-pkg-up/node_modules/find-up": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19636,6 +19460,8 @@ }, "node_modules/read-pkg-up/node_modules/locate-path": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "license": "MIT", "dependencies": { @@ -19648,6 +19474,8 @@ }, "node_modules/read-pkg-up/node_modules/p-limit": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -19659,6 +19487,8 @@ }, "node_modules/read-pkg-up/node_modules/p-locate": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "license": "MIT", "dependencies": { @@ -19670,6 +19500,8 @@ }, "node_modules/read-pkg-up/node_modules/p-try": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, "license": "MIT", "engines": { @@ -19678,6 +19510,8 @@ }, "node_modules/read-pkg-up/node_modules/path-exists": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, "license": "MIT", "engines": { @@ -19686,6 +19520,8 @@ }, "node_modules/read-pkg/node_modules/path-type": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "license": "MIT", "dependencies": { @@ -19697,6 +19533,8 @@ }, "node_modules/read-pkg/node_modules/pify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", "engines": { @@ -19705,6 +19543,8 @@ }, "node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { @@ -19719,11 +19559,15 @@ }, "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, "license": "MIT" }, "node_modules/redent": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "license": "MIT", "dependencies": { @@ -19736,6 +19580,8 @@ }, "node_modules/redis-errors": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", "license": "MIT", "engines": { "node": ">=4" @@ -19743,6 +19589,8 @@ }, "node_modules/redis-parser": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", "license": "MIT", "dependencies": { "redis-errors": "^1.0.0" @@ -19751,12 +19599,38 @@ "node": ">=4" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "license": "MIT" }, "node_modules/regexp-tree": { "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", "dev": true, "license": "MIT", "bin": { @@ -19764,12 +19638,17 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -19780,6 +19659,8 @@ }, "node_modules/regjsparser": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -19791,6 +19672,8 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" @@ -19798,6 +19681,8 @@ }, "node_modules/repeating": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", "dev": true, "license": "MIT", "dependencies": { @@ -19809,6 +19694,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -19817,6 +19704,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -19824,11 +19713,15 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true, "license": "ISC" }, "node_modules/requirejs": { "version": "2.3.7", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.7.tgz", + "integrity": "sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw==", "dev": true, "license": "MIT", "bin": { @@ -19841,6 +19734,8 @@ }, "node_modules/requirejs-config-file": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz", + "integrity": "sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==", "dev": true, "license": "MIT", "dependencies": { @@ -19852,22 +19747,29 @@ } }, "node_modules/resolve": { - "version": "1.22.8", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -19879,6 +19781,8 @@ }, "node_modules/resolve-dependency-path": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-dependency-path/-/resolve-dependency-path-2.0.0.tgz", + "integrity": "sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w==", "dev": true, "license": "MIT", "engines": { @@ -19887,6 +19791,8 @@ }, "node_modules/resolve-dir": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, "license": "MIT", "dependencies": { @@ -19899,6 +19805,8 @@ }, "node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -19907,6 +19815,8 @@ }, "node_modules/resolve-global": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "license": "MIT", "dependencies": { @@ -19917,7 +19827,9 @@ } }, "node_modules/resolve.exports": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", "engines": { @@ -19926,6 +19838,8 @@ }, "node_modules/responselike": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -19934,6 +19848,8 @@ }, "node_modules/restore-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "license": "MIT", "dependencies": { @@ -19945,7 +19861,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -19953,12 +19871,17 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/right-pad": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz", + "integrity": "sha512-bYBjgxmkvTAfgIYy328fmkwhp39v8lwVgWhhrzxPV3yHtcSqyYKe9/XOhvW48UFjATg3VuJbpsp5822ACNvkmw==", + "deprecated": "Please use String.prototype.padEnd() over this package.", "dev": true, "license": "MIT", "engines": { @@ -19967,6 +19890,9 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -19980,6 +19906,9 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -19997,7 +19926,9 @@ } }, "node_modules/roarr": { - "version": "7.21.0", + "version": "7.21.1", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-7.21.1.tgz", + "integrity": "sha512-3niqt5bXFY1InKU8HKWqqYTYjtrBaxBMnXELXCXUYgtNYGUtZM5rB46HIC430AyacL95iEniGf7RgqsesykLmQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -20011,6 +19942,8 @@ }, "node_modules/rs-jsonpath": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rs-jsonpath/-/rs-jsonpath-1.1.2.tgz", + "integrity": "sha512-IQzlqtVyZniK7aOtpKGrv7BvkamSvLJkIhRGoKKDQLppNJe94BVHqpxNRjw/2042nGjtC3vyfCWyHe+3DlWgWA==", "license": "MIT", "dependencies": { "esprima": "1.2.2", @@ -20020,6 +19953,8 @@ }, "node_modules/rs-jsonpath/node_modules/esprima": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -20030,6 +19965,8 @@ }, "node_modules/run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, "license": "MIT", "engines": { @@ -20038,6 +19975,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "funding": [ { "type": "github", @@ -20058,7 +19997,9 @@ } }, "node_modules/rxjs": { - "version": "7.8.1", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -20066,12 +20007,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -20083,10 +20027,14 @@ }, "node_modules/safe-array-concat/node_modules/isarray": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -20103,8 +20051,32 @@ ], "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, "node_modules/safe-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", "dev": true, "license": "MIT", "dependencies": { @@ -20112,19 +20084,26 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.0", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-stable-stringify": { - "version": "2.4.3", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "license": "MIT", "engines": { "node": ">=10" @@ -20132,10 +20111,14 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/sass-lookup": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sass-lookup/-/sass-lookup-3.0.0.tgz", + "integrity": "sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg==", "dev": true, "license": "MIT", "dependencies": { @@ -20150,15 +20133,16 @@ }, "node_modules/sass-lookup/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, "node_modules/semver": { - "version": "7.5.4", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -20168,11 +20152,15 @@ }, "node_modules/semver-compare": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true, "license": "MIT" }, "node_modules/semver-regex": { "version": "3.1.4", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", + "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", "dev": true, "license": "MIT", "engines": { @@ -20182,132 +20170,293 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.1.0.tgz", + "integrity": "sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==", + "funding": [ + "https://github.com/sponsors/jonschlinkert", + "https://paypal.me/jonathanschlinkert", + "https://jonschlinkert.dev/sponsor" + ], + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "is-primitive": "^3.0.1" + }, + "engines": { + "node": ">=11.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, - "node_modules/set-blocking": { + "node_modules/sha256": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sha256/-/sha256-0.2.0.tgz", + "integrity": "sha512-kTWMJUaez5iiT9CcMv8jSq6kMhw3ST0uRdcIWl3D77s6AsLXNXRp3heeqqfu5+Dyfu4hwpQnMzhqHh8iNQxw0w==", + "dependencies": { + "convert-hex": "~0.1.0", + "convert-string": "~0.1.0" + } + }, + "node_modules/shebang-command": { "version": "2.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/set-function-length": { - "version": "1.1.1", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "license": "MIT", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/set-function-name": { - "version": "2.0.1", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/set-value": { - "version": "4.1.0", + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "funding": [ - "https://github.com/sponsors/jonschlinkert", - "https://paypal.me/jonathanschlinkert", - "https://jonschlinkert.dev/sponsor" + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ], "license": "MIT", "dependencies": { - "is-plain-object": "^2.0.4", - "is-primitive": "^3.0.1" - }, - "engines": { - "node": ">=11.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/sha256": { - "version": "0.2.0", - "dependencies": { - "convert-hex": "~0.1.0", - "convert-string": "~0.1.0" + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/shebang-command": { - "version": "2.0.0", + "node_modules/simple-get/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", + "node_modules/simple-get/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/shellwords": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/side-channel": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, "node_modules/simple-swizzle": { "version": "0.2.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dependencies": { "is-arrayish": "^0.3.1" } }, "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sisteransi": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "license": "MIT", "engines": { "node": ">=8" @@ -20315,6 +20464,8 @@ }, "node_modules/slice-ansi": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20330,6 +20481,8 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", "engines": { @@ -20341,6 +20494,8 @@ }, "node_modules/sort-keys": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", "dev": true, "license": "MIT", "dependencies": { @@ -20352,13 +20507,17 @@ }, "node_modules/source-map": { "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { - "version": "1.0.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -20367,6 +20526,8 @@ }, "node_modules/source-map-support": { "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { @@ -20376,6 +20537,8 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -20384,6 +20547,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -20391,11 +20556,15 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", @@ -20403,11 +20572,15 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "license": "CC0-1.0" }, "node_modules/split": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "license": "MIT", "dependencies": { "through": "2" @@ -20418,6 +20591,8 @@ }, "node_modules/split2": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, "license": "ISC", "dependencies": { @@ -20426,6 +20601,8 @@ }, "node_modules/split2/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { @@ -20439,11 +20616,15 @@ }, "node_modules/sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/sqlstring": { "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -20451,6 +20632,8 @@ }, "node_modules/stack-generator": { "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", "license": "MIT", "dependencies": { "stackframe": "^1.3.4" @@ -20458,13 +20641,16 @@ }, "node_modules/stack-trace": { "version": "0.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "engines": { "node": "*" } }, "node_modules/stack-utils": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20476,6 +20662,8 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", "engines": { @@ -20484,10 +20672,14 @@ }, "node_modules/stackframe": { "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "license": "MIT" }, "node_modules/stacktrace-parser": { - "version": "0.1.10", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", "license": "MIT", "dependencies": { "type-fest": "^0.7.1" @@ -20498,6 +20690,8 @@ }, "node_modules/stacktrace-parser/node_modules/type-fest": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" @@ -20505,10 +20699,14 @@ }, "node_modules/standard-as-callback": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", "license": "MIT" }, "node_modules/standard-version": { "version": "9.5.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", + "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", "dev": true, "license": "ISC", "dependencies": { @@ -20536,6 +20734,8 @@ }, "node_modules/standard-version/node_modules/cliui": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", "dependencies": { @@ -20546,6 +20746,8 @@ }, "node_modules/standard-version/node_modules/conventional-changelog": { "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20567,6 +20769,8 @@ }, "node_modules/standard-version/node_modules/conventional-changelog-angular": { "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, "license": "ISC", "dependencies": { @@ -20579,6 +20783,8 @@ }, "node_modules/standard-version/node_modules/conventional-changelog-conventionalcommits": { "version": "4.6.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", + "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", "dev": true, "license": "ISC", "dependencies": { @@ -20592,6 +20798,8 @@ }, "node_modules/standard-version/node_modules/conventional-changelog-core": { "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "dev": true, "license": "MIT", "dependencies": { @@ -20616,6 +20824,8 @@ }, "node_modules/standard-version/node_modules/conventional-changelog-core/node_modules/through2": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "license": "MIT", "dependencies": { @@ -20624,6 +20834,8 @@ }, "node_modules/standard-version/node_modules/conventional-changelog-jquery": { "version": "3.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", + "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", "dev": true, "license": "ISC", "dependencies": { @@ -20635,6 +20847,8 @@ }, "node_modules/standard-version/node_modules/conventional-changelog-writer": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20657,6 +20871,8 @@ }, "node_modules/standard-version/node_modules/conventional-changelog-writer/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -20665,6 +20881,8 @@ }, "node_modules/standard-version/node_modules/conventional-changelog-writer/node_modules/through2": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "license": "MIT", "dependencies": { @@ -20673,6 +20891,8 @@ }, "node_modules/standard-version/node_modules/conventional-commits-parser": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -20692,6 +20912,8 @@ }, "node_modules/standard-version/node_modules/conventional-commits-parser/node_modules/through2": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "license": "MIT", "dependencies": { @@ -20700,6 +20922,8 @@ }, "node_modules/standard-version/node_modules/get-pkg-repo": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", "dev": true, "license": "MIT", "dependencies": { @@ -20717,6 +20941,8 @@ }, "node_modules/standard-version/node_modules/git-semver-tags": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, "license": "MIT", "dependencies": { @@ -20732,6 +20958,8 @@ }, "node_modules/standard-version/node_modules/git-semver-tags/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -20740,6 +20968,8 @@ }, "node_modules/standard-version/node_modules/hosted-git-info": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "license": "ISC", "dependencies": { @@ -20751,6 +20981,8 @@ }, "node_modules/standard-version/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "license": "ISC", "dependencies": { @@ -20762,6 +20994,8 @@ }, "node_modules/standard-version/node_modules/normalize-package-data": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -20776,6 +21010,8 @@ }, "node_modules/standard-version/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { @@ -20789,11 +21025,15 @@ }, "node_modules/standard-version/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/standard-version/node_modules/yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", "dependencies": { @@ -20811,6 +21051,8 @@ }, "node_modules/static-eval": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", "license": "MIT", "dependencies": { "escodegen": "^1.8.1" @@ -20818,6 +21060,8 @@ }, "node_modules/static-eval/node_modules/escodegen": { "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -20838,6 +21082,8 @@ }, "node_modules/static-eval/node_modules/levn": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", @@ -20849,6 +21095,8 @@ }, "node_modules/static-eval/node_modules/optionator": { "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "license": "MIT", "dependencies": { "deep-is": "~0.1.3", @@ -20864,12 +21112,16 @@ }, "node_modules/static-eval/node_modules/prelude-ls": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "engines": { "node": ">= 0.8.0" } }, "node_modules/static-eval/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "optional": true, "engines": { @@ -20878,6 +21130,8 @@ }, "node_modules/static-eval/node_modules/type-check": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" @@ -20887,19 +21141,19 @@ } }, "node_modules/stats-accumulator": { - "version": "1.1.3", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/stats-accumulator/-/stats-accumulator-1.2.15.tgz", + "integrity": "sha512-9joMhuHyojZEJrZi7mn1zgCQiQSwmAxLrwpwBgKEGlY6zSbDGrikd2sSSpt1KmzqhHSFL8i48iV7O36a1wfEzg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.8" } }, - "node_modules/statsd-client": { - "version": "0.4.7", - "license": "MIT" - }, "node_modules/statuses": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -20907,6 +21161,8 @@ }, "node_modules/stream-browserify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "license": "MIT", "dependencies": { "inherits": "~2.0.4", @@ -20915,6 +21171,8 @@ }, "node_modules/stream-browserify/node_modules/readable-stream": { "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -20927,6 +21185,8 @@ }, "node_modules/stream-to-array": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==", "dev": true, "license": "MIT", "dependencies": { @@ -20935,6 +21195,8 @@ }, "node_modules/strict-uri-encode": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", "dev": true, "license": "MIT", "engines": { @@ -20943,6 +21205,8 @@ }, "node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" @@ -20950,10 +21214,14 @@ }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "license": "MIT" }, "node_modules/string-argv": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "license": "MIT", "engines": { @@ -20962,6 +21230,8 @@ }, "node_modules/string-length": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20974,6 +21244,8 @@ }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -20987,6 +21259,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -21000,6 +21274,8 @@ }, "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -21008,18 +21284,26 @@ }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -21029,24 +21313,35 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21054,6 +21349,8 @@ }, "node_modules/stringify-object": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -21067,11 +21364,16 @@ }, "node_modules/stringify-package": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", + "deprecated": "This module is not used anymore, and has been replaced by @npmcli/package-json", "dev": true, "license": "ISC" }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -21083,6 +21385,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -21094,6 +21398,8 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { @@ -21102,6 +21408,8 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", "engines": { @@ -21110,6 +21418,8 @@ }, "node_modules/strip-indent": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21121,6 +21431,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "license": "MIT", "engines": { "node": ">=8" @@ -21130,11 +21442,21 @@ } }, "node_modules/strnum": { - "version": "1.0.5", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT" }, "node_modules/stylus-lookup": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-3.0.2.tgz", + "integrity": "sha512-oEQGHSjg/AMaWlKe7gqsnYzan8DLcGIHe0dUaFkucZZ14z4zjENRlQMCHT4FNsiWnJf17YN9OvrCfCoi7VvOyg==", "dev": true, "license": "MIT", "dependencies": { @@ -21150,11 +21472,15 @@ }, "node_modules/stylus-lookup/node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, "node_modules/subdirs": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/subdirs/-/subdirs-1.0.1.tgz", + "integrity": "sha512-KSbUKpwQIRcb5Th+l4EzxEZYpCwV/g0pQ348EV7CIM5YEEgzz2L1KJD8FCeTckTiE/TKn2u09DCxpdAL6/iFbg==", "license": "MIT", "dependencies": { "es6-promise": "^3.0.2" @@ -21162,6 +21488,9 @@ }, "node_modules/superagent": { "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net", "dev": true, "license": "MIT", "dependencies": { @@ -21180,13 +21509,28 @@ "node": ">=6.4.0 <13 || >=14" } }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/supertest": { - "version": "6.3.3", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.4.tgz", + "integrity": "sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==", "dev": true, "license": "MIT", "dependencies": { "methods": "^1.1.2", - "superagent": "^8.0.5" + "superagent": "^8.1.2" }, "engines": { "node": ">=6.4.0" @@ -21194,6 +21538,8 @@ }, "node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -21204,6 +21550,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -21214,6 +21562,8 @@ }, "node_modules/swagger-cli": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/swagger-cli/-/swagger-cli-4.0.4.tgz", + "integrity": "sha512-Cp8YYuLny3RJFQ4CvOBTaqmOOgYsem52dPx1xM5S4EUWFblIh2Q8atppMZvXKUr1e9xH5RwipYpmdUzdPcxWcA==", "dev": true, "license": "MIT", "dependencies": { @@ -21227,10 +21577,11 @@ } }, "node_modules/synckit": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", "dev": true, + "license": "MIT", "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" @@ -21244,6 +21595,8 @@ }, "node_modules/tapable": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "license": "MIT", "engines": { @@ -21252,6 +21605,8 @@ }, "node_modules/tar": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "license": "ISC", "dependencies": { "chownr": "^2.0.0", @@ -21265,8 +21620,58 @@ "node": ">=10" } }, + "node_modules/tar-fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "license": "ISC", "engines": { "node": ">=8" @@ -21274,10 +21679,14 @@ }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, "node_modules/tdigest": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", "license": "MIT", "dependencies": { "bintrees": "1.0.2" @@ -21285,6 +21694,8 @@ }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "license": "ISC", "dependencies": { @@ -21298,6 +21709,9 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -21317,6 +21731,8 @@ }, "node_modules/text-extensions": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true, "license": "MIT", "engines": { @@ -21325,18 +21741,25 @@ }, "node_modules/text-hex": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, "node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "license": "MIT" }, "node_modules/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, "node_modules/through2": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21346,6 +21769,8 @@ }, "node_modules/timed-out": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "dev": true, "license": "MIT", "engines": { @@ -21354,6 +21779,8 @@ }, "node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "license": "MIT", "dependencies": { @@ -21365,25 +21792,23 @@ }, "node_modules/tmpl": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true, "license": "BSD-3-Clause" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-function": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/to-function/-/to-function-2.0.6.tgz", + "integrity": "sha512-LWfUmW851x5T8+78Nl82CA2j6w0trhoFj4rpS6pFUMgfUMUySDAKPgTvQkUqlWuH3Lihlk5sPyDHSVwmKDSc5Q==", "dependencies": { "component-props": "*" } }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -21394,6 +21819,8 @@ }, "node_modules/toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "license": "MIT", "engines": { "node": ">=0.6" @@ -21401,10 +21828,14 @@ }, "node_modules/tr46": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/trim-newlines": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, "license": "MIT", "engines": { @@ -21413,20 +21844,25 @@ }, "node_modules/triple-beam": { "version": "1.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "engines": { "node": ">= 14.0.0" } }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "license": "WTFPL", "dependencies": { "utf8-byte-length": "^1.0.1" } }, "node_modules/ts-graphviz": { - "version": "1.8.1", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/ts-graphviz/-/ts-graphviz-1.8.2.tgz", + "integrity": "sha512-5YhbFoHmjxa7pgQLkB07MtGnGJ/yhvjmc9uhsnDBEICME6gkPf83SBwLDQqGDoCa3XzUMWLk1AU2Wn1u1naDtA==", "dev": true, "license": "MIT", "engines": { @@ -21438,10 +21874,11 @@ } }, "node_modules/ts-jest": { - "version": "29.2.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", - "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "version": "29.2.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.6.tgz", + "integrity": "sha512-yTNZVZqc8lSixm+QGVFcPe6+yj7+TWZwIesuOWvfcn4B9bz5x4NDzVCQQjOs7Hfouu36aEqfEbo9Qpo+gq8dDg==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "ejs": "^3.1.10", @@ -21450,7 +21887,7 @@ "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.6.3", + "semver": "^7.7.1", "yargs-parser": "^21.1.1" }, "bin": { @@ -21485,20 +21922,10 @@ } } }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ts-jest/node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { @@ -21507,6 +21934,8 @@ }, "node_modules/ts-node": { "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21549,6 +21978,8 @@ }, "node_modules/tsconfig-paths": { "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", @@ -21559,6 +21990,8 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "license": "MIT", "dependencies": { "minimist": "^1.2.0" @@ -21569,18 +22002,23 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tsscmp": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", "license": "MIT", "engines": { "node": ">=0.6.x" @@ -21588,6 +22026,8 @@ }, "node_modules/tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "license": "MIT", "dependencies": { "tslib": "^1.8.1" @@ -21601,10 +22041,26 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "license": "0BSD" }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" @@ -21615,6 +22071,8 @@ }, "node_modules/type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", "engines": { @@ -21623,6 +22081,8 @@ }, "node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -21633,6 +22093,8 @@ }, "node_modules/type-is": { "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "license": "MIT", "dependencies": { "media-typer": "0.3.0", @@ -21643,25 +22105,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -21671,14 +22138,18 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -21688,12 +22159,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21701,11 +22180,15 @@ }, "node_modules/typedarray": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, "license": "MIT" }, "node_modules/typescript": { - "version": "5.3.3", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -21716,7 +22199,9 @@ } }, "node_modules/ua-parser-js": { - "version": "1.0.37", + "version": "1.0.40", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz", + "integrity": "sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==", "funding": [ { "type": "opencollective", @@ -21732,12 +22217,17 @@ } ], "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, "engines": { "node": "*" } }, "node_modules/uglify-js": { - "version": "3.17.4", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "license": "BSD-2-Clause", "optional": true, "bin": { @@ -21748,13 +22238,18 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21762,19 +22257,21 @@ }, "node_modules/underscore": { "version": "1.12.1", - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "5.26.5", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", "license": "MIT" }, "node_modules/uniq": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", "dev": true, "license": "MIT" }, "node_modules/universalify": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -21783,6 +22280,8 @@ }, "node_modules/unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -21790,6 +22289,8 @@ }, "node_modules/unset-value": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-2.0.1.tgz", + "integrity": "sha512-2hvrBfjUE00PkqN+q0XP6yRAOGrR06uSiUoIQGZkc7GxvQ9H7v8quUPNtZjMg4uux69i8HWpIjLPUKwCuRGyNg==", "license": "MIT", "dependencies": { "has-value": "^2.0.2", @@ -21801,13 +22302,17 @@ }, "node_modules/unset-value/node_modules/isobject": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -21825,8 +22330,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -21837,6 +22342,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" @@ -21844,6 +22351,8 @@ }, "node_modules/url-parse-lax": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21855,6 +22364,8 @@ }, "node_modules/url-to-options": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", "dev": true, "license": "MIT", "engines": { @@ -21862,15 +22373,21 @@ } }, "node_modules/utf8-byte-length": { - "version": "1.0.4", - "license": "WTFPL" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "license": "(WTFPL OR MIT)" }, "node_modules/utf8-length": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/utf8-length/-/utf8-length-0.0.1.tgz", + "integrity": "sha512-j/XH2ftofBiobnyApxlN/J6j/ixwT89WEjDcjT66d2i0+GIn9RZfzt8lpEXXE4jUe4NsjBSUq70kS2euQ4nnMw==", "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/uuid": { @@ -21881,17 +22398,22 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" }, "node_modules/v8-to-istanbul": { - "version": "9.2.0", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { @@ -21904,18 +22426,33 @@ } }, "node_modules/valid-url": { - "version": "1.0.9" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -21923,6 +22460,8 @@ }, "node_modules/vscode-json-languageservice": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.2.1.tgz", + "integrity": "sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==", "dev": true, "license": "MIT", "dependencies": { @@ -21934,27 +22473,37 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.11", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", "dev": true, "license": "MIT" }, "node_modules/vscode-languageserver-types": { "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true, "license": "MIT" }, "node_modules/vscode-nls": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", "dev": true, "license": "MIT" }, "node_modules/vscode-uri": { - "version": "3.0.8", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true, "license": "MIT" }, "node_modules/walkdir": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", "dev": true, "license": "MIT", "engines": { @@ -21963,6 +22512,8 @@ }, "node_modules/walker": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -21971,6 +22522,8 @@ }, "node_modules/wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "license": "MIT", "dependencies": { "defaults": "^1.0.3" @@ -21978,10 +22531,14 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/whatwg-url": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -21990,6 +22547,8 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -22002,14 +22561,70 @@ } }, "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/which-collection": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -22017,18 +22632,23 @@ }, "node_modules/which-module": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true, "license": "ISC" }, "node_modules/which-typed-array": { - "version": "1.1.13", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -22039,6 +22659,8 @@ }, "node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" @@ -22046,6 +22668,8 @@ }, "node_modules/widest-line": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dev": true, "license": "MIT", "dependencies": { @@ -22056,31 +22680,33 @@ } }, "node_modules/winston": { - "version": "3.11.0", - "license": "MIT", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", "dependencies": { "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.4.0", + "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" + "winston-transport": "^4.9.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/winston-transport": { - "version": "4.6.0", - "license": "MIT", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", + "logform": "^2.7.0", + "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" }, "engines": { @@ -22089,7 +22715,8 @@ }, "node_modules/winston-transport/node_modules/readable-stream": { "version": "3.6.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -22101,7 +22728,8 @@ }, "node_modules/winston/node_modules/readable-stream": { "version": "3.6.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -22113,6 +22741,8 @@ }, "node_modules/word-wrap": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -22120,10 +22750,14 @@ }, "node_modules/wordwrap": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "license": "MIT" }, "node_modules/wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -22141,6 +22775,8 @@ "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -22157,6 +22793,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -22171,6 +22809,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22182,11 +22822,15 @@ }, "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -22201,6 +22845,8 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22212,15 +22858,21 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "license": "ISC", "dependencies": { @@ -22233,6 +22885,8 @@ }, "node_modules/xtend": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, "license": "MIT", "engines": { @@ -22241,6 +22895,8 @@ }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -22249,11 +22905,15 @@ }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/yaml": { - "version": "2.4.3", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -22264,6 +22924,8 @@ }, "node_modules/yargs": { "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -22281,6 +22943,8 @@ }, "node_modules/yargs-parser": { "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "license": "ISC", "engines": { @@ -22289,6 +22953,8 @@ }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { @@ -22296,7 +22962,9 @@ } }, "node_modules/ylru": { - "version": "1.3.2", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", + "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -22304,6 +22972,8 @@ }, "node_modules/yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "license": "MIT", "engines": { @@ -22312,6 +22982,8 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "license": "MIT", "engines": { "node": ">=10" @@ -22321,11 +22993,13 @@ } }, "node_modules/zod": { - "version": "3.22.4", + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } } } -} +} \ No newline at end of file diff --git a/package.json b/package.json index b9064fac2c5..90eb0fad410 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rudder-transformer", - "version": "1.86.0", + "version": "1.93.0", "description": "", "homepage": "https://github.com/rudderlabs/rudder-transformer#readme", "bugs": { @@ -15,7 +15,7 @@ "main": "GATransform.js", "scripts": { "copy": "find ./src -name '*.yaml' -o -name '*.csv' | cpio -pdm ./dist", - "clean": "rm -rf ./dist", + "clean": "rm -rf ./dist ./dist-test", "setup": "npm ci", "setup:swagger": "swagger-cli bundle swagger/api.yaml --outfile dist/swagger.json --type json", "format": "prettier --write .", @@ -23,22 +23,23 @@ "lint:fix:json": "eslint --ext .json --fix .", "lint": "npm run format && npm run lint:fix", "check:merge": "npm run verify || exit 1; codecov", - "start": "cd dist;exec node ./src/index.js;cd ..", + "start": "cd dist && NODE_OPTIONS='--no-node-snapshot' node ./src/index.js && cd ..", "build:start": "npm run build && npm run start", "build:ci": "tsc -p tsconfig.json", "build:swagger": "npm run build && npm run setup:swagger", + "build:test": "tsc -p tsconfig.test.json", "build": "npm run build:ci && npm run copy", "clean:build": "npm run clean && npm run build", "build:clean": "npm run clean && npm run build", "verify": "eslint . || exit 1; npm run test:js || exit 1", "test:testRouter": "jest testRouter --detectOpenHandles --coverage --notify --watchAll=false", "test:benchmark": "node benchmark/index.js", - "test": "jest -c jest.config.js --detectOpenHandles", + "test": "NODE_OPTIONS='--no-node-snapshot' jest -c jest.config.js --detectOpenHandles", "test:ci": "npm run test -- --coverage --expand --maxWorkers=50%", - "test:js": "jest -c jest.default.config.js --detectOpenHandles", + "test:js": "NODE_OPTIONS='--no-node-snapshot' jest -c jest.default.config.js --detectOpenHandles", "test:js:silent": "export LOG_LEVEL=silent && npm run test:js -- --silent", "test:js:ci": "npm run test:js -- --coverage --expand --maxWorkers=50%", - "test:ts": "jest -c jest.config.typescript.js --detectOpenHandles", + "test:ts": "NODE_OPTIONS='--no-node-snapshot' jest -c jest.config.typescript.js --detectOpenHandles", "test:ts:component:generateNwMocks": "npm run test:ts -- component --generate=true", "test:ts:silent": "export LOG_LEVEL=silent && npm run test:ts -- --silent", "test:ts:ci": "npm run test:ts -- --coverage --expand --maxWorkers=50%", @@ -60,23 +61,24 @@ "@aws-sdk/credential-providers": "^3.391.0", "@aws-sdk/lib-storage": "^3.637.0", "@bugsnag/js": "^7.20.2", - "@datadog/pprof": "^3.1.0", + "@datadog/pprof": "^5.5.1", "@koa/router": "^12.0.0", "@ndhoule/extend": "^2.0.0", "@pyroscope/nodejs": "^0.2.9", - "@rudderstack/integrations-lib": "^0.2.13", - "@rudderstack/json-template-engine": "^0.18.0", + "@rudderstack/integrations-lib": "^0.2.25", + "@rudderstack/json-template-engine": "^0.19.5", "@rudderstack/workflow-engine": "^0.8.13", "@shopify/jest-koa-mocks": "^5.1.1", - "ajv": "^8.12.0", + "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^2.1.1", "amazon-dsp-formatter": "^1.0.2", - "axios": "^1.7.3", + "axios": "^1.7.9", "btoa": "^1.2.1", "component-each": "^0.2.6", "crypto-js": "^4.2.0", "dotenv": "^16.0.3", + "fast-xml-parser": "^4.5.1", "flat": "^5.0.2", "form-data": "^4.0.0", "get-value": "^3.0.1", @@ -86,22 +88,21 @@ "ioredis": "^5.3.2", "is": "^3.3.0", "is-ip": "^3.1.0", - "isolated-vm": "4.5.0", + "isolated-vm": "5.0.3", "js-sha1": "^0.6.0", "json-diff": "^1.0.3", "json-size": "^1.0.0", "jsontoxml": "^1.0.1", - "jstoxml": "^5.0.2", - "koa": "^2.15.3", + "koa": "^2.15.4", "koa-bodyparser": "^4.4.0", "koa2-swagger-ui": "^5.7.0", - "libphonenumber-js": "^1.11.12", + "libphonenumber-js": "^1.11.18", "lodash": "^4.17.21", "match-json": "^1.3.5", "md5": "^2.3.0", "modclean": "^3.0.0-beta.1", "moment": "^2.29.4", - "moment-timezone": "^0.5.43", + "moment-timezone": "^0.5.47", "node-cache": "^5.1.2", "node-fetch": "^2.6.12", "oauth-1.0a": "^2.2.6", @@ -114,12 +115,12 @@ "sha256": "^0.2.0", "sqlstring": "^2.3.3", "stacktrace-parser": "^0.1.10", - "statsd-client": "^0.4.7", "truncate-utf8-bytes": "^1.0.2", "ua-parser-js": "^1.0.37", "unset-value": "^2.0.1", "uuid": "^9.0.1", "valid-url": "^1.0.9", + "validator": "^13.12.0", "zod": "^3.22.4" }, "devDependencies": { @@ -135,6 +136,7 @@ "@types/supertest": "^6.0.2", "@typescript-eslint/eslint-plugin": "^5.61.0", "@typescript-eslint/parser": "^5.59.2", + "allure-jest": "^3.0.7", "axios-mock-adapter": "^1.22.0", "benchmark-suite": "^0.1.8", "commander": "^10.0.1", @@ -154,6 +156,8 @@ "http-terminator": "^3.2.0", "husky": "^9.1.6", "jest": "^29.5.0", + "jest-diff": "^29.7.0", + "jest-environment-node": "^29.7.0", "jest-sonar": "^0.2.16", "jest-when": "^3.5.2", "lint-staged": "^13.2.2", diff --git a/sonar-project.properties b/sonar-project.properties index 6c45b0ce39d..284f159cb3d 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -18,7 +18,7 @@ sonar.testExecutionReportPaths=reports/sonar/results-report.xml sonar.eslint.reportPaths=reports/eslint.json # Path to sources -sonar.sources=src,benchmark +sonar.sources=src sonar.inclusions=**/*.js sonar.exclusions=**/*.json,**/*.html,**/*.png,**/*.jpg,**/*.gif,**/*.svg,**/*.yml,src/util/libExtractor.js,src/util/url-search-params.min.js,src/util/lodash-es-core.js diff --git a/src/adapters/network.js b/src/adapters/network.js index aeb1cc128b3..13ebc89aadc 100644 --- a/src/adapters/network.js +++ b/src/adapters/network.js @@ -323,7 +323,7 @@ function stringifyQueryParam(value) { * @param {Object} payload * @returns {String} */ -function getFormData(payload) { +function getFormData(payload = {}) { const data = new URLSearchParams(); Object.keys(payload).forEach((key) => { const payloadValStr = stringifyQueryParam(payload[key]); @@ -332,6 +332,22 @@ function getFormData(payload) { return data; } +function extractPayloadForFormat(payload, format) { + switch (format) { + case 'JSON_ARRAY': + return payload?.batch; + case 'JSON': + return payload; + case 'XML': + return payload?.payload; + case 'FORM': + return getFormData(payload); + default: + logger.debug(`Unknown payload format: ${format}`); + return undefined; + } +} + /** * Prepares the proxy request * @param {*} request @@ -340,33 +356,29 @@ function getFormData(payload) { const prepareProxyRequest = (request) => { const { body, method, params, endpoint, headers, destinationConfig: config } = request; const { payload, payloadFormat } = getPayloadData(body); - let data; - - switch (payloadFormat) { - case 'JSON_ARRAY': - data = payload.batch; - // TODO: add headers - break; - case 'JSON': - data = payload; - break; - case 'XML': - data = payload.payload; - break; - case 'FORM': - data = getFormData(payload); - break; - case 'MULTIPART-FORM': - // TODO: - break; - default: - logger.debug(`body format ${payloadFormat} not supported`); - } + const data = extractPayloadForFormat(payload, payloadFormat); // Ref: https://github.com/rudderlabs/rudder-server/blob/master/router/network.go#L164 headers['User-Agent'] = 'RudderLabs'; return removeUndefinedValues({ endpoint, data, params, headers, method, config }); }; +const getHttpWrapperMethod = (requestType) => { + switch (requestType) { + case 'get': + return httpGET; + case 'put': + return httpPUT; + case 'patch': + return httpPATCH; + case 'delete': + return httpDELETE; + case 'constructor': + return httpSend; + default: + return httpPOST; + } +}; + /** * handles http request and sends the response in a simple format that is followed in transformer * @@ -392,27 +404,7 @@ const prepareProxyRequest = (request) => { }) */ const handleHttpRequest = async (requestType = 'post', ...httpArgs) => { - let httpWrapperMethod; - switch (requestType.toLowerCase()) { - case 'get': - httpWrapperMethod = httpGET; - break; - case 'put': - httpWrapperMethod = httpPUT; - break; - case 'patch': - httpWrapperMethod = httpPATCH; - break; - case 'delete': - httpWrapperMethod = httpDELETE; - break; - case 'constructor': - httpWrapperMethod = httpSend; - break; - default: - httpWrapperMethod = httpPOST; - break; - } + const httpWrapperMethod = getHttpWrapperMethod(requestType.toLowerCase()); const httpResponse = await httpWrapperMethod(...httpArgs); const processedResponse = processAxiosResponse(httpResponse); return { httpResponse, processedResponse }; diff --git a/src/adapters/network.test.js b/src/adapters/network.test.js index 7894925ccd6..a4a2787504f 100644 --- a/src/adapters/network.test.js +++ b/src/adapters/network.test.js @@ -1,7 +1,20 @@ const mockLoggerInstance = { info: jest.fn(), }; -const { getFormData, httpPOST, httpGET, httpSend, fireHTTPStats } = require('./network'); +const { + getFormData, + httpPOST, + httpGET, + httpSend, + fireHTTPStats, + proxyRequest, + prepareProxyRequest, + handleHttpRequest, + httpDELETE, + httpPUT, + httpPATCH, + getPayloadData, +} = require('./network'); const { getFuncTestData } = require('../../test/testHelper'); jest.mock('../util/stats', () => ({ timing: jest.fn(), @@ -20,14 +33,28 @@ jest.mock('@rudderstack/integrations-lib', () => { }; }); -jest.mock('axios', () => jest.fn()); +// Mock the axios module +jest.mock('axios', () => { + const mockAxios = jest.fn(); // Mock the default axios function + mockAxios.get = jest.fn(); // Mock axios.get + mockAxios.post = jest.fn(); // Mock axios.post + mockAxios.put = jest.fn(); // Mock axios.put + mockAxios.patch = jest.fn(); // Mock axios.patch + mockAxios.delete = jest.fn(); // Mock axios.delete + + // Mock the axios.create method if needed + mockAxios.create = jest.fn(() => mockAxios); + + return mockAxios; // Return the mocked axios +}); + +const axios = require('axios'); jest.mock('../util/logger', () => ({ ...jest.requireActual('../util/logger'), getMatchedMetadata: jest.fn(), })); -const axios = require('axios'); const loggerUtil = require('../util/logger'); axios.post = jest.fn(); @@ -635,3 +662,338 @@ describe('logging in http methods', () => { expect(mockLoggerInstance.info).toHaveBeenCalledTimes(0); }); }); + +describe('httpDELETE tests', () => { + beforeEach(() => { + mockLoggerInstance.info.mockClear(); + loggerUtil.getMatchedMetadata.mockClear(); + axios.delete.mockClear(); + }); + + test('should call axios.delete with correct parameters and log request/response', async () => { + const statTags = { + metadata: { + destType: 'DT', + destinationId: 'd1', + workspaceId: 'w1', + sourceId: 's1', + }, + destType: 'DT', + feature: 'feat', + endpointPath: '/m/n/o', + requestMethod: 'delete', + }; + loggerUtil.getMatchedMetadata.mockReturnValue([statTags.metadata]); + + axios.delete.mockResolvedValueOnce({ + status: 200, + data: { a: 1, b: 2, c: 'abc' }, + headers: { + 'Content-Type': 'application/json', + 'X-Some-Header': 'headsome', + }, + }); + + await expect(httpDELETE('https://some.web.com/m/n/o', {}, statTags)).resolves.not.toThrow( + Error, + ); + expect(loggerUtil.getMatchedMetadata).toHaveBeenCalledTimes(2); + expect(mockLoggerInstance.info).toHaveBeenCalledTimes(2); + + expect(mockLoggerInstance.info).toHaveBeenNthCalledWith(1, ' [DT] /m/n/o request', { + body: undefined, + destType: 'DT', + destinationId: 'd1', + workspaceId: 'w1', + sourceId: 's1', + url: 'https://some.web.com/m/n/o', + method: 'delete', + }); + + expect(mockLoggerInstance.info).toHaveBeenNthCalledWith(2, ' [DT] /m/n/o response', { + destType: 'DT', + destinationId: 'd1', + workspaceId: 'w1', + sourceId: 's1', + body: { a: 1, b: 2, c: 'abc' }, + status: 200, + headers: { + 'Content-Type': 'application/json', + 'X-Some-Header': 'headsome', + }, + }); + }); +}); + +describe('httpPUT tests', () => { + beforeEach(() => { + mockLoggerInstance.info.mockClear(); + loggerUtil.getMatchedMetadata.mockClear(); + axios.put.mockClear(); + }); + + test('should call axios.put with correct parameters and log request/response', async () => { + const statTags = { + metadata: { + destType: 'DT', + destinationId: 'd1', + workspaceId: 'w1', + sourceId: 's1', + }, + destType: 'DT', + feature: 'feat', + endpointPath: '/m/n/o', + requestMethod: 'put', + }; + loggerUtil.getMatchedMetadata.mockReturnValue([statTags.metadata]); + + axios.put.mockResolvedValueOnce({ + status: 200, + data: { a: 1, b: 2, c: 'abc' }, + headers: { + 'Content-Type': 'application/json', + 'X-Some-Header': 'headsome', + }, + }); + + await expect(httpPUT('https://some.web.com/m/n/o', {}, {}, statTags)).resolves.not.toThrow( + Error, + ); + expect(loggerUtil.getMatchedMetadata).toHaveBeenCalledTimes(2); + expect(mockLoggerInstance.info).toHaveBeenCalledTimes(2); + + expect(mockLoggerInstance.info).toHaveBeenNthCalledWith(1, ' [DT] /m/n/o request', { + body: {}, + destType: 'DT', + destinationId: 'd1', + workspaceId: 'w1', + sourceId: 's1', + url: 'https://some.web.com/m/n/o', + method: 'put', + }); + + expect(mockLoggerInstance.info).toHaveBeenNthCalledWith(2, ' [DT] /m/n/o response', { + destType: 'DT', + destinationId: 'd1', + workspaceId: 'w1', + sourceId: 's1', + body: { a: 1, b: 2, c: 'abc' }, + status: 200, + headers: { + 'Content-Type': 'application/json', + 'X-Some-Header': 'headsome', + }, + }); + }); +}); + +describe('httpPATCH tests', () => { + beforeEach(() => { + mockLoggerInstance.info.mockClear(); + loggerUtil.getMatchedMetadata.mockClear(); + axios.patch.mockClear(); + }); + + test('should call axios.patch with correct parameters and log request/response', async () => { + const statTags = { + metadata: { + destType: 'DT', + destinationId: 'd1', + workspaceId: 'w1', + sourceId: 's1', + }, + destType: 'DT', + feature: 'feat', + endpointPath: '/m/n/o', + requestMethod: 'patch', + }; + loggerUtil.getMatchedMetadata.mockReturnValue([statTags.metadata]); + + axios.patch.mockResolvedValueOnce({ + status: 200, + data: { a: 1, b: 2, c: 'abc' }, + headers: { + 'Content-Type': 'application/json', + 'X-Some-Header': 'headsome', + }, + }); + + await expect(httpPATCH('https://some.web.com/m/n/o', {}, {}, statTags)).resolves.not.toThrow( + Error, + ); + expect(loggerUtil.getMatchedMetadata).toHaveBeenCalledTimes(2); + expect(mockLoggerInstance.info).toHaveBeenCalledTimes(2); + + expect(mockLoggerInstance.info).toHaveBeenNthCalledWith(1, ' [DT] /m/n/o request', { + body: {}, + destType: 'DT', + destinationId: 'd1', + workspaceId: 'w1', + sourceId: 's1', + url: 'https://some.web.com/m/n/o', + method: 'patch', + }); + + expect(mockLoggerInstance.info).toHaveBeenNthCalledWith(2, ' [DT] /m/n/o response', { + destType: 'DT', + destinationId: 'd1', + workspaceId: 'w1', + sourceId: 's1', + body: { a: 1, b: 2, c: 'abc' }, + status: 200, + headers: { + 'Content-Type': 'application/json', + 'X-Some-Header': 'headsome', + }, + }); + }); +}); + +describe('getPayloadData tests', () => { + test('should return payload and payloadFormat for non-empty body', () => { + const body = { + JSON: { key: 'value' }, + XML: null, + FORM: null, + }; + const result = getPayloadData(body); + expect(result).toEqual({ payload: { key: 'value' }, payloadFormat: 'JSON' }); + }); + + test('should return undefined payload and payloadFormat for empty body', () => { + const body = {}; + const result = getPayloadData(body); + expect(result).toEqual({ payload: undefined, payloadFormat: undefined }); + }); +}); + +describe('prepareProxyRequest tests', () => { + test('should prepare proxy request with correct headers and payload', () => { + const request = { + body: { JSON: { key: 'value' } }, + method: 'POST', + params: { param1: 'value1' }, + endpoint: 'https://example.com', + headers: { 'Content-Type': 'application/json' }, + destinationConfig: { key: 'value' }, + }; + const result = prepareProxyRequest(request); + expect(result).toEqual({ + endpoint: 'https://example.com', + data: { key: 'value' }, + params: { param1: 'value1' }, + headers: { 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs' }, + method: 'POST', + config: { key: 'value' }, + }); + }); +}); + +describe('handleHttpRequest tests', () => { + beforeEach(() => { + axios.post.mockClear(); + axios.get.mockClear(); + axios.put.mockClear(); + axios.patch.mockClear(); + axios.delete.mockClear(); + }); + + test('should handle POST request correctly', async () => { + axios.post.mockResolvedValueOnce({ + status: 200, + data: { key: 'value' }, + }); + + const result = await handleHttpRequest('post', 'https://example.com', { key: 'value' }, {}); + expect(result.httpResponse).toEqual({ + success: true, + response: { status: 200, data: { key: 'value' } }, + }); + expect(result.processedResponse).toBeDefined(); + }); + + test('should handle GET request correctly', async () => { + axios.get.mockResolvedValueOnce({ + status: 200, + data: { key: 'value' }, + }); + + const result = await handleHttpRequest('get', 'https://example.com', {}); + expect(result.httpResponse).toEqual({ + success: true, + response: { status: 200, data: { key: 'value' } }, + }); + expect(result.processedResponse).toBeDefined(); + }); + + test('should handle PUT request correctly', async () => { + axios.put.mockResolvedValueOnce({ + status: 200, + data: { key: 'value' }, + }); + + const result = await handleHttpRequest('put', 'https://example.com', { key: 'value' }, {}); + expect(result.httpResponse).toEqual({ + success: true, + response: { status: 200, data: { key: 'value' } }, + }); + expect(result.processedResponse).toBeDefined(); + }); + + test('should handle PATCH request correctly', async () => { + axios.patch.mockResolvedValueOnce({ + status: 200, + data: { key: 'value' }, + }); + + const result = await handleHttpRequest('patch', 'https://example.com', { key: 'value' }, {}); + expect(result.httpResponse).toEqual({ + success: true, + response: { status: 200, data: { key: 'value' } }, + }); + expect(result.processedResponse).toBeDefined(); + }); + + test('should handle DELETE request correctly', async () => { + axios.delete.mockResolvedValueOnce({ + status: 200, + data: { key: 'value' }, + }); + + const result = await handleHttpRequest('delete', 'https://example.com', {}); + expect(result.httpResponse).toEqual({ + success: true, + response: { status: 200, data: { key: 'value' } }, + }); + expect(result.processedResponse).toBeDefined(); + }); +}); + +describe('proxyRequest tests', () => { + beforeEach(() => { + axios.mockClear(); + }); + + test('should proxy request correctly', async () => { + axios.mockResolvedValueOnce({ + status: 200, + data: { key: 'value' }, + }); + + const request = { + body: { JSON: { key: 'value' } }, + method: 'POST', + params: { param1: 'value1' }, + endpoint: 'https://example.com', + headers: { 'Content-Type': 'application/json' }, + destinationConfig: { key: 'value' }, + metadata: { destType: 'DT' }, + }; + + const result = await proxyRequest(request, 'DT'); + expect(result).toEqual({ + success: true, + response: { status: 200, data: { key: 'value' } }, + }); + }); +}); diff --git a/src/cdk/v2/destinations/accoil_analytics/procWorkflow.yaml b/src/cdk/v2/destinations/accoil_analytics/procWorkflow.yaml new file mode 100644 index 00000000000..3d9eb319843 --- /dev/null +++ b/src/cdk/v2/destinations/accoil_analytics/procWorkflow.yaml @@ -0,0 +1,122 @@ +bindings: + - name: EventType + path: ../../../../constants + - path: ../../bindings/jsontemplate + exportAll: true + - name: removeUndefinedAndNullValues + path: ../../../../v0/util + - name: base64Convertor + path: ../../../../v0/util + - path: ./utils + +steps: + - name: validateInput + template: | + $.assert(.message.type, "message type is not present. Aborting message."); + $.assert(.message.type in {{$.EventType.([.TRACK, .PAGE, .SCREEN, .IDENTIFY, .GROUP])}}, + "message type " + .message.type + " is not supported"); + $.assertConfig(.destination.Config.apiKey, "apiKey must be supplied in destination config"); + +# Note our auth does not require a password in basic auth just the string "key:" + - name: prepareContext + template: | + $.context.messageType = .message.type.toLowerCase(); + $.context.payload = { + "type": $.context.messageType + }; + $.context.finalHeaders = { + "Authorization": "Basic " + $.base64Convertor(.destination.Config.apiKey + ":"), + "Content-Type": "application/json" + }; + $.context.endpoint = $.endpointUrl(.destination.Config.apiKey); + + - name: trackPayload + condition: $.context.messageType == {{$.EventType.TRACK}} + template: | + $.context.payload.event = .message.event; + $.context.payload.userId = .message.().({{{{$.getGenericPaths("userIdOnly")}}}}) + $.context.payload.timestamp = .message.().({{{{$.getGenericPaths("timestamp")}}}}) + + - name: pagePayload + condition: $.context.messageType == {{$.EventType.PAGE}} + template: | + $.context.payload.userId = .message.().({{{{$.getGenericPaths("userIdOnly")}}}}); + $.context.payload.name = .message.name; + $.context.payload.timestamp = .message.().({{{{$.getGenericPaths("timestamp")}}}}); + + - name: screenPayload + condition: $.context.messageType == {{$.EventType.SCREEN}} + template: | + $.context.payload.userId = .message.().({{{{$.getGenericPaths("userIdOnly")}}}}); + $.context.payload.name = .message.name; + $.context.payload.timestamp = .message.().({{{{$.getGenericPaths("timestamp")}}}}); + + - name: identifyPayload + condition: $.context.messageType == {{$.EventType.IDENTIFY}} + template: | + $.context.payload.userId = .message.().({{{{$.getGenericPaths("userIdOnly")}}}}); + $.context.payload.traits = .message.traits ?? .message.context.traits; + $.context.payload.timestamp = .message.().({{{{$.getGenericPaths("timestamp")}}}}); + + - name: groupPayload + condition: $.context.messageType == {{$.EventType.GROUP}} + template: | + $.context.payload.userId = .message.().({{{{$.getGenericPaths("userId")}}}}); + $.context.payload.groupId = .message.groupId; + $.context.payload.timestamp = .message.().({{{{$.getGenericPaths("timestamp")}}}}); + $.context.payload.traits = .message.traits; + + - name: validateTimestamp + template: | + $.assert($.context.payload.timestamp, "timestamp is required for all calls") + + - name: validateTrackPayload + condition: $.context.messageType == {{$.EventType.TRACK}} + template: | + $.assert($.context.payload.event, "event is required for track call") + $.assert($.context.payload.userId, "userId is required for track call") + + - name: validatePagePayload + condition: $.context.messageType == {{$.EventType.PAGE}} + template: | + $.assert($.context.payload.name, "name is required for page call") + $.assert($.context.payload.userId, "userId is required for page call") + + - name: validateScreenPayload + condition: $.context.messageType == {{$.EventType.SCREEN}} + template: | + $.assert($.context.payload.name, "name is required for screen call") + $.assert($.context.payload.userId, "userId is required for screen call") + + - name: validateIdentifyPayload + condition: $.context.messageType == {{$.EventType.IDENTIFY}} + template: | + $.assert($.context.payload.userId, "userId is required for identify call") + + - name: validateGroupPayload + condition: $.context.messageType == {{$.EventType.GROUP}} + template: | + $.assert($.context.payload.userId, "userId is required for group call") + $.assert($.context.payload.groupId, "groupId is required for group call") + + - name: cleanPayload + template: | + $.context.payload = $.removeUndefinedAndNullValues($.context.payload); + + - name: buildResponseForProcessTransformation + template: | + $.context.payload.({ + "body": { + "JSON": ., + "JSON_ARRAY": {}, + "XML": {}, + "FORM": {} + }, + "version": "1", + "type": "REST", + "method": "POST", + "endpoint": $.context.endpoint, + "headers": $.context.finalHeaders, + "params": {}, + "files": {} + }) \ No newline at end of file diff --git a/src/cdk/v2/destinations/accoil_analytics/rtWorkflow.yaml b/src/cdk/v2/destinations/accoil_analytics/rtWorkflow.yaml new file mode 100644 index 00000000000..88cb78352f2 --- /dev/null +++ b/src/cdk/v2/destinations/accoil_analytics/rtWorkflow.yaml @@ -0,0 +1,33 @@ +bindings: + - name: handleRtTfSingleEventError + path: ../../../../v0/util/index + +steps: + - name: validateInput + template: | + $.assert(Array.isArray(^) && ^.length > 0, "Invalid event array") + + - name: transform + externalWorkflow: + path: ./procWorkflow.yaml + loopOverInput: true + + - name: successfulEvents + template: | + $.outputs.transform#idx.output.({ + "batchedRequest": ., + "batched": false, + "destination": ^[idx].destination, + "metadata": ^[idx].metadata[], + "statusCode": 200 + })[] + + - name: failedEvents + template: | + $.outputs.transform#idx.error.( + $.handleRtTfSingleEventError(^[idx], .originalError ?? ., {}) + )[] + + - name: finalPayload + template: | + [...$.outputs.failedEvents, ...$.outputs.successfulEvents] diff --git a/src/cdk/v2/destinations/accoil_analytics/utils.ts b/src/cdk/v2/destinations/accoil_analytics/utils.ts new file mode 100644 index 00000000000..f59fac2ea26 --- /dev/null +++ b/src/cdk/v2/destinations/accoil_analytics/utils.ts @@ -0,0 +1,6 @@ +const stgRegex = /^stg_/i; + +export const endpointUrl = (apiKey: string): string => { + const staging: boolean = stgRegex.test(apiKey); + return staging ? 'https://instaging.accoil.com/segment' : 'https://in.accoil.com/segment'; +}; diff --git a/src/cdk/v2/destinations/bloomreach/types.ts b/src/cdk/v2/destinations/bloomreach/types.ts new file mode 100644 index 00000000000..4a1125819dc --- /dev/null +++ b/src/cdk/v2/destinations/bloomreach/types.ts @@ -0,0 +1,8 @@ +export type BloomreachDestinationConfig = { + hardID: string; + softID: string; + appSecret: string; + apiKey: string; + apiBaseUrl: string; + projectToken: string; +}; diff --git a/src/cdk/v2/destinations/bloomreach/utils.ts b/src/cdk/v2/destinations/bloomreach/utils.ts index f834fa74e7a..7669ec8990a 100644 --- a/src/cdk/v2/destinations/bloomreach/utils.ts +++ b/src/cdk/v2/destinations/bloomreach/utils.ts @@ -1,5 +1,6 @@ import { isObject, isEmptyObject, getIntegrationsObj } from '../../../../v0/util'; import { RudderMessage, Destination } from '../../../../types'; +import { BloomreachDestinationConfig } from './types'; const getCustomerIDsFromIntegrationObject = (message: RudderMessage): any => { const integrationObj = getIntegrationsObj(message, 'bloomreach' as any) || {}; @@ -21,7 +22,10 @@ const getCustomerIDsFromIntegrationObject = (message: RudderMessage): any => { return customerIDs; }; -export const prepareCustomerIDs = (message: RudderMessage, destination: Destination): any => { +export const prepareCustomerIDs = ( + message: RudderMessage, + destination: Destination, +): any => { const customerIDs = { [destination.Config.hardID]: message.userId, [destination.Config.softID]: message.anonymousId, diff --git a/src/cdk/v2/destinations/bluecore/utils.js b/src/cdk/v2/destinations/bluecore/utils.js index 543b6de745f..e82a1355b51 100644 --- a/src/cdk/v2/destinations/bluecore/utils.js +++ b/src/cdk/v2/destinations/bluecore/utils.js @@ -19,74 +19,83 @@ const { EVENT_NAME_MAPPING, IDENTIFY_EXCLUSION_LIST, TRACK_EXCLUSION_LIST } = re const { EventType } = require('../../../../constants'); const { MAPPING_CONFIG, CONFIG_CATEGORIES } = require('./config'); -/** - * Verifies the correctness of payload for different events. - * - * @param {Object} payload - The payload object containing event information. - * @param {Object} message - The message object containing additional information. - * @throws {InstrumentationError} - Throws an error if required properties are missing. - * @returns {void} - */ -const verifyPayload = (payload, message) => { +const validateCustomerProperties = (payload, eventName) => { + if ( + !isDefinedAndNotNull(payload?.properties?.customer) || + Object.keys(payload.properties.customer).length === 0 + ) { + throw new InstrumentationError( + `[Bluecore] property:: No relevant trait to populate customer information, which is required for ${eventName} action`, + ); + } +}; + +const validateIdentifyAction = (message) => { if ( message.type === EventType.IDENTIFY && isDefinedNotNullNotEmpty(message.traits?.action) && message.traits?.action !== 'identify' ) { throw new InstrumentationError( - "[Bluecore] traits.action must be 'identify' for identify action", + "[Bluecore] traits.action must be 'identify' for identify action", ); } - switch (payload.event) { - case 'search': - if (!payload?.properties?.search_term) { - throw new InstrumentationError( - '[Bluecore] property:: search_query is required for search event', - ); - } - break; - case 'purchase': - if (!isDefinedAndNotNull(payload?.properties?.order_id)) { - throw new InstrumentationError( - '[Bluecore] property:: order_id is required for purchase event', - ); - } - if (!isDefinedAndNotNull(payload?.properties?.total)) { - throw new InstrumentationError( - '[Bluecore] property:: total is required for purchase event', - ); - } - if ( - !isDefinedAndNotNull(payload?.properties?.customer) || - Object.keys(payload.properties.customer).length === 0 - ) { - throw new InstrumentationError( - `[Bluecore] property:: No relevant trait to populate customer information, which is required for ${payload.event} event`, - ); - } - break; - case 'identify': - case 'optin': - case 'unsubscribe': - if (!isDefinedAndNotNullAndNotEmpty(getFieldValueFromMessage(message, 'email'))) { - throw new InstrumentationError( - `[Bluecore] property:: email is required for ${payload.event} action`, - ); - } - if ( - !isDefinedAndNotNull(payload?.properties?.customer) || - Object.keys(payload.properties.customer).length === 0 - ) { - throw new InstrumentationError( - `[Bluecore] property:: No relevant trait to populate customer information, which is required for ${payload.event} action`, - ); - } - break; - default: - break; +}; +const validateSearchEvent = (payload) => { + if (!payload?.properties?.search_term) { + throw new InstrumentationError( + '[Bluecore] property:: search_query is required for search event', + ); } }; +const validatePurchaseEvent = (payload) => { + if (!isDefinedAndNotNull(payload?.properties?.order_id)) { + throw new InstrumentationError('[Bluecore] property:: order_id is required for purchase event'); + } + if (!isDefinedAndNotNull(payload?.properties?.total)) { + throw new InstrumentationError('[Bluecore] property:: total is required for purchase event'); + } + validateCustomerProperties(payload, 'purchase'); +}; + +const validateCustomerEvent = (payload, message) => { + if (!isDefinedAndNotNullAndNotEmpty(getFieldValueFromMessage(message, 'email'))) { + throw new InstrumentationError( + `[Bluecore] property:: email is required for ${payload.event} action`, + ); + } + validateCustomerProperties(payload, payload.event); +}; + +const validateEventSpecificPayload = (payload, message) => { + const eventValidators = { + search: validateSearchEvent, + purchase: validatePurchaseEvent, + identify: validateCustomerEvent, + optin: validateCustomerEvent, + unsubscribe: validateCustomerEvent, + }; + + const validator = eventValidators[payload.event]; + if (validator) { + validator(payload, message); + } +}; + +/** + * Verifies the correctness of payload for different events. + * + * @param {Object} payload - The payload object containing event information. + * @param {Object} message - The message object containing additional information. + * @throws {InstrumentationError} - Throws an error if required properties are missing. + * @returns {void} + */ +const verifyPayload = (payload, message) => { + validateIdentifyAction(message); + validateEventSpecificPayload(payload, message); +}; + /** * Deduces the track event name based on the provided track event name and configuration. * diff --git a/src/cdk/v2/destinations/clicksend/utils.js b/src/cdk/v2/destinations/clicksend/utils.js index d0671df45c5..c6a8c281e3b 100644 --- a/src/cdk/v2/destinations/clicksend/utils.js +++ b/src/cdk/v2/destinations/clicksend/utils.js @@ -4,8 +4,11 @@ const { BatchUtils } = require('@rudderstack/workflow-engine'); const { SMS_SEND_ENDPOINT, MAX_BATCH_SIZE, COMMON_CONTACT_DOMAIN } = require('./config'); const { isDefinedAndNotNullAndNotEmpty, isDefinedAndNotNull } = require('../../../../v0/util'); -const getEndIdentifyPoint = (contactId, contactListId) => - `${COMMON_CONTACT_DOMAIN}/${contactListId}/contacts${isDefinedAndNotNullAndNotEmpty(contactId) ? `/${contactId}` : ''}`; +const getEndIdentifyPoint = (contactId, contactListId) => { + const basePath = `${COMMON_CONTACT_DOMAIN}/${contactListId}/contacts`; + const contactSuffix = isDefinedAndNotNullAndNotEmpty(contactId) ? `/${contactId}` : ''; + return basePath + contactSuffix; +}; const validateIdentifyPayload = (payload) => { if ( @@ -33,13 +36,17 @@ const deduceSchedule = (eventLevelSchedule, timestamp, destConfig) => { if (isDefinedAndNotNull(eventLevelSchedule) && !Number.isNaN(eventLevelSchedule)) { return eventLevelSchedule; } - const { defaultCampaignScheduleUnit = 'minute', defaultCampaignSchedule = 0 } = destConfig; + const { defaultCampaignScheduleUnit = 'minute', defaultCampaignSchedule = '0' } = destConfig; const date = new Date(timestamp); + let defaultCampaignScheduleInt = parseInt(defaultCampaignSchedule, 10); + if (Number.isNaN(defaultCampaignScheduleInt)) { + defaultCampaignScheduleInt = 0; + } if (defaultCampaignScheduleUnit === 'day') { - date.setDate(date.getDate() + defaultCampaignSchedule); + date.setUTCDate(date.getUTCDate() + defaultCampaignScheduleInt); } else if (defaultCampaignScheduleUnit === 'minute') { - date.setMinutes(date.getMinutes() + defaultCampaignSchedule); + date.setUTCMinutes(date.getUTCMinutes() + defaultCampaignScheduleInt); } else { throw new Error("Invalid delta unit. Use 'day' or 'minute'."); } diff --git a/src/cdk/v2/destinations/clicksend/utils.test.js b/src/cdk/v2/destinations/clicksend/utils.test.js index 4999f556788..ef4468b6fe7 100644 --- a/src/cdk/v2/destinations/clicksend/utils.test.js +++ b/src/cdk/v2/destinations/clicksend/utils.test.js @@ -46,7 +46,7 @@ describe('deduceSchedule', () => { it('should return eventLevelSchedule when it is defined, not null, and not empty', () => { const eventLevelSchedule = 1234567890; const timestamp = '2023-10-01T00:00:00Z'; - const destConfig = { defaultCampaignScheduleUnit: 'minute', defaultCampaignSchedule: 5 }; + const destConfig = { defaultCampaignScheduleUnit: 'minute', defaultCampaignSchedule: '5' }; const result = deduceSchedule(eventLevelSchedule, timestamp, destConfig); @@ -57,7 +57,7 @@ describe('deduceSchedule', () => { it('should throw error when defaultCampaignScheduleUnit is invalid', () => { const eventLevelSchedule = null; const timestamp = '2023-10-01T00:00:00Z'; - const destConfig = { defaultCampaignScheduleUnit: 'hour', defaultCampaignSchedule: 5 }; + const destConfig = { defaultCampaignScheduleUnit: 'hour', defaultCampaignSchedule: '5' }; expect(() => { deduceSchedule(eventLevelSchedule, timestamp, destConfig); @@ -68,7 +68,7 @@ describe('deduceSchedule', () => { it('should calculate future timestamp correctly when defaultCampaignScheduleUnit is minute', () => { const eventLevelSchedule = null; const timestamp = '2023-10-01T00:00:00Z'; - const destConfig = { defaultCampaignScheduleUnit: 'minute', defaultCampaignSchedule: 5 }; + const destConfig = { defaultCampaignScheduleUnit: 'minute', defaultCampaignSchedule: '5' }; const result = deduceSchedule(eventLevelSchedule, timestamp, destConfig); @@ -81,7 +81,7 @@ describe('deduceSchedule', () => { it('should calculate future timestamp correctly when defaultCampaignScheduleUnit is day', () => { const eventLevelSchedule = null; const timestamp = '2023-10-01T00:00:00Z'; - const destConfig = { defaultCampaignScheduleUnit: 'day', defaultCampaignSchedule: 1 }; + const destConfig = { defaultCampaignScheduleUnit: 'day', defaultCampaignSchedule: '1' }; const result = deduceSchedule(eventLevelSchedule, timestamp, destConfig); @@ -90,11 +90,36 @@ describe('deduceSchedule', () => { expect(result).toBe(expectedTimestamp); }); + it('should calculate timestamp when defaultCampaignSchedule in some invalid string', () => { + const eventLevelSchedule = null; + const timestamp = '2023-10-01T00:00:00Z'; + const destConfig = { defaultCampaignScheduleUnit: 'day', defaultCampaignSchedule: 'inValid' }; + + const result = deduceSchedule(eventLevelSchedule, timestamp, destConfig); + const expectedTimestamp = new Date('2023-10-01T00:00:00Z').getTime() / 1000; + + expect(result).toBe(expectedTimestamp); + }); + + it('should calculate timestamp when defaultCampaignSchedule has trailing invalid text and/or leading space', () => { + const eventLevelSchedule = null; + const timestamp = '2023-10-01T00:00:00Z'; + const destConfig = { + defaultCampaignScheduleUnit: 'minute', + defaultCampaignSchedule: ' 5Invalid.String ', + }; + + const result = deduceSchedule(eventLevelSchedule, timestamp, destConfig); + const expectedTimestamp = new Date('2023-10-01T00:05:00Z').getTime() / 1000; + + expect(result).toBe(expectedTimestamp); + }); + // returns UNIX timestamp in seconds it('should return UNIX timestamp in seconds', () => { const eventLevelSchedule = null; const timestamp = '2023-10-01T00:00:00Z'; - const destConfig = { defaultCampaignScheduleUnit: 'minute', defaultCampaignSchedule: 5 }; + const destConfig = { defaultCampaignScheduleUnit: 'minute', defaultCampaignSchedule: '5' }; const result = deduceSchedule(eventLevelSchedule, timestamp, destConfig); diff --git a/src/cdk/v2/destinations/emarsys/utils.test.js b/src/cdk/v2/destinations/emarsys/utils.test.js index 72a86a15294..7709466f1c7 100644 --- a/src/cdk/v2/destinations/emarsys/utils.test.js +++ b/src/cdk/v2/destinations/emarsys/utils.test.js @@ -476,7 +476,10 @@ describe('Emarsys utils', () => { keyId, ); - expect(result).toEqual({ isAbortable: true, errorMsg: '{"errorCode":"errorMessage"}' }); + expect(result).toEqual({ + isAbortable: true, + errorMsg: JSON.stringify({ errorCode: 'errorMessage' }), + }); }); // Returns {isAbortable: true, errorMsg} if event is an object with keyId and has a corresponding error in the errors object. @@ -503,7 +506,10 @@ describe('Emarsys utils', () => { keyId, ); - expect(result).toEqual({ isAbortable: true, errorMsg: '{"errorCode":"errorMessage"}' }); + expect(result).toEqual({ + isAbortable: true, + errorMsg: JSON.stringify({ errorCode: 'errorMessage' }), + }); }); }); diff --git a/src/cdk/v2/destinations/gladly/utils.test.js b/src/cdk/v2/destinations/gladly/utils.test.js index 116f150448f..5663d29d1ec 100644 --- a/src/cdk/v2/destinations/gladly/utils.test.js +++ b/src/cdk/v2/destinations/gladly/utils.test.js @@ -12,18 +12,20 @@ const { formatFieldForEventStream, } = require('./utils'); const { base64Convertor } = require('../../../../v0/util'); +const { generateRandomString } = require('@rudderstack/integrations-lib'); describe('Unit test cases for getHeaders function', () => { it('Should return headers', () => { const destination = { Config: { - apiToken: 'token', + apiToken: generateRandomString(), userName: 'user', }, }; + const authInfo = `${destination.Config.userName}:${destination.Config.apiToken}`; const expectedHeaders = { 'Content-Type': 'application/json', - Authorization: `Basic ${base64Convertor('user:token')}`, + Authorization: `Basic ${base64Convertor(authInfo)}`, }; const result = getHeaders(destination); diff --git a/src/cdk/v2/destinations/http/procWorkflow.yaml b/src/cdk/v2/destinations/http/procWorkflow.yaml index 080dcdd80af..1371eded905 100644 --- a/src/cdk/v2/destinations/http/procWorkflow.yaml +++ b/src/cdk/v2/destinations/http/procWorkflow.yaml @@ -30,35 +30,39 @@ steps: - name: deduceBodyFormat template: | - $.context.format = .destination.Config.format ?? 'JSON'; + const format = .destination.Config.format ?? 'JSON'; + $.context.format = $.CONTENT_TYPES_MAP[format]; - name: buildHeaders template: | const configAuthHeaders = $.getAuthHeaders(.destination.Config); const additionalConfigHeaders = $.getCustomMappings(.message, .destination.Config.headers); + const metadataHeaders = $.metadataHeaders($.context.format); $.context.headers = { ...configAuthHeaders, - ...additionalConfigHeaders + ...additionalConfigHeaders, + ...metadataHeaders, } - name: prepareParams template: | - $.context.params = $.getCustomMappings(.message, .destination.Config.queryParams) + const params = $.getCustomMappings(.message, .destination.Config.queryParams); + $.context.params = $.encodeParamsObject(params); - name: deduceEndPoint template: | - $.context.endpoint = $.addPathParams(.message, .destination.Config.apiUrl); + $.context.endpoint = $.prepareEndpoint(.message, .destination.Config.apiUrl, .destination.Config.pathParams); - name: prepareBody template: | - const payload = $.getCustomMappings(.message, .destination.Config.propertiesMapping); - $.context.payload = $.removeUndefinedAndNullValues($.excludeMappedFields(payload, .destination.Config.propertiesMapping)) - $.context.format === "XML" && !$.isEmptyObject($.context.payload) ? $.context.payload = {payload: $.getXMLPayload($.context.payload)}; + const propertiesMapping = .destination.Config.isDefaultMapping ? [{"to": "$", "from": "$"}] : .destination.Config.propertiesMapping; + const payload = $.getCustomMappings(.message, propertiesMapping); + $.context.payload = $.prepareBody(payload, $.context.format, .destination.Config.xmlRootKey); - name: buildResponseForProcessTransformation template: | const response = $.defaultRequestConfig(); - $.context.format === "JSON" ? response.body.JSON = $.context.payload: response.body.XML = $.context.payload; + response.body[$.context.format] = $.context.payload; response.endpoint = $.context.endpoint; response.headers = $.context.headers; response.method = $.context.method; diff --git a/src/cdk/v2/destinations/http/utils.js b/src/cdk/v2/destinations/http/utils.js index 355eb034870..7657a1cd60a 100644 --- a/src/cdk/v2/destinations/http/utils.js +++ b/src/cdk/v2/destinations/http/utils.js @@ -1,15 +1,22 @@ -const { toXML } = require('jstoxml'); +const { XMLBuilder } = require('fast-xml-parser'); const { groupBy } = require('lodash'); const { createHash } = require('crypto'); const { ConfigurationError } = require('@rudderstack/integrations-lib'); const { BatchUtils } = require('@rudderstack/workflow-engine'); +const jsonpath = require('rs-jsonpath'); const { base64Convertor, applyCustomMappings, isEmptyObject, - applyJSONStringTemplate, + removeUndefinedAndNullRecurse, } = require('../../../../v0/util'); +const CONTENT_TYPES_MAP = { + JSON: 'JSON', + XML: 'XML', + FORM: 'FORM', +}; + const getAuthHeaders = (config) => { let headers; switch (config.auth) { @@ -33,56 +40,119 @@ const getAuthHeaders = (config) => { return headers; }; +const enhanceMappings = (mappings) => { + let enhancedMappings = mappings; + if (Array.isArray(mappings)) { + enhancedMappings = mappings.map((mapping) => { + const enhancedMapping = { ...mapping }; + if ( + mapping.hasOwnProperty('from') && + !mapping.from.includes('$') && + !(mapping.from.startsWith("'") && mapping.from.endsWith("'")) + ) { + enhancedMapping.from = `'${mapping.from}'`; + } + return enhancedMapping; + }); + } + return enhancedMappings; +}; + const getCustomMappings = (message, mapping) => { + const enhancedMappings = enhanceMappings(mapping); try { - return applyCustomMappings(message, mapping); + return applyCustomMappings(message, enhancedMappings); } catch (e) { throw new ConfigurationError(`Error in custom mappings: ${e.message}`); } }; -const addPathParams = (message, apiUrl) => { - try { - return applyJSONStringTemplate(message, `\`${apiUrl}\``); - } catch (e) { - throw new ConfigurationError(`Error in api url template: ${e.message}`); +const encodeParamsObject = (params) => { + if (!params || typeof params !== 'object') { + return {}; // Return an empty object if input is null, undefined, or not an object } + return Object.keys(params) + .filter((key) => params[key] !== undefined) + .reduce((acc, key) => { + acc[encodeURIComponent(key)] = encodeURIComponent(params[key]); + return acc; + }, {}); }; -const excludeMappedFields = (payload, mapping) => { - const rawPayload = { ...payload }; - if (mapping) { - mapping.forEach(({ from, to }) => { - // continue when from === to - if (from === to) return; - - // Remove the '$.' prefix and split the remaining string by '.' - const keys = from.replace(/^\$\./, '').split('.'); - let current = rawPayload; - - // Traverse to the parent of the key to be removed - keys.slice(0, -1).forEach((key) => { - if (current?.[key]) { - current = current[key]; - } else { - current = null; - } - }); - - if (current) { - // Remove the 'from' field from input payload - delete current[keys[keys.length - 1]]; - } - }); +const getPathValueFromJsonpath = (message, path) => { + let finalPath = path; + if (path.includes('/')) { + throw new ConfigurationError('Path value cannot contain "/"'); } + if (path.includes('$')) { + try { + [finalPath = null] = jsonpath.query(message, path); + } catch (error) { + throw new ConfigurationError( + `An error occurred while querying the JSON path: ${error.message}`, + ); + } + if (finalPath === null) { + throw new ConfigurationError('Path not found in the object.'); + } + } + return finalPath; +}; - return rawPayload; +const getPathParamsSubString = (message, pathParamsArray) => { + if (pathParamsArray.length === 0) { + return ''; + } + const pathParamsValuesArray = pathParamsArray.map((pathParam) => + encodeURIComponent(getPathValueFromJsonpath(message, pathParam.path)), + ); + return `/${pathParamsValuesArray.join('/')}`; }; -const getXMLPayload = (payload) => - toXML(payload, { - header: true, - }); +const prepareEndpoint = (message, apiUrl, pathParams) => { + if (!Array.isArray(pathParams)) { + return apiUrl; + } + const requestUrl = apiUrl.replace(/\/{1,10}$/, ''); + const pathParamsSubString = getPathParamsSubString(message, pathParams); + return `${requestUrl}${pathParamsSubString}`; +}; + +const sanitizeKey = (key) => + key + .replace(/[^\w.-]/g, '_') // Replace invalid characters with underscores + .replace(/^[^A-Z_a-z]/, '_'); // Ensure key starts with a letter or underscore + +const preprocessJson = (obj) => { + if (typeof obj !== 'object' || obj === null) { + return obj; // Return primitive values as is + } + + if (Array.isArray(obj)) { + return obj.map(preprocessJson); + } + + return Object.entries(obj).reduce((acc, [key, value]) => { + const sanitizedKey = sanitizeKey(key); + acc[sanitizedKey] = preprocessJson(value); + return acc; + }, {}); +}; + +const getXMLPayload = (payload, rootKey = 'root') => { + const builderOptions = { + ignoreAttributes: false, + suppressEmptyNode: true, + }; + + const builder = new XMLBuilder(builderOptions); + const processesPayload = { + [rootKey]: { + ...preprocessJson(payload), + }, + }; + return `${builder.build(processesPayload)}`; +}; const getMergedEvents = (batch) => { const events = []; @@ -94,6 +164,39 @@ const getMergedEvents = (batch) => { return events; }; +const metadataHeaders = (contentType) => { + switch (contentType) { + case CONTENT_TYPES_MAP.XML: + return { 'Content-Type': 'application/xml' }; + case CONTENT_TYPES_MAP.FORM: + return { 'Content-Type': 'application/x-www-form-urlencoded' }; + default: + return { 'Content-Type': 'application/json' }; + } +}; + +function stringifyFirstLevelValues(obj) { + return Object.entries(obj).reduce((acc, [key, value]) => { + acc[key] = typeof value === 'string' ? value : JSON.stringify(value); + return acc; + }, {}); +} + +const prepareBody = (payload, contentType, xmlRootKey) => { + let responseBody; + removeUndefinedAndNullRecurse(payload); + if (contentType === CONTENT_TYPES_MAP.XML && !isEmptyObject(payload)) { + responseBody = { + payload: getXMLPayload(payload, xmlRootKey), + }; + } else if (contentType === CONTENT_TYPES_MAP.FORM && !isEmptyObject(payload)) { + responseBody = stringifyFirstLevelValues(payload); + } else { + responseBody = payload || {}; + } + return responseBody; +}; + const mergeMetadata = (batch) => batch.map((event) => event.metadata[0]); const createHashKey = (endpoint, headers, params) => { @@ -147,10 +250,14 @@ const batchSuccessfulEvents = (events, batchSize) => { }; module.exports = { + CONTENT_TYPES_MAP, getAuthHeaders, + enhanceMappings, getCustomMappings, - addPathParams, - excludeMappedFields, - getXMLPayload, + encodeParamsObject, + prepareEndpoint, + metadataHeaders, + prepareBody, batchSuccessfulEvents, + stringifyFirstLevelValues, }; diff --git a/src/cdk/v2/destinations/http/utils.test.js b/src/cdk/v2/destinations/http/utils.test.js new file mode 100644 index 00000000000..c5562336351 --- /dev/null +++ b/src/cdk/v2/destinations/http/utils.test.js @@ -0,0 +1,173 @@ +const { + enhanceMappings, + encodeParamsObject, + prepareEndpoint, + prepareBody, + stringifyFirstLevelValues, +} = require('./utils'); + +const { XMLBuilder } = require('fast-xml-parser'); +const jsonpath = require('rs-jsonpath'); + +describe('Utils Functions', () => { + describe('encodeParamsObject', () => { + test('should return empty object for invalid inputs', () => { + expect(encodeParamsObject(null)).toEqual({}); + expect(encodeParamsObject(undefined)).toEqual({}); + expect(encodeParamsObject('string')).toEqual({}); + }); + + test('should encode object keys and values', () => { + const params = { key1: 'value1', key2: 'value2 3 4' }; + const expected = { key1: 'value1', key2: 'value2%203%204' }; + expect(encodeParamsObject(params)).toEqual(expected); + }); + }); + + describe('prepareEndpoint', () => { + test('should replace template variables in API URL', () => { + const message = { id: 123 }; + const apiUrl = 'https://api.example.com/resource/'; + expect(prepareEndpoint(message, apiUrl, [])).toBe('https://api.example.com/resource'); + }); + test('should replace template variables in API URL and add path params', () => { + const message = { id: 123, p2: 'P2' }; + const apiUrl = 'https://api.example.com/resource/'; + const pathParams = [ + { + path: 'p1', + }, + { + path: '$.p2', + }, + ]; + expect(prepareEndpoint(message, apiUrl, pathParams)).toBe( + 'https://api.example.com/resource/p1/P2', + ); + }); + test('should add path params after uri encoding', () => { + const message = { id: 123, p2: 'P2%&' }; + const apiUrl = 'https://api.example.com/resource/'; + const pathParams = [ + { + path: 'p1', + }, + { + path: '$.p2', + }, + ]; + expect(prepareEndpoint(message, apiUrl, pathParams)).toBe( + 'https://api.example.com/resource/p1/P2%25%26', + ); + }); + test('should throw error as path contains slash', () => { + const message = { id: 123, p2: 'P2%&' }; + const apiUrl = 'https://api.example.com/resource/${$.id}'; + const pathParams = [ + { + path: 'p1/', + }, + { + path: '$.p2', + }, + ]; + expect(() => prepareEndpoint(message, apiUrl, pathParams)).toThrowError( + 'Path value cannot contain "/"', + ); + }); + }); + + describe('prepareBody', () => { + test('should prepare XML payload when content type is XML', () => { + const payload = { key: 'value' }; + const expectedXML = 'value'; + const result = prepareBody(payload, 'XML', 'root'); + expect(result).toEqual({ payload: expectedXML }); + }); + + test('should prepare FORM-URLENCODED payload when content type is FORM-URLENCODED', () => { + const payload = { + key1: 'value1', + key2: 'value2', + key3: { subKey: 'value3', subkey2: undefined }, + }; + const expectedFORM = { + key1: 'value1', + key2: 'value2', + key3: JSON.stringify({ subKey: 'value3' }), + }; + const result = prepareBody(payload, 'FORM'); + expect(result).toEqual(expectedFORM); + }); + + test('should return original payload without null or undefined values for other content types', () => { + const payload = { + key1: 'value1', + key2: null, + key3: undefined, + key4: 'value4', + key5: { subKey1: undefined, subKey2: 'value5' }, + }; + const expected = { key1: 'value1', key4: 'value4', key5: { subKey2: 'value5' } }; + const result = prepareBody(payload, 'JSON'); + expect(result).toEqual(expected); + }); + }); + + describe('stringifyFirstLevelValues', () => { + test('converts non-string first-level values to strings', () => { + const input = { a: 1, b: true, c: { d: 42 } }; + const expected = { a: '1', b: 'true', c: JSON.stringify({ d: 42 }) }; + expect(stringifyFirstLevelValues(input)).toEqual(expected); + }); + + test('keeps string values unchanged', () => { + const input = { a: 'hello', b: 'world' }; + expect(stringifyFirstLevelValues(input)).toEqual(input); + }); + + test('handles empty objects', () => { + expect(stringifyFirstLevelValues({})).toEqual({}); + }); + }); + + describe('enhanceMappings function', () => { + test("should wrap 'from' property in single quotes if it is not already wrapped and does not contain '$'", () => { + const input = [{ to: 'a', from: 'b' }]; + const output = enhanceMappings(input); + expect(output).toEqual([{ to: 'a', from: "'b'" }]); + }); + + test("should not modify 'from' property if it is already wrapped in single quotes", () => { + const input = [{ to: 'a', from: "'b'" }]; + const output = enhanceMappings(input); + expect(output).toEqual([{ to: 'a', from: "'b'" }]); + }); + + test("should not modify 'from' property if it contains '$'", () => { + const input = [{ to: 'a', from: '$.b' }]; + const output = enhanceMappings(input); + expect(output).toEqual([{ to: 'a', from: '$.b' }]); + }); + + test('should return an empty array if input is an empty array', () => { + const input = []; + const output = enhanceMappings(input); + expect(output).toEqual([]); + }); + + test('should correctly handle multiple mappings in an array', () => { + const input = [ + { to: 'a', from: 'b' }, + { to: 'x', from: "'y'" }, + { to: 'p', from: '$.q' }, + ]; + const output = enhanceMappings(input); + expect(output).toEqual([ + { to: 'a', from: "'b'" }, + { to: 'x', from: "'y'" }, + { to: 'p', from: '$.q' }, + ]); + }); + }); +}); diff --git a/src/cdk/v2/destinations/intercom/utils.test.js b/src/cdk/v2/destinations/intercom/utils.test.js index e2c1fb9a072..7436f426f22 100644 --- a/src/cdk/v2/destinations/intercom/utils.test.js +++ b/src/cdk/v2/destinations/intercom/utils.test.js @@ -1,5 +1,6 @@ const md5 = require('md5'); const axios = require('axios'); +const { generateRandomString } = require('@rudderstack/integrations-lib'); const { getName, getHeaders, @@ -743,7 +744,7 @@ describe('attachUserAndCompany utility test', () => { }; const Config = { sendAnonymousId: false, - apiKey: 'testApiKey', + apiKey: generateRandomString(), }; const expectedResponse = { @@ -755,7 +756,7 @@ describe('attachUserAndCompany utility test', () => { files: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: `Bearer ${Config.apiKey}`, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', diff --git a/src/cdk/v2/destinations/linkedin_ads/config.js b/src/cdk/v2/destinations/linkedin_ads/config.js index 344980e7d0d..4207e8aa8a2 100644 --- a/src/cdk/v2/destinations/linkedin_ads/config.js +++ b/src/cdk/v2/destinations/linkedin_ads/config.js @@ -3,7 +3,7 @@ const { getMappingConfig } = require('../../../../v0/util'); // ref : https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/conversions-api?view=li-lms-2024-02&tabs=http#adding-multiple-conversion-events-in-a-batch const BATCH_ENDPOINT = 'https://api.linkedin.com/rest/conversionEvents'; const API_HEADER_METHOD = 'BATCH_CREATE'; -const API_VERSION = '202402'; // yyyymm format +const API_VERSION = '202409'; // yyyymm format const API_PROTOCOL_VERSION = '2.0.0'; const CONFIG_CATEGORIES = { diff --git a/src/cdk/v2/destinations/linkedin_ads/utils.test.js b/src/cdk/v2/destinations/linkedin_ads/utils.test.js index d66bda47dc1..822a5f479b7 100644 --- a/src/cdk/v2/destinations/linkedin_ads/utils.test.js +++ b/src/cdk/v2/destinations/linkedin_ads/utils.test.js @@ -10,7 +10,11 @@ const { createResponseArray, checkIfPricePresent, } = require('./utils'); -const { InstrumentationError, ConfigurationError } = require('@rudderstack/integrations-lib'); +const { + InstrumentationError, + ConfigurationError, + generateRandomString, +} = require('@rudderstack/integrations-lib'); const { API_HEADER_METHOD, API_PROTOCOL_VERSION, API_VERSION } = require('./config'); describe('formatEmail', () => { @@ -180,7 +184,7 @@ describe('generateHeader', () => { // Returns a headers object with Content-Type, X-RestLi-Method, X-Restli-Protocol-Version, LinkedIn-Version, and Authorization keys when passed a valid access token. it('should return a headers object with all keys when passed a valid access token', () => { // Arrange - const accessToken = 'validAccessToken'; + const accessToken = generateRandomString(); // Act const result = generateHeader(accessToken); @@ -198,7 +202,7 @@ describe('generateHeader', () => { // Returns a headers object with default values for all keys when passed an invalid access token. it('should return a headers object with default values for all keys when passed an invalid access token', () => { // Arrange - const accessToken = 'invalidAccessToken'; + const accessToken = generateRandomString(); // Act const result = generateHeader(accessToken); diff --git a/src/cdk/v2/destinations/reddit/rtWorkflow.yaml b/src/cdk/v2/destinations/reddit/rtWorkflow.yaml index fd315b381ab..7d3e1653ca0 100644 --- a/src/cdk/v2/destinations/reddit/rtWorkflow.yaml +++ b/src/cdk/v2/destinations/reddit/rtWorkflow.yaml @@ -39,7 +39,7 @@ steps: const dontBatchTrueEvents = $.outputs.successfulEvents{.metadata.dontBatch}[]; const dontBatchFalseEvents = $.outputs.successfulEvents{!.metadata.dontBatch}[]; const dontBatchTrueEventsChunks = $.chunk(dontBatchTrueEvents, 1); - + let batches = [...$.batchEvents(dontBatchFalseEvents), ...$.batchEventChunks(dontBatchTrueEventsChunks)]; batches@batch.({ "batchedRequest": { diff --git a/src/cdk/v2/destinations/zoho/config.js b/src/cdk/v2/destinations/zoho/config.js index d942d9e369d..0eea0c096fd 100644 --- a/src/cdk/v2/destinations/zoho/config.js +++ b/src/cdk/v2/destinations/zoho/config.js @@ -10,8 +10,8 @@ const DATA_CENTRE_BASE_ENDPOINTS_MAP = { }; const getBaseEndpoint = (dataServer) => DATA_CENTRE_BASE_ENDPOINTS_MAP[dataServer]; -const COMMON_RECORD_ENDPOINT = (dataCenter = 'US') => - `${getBaseEndpoint(dataCenter)}/crm/v6/moduleType`; +const COMMON_RECORD_ENDPOINT = (dataCenter) => + `${getBaseEndpoint(dataCenter || 'US')}/crm/v6/moduleType`; // ref: https://www.zoho.com/crm/developer/docs/api/v6/insert-records.html#:~:text=%2DX%20POST-,System%2Ddefined%20mandatory%20fields%20for%20each%20module,-While%20inserting%20records const MODULE_MANDATORY_FIELD_CONFIG = { diff --git a/src/cdk/v2/destinations/zoho/rtWorkflow.yaml b/src/cdk/v2/destinations/zoho/rtWorkflow.yaml index b50b9502e32..fc4aaafd414 100644 --- a/src/cdk/v2/destinations/zoho/rtWorkflow.yaml +++ b/src/cdk/v2/destinations/zoho/rtWorkflow.yaml @@ -1,7 +1,7 @@ bindings: - name: EventType path: ../../../../constants - - name: processRecordInputs + - name: processRecordInputsWrap path: ./transformRecord - name: handleRtTfSingleEventError path: ../../../../v0/util/index @@ -20,7 +20,7 @@ steps: - name: processRecordEvents template: | - await $.processRecordInputs(^.{.message.type === $.EventType.RECORD}[], ^[0].destination) + await $.processRecordInputsWrap(^.{.message.type === $.EventType.RECORD}[], ^[0].destination) - name: failOtherEvents template: | diff --git a/src/cdk/v2/destinations/zoho/transformRecord.js b/src/cdk/v2/destinations/zoho/transformRecord.js index 8f4586e46b4..1e21f9ad817 100644 --- a/src/cdk/v2/destinations/zoho/transformRecord.js +++ b/src/cdk/v2/destinations/zoho/transformRecord.js @@ -13,6 +13,7 @@ const { handleRtTfSingleEventError, isEmptyObject, defaultDeleteRequestConfig, + isEventSentByVDMV2Flow, } = require('../../../../v0/util'); const zohoConfig = require('./config'); const { @@ -24,6 +25,8 @@ const { calculateTrigger, validateConfigurationIssue, } = require('./utils'); + +const { processRecordInputsV2 } = require('./transformRecordV2'); const { REFRESH_TOKEN } = require('../../../../adapters/networkhandler/authConstants'); // Main response builder function @@ -33,7 +36,7 @@ const responseBuilder = ( identifierType, operationModuleType, commonEndPoint, - action, + isUpsert, metadata, ) => { const { trigger, addDefaultDuplicateCheck, multiSelectFieldLevelDecision } = config; @@ -43,7 +46,7 @@ const responseBuilder = ( Authorization: `Zoho-oauthtoken ${metadata[0].secret.accessToken}`, }; - if (action === 'insert' || action === 'update') { + if (isUpsert) { const payload = { duplicate_check_fields: handleDuplicateCheck( addDefaultDuplicateCheck, @@ -70,7 +73,6 @@ const batchResponseBuilder = ( identifierType, operationModuleType, upsertEndPoint, - action, ) => { const upsertResponseArray = []; const deletionResponseArray = []; @@ -101,7 +103,7 @@ const batchResponseBuilder = ( identifierType, operationModuleType, upsertEndPoint, - action, + true, upsertmetadataChunks.items[0], ), ); @@ -115,7 +117,7 @@ const batchResponseBuilder = ( identifierType, operationModuleType, upsertEndPoint, - action, + false, deletionmetadataChunks.items[0], ), ); @@ -198,10 +200,18 @@ const handleDeletion = async ( input, fields, Config, + operationModuleType, + identifierType, transformedResponseToBeBatched, errorResponseList, ) => { - const searchResponse = await searchRecordId(fields, input.metadata, Config); + const searchResponse = await searchRecordId( + fields, + input.metadata, + Config, + operationModuleType, + identifierType, + ); if (searchResponse.erroneous) { const error = handleSearchError(searchResponse); @@ -226,13 +236,13 @@ const handleDeletion = async ( */ const processInput = async ( input, - action, operationModuleType, + identifierType, Config, transformedResponseToBeBatched, errorResponseList, ) => { - const { fields } = input.message; + const { fields, action } = input.message; if (isEmptyObject(fields)) { const emptyFieldsError = new InstrumentationError('`fields` cannot be empty'); @@ -250,7 +260,15 @@ const processInput = async ( errorResponseList, ); } else { - await handleDeletion(input, fields, Config, transformedResponseToBeBatched, errorResponseList); + await handleDeletion( + input, + fields, + Config, + operationModuleType, + identifierType, + transformedResponseToBeBatched, + errorResponseList, + ); } }; @@ -285,7 +303,6 @@ const processRecordInputs = async (inputs, destination) => { const response = []; const errorResponseList = []; const { Config } = destination; - const { action } = inputs[0].message; const transformedResponseToBeBatched = { upsertData: [], @@ -296,14 +313,14 @@ const processRecordInputs = async (inputs, destination) => { const { operationModuleType, identifierType, upsertEndPoint } = deduceModuleInfo(inputs, Config); - validateConfigurationIssue(Config, operationModuleType, action); + validateConfigurationIssue(Config, operationModuleType); await Promise.all( inputs.map((input) => processInput( input, - action, operationModuleType, + identifierType, Config, transformedResponseToBeBatched, errorResponseList, @@ -322,7 +339,6 @@ const processRecordInputs = async (inputs, destination) => { identifierType, operationModuleType, upsertEndPoint, - action, ); if (upsertResponseArray.length === 0 && deletionResponseArray.length === 0) { @@ -335,4 +351,15 @@ const processRecordInputs = async (inputs, destination) => { return [...response, ...errorResponseList]; }; -module.exports = { processRecordInputs }; +const processRecordInputsWrap = async (inputs, destination) => { + if (!inputs || inputs.length === 0) { + return []; + } + const event = inputs[0]; + if (isEventSentByVDMV2Flow(event)) { + return processRecordInputsV2(inputs, destination); + } + return processRecordInputs(inputs, destination); +}; + +module.exports = { processRecordInputsWrap }; diff --git a/src/cdk/v2/destinations/zoho/transformRecordV2.js b/src/cdk/v2/destinations/zoho/transformRecordV2.js new file mode 100644 index 00000000000..a81b10767da --- /dev/null +++ b/src/cdk/v2/destinations/zoho/transformRecordV2.js @@ -0,0 +1,378 @@ +const { + InstrumentationError, + ConfigurationError, + RetryableError, +} = require('@rudderstack/integrations-lib'); +const { BatchUtils } = require('@rudderstack/workflow-engine'); +const { + defaultPostRequestConfig, + defaultRequestConfig, + getSuccessRespEvents, + removeUndefinedAndNullValues, + handleRtTfSingleEventError, + isEmptyObject, + defaultDeleteRequestConfig, + getHashFromArray, +} = require('../../../../v0/util'); +const zohoConfig = require('./config'); +const { + deduceModuleInfoV2, + validatePresenceOfMandatoryPropertiesV2, + formatMultiSelectFieldsV2, + handleDuplicateCheckV2, + searchRecordIdV2, + calculateTrigger, +} = require('./utils'); +const { REFRESH_TOKEN } = require('../../../../adapters/networkhandler/authConstants'); + +// Main response builder function +const responseBuilder = ( + items, + destConfig, + identifierType, + operationModuleType, + commonEndPoint, + isUpsert, + metadata, +) => { + const { trigger, addDefaultDuplicateCheck, multiSelectFieldLevelDecision } = destConfig; + + const response = defaultRequestConfig(); + response.headers = { + Authorization: `Zoho-oauthtoken ${metadata[0].secret.accessToken}`, + }; + + const multiSelectFieldLevelDecisionAcc = getHashFromArray( + multiSelectFieldLevelDecision, + 'from', + 'to', + false, + ); + + if (isUpsert) { + const payload = { + duplicate_check_fields: handleDuplicateCheckV2( + addDefaultDuplicateCheck, + identifierType, + operationModuleType, + ), + data: items, + $append_values: multiSelectFieldLevelDecisionAcc || {}, + trigger: calculateTrigger(trigger), + }; + response.method = defaultPostRequestConfig.requestMethod; + response.body.JSON = removeUndefinedAndNullValues(payload); + response.endpoint = `${commonEndPoint}/upsert`; + } else { + response.endpoint = `${commonEndPoint}?ids=${items.join(',')}&wf_trigger=${trigger !== 'None'}`; + response.method = defaultDeleteRequestConfig.requestMethod; + } + + return response; +}; +const batchResponseBuilder = ( + transformedResponseToBeBatched, + config, + destConfig, + identifierType, + operationModuleType, + upsertEndPoint, +) => { + const upsertResponseArray = []; + const deletionResponseArray = []; + const { upsertData, deletionData, upsertSuccessMetadata, deletionSuccessMetadata } = + transformedResponseToBeBatched; + + const upsertDataChunks = BatchUtils.chunkArrayBySizeAndLength(upsertData, { + maxItems: zohoConfig.MAX_BATCH_SIZE, + }); + + const deletionDataChunks = BatchUtils.chunkArrayBySizeAndLength(deletionData, { + maxItems: zohoConfig.MAX_BATCH_SIZE, + }); + + const upsertmetadataChunks = BatchUtils.chunkArrayBySizeAndLength(upsertSuccessMetadata, { + maxItems: zohoConfig.MAX_BATCH_SIZE, + }); + + const deletionmetadataChunks = BatchUtils.chunkArrayBySizeAndLength(deletionSuccessMetadata, { + maxItems: zohoConfig.MAX_BATCH_SIZE, + }); + + upsertDataChunks.items.forEach((chunk) => { + upsertResponseArray.push( + responseBuilder( + chunk, + destConfig, + identifierType, + operationModuleType, + upsertEndPoint, + true, + upsertmetadataChunks.items[0], + ), + ); + }); + + deletionDataChunks.items.forEach((chunk) => { + deletionResponseArray.push( + responseBuilder( + chunk, + destConfig, + identifierType, + operationModuleType, + upsertEndPoint, + false, + deletionmetadataChunks.items[0], + ), + ); + }); + + return { + upsertResponseArray, + upsertmetadataChunks, + deletionResponseArray, + deletionmetadataChunks, + }; +}; + +/** + * Handles the upsert operation for a specific module type by validating mandatory properties, + * processing the input fields, and updating the response accordingly. + * + * @param {Object} input - The input data for the upsert operation. + * @param {Object} allFields - The fields to be upserted. + * @param {string} operationModuleType - The type of module operation being performed. + * @param {Object} conConfig - The connection configuration object + * @param {Object} transformedResponseToBeBatched - The response object to be batched. + * @param {Array} errorResponseList - The list to store error responses. + * @returns {Promise} - A promise that resolves once the upsert operation is handled. + */ +const handleUpsert = async ( + input, + allFields, + operationModuleType, + destConfig, + transformedResponseToBeBatched, + errorResponseList, +) => { + const eventErroneous = validatePresenceOfMandatoryPropertiesV2(destConfig.object, allFields); + + if (eventErroneous?.status) { + const error = new ConfigurationError( + `${operationModuleType} object must have the ${eventErroneous.missingField.join('", "')} property(ies).`, + ); + errorResponseList.push(handleRtTfSingleEventError(input, error, {})); + } else { + const formattedFields = formatMultiSelectFieldsV2(destConfig, allFields); + transformedResponseToBeBatched.upsertSuccessMetadata.push(input.metadata); + transformedResponseToBeBatched.upsertData.push(formattedFields); + } +}; + +/** + * Handles search errors in Zoho record search. + * If the search response message code is 'INVALID_TOKEN', returns a RetryableError with a specific message and status code. + * Otherwise, returns a ConfigurationError with a message indicating failure to fetch Zoho ID for a record. + * + * @param {Object} searchResponse - The response object from the search operation. + * @returns {RetryableError|ConfigurationError} - The error object based on the search response. + */ +const handleSearchError = (searchResponse) => { + if (searchResponse.message.code === 'INVALID_TOKEN') { + return new RetryableError( + `[Zoho]:: ${JSON.stringify(searchResponse.message)} during zoho record search`, + 500, + searchResponse.message, + REFRESH_TOKEN, + ); + } + if (searchResponse.message.code === 'INSTRUMENTATION_ERROR') { + return new InstrumentationError( + `failed to fetch zoho id for record for: ${searchResponse.message}`, + ); + } + return new ConfigurationError( + `failed to fetch zoho id for record for ${JSON.stringify(searchResponse.message)}`, + ); +}; + +/** + * Asynchronously handles the deletion operation based on the search response. + * + * @param {Object} input - The input object containing metadata and other details. + * @param {Array} fields - The fields to be used for searching the record. + * @param {Object} Config - The configuration object. + * @param {Object} transformedResponseToBeBatched - The object to store transformed response data to be batched. + * @param {Array} errorResponseList - The list to store error responses. + */ +const handleDeletion = async ( + input, + identifiers, + Config, + destConfig, + transformedResponseToBeBatched, + errorResponseList, +) => { + const searchResponse = await searchRecordIdV2(identifiers, input.metadata, Config, destConfig); + + if (searchResponse.erroneous) { + const error = handleSearchError(searchResponse); + errorResponseList.push(handleRtTfSingleEventError(input, error, {})); + } else { + transformedResponseToBeBatched.deletionData.push(...searchResponse.message); + transformedResponseToBeBatched.deletionSuccessMetadata.push(input.metadata); + } +}; + +/** + * Process the input message based on the specified action. + * If the 'fields' in the input message are empty, an error is generated. + * Determines whether to handle an upsert operation or a deletion operation based on the action. + * + * @param {Object} input - The input message containing the fields. + * @param {string} action - The action to be performed ('insert', 'update', or other). + * @param {string} operationModuleType - The type of operation module. + * @param {Object} Config - The configuration object. + * @param {Object} transformedResponseToBeBatched - The object to store transformed responses. + * @param {Array} errorResponseList - The list to store error responses. + * @param {Object} conConfig - The connection configuration object. + */ +const processInput = async ( + input, + operationModuleType, + Config, + transformedResponseToBeBatched, + errorResponseList, + destConfig, +) => { + const { fields, action, identifiers } = input.message; + const allFields = { ...identifiers, ...fields }; + + if (isEmptyObject(allFields)) { + const emptyFieldsError = new InstrumentationError('`fields` cannot be empty'); + errorResponseList.push(handleRtTfSingleEventError(input, emptyFieldsError, {})); + return; + } + + if (action === 'insert' || action === 'update') { + await handleUpsert( + input, + allFields, + operationModuleType, + destConfig, + transformedResponseToBeBatched, + errorResponseList, + ); + } else { + if (isEmptyObject(identifiers)) { + const error = new InstrumentationError('`identifiers` cannot be empty'); + errorResponseList.push(handleRtTfSingleEventError(input, error, {})); + return; + } + + await handleDeletion( + input, + identifiers, + Config, + destConfig, + transformedResponseToBeBatched, + errorResponseList, + ); + } +}; + +/** + * Appends success responses to the main response array. + * + * @param {Array} response - The main response array to which success responses will be appended. + * @param {Array} responseArray - An array of batched responses. + * @param {Array} metadataChunks - An array containing metadata chunks. + * @param {string} destination - The destination for the success responses. + */ +const appendSuccessResponses = (response, responseArray, metadataChunks, destination) => { + responseArray.forEach((batchedResponse, index) => { + response.push( + getSuccessRespEvents(batchedResponse, metadataChunks.items[index], destination, true), + ); + }); +}; + +/** + * Process multiple record inputs for a destination. + * + * @param {Array} inputs - The array of record inputs to be processed. + * @param {Object} destination - The destination object containing configuration. + * @returns {Array} - An array of responses after processing the record inputs. + */ +const processRecordInputsV2 = async (inputs, destination) => { + if (!inputs || inputs.length === 0) { + return []; + } + if (!destination) { + return []; + } + + const response = []; + const errorResponseList = []; + const { Config } = destination; + const { destination: destConfig } = inputs[0].connection?.config || {}; + if (!destConfig) { + throw new ConfigurationError('Connection destination config is required'); + } + const { object, identifierMappings } = destConfig; + if (!object || !identifierMappings) { + throw new ConfigurationError( + 'Object and identifierMappings are required in destination config', + ); + } + + const transformedResponseToBeBatched = { + upsertData: [], + upsertSuccessMetadata: [], + deletionSuccessMetadata: [], + deletionData: [], + }; + + const { operationModuleType, identifierType, upsertEndPoint } = deduceModuleInfoV2( + Config, + destConfig, + ); + + await Promise.all( + inputs.map((input) => + processInput( + input, + operationModuleType, + Config, + transformedResponseToBeBatched, + errorResponseList, + destConfig, + ), + ), + ); + + const { + upsertResponseArray, + upsertmetadataChunks, + deletionResponseArray, + deletionmetadataChunks, + } = batchResponseBuilder( + transformedResponseToBeBatched, + Config, + destConfig, + identifierType, + operationModuleType, + upsertEndPoint, + ); + + if (upsertResponseArray.length === 0 && deletionResponseArray.length === 0) { + return errorResponseList; + } + + appendSuccessResponses(response, upsertResponseArray, upsertmetadataChunks, destination); + appendSuccessResponses(response, deletionResponseArray, deletionmetadataChunks, destination); + + return [...response, ...errorResponseList]; +}; + +module.exports = { processRecordInputsV2 }; diff --git a/src/cdk/v2/destinations/zoho/transformRecordsV2.test.js b/src/cdk/v2/destinations/zoho/transformRecordsV2.test.js new file mode 100644 index 00000000000..f878755f001 --- /dev/null +++ b/src/cdk/v2/destinations/zoho/transformRecordsV2.test.js @@ -0,0 +1,97 @@ +const { processRecordInputsV2 } = require('./transformRecordV2'); + +describe('processRecordInputsV2', () => { + it('should return an empty array if no inputs are provided', async () => { + const result = await processRecordInputsV2([]); + expect(result).toEqual([]); + }); + + it('should return an empty array if no destination is provided', async () => { + const result = await processRecordInputsV2( + [ + { + id: '1', + metadata: {}, + type: 'record', + }, + ], + null, + ); + expect(result).toEqual([]); + }); + + it('should return an empty array if no destination config is provided', async () => { + const result = await processRecordInputsV2([], { + destination: { + config: {}, + }, + }); + expect(result).toEqual([]); + }); + + it('should return an empty array if no connection is provided', async () => { + await expect( + processRecordInputsV2( + [ + { + id: '1', + metadata: {}, + type: 'record', + }, + ], + { + destination: { + Config: { + Region: 'US', + }, + }, + }, + ), + ).rejects.toThrow('Connection destination config is required'); + }); + + it('should return an empty array if no connection destination config is provided', async () => { + await expect( + processRecordInputsV2( + [ + { + id: '1', + metadata: {}, + type: 'record', + connection: {}, + }, + ], + { + destination: { + Config: { + Region: 'US', + }, + }, + }, + ), + ).rejects.toThrow('Connection destination config is required'); + }); + + it('should return an empty array if no object and identifierMappings are provided in destination config', async () => { + await expect( + processRecordInputsV2( + [ + { + id: '1', + metadata: {}, + type: 'record', + destination: { + config: { region: 'US' }, + }, + connection: { + config: { + destination: {}, + }, + }, + }, + ], + { destination: { config: { region: 'US' } } }, + ), + ).rejects.toThrow('Object and identifierMappings are required in destination config'); + }); +}); diff --git a/src/cdk/v2/destinations/zoho/utils.js b/src/cdk/v2/destinations/zoho/utils.js index 4f5c4e86206..a38103ccc19 100644 --- a/src/cdk/v2/destinations/zoho/utils.js +++ b/src/cdk/v2/destinations/zoho/utils.js @@ -1,48 +1,88 @@ const { - MappedToDestinationKey, getHashFromArray, isDefinedAndNotNull, ConfigurationError, isDefinedAndNotNullAndNotEmpty, + removeUndefinedNullEmptyExclBoolInt, + ZOHO_SDK, } = require('@rudderstack/integrations-lib'); -const get = require('get-value'); +const { isEmpty } = require('lodash'); const { getDestinationExternalIDInfoForRetl, isHttpStatusSuccess } = require('../../../../v0/util'); const zohoConfig = require('./config'); const { handleHttpRequest } = require('../../../../adapters/network'); +const { CommonUtils } = require('../../../../util/common'); const deduceModuleInfo = (inputs, Config) => { - const singleRecordInput = inputs[0].message; - const operationModuleInfo = {}; - const mappedToDestination = get(singleRecordInput, MappedToDestinationKey); - if (mappedToDestination) { - const { objectType, identifierType } = getDestinationExternalIDInfoForRetl( - singleRecordInput, - 'ZOHO', - ); - operationModuleInfo.operationModuleType = objectType; - operationModuleInfo.upsertEndPoint = zohoConfig - .COMMON_RECORD_ENDPOINT(Config.region) - .replace('moduleType', objectType); - operationModuleInfo.identifierType = identifierType; + if (!Array.isArray(inputs) || inputs.length === 0) { + return {}; + } + + const firstRecord = inputs[0].message; + const mappedToDestination = firstRecord?.context?.mappedToDestination; + + if (!mappedToDestination) { + return {}; } - return operationModuleInfo; + + const { objectType, identifierType } = getDestinationExternalIDInfoForRetl(firstRecord, 'ZOHO'); + return { + operationModuleType: objectType, + upsertEndPoint: zohoConfig + .COMMON_RECORD_ENDPOINT(Config.region) + .replace('moduleType', objectType), + identifierType, + }; }; -// eslint-disable-next-line consistent-return +const deduceModuleInfoV2 = (Config, destConfig) => { + const { object, identifierMappings } = destConfig; + const identifierType = identifierMappings.map(({ to }) => to); + return { + operationModuleType: object, + upsertEndPoint: ZOHO_SDK.ZOHO.getBaseRecordUrl({ + dataCenter: Config.region, + moduleName: object, + }), + identifierType, + }; +}; + +// Keeping the original function name and return structure function validatePresenceOfMandatoryProperties(objectName, object) { - if (zohoConfig.MODULE_MANDATORY_FIELD_CONFIG.hasOwnProperty(objectName)) { - const requiredFields = zohoConfig.MODULE_MANDATORY_FIELD_CONFIG[objectName]; - const missingFields = - requiredFields.filter( - (field) => !object.hasOwnProperty(field) || !isDefinedAndNotNullAndNotEmpty(object[field]), - ) || []; - return { status: missingFields.length > 0, missingField: missingFields }; + if (!zohoConfig.MODULE_MANDATORY_FIELD_CONFIG.hasOwnProperty(objectName)) { + return undefined; // Maintaining original undefined return for custom objects } - // No mandatory check performed for custom objects + + const requiredFields = zohoConfig.MODULE_MANDATORY_FIELD_CONFIG[objectName]; + const missingFields = requiredFields.filter( + (field) => !object.hasOwnProperty(field) || !isDefinedAndNotNullAndNotEmpty(object[field]), + ); + + return { + status: missingFields.length > 0, + missingField: missingFields, + }; +} + +function validatePresenceOfMandatoryPropertiesV2(objectName, object) { + const { ZOHO } = ZOHO_SDK; + const moduleWiseMandatoryFields = ZOHO.fetchModuleWiseMandatoryFields(objectName); + if (isEmpty(moduleWiseMandatoryFields)) { + return undefined; + } + // All the required field keys are mapped but we need to check they have values + // We have this gurantee because the creation of the configuration doens't permit user to omit the mandatory fields + const missingFields = moduleWiseMandatoryFields.filter( + (field) => object.hasOwnProperty(field) && !isDefinedAndNotNullAndNotEmpty(object[field]), + ); + + return { + status: missingFields.length > 0, + missingField: missingFields, + }; } const formatMultiSelectFields = (config, fields) => { - // Convert multiSelectFieldLevelDecision array into a hash map for quick lookups const multiSelectFields = getHashFromArray( config.multiSelectFieldLevelDecision, 'from', @@ -50,85 +90,205 @@ const formatMultiSelectFields = (config, fields) => { false, ); - Object.keys(fields).forEach((eachFieldKey) => { - if (multiSelectFields.hasOwnProperty(eachFieldKey)) { - // eslint-disable-next-line no-param-reassign - fields[eachFieldKey] = [fields[eachFieldKey]]; + // Creating a shallow copy to avoid mutations + const formattedFields = { ...fields }; + + Object.keys(formattedFields).forEach((eachFieldKey) => { + if ( + multiSelectFields.hasOwnProperty(eachFieldKey) && + isDefinedAndNotNull(formattedFields[eachFieldKey]) + ) { + formattedFields[eachFieldKey] = [formattedFields[eachFieldKey]]; + } + }); + + return formattedFields; +}; + +const formatMultiSelectFieldsV2 = (destConfig, fields) => { + const multiSelectFields = getHashFromArray( + destConfig.multiSelectFieldLevelDecision, + 'from', + 'to', + false, + ); + // Creating a shallow copy to avoid mutations + const formattedFields = { ...fields }; + Object.keys(formattedFields).forEach((eachFieldKey) => { + if ( + multiSelectFields.hasOwnProperty(eachFieldKey) && + isDefinedAndNotNull(formattedFields[eachFieldKey]) + ) { + formattedFields[eachFieldKey] = [formattedFields[eachFieldKey]]; } }); - return fields; + return formattedFields; }; -// Utility to handle duplicate check const handleDuplicateCheck = (addDefaultDuplicateCheck, identifierType, operationModuleType) => { - let duplicateCheckFields = [identifierType]; + let additionalFields = []; if (addDefaultDuplicateCheck) { const moduleDuplicateCheckField = zohoConfig.MODULE_WISE_DUPLICATE_CHECK_FIELD[operationModuleType]; + additionalFields = isDefinedAndNotNull(moduleDuplicateCheckField) + ? moduleDuplicateCheckField + : ['Name']; + } - if (isDefinedAndNotNull(moduleDuplicateCheckField)) { - duplicateCheckFields = [...moduleDuplicateCheckField]; - duplicateCheckFields.unshift(identifierType); - } else { - duplicateCheckFields.push('Name'); // user chosen duplicate field always carries higher priority - } + return Array.from(new Set([identifierType, ...additionalFields])); +}; + +const handleDuplicateCheckV2 = (addDefaultDuplicateCheck, identifierType, operationModuleType) => { + let additionalFields = []; + + if (addDefaultDuplicateCheck) { + const { ZOHO } = ZOHO_SDK; + additionalFields = ZOHO.fetchModuleWiseDuplicateCheckField(operationModuleType); } - return [...new Set(duplicateCheckFields)]; + return Array.from(new Set([...identifierType, ...additionalFields])); }; -function escapeAndEncode(value) { - return encodeURIComponent(value.replace(/([(),\\])/g, '\\$1')); -} +// Zoho has limitation that where clause should be formatted in a specific way +// ref: https://www.zoho.com/crm/developer/docs/api/v6/COQL-Limitations.html +const groupConditions = (conditions) => { + if (conditions.length === 1) { + return conditions[0]; // No need for grouping with a single condition + } + if (conditions.length === 2) { + return `(${conditions[0]} AND ${conditions[1]})`; // Base case + } + return `(${groupConditions(conditions.slice(0, 2))} AND ${groupConditions(conditions.slice(2))})`; +}; -function transformToURLParams(fields, Config) { - const criteria = Object.entries(fields) - .map(([key, value]) => `(${key}:equals:${escapeAndEncode(value)})`) - .join('and'); +// supported data type in where clause +// ref: https://help.zoho.com/portal/en/kb/creator/developer-guide/forms/add-and-manage-fields/articles/understand-fields#Types_of_fields +// ref: https://www.zoho.com/crm/developer/docs/api/v6/Get-Records-through-COQL-Query.html +const generateWhereClause = (fields) => { + const conditions = Object.keys(removeUndefinedNullEmptyExclBoolInt(fields)).map((key) => { + const value = fields[key]; + if (Array.isArray(value)) { + return `${key} = '${value.join(';')}'`; + } + if (typeof value === 'number') { + return `${key} = ${value}`; + } + return `${key} = '${value}'`; + }); - const dataCenter = Config.region; - const regionBasedEndPoint = zohoConfig.DATA_CENTRE_BASE_ENDPOINTS_MAP[dataCenter]; + return conditions.length > 0 ? `WHERE ${groupConditions(conditions)}` : ''; +}; - return `${regionBasedEndPoint}/crm/v6/Leads/search?criteria=${criteria}`; -} +const generateSqlQuery = (module, fields) => { + // Generate the WHERE clause based on the fields + // Limiting to 25 fields + const entries = Object.entries(fields).slice(0, 25); + const whereClause = generateWhereClause(Object.fromEntries(entries)); + if (whereClause === '') { + return ''; + } + + // Construct the SQL query with specific fields in the SELECT clause + return `SELECT id FROM ${module} ${whereClause}`; +}; + +const sendCOQLRequest = async (region, accessToken, object, selectQuery) => { + try { + if (selectQuery === '') { + return { + erroneous: true, + code: 'INSTRUMENTATION_ERROR', + message: `Identifier values are not provided for ${object}`, + }; + } -// ref : https://www.zoho.com/crm/developer/docs/api/v6/search-records.html -const searchRecordId = async (fields, metadata, Config) => { - const searchURL = transformToURLParams(fields, Config); - const searchResult = await handleHttpRequest( - 'get', - searchURL, - { - headers: { - Authorization: `Zoho-oauthtoken ${metadata.secret.accessToken}`, + const searchURL = `${zohoConfig.DATA_CENTRE_BASE_ENDPOINTS_MAP[region]}/crm/v6/coql`; + const searchResult = await handleHttpRequest( + 'post', + searchURL, + { + select_query: selectQuery, }, - }, - { - destType: 'zoho', - feature: 'deleteRecords', - requestMethod: 'GET', - endpointPath: 'crm/v6/Leads/search?criteria=', - module: 'router', - }, - ); - if (!isHttpStatusSuccess(searchResult.processedResponse.status)) { + { + headers: { + Authorization: `Zoho-oauthtoken ${accessToken}`, + }, + }, + { + destType: 'zoho', + feature: 'deleteRecords', + requestMethod: 'POST', + endpointPath: searchURL, + module: 'router', + }, + ); + + if (!isHttpStatusSuccess(searchResult.processedResponse.status)) { + return { + erroneous: true, + message: searchResult.processedResponse.response, + }; + } + + if ( + searchResult.processedResponse.status === 204 || + !CommonUtils.isNonEmptyArray(searchResult.processedResponse.response?.data) + ) { + return { + erroneous: true, + message: `No ${object} is found with record details`, + }; + } + + return { + erroneous: false, + message: searchResult.processedResponse.response.data.map((record) => record.id), + }; + } catch (error) { + return { + erroneous: true, + message: error.message, + }; + } +}; + +const searchRecordId = async (fields, metadata, Config, operationModuleType, identifierType) => { + try { + const { region } = Config; + + const selectQuery = generateSqlQuery(operationModuleType, { + [identifierType]: fields[identifierType], + }); + const result = await sendCOQLRequest( + region, + metadata.secret.accessToken, + operationModuleType, + selectQuery, + ); + return result; + } catch (error) { return { erroneous: true, - message: searchResult.processedResponse.response, + message: error.message, }; } - if (searchResult.processedResponse.status === 204) { +}; + +const searchRecordIdV2 = async (identifiers, metadata, Config, destConfig) => { + try { + const { region } = Config; + const { object } = destConfig; + + const selectQuery = generateSqlQuery(object, identifiers); + const result = await sendCOQLRequest(region, metadata.secret.accessToken, object, selectQuery); + return result; + } catch (error) { return { erroneous: true, - message: 'No contact is found with record details', + message: error.message, }; } - const recordIds = searchResult.processedResponse.response.data.map((record) => record.id); - return { - erroneous: false, - message: recordIds, - }; }; // ref : https://www.zoho.com/crm/developer/docs/api/v6/upsert-records.html#:~:text=The%20trigger%20input%20can%20be%20workflow%2C%20approval%2C%20or%20blueprint.%20If%20the%20trigger%20is%20not%20mentioned%2C%20the%20workflows%2C%20approvals%20and%20blueprints%20related%20to%20the%20API%20will%20get%20executed.%20Enter%20the%20trigger%20value%20as%20%5B%5D%20to%20not%20execute%20the%20workflows. @@ -142,18 +302,15 @@ const calculateTrigger = (trigger) => { return [trigger]; }; -const validateConfigurationIssue = (Config, operationModuleType, action) => { +const validateConfigurationIssue = (Config, operationModuleType) => { const hashMapMultiselect = getHashFromArray( Config.multiSelectFieldLevelDecision, 'from', 'to', false, ); - if ( - Object.keys(hashMapMultiselect).length > 0 && - Config.module !== operationModuleType && - action !== 'delete' - ) { + + if (Object.keys(hashMapMultiselect).length > 0 && Config.module !== operationModuleType) { throw new ConfigurationError( 'Object Chosen in Visual Data Mapper is not consistent with Module type selected in destination configuration. Aborting Events.', ); @@ -162,11 +319,15 @@ const validateConfigurationIssue = (Config, operationModuleType, action) => { module.exports = { deduceModuleInfo, + deduceModuleInfoV2, validatePresenceOfMandatoryProperties, + validatePresenceOfMandatoryPropertiesV2, formatMultiSelectFields, + formatMultiSelectFieldsV2, handleDuplicateCheck, + handleDuplicateCheckV2, searchRecordId, - transformToURLParams, + searchRecordIdV2, calculateTrigger, validateConfigurationIssue, }; diff --git a/src/cdk/v2/destinations/zoho/utils.test.js b/src/cdk/v2/destinations/zoho/utils.test.js index 5a11794ef57..cf8e5a7ab71 100644 --- a/src/cdk/v2/destinations/zoho/utils.test.js +++ b/src/cdk/v2/destinations/zoho/utils.test.js @@ -1,263 +1,1030 @@ +jest.mock('../../../../adapters/network'); +const { ConfigurationError } = require('@rudderstack/integrations-lib'); +const { handleHttpRequest } = require('../../../../adapters/network'); const { handleDuplicateCheck, deduceModuleInfo, + deduceModuleInfoV2, validatePresenceOfMandatoryProperties, - formatMultiSelectFields, validateConfigurationIssue, + formatMultiSelectFields, + formatMultiSelectFieldsV2, + calculateTrigger, + searchRecordId, + searchRecordIdV2, } = require('./utils'); -const { ConfigurationError } = require('@rudderstack/integrations-lib'); - describe('handleDuplicateCheck', () => { - // Returns identifierType when addDefaultDuplicateCheck is false - it('should return identifierType when addDefaultDuplicateCheck is false', () => { - const identifierType = 'email'; - const addDefaultDuplicateCheck = false; - const operationModuleType = 'Leads'; - const moduleWiseDuplicateCheckField = {}; - - const result = handleDuplicateCheck( - addDefaultDuplicateCheck, - identifierType, - operationModuleType, - moduleWiseDuplicateCheckField, - ); - - expect(result).toEqual([identifierType]); - }); + const testCases = [ + { + name: 'should return identifierType when addDefaultDuplicateCheck is false', + input: { + identifierType: 'email', + addDefaultDuplicateCheck: false, + operationModuleType: 'Leads', + moduleWiseDuplicateCheckField: {}, + }, + expected: ['email'], + }, + { + name: 'handles valid operationModuleType and already included identifierType', + input: { + identifierType: 'Email', + addDefaultDuplicateCheck: true, + operationModuleType: 'Leads', + }, + expected: ['Email'], + }, + { + name: "should return identifierType and 'Name' when addDefaultDuplicateCheck is true and moduleDuplicateCheckField is not defined", + input: { + identifierType: 'id', + addDefaultDuplicateCheck: true, + operationModuleType: 'type3', + }, + expected: ['id', 'Name'], + }, + { + name: 'should handle null values in moduleWiseDuplicateCheckField', + input: { + identifierType: 'Identifier', + addDefaultDuplicateCheck: true, + operationModuleType: 'type1', + }, + expected: ['Identifier', 'Name'], + }, + ]; - it('Handles valid operationModuleType and already included identifierType', () => { - const identifierType = 'Email'; - const addDefaultDuplicateCheck = true; - const operationModuleType = 'Leads'; + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + const result = handleDuplicateCheck( + input.addDefaultDuplicateCheck, + input.identifierType, + input.operationModuleType, + input.moduleWiseDuplicateCheckField, + ); + expect(result).toEqual(expected); + }); + }); +}); - const result = handleDuplicateCheck( - addDefaultDuplicateCheck, - identifierType, - operationModuleType, - ); +describe('formatMultiSelectFields', () => { + const testCases = [ + { + name: 'should convert a field value to an array if a mapping exists in multiSelectFieldLevelDecision', + input: { + config: { + multiSelectFieldLevelDecision: [{ from: 'tags', to: 'tagsArray' }], + }, + fields: { tags: 'value' }, + }, + expected: { tags: ['value'] }, + }, + { + name: 'should leave fields unchanged if mapping fields exists but null', + input: { + config: { + multiSelectFieldLevelDecision: [{ from: 'tags', to: 'tagsArray' }], + }, + fields: { tags: null, other: 'val' }, + }, + expected: { tags: null, other: 'val' }, + }, + { + name: 'should leave fields unchanged if no mapping exists', + input: { + config: { + multiSelectFieldLevelDecision: [{ from: 'categories', to: 'catArray' }], + }, + fields: { tags: 'value', other: 'val' }, + }, + expected: { tags: 'value', other: 'val' }, + }, + ]; - expect(result).toEqual(['Email']); + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + const result = formatMultiSelectFields(input.config, { ...input.fields }); + expect(result).toEqual(expected); + }); }); +}); - // Returns identifierType and 'Name' when addDefaultDuplicateCheck is true and moduleDuplicateCheckField is not defined - it("should return identifierType and 'Name' when addDefaultDuplicateCheck is true and moduleDuplicateCheckField is not defined", () => { - const identifierType = 'id'; - const operationModuleType = 'type3'; - const addDefaultDuplicateCheck = true; - - const result = handleDuplicateCheck( - addDefaultDuplicateCheck, - identifierType, - operationModuleType, - ); +describe('formatMultiSelectFieldsV2', () => { + const testCases = [ + { + name: 'should convert a field value to an array if a mapping exists in multiSelectFieldLevelDecision', + input: { + config: { + multiSelectFieldLevelDecision: [{ from: 'tags', to: 'true' }], + }, + fields: { tags: 'value' }, + }, + expected: { tags: ['value'] }, + }, + { + name: 'should leave fields unchanged if mapping fields exists but null', + input: { + config: { + multiSelectFieldLevelDecision: [{ from: 'tags', to: 'true' }], + }, + fields: { tags: null, other: 'val' }, + }, + expected: { tags: null, other: 'val' }, + }, + { + name: 'should leave fields unchanged if no mapping exists', + input: { + config: { + multiSelectFieldLevelDecision: [{ from: 'categories', to: 'true' }], + }, + fields: { tags: 'value', other: 'val' }, + }, + expected: { tags: 'value', other: 'val' }, + }, + ]; - expect(result).toEqual(['id', 'Name']); + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + const result = formatMultiSelectFieldsV2(input.config, { ...input.fields }); + expect(result).toEqual(expected); + }); }); +}); - // Handles null values in moduleWiseDuplicateCheckField - it('should handle null values in moduleWiseDuplicateCheckField', () => { - const addDefaultDuplicateCheck = true; - const identifierType = 'Identifier'; - const operationModuleType = 'type1'; - - const result = handleDuplicateCheck( - addDefaultDuplicateCheck, - identifierType, - operationModuleType, - ); +describe('calculateTrigger', () => { + const testCases = [ + { + name: 'should return null when trigger is "Default"', + input: 'Default', + expected: null, + }, + { + name: 'should return an empty array when trigger is "None"', + input: 'None', + expected: [], + }, + { + name: 'should return an array containing the trigger for Custom', + input: 'Custom', + expected: ['Custom'], + }, + { + name: 'should return an array containing the trigger for Approval', + input: 'Approval', + expected: ['Approval'], + }, + ]; - expect(result).toEqual(['Identifier', 'Name']); + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + expect(calculateTrigger(input)).toEqual(expected); + }); }); }); -describe('deduceModuleInfo', () => { - const Config = { region: 'US' }; +describe('searchRecordId', () => { + const module = 'Leads'; + const mockFields = { Email: 'test@example.com', Name: 'John Doe' }; + const mockMetadata = { secret: { accessToken: 'mock-token' } }; + const mockConfig = { region: 'US' }; + const mockQuery = "SELECT id FROM Leads WHERE Email = 'test@example.com'"; - it('should return empty object when mappedToDestination is not present', () => { - const inputs = [{}]; - const result = deduceModuleInfo(inputs, Config); - expect(result).toEqual({}); + beforeEach(() => { + jest.clearAllMocks(); }); - it('should return operationModuleInfo when mappedToDestination is present', () => { - const inputs = [ - { - message: { - context: { - externalId: [{ type: 'ZOHO-Leads', id: '12345', identifierType: 'Email' }], - mappedToDestination: true, + const testCases = [ + { + fields: mockFields, + module, + query: mockQuery, + name: 'should handle non-array response data', + identifierType: 'Email', + response: { + processedResponse: { + status: 200, + response: { + data: 'not-an-array', }, }, }, - ]; - - const result = deduceModuleInfo(inputs, Config); - expect(result).toEqual({ - operationModuleType: 'Leads', - upsertEndPoint: 'https://www.zohoapis.com/crm/v6/Leads', + expected: { + erroneous: true, + message: 'No Leads is found with record details', + }, + }, + { + fields: mockFields, + query: mockQuery, + module, + name: 'should handle missing response data property', + identifierType: 'Email', + response: { + processedResponse: { + status: 200, + response: {}, + }, + }, + expected: { + erroneous: true, + message: 'No Leads is found with record details', + }, + }, + { + fields: mockFields, + query: mockQuery, + module, + name: 'should handle null response data', + identifierType: 'Email', + response: { + processedResponse: { + status: 200, + response: { + data: null, + }, + }, + }, + expected: { + erroneous: true, + message: 'No Leads is found with record details', + }, + }, + { + fields: mockFields, + query: mockQuery, + module, + name: 'should handle empty array response data', + identifierType: 'Email', + response: { + processedResponse: { + status: 200, + response: { + data: [], + }, + }, + }, + expected: { + erroneous: true, + message: 'No Leads is found with record details', + }, + }, + { + fields: mockFields, + query: mockQuery, + module, + name: 'should handle valid array response data with single record', + identifierType: 'Email', + response: { + processedResponse: { + status: 200, + response: { + data: [{ id: '123' }], + }, + }, + }, + expected: { + erroneous: false, + message: ['123'], + }, + }, + { + fields: mockFields, + query: mockQuery, + module, + name: 'should handle non-success HTTP status code', identifierType: 'Email', + response: { + processedResponse: { + status: 400, + response: 'Bad Request Error', + }, + }, + expected: { + erroneous: true, + message: 'Bad Request Error', + }, + }, + { + fields: mockFields, + query: mockQuery, + module, + name: 'should handle HTTP request error', + identifierType: 'Email', + error: new Error('Network Error'), + expected: { + erroneous: true, + message: 'Network Error', + }, + }, + ]; + + testCases.forEach(({ name, response, error, expected, query, fields, identifierType }) => { + it(name, async () => { + if (error) { + handleHttpRequest.mockRejectedValueOnce(error); + } else { + handleHttpRequest.mockResolvedValueOnce(response); + } + + const result = await searchRecordId(fields, mockMetadata, mockConfig, module, identifierType); + expect(handleHttpRequest).toHaveBeenCalledWith( + 'post', + 'https://www.zohoapis.com/crm/v6/coql', + { + select_query: query, + }, + { + headers: { + Authorization: `Zoho-oauthtoken ${mockMetadata.secret.accessToken}`, + }, + }, + { + destType: 'zoho', + feature: 'deleteRecords', + requestMethod: 'POST', + endpointPath: 'https://www.zohoapis.com/crm/v6/coql', + module: 'router', + }, + ); + + expect(result).toEqual(expected); }); }); - it('should handle different regions in config', () => { - const inputs = [ - { - message: { - context: { - externalId: [{ type: 'ZOHO-Leads', id: '12345', identifierType: 'Email' }], - mappedToDestination: 'true', + const testCases2 = [ + { + fields: { + Email: '', + phone: null, + jobs: [], + }, + query: mockQuery, + module, + identifierType: 'Email', + name: 'should return intrumentation error when identifier value is empty', + response: { + processedResponse: { + status: 200, + response: { + data: [{ id: '123' }], }, }, }, - ]; - const Config = { region: 'EU' }; + expected: { + erroneous: true, + code: 'INSTRUMENTATION_ERROR', + message: 'Identifier values are not provided for Leads', + }, + }, + ]; - const result = deduceModuleInfo(inputs, Config); - expect(result).toEqual({ - operationModuleType: 'Leads', - upsertEndPoint: 'https://www.zohoapis.eu/crm/v6/Leads', - identifierType: 'Email', + testCases2.forEach(({ name, expected, fields, identifierType }) => { + it(name, async () => { + const result = await searchRecordId(fields, mockMetadata, mockConfig, module, identifierType); + expect(result).toEqual(expected); }); }); }); -describe('validatePresenceOfMandatoryProperties', () => { - it('should not throw an error if the object has all required fields', () => { - const objectName = 'Leads'; - const object = { Last_Name: 'Doe' }; - - expect(() => validatePresenceOfMandatoryProperties(objectName, object)).not.toThrow(); - }); - - it('should return missing field if mandatory field contains empty string', () => { - const objectName = 'Leads'; - const object = { Last_Name: '' }; +describe('searchRecordIdV2', () => { + const mockFields = { Email: 'test@example.com' }; + const mockMetadata = { secret: { accessToken: 'mock-token' } }; + const mockConfig = { region: 'US' }; + const mockConConfig = { + destination: { + object: 'Leads', + identifierMappings: [{ to: 'Email', from: 'Email' }], + }, + }; + const mockQuery = "SELECT id FROM Leads WHERE Email = 'test@example.com'"; - const result = validatePresenceOfMandatoryProperties(objectName, object); - - expect(result).toEqual({ missingField: ['Last_Name'], status: true }); + beforeEach(() => { + jest.clearAllMocks(); }); - it('should return missing field if mandatory field contains empty null', () => { - const objectName = 'Leads'; - const object = { Last_Name: null }; - - const result = validatePresenceOfMandatoryProperties(objectName, object); - - expect(result).toEqual({ missingField: ['Last_Name'], status: true }); - }); + const testCases = [ + { + fields: mockFields, + module: mockConConfig.destination.object, + query: mockQuery, + name: 'should handle non-array response data', + response: { + processedResponse: { + status: 200, + response: { + data: 'not-an-array', + }, + }, + }, + expected: { + erroneous: true, + message: 'No Leads is found with record details', + }, + }, + { + fields: mockFields, + query: mockQuery, + module: mockConConfig.destination.object, + name: 'should handle missing response data property', + response: { + processedResponse: { + status: 200, + response: {}, + }, + }, + expected: { + erroneous: true, + message: 'No Leads is found with record details', + }, + }, + { + fields: mockFields, + query: mockQuery, + module: mockConConfig.destination.object, + name: 'should handle null response data', + response: { + processedResponse: { + status: 200, + response: { + data: null, + }, + }, + }, + expected: { + erroneous: true, + message: 'No Leads is found with record details', + }, + }, + { + fields: mockFields, + query: mockQuery, + module: mockConConfig.destination.object, + name: 'should handle empty array response data', + response: { + processedResponse: { + status: 200, + response: { + data: [], + }, + }, + }, + expected: { + erroneous: true, + message: 'No Leads is found with record details', + }, + }, + { + fields: mockFields, + query: mockQuery, + module: mockConConfig.destination.object, + name: 'should handle valid array response data with single record', + response: { + processedResponse: { + status: 200, + response: { + data: [{ id: '123' }], + }, + }, + }, + expected: { + erroneous: false, + message: ['123'], + }, + }, + { + fields: { + Name: 'rid1927ce14265c006ae11555ec6e1cdbbac', + Name1: 'Liam Bailey', + Has_Chargeback: true, + Last_Client_Purchase: '2021-06-15T00:00:00Z', + Purchase_Category: ['category1', 'category2'], + Lifetime_Client_Revenue: 1200, + Name2: 'Olivia Smith', + Has_Chargeback2: false, + Last_Client_Purchase2: '2022-01-10T00:00:00Z', + Purchase_Category2: ['category3', 'category4'], + Lifetime_Client_Revenue2: 800, + Name3: 'Noah Johnson', + Has_Chargeback3: true, + Last_Client_Purchase3: '2023-03-22T00:00:00Z', + Purchase_Category3: ['category5'], + Lifetime_Client_Revenue3: 1500, + Name4: 'Emma Davis', + Has_Chargeback4: false, + Last_Client_Purchase4: '2023-07-01T00:00:00Z', + Purchase_Category4: ['category6', 'category7'], + Lifetime_Client_Revenue4: 900, + Name5: 'James Wilson', + Has_Chargeback5: true, + Last_Client_Purchase5: '2022-11-05T00:00:00Z', + Purchase_Category5: ['category8'], + Lifetime_Client_Revenue5: 1100, + Name6: 'Sophia Miller', + Has_Chargeback6: false, + Last_Client_Purchase6: '2024-01-12T00:00:00Z', + Purchase_Category6: ['category9', 'category10'], + Lifetime_Client_Revenue6: 1300, + }, + module: mockConConfig.destination.object, + query: + "SELECT id FROM Leads WHERE ((Name = 'rid1927ce14265c006ae11555ec6e1cdbbac' AND Name1 = 'Liam Bailey') AND ((Has_Chargeback = 'true' AND Last_Client_Purchase = '2021-06-15T00:00:00Z') AND ((Purchase_Category = 'category1;category2' AND Lifetime_Client_Revenue = 1200) AND ((Name2 = 'Olivia Smith' AND Has_Chargeback2 = 'false') AND ((Last_Client_Purchase2 = '2022-01-10T00:00:00Z' AND Purchase_Category2 = 'category3;category4') AND ((Lifetime_Client_Revenue2 = 800 AND Name3 = 'Noah Johnson') AND ((Has_Chargeback3 = 'true' AND Last_Client_Purchase3 = '2023-03-22T00:00:00Z') AND ((Purchase_Category3 = 'category5' AND Lifetime_Client_Revenue3 = 1500) AND ((Name4 = 'Emma Davis' AND Has_Chargeback4 = 'false') AND ((Last_Client_Purchase4 = '2023-07-01T00:00:00Z' AND Purchase_Category4 = 'category6;category7') AND ((Lifetime_Client_Revenue4 = 900 AND Name5 = 'James Wilson') AND ((Has_Chargeback5 = 'true' AND Last_Client_Purchase5 = '2022-11-05T00:00:00Z') AND Purchase_Category5 = 'category8'))))))))))))", + name: 'should handle valid array response data with multiple records', + response: { + processedResponse: { + status: 200, + response: { + data: [{ id: '123' }, { id: '456' }], + }, + }, + }, + expected: { + erroneous: false, + message: ['123', '456'], + }, + }, + { + fields: mockFields, + query: mockQuery, + module: mockConConfig.destination.object, + name: 'should handle non-success HTTP status code', + response: { + processedResponse: { + status: 400, + response: 'Bad Request Error', + }, + }, + expected: { + erroneous: true, + message: 'Bad Request Error', + }, + }, + { + fields: mockFields, + query: mockQuery, + module: mockConConfig.destination.object, + name: 'should handle HTTP request error', + error: new Error('Network Error'), + expected: { + erroneous: true, + message: 'Network Error', + }, + }, + ]; - it('should not throw an error if the objectName is not in MODULE_MANDATORY_FIELD_CONFIG', () => { - const objectName = 'CustomObject'; - const object = { Some_Field: 'Some Value' }; + testCases.forEach(({ name, response, error, expected, query, fields }) => { + it(name, async () => { + if (error) { + handleHttpRequest.mockRejectedValueOnce(error); + } else { + handleHttpRequest.mockResolvedValueOnce(response); + } - expect(() => validatePresenceOfMandatoryProperties(objectName, object)).not.toThrow(); - }); + const result = await searchRecordIdV2( + fields, + mockMetadata, + mockConfig, + mockConConfig.destination, + ); + expect(handleHttpRequest).toHaveBeenCalledWith( + 'post', + 'https://www.zohoapis.com/crm/v6/coql', + { + select_query: query, + }, + { + headers: { + Authorization: `Zoho-oauthtoken ${mockMetadata.secret.accessToken}`, + }, + }, + { + destType: 'zoho', + feature: 'deleteRecords', + requestMethod: 'POST', + endpointPath: 'https://www.zohoapis.com/crm/v6/coql', + module: 'router', + }, + ); - it('should throw an error if the object is missing multiple required fields', () => { - const objectName = 'Deals'; - const object = { Deal_Name: 'Big Deal' }; - const output = validatePresenceOfMandatoryProperties(objectName, object); - expect(output).toEqual({ - missingField: ['Stage', 'Pipeline'], - status: true, + expect(result).toEqual(expected); }); }); - it('should not throw an error if the object has all required fields for Deals', () => { - const objectName = 'Deals'; - const object = { Deal_Name: 'Big Deal', Stage: 'Negotiation', Pipeline: 'Sales' }; + const testCases2 = [ + { + fields: { + Email: '', + phone: null, + jobs: [], + }, + query: mockQuery, + module: mockConConfig.destination.object, + name: 'should return intrumentation error when identifier value is empty', + response: { + processedResponse: { + status: 200, + response: { + data: [{ id: '123' }], + }, + }, + }, + expected: { + erroneous: true, + code: 'INSTRUMENTATION_ERROR', + message: 'Identifier values are not provided for Leads', + }, + }, + ]; - expect(() => validatePresenceOfMandatoryProperties(objectName, object)).not.toThrow(); + testCases2.forEach(({ name, expected, fields }) => { + it(name, async () => { + const result = await searchRecordIdV2( + fields, + mockMetadata, + mockConfig, + mockConConfig.destination, + ); + expect(result).toEqual(expected); + }); }); }); -describe('validateConfigurationIssue', () => { - test('should throw ConfigurationError when hashMapMultiselect is not empty, Config.module is different from operationModuleType, and action is not delete', () => { - const Config = { - multiSelectFieldLevelDecision: [{ from: 'field1', to: 'true' }], - module: 'moduleA', - }; - const operationModuleType = 'moduleB'; - const action = 'create'; - - expect(() => validateConfigurationIssue(Config, operationModuleType, action)).toThrow( - ConfigurationError, - ); - expect(() => validateConfigurationIssue(Config, operationModuleType, action)).toThrow( - 'Object Chosen in Visual Data Mapper is not consistent with Module type selected in destination configuration. Aborting Events.', - ); - }); - - test('should not throw an error when hashMapMultiselect is not empty, Config.module is the same as operationModuleType, and action is not delete', () => { - const Config = { - multiSelectFieldLevelDecision: [{ from: 'field1', to: 'true' }], - module: 'moduleA', - }; - const operationModuleType = 'moduleA'; - const action = 'create'; - - expect(() => validateConfigurationIssue(Config, operationModuleType, action)).not.toThrow(); - }); - - test('should not throw an error when hashMapMultiselect is empty, Config.module is different from operationModuleType, and action is not delete', () => { - const Config = { - multiSelectFieldLevelDecision: [], - module: 'moduleA', - }; - const operationModuleType = 'moduleB'; - const action = 'create'; +describe('deduceModuleInfo', () => { + const testCases = [ + { + name: 'should return empty object when mappedToDestination is not present', + input: { + inputs: [{}], + config: { region: 'US' }, + }, + expected: {}, + }, + { + name: 'should return operationModuleInfo when mappedToDestination is present', + input: { + inputs: [ + { + message: { + context: { + externalId: [{ type: 'ZOHO-Leads', id: '12345', identifierType: 'Email' }], + mappedToDestination: true, + }, + }, + }, + ], + config: { region: 'US' }, + }, + expected: { + operationModuleType: 'Leads', + upsertEndPoint: 'https://www.zohoapis.com/crm/v6/Leads', + identifierType: 'Email', + }, + }, + { + name: 'should handle different regions in config', + input: { + inputs: [ + { + message: { + context: { + externalId: [{ type: 'ZOHO-Leads', id: '12345', identifierType: 'Email' }], + mappedToDestination: 'true', + }, + }, + }, + ], + config: { region: 'EU' }, + }, + expected: { + operationModuleType: 'Leads', + upsertEndPoint: 'https://www.zohoapis.eu/crm/v6/Leads', + identifierType: 'Email', + }, + }, + { + name: 'should handle null input', + input: { + inputs: null, + config: {}, + }, + expected: {}, + }, + { + name: 'should handle undefined input', + input: { + inputs: undefined, + config: {}, + }, + expected: {}, + }, + { + name: 'should handle non-array input', + input: { + inputs: 'not an array', + config: {}, + }, + expected: {}, + }, + { + name: 'should handle empty array', + input: { + inputs: [], + config: {}, + }, + expected: {}, + }, + { + name: 'should use default US region when config.region is null', + input: { + inputs: [ + { + message: { + context: { + externalId: [{ type: 'ZOHO-Leads', id: '12345', identifierType: 'Email' }], + mappedToDestination: true, + }, + }, + }, + ], + config: { region: null }, + }, + expected: { + operationModuleType: 'Leads', + upsertEndPoint: 'https://www.zohoapis.com/crm/v6/Leads', + identifierType: 'Email', + }, + }, + { + name: 'should use default US region when config.region is undefined', + input: { + inputs: [ + { + message: { + context: { + externalId: [{ type: 'ZOHO-Leads', id: '12345', identifierType: 'Email' }], + mappedToDestination: true, + }, + }, + }, + ], + config: {}, // region is undefined + }, + expected: { + operationModuleType: 'Leads', + upsertEndPoint: 'https://www.zohoapis.com/crm/v6/Leads', + identifierType: 'Email', + }, + }, + ]; - expect(() => validateConfigurationIssue(Config, operationModuleType, action)).not.toThrow(); + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + const result = deduceModuleInfo(input.inputs, input.config); + expect(result).toEqual(expected); + }); }); +}); - test('should not throw an error when hashMapMultiselect is empty, Config.module is the same as operationModuleType, and action is not delete', () => { - const Config = { - multiSelectFieldLevelDecision: [], - module: 'moduleA', - }; - const operationModuleType = 'moduleA'; - const action = 'create'; +describe('deduceModuleInfoV2', () => { + const testCases = [ + { + name: 'should return operationModuleInfo, upsertEndPoint and identifierType when conConfig is present', + input: { + config: { region: 'US' }, + destination: { + object: 'Leads', + identifierMappings: [{ to: 'Email', from: 'Email' }], + }, + }, + expected: { + operationModuleType: 'Leads', + upsertEndPoint: 'https://www.zohoapis.com/crm/v6/Leads', + identifierType: ['Email'], + }, + }, + { + name: 'should handle different regions in config', + input: { + config: { region: 'EU' }, + destination: { + object: 'Leads', + identifierMappings: [{ to: 'Email', from: 'Email' }], + }, + }, + expected: { + operationModuleType: 'Leads', + upsertEndPoint: 'https://www.zohoapis.eu/crm/v6/Leads', + identifierType: ['Email'], + }, + }, + { + name: 'should use default US region when config.region is null', + input: { + config: {}, + destination: { + object: 'Leads', + identifierMappings: [{ to: 'Email', from: 'Email' }], + }, + }, + expected: { + operationModuleType: 'Leads', + upsertEndPoint: 'https://www.zohoapis.com/crm/v6/Leads', + identifierType: ['Email'], + }, + }, + { + name: 'should use default US region when config.region is undefined', + input: { + config: {}, // region is undefined + destination: { + object: 'Leads', + identifierMappings: [{ to: 'Email', from: 'Email' }], + }, + }, + expected: { + operationModuleType: 'Leads', + upsertEndPoint: 'https://www.zohoapis.com/crm/v6/Leads', + identifierType: ['Email'], + }, + }, + ]; - expect(() => validateConfigurationIssue(Config, operationModuleType, action)).not.toThrow(); + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + const result = deduceModuleInfoV2(input.config, input.destination); + expect(result).toEqual(expected); + }); }); +}); - test('should not throw an error when multiSelectFieldLevelDecision has entries without from key', () => { - const Config = { - multiSelectFieldLevelDecision: [{ to: 'true' }], - module: 'moduleA', - }; - const operationModuleType = 'moduleB'; - const action = 'create'; - - expect(() => validateConfigurationIssue(Config, operationModuleType, action)).not.toThrow(); - }); +describe('validatePresenceOfMandatoryProperties', () => { + const testCases = [ + { + name: 'should not throw an error if the object has all required fields', + input: { + objectName: 'Leads', + object: { Last_Name: 'Doe' }, + }, + expected: { missingField: [], status: false }, + expectError: false, + }, + { + name: 'should return missing field if mandatory field contains empty string', + input: { + objectName: 'Leads', + object: { Last_Name: '' }, + }, + expected: { missingField: ['Last_Name'], status: true }, + expectError: false, + }, + { + name: 'should return missing field if mandatory field contains empty null', + input: { + objectName: 'Leads', + object: { Last_Name: null }, + }, + expected: { missingField: ['Last_Name'], status: true }, + expectError: false, + }, + { + name: 'should not throw an error if the objectName is not in MODULE_MANDATORY_FIELD_CONFIG', + input: { + objectName: 'CustomObject', + object: { Some_Field: 'Some Value' }, + }, + expected: undefined, + expectError: false, + }, + { + name: 'should return multiple missing fields for Deals', + input: { + objectName: 'Deals', + object: { Deal_Name: 'Big Deal' }, + }, + expected: { + missingField: ['Stage', 'Pipeline'], + status: true, + }, + expectError: false, + }, + { + name: 'should not throw an error if the object has all required fields for Deals', + input: { + objectName: 'Deals', + object: { Deal_Name: 'Big Deal', Stage: 'Negotiation', Pipeline: 'Sales' }, + }, + expected: { missingField: [], status: false }, + expectError: false, + }, + ]; - test('should throw ConfigurationError when multiSelectFieldLevelDecision has mixed case from keys, Config.module is different from operationModuleType, and action is not delete', () => { - const Config = { - multiSelectFieldLevelDecision: [ - { from: 'FIELD1', to: 'true' }, - { from: 'field2', to: 'false' }, - ], - module: 'moduleA', - }; - const operationModuleType = 'moduleB'; - const action = 'create'; - - expect(() => validateConfigurationIssue(Config, operationModuleType, action)).toThrow( - ConfigurationError, - ); + testCases.forEach(({ name, input, expected, expectError }) => { + it(name, () => { + if (expectError) { + expect(() => + validatePresenceOfMandatoryProperties(input.objectName, input.object), + ).toThrow(); + } else { + const result = validatePresenceOfMandatoryProperties(input.objectName, input.object); + expect(result).toEqual(expected); + } + }); }); +}); - test('should not throw an error when hashMapMultiselect is not empty, Config.module is different from operationModuleType, and action is delete', () => { - const Config = { - multiSelectFieldLevelDecision: [{ from: 'field1', to: 'true' }], - module: 'moduleA', - }; - const operationModuleType = 'moduleB'; - const action = 'delete'; +describe('validateConfigurationIssue', () => { + const testCases = [ + { + name: 'should throw ConfigurationError when hashMapMultiselect is not empty, Config.module is different from operationModuleType, and action is not delete', + input: { + config: { + multiSelectFieldLevelDecision: [{ from: 'field1', to: 'true' }], + module: 'moduleA', + }, + operationModuleType: 'moduleB', + }, + expectError: true, + errorType: ConfigurationError, + errorMessage: + 'Object Chosen in Visual Data Mapper is not consistent with Module type selected in destination configuration. Aborting Events.', + }, + { + name: 'should not throw an error when hashMapMultiselect is not empty, Config.module is the same as operationModuleType', + input: { + config: { + multiSelectFieldLevelDecision: [{ from: 'field1', to: 'true' }], + module: 'moduleA', + }, + operationModuleType: 'moduleA', + }, + expectError: false, + }, + { + name: 'should not throw an error when hashMapMultiselect is empty, Config.module is different from operationModuleType', + input: { + config: { + multiSelectFieldLevelDecision: [], + module: 'moduleA', + }, + operationModuleType: 'moduleB', + }, + expectError: false, + }, + { + name: 'should not throw an error when hashMapMultiselect is empty, Config.module is the same as operationModuleType', + input: { + config: { + multiSelectFieldLevelDecision: [], + module: 'moduleA', + }, + operationModuleType: 'moduleA', + }, + expectError: false, + }, + { + name: 'should not throw an error when multiSelectFieldLevelDecision has entries without from key', + input: { + config: { + multiSelectFieldLevelDecision: [{ to: 'true' }], + module: 'moduleA', + }, + operationModuleType: 'moduleB', + }, + expectError: false, + }, + { + name: 'should throw ConfigurationError when multiSelectFieldLevelDecision has mixed case from keys, Config.module is different from operationModuleType', + input: { + config: { + multiSelectFieldLevelDecision: [ + { from: 'FIELD1', to: 'true' }, + { from: 'field2', to: 'false' }, + ], + module: 'moduleA', + }, + operationModuleType: 'moduleB', + }, + expectError: true, + errorType: ConfigurationError, + errorMessage: + 'Object Chosen in Visual Data Mapper is not consistent with Module type selected in destination configuration. Aborting Events.', + }, + ]; - expect(() => validateConfigurationIssue(Config, operationModuleType, action)).not.toThrow(); + testCases.forEach(({ name, input, expectError, errorType, errorMessage }) => { + it(name, () => { + if (expectError) { + expect(() => validateConfigurationIssue(input.config, input.operationModuleType)).toThrow( + errorType, + ); + expect(() => validateConfigurationIssue(input.config, input.operationModuleType)).toThrow( + errorMessage, + ); + } else { + expect(() => + validateConfigurationIssue(input.config, input.operationModuleType), + ).not.toThrow(); + } + }); }); }); diff --git a/src/constants/destinationCanonicalNames.js b/src/constants/destinationCanonicalNames.js index e9b7dc136b9..819ada2aa1b 100644 --- a/src/constants/destinationCanonicalNames.js +++ b/src/constants/destinationCanonicalNames.js @@ -187,6 +187,7 @@ const DestCanonicalNames = { wunderkind: ['wunderkind', 'Wunderkind', 'WUNDERKIND'], cordial: ['cordial', 'Cordial', 'CORDIAL'], clevertap: ['clevertap', 'Clevertap', 'CleverTap', 'CLEVERTAP'], + airship: ['airship', 'Airship', 'AIRSHIP'], }; module.exports = { DestHandlerMap, DestCanonicalNames }; diff --git a/src/constants/index.js b/src/constants/index.js index f8ca53a94c9..05a258ee646 100644 --- a/src/constants/index.js +++ b/src/constants/index.js @@ -55,6 +55,10 @@ const HTTP_CUSTOM_STATUS_CODES = { FILTERED: 298, }; +const ErrorMessages = { + JSONParseError: 'Malformed JSON in request body', +}; + module.exports = { EventType, GENERIC_TRUE_VALUES, @@ -64,4 +68,5 @@ module.exports = { TraitsMapping, WhiteListedTraits, HTTP_CUSTOM_STATUS_CODES, + ErrorMessages, }; diff --git a/src/controllers/__tests__/delivery.test.ts b/src/controllers/__tests__/delivery.test.ts index 0f91913f9d0..b5e37e1d589 100644 --- a/src/controllers/__tests__/delivery.test.ts +++ b/src/controllers/__tests__/delivery.test.ts @@ -18,7 +18,7 @@ beforeAll(async () => { }), ); applicationRoutes(app); - server = app.listen(9090); + server = app.listen(); }); afterAll(async () => { diff --git a/src/controllers/__tests__/destination.test.ts b/src/controllers/__tests__/destination.test.ts index 3c49a9a0aff..105f16b8560 100644 --- a/src/controllers/__tests__/destination.test.ts +++ b/src/controllers/__tests__/destination.test.ts @@ -19,7 +19,7 @@ beforeAll(async () => { }), ); applicationRoutes(app); - server = app.listen(9090); + server = app.listen(); }); afterAll(async () => { diff --git a/src/controllers/__tests__/regulation.test.ts b/src/controllers/__tests__/regulation.test.ts index 55cd8f2d376..42e45d9e138 100644 --- a/src/controllers/__tests__/regulation.test.ts +++ b/src/controllers/__tests__/regulation.test.ts @@ -18,7 +18,7 @@ beforeAll(async () => { }), ); applicationRoutes(app); - server = app.listen(9090); + server = app.listen(); }); afterAll(async () => { @@ -64,7 +64,7 @@ describe('Regulation controller tests', () => { const response = await request(server) .post('/deleteUsers') .set('Accept', 'application/json') - .set('x-rudder-dest-info', '{"a": "test"}') + .set('x-rudder-dest-info', JSON.stringify({ a: 'test' })) .send(getDeletionData()); expect(response.status).toEqual(400); @@ -94,7 +94,7 @@ describe('Regulation controller tests', () => { const response = await request(server) .post('/deleteUsers') .set('Accept', 'application/json') - .set('x-rudder-dest-info', '{"a": "test"}') + .set('x-rudder-dest-info', JSON.stringify({ a: 'test' })) .send(getDeletionData()); expect(response.status).toEqual(500); diff --git a/src/controllers/__tests__/source.test.ts b/src/controllers/__tests__/source.test.ts index 72bee83282e..dead14c3829 100644 --- a/src/controllers/__tests__/source.test.ts +++ b/src/controllers/__tests__/source.test.ts @@ -20,7 +20,7 @@ beforeAll(async () => { }), ); applicationRoutes(app); - server = app.listen(9090); + server = app.listen(); }); afterAll(async () => { @@ -41,8 +41,8 @@ const getData = () => { const getV2Data = () => { return [ - { request: { body: '{"a": "b"}' }, source: { id: 1 } }, - { request: { body: '{"a": "b"}' }, source: { id: 1 } }, + { request: { body: JSON.stringify({ a: 'b' }) }, source: { id: 1 } }, + { request: { body: JSON.stringify({ a: 'b' }) }, source: { id: 1 } }, ]; }; diff --git a/src/controllers/bulkUpload.ts b/src/controllers/bulkUpload.ts deleted file mode 100644 index cb0bcfed3c0..00000000000 --- a/src/controllers/bulkUpload.ts +++ /dev/null @@ -1,166 +0,0 @@ -/* eslint-disable global-require, import/no-dynamic-require, @typescript-eslint/no-unused-vars */ -import { client as errNotificationClient } from '../util/errorNotifier'; -import { - getDestFileUploadHandler, - getJobStatusHandler, - getPollStatusHandler, -} from '../util/fetchDestinationHandlers'; -import { CatchErr, ContextBodySimple } from '../util/types'; -import logger from '../logger'; -// TODO: To be refactored and redisgned - -const ERROR_MESSAGE_PROCESSOR_STRING = 'Error occurred while processing payload.'; - -const getCommonMetadata = (ctx) => - // TODO: Parse information such as - // cluster, namespace, etc information - // from the request - ({ - namespace: 'Unknown', - cluster: 'Unknown', - }); - -const getReqMetadata = (ctx) => { - try { - const reqBody = ctx.request.body; - return { destType: reqBody?.destType, importId: reqBody?.importId }; - } catch (error) { - // Do nothing - } - return {}; -}; - -export const fileUpload = async (ctx) => { - logger.debug('Native(Bulk-Upload): Request to transformer:: /fileUpload route', ctx.request.body); - const getReqMetadataFileUpload = () => { - try { - const reqBody = ctx.request.body; - return { destType: reqBody?.destType }; - } catch (error) { - // Do nothing - } - return {}; - }; - - const { destType }: ContextBodySimple = ctx.request.body; - const destFileUploadHandler = getDestFileUploadHandler('v0', destType.toLowerCase()); - - if (!destFileUploadHandler || !destFileUploadHandler.processFileData) { - ctx.status = 404; - ctx.body = `${destType} doesn't support bulk upload`; - return null; - } - let response; - try { - response = await destFileUploadHandler.processFileData(ctx.request.body); - } catch (error: CatchErr) { - response = { - statusCode: error?.response?.status || error?.status || 400, - error: error.message || ERROR_MESSAGE_PROCESSOR_STRING, - metadata: error.response ? error.response.metadata : null, - }; - errNotificationClient.notify(error, 'File Upload', { - ...response, - ...getCommonMetadata(ctx), - ...getReqMetadata(ctx), - }); - } - ctx.body = response; - logger.debug('Native(Bulk-Upload): Response from transformer:: /fileUpload route', ctx.body); - return ctx.body; -}; - -export const pollStatus = async (ctx) => { - logger.debug('Native(Bulk-Upload): Request to transformer:: /pollStatus route', ctx.request.body); - - const { destType }: ContextBodySimple = ctx.request.body; - const destFileUploadHandler = getPollStatusHandler('v0', destType.toLowerCase()); - let response; - if (!destFileUploadHandler || !destFileUploadHandler.processPolling) { - ctx.status = 404; - ctx.body = `${destType} doesn't support bulk upload`; - return null; - } - try { - response = await destFileUploadHandler.processPolling(ctx.request.body); - } catch (error: CatchErr) { - response = { - statusCode: error.response?.status || 400, - error: error.message || ERROR_MESSAGE_PROCESSOR_STRING, - }; - errNotificationClient.notify(error, 'Poll Status', { - ...response, - ...getCommonMetadata(ctx), - ...getReqMetadata(ctx), - }); - } - ctx.body = response; - logger.debug('Native(Bulk-Upload): Request from transformer:: /pollStatus route', ctx.body); - return ctx.body; -}; - -export const getWarnJobStatus = async (ctx) => { - logger.debug( - 'Native(Bulk-Upload): Request to transformer:: /getWarningJobs route', - ctx.request.body, - ); - - const { destType }: ContextBodySimple = ctx.request.body; - const destFileUploadHandler = getJobStatusHandler('v0', destType.toLowerCase()); - - if (!destFileUploadHandler || !destFileUploadHandler.processJobStatus) { - ctx.status = 404; - ctx.body = `${destType} doesn't support bulk upload`; - return null; - } - let response; - try { - response = await destFileUploadHandler.processJobStatus(ctx.request.body, 'warn'); - } catch (error: CatchErr) { - response = { - statusCode: error.response ? error.response.status : 400, - error: error.message || ERROR_MESSAGE_PROCESSOR_STRING, - }; - errNotificationClient.notify(error, 'Job Status', { - ...response, - ...getCommonMetadata(ctx), - ...getReqMetadata(ctx), - }); - } - ctx.body = response; - logger.debug('Native(Bulk-Upload): Request from transformer:: /getWarningJobs route', ctx.body); - return ctx.body; -}; - -export const getFailedJobStatus = async (ctx) => { - logger.debug( - 'Native(Bulk-Upload): Request to transformer:: /getFailedJobs route', - ctx.request.body, - ); - - const { destType }: ContextBodySimple = ctx.request.body; - const destFileUploadHandler = getJobStatusHandler('v0', destType.toLowerCase()); - - if (!destFileUploadHandler || !destFileUploadHandler.processJobStatus) { - ctx.status = 404; - ctx.body = `${destType} doesn't support bulk upload`; - return null; - } - let response; - try { - response = await destFileUploadHandler.processJobStatus(ctx.request.body, 'fail'); - } catch (error: CatchErr) { - response = { - statusCode: error.response ? error.response.status : 400, - error: error.message || ERROR_MESSAGE_PROCESSOR_STRING, - }; - errNotificationClient.notify(error, 'Job Status', { - ...response, - ...getCommonMetadata(ctx), - ...getReqMetadata(ctx), - }); - } - ctx.body = response; - logger.debug('Native(Bulk-Upload): Request from transformer:: /getFailedJobs route', ctx.body); - return ctx.body; -}; diff --git a/src/controllers/destination.ts b/src/controllers/destination.ts index 1b9d19c5afe..bc82afe9dc8 100644 --- a/src/controllers/destination.ts +++ b/src/controllers/destination.ts @@ -8,7 +8,7 @@ import { ProcessorTransformationResponse, RouterTransformationRequest, RouterTransformationResponse, -} from '../types/index'; +} from '../types'; import { DynamicConfigParser } from '../util/dynamicConfigParser'; import stats from '../util/stats'; import { getIntegrationVersion } from '../util/utils'; @@ -47,7 +47,7 @@ export class DestinationController { version, requestMetadata, ); - } catch (error: any) { + } catch (error: unknown) { resplist = events.map((ev) => { const metaTO = integrationService.getTags( destination, @@ -57,7 +57,7 @@ export class DestinationController { ); metaTO.metadata = ev.metadata; const errResp = DestinationPostTransformationService.handleProcessorTransformFailureEvents( - error, + error as Error, metaTO, ); return errResp; @@ -79,6 +79,7 @@ export class DestinationController { const routerRequest = ctx.request.body as RouterTransformationRequest; const destination = routerRequest.destType; let events = routerRequest.input; + const errorRespEvents = checkInvalidRtTfEvents(events); if (errorRespEvents.length > 0) { errorRespEvents[0].metadata = [ @@ -86,6 +87,7 @@ export class DestinationController { destType: destination, }, ]; + logger.debug( `[${destination}] Invalid router transform payload structure: ${JSON.stringify(events)}`, ); @@ -93,38 +95,45 @@ export class DestinationController { ControllerUtility.postProcess(ctx); return ctx; } + const metaTags = MiscService.getMetaTags(events[0].metadata); stats.histogram('dest_transform_input_events', events.length, { destination, version: 'v0', ...metaTags, }); + const integrationService = ServiceSelector.getDestinationService(events); let resplist: RouterTransformationResponse[]; + try { - events = DestinationPreTransformationService.preProcess(events, ctx); - const timestampCorrectEvents = ControllerUtility.handleTimestampInEvents(events); + const processedEvents = DestinationPreTransformationService.preProcess(events, ctx); + + const timestampCorrectEvents = ControllerUtility.handleTimestampInEvents(processedEvents); + events = DynamicConfigParser.process(timestampCorrectEvents); + resplist = await integrationService.doRouterTransformation( events, destination, getIntegrationVersion(), requestMetadata, ); - } catch (error: any) { + } catch (error: unknown) { const metaTO = integrationService.getTags( destination, - events[0].metadata?.destinationId, - events[0].metadata?.workspaceId, + events[0]?.metadata?.destinationId, + events[0]?.metadata?.workspaceId, tags.FEATURES.ROUTER, ); metaTO.metadatas = events.map((ev) => ev.metadata); const errResp = DestinationPostTransformationService.handleRouterTransformFailureEvents( - error, + error as Error, metaTO, ); resplist = [errResp]; } + ctx.body = { output: resplist }; ControllerUtility.postProcess(ctx); stats.histogram('dest_transform_output_events', resplist.length, { @@ -140,11 +149,14 @@ export class DestinationController { const requestMetadata = MiscService.getRequestMetadata(ctx); const routerRequest = ctx.request.body as RouterTransformationRequest; const destination = routerRequest.destType; - let events = routerRequest.input; + const events = routerRequest.input; + const integrationService = ServiceSelector.getDestinationService(events); try { - events = DestinationPreTransformationService.preProcess(events, ctx); - const timestampCorrectEvents = ControllerUtility.handleTimestampInEvents(events); + const processedEvents = DestinationPreTransformationService.preProcess(events, ctx); + + const timestampCorrectEvents = ControllerUtility.handleTimestampInEvents(processedEvents); + const resplist = integrationService.doBatchTransformation( timestampCorrectEvents, destination, @@ -152,16 +164,16 @@ export class DestinationController { requestMetadata, ); ctx.body = resplist; - } catch (error: any) { + } catch (error: unknown) { const metaTO = integrationService.getTags( destination, - events[0].metadata.destinationId, - events[0].metadata.workspaceId, + events[0]?.metadata?.destinationId, + events[0]?.metadata?.workspaceId, tags.FEATURES.BATCH, ); metaTO.metadatas = events.map((ev) => ev.metadata); const errResp = DestinationPostTransformationService.handleBatchTransformFailureEvents( - error, + error as Error, metaTO, ); ctx.body = [errResp]; diff --git a/src/controllers/obs.delivery.js b/src/controllers/obs.delivery.js deleted file mode 100644 index 8e99650af64..00000000000 --- a/src/controllers/obs.delivery.js +++ /dev/null @@ -1,130 +0,0 @@ -/** - * -------------------------------------- - * -------------------------------------- - * ---------TO BE DEPRECATED------------- - * -------------------------------------- - * -------------------------------------- - */ - -const match = require('match-json'); -const jsonDiff = require('json-diff'); -const networkHandlerFactory = require('../adapters/networkHandlerFactory'); -const { getPayloadData } = require('../adapters/network'); -const { generateErrorObject } = require('../v0/util'); -const logger = require('../logger'); -const tags = require('../v0/util/tags'); -const stats = require('../util/stats'); - -const DestProxyController = { - /** - * Handler for testing the destination proxy - * @param {*} destination Destination name - * @param {*} ctx - * @returns - */ - async handleProxyTestRequest(destination, ctx) { - const { - deliveryPayload: routerDeliveryPayload, - destinationRequestPayload: routerDestReqPayload, - } = ctx.request.body; - let response; - try { - const destNetworkHandler = networkHandlerFactory.getNetworkHandler(destination); - - const proxyDestReqPayload = destNetworkHandler.prepareProxy(routerDeliveryPayload); - response = { - destinationRequestPayload: proxyDestReqPayload, - }; - - // Special handling required as Go and JavaScript encodes - // URL parameters differently - const { payloadFormat } = getPayloadData(routerDeliveryPayload.body); - if (payloadFormat === 'FORM') { - // This is to make sure we encode `~` in the data coming from the router. - // The data coming from the router is already a query parameter string - const routerDataVal = new URLSearchParams(routerDestReqPayload.data); - routerDestReqPayload.data = routerDataVal; - - const proxyDataVal = new URLSearchParams(); - proxyDestReqPayload.data.forEach((value, key) => { - const encodeAsterisk = (x) => x.replace(/\*/g, '%2A'); - // Router encodes `*` as well - proxyDataVal.append(encodeAsterisk(key), encodeAsterisk(value)); - }); - proxyDestReqPayload.data = proxyDataVal; - } - - // Compare the destination request payloads from router and proxy - if (!match(routerDestReqPayload, proxyDestReqPayload)) { - stats.counter('proxy_test_payload_mismatch', 1, { - destination, - }); - - logger.error(`[TransformerProxyTest] Destination request payload mismatch!`); - logger.error( - `[TransformerProxyTest] Delivery payload (router): ${JSON.stringify( - routerDeliveryPayload, - )}`, - ); - logger.error( - `[TransformerProxyTest] Destination request payload (router): ${JSON.stringify( - routerDestReqPayload, - )}`, - ); - logger.error( - `[TransformerProxyTest] Destination request payload (proxy): ${JSON.stringify( - proxyDestReqPayload, - )} `, - ); - - // Compute output difference - const outputDiff = jsonDiff.diffString(routerDestReqPayload, proxyDestReqPayload); - logger.error( - `[TransformerProxyTest] Destination request payload difference: ${outputDiff}`, - ); - response = { - outputDiff, - ...response, - }; - } else { - stats.counter('proxy_test_payload_match', 1, { - destination, - }); - } - } catch (err) { - stats.counter('proxy_test_error', 1, { - destination, - }); - - response = generateErrorObject( - err, - { - [tags.TAG_NAMES.DEST_TYPE]: destination.toUpperCase(), - [tags.TAG_NAMES.MODULE]: tags.MODULES.DESTINATION, - [tags.TAG_NAMES.FEATURE]: tags.FEATURES.DATA_DELIVERY, - }, - false, - ); - response.message = `[TransformerProxyTest] Error occurred while testing proxy for destination ("${destination}"): "${err.message}"`; - logger.error(response.message); - logger.error(err); - logger.error( - `[TransformerProxyTest] Delivery payload (router): ${JSON.stringify( - routerDeliveryPayload, - )}`, - ); - logger.error( - `[TransformerProxyTest] Destination request payload (router): ${JSON.stringify( - routerDestReqPayload, - )}`, - ); - } - - // Always return success as router doesn't care - ctx.status = 200; - ctx.body = { output: response }; - return ctx.body; - }, -}; - -module.exports = { DestProxyController }; diff --git a/src/controllers/source.ts b/src/controllers/source.ts index 3d9fa4f4a45..ab5a5bbf7af 100644 --- a/src/controllers/source.ts +++ b/src/controllers/source.ts @@ -24,6 +24,11 @@ export class SourceController { version, events, ); + logger.debug('Native(Source-Transform):: Controller Input Adapter::', { + implementationVersion, + inputVersion: version, + source, + }); const resplist = await integrationService.sourceTransformRoutine( input, diff --git a/src/controllers/util/conversionStrategies/strategyV2ToV0.ts b/src/controllers/util/conversionStrategies/strategyV2ToV0.ts index 1145cf97632..2c91d82e403 100644 --- a/src/controllers/util/conversionStrategies/strategyV2ToV0.ts +++ b/src/controllers/util/conversionStrategies/strategyV2ToV0.ts @@ -1,17 +1,32 @@ +import { TransformationError } from '@rudderstack/integrations-lib'; import { SourceInputConversionResult, SourceInputV2 } from '../../../types'; import { VersionConversionStrategy } from './abstractions'; +import { ErrorMessages } from '../../../constants'; export class StrategyV2ToV0 extends VersionConversionStrategy> { convert(sourceEvents: SourceInputV2[]): SourceInputConversionResult>[] { - return sourceEvents.map((sourceEvent) => { - try { - const v0Event = JSON.parse(sourceEvent.request.body); - return { output: v0Event }; - } catch (err) { - const conversionError = - err instanceof Error ? err : new Error('error converting v2 to v0 spec'); - return { conversionError }; - } - }); + return sourceEvents.map((sourceEvent) => this.convertSingleEvent(sourceEvent)); + } + + private convertSingleEvent( + sourceEvent: SourceInputV2, + ): SourceInputConversionResult> { + try { + const v0Event = this.parseRequestBody(sourceEvent.request.body); + return { output: v0Event }; + } catch (err) { + const conversionError = + err instanceof TransformationError ? err : new Error('error converting v2 to v0 spec'); + + return { conversionError }; + } + } + + private parseRequestBody(body: string): NonNullable { + try { + return JSON.parse(body); + } catch (err) { + throw new TransformationError(ErrorMessages.JSONParseError); + } } } diff --git a/src/controllers/util/conversionStrategies/strategyV2ToV1.ts b/src/controllers/util/conversionStrategies/strategyV2ToV1.ts index 52cade0d9d3..068bc4ce63a 100644 --- a/src/controllers/util/conversionStrategies/strategyV2ToV1.ts +++ b/src/controllers/util/conversionStrategies/strategyV2ToV1.ts @@ -1,17 +1,31 @@ +import { TransformationError } from '@rudderstack/integrations-lib'; import { SourceInput, SourceInputConversionResult, SourceInputV2 } from '../../../types'; import { VersionConversionStrategy } from './abstractions'; export class StrategyV2ToV1 extends VersionConversionStrategy { convert(sourceEvents: SourceInputV2[]): SourceInputConversionResult[] { - return sourceEvents.map((sourceEvent) => { - try { - const v1Event = { event: JSON.parse(sourceEvent.request.body), source: sourceEvent.source }; - return { output: v1Event }; - } catch (err) { - const conversionError = - err instanceof Error ? err : new Error('error converting v2 to v1 spec'); - return { conversionError }; - } - }); + return sourceEvents.map((sourceEvent) => this.convertSingleEvent(sourceEvent)); + } + + private convertSingleEvent(sourceEvent: SourceInputV2): SourceInputConversionResult { + try { + const v1Event = { + event: this.parseRequestBody(sourceEvent.request.body), + source: sourceEvent.source, + }; + return { output: v1Event }; + } catch (err) { + const conversionError = + err instanceof TransformationError ? err : new Error('error converting v2 to v1 spec'); + return { conversionError }; + } + } + + private parseRequestBody(body: string): NonNullable { + try { + return JSON.parse(body); + } catch (err) { + throw new TransformationError('Malformed JSON in request body'); + } } } diff --git a/src/controllers/util/index.test.ts b/src/controllers/util/index.test.ts index 4559bccc523..65f42ed56bc 100644 --- a/src/controllers/util/index.test.ts +++ b/src/controllers/util/index.test.ts @@ -1,8 +1,12 @@ +import { TransformationError } from '@rudderstack/integrations-lib'; +import { ErrorMessages } from '../../constants'; import { + Connection, Destination, Metadata, ProcessorTransformationRequest, RouterTransformationRequestData, + RudderMessage, } from '../../types'; import { ControllerUtility } from './index'; import lodash from 'lodash'; @@ -30,13 +34,20 @@ describe('adaptInputToVersion', () => { expect(result).toEqual(expected); }); it('should return the input unchanged when the implementation version and request version are the same i.e. v0', () => { - const sourceType = 'pipedream'; + jest + .spyOn(ControllerUtility as any, 'getSourceVersionsMap') + .mockReturnValue(new Map([['someSourceType', 'v0']])); + + const sourceType = 'someSourceType'; const requestVersion = 'v0'; const input = [ { key1: 'val1', key2: 'val2' }, { key1: 'val1', key2: 'val2' }, { key1: 'val1', key2: 'val2' }, ]; + + // Mock return value for getSourceVersionsMap + const expected = { implementationVersion: 'v0', input: [ @@ -50,8 +61,13 @@ describe('adaptInputToVersion', () => { expect(result).toEqual(expected); }); + it('should return the input unchanged when the implementation version and request version are the same i.e. v1', () => { - const sourceType = 'webhook'; + jest + .spyOn(ControllerUtility as any, 'getSourceVersionsMap') + .mockReturnValue(new Map([['someSourceType', 'v1']])); + + const sourceType = 'someSourceType'; const requestVersion = 'v1'; const input = [ { @@ -67,6 +83,7 @@ describe('adaptInputToVersion', () => { source: { id: 'source_id', config: { configField1: 'configVal1' } }, }, ]; + const expected = { implementationVersion: 'v1', input: [ @@ -95,8 +112,13 @@ describe('adaptInputToVersion', () => { expect(result).toEqual(expected); }); + it('should convert input from v0 to v1 when the request version is v0 and the implementation version is v1', () => { - const sourceType = 'webhook'; + jest + .spyOn(ControllerUtility as any, 'getSourceVersionsMap') + .mockReturnValue(new Map([['someSourceType', 'v1']])); + + const sourceType = 'someSourceType'; const requestVersion = 'v0'; const input = [ { key1: 'val1', key2: 'val2' }, @@ -118,7 +140,11 @@ describe('adaptInputToVersion', () => { }); it('should convert input from v1 to v0 format when the request version is v1 and the implementation version is v0', () => { - const sourceType = 'pipedream'; + jest + .spyOn(ControllerUtility as any, 'getSourceVersionsMap') + .mockReturnValue(new Map([['someSourceType', 'v0']])); + + const sourceType = 'someSourceType'; const requestVersion = 'v1'; const input = [ { @@ -149,7 +175,11 @@ describe('adaptInputToVersion', () => { }); it('should convert input from v2 to v0 format when the request version is v2 and the implementation version is v0', () => { - const sourceType = 'pipedream'; + jest + .spyOn(ControllerUtility as any, 'getSourceVersionsMap') + .mockReturnValue(new Map([['someSourceType', 'v0']])); + + const sourceType = 'someSourceType'; const requestVersion = 'v2'; const input = [ @@ -159,7 +189,7 @@ describe('adaptInputToVersion', () => { url: 'http://example.com', proto: 'HTTP/2', headers: { headerkey: ['headervalue'] }, - body: '{"key": "value"}', + body: JSON.stringify({ key: 'value' }), query_parameters: { paramkey: ['paramvalue'] }, }, source: { id: 'source_id', config: { configField1: 'configVal1' } }, @@ -170,7 +200,7 @@ describe('adaptInputToVersion', () => { url: 'http://example.com', proto: 'HTTP/2', headers: { headerkey: ['headervalue'] }, - body: '{"key": "value"}', + body: JSON.stringify({ key: 'value' }), query_parameters: { paramkey: ['paramvalue'] }, }, source: { id: 'source_id', config: { configField1: 'configVal1' } }, @@ -181,7 +211,7 @@ describe('adaptInputToVersion', () => { url: 'http://example.com', proto: 'HTTP/2', headers: { headerkey: ['headervalue'] }, - body: '{"key": "value"}', + body: JSON.stringify({ key: 'value' }), query_parameters: { paramkey: ['paramvalue'] }, }, source: { id: 'source_id', config: { configField1: 'configVal1' } }, @@ -202,7 +232,11 @@ describe('adaptInputToVersion', () => { }); it('should fail trying to convert input from v2 to v0 format when the request version is v2 and the implementation version is v0', () => { - const sourceType = 'pipedream'; + jest + .spyOn(ControllerUtility as any, 'getSourceVersionsMap') + .mockReturnValue(new Map([['someSourceType', 'v0']])); + + const sourceType = 'someSourceType'; const requestVersion = 'v2'; const input = [ @@ -222,7 +256,7 @@ describe('adaptInputToVersion', () => { implementationVersion: 'v0', input: [ { - conversionError: new SyntaxError('Unexpected end of JSON input'), + conversionError: new TransformationError(ErrorMessages.JSONParseError), }, ], }; @@ -233,7 +267,11 @@ describe('adaptInputToVersion', () => { }); it('should convert input from v2 to v1 format when the request version is v2 and the implementation version is v1', () => { - const sourceType = 'webhook'; + jest + .spyOn(ControllerUtility as any, 'getSourceVersionsMap') + .mockReturnValue(new Map([['someSourceType', 'v1']])); + + const sourceType = 'someSourceType'; const requestVersion = 'v2'; const input = [ @@ -243,7 +281,7 @@ describe('adaptInputToVersion', () => { url: 'http://example.com', proto: 'HTTP/2', headers: { headerkey: ['headervalue'] }, - body: '{"key": "value"}', + body: JSON.stringify({ key: 'value' }), query_parameters: { paramkey: ['paramvalue'] }, }, source: { id: 'source_id', config: { configField1: 'configVal1' } }, @@ -254,7 +292,7 @@ describe('adaptInputToVersion', () => { url: 'http://example.com', proto: 'HTTP/2', headers: { headerkey: ['headervalue'] }, - body: '{"key": "value"}', + body: JSON.stringify({ key: 'value' }), query_parameters: { paramkey: ['paramvalue'] }, }, source: { id: 'source_id', config: { configField1: 'configVal1' } }, @@ -265,7 +303,7 @@ describe('adaptInputToVersion', () => { url: 'http://example.com', proto: 'HTTP/2', headers: { headerkey: ['headervalue'] }, - body: '{"key": "value"}', + body: JSON.stringify({ key: 'value' }), query_parameters: { paramkey: ['paramvalue'] }, }, source: { id: 'source_id', config: { configField1: 'configVal1' } }, @@ -301,7 +339,11 @@ describe('adaptInputToVersion', () => { }); it('should fail trying to convert input from v2 to v1 format when the request version is v2 and the implementation version is v1', () => { - const sourceType = 'webhook'; + jest + .spyOn(ControllerUtility as any, 'getSourceVersionsMap') + .mockReturnValue(new Map([['someSourceType', 'v1']])); + + const sourceType = 'someSourceType'; const requestVersion = 'v2'; const input = [ @@ -321,7 +363,7 @@ describe('adaptInputToVersion', () => { implementationVersion: 'v1', input: [ { - conversionError: new SyntaxError('Unexpected end of JSON input'), + conversionError: new TransformationError(ErrorMessages.JSONParseError), }, ], }; @@ -333,7 +375,11 @@ describe('adaptInputToVersion', () => { // Should return an empty array when the input is an empty array it('should return an empty array when the input is an empty array', () => { - const sourceType = 'pipedream'; + jest + .spyOn(ControllerUtility as any, 'getSourceVersionsMap') + .mockReturnValue(new Map([['someSourceType', 'v0']])); + + const sourceType = 'someSourceType'; const requestVersion = 'v1'; const input = []; const expected = { implementationVersion: 'v0', input: [] }; @@ -347,7 +393,6 @@ describe('adaptInputToVersion', () => { const sourceType = 'someSourceType'; const requestVersion = 'v1'; - // Mock return value for getSourceVersionsMap jest .spyOn(ControllerUtility as any, 'getSourceVersionsMap') .mockReturnValue(new Map([['someSourceType', 'v2']])); @@ -373,7 +418,7 @@ describe('adaptInputToVersion', () => { { output: { request: { - body: '{"key":"value"}', + body: JSON.stringify({ key: 'value' }), query_parameters: { paramkey: ['paramvalue'] }, }, source: { id: 'source_id', config: { configField1: 'configVal1' } }, @@ -382,7 +427,7 @@ describe('adaptInputToVersion', () => { { output: { request: { - body: '{"key":"value"}', + body: JSON.stringify({ key: 'value' }), }, source: { id: 'source_id', config: { configField1: 'configVal1' } }, }, @@ -451,7 +496,7 @@ type timestampTestCases = { inputEvents: Array; }; -const metadata: Metadata = { +const metadata = { sourceId: '27O0bmEEx3GgfmEhZHUcPwJQVWC', workspaceId: '27O0bhB6p5ehfOWeeZlOSsSDTLg', namespace: '', @@ -482,7 +527,7 @@ const metadata: Metadata = { sourceDefinitionId: '1b6gJdqOPOCadT3cddw8eidV591', destinationDefinitionId: '', transformationId: '', -}; +} as unknown as Metadata; const destination: Destination = { ID: 'string', @@ -499,7 +544,7 @@ const destination: Destination = { Transformations: [], }; -const message = { +const message: RudderMessage = { anonymousId: '2073230', event: 'Test', messageId: 'e3a51e9a-6313-4389-ae73-07e487c8d9d0', @@ -522,11 +567,11 @@ function getDestination(overrides: Destination): Destination { return lodash.merge({}, destination, overrides); } -function getMessage(overrides: object): object { +function getMessage(overrides: object): RudderMessage { return lodash.merge({}, message, overrides); } -function getMessageWithShallowMerge(overrides: object): object { +function getMessageWithShallowMerge(overrides: object): RudderMessage { return lodash.assign({}, message, overrides); } diff --git a/src/controllers/util/index.ts b/src/controllers/util/index.ts index ab2a0f5dc3a..a25b59ee3cf 100644 --- a/src/controllers/util/index.ts +++ b/src/controllers/util/index.ts @@ -29,15 +29,25 @@ export class ControllerUtility { [EventType.TRACK]: [`properties.${RETL_TIMESTAMP}`, ...genericFieldMap.timestamp], }; + private static getSourceDirPath(version: string): string { + if (version === 'v2') { + return path.resolve(__dirname, '../../sources'); + } + return path.resolve(__dirname, `../../${version}/sources`); + } + private static getSourceVersionsMap(): Map { if (this.sourceVersionMap?.size > 0) { return this.sourceVersionMap; } - const versions = ['v0', 'v1']; + + const versions = ['v0', 'v1', 'v2']; + versions.forEach((version) => { - const files = fs.readdirSync(path.resolve(__dirname, `../../${version}/sources`), { + const files = fs.readdirSync(this.getSourceDirPath(version), { withFileTypes: true, }); + const sources = files.filter((file) => file.isDirectory()).map((folder) => folder.name); sources.forEach((source) => { this.sourceVersionMap.set(source, version); diff --git a/src/features.ts b/src/features.ts index fb91ae28833..cc4f0e541db 100644 --- a/src/features.ts +++ b/src/features.ts @@ -94,6 +94,8 @@ const defaultFeaturesConfig: FeaturesConfig = { INTERCOM_V2: true, LINKEDIN_AUDIENCE: true, TOPSORT: true, + CUSTOMERIO_AUDIENCE: true, + ACCOIL_ANALYTICS: true, }, regulations: [ 'BRAZE', diff --git a/src/helpers/__tests__/serviceSelector.test.ts b/src/helpers/__tests__/serviceSelector.test.ts index 0dab906f7ab..e0efff91ec7 100644 --- a/src/helpers/__tests__/serviceSelector.test.ts +++ b/src/helpers/__tests__/serviceSelector.test.ts @@ -51,7 +51,7 @@ describe('ServiceSelector Service', () => { }, }, }, - ] as ProcessorTransformationRequest[]; + ] as unknown as ProcessorTransformationRequest[]; expect(ServiceSelector['getPrimaryDestinationService'](events)).toBeInstanceOf( CDKV2DestinationService, ); diff --git a/src/legacy/delivery.js b/src/legacy/delivery.js deleted file mode 100644 index 8f7b0928154..00000000000 --- a/src/legacy/delivery.js +++ /dev/null @@ -1,27 +0,0 @@ -/** - * -------------------------------------- - * -------------------------------------- - * ---------TO BE DEPRICIATED------------ - * -------------------------------------- - * -------------------------------------- - */ - -const path = require('path'); -const KoaRouter = require('@koa/router'); -const { DestProxyController } = require('../controllers/obs.delivery'); -const { getIntegrations } = require('../routes/utils'); -const { SUPPORTED_VERSIONS, API_VERSION } = require('../routes/utils/constants'); - -const router = new KoaRouter(); - -SUPPORTED_VERSIONS.forEach((version) => { - const destinations = getIntegrations(path.resolve(__dirname, `../${version}/destinations`)); - destinations.forEach((destination) => { - router.post(`/${version}/destinations/${destination}/proxyTest`, async (ctx) => { - ctx.set('apiVersion', API_VERSION); - await DestProxyController.handleProxyTestRequest(destination, ctx); - }); - }); -}); - -module.exports = router.routes(); diff --git a/src/legacy/router.js b/src/legacy/router.js deleted file mode 100644 index 60f786e2252..00000000000 --- a/src/legacy/router.js +++ /dev/null @@ -1,1272 +0,0 @@ -// ============================================================================= -// DEPRECATION NOTICE: THIS FILE IS GETTING DEPRECATED AND WILL BE REMOVED IN FUTURE RELEASE -// ============================================================================= -/* eslint-disable import/no-dynamic-require */ -/* eslint-disable global-require */ -const Router = require('@koa/router'); -const lodash = require('lodash'); -const fs = require('fs'); -const path = require('path'); -const { PlatformError, getErrorRespEvents } = require('@rudderstack/integrations-lib'); -const logger = require('../logger'); -const stats = require('../util/stats'); -const { SUPPORTED_VERSIONS, API_VERSION } = require('../routes/utils/constants'); -const { client: errNotificationClient } = require('../util/errorNotifier'); -const tags = require('../v0/util/tags'); - -const { - isNonFuncObject, - getMetadata, - generateErrorObject, - checkAndCorrectUserId, -} = require('../v0/util'); -const { processDynamicConfig } = require('../util/dynamicConfig'); -const { DestHandlerMap } = require('../constants/destinationCanonicalNames'); -const { userTransformHandler } = require('../routerUtils'); -const networkHandlerFactory = require('../adapters/networkHandlerFactory'); -const destProxyRoutes = require('./delivery'); -const eventValidator = require('../util/eventValidation'); -const { getIntegrations } = require('../routes/utils'); -const { setupUserTransformHandler, validateCode } = require('../util/customTransformer'); -const { - RespStatusError, - RetryRequestError, - sendViolationMetrics, - constructValidationErrors, -} = require('../util/utils'); -const { extractLibraries } = require('../util/customTransformer'); -const { getCompatibleStatusCode } = require('../adapters/utils/networkUtils'); - -const transformerMode = process.env.TRANSFORMER_MODE; - -const startDestTransformer = transformerMode === 'destination' || !transformerMode; -const startSourceTransformer = transformerMode === 'source' || !transformerMode; -const transformerProxy = process.env.TRANSFORMER_PROXY || true; -const proxyTestModeEnabled = - process.env.TRANSFORMER_PROXY_TEST_ENABLED?.toLowerCase() === 'true' || false; -const transformerTestModeEnabled = process.env.TRANSFORMER_TEST_MODE - ? process.env.TRANSFORMER_TEST_MODE.toLowerCase() === 'true' - : false; - -const router = new Router(); - -const PAYLOAD_PROC_ERR_MSG = 'Error occurred while processing payload'; - -/** - * @deprecated this function is deprecated and will be removed in future release - */ -const getDestHandler = (version, dest) => { - if (Object.prototype.hasOwnProperty.call(DestHandlerMap, dest)) { - return require(`../${version}/destinations/${DestHandlerMap[dest]}/transform`); - } - return require(`../${version}/destinations/${dest}/transform`); -}; - -const getDestFileUploadHandler = (version, dest) => - require(`../${version}/destinations/${dest}/fileUpload`); - -const getPollStatusHandler = (version, dest) => require(`../${version}/destinations/${dest}/poll`); - -const getJobStatusHandler = (version, dest) => - require(`../${version}/destinations/${dest}/fetchJobStatus`); - -const getDeletionUserHandler = (version, dest) => - require(`../${version}/destinations/${dest}/deleteUsers`); - -const getSourceHandler = (version, source) => require(`../${version}/sources/${source}/transform`); - -let areFunctionsEnabled = -1; -const functionsEnabled = () => { - if (areFunctionsEnabled === -1) { - areFunctionsEnabled = process.env.ENABLE_FUNCTIONS === 'false' ? 0 : 1; - } - return areFunctionsEnabled === 1; -}; - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function getCommonMetadata(ctx) { - // TODO: Parse information such as - // cluster, namespace, etc information - // from the request - return { - namespace: 'Unknown', - cluster: 'Unknown', - }; -} - -/** - * Enriches the transformed event with more information - * - userId stringification - * - * @param {Object} transformedEvent - single transformed event - * @returns transformedEvent after enrichment - */ -const enrichTransformedEvent = (transformedEvent) => ({ - ...transformedEvent, - userId: checkAndCorrectUserId(transformedEvent.statusCode, transformedEvent?.userId), -}); - -/** - * @deprecated this function is deprecated and will be removed in future release - */ -function handleV0Destination(destHandler, inputArr) { - return destHandler(...inputArr); -} -/** - * @deprecated this function is deprecated and will be removed in future release - */ -async function handleDest(ctx, version, destination) { - const getReqMetadata = (event) => { - try { - return { - destType: destination, - destinationId: event?.destination?.ID, - destName: event?.destination?.Name, - metadata: event?.metadata, - }; - } catch (error) { - // Do nothing - } - return {}; - }; - - const events = ctx.request.body; - if (!Array.isArray(events) || events.length === 0) { - throw new PlatformError('Event is missing or in inappropriate format'); - } - const reqParams = ctx.request.query; - logger.debug(`[DT] Input events: ${JSON.stringify(events)}`); - - const metaTags = - events && events.length > 0 && events[0].metadata ? getMetadata(events[0].metadata) : {}; - stats.histogram('dest_transform_input_events', events.length, { - destination, - version, - ...metaTags, - }); - const executeStartTime = new Date(); - let destHandler = null; - const respList = await Promise.all( - events.map(async (event) => { - try { - let parsedEvent = event; - parsedEvent.request = { query: reqParams }; - parsedEvent = processDynamicConfig(parsedEvent); - let respEvents; - if (destHandler === null) { - destHandler = getDestHandler(version, destination); - } - respEvents = await handleV0Destination(destHandler.process, [parsedEvent]); - - if (respEvents) { - if (!Array.isArray(respEvents)) { - respEvents = [respEvents]; - } - return respEvents.map((ev) => ({ - output: enrichTransformedEvent(ev), - metadata: destHandler?.processMetadata - ? destHandler.processMetadata({ - metadata: event.metadata, - inputEvent: parsedEvent, - outputEvent: ev, - }) - : event.metadata, - statusCode: 200, - })); - } - return undefined; - } catch (error) { - logger.error(error); - - const implementation = tags.IMPLEMENTATIONS.NATIVE; - const errCtx = 'Processor Transformation'; - - const errObj = generateErrorObject(error, { - [tags.TAG_NAMES.DEST_TYPE]: destination.toUpperCase(), - [tags.TAG_NAMES.MODULE]: tags.MODULES.DESTINATION, - [tags.TAG_NAMES.IMPLEMENTATION]: implementation, - [tags.TAG_NAMES.FEATURE]: tags.FEATURES.PROCESSOR, - [tags.TAG_NAMES.DESTINATION_ID]: event.metadata?.destinationId, - [tags.TAG_NAMES.WORKSPACE_ID]: event.metadata?.workspaceId, - }); - - const resp = { - metadata: event.metadata, - destination: event.destination, - statusCode: errObj.status, - error: errObj.message, - statTags: errObj.statTags, - }; - - errNotificationClient.notify(error, errCtx, { - ...resp, - ...getCommonMetadata(ctx), - ...getReqMetadata(event), - }); - return resp; - } - }), - ); - stats.timing('cdk_events_latency', executeStartTime, { - destination, - ...metaTags, - }); - logger.debug(`[DT] Output events: ${JSON.stringify(respList)}`); - stats.histogram('dest_transform_output_events', respList.length, { - destination, - version, - ...metaTags, - }); - ctx.body = respList.flat(); - return ctx.body; -} - -async function handleValidation(ctx) { - const requestStartTime = new Date(); - const events = ctx.request.body; - const requestSize = Number(ctx.request.get('content-length')); - const reqParams = ctx.request.query; - const respList = []; - const metaTags = events[0].metadata ? getMetadata(events[0].metadata) : {}; - let ctxStatusCode = 200; - // eslint-disable-next-line no-restricted-syntax - for (const event of events) { - const eventStartTime = new Date(); - try { - const parsedEvent = event; - parsedEvent.request = { query: reqParams }; - // eslint-disable-next-line no-await-in-loop - const hv = await eventValidator.handleValidation(parsedEvent); - sendViolationMetrics(hv.validationErrors, hv.dropEvent, metaTags); - if (hv.dropEvent) { - respList.push({ - output: event.message, - metadata: event.metadata, - statusCode: 400, - validationErrors: hv.validationErrors, - error: JSON.stringify(constructValidationErrors(hv.validationErrors)), - }); - stats.counter('hv_violation_type', 1, { - violationType: hv.violationType, - ...metaTags, - }); - } else { - respList.push({ - output: event.message, - metadata: event.metadata, - statusCode: 200, - validationErrors: hv.validationErrors, - error: JSON.stringify(constructValidationErrors(hv.validationErrors)), - }); - stats.counter('hv_propagated_events', 1, { - ...metaTags, - }); - } - } catch (error) { - const errMessage = `Error occurred while validating : ${error}`; - logger.error(errMessage); - let status = 200; - if (error instanceof RetryRequestError) { - ctxStatusCode = error.statusCode; - } - if (error instanceof RespStatusError) { - status = error.statusCode; - } - respList.push({ - output: event.message, - metadata: event.metadata, - statusCode: status, - validationErrors: [], - error: errMessage, - }); - stats.counter('hv_errors', 1, { - ...metaTags, - }); - } finally { - stats.timing('hv_event_latency', eventStartTime, { - ...metaTags, - }); - } - } - ctx.body = respList; - ctx.status = ctxStatusCode; - ctx.set('apiVersion', API_VERSION); - - stats.counter('hv_events_count', events.length, { - ...metaTags, - }); - stats.histogram('hv_request_size', requestSize, { - ...metaTags, - }); - stats.timing('hv_request_latency', requestStartTime, { - ...metaTags, - }); -} - -async function isValidRouterDest(event, destType) { - try { - const routerDestHandler = getDestHandler('v0', destType); - return routerDestHandler?.processRouterDest !== undefined; - } catch (error) { - return false; - } -} -/** - * @deprecated this function is deprecated and will be removed in future release - */ -async function routerHandleDest(ctx) { - const getReqMetadata = () => { - try { - return { - destType: ctx.request?.body?.destType, - }; - } catch (error) { - // Do nothing - } - return {}; - }; - - const respEvents = []; - let destType; - let defTags; - try { - const { input } = ctx.request.body; - destType = ctx.request.body.destType; - defTags = { - [tags.TAG_NAMES.DEST_TYPE]: destType.toUpperCase(), - [tags.TAG_NAMES.MODULE]: tags.MODULES.DESTINATION, - [tags.TAG_NAMES.FEATURE]: tags.FEATURES.ROUTER, - [tags.TAG_NAMES.IMPLEMENTATION]: tags.IMPLEMENTATIONS.NATIVE, - }; - - const routerDestHandler = getDestHandler('v0', destType); - const isValidRTDest = await isValidRouterDest(input[0], destType); - if (!isValidRTDest) { - ctx.status = 404; - ctx.body = `${destType} doesn't support router transform`; - return null; - } - const allDestEvents = lodash.groupBy(input, (event) => event.destination.ID); - await Promise.all( - Object.values(allDestEvents).map(async (destInputArray) => { - const newDestInputArray = processDynamicConfig(destInputArray, 'router'); - const listOutput = await handleV0Destination(routerDestHandler.processRouterDest, [ - newDestInputArray, - { ...getCommonMetadata(ctx), ...getReqMetadata() }, - ]); - const hasProcMetadataForRouter = routerDestHandler.processMetadataForRouter; - // enriching transformed event - listOutput.forEach((listOut) => { - const { batchedRequest } = listOut; - if (Array.isArray(batchedRequest)) { - // eslint-disable-next-line no-param-reassign - listOut.batchedRequest = batchedRequest.map((batReq) => enrichTransformedEvent(batReq)); - } else if (batchedRequest && typeof batchedRequest === 'object') { - // eslint-disable-next-line no-param-reassign - listOut.batchedRequest = enrichTransformedEvent(batchedRequest); - } - - if (hasProcMetadataForRouter) { - // eslint-disable-next-line no-param-reassign - listOut.metadata = routerDestHandler.processMetadataForRouter(listOut); - } - }); - respEvents.push(...listOutput); - }), - ); - - // Add default stat tags - respEvents - .filter( - (resp) => - 'error' in resp && lodash.isObject(resp.statTags) && !lodash.isEmpty(resp.statTags), - ) - .forEach((resp) => { - // eslint-disable-next-line no-param-reassign - resp.statTags = { - ...resp.statTags, - ...defTags, - [tags.TAG_NAMES.DESTINATION_ID]: resp.metadata[0]?.destinationId, - [tags.TAG_NAMES.WORKSPACE_ID]: resp.metadata[0]?.workspaceId, - }; - }); - } catch (error) { - logger.error(error); - - const errObj = generateErrorObject(error, defTags); - - const resp = { - statusCode: errObj.status, - error: errObj.message, - statTags: errObj.statTags, - }; - - // Add support to perform refreshToken action for OAuth destinations - if (error?.authErrorCategory) { - resp.authErrorCategory = error.authErrorCategory; - } - - errNotificationClient.notify(error, 'Router Transformation', { - ...resp, - ...getCommonMetadata(ctx), - ...getReqMetadata(), - }); - - respEvents.push(resp); - } - ctx.body = { output: respEvents }; - return ctx.body; -} - -if (startDestTransformer) { - SUPPORTED_VERSIONS.forEach((version) => { - const destinations = getIntegrations(path.resolve(__dirname, `../${version}/destinations`)); - destinations.forEach((destination) => { - // eg. v0/destinations/ga - router.post(`/${version}/destinations/${destination}`, async (ctx) => { - const startTime = new Date(); - await handleDest(ctx, version, destination); - ctx.set('apiVersion', API_VERSION); - // Assuming that events are from one single source - - const metaTags = - ctx.request.body && ctx.request.body.length > 0 && ctx.request.body[0].metadata - ? getMetadata(ctx.request.body[0].metadata) - : {}; - - stats.timing('dest_transform_request_latency', startTime, { - destination, - version, - ...metaTags, - }); - stats.increment('dest_transform_requests', { - destination, - version, - ...metaTags, - }); - }); - // eg. v0/ga. will be deprecated in favor of v0/destinations/ga format - router.post(`/${version}/${destination}`, async (ctx) => { - const startTime = new Date(); - await handleDest(ctx, version, destination); - ctx.set('apiVersion', API_VERSION); - // Assuming that events are from one single source - - const metaTags = - ctx.request.body && ctx.request.body.length > 0 && ctx.request.body[0].metadata - ? getMetadata(ctx.request.body[0].metadata) - : {}; - - stats.timing('dest_transform_request_latency', startTime, { - destination, - ...metaTags, - }); - stats.increment('dest_transform_requests', { - destination, - version, - ...metaTags, - }); - }); - router.post('/routerTransform', async (ctx) => { - ctx.set('apiVersion', API_VERSION); - await routerHandleDest(ctx); - }); - }); - }); - - if (functionsEnabled()) { - router.post('/extractLibs', async (ctx) => { - try { - const { - code, - versionId, - validateImports = false, - additionalLibraries = [], - language = 'javascript', - testMode = false, - } = ctx.request.body; - - if (!code) { - throw new Error('Invalid request. Code is missing'); - } - - const obj = await extractLibraries( - code, - versionId, - validateImports, - additionalLibraries, - language, - testMode || versionId === 'testVersionId', - ); - ctx.body = obj; - } catch (err) { - ctx.status = 400; - ctx.body = { error: err.error || err.message }; - } - }); - - // eslint-disable-next-line sonarjs/cognitive-complexity - router.post('/customTransform', async (ctx) => { - const startTime = new Date(); - const events = ctx.request.body; - const { processSessions } = ctx.query; - logger.debug(`[CT] Input events: ${JSON.stringify(events)}`); - stats.histogram('user_transform_input_events', events.length, { - processSessions, - }); - let groupedEvents; - if (processSessions) { - groupedEvents = lodash.groupBy(events, (event) => { - // to have the backward-compatibility and being extra careful. We need to remove this (message.anonymousId) in next release. - const rudderId = event.metadata.rudderId || event.message.anonymousId; - return `${event.destination.ID}_${event.metadata.sourceId}_${rudderId}`; - }); - } else { - groupedEvents = lodash.groupBy( - events, - (event) => `${event.metadata.destinationId}_${event.metadata.sourceId}`, - ); - } - stats.counter('user_transform_function_group_size', Object.entries(groupedEvents).length, {}); - - let ctxStatusCode = 200; - const transformedEvents = []; - let librariesVersionIDs = []; - if (events[0].libraries) { - librariesVersionIDs = events[0].libraries.map((library) => library.VersionID); - } - await Promise.all( - Object.entries(groupedEvents).map(async ([dest, destEvents]) => { - logger.debug(`dest: ${dest}`); - const transformationVersionId = - destEvents[0] && - destEvents[0].destination && - destEvents[0].destination.Transformations && - destEvents[0].destination.Transformations[0] && - destEvents[0].destination.Transformations[0].VersionID; - const messageIds = destEvents.map((ev) => ev.metadata && ev.metadata.messageId); - const commonMetadata = { - sourceId: destEvents[0].metadata && destEvents[0].metadata.sourceId, - destinationId: destEvents[0].metadata && destEvents[0].metadata.destinationId, - destinationType: destEvents[0].metadata && destEvents[0].metadata.destinationType, - messageIds, - }; - - const metaTags = - destEvents.length > 0 && destEvents[0].metadata - ? getMetadata(destEvents[0].metadata) - : {}; - if (transformationVersionId) { - let destTransformedEvents; - try { - destTransformedEvents = await userTransformHandler()( - destEvents, - transformationVersionId, - librariesVersionIDs, - ); - transformedEvents.push( - ...destTransformedEvents.map((ev) => { - if (ev.error) { - return { - statusCode: 400, - error: ev.error, - metadata: lodash.isEmpty(ev.metadata) ? commonMetadata : ev.metadata, - }; - } - if (!isNonFuncObject(ev.transformedEvent)) { - return { - statusCode: 400, - error: `returned event in events from user transformation is not an object. transformationVersionId:${transformationVersionId} and returned event: ${JSON.stringify( - ev.transformedEvent, - )}`, - metadata: lodash.isEmpty(ev.metadata) ? commonMetadata : ev.metadata, - }; - } - return { - output: ev.transformedEvent, - metadata: lodash.isEmpty(ev.metadata) ? commonMetadata : ev.metadata, - statusCode: 200, - }; - }), - ); - } catch (error) { - logger.error(error); - let status = 400; - const errorString = error.toString(); - if (error instanceof RetryRequestError) { - ctxStatusCode = error.statusCode; - } - if (error instanceof RespStatusError) { - status = error.statusCode; - } - destTransformedEvents = destEvents.map((e) => ({ - statusCode: status, - metadata: e.metadata, - error: errorString, - })); - transformedEvents.push(...destTransformedEvents); - stats.counter('user_transform_errors', destEvents.length, { - transformationVersionId, - processSessions, - ...metaTags, - }); - } - } else { - const errorMessage = 'Transformation VersionID not found'; - logger.error(`[CT] ${errorMessage}`); - transformedEvents.push({ - statusCode: 400, - error: errorMessage, - metadata: commonMetadata, - }); - stats.counter('user_transform_errors', destEvents.length, { - transformationVersionId, - processSessions, - ...metaTags, - }); - } - }), - ); - logger.debug(`[CT] Output events: ${JSON.stringify(transformedEvents)}`); - ctx.body = transformedEvents; - ctx.status = ctxStatusCode; - ctx.set('apiVersion', API_VERSION); - - stats.timingSummary('user_transform_request_latency_summary', startTime, {}); - stats.increment('user_transform_requests', {}); - stats.histogram('user_transform_output_events', transformedEvents.length, {}); - }); - } -} - -if (transformerTestModeEnabled) { - router.post('/transformation/test', async (ctx) => { - try { - const { events, trRevCode, libraryVersionIDs = [] } = ctx.request.body; - if (!trRevCode || !trRevCode.code || !trRevCode.codeVersion) { - throw new Error('Invalid Request. Missing parameters in transformation code block'); - } - if (!events || events.length === 0) { - throw new Error('Invalid request. Missing events'); - } - - logger.debug(`[CT] Test Input Events: ${JSON.stringify(events)}`); - trRevCode.versionId = 'testVersionId'; - const res = await userTransformHandler()( - events, - trRevCode.versionId, - libraryVersionIDs, - trRevCode, - true, - ); - logger.debug(`[CT] Test Output Events: ${JSON.stringify(res.transformedEvents)}`); - ctx.body = res; - } catch (error) { - ctx.status = error.statusCode || 400; - ctx.body = { error: error.message }; - } - }); - - router.post('/transformationLibrary/test', async (ctx) => { - try { - const { code, language = 'javascript' } = ctx.request.body; - - if (!code) { - throw new Error('Invalid request. Missing code'); - } - - const res = await validateCode(code, language); - ctx.body = res; - } catch (error) { - ctx.body = { error: error.message }; - ctx.status = 400; - } - }); - /* *params - * code: transfromation code - * language - * name - */ - router.post('/transformation/sethandle', async (ctx) => { - try { - const { trRevCode, libraryVersionIDs = [] } = ctx.request.body; - const { code, versionId, language, testName } = trRevCode || {}; - if (!code || !language || !testName || (language === 'pythonfaas' && !versionId)) { - throw new Error('Invalid Request. Missing parameters in transformation code block'); - } - - logger.debug(`[CT] Setting up a transformation ${testName}`); - if (!trRevCode.versionId) { - trRevCode.versionId = 'testVersionId'; - } - if (!trRevCode.workspaceId) { - trRevCode.workspaceId = 'workspaceId'; - } - const res = await setupUserTransformHandler(libraryVersionIDs, trRevCode); - logger.debug(`[CT] Finished setting up transformation: ${testName}`); - ctx.body = res; - } catch (error) { - ctx.status = 400; - ctx.body = { error: error.message }; - } - }); -} - -async function handleSource(ctx, version, source) { - const getReqMetadata = () => { - try { - return { srcType: source }; - } catch (error) { - // Do nothing - } - return {}; - }; - - const sourceHandler = getSourceHandler(version, source); - const events = ctx.request.body; - logger.debug(`[ST] Input source events: ${JSON.stringify(events)}`); - stats.counter('source_transform_input_events', events.length, { - source, - version, - }); - const respList = []; - await Promise.all( - events.map(async (event) => { - try { - const respEvents = await sourceHandler.process(event); - - // We send response back to the source - // through outputToSource. This is not sent to gateway - if (Object.prototype.hasOwnProperty.call(respEvents, 'outputToSource')) { - respList.push(respEvents); - return; - } - - if (Array.isArray(respEvents)) { - respList.push({ output: { batch: respEvents } }); - } else { - respList.push({ output: { batch: [respEvents] } }); - } - } catch (error) { - logger.error(error); - - // TODO: Update the data contact for source transformation - // and then send the following additional information - // const errObj = generateErrorObject(error, { - // [tags.TAG_NAMES.SRC_TYPE]: source.toUpperCase(), - // [tags.TAG_NAMES.MODULE]: tags.MODULES.SOURCE, - // [tags.TAG_NAMES.IMPLEMENTATION]: tags.IMPLEMENTATIONS.NATIVE, - // [tags.TAG_NAMES.FEATURE]: tags.FEATURES.PROCESSOR - // [tags.TAG_NAMES.SOURCE_ID]: TBD - // }); - - // const resp = { - // statusCode: errObj.status, - // error: errObj.message, - // statTags: errObj.statTags - // }; - - const resp = { - statusCode: 400, - error: error.message || PAYLOAD_PROC_ERR_MSG, - }; - - respList.push(resp); - - stats.counter('source_transform_errors', events.length, { - source, - version, - }); - errNotificationClient.notify(error, 'Source Transformation', { - ...resp, - ...getCommonMetadata(ctx), - ...getReqMetadata(), - }); - } - }), - ); - logger.debug(`[ST] Output source events: ${JSON.stringify(respList)}`); - stats.increment('source_transform_output_events', respList.length, { - source, - version, - }); - ctx.body = respList; - ctx.set('apiVersion', API_VERSION); -} - -if (startSourceTransformer) { - SUPPORTED_VERSIONS.forEach((version) => { - const sources = getIntegrations(path.resolve(__dirname, `../${version}/sources`)); - sources.forEach((source) => { - // eg. v0/sources/customerio - router.post(`/${version}/sources/${source}`, async (ctx) => { - const startTime = new Date(); - await handleSource(ctx, version, source); - - stats.timing('source_transform_request_latency', startTime, { - source, - version, - }); - stats.increment('source_transform_requests', { source, version }); - }); - }); - }); -} -/** - * @deprecated this function is deprecated and will be removed in future release - */ -async function handleProxyRequest(destination, ctx) { - const getReqMetadata = () => { - try { - return { destType: destination }; - } catch (error) { - // Do nothing - } - return {}; - }; - - const { metadata, ...destinationRequest } = ctx.request.body; - const destNetworkHandler = networkHandlerFactory.getNetworkHandler(destination); - let response; - try { - stats.counter('tf_proxy_dest_req_count', 1, { - destination, - }); - const startTime = new Date(); - const rawProxyResponse = await destNetworkHandler.proxy(destinationRequest); - - stats.timing('transformer_proxy_time', startTime, { - destination, - }); - stats.counter('tf_proxy_dest_resp_count', 1, { - destination, - success: rawProxyResponse.success, - }); - - const processedProxyResponse = destNetworkHandler.processAxiosResponse(rawProxyResponse); - stats.counter('tf_proxy_proc_ax_response_count', 1, { - destination, - }); - response = destNetworkHandler.responseHandler( - { ...processedProxyResponse, rudderJobMetadata: metadata }, - destination, - ); - stats.counter('tf_proxy_resp_handler_count', 1, { - destination, - }); - } catch (err) { - logger.error('Error occurred while completing proxy request:'); - logger.error(err); - - const errObj = generateErrorObject( - err, - { - [tags.TAG_NAMES.DEST_TYPE]: destination.toUpperCase(), - [tags.TAG_NAMES.MODULE]: tags.MODULES.DESTINATION, - [tags.TAG_NAMES.IMPLEMENTATION]: tags.IMPLEMENTATIONS.NATIVE, - [tags.TAG_NAMES.FEATURE]: tags.FEATURES.DATA_DELIVERY, - [tags.TAG_NAMES.DESTINATION_ID]: metadata?.destinationId, - [tags.TAG_NAMES.WORKSPACE_ID]: metadata?.workspaceId, - }, - false, - ); - - response = { - status: errObj.status, - ...(errObj.authErrorCategory && { - authErrorCategory: errObj.authErrorCategory, - }), - destinationResponse: errObj.destinationResponse, - message: errObj.message, - statTags: errObj.statTags, - }; - - stats.counter('tf_proxy_err_count', 1, { - destination, - }); - - errNotificationClient.notify(err, 'Data Delivery', { - ...response, - ...getCommonMetadata(ctx), - ...getReqMetadata(), - }); - } - ctx.body = { output: response }; - // Sending `204` status(obtained from destination) is not working as expected - // Since this is success scenario, we'll be forcefully sending `200` status-code to server - ctx.status = getCompatibleStatusCode(response.status); - return ctx.body; -} - -if (transformerProxy) { - SUPPORTED_VERSIONS.forEach((version) => { - const destinations = getIntegrations(path.resolve(__dirname, `../${version}/destinations`)); - destinations.forEach((destination) => { - router.post(`/${version}/destinations/${destination}/proxy`, async (ctx) => { - const startTime = new Date(); - ctx.set('apiVersion', API_VERSION); - await handleProxyRequest(destination, ctx); - - stats.timing('transformer_total_proxy_latency', startTime, { - destination, - version, - }); - }); - }); - }); -} - -if (proxyTestModeEnabled) { - router.use(destProxyRoutes); -} - -router.get('/version', (ctx) => { - ctx.body = process.env.npm_package_version || 'Version Info not found'; -}); - -router.get('/transformerBuildVersion', (ctx) => { - ctx.body = process.env.transformer_build_version || 'Version Info not found'; -}); - -router.get('/health', (ctx) => { - const { git_commit_sha: gitCommitSha, transformer_build_version: imageVersion } = process.env; - ctx.body = { - service: 'UP', - ...(imageVersion && { version: imageVersion }), - ...(gitCommitSha && { gitCommitSha }), - }; -}); - -router.get('/features', (ctx) => { - const obj = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'features.json'), 'utf8')); - ctx.body = JSON.stringify(obj); -}); -/** - * @deprecated this function is deprecated and will be removed in future release - */ -const batchHandler = (ctx) => { - const getReqMetadata = (destEvents) => { - try { - const reqBody = ctx.request.body; - const firstEvent = destEvents[0]; - return { - destType: reqBody?.destType, - destinationId: firstEvent?.destination?.ID, - destName: firstEvent?.destination?.Name, - metadata: firstEvent?.metadata, - }; - } catch (error) { - // Do nothing - } - return {}; - }; - - const { destType, input } = ctx.request.body; - const destHandler = getDestHandler('v0', destType); - if (!destHandler || !destHandler.batch) { - ctx.status = 404; - ctx.body = `${destType} doesn't support batching`; - return null; - } - const allDestEvents = lodash.groupBy(input, (event) => event.destination.ID); - - const response = { batchedRequests: [], errors: [] }; - Object.entries(allDestEvents).forEach(([, destEvents]) => { - try { - // eslint-disable-next-line no-param-reassign - destEvents = processDynamicConfig(destEvents, 'batch'); - const destBatchedRequests = destHandler.batch(destEvents); - response.batchedRequests.push(...destBatchedRequests); - } catch (error) { - const errorObj = generateErrorObject(error, { - [tags.TAG_NAMES.DEST_TYPE]: destType.toUpperCase(), - [tags.TAG_NAMES.MODULE]: tags.MODULES.DESTINATION, - [tags.TAG_NAMES.IMPLEMENTATION]: tags.IMPLEMENTATIONS.NATIVE, - [tags.TAG_NAMES.FEATURE]: tags.FEATURES.BATCH, - [tags.TAG_NAMES.DESTINATION_ID]: destEvents[0].metadata?.destinationId, - [tags.TAG_NAMES.WORKSPACE_ID]: destEvents[0].metadata?.workspaceId, - }); - const errResp = getErrorRespEvents( - destEvents.map((d) => d.metadata), - 500, // not using errorObj.status - errorObj.message, - errorObj.statTags, - ); - response.errors.push({ - ...errResp, - destination: destEvents[0].destination, - }); - errNotificationClient.notify(error, 'Batch Transformation', { - ...errResp, - ...getCommonMetadata(ctx), - ...getReqMetadata(destEvents), - }); - } - }); - if (response.errors.length > 0) { - ctx.status = 500; - ctx.body = response.errors; - return null; - } - ctx.body = response.batchedRequests; - return ctx.body; -}; -router.post('/batch', (ctx) => { - ctx.set('apiVersion', API_VERSION); - batchHandler(ctx); -}); - -/** - * @deprecated this function is deprecated and will be removed in future release - */ -const fileUpload = async (ctx) => { - const getReqMetadata = () => { - try { - const reqBody = ctx.request.body; - return { destType: reqBody?.destType }; - } catch (error) { - // Do nothing - } - return {}; - }; - - const { destType } = ctx.request.body; - const destFileUploadHandler = getDestFileUploadHandler('v0', destType.toLowerCase()); - - if (!destFileUploadHandler || !destFileUploadHandler.processFileData) { - ctx.status = 404; - ctx.body = `${destType} doesn't support bulk upload`; - return null; - } - let response; - try { - response = await destFileUploadHandler.processFileData(ctx.request.body); - } catch (error) { - response = { - statusCode: error.response ? error.response.status : 400, - error: error.message || PAYLOAD_PROC_ERR_MSG, - metadata: error.response ? error.response.metadata : null, - }; - errNotificationClient.notify(error, 'File Upload', { - ...response, - ...getCommonMetadata(ctx), - ...getReqMetadata(), - }); - } - ctx.body = response; - return ctx.body; -}; - -const jobAndPollStatusReqMetadata = (ctx) => { - try { - const reqBody = ctx.request.body; - return { destType: reqBody?.destType, importId: reqBody?.importId }; - } catch (error) { - // Do nothing - } - return {}; -}; - -/** - * @deprecated this function is deprecated and will be removed in future release - */ -const pollStatus = async (ctx) => { - const { destType } = ctx.request.body; - const destFileUploadHandler = getPollStatusHandler('v0', destType.toLowerCase()); - let response; - if (!destFileUploadHandler || !destFileUploadHandler.processPolling) { - ctx.status = 404; - ctx.body = `${destType} doesn't support bulk upload`; - return null; - } - try { - response = await destFileUploadHandler.processPolling(ctx.request.body); - } catch (error) { - response = { - statusCode: error.response ? error.response.status : 400, - error: error.message || PAYLOAD_PROC_ERR_MSG, - }; - errNotificationClient.notify(error, 'Poll Status', { - ...response, - ...getCommonMetadata(ctx), - ...jobAndPollStatusReqMetadata(ctx), - }); - } - ctx.body = response; - return ctx.body; -}; - -/** - * @deprecated this function is deprecated and will be removed in future release - */ -const getJobStatus = async (ctx, type) => { - const { destType } = ctx.request.body; - const destFileUploadHandler = getJobStatusHandler('v0', destType.toLowerCase()); - - if (!destFileUploadHandler || !destFileUploadHandler.processJobStatus) { - ctx.status = 404; - ctx.body = `${destType} doesn't support bulk upload`; - return null; - } - let response; - try { - response = await destFileUploadHandler.processJobStatus(ctx.request.body, type); - } catch (error) { - response = { - statusCode: error.response ? error.response.status : 400, - error: error.message || PAYLOAD_PROC_ERR_MSG, - }; - errNotificationClient.notify(error, 'Job Status', { - ...response, - ...getCommonMetadata(ctx), - ...jobAndPollStatusReqMetadata(ctx), - }); - } - ctx.body = response; - return ctx.body; -}; - -/** - * @deprecated this function is deprecated and will be removed in future release - */ -const handleDeletionOfUsers = async (ctx) => { - const getReqMetadata = () => { - try { - const reqBody = ctx.request.body; - return { - destType: reqBody[0]?.destType, - jobs: reqBody.map((req) => req.jobId), - }; - } catch (error) { - // Do nothing - } - return {}; - }; - - const getRudderDestInfo = () => { - try { - const rudderDestInfoHeader = ctx.get('x-rudder-dest-info'); - const destInfoHeader = JSON.parse(rudderDestInfoHeader); - if (!Array.isArray(destInfoHeader)) { - return destInfoHeader; - } - } catch (error) { - logger.error(`Error while getting rudderDestInfo header value: ${error}`); - } - return {}; - }; - - const { body } = ctx.request; - const respList = []; - const rudderDestInfo = getRudderDestInfo(); - let response; - await Promise.all( - body.map(async (reqBody) => { - const { destType } = reqBody; - const destUserDeletionHandler = getDeletionUserHandler('v0', destType.toLowerCase()); - if (!destUserDeletionHandler || !destUserDeletionHandler.processDeleteUsers) { - ctx.status = 404; - ctx.body = "Doesn't support deletion of users"; - return null; - } - - try { - response = await destUserDeletionHandler.processDeleteUsers({ - ...reqBody, - rudderDestInfo, - }); - if (response) { - respList.push(response); - } - } catch (error) { - const errObj = generateErrorObject( - error, - { - [tags.TAG_NAMES.DEST_TYPE]: destType.toUpperCase(), - [tags.TAG_NAMES.MODULE]: tags.MODULES.DESTINATION, - [tags.TAG_NAMES.IMPLEMENTATION]: tags.IMPLEMENTATIONS.NATIVE, - [tags.TAG_NAMES.FEATURE]: tags.FEATURES.USER_DELETION, - }, - false, - ); - - // adding the status to the request - ctx.status = errObj.status; - const resp = { - statusCode: errObj.status, - error: errObj.message, - ...(errObj.authErrorCategory && { - authErrorCategory: errObj.authErrorCategory, - }), - }; - - respList.push(resp); - logger.error(`Error Response List: ${JSON.stringify(respList, null, 2)}`); - - errNotificationClient.notify(error, 'User Deletion', { - ...resp, - ...getCommonMetadata(ctx), - ...getReqMetadata(), - }); - } - return undefined; - }), - ); - ctx.body = respList; - return ctx.body; - // const { destType } = ctx.request.body; -}; - -router.post('/fileUpload', async (ctx) => { - await fileUpload(ctx); -}); - -router.post('/pollStatus', async (ctx) => { - await pollStatus(ctx); -}); - -router.post('/getFailedJobs', async (ctx) => { - await getJobStatus(ctx, 'fail'); -}); - -router.post('/getWarningJobs', async (ctx) => { - await getJobStatus(ctx, 'warn'); -}); -// eg. v0/validate. will validate events as per respective tracking plans -router.post(`/v0/validate`, async (ctx) => { - await handleValidation(ctx); -}); - -// Api to handle deletion of users for data regulation -// { -// "destType": "dest name", -// "userAttributes": [ -// { -// "userId": "user_1" -// }, -// { -// "userId": "user_2" -// } -// ], -// "config": { -// "apiKey": "", -// "apiSecret": "" -// } -// } -router.post(`/deleteUsers`, async (ctx) => { - await handleDeletionOfUsers(ctx); -}); - -module.exports = { - router, - handleDest, - routerHandleDest, - batchHandler, - handleProxyRequest, - handleDeletionOfUsers, - fileUpload, - pollStatus, - getJobStatus, - handleV0Destination, - getDestHandler, -}; diff --git a/src/middleware.test.js b/src/middleware.test.js new file mode 100644 index 00000000000..397dedfbd07 --- /dev/null +++ b/src/middleware.test.js @@ -0,0 +1,107 @@ +const Koa = require('koa'); // Import Koa +const { + addStatMiddleware, + addRequestSizeMiddleware, + getHeapProfile, + getCPUProfile, + initPyroscope, +} = require('./middleware'); + +const Pyroscope = require('@pyroscope/nodejs'); +const stats = require('./util/stats'); +const { getDestTypeFromContext } = require('@rudderstack/integrations-lib'); + +// Mock dependencies +jest.mock('@pyroscope/nodejs'); +jest.mock('./util/stats', () => ({ + timing: jest.fn(), + histogram: jest.fn(), +})); +jest.mock('@rudderstack/integrations-lib', () => ({ + getDestTypeFromContext: jest.fn(), +})); + +describe('Pyroscope Initialization', () => { + it('should initialize Pyroscope with the correct app name', () => { + initPyroscope(); + expect(Pyroscope.init).toHaveBeenCalledWith({ appName: 'rudder-transformer' }); + expect(Pyroscope.startHeapCollecting).toHaveBeenCalled(); + }); +}); + +describe('getCPUProfile', () => { + it('should call Pyroscope.collectCpu with the specified seconds', () => { + const seconds = 5; + getCPUProfile(seconds); + expect(Pyroscope.collectCpu).toHaveBeenCalledWith(seconds); + }); +}); + +describe('getHeapProfile', () => { + it('should call Pyroscope.collectHeap', () => { + getHeapProfile(); + expect(Pyroscope.collectHeap).toHaveBeenCalled(); + }); +}); + +describe('durationMiddleware', () => { + it('should record the duration of the request', async () => { + // Mock getDestTypeFromContext to return a fixed value + getDestTypeFromContext.mockReturnValue('mock-destination-type'); + + const app = new Koa(); // Create a Koa app instance + addStatMiddleware(app); // Pass the app instance to the middleware + + const ctx = { + method: 'GET', + status: 200, + request: { url: '/test' }, + }; + const next = jest.fn().mockResolvedValue(null); + + // Simulate the middleware execution + await app.middleware[0](ctx, next); + + expect(stats.timing).toHaveBeenCalledWith('http_request_duration', expect.any(Date), { + method: 'GET', + code: 200, + route: '/test', + destType: 'mock-destination-type', // Mocked value + }); + }); +}); + +describe('requestSizeMiddleware', () => { + it('should record the size of the request and response', async () => { + const app = new Koa(); // Create a Koa app instance + addRequestSizeMiddleware(app); // Pass the app instance to the middleware + + const ctx = { + method: 'POST', + status: 200, + request: { + url: '/test', + body: { key: 'value' }, + }, + response: { + body: { success: true }, + }, + }; + const next = jest.fn().mockResolvedValue(null); + + // Simulate the middleware execution + await app.middleware[0](ctx, next); + + expect(stats.histogram).toHaveBeenCalledWith('http_request_size', expect.any(Number), { + method: 'POST', + code: 200, + route: '/test', + }); + + expect(stats.histogram).toHaveBeenCalledWith('http_response_size', expect.any(Number), { + method: 'POST', + code: 200, + route: '/test', + }); + }); +}); diff --git a/src/middlewares/stats.ts b/src/middlewares/stats.ts new file mode 100644 index 00000000000..6fe0cc1c2cd --- /dev/null +++ b/src/middlewares/stats.ts @@ -0,0 +1,15 @@ +import { Context, Next } from 'koa'; + +export class StatsMiddleware { + private static instanceID: string = process.env.INSTANCE_ID || 'default'; + + private static workerID: string = process.env.WORKER_ID || 'master'; + + public static async executionStats(ctx: Context, next: Next) { + const start = Date.now(); + await next(); + const ms = Date.now() - start; + ctx.set('X-Response-Time', `${ms}ms`); + ctx.set('X-Instance-ID', `${StatsMiddleware.instanceID}/${StatsMiddleware.workerID}`); + } +} diff --git a/src/routerUtils.js b/src/routerUtils.js index 081070d78ac..67b6e0d31c4 100644 --- a/src/routerUtils.js +++ b/src/routerUtils.js @@ -4,13 +4,7 @@ const logger = require('./logger'); const { proxyRequest } = require('./adapters/network'); const { nodeSysErrorToStatus } = require('./adapters/utils/networkUtils'); -let areFunctionsEnabled = -1; -const functionsEnabled = () => { - if (areFunctionsEnabled === -1) { - areFunctionsEnabled = process.env.ENABLE_FUNCTIONS === 'false' ? 0 : 1; - } - return areFunctionsEnabled === 1; -}; +const functionsEnabled = () => process.env.ENABLE_FUNCTIONS !== 'false'; const userTransformHandler = () => { if (functionsEnabled()) { diff --git a/src/routerUtils.test.js b/src/routerUtils.test.js new file mode 100644 index 00000000000..81c8ed49919 --- /dev/null +++ b/src/routerUtils.test.js @@ -0,0 +1,126 @@ +const { sendToDestination, userTransformHandler } = require('./routerUtils'); // Update the path accordingly + +const logger = require('./logger'); +const { proxyRequest } = require('./adapters/network'); +const { nodeSysErrorToStatus } = require('./adapters/utils/networkUtils'); + +// Mock dependencies +jest.mock('./logger'); +jest.mock('./adapters/network'); +jest.mock('./adapters/utils/networkUtils'); + +describe('sendToDestination', () => { + beforeEach(() => { + jest.clearAllMocks(); // Clear mocks before each test + }); + + it('should send a request to the destination and return a successful response', async () => { + // Mock proxyRequest to return a successful response + proxyRequest.mockResolvedValue({ + success: true, + response: { + headers: { 'content-type': 'application/json' }, + data: { message: 'Success' }, + status: 200, + }, + }); + + const destination = 'mock-destination'; + const payload = { key: 'value' }; + + const result = await sendToDestination(destination, payload); + + expect(logger.info).toHaveBeenCalledWith('Request recieved for destination', destination); + expect(proxyRequest).toHaveBeenCalledWith(payload); + expect(result).toEqual({ + headers: { 'content-type': 'application/json' }, + response: { message: 'Success' }, + status: 200, + }); + }); + + it('should handle network failure and return a parsed response', async () => { + // Mock proxyRequest to return a network failure + proxyRequest.mockResolvedValue({ + success: false, + response: { + code: 'ENOTFOUND', // Simulate a network error + }, + }); + + // Mock nodeSysErrorToStatus to return a specific error message and status + nodeSysErrorToStatus.mockReturnValue({ + message: 'Network error', + status: 500, + }); + + const destination = 'mock-destination'; + const payload = { key: 'value' }; + + const result = await sendToDestination(destination, payload); + + expect(logger.info).toHaveBeenCalledWith('Request recieved for destination', destination); + expect(proxyRequest).toHaveBeenCalledWith(payload); + expect(nodeSysErrorToStatus).toHaveBeenCalledWith('ENOTFOUND'); + expect(result).toEqual({ + headers: null, + networkFailure: true, + response: 'Network error', + status: 500, + }); + }); + + it('should handle axios error with response and return a parsed response', async () => { + // Mock proxyRequest to return an axios error with response + proxyRequest.mockResolvedValue({ + success: false, + response: { + response: { + headers: { 'content-type': 'application/json' }, + status: 400, + data: 'Bad Request', + }, + }, + }); + + const destination = 'mock-destination'; + const payload = { key: 'value' }; + + const result = await sendToDestination(destination, payload); + + expect(logger.info).toHaveBeenCalledWith('Request recieved for destination', destination); + expect(proxyRequest).toHaveBeenCalledWith(payload); + expect(result).toEqual({ + headers: { 'content-type': 'application/json' }, + status: 400, + response: 'Bad Request', + }); + }); +}); + +describe('userTransformHandler', () => { + beforeEach(() => { + jest.clearAllMocks(); // Clear mocks before each test + jest.resetModules(); // Reset modules to reset process.env + }); + + it('should return userTransformHandler when functions are enabled', () => { + // Mock process.env to enable functions + process.env.ENABLE_FUNCTIONS = 'true'; + + const mockUserTransformHandler = jest.fn(); + jest.mock('./util/customTransformer', () => ({ + userTransformHandler: mockUserTransformHandler, + })); + + const result = userTransformHandler(); + expect(result).toBe(mockUserTransformHandler); + }); + + it('should throw an error when functions are not enabled', () => { + // Mock process.env to disable functions + process.env.ENABLE_FUNCTIONS = 'false'; + + expect(() => userTransformHandler()).toThrow('Functions are not enabled'); + }); +}); diff --git a/src/routes/bulkUpload.ts b/src/routes/bulkUpload.ts deleted file mode 100644 index efbd81c34e0..00000000000 --- a/src/routes/bulkUpload.ts +++ /dev/null @@ -1,17 +0,0 @@ -import Router from '@koa/router'; -import { - fileUpload, - pollStatus, - getFailedJobStatus, - getWarnJobStatus, -} from '../controllers/bulkUpload'; - -const router = new Router(); - -router.post('/fileUpload', fileUpload); -router.post('/pollStatus', pollStatus); -router.post('/getFailedJobs', getFailedJobStatus); -router.post('/getWarningJobs', getWarnJobStatus); -const bulkUploadRoutes = router.routes(); - -export default bulkUploadRoutes; diff --git a/src/routes/index.ts b/src/routes/index.ts index d77584bea34..9bd40b8e680 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -5,7 +5,6 @@ import dotenv from 'dotenv'; import { koaSwagger } from 'koa2-swagger-ui'; import path from 'path'; import userTransformRoutes from './userTransform'; -import bulkUploadRoutes from './bulkUpload'; import proxyRoutes from './delivery'; import destinationRoutes from './destination'; import miscRoutes from './misc'; @@ -17,11 +16,7 @@ import { isNotEmpty } from '../v0/util'; dotenv.config(); -// eslint-disable-next-line @typescript-eslint/no-unused-vars -const enableSwagger = process.env.ENABLE_SWAGGER === 'true'; - export function applicationRoutes(app: Koa) { - app.use(bulkUploadRoutes); app.use(proxyRoutes); app.use(destinationRoutes); app.use(miscRoutes); diff --git a/src/routes/userTransform.ts b/src/routes/userTransform.ts index fc61ab7b941..e2883bdc22f 100644 --- a/src/routes/userTransform.ts +++ b/src/routes/userTransform.ts @@ -1,7 +1,8 @@ import Router from '@koa/router'; -import { RouteActivationMiddleware } from '../middlewares/routeActivation'; -import { FeatureFlagMiddleware } from '../middlewares/featureFlag'; import { UserTransformController } from '../controllers/userTransform'; +import { FeatureFlagMiddleware } from '../middlewares/featureFlag'; +import { RouteActivationMiddleware } from '../middlewares/routeActivation'; +import { StatsMiddleware } from '../middlewares/stats'; const router = new Router(); @@ -15,6 +16,7 @@ router.post( '/customTransform', RouteActivationMiddleware.isUserTransformRouteActive, FeatureFlagMiddleware.handle, + StatsMiddleware.executionStats, UserTransformController.transform, ); router.post( diff --git a/src/services/comparator.ts b/src/services/comparator.ts index 1eb67cd5979..3f90d962e3f 100644 --- a/src/services/comparator.ts +++ b/src/services/comparator.ts @@ -61,8 +61,9 @@ export class ComparatorService implements DestinationService { return metaTO; } - private getTestThreshold(destination: Destination) { - return destination.DestinationDefinition?.Config?.camparisonTestThreshold || 0; + private getTestThreshold(destination: Destination): number { + const threshold = destination.DestinationDefinition.Config.camparisonTestThreshold; + return typeof threshold === 'number' ? threshold : 0; } private getComparisonLogs( diff --git a/src/services/destination/__tests__/nativeIntegration.test.ts b/src/services/destination/__tests__/nativeIntegration.test.ts index 3ec3222b9d6..326a170cd0b 100644 --- a/src/services/destination/__tests__/nativeIntegration.test.ts +++ b/src/services/destination/__tests__/nativeIntegration.test.ts @@ -16,7 +16,7 @@ describe('NativeIntegration Service', () => { const destType = '__rudder_test__'; const version = 'v0'; const requestMetadata = {}; - const event = { message: { a: 'b' } } as ProcessorTransformationRequest; + const event = { message: { a: 'b' } } as unknown as ProcessorTransformationRequest; const events: ProcessorTransformationRequest[] = [event, event]; const tevent = { version: 'v0', endpoint: 'http://abc' } as ProcessorTransformationOutput; @@ -58,7 +58,7 @@ describe('NativeIntegration Service', () => { const destType = '__rudder_test__'; const version = 'v0'; const requestMetadata = {}; - const event = { message: { a: 'b' } } as ProcessorTransformationRequest; + const event = { message: { a: 'b' } } as unknown as ProcessorTransformationRequest; const events: ProcessorTransformationRequest[] = [event, event]; FetchHandler.getDestHandler = jest.fn().mockImplementation((d, v) => { diff --git a/src/services/destination/__tests__/preTransformation.test.ts b/src/services/destination/__tests__/preTransformation.test.ts index c10bab78acb..5d6624b7f41 100644 --- a/src/services/destination/__tests__/preTransformation.test.ts +++ b/src/services/destination/__tests__/preTransformation.test.ts @@ -8,13 +8,13 @@ describe('PreTransformation Service', () => { ctx.request.query = { cycle: 'true', x: 'y' }; const events: ProcessorTransformationRequest[] = [ - { message: { a: 'b' } } as ProcessorTransformationRequest, + { message: { a: 'b' } } as unknown as ProcessorTransformationRequest, ]; const expected: ProcessorTransformationRequest[] = [ { message: { a: 'b' }, request: { query: { cycle: 'true', x: 'y' } }, - } as ProcessorTransformationRequest, + } as unknown as ProcessorTransformationRequest, ]; const resp = DestinationPreTransformationService.preProcess(events, ctx); diff --git a/src/services/destination/cdkV2Integration.ts b/src/services/destination/cdkV2Integration.ts index 0789a98c1e7..8175d167a69 100644 --- a/src/services/destination/cdkV2Integration.ts +++ b/src/services/destination/cdkV2Integration.ts @@ -61,8 +61,8 @@ export class CDKV2DestinationService implements DestinationService { events.map(async (event) => { const metaTo = this.getTags( destinationType, - event.metadata.destinationId, - event.metadata.workspaceId, + event.metadata?.destinationId, + event.metadata?.workspaceId, tags.FEATURES.PROCESSOR, ); metaTo.metadata = event.metadata; diff --git a/src/services/destination/nativeIntegration.ts b/src/services/destination/nativeIntegration.ts index 38ec934ff7a..c0b389bf565 100644 --- a/src/services/destination/nativeIntegration.ts +++ b/src/services/destination/nativeIntegration.ts @@ -151,8 +151,8 @@ export class NativeIntegrationDestinationService implements DestinationService { const response = groupedEvents.map((destEvents) => { const metaTO = this.getTags( destinationType, - destEvents[0].metadata.destinationId, - destEvents[0].metadata.workspaceId, + destEvents[0].metadata?.destinationId, + destEvents[0].metadata?.workspaceId, tags.FEATURES.BATCH, ); metaTO.metadatas = events.map((event) => event.metadata); diff --git a/src/services/destination/preTransformation.ts b/src/services/destination/preTransformation.ts index db1d76d64ed..9bdaab96612 100644 --- a/src/services/destination/preTransformation.ts +++ b/src/services/destination/preTransformation.ts @@ -1,5 +1,7 @@ import { Context } from 'koa'; import { ProcessorTransformationRequest, RouterTransformationRequestData } from '../../types/index'; +import { DynamicConfigParser } from '../../util/dynamicConfigParser'; +import { oncehubTransformer } from '../../util/oncehub-custom-transformer'; export class DestinationPreTransformationService { public static preProcess( @@ -9,9 +11,12 @@ export class DestinationPreTransformationService { const reqParams = ctx.request.query; const eventsProcessed = events.map( (event: ProcessorTransformationRequest | RouterTransformationRequestData) => { - // eslint-disable-next-line no-param-reassign - event.request = { query: reqParams }; - return event; + // look for traits under every object in file v0\util\data\GenericFieldMapping.json like + // "traits": ["traits", "context.traits"] + const destination = event?.destination?.DestinationDefinition?.Name; + let parsedEvent = oncehubTransformer(destination, event); + parsedEvent.request = { query: reqParams }; + return parsedEvent; }, ); return eventsProcessed; diff --git a/src/services/misc.ts b/src/services/misc.ts index 334b54ba17b..897e8acc793 100644 --- a/src/services/misc.ts +++ b/src/services/misc.ts @@ -14,6 +14,9 @@ export class MiscService { } public static getSourceHandler(source: string, version: string) { + if (version === 'v2') { + return require(`../sources/${source}/transform`); + } return require(`../${version}/sources/${source}/transform`); } @@ -33,7 +36,7 @@ export class MiscService { }; } - public static getMetaTags(metadata: Metadata) { + public static getMetaTags(metadata?: Metadata) { if (!metadata) { return {}; } diff --git a/src/services/source/__tests__/nativeIntegration.test.ts b/src/services/source/__tests__/nativeIntegration.test.ts index 51bb37f5f13..d0decd20258 100644 --- a/src/services/source/__tests__/nativeIntegration.test.ts +++ b/src/services/source/__tests__/nativeIntegration.test.ts @@ -1,5 +1,8 @@ import { FetchHandler } from '../../../helpers/fetchHandlers'; -import { RudderMessage, SourceTransformationResponse } from '../../../types/index'; +import { + SourceTransformationResponse, + SourceTransformationSuccessResponse, +} from '../../../types/index'; import stats from '../../../util/stats'; import { NativeIntegrationSourceService } from '../nativeIntegration'; import { SourcePostTransformationService } from '../postTransformation'; @@ -21,8 +24,11 @@ describe('NativeIntegration Source Service', () => { const event = { message: { a: 'b' }, headers }; const events = [event, event]; - const tevent = { anonymousId: 'test', context: { headers } } as RudderMessage; - const tresp = { output: { batch: [tevent] }, statusCode: 200 } as SourceTransformationResponse; + const tevent = { anonymousId: 'test', context: { headers } }; + const tresp = { + output: { batch: [tevent] }, + statusCode: 200, + } as unknown as SourceTransformationSuccessResponse; const tresponse = [tresp, tresp]; diff --git a/src/services/source/__tests__/postTransformation.test.ts b/src/services/source/__tests__/postTransformation.test.ts index ea8b463bf92..1a30df21d68 100644 --- a/src/services/source/__tests__/postTransformation.test.ts +++ b/src/services/source/__tests__/postTransformation.test.ts @@ -28,12 +28,14 @@ describe('Source PostTransformation Service', () => { const event = { outputToSource: {}, output: { batch: [{ anonymousId: 'test' }] }, + statusCode: 200, } as SourceTransformationResponse; const postProcessedEvents = { outputToSource: {}, output: { batch: [{ anonymousId: 'test', context: { headers } }] }, - } as SourceTransformationResponse; + statusCode: 200, + } as unknown as SourceTransformationResponse; const result = SourcePostTransformationService.handleSuccessEventsSource(event, { headers }); diff --git a/src/services/source/nativeIntegration.ts b/src/services/source/nativeIntegration.ts index 078716df96c..e5f4ec0a46a 100644 --- a/src/services/source/nativeIntegration.ts +++ b/src/services/source/nativeIntegration.ts @@ -1,7 +1,9 @@ +import { JsonSchemaGenerator } from '@rudderstack/integrations-lib'; import { FetchHandler } from '../../helpers/fetchHandlers'; import { SourceService } from '../../interfaces/SourceService'; import { ErrorDetailer, + ErrorDetailerOptions, MetaTransferObject, RudderMessage, SourceInputConversionResult, @@ -13,15 +15,17 @@ import { FixMe } from '../../util/types'; import tags from '../../v0/util/tags'; import { SourcePostTransformationService } from './postTransformation'; import logger from '../../logger'; +import { getBodyFromV2SpecPayload } from '../../v0/util'; export class NativeIntegrationSourceService implements SourceService { - public getTags(): MetaTransferObject { + public getTags(extraErrorDetails: ErrorDetailerOptions = {}): MetaTransferObject { const metaTO = { errorDetails: { module: tags.MODULES.SOURCE, implementation: tags.IMPLEMENTATIONS.NATIVE, destinationId: 'Non determinable', workspaceId: 'Non determinable', + ...extraErrorDetails, } as ErrorDetailer, errorContext: '[Native Integration Service] Failure During Source Transform', } as MetaTransferObject; @@ -36,7 +40,7 @@ export class NativeIntegrationSourceService implements SourceService { _requestMetadata: NonNullable, ): Promise { const sourceHandler = FetchHandler.getSourceHandler(sourceType, version); - const metaTO = this.getTags(); + const metaTO = this.getTags({ srcType: sourceType }); const respList: SourceTransformationResponse[] = await Promise.all( sourceEvents.map(async (sourceEvent) => { try { @@ -80,6 +84,19 @@ export class NativeIntegrationSourceService implements SourceService { logger.debug(`Error during source Transform: ${error}`, { ...logger.getLogMetadata(metaTO.errorDetails), }); + // log the payload schema here + const duplicateSourceEvent: any = sourceEvent; + try { + duplicateSourceEvent.output.request.body = getBodyFromV2SpecPayload( + duplicateSourceEvent?.output, + ); + } catch (e) { + /* empty */ + } + logger.error( + `Sample Payload Schema for source ${sourceType} : ${JSON.stringify(JsonSchemaGenerator.generate(duplicateSourceEvent))}`, + ); + return SourcePostTransformationService.handleFailureEventsSource(error, metaTO); } }), diff --git a/src/services/source/postTransformation.ts b/src/services/source/postTransformation.ts index c62f0ed7138..962860fa925 100644 --- a/src/services/source/postTransformation.ts +++ b/src/services/source/postTransformation.ts @@ -1,4 +1,9 @@ -import { MetaTransferObject, RudderMessage, SourceTransformationResponse } from '../../types/index'; +import { + MetaTransferObject, + RudderMessage, + SourceTransformationResponse, + SourceTransformationSuccessResponse, +} from '../../types/index'; import { CommonUtils } from '../../util/common'; import { CatchErr } from '../../util/types'; import { generateErrorObject } from '../../v0/util'; @@ -26,12 +31,12 @@ export class SourcePostTransformationService { // We send response back to the source // through outputToSource. This is not sent to gateway // We will not return array for events not meant for gateway - let sourceTransformationResponse = events as SourceTransformationResponse; + let sourceTransformationResponse = events as SourceTransformationSuccessResponse; if (!Object.prototype.hasOwnProperty.call(events, 'outputToSource')) { const eventsBatch = CommonUtils.toArray(events); sourceTransformationResponse = { output: { batch: eventsBatch }, - } as SourceTransformationResponse; + } as SourceTransformationSuccessResponse; } if (sourceTransformationResponse.output) { diff --git a/src/services/userTransform.ts b/src/services/userTransform.ts index 2afad88c56a..345985d5179 100644 --- a/src/services/userTransform.ts +++ b/src/services/userTransform.ts @@ -38,7 +38,6 @@ export class UserTransformService { `${event.metadata.destinationId}_${event.metadata.sourceId}`, ); stats.counter('user_transform_function_group_size', Object.entries(groupedEvents).length, {}); - stats.histogram('user_transform_input_events', events.length, {}); const transformedEvents: FixMe[] = []; let librariesVersionIDs: FixMe[] = []; @@ -63,11 +62,12 @@ export class UserTransformService { const messageIdsInOutputSet = new Set(); + const workspaceId = eventsToProcess[0]?.metadata.workspaceId; const commonMetadata = { sourceId: eventsToProcess[0]?.metadata?.sourceId, destinationId: eventsToProcess[0]?.metadata.destinationId, destinationType: eventsToProcess[0]?.metadata.destinationType, - workspaceId: eventsToProcess[0]?.metadata.workspaceId, + workspaceId, transformationId: eventsToProcess[0]?.metadata.transformationId, messageIds, }; @@ -76,6 +76,7 @@ export class UserTransformService { eventsToProcess.length > 0 && eventsToProcess[0].metadata ? getMetadata(eventsToProcess[0].metadata) : {}; + const transformationTags = getTransformationMetadata(eventsToProcess[0]?.metadata); if (!transformationVersionId) { const errorMessage = 'Transformation VersionID not found'; @@ -87,6 +88,11 @@ export class UserTransformService { } as ProcessorTransformationResponse); return transformedEvents; } + stats.counter('user_transform_input_events', events.length, { workspaceId }); + logger.info('user_transform_input_events', { + inCount: events.length, + ...transformationTags, + }); const userFuncStartTime = new Date(); try { const destTransformedEvents: UserTransformationResponse[] = await userTransformHandler()( @@ -167,22 +173,28 @@ export class UserTransformService { stats.counter('user_transform_errors', eventsToProcess.length, { status, ...metaTags, - ...getTransformationMetadata(eventsToProcess[0]?.metadata), + ...transformationTags, }); } finally { stats.timingSummary('user_transform_request_latency_summary', userFuncStartTime, { ...metaTags, - ...getTransformationMetadata(eventsToProcess[0]?.metadata), + ...transformationTags, }); stats.summary('user_transform_batch_size_summary', requestSize, { ...metaTags, - ...getTransformationMetadata(eventsToProcess[0]?.metadata), + ...transformationTags, }); } stats.counter('user_transform_requests', 1, {}); - stats.histogram('user_transform_output_events', transformedEvents.length, {}); + stats.counter('user_transform_output_events', transformedEvents.length, { + workspaceId, + }); + logger.info('user_transform_output_events', { + outCount: transformedEvents.length, + ...transformationTags, + }); return transformedEvents; }), ); diff --git a/src/v0/sources/adjust/config.ts b/src/sources/adjust/config.ts similarity index 100% rename from src/v0/sources/adjust/config.ts rename to src/sources/adjust/config.ts diff --git a/src/sources/adjust/core.js b/src/sources/adjust/core.js new file mode 100644 index 00000000000..0aaa5459690 --- /dev/null +++ b/src/sources/adjust/core.js @@ -0,0 +1,38 @@ +const path = require('path'); +const fs = require('fs'); +const Message = require('../message'); +const { excludedFieldList } = require('./config'); +const { extractCustomFields, generateUUID } = require('../../v0/util'); +const { convertToISODate } = require('./utils'); + +// ref : https://help.adjust.com/en/article/global-callbacks#general-recommended-placeholders +// import mapping json using JSON.parse to preserve object key order +const mapping = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); + +const processPayload = (payload) => { + const message = new Message(`Adjust`); + + // event type is always track + const eventType = 'track'; + message.setEventType(eventType); + message.setPropertiesV2(payload, mapping); + let customProperties = {}; + + // to remove writeKey from custom properties we can add it to excludedFieldList + excludedFieldList.push('writeKey'); + + customProperties = extractCustomFields(payload, customProperties, 'root', excludedFieldList); + + message.properties = { ...message.properties, ...customProperties }; + + if (payload.created_at) { + const ts = convertToISODate(payload.created_at); + message.setProperty('originalTimestamp', ts); + message.setProperty('timestamp', ts); + } + // adjust does not has the concept of user but we need to set some random anonymousId in order to make the server accept the message + message.anonymousId = generateUUID(); + return message; +}; + +module.exports = { processPayload }; diff --git a/src/v0/sources/adjust/mapping.json b/src/sources/adjust/mapping.json similarity index 100% rename from src/v0/sources/adjust/mapping.json rename to src/sources/adjust/mapping.json diff --git a/src/sources/adjust/transform.js b/src/sources/adjust/transform.js new file mode 100644 index 00000000000..42dec5320a8 --- /dev/null +++ b/src/sources/adjust/transform.js @@ -0,0 +1,45 @@ +const { flattenQueryParams, TransformationError } = require('@rudderstack/integrations-lib'); +const { CommonUtils } = require('../../util/common'); +const logger = require('../../logger'); +const { processPayload } = require('./core'); + +/** + * Extracts and flattens query parameters from the webhook request + * @param {Object} inputRequest - The incoming webhook request object + * @returns {Object} Flattened query parameters + * @throws {TransformationError} If request or query_parameters are missing + */ +const getPayloadFromRequest = (inputRequest) => { + const { request } = inputRequest; + if (!request) { + throw new TransformationError('request field is missing from webhook V2 payload'); + } + + const { query_parameters: qParams } = request; + logger.debug(`[Adjust] Input event: query_params: ${JSON.stringify(qParams)}`); + if (!qParams || Object.keys(qParams).length === 0) { + throw new TransformationError('Query_parameters is missing'); + } + + return flattenQueryParams(qParams); +}; + +/** + * Processes incoming webhook requests from Adjust + * @param {Object|Array} requests - Single request object or array of webhook requests + * @returns {Array} Array of transformed payloads ready to be sent to rudder-server + * @description + * This function: + * - converts incoming payload to array + * - extracts params and constructs payload + * - sends it to processPayload for transformation + */ +const process = (requests) => { + const requestsArray = CommonUtils.toArray(requests); + return requestsArray.map((inputRequest) => { + const formattedPayload = getPayloadFromRequest(inputRequest); + return processPayload(formattedPayload); + }); +}; + +module.exports = { process }; diff --git a/src/v0/sources/adjust/utils.js b/src/sources/adjust/utils.js similarity index 70% rename from src/v0/sources/adjust/utils.js rename to src/sources/adjust/utils.js index 73ec696e342..9b85ea24009 100644 --- a/src/v0/sources/adjust/utils.js +++ b/src/sources/adjust/utils.js @@ -1,5 +1,11 @@ const { TransformationError } = require('@rudderstack/integrations-lib'); +/** + * Converts a raw timestamp to ISO 8601 date string format + * @param {number|string} rawTimestamp - The timestamp to convert (expects Unix timestamp in seconds) + * @returns {string} The timestamp converted to ISO 8601 format + * @throws {TransformationError} If the timestamp is invalid or cannot be parsed + */ const convertToISODate = (rawTimestamp) => { if (typeof rawTimestamp !== 'number' && typeof rawTimestamp !== 'string') { throw new TransformationError( diff --git a/src/sources/adjust/utils.test.js b/src/sources/adjust/utils.test.js new file mode 100644 index 00000000000..cc1ab6e2606 --- /dev/null +++ b/src/sources/adjust/utils.test.js @@ -0,0 +1,66 @@ +const { convertToISODate } = require('./utils'); +const { TransformationError } = require('@rudderstack/integrations-lib'); + +describe('convertToISODate', () => { + const testCases = [ + { + name: 'valid numeric timestamp', + input: 1633072800, + expected: '2021-10-01T07:20:00.000Z', + shouldThrow: false, + }, + { + name: 'non-numeric string', + input: 'invalid', + shouldThrow: true, + errorType: TransformationError, + }, + { + name: 'valid numeric string timestamp', + input: '1633072800', + expected: '2021-10-01T07:20:00.000Z', + shouldThrow: false, + }, + { + name: 'object input', + input: {}, + shouldThrow: true, + errorType: TransformationError, + }, + { + name: 'array input', + input: [], + shouldThrow: true, + errorType: TransformationError, + }, + { + name: 'null input', + input: null, + shouldThrow: true, + errorType: TransformationError, + }, + { + name: 'undefined input', + input: undefined, + shouldThrow: true, + errorType: TransformationError, + }, + { + name: 'huge timestamp that becomes invalid', + input: 999999999999999, + shouldThrow: true, + errorType: TransformationError, + }, + ]; + + testCases.forEach(({ name, input, expected, shouldThrow, errorType }) => { + it(`should handle ${name}`, () => { + if (shouldThrow) { + expect(() => convertToISODate(input)).toThrow(errorType); + } else { + const result = convertToISODate(input); + expect(result).toBe(expected); + } + }); + }); +}); diff --git a/src/v0/sources/appcenter/mapping.json b/src/sources/appcenter/mapping.json similarity index 100% rename from src/v0/sources/appcenter/mapping.json rename to src/sources/appcenter/mapping.json diff --git a/src/v0/sources/appcenter/transform.js b/src/sources/appcenter/transform.js similarity index 88% rename from src/v0/sources/appcenter/transform.js rename to src/sources/appcenter/transform.js index 35d15f697e3..d885abb7ef6 100644 --- a/src/v0/sources/appcenter/transform.js +++ b/src/sources/appcenter/transform.js @@ -1,14 +1,12 @@ const path = require('path'); const fs = require('fs'); const { TransformationError } = require('@rudderstack/integrations-lib'); -const utils = require('../../util'); +const utils = require('../../v0/util'); const Message = require('../message'); const mappingJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); -const { removeUndefinedAndNullValues } = require('../../util'); - -const { JSON_MIME_TYPE } = require('../../util/constant'); +const { JSON_MIME_TYPE } = require('../../v0/util/constant'); const processNormalEvent = (event) => { const message = new Message(`APPCENTER`); @@ -56,11 +54,12 @@ const processTestEvent = (event) => ({ statusCode: 200, }); -const process = (event) => { +const process = (payload) => { + const event = utils.getBodyFromV2SpecPayload(payload); const response = isTestEvent(event) ? processTestEvent(event) : processNormalEvent(event); // to bypass the unit testcases ( we may change this) // response.anonymousId = "7e32188a4dab669f"; - return removeUndefinedAndNullValues(response); + return utils.removeUndefinedAndNullValues(response); }; exports.process = process; diff --git a/src/v0/sources/appsflyer/mapping.json b/src/sources/appsflyer/mapping.json similarity index 100% rename from src/v0/sources/appsflyer/mapping.json rename to src/sources/appsflyer/mapping.json diff --git a/src/sources/appsflyer/transform.js b/src/sources/appsflyer/transform.js new file mode 100644 index 00000000000..07e60f136e3 --- /dev/null +++ b/src/sources/appsflyer/transform.js @@ -0,0 +1,80 @@ +const path = require('path'); +const fs = require('fs'); +const { TransformationError } = require('@rudderstack/integrations-lib'); +const Message = require('../message'); +const { + generateUUID, + getBodyFromV2SpecPayload, + removeUndefinedAndNullValues, + isObject, +} = require('../../v0/util'); +const { getAdvertisingId } = require('./utils'); + +const mappingJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); + +const TRACK_MESSAGE_TYPE = 'track'; + +function createBaseMessage(eventName) { + const message = new Message(`AF`); + message.setEventType(TRACK_MESSAGE_TYPE); + message.setEventName(eventName); + return message; +} + +function processEvent(event) { + if (!event.event_name) { + throw new TransformationError('Unknwon event type from Appsflyer'); + } + + const message = createBaseMessage(event.event_name); + + const properties = { ...event }; + message.setProperty('properties', properties); + + // set fields in payload from mapping json + message.setProperties(event, mappingJson); + + const mappedPropertiesKeys = Object.keys(mappingJson); + + if (!isObject(message.context.device)) { + message.context.device = {}; + } + + if (event.platform) { + const advertisingId = getAdvertisingId(event); + if (advertisingId) { + message.context.device.advertisingId = advertisingId; + message.context.device.adTrackingEnabled = true; + } + mappedPropertiesKeys.push('idfa', 'android_id'); + } + + if (event.appsflyer_id) { + message.context.externalId = [ + { + type: 'appsflyerExternalId', + value: event.appsflyer_id, + }, + ]; + mappedPropertiesKeys.push('appsflyer_id'); + } + message.setProperty('anonymousId', generateUUID()); + + // Remove the fields from properties that are already mapped to other fields. + mappedPropertiesKeys.forEach((key) => { + if (message.properties && message.properties[key] !== undefined) { + delete message.properties[key]; + } + }); + + return message; +} + +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); + const response = processEvent(event); + const returnValue = removeUndefinedAndNullValues(response); + return returnValue; +} + +exports.process = process; diff --git a/src/sources/appsflyer/utils.js b/src/sources/appsflyer/utils.js new file mode 100644 index 00000000000..dc02833f67a --- /dev/null +++ b/src/sources/appsflyer/utils.js @@ -0,0 +1,13 @@ +const { isAppleFamily, isAndroidFamily } = require('../../v0/util'); + +function getAdvertisingId(event) { + if (isAppleFamily(event.platform)) { + return event.idfa; + } + if (isAndroidFamily(event.platform)) { + return event.android_id; + } + return null; +} + +module.exports = { getAdvertisingId }; diff --git a/src/sources/appsflyer/utils.test.js b/src/sources/appsflyer/utils.test.js new file mode 100644 index 00000000000..845854cf001 --- /dev/null +++ b/src/sources/appsflyer/utils.test.js @@ -0,0 +1,56 @@ +const { getAdvertisingId } = require('./utils'); + +describe('getAdvertisingId', () => { + const testCases = [ + { + name: 'should return idfa for iOS device', + event: { + platform: 'iOS', + idfa: 'ios-advertising-id-123', + android_id: 'not-this-one', + }, + expected: 'ios-advertising-id-123', + }, + { + name: 'should return idfa for iPadOS device', + event: { + platform: 'iPadOS', + idfa: 'ipad-advertising-id-456', + android_id: 'not-this-one', + }, + expected: 'ipad-advertising-id-456', + }, + { + name: 'should return android_id for Android device', + event: { + platform: 'Android', + idfa: 'not-this-one', + android_id: 'android-advertising-id-789', + }, + expected: 'android-advertising-id-789', + }, + { + name: 'should return null for unknown platform', + event: { + platform: 'Windows', + idfa: 'some-id', + android_id: 'some-other-id', + }, + expected: null, + }, + { + name: 'should return null when platform is missing', + event: { + idfa: 'some-id', + android_id: 'some-other-id', + }, + expected: null, + }, + ]; + + testCases.forEach(({ name, event, expected }) => { + it(name, () => { + expect(getAdvertisingId(event)).toBe(expected); + }); + }); +}); diff --git a/src/v0/sources/auth0/eventMapping.json b/src/sources/auth0/eventMapping.json similarity index 100% rename from src/v0/sources/auth0/eventMapping.json rename to src/sources/auth0/eventMapping.json diff --git a/src/v0/sources/auth0/mapping.json b/src/sources/auth0/mapping.json similarity index 100% rename from src/v0/sources/auth0/mapping.json rename to src/sources/auth0/mapping.json diff --git a/src/v0/sources/auth0/transform.js b/src/sources/auth0/transform.js similarity index 87% rename from src/v0/sources/auth0/transform.js rename to src/sources/auth0/transform.js index 5a1bf42e28a..22920cb6256 100644 --- a/src/v0/sources/auth0/transform.js +++ b/src/sources/auth0/transform.js @@ -1,11 +1,11 @@ const path = require('path'); const fs = require('fs'); -const { removeUndefinedAndNullValues } = require('../../util'); +const { removeUndefinedAndNullValues, getBodyFromV2SpecPayload } = require('../../v0/util'); const { getGroupId } = require('./util'); // import mapping json using JSON.parse to preserve object key order const mapping = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); const Message = require('../message'); -const { generateUUID } = require('../../util'); +const { generateUUID } = require('../../v0/util'); // Ref: https://auth0.com/docs/logs/references/log-event-type-codes const eventNameMap = JSON.parse( @@ -45,7 +45,7 @@ function processEvents(eventList) { // eslint-disable-next-line @typescript-eslint/naming-convention const { data, log_id } = event; // Dropping the event if type is not present - if (data && data.type) { + if (data?.type) { const eventType = data.type; // ss -> successful signup if (eventType === 'ss') { @@ -69,10 +69,11 @@ function processEvents(eventList) { return responses; } -function process(events) { - let eventList = events; - if (!Array.isArray(events)) { - eventList = events.logs || [events]; +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); + let eventList = event; + if (!Array.isArray(event)) { + eventList = event.logs || [event]; } return processEvents(eventList); } diff --git a/src/v0/sources/auth0/util.js b/src/sources/auth0/util.js similarity index 100% rename from src/v0/sources/auth0/util.js rename to src/sources/auth0/util.js diff --git a/src/v1/sources/braze/ignore.json b/src/sources/braze/ignore.json similarity index 100% rename from src/v1/sources/braze/ignore.json rename to src/sources/braze/ignore.json diff --git a/src/v1/sources/braze/mapping.json b/src/sources/braze/mapping.json similarity index 100% rename from src/v1/sources/braze/mapping.json rename to src/sources/braze/mapping.json diff --git a/src/v1/sources/braze/transform.js b/src/sources/braze/transform.js similarity index 87% rename from src/v1/sources/braze/transform.js rename to src/sources/braze/transform.js index 771c5887b33..5d19e26fb3c 100644 --- a/src/v1/sources/braze/transform.js +++ b/src/sources/braze/transform.js @@ -7,8 +7,9 @@ const { formatTimeStamp, removeUndefinedAndNullValues, getHashFromArray, -} = require('../../../v0/util'); -const Message = require('../../../v0/sources/message'); + getBodyFromV2SpecPayload, +} = require('../../v0/util'); +const Message = require('../message'); // import mapping json using JSON.parse to preserve object key order const mapping = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); @@ -66,14 +67,18 @@ const processEvent = (event, eventMapping) => { throw new TransformationError('Unknown event type from Braze'); }; -const process = (inputEvent) => { - const { event, source } = inputEvent; +const process = (payload) => { + const event = getBodyFromV2SpecPayload(payload); + const { source } = payload; const { customMapping } = source.Config; const eventMapping = getHashFromArray(customMapping, 'from', 'to', false); const responses = []; // Ref: Custom Currents Connector Partner Dev Documentation.pdf - const eventList = Array.isArray(event) && event.length > 0 ? event[0].events : event.events; + const eventList = Array.isArray(event) && event.length > 0 ? event[0]?.events : event?.events; + if (!Array.isArray(eventList)) { + throw new TransformationError('eventList should be an array'); + } eventList.forEach((singleEvent) => { try { const resp = processEvent(singleEvent, eventMapping); @@ -81,7 +86,7 @@ const process = (inputEvent) => { responses.push(removeUndefinedAndNullValues(resp)); } } catch (error) { - // TODO: figure out a way to handle partial failures within batch + // Figure out a way to handle partial failures within batch // responses.push({ // statusCode: 400, // error: error.message || "Unknwon error" diff --git a/src/v0/sources/canny/authorMapping.json b/src/sources/canny/authorMapping.json similarity index 100% rename from src/v0/sources/canny/authorMapping.json rename to src/sources/canny/authorMapping.json diff --git a/src/v0/sources/canny/transform.js b/src/sources/canny/transform.js similarity index 92% rename from src/v0/sources/canny/transform.js rename to src/sources/canny/transform.js index aad5a881c18..634bbf269e7 100644 --- a/src/v0/sources/canny/transform.js +++ b/src/sources/canny/transform.js @@ -2,7 +2,8 @@ const sha256 = require('sha256'); const { TransformationError } = require('@rudderstack/integrations-lib'); const Message = require('../message'); const { voterMapping, authorMapping, checkForRequiredFields } = require('./util'); -const logger = require('../../../logger'); +const logger = require('../../logger'); +const { getBodyFromV2SpecPayload } = require('../../v0/util'); const CannyOperation = { VOTE_CREATED: 'vote.created', @@ -73,7 +74,8 @@ function createMessage(event, typeOfUser) { return finalMessage; } -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); let typeOfUser; switch (event.type) { diff --git a/src/v0/sources/canny/util.js b/src/sources/canny/util.js similarity index 100% rename from src/v0/sources/canny/util.js rename to src/sources/canny/util.js diff --git a/src/v0/sources/canny/voterMapping.json b/src/sources/canny/voterMapping.json similarity index 100% rename from src/v0/sources/canny/voterMapping.json rename to src/sources/canny/voterMapping.json diff --git a/src/v1/sources/close_crm/config.js b/src/sources/close_crm/config.js similarity index 100% rename from src/v1/sources/close_crm/config.js rename to src/sources/close_crm/config.js diff --git a/src/v1/sources/close_crm/transform.js b/src/sources/close_crm/transform.js similarity index 88% rename from src/v1/sources/close_crm/transform.js rename to src/sources/close_crm/transform.js index b597285e62a..f16edbb8896 100644 --- a/src/v1/sources/close_crm/transform.js +++ b/src/sources/close_crm/transform.js @@ -4,9 +4,10 @@ const { removeUndefinedAndNullRecurse, generateUUID, formatTimeStamp, -} = require('../../../v0/util'); + getBodyFromV2SpecPayload, +} = require('../../v0/util'); const { excludedFieldList } = require('./config'); -const Message = require('../../../v0/sources/message'); +const Message = require('../message'); function processEvent(inputEvent) { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -48,8 +49,8 @@ function processEvent(inputEvent) { return message; } -function process(inputEvent) { - const { event } = inputEvent; +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const response = processEvent(event); return removeUndefinedAndNullValues(response); } diff --git a/src/v1/sources/cordial/config.js b/src/sources/cordial/config.js similarity index 100% rename from src/v1/sources/cordial/config.js rename to src/sources/cordial/config.js diff --git a/src/v1/sources/cordial/mapping.json b/src/sources/cordial/mapping.json similarity index 100% rename from src/v1/sources/cordial/mapping.json rename to src/sources/cordial/mapping.json diff --git a/src/v1/sources/cordial/transform.js b/src/sources/cordial/transform.js similarity index 82% rename from src/v1/sources/cordial/transform.js rename to src/sources/cordial/transform.js index 5548efee70b..ababd67d296 100644 --- a/src/v1/sources/cordial/transform.js +++ b/src/sources/cordial/transform.js @@ -1,6 +1,6 @@ -const Message = require('../../../v0/sources/message'); -const { CommonUtils } = require('../../../util/common'); -const { generateUUID, isDefinedAndNotNull } = require('../../../v0/util'); +const Message = require('../message'); +const { CommonUtils } = require('../../util/common'); +const { generateUUID, isDefinedAndNotNull, getBodyFromV2SpecPayload } = require('../../v0/util'); const { eventsMapping } = require('./config'); const mapping = require('./mapping.json'); @@ -43,8 +43,8 @@ const processEvent = (inputPaylaod) => { }; const process = (inputEvent) => { - const { event: events } = inputEvent; - const eventsArray = CommonUtils.toArray(events); + const event = getBodyFromV2SpecPayload(inputEvent); + const eventsArray = CommonUtils.toArray(event); return eventsArray.map(processEvent); }; diff --git a/src/v0/sources/customerio/config.js b/src/sources/customerio/config.js similarity index 100% rename from src/v0/sources/customerio/config.js rename to src/sources/customerio/config.js diff --git a/src/v0/sources/customerio/mapping.json b/src/sources/customerio/mapping.json similarity index 100% rename from src/v0/sources/customerio/mapping.json rename to src/sources/customerio/mapping.json diff --git a/src/v0/sources/customerio/transform.js b/src/sources/customerio/transform.js similarity index 81% rename from src/v0/sources/customerio/transform.js rename to src/sources/customerio/transform.js index a2e69388b94..84e8491f41f 100644 --- a/src/v0/sources/customerio/transform.js +++ b/src/sources/customerio/transform.js @@ -7,9 +7,10 @@ const { get } = require('lodash'); const Message = require('../message'); const { mappingConfig } = require('./config'); -const { isDefinedAndNotNull } = require('../../util'); +const { isDefinedAndNotNull, getBodyFromV2SpecPayload } = require('../../v0/util'); -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const message = new Message(`Customer.io`); // since customer, email, sms, push, slack, webhook @@ -20,7 +21,6 @@ function process(event) { const eventObjectType = event.object_type?.toLowerCase() || ''; let eventName = get(mappingConfig, `${eventObjectType}.${event.metric}`); if (!eventName) { - // throw new TransformationError("Metric not supported"); eventName = 'Unknown Event'; } message.setEventName(eventName); @@ -35,12 +35,7 @@ function process(event) { } // when customer.io does not pass an associated userId, set the email address as anonymousId - if ( - (message.userId === null || message.userId === undefined) && - message.context && - message.context.traits && - message.context.traits.email - ) { + if ((message.userId === null || message.userId === undefined) && message.context?.traits?.email) { message.anonymousId = message.context.traits.email; } diff --git a/src/v0/sources/extole/mapping.json b/src/sources/extole/mapping.json similarity index 100% rename from src/v0/sources/extole/mapping.json rename to src/sources/extole/mapping.json diff --git a/src/v0/sources/extole/transform.js b/src/sources/extole/transform.js similarity index 80% rename from src/v0/sources/extole/transform.js rename to src/sources/extole/transform.js index a5fa99adcea..022762aa0eb 100644 --- a/src/v0/sources/extole/transform.js +++ b/src/sources/extole/transform.js @@ -1,9 +1,9 @@ /* eslint-disable no-case-declarations */ const path = require('path'); const fs = require('fs'); -const { generateUUID } = require('../../util'); +const { generateUUID, getBodyFromV2SpecPayload } = require('../../v0/util'); const Message = require('../message'); -const { removeUndefinedAndNullValues, extractCustomFields } = require('../../util'); +const { removeUndefinedAndNullValues, extractCustomFields } = require('../../v0/util'); const mappingJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); @@ -21,8 +21,7 @@ function processEvent(event) { break; default: message.setEventName(event.type); - let messageProperties = {}; - messageProperties = extractCustomFields(event, messageProperties, 'root', ['type']); + const messageProperties = extractCustomFields(event, {}, 'root', ['type']); message.setProperty('properties', messageProperties); } @@ -31,7 +30,8 @@ function processEvent(event) { return message; } -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const response = processEvent(event); const returnValue = removeUndefinedAndNullValues(response); return returnValue; diff --git a/src/sources/facebook_lead_ads/mapping.json b/src/sources/facebook_lead_ads/mapping.json new file mode 100644 index 00000000000..fabd79e3759 --- /dev/null +++ b/src/sources/facebook_lead_ads/mapping.json @@ -0,0 +1,66 @@ +[ + { + "sourceKeys": ["id", "facebook_lead_id"], + "destKeys": "userId" + }, + { + "sourceKeys": "full_name", + "destKeys": "context.traits.name" + }, + { + "sourceKeys": "first_name", + "destKeys": "context.traits.firstName" + }, + { + "sourceKeys": "last_name", + "destKeys": "context.traits.lastName" + }, + { + "sourceKeys": "date_of_birth", + "destKeys": "context.traits.birthday" + }, + { + "sourceKeys": "phone_number", + "destKeys": "context.traits.phone" + }, + { + "sourceKeys": "email", + "destKeys": "context.traits.email" + }, + { + "sourceKeys": "gender", + "destKeys": "context.traits.gender" + }, + { + "sourceKeys": "zip_code", + "destKeys": "context.traits.address.zipCode" + }, + { + "sourceKeys": "post_code", + "destKeys": "context.traits.address.postalCode" + }, + { + "sourceKeys": "state", + "destKeys": "context.traits.address.state" + }, + { + "sourceKeys": "city", + "destKeys": "context.traits.address.city" + }, + { + "sourceKeys": "country", + "destKeys": "context.traits.address.country" + }, + { + "sourceKeys": "province", + "destKeys": "context.traits.address.province" + }, + { + "sourceKeys": "street_address", + "destKeys": "context.traits.address.street" + }, + { + "sourceKeys": "company_name", + "destKeys": "context.traits.company.name" + } +] diff --git a/src/sources/facebook_lead_ads/transform.ts b/src/sources/facebook_lead_ads/transform.ts new file mode 100644 index 00000000000..c1cd5695cb9 --- /dev/null +++ b/src/sources/facebook_lead_ads/transform.ts @@ -0,0 +1,54 @@ +import { flattenQueryParams, TransformationError } from '@rudderstack/integrations-lib'; +import get from 'get-value'; +import Message = require('../message'); +import { EventType } from '../../constants'; +import { InputEventType, OutputEventType } from './type'; +import { SourceInputV2 } from '../../types'; +import { generateUUID } from '../../v0/util'; + +const { removeUndefinedAndNullValues, getBodyFromV2SpecPayload } = require('../../v0/util'); + +const mapping = require('./mapping.json'); + +function processEvent(inputEvent: InputEventType): any { + const unwrappedInputEvent = flattenQueryParams(inputEvent); + + if (Object.keys(unwrappedInputEvent).length === 0) { + throw new TransformationError('input event must have at least one field'); + } + + const message = new Message(`FacebookLeadAds`); + + // set event type identify + message.setEventType(EventType.IDENTIFY); + + // setting traits based on mapping + message.setPropertiesV2(unwrappedInputEvent, mapping); + + // set and transform originalTimestamp to ISO 8601 from mm/dd/yyyy hh:mm + if (unwrappedInputEvent.created_time) { + const date: Date = new Date(`${unwrappedInputEvent.created_time} UTC`); + if (!Number.isNaN(date.getTime())) { + message.setProperty('originalTimestamp', date.toISOString()); + } + } + + // set anonymous id if userId unavailable + if (!get(message, 'userId')) { + message.setProperty('anonymousId', generateUUID()); + } + + // add everything as it is in context.traits + if (!message.context.traits) message.context.traits = {}; + Object.assign(message.context.traits, unwrappedInputEvent); + + return message; +} + +const process = (payload: SourceInputV2) => { + const event = getBodyFromV2SpecPayload(payload); + const response: OutputEventType = processEvent(event); + return removeUndefinedAndNullValues(response); +}; + +export { process }; diff --git a/src/sources/facebook_lead_ads/type.ts b/src/sources/facebook_lead_ads/type.ts new file mode 100644 index 00000000000..05a3d9448da --- /dev/null +++ b/src/sources/facebook_lead_ads/type.ts @@ -0,0 +1,18 @@ +export type InputEventType = Record; + +export type OutputEventType = { + userId?: string; + anonymousId?: string; + type: 'identify'; + context: { + traits: Record; + library: { + name: string; + version: string; + }; + integration: { + name: string; + }; + }; + originalTimestamp?: Date; +}; diff --git a/src/v0/sources/formsort/mapping.json b/src/sources/formsort/mapping.json similarity index 100% rename from src/v0/sources/formsort/mapping.json rename to src/sources/formsort/mapping.json diff --git a/src/v0/sources/formsort/transform.js b/src/sources/formsort/transform.js similarity index 81% rename from src/v0/sources/formsort/transform.js rename to src/sources/formsort/transform.js index dd37482bc49..234c9573bf8 100644 --- a/src/v0/sources/formsort/transform.js +++ b/src/sources/formsort/transform.js @@ -1,12 +1,13 @@ const path = require('path'); const fs = require('fs'); -const { generateUUID, isDefinedAndNotNull } = require('../../util'); +const { generateUUID, isDefinedAndNotNull, getBodyFromV2SpecPayload } = require('../../v0/util'); const Message = require('../message'); // import mapping json using JSON.parse to preserve object key order const mapping = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const message = new Message(`Formsort`); // we are setting event type as track always diff --git a/src/v0/sources/formsort/transform.test.js b/src/sources/formsort/transform.test.js similarity index 64% rename from src/v0/sources/formsort/transform.test.js rename to src/sources/formsort/transform.test.js index e3d686fcefb..a7462899404 100644 --- a/src/v0/sources/formsort/transform.test.js +++ b/src/sources/formsort/transform.test.js @@ -3,18 +3,22 @@ const { process } = require('./transform'); it(`Transform.js Tests`, () => { const data = { input: { - answers: { - yes: true, - enter_email: 'test@user.com', - enter_name: '2022-11-17', - yes_or_no: false, + request: { + body: JSON.stringify({ + answers: { + yes: true, + enter_email: 'test@user.com', + enter_name: '2022-11-17', + yes_or_no: false, + }, + responder_uuid: '66a8e5bb-67e1-47ec-b55f-a26fd4be2dc7', + flow_label: 'new-flow-2022-11-25', + variant_label: 'main', + variant_uuid: '0828efa7-7215-4e7d-a7ab-6c1079010cea', + finalized: false, + created_at: '2022-11-25T14:41:22+00:00', + }), }, - responder_uuid: '66a8e5bb-67e1-47ec-b55f-a26fd4be2dc7', - flow_label: 'new-flow-2022-11-25', - variant_label: 'main', - variant_uuid: '0828efa7-7215-4e7d-a7ab-6c1079010cea', - finalized: false, - created_at: '2022-11-25T14:41:22+00:00', }, output: { context: { diff --git a/src/v0/sources/gainsightpx/config.js b/src/sources/gainsightpx/config.js similarity index 100% rename from src/v0/sources/gainsightpx/config.js rename to src/sources/gainsightpx/config.js diff --git a/src/v0/sources/gainsightpx/data/customMapping.json b/src/sources/gainsightpx/data/customMapping.json similarity index 100% rename from src/v0/sources/gainsightpx/data/customMapping.json rename to src/sources/gainsightpx/data/customMapping.json diff --git a/src/v0/sources/gainsightpx/data/engagementMapping.json b/src/sources/gainsightpx/data/engagementMapping.json similarity index 100% rename from src/v0/sources/gainsightpx/data/engagementMapping.json rename to src/sources/gainsightpx/data/engagementMapping.json diff --git a/src/v0/sources/gainsightpx/data/featureMatchMapping.json b/src/sources/gainsightpx/data/featureMatchMapping.json similarity index 100% rename from src/v0/sources/gainsightpx/data/featureMatchMapping.json rename to src/sources/gainsightpx/data/featureMatchMapping.json diff --git a/src/v0/sources/gainsightpx/data/feedbackMapping.json b/src/sources/gainsightpx/data/feedbackMapping.json similarity index 100% rename from src/v0/sources/gainsightpx/data/feedbackMapping.json rename to src/sources/gainsightpx/data/feedbackMapping.json diff --git a/src/v0/sources/gainsightpx/data/identifyMapping.json b/src/sources/gainsightpx/data/identifyMapping.json similarity index 100% rename from src/v0/sources/gainsightpx/data/identifyMapping.json rename to src/sources/gainsightpx/data/identifyMapping.json diff --git a/src/v0/sources/gainsightpx/data/segmentIOMapping.json b/src/sources/gainsightpx/data/segmentIOMapping.json similarity index 100% rename from src/v0/sources/gainsightpx/data/segmentIOMapping.json rename to src/sources/gainsightpx/data/segmentIOMapping.json diff --git a/src/v0/sources/gainsightpx/data/segmentMapping.json b/src/sources/gainsightpx/data/segmentMapping.json similarity index 100% rename from src/v0/sources/gainsightpx/data/segmentMapping.json rename to src/sources/gainsightpx/data/segmentMapping.json diff --git a/src/v0/sources/gainsightpx/data/surveyMapping.json b/src/sources/gainsightpx/data/surveyMapping.json similarity index 100% rename from src/v0/sources/gainsightpx/data/surveyMapping.json rename to src/sources/gainsightpx/data/surveyMapping.json diff --git a/src/v0/sources/gainsightpx/transform.js b/src/sources/gainsightpx/transform.js similarity index 95% rename from src/v0/sources/gainsightpx/transform.js rename to src/sources/gainsightpx/transform.js index 92f0a074562..62bc73e6152 100644 --- a/src/v0/sources/gainsightpx/transform.js +++ b/src/sources/gainsightpx/transform.js @@ -10,6 +10,7 @@ const surveyMapping = require('./data/surveyMapping.json'); const featureMatchMapping = require('./data/featureMatchMapping.json'); const segmentIoMapping = require('./data/segmentIOMapping.json'); const { refinePayload, refineTraitPayload } = require('./utils'); +const { getBodyFromV2SpecPayload } = require('../../v0/util'); const buildIdentifyPayload = (event) => { let message = new Message(`GAINSIGHTPX`); @@ -84,7 +85,8 @@ function processEvent(event) { return message; } -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const response = processEvent(event); const returnValue = refinePayload(response); return returnValue; diff --git a/src/v0/sources/gainsightpx/utils.js b/src/sources/gainsightpx/utils.js similarity index 95% rename from src/v0/sources/gainsightpx/utils.js rename to src/sources/gainsightpx/utils.js index aed0f5fab8d..f93caaada91 100644 --- a/src/v0/sources/gainsightpx/utils.js +++ b/src/sources/gainsightpx/utils.js @@ -1,5 +1,5 @@ /* eslint-disable no-param-reassign */ -const { isDefinedAndNotNullAndNotEmpty } = require('../../util'); +const { isDefinedAndNotNullAndNotEmpty } = require('../../v0/util'); const { traitsToDelete, accountTraitsToDelete } = require('./config'); /** diff --git a/src/v0/sources/iterable/mapping.json b/src/sources/iterable/mapping.json similarity index 100% rename from src/v0/sources/iterable/mapping.json rename to src/sources/iterable/mapping.json diff --git a/src/v0/sources/iterable/transform.js b/src/sources/iterable/transform.js similarity index 90% rename from src/v0/sources/iterable/transform.js rename to src/sources/iterable/transform.js index dc3fc72c3c8..ffb96c26b30 100644 --- a/src/v0/sources/iterable/transform.js +++ b/src/sources/iterable/transform.js @@ -3,11 +3,13 @@ const fs = require('fs'); const md5 = require('md5'); const { TransformationError } = require('@rudderstack/integrations-lib'); const Message = require('../message'); +const { getBodyFromV2SpecPayload } = require('../../v0/util'); // import mapping json using JSON.parse to preserve object key order const mapping = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); // throw an error if (email, eventName) are not present if (!(event.email && event.eventName)) { throw new TransformationError('Unknwon event type from Iterable'); diff --git a/src/v0/sources/mailjet/mapping.json b/src/sources/mailjet/mapping.json similarity index 100% rename from src/v0/sources/mailjet/mapping.json rename to src/sources/mailjet/mapping.json diff --git a/src/v0/sources/mailjet/transform.js b/src/sources/mailjet/transform.js similarity index 88% rename from src/v0/sources/mailjet/transform.js rename to src/sources/mailjet/transform.js index 91f90b6ed0f..e115b8a0253 100644 --- a/src/v0/sources/mailjet/transform.js +++ b/src/sources/mailjet/transform.js @@ -2,7 +2,8 @@ const path = require('path'); const fs = require('fs'); const md5 = require('md5'); const Message = require('../message'); -const { CommonUtils } = require('../../../util/common'); +const { CommonUtils } = require('../../util/common'); +const { getBodyFromV2SpecPayload } = require('../../v0/util'); // ref : https://dev.mailjet.com/email/guides/webhooks/ // import mapping json using JSON.parse to preserve object key order @@ -46,7 +47,8 @@ const processEvent = (event) => { }; // This fucntion just converts the incoming payload to array of already not and sends it to processEvent -const process = (events) => { +const process = (payload) => { + const events = getBodyFromV2SpecPayload(payload); const eventsArray = CommonUtils.toArray(events); return eventsArray.map(processEvent); }; diff --git a/src/v0/sources/mailmodo/mapping.json b/src/sources/mailmodo/mapping.json similarity index 100% rename from src/v0/sources/mailmodo/mapping.json rename to src/sources/mailmodo/mapping.json diff --git a/src/v0/sources/mailmodo/transform.js b/src/sources/mailmodo/transform.js similarity index 93% rename from src/v0/sources/mailmodo/transform.js rename to src/sources/mailmodo/transform.js index a4383fb4409..0ec483f5936 100644 --- a/src/v0/sources/mailmodo/transform.js +++ b/src/sources/mailmodo/transform.js @@ -2,7 +2,11 @@ const path = require('path'); const fs = require('fs'); const sha256 = require('sha256'); const { TransformationError } = require('@rudderstack/integrations-lib'); -const { flattenJson, removeUndefinedAndNullAndEmptyValues } = require('../../util'); +const { + flattenJson, + removeUndefinedAndNullAndEmptyValues, + getBodyFromV2SpecPayload, +} = require('../../v0/util'); const Message = require('../message'); // import mapping json using JSON.parse to preserve object key order @@ -39,7 +43,8 @@ function settingProperties(event, message) { return cloneMessage; } -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const message = new Message(`Mailmodo`); // event type is always track diff --git a/src/v0/sources/message.js b/src/sources/message.js similarity index 97% rename from src/v0/sources/message.js rename to src/sources/message.js index aa7fd48dd4a..05c4c50f559 100644 --- a/src/v0/sources/message.js +++ b/src/sources/message.js @@ -1,7 +1,7 @@ const set = require('set-value'); const get = require('get-value'); -const { getValueFromMessage } = require('../util'); +const { getValueFromMessage } = require('../v0/util'); const context = (integration) => ({ library: { diff --git a/src/sources/moengage/transform.js b/src/sources/moengage/transform.js new file mode 100644 index 00000000000..e64de556ad1 --- /dev/null +++ b/src/sources/moengage/transform.js @@ -0,0 +1,11 @@ +const { getBodyFromV2SpecPayload } = require('../../v0/util'); + +function process(payload) { + const events = getBodyFromV2SpecPayload(payload); + if (events.batch) { + return events.batch; + } + return events; +} + +exports.process = process; diff --git a/src/v0/sources/monday/mapping.json b/src/sources/monday/mapping.json similarity index 100% rename from src/v0/sources/monday/mapping.json rename to src/sources/monday/mapping.json diff --git a/src/v0/sources/monday/transform.js b/src/sources/monday/transform.js similarity index 89% rename from src/v0/sources/monday/transform.js rename to src/sources/monday/transform.js index d63323605b3..adf3d564a75 100644 --- a/src/v0/sources/monday/transform.js +++ b/src/sources/monday/transform.js @@ -2,8 +2,12 @@ const sha256 = require('sha256'); const { TransformationError } = require('@rudderstack/integrations-lib'); const Message = require('../message'); const { mapping, formEventName } = require('./util'); -const { generateUUID, removeUndefinedAndNullValues } = require('../../util'); -const { JSON_MIME_TYPE } = require('../../util/constant'); +const { + generateUUID, + removeUndefinedAndNullValues, + getBodyFromV2SpecPayload, +} = require('../../v0/util'); +const { JSON_MIME_TYPE } = require('../../v0/util/constant'); function processNormalEvent(mondayPayload) { const message = new Message(`MONDAY`); @@ -61,7 +65,8 @@ function processChallengeEvent(event) { // For challenge event the recieved challenge object is sent back // to Monday to verify the webhook url. // Ref: https://developer.monday.com/api-reference/docs/webhooks-1#how-to-verify-a-webhook-url -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const response = isChallengeEvent(event) ? processChallengeEvent(event) : processNormalEvent(event); diff --git a/src/v0/sources/monday/util.js b/src/sources/monday/util.js similarity index 100% rename from src/v0/sources/monday/util.js rename to src/sources/monday/util.js diff --git a/src/v0/sources/olark/groupMapping.json b/src/sources/olark/groupMapping.json similarity index 100% rename from src/v0/sources/olark/groupMapping.json rename to src/sources/olark/groupMapping.json diff --git a/src/v0/sources/olark/trackMapping.json b/src/sources/olark/trackMapping.json similarity index 100% rename from src/v0/sources/olark/trackMapping.json rename to src/sources/olark/trackMapping.json diff --git a/src/v0/sources/olark/transform.js b/src/sources/olark/transform.js similarity index 91% rename from src/v0/sources/olark/transform.js rename to src/sources/olark/transform.js index 50b5e5bfc49..377b78532d4 100644 --- a/src/v0/sources/olark/transform.js +++ b/src/sources/olark/transform.js @@ -2,7 +2,7 @@ const path = require('path'); const fs = require('fs'); const set = require('set-value'); const Message = require('../message'); -const { removeUndefinedAndNullValues } = require('../../util'); +const { removeUndefinedAndNullValues, getBodyFromV2SpecPayload } = require('../../v0/util'); const { getBrowserInfo } = require('./util'); // ref : https://www.olark.com/help/webhooks/ @@ -49,7 +49,8 @@ const prepareGroupPayload = (event) => { return groupEvents; }; -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const response = []; response.push(prepareTrackPayload(event)); diff --git a/src/v0/sources/olark/util.js b/src/sources/olark/util.js similarity index 100% rename from src/v0/sources/olark/util.js rename to src/sources/olark/util.js diff --git a/src/v0/sources/ortto/event_mapping.json b/src/sources/ortto/event_mapping.json similarity index 100% rename from src/v0/sources/ortto/event_mapping.json rename to src/sources/ortto/event_mapping.json diff --git a/src/v0/sources/ortto/mapping.json b/src/sources/ortto/mapping.json similarity index 100% rename from src/v0/sources/ortto/mapping.json rename to src/sources/ortto/mapping.json diff --git a/src/v0/sources/ortto/transform.js b/src/sources/ortto/transform.js similarity index 91% rename from src/v0/sources/ortto/transform.js rename to src/sources/ortto/transform.js index b40163f567b..bb719cf6e5e 100644 --- a/src/v0/sources/ortto/transform.js +++ b/src/sources/ortto/transform.js @@ -1,9 +1,14 @@ const path = require('path'); const fs = require('fs'); -const { flattenJson, removeUndefinedAndNullValues, generateUUID } = require('../../util'); +const { + flattenJson, + removeUndefinedAndNullValues, + generateUUID, + getBodyFromV2SpecPayload, +} = require('../../v0/util'); const Message = require('../message'); const eventMapping = require('./event_mapping.json'); -const { JSON_MIME_TYPE } = require('../../util/constant'); +const { JSON_MIME_TYPE } = require('../../v0/util/constant'); // import mapping json using JSON.parse to preserve object key order const mapping = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); @@ -43,7 +48,8 @@ function settingProperties(event, message) { return message; } -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); let message = new Message(`ortto`); // Here, we are checking for the test event to discard them diff --git a/src/v0/sources/pagerduty/data/eventMapping.json b/src/sources/pagerduty/data/eventMapping.json similarity index 100% rename from src/v0/sources/pagerduty/data/eventMapping.json rename to src/sources/pagerduty/data/eventMapping.json diff --git a/src/v0/sources/pagerduty/data/trackMapping.json b/src/sources/pagerduty/data/trackMapping.json similarity index 100% rename from src/v0/sources/pagerduty/data/trackMapping.json rename to src/sources/pagerduty/data/trackMapping.json diff --git a/src/v0/sources/pagerduty/transform.js b/src/sources/pagerduty/transform.js similarity index 84% rename from src/v0/sources/pagerduty/transform.js rename to src/sources/pagerduty/transform.js index 19c52b21ba3..51b64b31440 100644 --- a/src/v0/sources/pagerduty/transform.js +++ b/src/sources/pagerduty/transform.js @@ -1,5 +1,5 @@ const Message = require('../message'); -const { generateUUID } = require('../../util'); +const { generateUUID, getBodyFromV2SpecPayload } = require('../../v0/util'); const trackMapping = require('./data/trackMapping.json'); const eventNameMap = require('./data/eventMapping.json'); @@ -25,8 +25,8 @@ const prepareTrackPayload = (event) => { return message; }; -function process(event) { - const { event: processEvent } = event; +function process(payload) { + const { event: processEvent } = getBodyFromV2SpecPayload(payload); return prepareTrackPayload(processEvent); } diff --git a/src/v0/sources/pipedream/config.js b/src/sources/pipedream/config.js similarity index 100% rename from src/v0/sources/pipedream/config.js rename to src/sources/pipedream/config.js diff --git a/src/v0/sources/pipedream/transform.js b/src/sources/pipedream/transform.js similarity index 80% rename from src/v0/sources/pipedream/transform.js rename to src/sources/pipedream/transform.js index 744ffd4649c..3ef788abc26 100644 --- a/src/v0/sources/pipedream/transform.js +++ b/src/sources/pipedream/transform.js @@ -1,5 +1,5 @@ const Message = require('../message'); -const { generateUUID } = require('../../util'); +const { generateUUID, getBodyFromV2SpecPayload } = require('../../v0/util'); const { callTypes } = require('./config'); const { findUserIdOrAnonymousId } = require('./util'); @@ -11,7 +11,8 @@ const buildTrackPayload = (event) => { return message; }; -const process = (event) => { +const process = (payload) => { + const event = getBodyFromV2SpecPayload(payload); const id = findUserIdOrAnonymousId(event); if (event?.type && callTypes.includes(event.type.toLowerCase()) && id) { return event; diff --git a/src/v0/sources/pipedream/util.js b/src/sources/pipedream/util.js similarity index 100% rename from src/v0/sources/pipedream/util.js rename to src/sources/pipedream/util.js diff --git a/src/v0/sources/refiner/groupMapping.json b/src/sources/refiner/groupMapping.json similarity index 100% rename from src/v0/sources/refiner/groupMapping.json rename to src/sources/refiner/groupMapping.json diff --git a/src/v0/sources/refiner/identifyMapping.json b/src/sources/refiner/identifyMapping.json similarity index 100% rename from src/v0/sources/refiner/identifyMapping.json rename to src/sources/refiner/identifyMapping.json diff --git a/src/v0/sources/refiner/trackMapping.json b/src/sources/refiner/trackMapping.json similarity index 100% rename from src/v0/sources/refiner/trackMapping.json rename to src/sources/refiner/trackMapping.json diff --git a/src/v0/sources/refiner/transform.js b/src/sources/refiner/transform.js similarity index 83% rename from src/v0/sources/refiner/transform.js rename to src/sources/refiner/transform.js index b9982ef1d83..447ff14217f 100644 --- a/src/v0/sources/refiner/transform.js +++ b/src/sources/refiner/transform.js @@ -1,7 +1,7 @@ const path = require('path'); const fs = require('fs'); const Message = require('../message'); -const { removeUndefinedAndNullValues } = require('../../util'); +const { removeUndefinedAndNullValues, getBodyFromV2SpecPayload } = require('../../v0/util'); // import mapping json using JSON.parse to preserve object key order const identifyMapping = JSON.parse( @@ -40,18 +40,19 @@ const prepareGroupPayload = (event) => { return message; }; -function process(event) { - const payload = []; +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); + const resultPayload = []; const identifyPayload = prepareIdentifyaPayload(event); const trackPayload = prepareTrackPayload(event); const groupPayload = prepareGroupPayload(event); - payload.push(identifyPayload, trackPayload); + resultPayload.push(identifyPayload, trackPayload); if (groupPayload.groupId) { - payload.push(groupPayload); + resultPayload.push(groupPayload); } - return payload; + return resultPayload; } module.exports = { process }; diff --git a/src/v0/sources/revenuecat/mapping.json b/src/sources/revenuecat/mapping.json similarity index 100% rename from src/v0/sources/revenuecat/mapping.json rename to src/sources/revenuecat/mapping.json diff --git a/src/v0/sources/revenuecat/transform.js b/src/sources/revenuecat/transform.js similarity index 88% rename from src/v0/sources/revenuecat/transform.js rename to src/sources/revenuecat/transform.js index c746f13b1a8..e9967ae4992 100644 --- a/src/v0/sources/revenuecat/transform.js +++ b/src/sources/revenuecat/transform.js @@ -1,11 +1,17 @@ const { camelCase } = require('lodash'); const moment = require('moment'); const { isDefinedAndNotNullAndNotEmpty } = require('@rudderstack/integrations-lib'); -const { removeUndefinedAndNullValues, isDefinedAndNotNull, generateUUID } = require('../../util'); +const { + removeUndefinedAndNullValues, + isDefinedAndNotNull, + generateUUID, + getBodyFromV2SpecPayload, +} = require('../../v0/util'); const Message = require('../message'); -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const message = new Message(`RevenueCat`); // we are setting event type as track always diff --git a/src/v0/sources/satismeter/data/trackMapping.json b/src/sources/satismeter/data/trackMapping.json similarity index 100% rename from src/v0/sources/satismeter/data/trackMapping.json rename to src/sources/satismeter/data/trackMapping.json diff --git a/src/v0/sources/satismeter/transform.js b/src/sources/satismeter/transform.js similarity index 83% rename from src/v0/sources/satismeter/transform.js rename to src/sources/satismeter/transform.js index 162b4f461c4..b8c08529195 100644 --- a/src/v0/sources/satismeter/transform.js +++ b/src/sources/satismeter/transform.js @@ -1,5 +1,5 @@ const Message = require('../message'); -const { refinePayload } = require('../../util'); +const { refinePayload, getBodyFromV2SpecPayload } = require('../../v0/util'); const trackMapping = require('./data/trackMapping.json'); const buildTrackPayload = (event) => { @@ -19,7 +19,8 @@ const processEvent = (event) => { return message; }; -const process = (event) => { +const process = (payload) => { + const event = getBodyFromV2SpecPayload(payload); const response = processEvent(event); const refinedResponse = refinePayload(response); return refinedResponse; diff --git a/src/sources/segment/transform.js b/src/sources/segment/transform.js new file mode 100644 index 00000000000..8db0e0921c0 --- /dev/null +++ b/src/sources/segment/transform.js @@ -0,0 +1,8 @@ +const { getBodyFromV2SpecPayload } = require('../../v0/util'); + +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); + return event; +} + +exports.process = process; diff --git a/src/sources/shopify/transform.js b/src/sources/shopify/transform.js new file mode 100644 index 00000000000..1d0d70ca907 --- /dev/null +++ b/src/sources/shopify/transform.js @@ -0,0 +1,19 @@ +const { process: processV1 } = require('../../v1/sources/shopify/transform'); + +const convertV2ToV1 = (inputRequest) => { + const { body: bodyString, query_parameters: qParams } = inputRequest.request; + const requestBody = JSON.parse(bodyString); + + if (qParams) { + requestBody.query_parameters = qParams; + } + + return { + event: requestBody, + source: inputRequest.source, + }; +}; + +const process = async (inputEvent) => processV1(convertV2ToV1(inputEvent)); + +module.exports = { process }; diff --git a/src/v0/sources/signl4/mapping.json b/src/sources/signl4/mapping.json similarity index 100% rename from src/v0/sources/signl4/mapping.json rename to src/sources/signl4/mapping.json diff --git a/src/v0/sources/signl4/transform.js b/src/sources/signl4/transform.js similarity index 90% rename from src/v0/sources/signl4/transform.js rename to src/sources/signl4/transform.js index f569786099a..3c34859db7e 100644 --- a/src/v0/sources/signl4/transform.js +++ b/src/sources/signl4/transform.js @@ -1,8 +1,13 @@ const path = require('path'); const fs = require('fs'); -const { flattenJson, removeUndefinedAndNullValues, generateUUID } = require('../../util'); +const { + flattenJson, + removeUndefinedAndNullValues, + generateUUID, + getBodyFromV2SpecPayload, +} = require('../../v0/util'); const Message = require('../message'); -const { JSON_MIME_TYPE } = require('../../util/constant'); +const { JSON_MIME_TYPE } = require('../../v0/util/constant'); // import mapping json using JSON.parse to preserve object key order const mapping = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); @@ -24,7 +29,8 @@ function settingProperties(event, message) { return message; } -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); let message = new Message(`Signl4`); // Here, we are checking for the test event to discard them diff --git a/src/v0/sources/slack/mapping.json b/src/sources/slack/mapping.json similarity index 100% rename from src/v0/sources/slack/mapping.json rename to src/sources/slack/mapping.json diff --git a/src/v0/sources/slack/transform.js b/src/sources/slack/transform.js similarity index 93% rename from src/v0/sources/slack/transform.js rename to src/sources/slack/transform.js index 98324a7b650..e51e897078a 100644 --- a/src/v0/sources/slack/transform.js +++ b/src/sources/slack/transform.js @@ -2,9 +2,13 @@ const sha256 = require('sha256'); const { TransformationError } = require('@rudderstack/integrations-lib'); const Message = require('../message'); const { mapping, tsToISODate, normalizeEventName } = require('./util'); -const { generateUUID, removeUndefinedAndNullValues } = require('../../util'); -const { JSON_MIME_TYPE } = require('../../util/constant'); -const { EventType } = require('../../../constants'); +const { + generateUUID, + removeUndefinedAndNullValues, + getBodyFromV2SpecPayload, +} = require('../../v0/util'); +const { JSON_MIME_TYPE } = require('../../v0/util/constant'); +const { EventType } = require('../../constants'); /** * Transform event data to RudderStack supported standard event schema @@ -100,7 +104,8 @@ function isWebhookUrlVerificationEvent(event) { * Reference - https://api.slack.com/apis/connections/events-api * @param {Object} event */ -function process(event) { +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const response = isWebhookUrlVerificationEvent(event) ? processUrlVerificationEvent(event) : processNormalEvent(event); diff --git a/src/v0/sources/slack/util.js b/src/sources/slack/util.js similarity index 100% rename from src/v0/sources/slack/util.js rename to src/sources/slack/util.js diff --git a/src/v0/sources/slack/util.test.js b/src/sources/slack/util.test.js similarity index 100% rename from src/v0/sources/slack/util.test.js rename to src/sources/slack/util.test.js diff --git a/src/v1/sources/webhook/transform.js b/src/sources/webhook/transform.js similarity index 61% rename from src/v1/sources/webhook/transform.js rename to src/sources/webhook/transform.js index fc13424b8a4..7d237bf24e6 100644 --- a/src/v1/sources/webhook/transform.js +++ b/src/sources/webhook/transform.js @@ -1,4 +1,8 @@ -const { removeUndefinedAndNullValues, generateUUID } = require('../../../v0/util'); +const { + removeUndefinedAndNullValues, + generateUUID, + getBodyFromV2SpecPayload, +} = require('../../v0/util'); function processEvent(event) { const payload = { @@ -10,8 +14,8 @@ function processEvent(event) { return payload; } -function process(inputEvent) { - const { event } = inputEvent; +function process(payload) { + const event = getBodyFromV2SpecPayload(payload); const response = processEvent(event); return removeUndefinedAndNullValues(response); } diff --git a/src/types/controlPlaneConfig.ts b/src/types/controlPlaneConfig.ts new file mode 100644 index 00000000000..3454307b240 --- /dev/null +++ b/src/types/controlPlaneConfig.ts @@ -0,0 +1,69 @@ +// import type { FixMe } from '../util/types'; +import type { UserTransformationInput } from './userTransformation'; + +export type DestinationDefinition = { + ID: string; + Name: string; + DisplayName: string; + Config: Record; +}; + +export type Destination> = { + ID: string; + Name: string; + DestinationDefinition: DestinationDefinition; + Config: DestinationConfig; + Enabled: boolean; + WorkspaceID: string; + Transformations: UserTransformationInput[]; + RevisionID?: string; + IsProcessorEnabled?: boolean; + IsConnectionEnabled?: boolean; +}; + +export type DestinationConnectionConfig = { + destination: T; +}; + +export type Connection> = { + sourceId: string; + destinationId: string; + enabled: boolean; + config: T; + processorEnabled?: boolean; +}; + +export type SourceDefinition = { + ID: string; + Name: string; + Category: string; + Type: string; +}; + +export type Source = { + ID: string; + OriginalID: string; + Name: string; + SourceDefinition: SourceDefinition; + Config: object; + Enabled: boolean; + WorkspaceID: string; + WriteKey: string; + Transformations?: UserTransformationInput[]; + RevisionID?: string; + Destinations?: Destination[]; + Transient: boolean; + EventSchemasEnabled: boolean; + DgSourceTrackingPlanConfig: object; +}; + +export type UserTransformationLibrary = { + VersionID: string; +}; + +export type Credential = { + id: string; + key: string; + value: string; + isSecret: boolean; +}; diff --git a/src/types/destinationTransformation.ts b/src/types/destinationTransformation.ts new file mode 100644 index 00000000000..a1960db072d --- /dev/null +++ b/src/types/destinationTransformation.ts @@ -0,0 +1,233 @@ +import type { + Connection, + Credential, + Destination, + UserTransformationLibrary, +} from './controlPlaneConfig'; +import type { Metadata, RudderMessage } from './rudderEvents'; + +/** + * Processor transformation request/response structures + */ +export type ProcessorTransformationRequest = { + request?: object; + message: M; + metadata: MD; + destination: Destination; + connection?: Connection; + libraries?: UserTransformationLibrary[]; + credentials?: Credential[]; +}; + +export type BatchedRequestBody> = { + JSON?: T; + JSON_ARRAY?: Record; + XML?: Record; + FORM?: Record; +}; + +export type BatchedRequest< + TPayload = Record, + THeaders = Record, + TParams = Record, +> = { + body: BatchedRequestBody; + version: string; + type: string; + method: string; + endpoint: string; + headers: THeaders; + params: TParams; + files: Record; +}; + +export type BatchRequestOutput< + TPayload = Record, + THeaders = Record, + TParams = Record, + TDestination = Destination, +> = { + batchedRequest: BatchedRequest; + metadata: Partial[]; + batched: boolean; + statusCode: number; + destination: TDestination; +}; + +/** + * Output structure for processor transformations + */ +export type ProcessorTransformationOutput = { + version: string; + type: string; + method: string; + endpoint: string; + userId?: string; + headers?: Record; + params?: Record; + body?: BatchedRequestBody; + files?: Record; +}; + +export type ProcessorTransformationResponse = { + output?: ProcessorTransformationOutput | RudderMessage; + metadata: Partial; + statusCode: number; + error?: string; + statTags?: object; +}; + +/** + * Router transformation structures + */ +export type RouterTransformationRequestData< + M = RudderMessage, + D = Destination, + C = Connection, + MD = Metadata, +> = { + request?: object; + message: M; + metadata: MD; + destination: D; + connection?: C; +}; + +export type RouterTransformationRequest = { + input: RouterTransformationRequestData[]; + destType: string; +}; + +export type RouterTransformationResponse = { + batchedRequest?: ProcessorTransformationOutput | ProcessorTransformationOutput[]; + metadata: Partial[]; + destination: Destination; + batched: boolean; + statusCode: number; + error?: string; + statTags?: object; +}; + +/** + * Metadata structure for proxy requests + */ +export type ProxyMetdata = { + jobId: number; + attemptNum: number; + userId: string; + sourceId: string; + destinationId: string; + workspaceId: string; + secret: Record; + destInfo?: Record; + omitempty?: Record; + dontBatch: boolean; +}; + +/** + * Proxy request structure for version 0 + */ +export type ProxyV0Request = { + version: string; + type: string; + method: string; + endpoint: string; + userId: string; + headers?: Record; + params?: Record; + body?: { + JSON?: Record; + JSON_ARRAY?: Record; + XML?: Record; + FORM?: Record; + }; + files?: Record; + metadata: ProxyMetdata; + destinationConfig: Record; +}; + +/** + * Proxy request structure for version 1 + */ +export type ProxyV1Request = Omit & { + metadata: ProxyMetdata[]; +}; + +export type ProxyRequest = ProxyV0Request | ProxyV1Request; + +/** + * Error detailer structure for proxy + */ +export type ErrorDetailer = { + module: string; + implementation: string; + feature: string; +} & ErrorDetailerOptions; + +export type ErrorDetailerOptions = { + errorCategory?: string; + errorType?: string; + meta?: string; + destType?: string; + srcType?: string; + cluster?: string; + customer?: string; + destinationId?: string; + workspaceId?: string; + sourceId?: string; +}; + +export type MetaTransferObjectForProxy = { + metadata?: ProxyMetdata; + metadatas?: ProxyMetdata[]; + errorDetails: ErrorDetailer; + errorContext: string; +}; + +export type MetaTransferObject = + | { + metadatas?: Partial[]; + metadata?: Partial; + errorDetails: ErrorDetailer; + errorContext: string; + } + | MetaTransferObjectForProxy; + +/** + * Delivery response structures + */ +export type DeliveryV0Response = { + status: number; + message: string; + destinationResponse: any; + statTags: object; + authErrorCategory?: string; +}; + +export type DeliveryJobState = { + error: string; + statusCode: number; + metadata: ProxyMetdata; +}; + +export type DeliveryV1Response = { + status: number; + message: string; + statTags?: object; + destinationResponse?: any; + authErrorCategory?: string; + response: DeliveryJobState[]; +}; + +export type ComparatorInput = { + events: ProcessorTransformationRequest[] | RouterTransformationRequestData[]; + destination: string; + version: string; + requestMetadata: object; + feature: string; +}; + +// Add helper type for pre-processing functions +export type PreProcessableRequest = + | ProcessorTransformationRequest + | RouterTransformationRequestData; diff --git a/src/types/index.ts b/src/types/index.ts index 7c07f659df3..8927a7fe60d 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,415 +1,7 @@ -import { CatchErr, FixMe } from '../util/types'; - -/* eslint-disable @typescript-eslint/no-explicit-any */ -type ProcessorTransformationOutput = { - version: string; - type: string; - method: string; - endpoint: string; - userId?: string; - headers?: Record; - params?: Record; - body?: { - JSON?: Record; - JSON_ARRAY?: Record; - XML?: Record; - FORM?: Record; - }; - files?: Record; -}; - -type ProxyV0Request = { - version: string; - type: string; - method: string; - endpoint: string; - userId: string; - headers?: Record; - params?: Record; - body?: { - JSON?: Record; - JSON_ARRAY?: Record; - XML?: Record; - FORM?: Record; - }; - files?: Record; - metadata: ProxyMetdata; - destinationConfig: Record; -}; - -type ProxyV1Request = { - version: string; - type: string; - method: string; - endpoint: string; - userId: string; - headers?: Record; - params?: Record; - body?: { - JSON?: Record; - JSON_ARRAY?: Record; - XML?: Record; - FORM?: Record; - }; - files?: Record; - metadata: ProxyMetdata[]; - destinationConfig: Record; -}; - -type ProxyRequest = ProxyV0Request | ProxyV1Request; - -type ProxyMetdata = { - jobId: number; - attemptNum: number; - userId: string; - sourceId: string; - destinationId: string; - workspaceId: string; - secret: Record; - destInfo?: Record; - omitempty?: Record; - dontBatch: boolean; -}; - -type Metadata = { - sourceId: string; - workspaceId: string; - namespace: string; - instanceId: string; - sourceType: string; - sourceCategory: string; - trackingPlanId: string; - trackingPlanVersion: number; - sourceTpConfig: object; - mergedTpConfig: object; - destinationId: string; - jobRunId: string; - jobId: number; - sourceBatchId: string; - sourceJobId: string; - sourceJobRunId: string; - sourceTaskId: string; - sourceTaskRunId: string; - recordId: object; - destinationType: string; - messageId: string; - oauthAccessToken: string; - messageIds: string[]; - rudderId: string; - receivedAt: string; - eventName: string; - eventType: string; - sourceDefinitionId: string; - destinationDefinitionId: string; - transformationId: string; - dontBatch?: boolean; -}; - -type MessageIdMetadataMap = { - [key: string]: Metadata; -}; - -type UserTransformationInput = { - VersionID: string; - ID: string; - Config: object; -}; - -type DestinationDefinition = { - ID: string; - Name: string; - DisplayName: string; - Config: FixMe; -}; - -type Destination = { - ID: string; - Name: string; - DestinationDefinition: DestinationDefinition; - Config: FixMe; - Enabled: boolean; - WorkspaceID: string; - Transformations: UserTransformationInput[]; - RevisionID?: string; - IsProcessorEnabled?: boolean; - IsConnectionEnabled?: boolean; -}; - -type Connection = { - sourceId: string; - destinationId: string; - enabled: boolean; - config: Record; - processorEnabled?: boolean; -}; - -type UserTransformationLibrary = { - VersionID: string; -}; - -type Credential = { - id: string; - key: string; - value: string; - isSecret: boolean; -}; - -type ProcessorTransformationRequest = { - request?: object; - message: object; - metadata: Metadata; - destination: Destination; - connection?: Connection; - libraries?: UserTransformationLibrary[]; - credentials?: Credential[]; -}; - -type RouterTransformationRequestData = { - request?: object; - message: object; - metadata: Metadata; - destination: Destination; - connection?: Connection; -}; - -type RouterTransformationRequest = { - input: RouterTransformationRequestData[]; - destType: string; -}; - -type ProcessorTransformationResponse = { - output?: ProcessorTransformationOutput | RudderMessage; - metadata: Metadata; - statusCode: number; - error?: string; - statTags?: object; -}; - -type RouterTransformationResponse = { - batchedRequest?: ProcessorTransformationOutput | ProcessorTransformationOutput[]; - metadata: Metadata[]; - destination: Destination; - batched: boolean; - statusCode: number; - error?: string; - statTags?: object; -}; - -type SourceTransformationEvent = { - headers?: Record; - query_params?: Record; - [key: string]: any; -}; - -type SourceTransformationOutput = { - batch: RudderMessage[]; -}; - -type SourceTransformationResponse = { - output: SourceTransformationOutput; - error: CatchErr; - statusCode: number; - outputToSource: object; - statTags: object; -}; - -type DeliveryV0Response = { - status: number; - message: string; - destinationResponse: any; - statTags: object; - authErrorCategory?: string; -}; - -type DeliveryJobState = { - error: string; - statusCode: number; - metadata: ProxyMetdata; -}; - -type DeliveryV1Response = { - status: number; - message: string; - statTags?: object; - destinationResponse?: any; - authErrorCategory?: string; - response: DeliveryJobState[]; -}; - -enum MessageType { - IDENTIFY = 'identify', - TRACK = 'track', - PAGE = 'page', - SCREEN = 'screen', - GROUP = 'group', - ALIAS = 'alias', - AUDIENCE_LIST = 'audiencelist', -} - -type RudderMessage = { - userId?: string; - anonymousId: string; - type: MessageType; - channel: string; - context: object; - originalTimestamp: Date; - sentAt: Date; - timestamp: Date; - event?: string; - integrations?: object; - messageId: string; - properties?: object; - traits?: object; -}; - -type ErrorDetailer = { - module: string; - implementation: string; - feature: string; - errorCategory?: string; - errorType?: string; - meta?: string; - destType?: string; - srcType?: string; - cluster?: string; - customer?: string; - destinationId?: string; - workspaceId?: string; - sourceId?: string; -}; - -type MetaTransferObjectForProxy = { - metadata?: ProxyMetdata; - metadatas?: ProxyMetdata[]; - errorDetails: ErrorDetailer; - errorContext: string; -}; - -type MetaTransferObject = - | { - metadatas?: Metadata[]; - metadata?: Metadata; - errorDetails: ErrorDetailer; - errorContext: string; - } - | MetaTransferObjectForProxy; - -type UserTransformationResponse = { - transformedEvent: RudderMessage; - metadata: Metadata; - error: CatchErr; -}; - -type UserTransformationServiceResponse = { - transformedEvents: ProcessorTransformationResponse[]; - retryStatus: number; -}; - -type UserDeletionRequest = { - userAttributes: FixMe[]; - config: object; - destType: string; - jobId: string; -}; - -type UserDeletionResponse = { - statusCode: number; - error?: string; - status?: string; - authErrorCategory: FixMe; - statTags: object; -}; - -type ComparatorInput = { - events: ProcessorTransformationRequest[] | RouterTransformationRequestData[]; - destination: string; - version: string; - requestMetadata: object; - feature: string; -}; -type SourceDefinition = { - ID: string; - Name: string; - Category: string; - Type: string; -}; - -type Source = { - ID: string; - OriginalID: string; - Name: string; - SourceDefinition: SourceDefinition; - Config: object; - Enabled: boolean; - WorkspaceID: string; - WriteKey: string; - Transformations?: UserTransformationInput[]; - RevisionID?: string; - Destinations?: Destination[]; - Transient: boolean; - EventSchemasEnabled: boolean; - DgSourceTrackingPlanConfig: object; -}; - -type SourceInput = { - event: { - query_parameters?: any; - [key: string]: any; - }; - source?: Source; -}; - -type SourceRequestV2 = { - method?: string; - url?: string; - proto?: string; - body: string; - headers?: Record; - query_parameters?: Record; -}; - -type SourceInputV2 = { - request: SourceRequestV2; - source?: Source; -}; - -type SourceInputConversionResult = { - output?: T; - conversionError?: Error; -}; - -export { - ComparatorInput, - DeliveryJobState, - DeliveryV0Response, - DeliveryV1Response, - Connection, - Destination, - ErrorDetailer, - MessageIdMetadataMap, - MetaTransferObject, - Metadata, - ProcessorTransformationOutput, - ProcessorTransformationRequest, - ProcessorTransformationResponse, - ProxyMetdata, - ProxyRequest, - ProxyV0Request, - ProxyV1Request, - RouterTransformationRequest, - RouterTransformationRequestData, - RouterTransformationResponse, - RudderMessage, - SourceTransformationEvent, - SourceTransformationResponse, - UserDeletionRequest, - UserDeletionResponse, - SourceInput, - SourceInputV2, - SourceRequestV2, - Source, - SourceInputConversionResult, - UserTransformationLibrary, - UserTransformationResponse, - UserTransformationServiceResponse, -}; +export * from './rudderEvents'; +export * from './controlPlaneConfig'; +export * from './destinationTransformation'; +export * from './sourceTransformation'; +export * from './userTransformation'; +export * from './userRegulation'; +export * from './zodTypes'; diff --git a/src/types/rudderEvents.ts b/src/types/rudderEvents.ts new file mode 100644 index 00000000000..29ba4fe4787 --- /dev/null +++ b/src/types/rudderEvents.ts @@ -0,0 +1,91 @@ +import { z } from 'zod'; + +/** + * Supported message types in the event specification + */ +export const MessageTypeSchema = z.enum([ + 'identify', + 'track', + 'page', + 'screen', + 'group', + 'alias', + 'record', + 'audiencelist', +]); + +export type MessageType = z.infer; + +/** + * Core event message structure following Rudder event spec + */ + +export const RudderMessageSchema = z + .object({ + userId: z.string().optional(), + anonymousId: z.string().optional(), + type: MessageTypeSchema, + channel: z.string().optional(), + context: z.object({}).optional(), + originalTimestamp: z.string().optional(), + sentAt: z.string().optional(), + timestamp: z.string().optional(), + event: z.string().optional(), + integrations: z.object({}).optional(), + messageId: z.string().optional(), + properties: z.object({}).optional(), + traits: z.object({}).optional(), + statusCode: z.number().optional(), + }) + .passthrough(); + +export type RudderMessage = z.infer; + +export const RudderRecordV1Schema = z.object({ + type: z.literal('record'), +}); + +export type RudderRecordV1 = z.infer; + +/** + * Metadata structure for messages + */ +export const MetadataSchema = z + .object({ + sourceId: z.string(), + workspaceId: z.string(), + namespace: z.string().optional(), + instanceId: z.string().optional(), + sourceType: z.string(), + sourceCategory: z.string(), + trackingPlanId: z.string().optional(), + trackingPlanVersion: z.number().optional(), + sourceTpConfig: z.object({}).optional(), + mergedTpConfig: z.object({}).optional(), + destinationId: z.string(), + jobRunId: z.string().optional(), + jobId: z.number(), + sourceBatchId: z.string().optional(), + sourceJobId: z.string().optional(), + sourceJobRunId: z.string().optional(), + sourceTaskId: z.string().optional(), + sourceTaskRunId: z.string().optional(), + recordId: z.object({}).optional(), + destinationType: z.string(), + messageId: z.string(), + oauthAccessToken: z.string().optional(), + messageIds: z.array(z.string()).optional(), + rudderId: z.string().optional(), + receivedAt: z.string().optional(), + eventName: z.string().optional(), + eventType: z.string().optional(), + sourceDefinitionId: z.string().optional(), + destinationDefinitionId: z.string().optional(), + transformationId: z.string().optional(), + dontBatch: z.boolean().optional(), + }) + .passthrough(); + +export type Metadata = z.infer; + +export type MessageIdMetadataMap = Record>; diff --git a/src/types/sourceTransformation.ts b/src/types/sourceTransformation.ts new file mode 100644 index 00000000000..1ee569e4e6c --- /dev/null +++ b/src/types/sourceTransformation.ts @@ -0,0 +1,56 @@ +import type { CatchErr } from '../util/types'; +import type { Source } from './controlPlaneConfig'; +import type { RudderMessage } from './rudderEvents'; + +export type SourceTransformationEvent = { + headers?: Record; + query_params?: Record; + [key: string]: any; +}; + +export type SourceRequestV2 = { + method?: string; + url?: string; + proto?: string; + body: string; + headers?: Record; + query_parameters?: Record; +}; + +export type SourceInput = { + event: { + query_parameters?: any; + [key: string]: any; + }; + source?: Source; +}; + +export type SourceInputV2 = { + request: SourceRequestV2; + source?: Source; +}; + +export type SourceInputConversionResult = { + output?: T; + conversionError?: Error; +}; + +export type SourceTransformationOutput = { + batch: RudderMessage[]; +}; + +export type SourceTransformationSuccessResponse = { + output: SourceTransformationOutput; + statusCode: number; + outputToSource?: object; +}; + +export type SourceTransformationErrorResponse = { + error: CatchErr; + statusCode: number; + statTags: object; +}; + +export type SourceTransformationResponse = + | SourceTransformationSuccessResponse + | SourceTransformationErrorResponse; diff --git a/src/types/userRegulation.ts b/src/types/userRegulation.ts new file mode 100644 index 00000000000..a2390c7f9a4 --- /dev/null +++ b/src/types/userRegulation.ts @@ -0,0 +1,19 @@ +import type { FixMe } from '../util/types'; + +/** + * Types for user data regulation operations + */ +export type UserDeletionRequest = { + userAttributes: FixMe[]; + config: object; + destType: string; + jobId: string; +}; + +export type UserDeletionResponse = { + statusCode: number; + error?: string; + status?: string; + authErrorCategory: FixMe; + statTags: object; +}; diff --git a/src/types/userTransformation.ts b/src/types/userTransformation.ts new file mode 100644 index 00000000000..ec6b2ace370 --- /dev/null +++ b/src/types/userTransformation.ts @@ -0,0 +1,23 @@ +import type { CatchErr } from '../util/types'; +import type { Metadata, RudderMessage } from './rudderEvents'; +import type { ProcessorTransformationResponse } from './destinationTransformation'; + +/** + * Input structure for user transformations + */ +export type UserTransformationInput = { + VersionID: string; + ID: string; + Config: object; +}; + +export type UserTransformationResponse = { + transformedEvent: RudderMessage; + metadata: Metadata; + error: CatchErr; +}; + +export type UserTransformationServiceResponse = { + transformedEvents: ProcessorTransformationResponse[]; + retryStatus: number; +}; diff --git a/src/util/cluster.js b/src/util/cluster.js index b9b86cd3c61..6be25018f1d 100644 --- a/src/util/cluster.js +++ b/src/util/cluster.js @@ -28,6 +28,7 @@ async function shutdownWorkers() { } function start(port, app, metricsApp) { + if (cluster.isMaster) { logger.info(`Master (pid: ${process.pid}) has started`); @@ -44,7 +45,9 @@ function start(port, app, metricsApp) { // Fork workers. for (let i = 0; i < numWorkers; i += 1) { - cluster.fork(); + cluster.fork({ + WORKER_ID: `worker-${i + 1}`, + }); } cluster.on('online', (worker) => { diff --git a/src/util/common.js b/src/util/common.js index 8bf34f2eca2..5e601cd8ed3 100644 --- a/src/util/common.js +++ b/src/util/common.js @@ -24,6 +24,10 @@ const CommonUtils = { setDiff(mainSet, comparisionSet) { return [...mainSet].filter((item) => !comparisionSet.has(item)); }, + + isNonEmptyArray(array) { + return Array.isArray(array) && array.length > 0; + }, }; module.exports = { diff --git a/src/util/common.test.js b/src/util/common.test.js new file mode 100644 index 00000000000..0259c5411e8 --- /dev/null +++ b/src/util/common.test.js @@ -0,0 +1,151 @@ +const { CommonUtils } = require('./common'); + +describe('CommonUtils', () => { + describe('isNonEmptyArray', () => { + const testCases = [ + { name: 'array with numbers', input: [1, 2, 3], expected: true }, + { name: 'array with single string', input: ['a'], expected: true }, + { name: 'array with object', input: [{}], expected: true }, + { name: 'empty array', input: [], expected: false }, + { name: 'null', input: null, expected: false }, + { name: 'undefined', input: undefined, expected: false }, + { name: 'number', input: 42, expected: false }, + { name: 'string', input: 'string', expected: false }, + { name: 'object', input: {}, expected: false }, + { name: 'boolean', input: false, expected: false }, + ]; + + test.each(testCases)('$name', ({ input, expected }) => { + expect(CommonUtils.isNonEmptyArray(input)).toBe(expected); + }); + }); + + describe('objectDiff', () => { + const testCases = [ + { + name: 'different values in flat objects', + obj1: { a: 1, b: 2 }, + obj2: { a: 1, b: 3 }, + expected: { b: [2, 3] }, + }, + { + name: 'nested objects with differences', + obj1: { a: { b: 1, c: 2 }, d: 3 }, + obj2: { a: { b: 1, c: 3 }, d: 3 }, + expected: { 'a.c': [2, 3] }, + }, + { + name: 'missing keys in second object', + obj1: { a: 1, b: 2 }, + obj2: { a: 1 }, + expected: { b: [2, undefined] }, + }, + { + name: 'missing keys in first object', + obj1: { a: 1 }, + obj2: { a: 1, b: 2 }, + expected: { b: [undefined, 2] }, + }, + { + name: 'null inputs', + obj1: null, + obj2: { a: 1 }, + expected: { a: [undefined, 1] }, + }, + { + name: 'empty objects', + obj1: {}, + obj2: {}, + expected: {}, + }, + ]; + + test.each(testCases)('$name', ({ obj1, obj2, expected }) => { + expect(CommonUtils.objectDiff(obj1, obj2)).toEqual(expected); + }); + }); + + describe('toArray', () => { + const testCases = [ + { + name: 'existing array remains unchanged', + input: [1, 2, 3], + expected: [1, 2, 3], + }, + { + name: 'single number becomes array', + input: 42, + expected: [42], + }, + { + name: 'string becomes array', + input: 'test', + expected: ['test'], + }, + { + name: 'object becomes array', + input: { a: 1 }, + expected: [{ a: 1 }], + }, + { + name: 'null becomes array', + input: null, + expected: [null], + }, + { + name: 'undefined becomes array', + input: undefined, + expected: [undefined], + }, + ]; + + test.each(testCases)('$name', ({ input, expected }) => { + expect(CommonUtils.toArray(input)).toEqual(expected); + }); + }); + + describe('setDiff', () => { + const testCases = [ + { + name: 'sets with different elements', + mainSet: new Set([1, 2, 3]), + comparisonSet: new Set([2, 3, 4]), + expected: [1], + }, + { + name: 'identical sets', + mainSet: new Set([1, 2, 3]), + comparisonSet: new Set([1, 2, 3]), + expected: [], + }, + { + name: 'completely different sets', + mainSet: new Set([1, 2, 3]), + comparisonSet: new Set([4, 5, 6]), + expected: [1, 2, 3], + }, + { + name: 'empty comparison set', + mainSet: new Set([1, 2, 3]), + comparisonSet: new Set([]), + expected: [1, 2, 3], + }, + { + name: 'empty main set', + mainSet: new Set([]), + comparisonSet: new Set([1, 2, 3]), + expected: [], + }, + { + name: 'both empty sets', + mainSet: new Set([]), + comparisonSet: new Set([]), + expected: [], + }, + ]; + + test.each(testCases)('$name', ({ mainSet, comparisonSet, expected }) => { + expect(CommonUtils.setDiff(mainSet, comparisonSet)).toEqual(expected); + }); + }); +}); diff --git a/src/util/customTransformer-faas.js b/src/util/customTransformer-faas.js index 0f59f5db60f..d8bf556d893 100644 --- a/src/util/customTransformer-faas.js +++ b/src/util/customTransformer-faas.js @@ -34,7 +34,6 @@ function generateFunctionName(userTransformation, libraryVersionIds, testMode, h ids = ids.concat([hashSecret]); } - // FIXME: Why the id's are sorted ?! const hash = crypto.createHash('md5').update(`${ids}`).digest('hex'); return `fn-${userTransformation.workspaceId}-${hash}`.substring(0, 63).toLowerCase(); } diff --git a/src/util/dynamicConfig.js b/src/util/dynamicConfig.js index bdfebc87e87..a189141e1cd 100644 --- a/src/util/dynamicConfig.js +++ b/src/util/dynamicConfig.js @@ -3,30 +3,35 @@ const get = require('get-value'); const unset = require('unset-value'); function getDynamicConfigValue(event, value) { - // this regex checks for pattern "only spaces {{ path || defaultvalue }} only spaces" . - // " {{message.traits.key || \"email\" }} " - // " {{ message.traits.key || 1233 }} " - const defFormat = - /^\s*{{\s*(?[A-Z_a-z]\w*(?:\.[A-Z_a-z]\w*)+)\s*\|\|\s*(?.*)\s*}}\s*$/; - const matResult = value.match(defFormat); - if (matResult) { - // Support "event.." alias for "message.." - const fieldPath = matResult.groups.path.replace(/^event\.(.*)$/, 'message.$1'); - const pathVal = get(event, fieldPath); - if (pathVal) { - value = pathVal; - unset(event, fieldPath); - } else { - value = matResult.groups.defaultVal.replace(/"/g, '').trim(); + // Check if the value contains the "{{ }}" pattern + value = value.trim(); + if (value.startsWith(`{{`) && value.endsWith(`}}`)) { + // Remove the surrounding "{{ }}" and trim spaces + const innerContent = value.slice(2, -2).trim(); + + // Split the content by "||" to separate path and default value + const parts = innerContent.split('||').map((part) => part.trim()); + + // Ensure there are exactly two parts: path and default value + if (parts.length === 2) { + const [path, defaultVal] = parts; + + // Replace "event.." with "message.." + const fieldPath = path.startsWith('event.') ? path.replace(/^event\./, 'message.') : path; + + // Retrieve the value from the event object + const pathVal = get(event, fieldPath); + + // Use the path value if available, otherwise use the default value + if (pathVal) { + unset(event, fieldPath); // Remove the used path from the event object + return pathVal; + } + return defaultVal.replace(/"/g, '').trim(); // Clean up and use default value } - return value; } - /** var format2 = //; - matResult = value.match(format2); - if (matResult) { - - return value - } */ + + // Return the value unchanged if no "{{ }}" pattern or invalid format return value; } diff --git a/src/util/dynamicConfig.test.js b/src/util/dynamicConfig.test.js index 523f31ed10c..c500fa213a4 100644 --- a/src/util/dynamicConfig.test.js +++ b/src/util/dynamicConfig.test.js @@ -6,7 +6,7 @@ const reqType = 'processor'; describe(`${funcName} Tests`, () => { const funcTestData = getFuncTestData(__dirname, `./testdata/${funcName}.json`); - test.each(funcTestData)('$description', async ({ description, input, output }) => { + test.each(funcTestData)('$description', async ({ input, output }) => { let result; if (Array.isArray(input)) { result = processDynamicConfig(...input); diff --git a/src/util/eventValidation.js b/src/util/eventValidation.js index 46a494ee5ce..a009bc8f5cd 100644 --- a/src/util/eventValidation.js +++ b/src/util/eventValidation.js @@ -133,7 +133,7 @@ async function validate(event) { // UnPlanned event case - since no event schema is found. Violation is raised // Return this violation error only in case of track calls. - if (!eventSchema || eventSchema === {}) { + if (!eventSchema || Object.keys(eventSchema).length === 0) { if (event.message.type !== 'track') { return []; } @@ -173,7 +173,7 @@ async function validate(event) { let ajv = isDraft4 ? ajv4 : ajv19; const ajvCache = isDraft4 ? ajv4Cache : ajv19Cache; - if (merged !== {}) { + if (Object.keys(merged).length > 0) { const configHash = hash(merged); ajv = ajvCache.get(configHash); if (!ajv) { diff --git a/src/util/oncehub-custom-transformer.js b/src/util/oncehub-custom-transformer.js new file mode 100644 index 00000000000..8dcc0c26f55 --- /dev/null +++ b/src/util/oncehub-custom-transformer.js @@ -0,0 +1,90 @@ +const { EventType } = require('../constants'); + +const getPIIDestinationList = () => { + return (process.env.WHITELIST_PII_DESTINATION || "customerio") + .trim() + .split(","); + }; + + const doesEventContainsTraits = event => { + return event && event.message && event.message.traits; + }; + + const doesEventContainContextTraits = event => { + return event && event.message && event.message.context && event.message.context.traits; + }; + +const handleFirstLoginGA4Property = (destination, event, traits) => { + // delete firstLoginGA4 property from traits when destination is not GA4 + if (destination !== 'ga4') { + delete traits.firstLoginGA4; + return; + } + + // add firstLoginGA4 property in traits when Identify call is for GA4 destination + if (event.message.type === EventType.IDENTIFY) { + traits.firstLoginGA4 = true; + traits.value = 0; + } + + }; + + const changeDateFormatForCustomerio = (contextTraitsPresent, eventTraitsPresent,checkDestinationList, event) => { + if (checkDestinationList) { + if (contextTraitsPresent) { + // eslint-disable-next-line no-param-reassign + event.message.context.traits.accountCreatedDate = Math.floor( + Date.parse(event.message.context.traits.accountCreatedDate) / 1000, + ); + } + if (eventTraitsPresent) { + // eslint-disable-next-line no-param-reassign + event.message.traits.accountCreatedDate = Math.floor( + Date.parse(event.message.traits.accountCreatedDate) / 1000, + ); + } + } + }; + + const oncehubTransformer = (destination, event) => { + destination= destination.toString().toLowerCase(); + const contextTraitsPresent = doesEventContainContextTraits(event); + const eventTraitsPresent = doesEventContainsTraits(event); + const checkDestinationList=getPIIDestinationList().includes(destination); + changeDateFormatForCustomerio(contextTraitsPresent, eventTraitsPresent,checkDestinationList,event); + + if (!checkDestinationList && eventTraitsPresent) { + // eslint-disable-next-line no-param-reassign + delete event.message.traits.email; + // eslint-disable-next-line no-param-reassign + delete event.message.traits.firstName; + // eslint-disable-next-line no-param-reassign + delete event.message.traits.lastName; + + if (contextTraitsPresent) { + // eslint-disable-next-line no-param-reassign + delete event.message.context.traits.email; + // eslint-disable-next-line no-param-reassign + delete event.message.context.traits.firstName; + // eslint-disable-next-line no-param-reassign + delete event.message.context.traits.lastName; + } + } + + // Adding check for firstLoginGA4 property + if (eventTraitsPresent) { + handleFirstLoginGA4Property(destination, event, event.message.traits); + } + + if (contextTraitsPresent) { + handleFirstLoginGA4Property(destination, event, event.message.context.traits); + } + + // eslint-disable-next-line no-console + // if(doesEventContainsTraits(event)) console.log("event log=>destination : ", JSON.stringify(destination), " , ==> event traits : ", JSON.stringify(event.message.traits), " , ==> event here : ",JSON.stringify(event)); + return event; + }; + + module.exports = { + oncehubTransformer + }; \ No newline at end of file diff --git a/src/util/openfaas/index.js b/src/util/openfaas/index.js index 98f3340cad8..ec3604f066f 100644 --- a/src/util/openfaas/index.js +++ b/src/util/openfaas/index.js @@ -401,7 +401,7 @@ const executeFaasFunction = async ( throw new RetryRequestError(`Rate limit exceeded for ${name}`); } - if (error.statusCode === 500 || error.statusCode === 503) { + if (error.statusCode === 500 || error.statusCode === 503 || error.statusCode === 502) { throw new RetryRequestError(error.message); } diff --git a/src/util/prometheus.js b/src/util/prometheus.js index 2a3a1fb22a8..540dc6b807d 100644 --- a/src/util/prometheus.js +++ b/src/util/prometheus.js @@ -457,6 +457,24 @@ class Prometheus { type: 'counter', labelNames: ['event', 'writeKey'], }, + { + name: 'shopify_pixel_id_stitch_gaps', + help: 'shopify_pixel_id_stitch_gaps', + type: 'counter', + labelNames: ['event', 'reason', 'source', 'writeKey'], + }, + { + name: 'shopify_pixel_userid_mapping', + help: 'shopify_pixel_userid_mapping', + type: 'counter', + labelNames: ['action', 'operation'], + }, + { + name: 'shopify_pixel_cart_token_mapping', + help: 'shopify_pixel_cart_token_mapping', + type: 'counter', + labelNames: ['action', 'operation'], + }, { name: 'outgoing_request_count', help: 'Outgoing HTTP requests count', @@ -858,6 +876,18 @@ class Prometheus { { name: 'get_tracking_plan', help: 'get_tracking_plan', type: 'histogram', labelNames: [] }, // User transform metrics // counter + { + name: 'user_transform_input_events', + help: 'Number of input events to user transform', + type: 'counter', + labelNames: ['workspaceId'], + }, + { + name: 'user_transform_output_events', + help: 'user_transform_output_events', + type: 'counter', + labelNames: ['workspaceId'], + }, { name: 'user_transform_function_group_size', help: 'user_transform_function_group_size', @@ -948,20 +978,6 @@ class Prometheus { type: 'histogram', labelNames: ['identifier', 'transformationId', 'workspaceId'], }, - { - name: 'user_transform_input_events', - help: 'Number of input events to user transform', - type: 'histogram', - labelNames: [], - buckets: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 150, 200], - }, - { - name: 'user_transform_output_events', - help: 'user_transform_output_events', - type: 'histogram', - labelNames: [], - buckets: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 150, 200], - }, // summary { name: 'user_transform_request_latency_summary', diff --git a/src/util/stats.js b/src/util/stats.js index 6c42fc4b4d8..da937d5761b 100644 --- a/src/util/stats.js +++ b/src/util/stats.js @@ -1,9 +1,6 @@ -const statsd = require('./statsd'); const prometheus = require('./prometheus'); -const logger = require('../logger'); const enableStats = process.env.ENABLE_STATS !== 'false'; -const statsClientType = process.env.STATS_CLIENT || 'statsd'; // summary metrics are enabled by default. To disable set ENABLE_SUMMARY_METRICS='false'. const enableSummaryMetrics = process.env.ENABLE_SUMMARY_METRICS !== 'false'; @@ -13,22 +10,7 @@ function init() { return; } - switch (statsClientType) { - case 'statsd': - logger.info('setting up statsd client'); - statsClient = new statsd.Statsd(); - break; - - case 'prometheus': - logger.info('setting up prometheus client'); - statsClient = new prometheus.Prometheus(enableSummaryMetrics); - break; - - default: - logger.error( - `invalid stats client type: ${statsClientType}, supported values are 'statsd' and 'prometheues'`, - ); - } + statsClient = new prometheus.Prometheus(enableSummaryMetrics); } // Sends the diff between current time and start as the stat @@ -96,13 +78,7 @@ async function metricsController(ctx) { return; } - if (statsClientType === 'prometheus') { - await statsClient.metricsController(ctx); - return; - } - - ctx.status = 404; - ctx.body = `Not supported`; + await statsClient.metricsController(ctx); } async function resetMetricsController(ctx) { @@ -112,13 +88,7 @@ async function resetMetricsController(ctx) { return; } - if (statsClientType === 'prometheus') { - await statsClient.resetMetricsController(ctx); - return; - } - - ctx.status = 501; - ctx.body = `Not supported`; + await statsClient.resetMetricsController(ctx); } async function shutdownMetricsClient() { @@ -126,9 +96,7 @@ async function shutdownMetricsClient() { return; } - if (statsClientType === 'prometheus') { - await statsClient.shutdown(); - } + await statsClient.shutdown(); } init(); diff --git a/src/util/statsd.js b/src/util/statsd.js deleted file mode 100644 index 497b091f709..00000000000 --- a/src/util/statsd.js +++ /dev/null @@ -1,51 +0,0 @@ -const SDC = require('statsd-client'); - -const statsServerHost = process.env.STATSD_SERVER_HOST || 'localhost'; -const statsServerPort = parseInt(process.env.STATSD_SERVER_PORT || '8125', 10); -const instanceID = process.env.INSTANCE_ID || 'localhost'; - -class Statsd { - constructor() { - this.statsdClient = new SDC({ - host: statsServerHost, - port: statsServerPort, - prefix: 'transformer', - tags: { - instanceName: instanceID, - }, - }); - } - - // Sends the diff between current time and start as the stat - timing(name, start, tags = {}) { - this.statsdClient.timing(name, start, tags); - } - - // timingSummary is just a wrapper around timing for statsd.For prometheus, we will have to implement a different function. - timingSummary(name, start, tags = {}) { - this.statsdClient.timing(name, start, tags); - } - - // summary is just a wrapper around timing for statsd.For prometheus, we will have to implement a different function. - summary(name, value, tags = {}) { - this.statsdClient.timing(name, value, tags); - } - - increment(name, tags = {}) { - this.statsdClient.increment(name, 1, tags); - } - - counter(name, delta, tags = {}) { - this.statsdClient.counter(name, delta, tags); - } - - gauge(name, value, tags = {}) { - this.statsdClient.gauge(name, value, tags); - } - - histogram(name, value, tags = {}) { - this.statsdClient.histogram(name, value, tags); - } -} - -module.exports = { Statsd }; diff --git a/src/util/utils.js b/src/util/utils.js index 82c85b41a58..7f714a8b04b 100644 --- a/src/util/utils.js +++ b/src/util/utils.js @@ -44,35 +44,37 @@ const fetchAddressFromHostName = async (hostname) => { return { address, cacheHit: false }; }; -const staticLookup = (transformationTags) => async (hostname, _, cb) => { - let ip; - const resolveStartTime = new Date(); - try { - const { address, cacheHit } = await fetchAddressFromHostName(hostname); - ip = address; - stats.timing('fetch_dns_resolve_time', resolveStartTime, { ...transformationTags, cacheHit }); - } catch (error) { - logger.error(`DNS Error Code: ${error.code} | Message : ${error.message}`); - stats.timing('fetch_dns_resolve_time', resolveStartTime, { - ...transformationTags, - error: 'true', - }); - cb(null, `unable to resolve IP address for ${hostname}`, RECORD_TYPE_A); - return; - } - - if (!ip) { - cb(null, `resolved empty list of IP address for ${hostname}`, RECORD_TYPE_A); - return; - } - - if (ip.startsWith(LOCALHOST_OCTET)) { - cb(null, `cannot use ${ip} as IP address`, RECORD_TYPE_A); - return; - } - - cb(null, ip, RECORD_TYPE_A); -}; +const staticLookup = + (transformationTags, fetchAddress = fetchAddressFromHostName) => + (hostname, options, cb) => { + const resolveStartTime = new Date(); + + fetchAddress(hostname) + .then(({ address, cacheHit }) => { + stats.timing('fetch_dns_resolve_time', resolveStartTime, { + ...transformationTags, + cacheHit, + }); + + if (!address) { + cb(new Error(`resolved empty list of IP address for ${hostname}`), null); + } else if (address.startsWith(LOCALHOST_OCTET)) { + cb(new Error(`cannot use ${address} as IP address`), null); + } else if (options?.all) { + cb(null, [{ address, family: RECORD_TYPE_A }]); + } else { + cb(null, address, RECORD_TYPE_A); + } + }) + .catch((error) => { + logger.error(`DNS Error Code: ${error.code} | Message : ${error.message}`); + stats.timing('fetch_dns_resolve_time', resolveStartTime, { + ...transformationTags, + error: 'true', + }); + cb(new Error(`unable to resolve IP address for ${hostname}`), null); + }); + }; const httpAgentWithDnsLookup = (scheme, transformationTags) => { const httpModule = scheme === 'http' ? http : https; @@ -226,4 +228,5 @@ module.exports = { logProcessInfo, extractStackTraceUptoLastSubstringMatch, fetchWithDnsWrapper, + staticLookup, }; diff --git a/src/util/utils.test.js b/src/util/utils.test.js new file mode 100644 index 00000000000..ead605aab89 --- /dev/null +++ b/src/util/utils.test.js @@ -0,0 +1,61 @@ +const { staticLookup } = require('./utils'); + +describe('staticLookup', () => { + const transformationTags = { tag: 'value' }; + const RECORD_TYPE_A = 4; + const HOST_NAME = 'example.com'; + const fetchAddressFromHostName = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + const testCases = [ + { + name: 'should resolve the hostname and return the IP address', + mockResponse: { address: '192.168.1.1', cacheHit: true }, + expectedArgs: [null, '192.168.1.1', RECORD_TYPE_A], + }, + { + name: 'should resolve the hostname and return the IP address with all option', + options: { all: true }, + mockResponse: { address: '192.168.1.1', cacheHit: true }, + expectedArgs: [null, [{ address: '192.168.1.1', family: RECORD_TYPE_A }]], + }, + { + name: 'should handle errors from fetchAddressFromHostName', + mockResponse: { error: 'DNS error', errorCode: 'ENOTFOUND' }, + expectedArgs: [new Error(`unable to resolve IP address for ${HOST_NAME}`), null], + }, + { + name: 'should handle empty address', + mockResponse: { address: '', cacheHit: true }, + expectedArgs: [new Error(`resolved empty list of IP address for ${HOST_NAME}`), null], + }, + { + name: 'should handle localhost address', + mockResponse: { address: '127.0.0.1', cacheHit: true }, + expectedArgs: [new Error(`cannot use 127.0.0.1 as IP address`), null], + }, + ]; + + testCases.forEach(({ name, options, mockResponse, expectedArgs }) => { + it(name, async () => { + if (mockResponse.error) { + const error = new Error(mockResponse.error); + error.code = mockResponse.errorCode; + fetchAddressFromHostName.mockRejectedValueOnce(error); + } else { + fetchAddressFromHostName.mockResolvedValueOnce(mockResponse); + } + + const resolve = staticLookup(transformationTags, fetchAddressFromHostName); + const callback = (...args) => { + expect(fetchAddressFromHostName).toHaveBeenCalledWith(HOST_NAME); + expect(args).toEqual(expectedArgs); + }; + + resolve(HOST_NAME, options, callback); + }); + }); +}); diff --git a/src/util/worker.js b/src/util/worker.js index d1b7b24d969..df6cbf4984d 100644 --- a/src/util/worker.js +++ b/src/util/worker.js @@ -4,7 +4,7 @@ const { MESSAGE_TYPES } = require('./metricsAggregator'); const { AggregatorRegistry } = require('prom-client'); parentPort.on('message', async (message) => { - if ((message.type = MESSAGE_TYPES.AGGREGATE_METRICS_REQ)) { + if (message.type === MESSAGE_TYPES.AGGREGATE_METRICS_REQ) { try { const promString = await AggregatorRegistry.aggregate(message.metrics).metrics(); parentPort.postMessage({ type: MESSAGE_TYPES.AGGREGATE_METRICS_RES, metrics: promString }); diff --git a/src/v0/destinations/active_campaign/transform.js b/src/v0/destinations/active_campaign/transform.js index f21bb1a70d4..3fd5229c371 100644 --- a/src/v0/destinations/active_campaign/transform.js +++ b/src/v0/destinations/active_campaign/transform.js @@ -95,7 +95,7 @@ const customTagProcessor = async ({ message, destination, metadata }, category, // Step - 1 // Fetch already created tags from dest, so that we avoid duplicate tag creation request // Ref - https://developers.activecampaign.com/reference/retrieve-all-tags - endpoint = `${destination.Config.apiUrl}${`${tagEndPoint}?limit=100`}`; + endpoint = `${destination.Config.apiUrl}${tagEndPoint}?limit=100`; requestOptions = { headers: getHeader(destination), }; diff --git a/src/v0/destinations/adobe_analytics/transform.js b/src/v0/destinations/adobe_analytics/transform.js index 5d3d6e7d00f..ecc2fdd4573 100644 --- a/src/v0/destinations/adobe_analytics/transform.js +++ b/src/v0/destinations/adobe_analytics/transform.js @@ -340,7 +340,9 @@ const processTrackEvent = (message, adobeEventName, destinationConfig, extras = return { ...extras, events: overrideEventString || adobeEventArr.join(','), - products: overrideProductString || prodString, + products: + overrideProductString || + (Array.isArray(prodString) && prodString.length > 0 ? prodString : undefined), }; }; diff --git a/src/v0/destinations/adobe_analytics/utils.js b/src/v0/destinations/adobe_analytics/utils.js index ceba177ff14..e5196a30d48 100644 --- a/src/v0/destinations/adobe_analytics/utils.js +++ b/src/v0/destinations/adobe_analytics/utils.js @@ -97,6 +97,25 @@ function escapeToHTML(inputString) { ); } +/** + * Tries to find a value from alternative sources based on the source key. + * @param {Object} message - The input message object. + * @param {string} sourceKey - The key to look for. + * @returns {any} - The found value or null. + */ +function findValueFromSources(message, sourceKey) { + // Try alternative sources defined in SOURCE_KEYS + for (const source of SOURCE_KEYS) { + const value = getMappingFieldValueFormMessage(message, source, sourceKey); + if (isDefinedAndNotNull(value)) { + return value; + } + } + + // Fallback to value retrieval by path + return getValueByPath(message, sourceKey); +} + /** * This function is used for populating the eVars and hVars in the payload * @param {*} destVarMapping @@ -106,31 +125,28 @@ function escapeToHTML(inputString) { * @returns updated paylaod with eVars and hVars added */ function rudderPropToDestMap(destVarMapping, message, payload, destVarStrPrefix) { - const mappedVar = {}; - // pass the Rudder Property mapped in the ui whose evar you want to map - Object.keys(destVarMapping).forEach((key) => { - let val = get(message, `properties.${key}`); - if (isDefinedAndNotNull(val)) { - const destVarKey = destVarStrPrefix + destVarMapping[key]; - mappedVar[destVarKey] = escapeToHTML(val); - } else { - SOURCE_KEYS.some((sourceKey) => { - val = getMappingFieldValueFormMessage(message, sourceKey, key); - if (isDefinedAndNotNull(val)) { - mappedVar[`${destVarStrPrefix}${[destVarMapping[key]]}`] = escapeToHTML(val); - } else { - val = getValueByPath(message, key); - if (isDefinedAndNotNull(val)) { - mappedVar[`${destVarStrPrefix}${[destVarMapping[key]]}`] = escapeToHTML(val); - } - } - }); + const mappedVariables = {}; + + // Iterate over each key in the destination variable mapping + Object.keys(destVarMapping).forEach((sourceKey) => { + let value = message?.properties?.[sourceKey]; + + if (!isDefinedAndNotNull(value)) { + // Try getting the value from alternative sources + value = findValueFromSources(message, sourceKey); + } + + if (isDefinedAndNotNull(value)) { + const destinationKey = `${destVarStrPrefix}${destVarMapping[sourceKey]}`; + mappedVariables[destinationKey] = escapeToHTML(value); } }); - if (Object.keys(mappedVar).length > 0) { - // non-empty object - Object.assign(payload, mappedVar); + + // Add non-empty mapped variables to the payload + if (Object.keys(mappedVariables).length > 0) { + Object.assign(payload, mappedVariables); } + return payload; } diff --git a/src/v0/destinations/adobe_analytics/utils.test.js b/src/v0/destinations/adobe_analytics/utils.test.js new file mode 100644 index 00000000000..df40bf2ff31 --- /dev/null +++ b/src/v0/destinations/adobe_analytics/utils.test.js @@ -0,0 +1,271 @@ +const { + handleContextData, + handleEvar, + handleHier, + handleList, + handleCustomProperties, + stringifyValueAndJoinWithDelimiter, + escapeToHTML, +} = require('./utils'); // Update the path accordingly + +const { InstrumentationError } = require('@rudderstack/integrations-lib'); + +describe('handleContextData', () => { + it('should add context data to the payload when values are found', () => { + const payload = {}; + const destinationConfig = { + contextDataPrefix: 'c_', + contextDataMapping: { + 'user.id': 'userId', + 'user.email': 'userEmail', + }, + }; + const message = { + user: { + id: '123', + email: 'test@example.com', + }, + }; + + const result = handleContextData(payload, destinationConfig, message); + + expect(result.contextData).toEqual({ + c_userId: '123', + c_userEmail: 'test@example.com', + }); + }); + + it('should not add context data to the payload when no values are found', () => { + const payload = {}; + const destinationConfig = { + contextDataPrefix: 'c_', + contextDataMapping: { + 'user.id': 'userId', + 'user.email': 'userEmail', + }, + }; + const message = { + user: { + name: 'John Doe', + }, + }; + + const result = handleContextData(payload, destinationConfig, message); + + expect(result.contextData).toBeUndefined(); + }); +}); + +describe('handleEvar', () => { + it('should map properties to eVars in the payload', () => { + const payload = {}; + const destinationConfig = { + eVarMapping: { + productId: '1', + category: '2', + }, + }; + const message = { + properties: { + productId: 'p123', + category: 'electronics', + }, + }; + + const result = handleEvar(payload, destinationConfig, message); + + expect(result).toEqual({ + eVar1: 'p123', + eVar2: 'electronics', + }); + }); + + it('should not add eVars to the payload when no values are found', () => { + const payload = {}; + const destinationConfig = { + eVarMapping: { + productId: '1', + category: '2', + }, + }; + const message = { + properties: { + name: 'Product Name', + }, + }; + + const result = handleEvar(payload, destinationConfig, message); + + expect(result).toEqual({}); + }); +}); + +describe('handleHier', () => { + it('should map properties to hVars in the payload', () => { + const payload = {}; + const destinationConfig = { + hierMapping: { + section: '1', + subsection: '2', + }, + }; + const message = { + properties: { + section: 'home', + subsection: 'kitchen', + }, + }; + + const result = handleHier(payload, destinationConfig, message); + + expect(result).toEqual({ + hier1: 'home', + hier2: 'kitchen', + }); + }); + + it('should not add hVars to the payload when no values are found', () => { + const payload = {}; + const destinationConfig = { + hierMapping: { + section: '1', + subsection: '2', + }, + }; + const message = { + properties: { + name: 'Section Name', + }, + }; + + const result = handleHier(payload, destinationConfig, message); + + expect(result).toEqual({}); + }); +}); + +describe('handleList', () => { + it('should map properties to list variables in the payload', () => { + const payload = {}; + const destinationConfig = { + listMapping: { + products: '1', + }, + listDelimiter: { + products: ',', + }, + }; + const message = { + properties: { + products: ['p1', 'p2', 'p3'], + }, + }; + + const result = handleList(payload, destinationConfig, message); + + expect(result).toEqual({ + list1: 'p1,p2,p3', + }); + }); + + it('should throw an error when list properties are not strings or arrays', () => { + const payload = {}; + const destinationConfig = { + listMapping: { + products: '1', + }, + listDelimiter: { + products: ',', + }, + }; + const message = { + properties: { + products: 123, // Invalid type + }, + }; + + expect(() => handleList(payload, destinationConfig, message)).toThrow(InstrumentationError); + }); +}); + +describe('handleCustomProperties', () => { + it('should map properties to custom properties in the payload', () => { + const payload = {}; + const destinationConfig = { + customPropsMapping: { + color: '1', + size: '2', + }, + propsDelimiter: { + color: ',', + size: ';', + }, + }; + const message = { + properties: { + color: 'red,green,blue', + size: ['S', 'M', 'L'], + }, + }; + + const result = handleCustomProperties(payload, destinationConfig, message); + + expect(result).toEqual({ + prop1: 'red,green,blue', + prop2: 'S;M;L', + }); + }); + + it('should throw an error when custom properties are not strings or arrays', () => { + const payload = {}; + const destinationConfig = { + customPropsMapping: { + color: '1', + }, + propsDelimiter: { + color: ',', + }, + }; + const message = { + properties: { + color: 123, // Invalid type + }, + }; + + expect(() => handleCustomProperties(payload, destinationConfig, message)).toThrow( + InstrumentationError, + ); + }); +}); + +describe('stringifyValueAndJoinWithDelimiter', () => { + it('should join values with a delimiter after stringifying them', () => { + const values = [1, null, 'test', true]; + const result = stringifyValueAndJoinWithDelimiter(values, '|'); + + expect(result).toBe('1|null|test|true'); + }); + + it('should use the default delimiter if none is provided', () => { + const values = [1, 2, 3]; + const result = stringifyValueAndJoinWithDelimiter(values); + + expect(result).toBe('1;2;3'); + }); +}); + +describe('escapeToHTML', () => { + it('should escape HTML entities in a string', () => { + const input = '
&
'; + const result = escapeToHTML(input); + + expect(result).toBe('<div>&</div>'); + }); + + it('should return non-string values unchanged', () => { + const input = 123; + const result = escapeToHTML(input); + + expect(result).toBe(123); + }); +}); diff --git a/src/v0/destinations/af/deleteUsers.js b/src/v0/destinations/af/deleteUsers.js index e0da3699edd..ca956dc86fb 100644 --- a/src/v0/destinations/af/deleteUsers.js +++ b/src/v0/destinations/af/deleteUsers.js @@ -77,7 +77,7 @@ const userDeletionHandler = async (userAttributes, config) => { if (config.statusCallbackUrls) { const statusCallbackUrlsArray = config.statusCallbackUrls.split(','); const filteredStatusCallbackUrlsArray = statusCallbackUrlsArray.filter((statusCallbackUrl) => { - const URLRegex = /^(https?:\/\/)?[\w.-]+(?:\.[\w.-]+)+[\w!#$&'()*+,/:;=?@[\]~-]+$/; + const URLRegex = /^(https?:\/\/)?[\w.-]+(\.[A-Za-z]{2,})+([#/?]\S*)?$/; return statusCallbackUrl.match(URLRegex); }); if (filteredStatusCallbackUrlsArray.length > 3) { diff --git a/src/v0/destinations/airship/transform.js b/src/v0/destinations/airship/transform.js index fcf18daa7ed..d2244b542a3 100644 --- a/src/v0/destinations/airship/transform.js +++ b/src/v0/destinations/airship/transform.js @@ -7,7 +7,6 @@ const { groupMapping, BASE_URL_EU, BASE_URL_US, - RESERVED_TRAITS_MAPPING, AIRSHIP_TRACK_EXCLUSION, } = require('./config'); @@ -25,6 +24,7 @@ const { convertToUuid, } = require('../../util'); const { JSON_MIME_TYPE } = require('../../util/constant'); +const { prepareAttributePayload, prepareTagPayload } = require('./utils'); const DEFAULT_ACCEPT_HEADER = 'application/vnd.urbanairship+json; version=3'; @@ -37,7 +37,7 @@ const transformSessionId = (rawSessionId) => { }; const identifyResponseBuilder = (message, { Config }) => { - const tagPayload = constructPayload(message, identifyMapping); + const initialTagPayload = constructPayload(message, identifyMapping); const { apiKey, dataCenter } = Config; if (!apiKey) @@ -55,38 +55,10 @@ const identifyResponseBuilder = (message, { Config }) => { } // Creating tags and attribute payload - tagPayload.add = { rudderstack_integration: [] }; - tagPayload.remove = { rudderstack_integration: [] }; - let timestamp = getFieldValueFromMessage(message, 'timestamp'); - timestamp = new Date(timestamp).toISOString().replace(/\.\d{3}/, ''); + const tagPayload = prepareTagPayload(traits, initialTagPayload); // Creating attribute payload - const attributePayload = { attributes: [] }; - Object.keys(traits).forEach((key) => { - // tags - if (typeof traits[key] === 'boolean') { - const tag = key.toLowerCase().replace(/\./g, '_'); - if (traits[key] === true) { - tagPayload.add.rudderstack_integration.push(tag); - } - if (traits[key] === false) { - tagPayload.remove.rudderstack_integration.push(tag); - } - } - // attribute - if (typeof traits[key] !== 'boolean') { - const attribute = { action: 'set' }; - const keyMapped = RESERVED_TRAITS_MAPPING[key.toLowerCase()]; - if (keyMapped) { - attribute.key = keyMapped; - } else { - attribute.key = key.replace(/\./g, '_'); - } - attribute.value = traits[key]; - attribute.timestamp = timestamp; - attributePayload.attributes.push(attribute); - } - }); + const attributePayload = prepareAttributePayload(traits, message); let tagResponse; let attributeResponse; @@ -149,7 +121,7 @@ const trackResponseBuilder = async (message, { Config }) => { } payload.name = name.replace(/\s+/g, '_'); - if (payload.value) { + if (payload.value && typeof payload.value === 'string') { payload.value.replace(/\s+/g, '_'); } const { appKey, dataCenter, apiKey } = Config; @@ -183,7 +155,7 @@ const trackResponseBuilder = async (message, { Config }) => { }; const groupResponseBuilder = (message, { Config }) => { - const tagPayload = constructPayload(message, groupMapping); + const initTagPayload = constructPayload(message, groupMapping); const { apiKey, dataCenter } = Config; if (!apiKey) @@ -200,37 +172,9 @@ const groupResponseBuilder = (message, { Config }) => { ); } - tagPayload.add = { rudderstack_integration_group: [] }; - tagPayload.remove = { rudderstack_integration_group: [] }; - let timestamp = getFieldValueFromMessage(message, 'timestamp'); - timestamp = new Date(timestamp).toISOString().replace(/\.\d{3}/, ''); - - const attributePayload = { attributes: [] }; - Object.keys(traits).forEach((key) => { - // tags - if (typeof traits[key] === 'boolean') { - const tag = key.toLowerCase().replace(/\./g, '_'); - if (traits[key] === true) { - tagPayload.add.rudderstack_integration_group.push(tag); - } - if (traits[key] === false) { - tagPayload.remove.rudderstack_integration_group.push(tag); - } - } - // attribute - if (typeof traits[key] !== 'boolean') { - const attribute = { action: 'set' }; - const keyMapped = RESERVED_TRAITS_MAPPING[key.toLowerCase()]; - if (keyMapped) { - attribute.key = keyMapped; - } else { - attribute.key = key.replace(/\./g, '_'); - } - attribute.value = traits[key]; - attribute.timestamp = timestamp; - attributePayload.attributes.push(attribute); - } - }); + const tagPayload = prepareTagPayload(traits, initTagPayload, 'group'); + + const attributePayload = prepareAttributePayload(traits, message); let tagResponse; let attributeResponse; diff --git a/src/v0/destinations/airship/utils.test.ts b/src/v0/destinations/airship/utils.test.ts new file mode 100644 index 00000000000..0ed77a6fa67 --- /dev/null +++ b/src/v0/destinations/airship/utils.test.ts @@ -0,0 +1,433 @@ +import { RudderMessage } from '../../../types'; +import { convertToUuid, flattenJson, getFieldValueFromMessage } from '../../util'; +import { getAirshipTimestamp, isValidTimestamp, prepareAttributePayload } from './utils'; + +type timestampTc = { + description: string; + input: string; + output?: string; + error?: string; +}; + +describe('Airship utils - getAirshipTimestamp', () => { + const timestampCases: timestampTc[] = [ + { + description: 'should return the same timestamp', + input: '2025-01-23T12:00:00Z', + output: '2025-01-23T12:00:00Z', + }, + { + description: 'should remove milliseconds', + input: '2025-01-23T12:00:00.123Z', + output: '2025-01-23T12:00:00Z', + }, + { + description: 'should remove milliseconds - 2', + input: '2025-01-23T12:00:00.123456Z', + output: '2025-01-23T12:00:00Z', + }, + { + description: 'should return with correct format when T is present but Z is not present', + input: '2025-01-23T12:00:00', + output: '2025-01-23T12:00:00Z', + }, + { + description: 'should return with correct format when T & Z is not present', + input: '2025-01-23 12:00:00', + output: '2025-01-23T12:00:00Z', + }, + { + description: 'should throw error when timestamp is not supported', + input: 'abcd', + error: 'timestamp is not supported: abcd', + }, + { + description: + 'should return with correct format when timestamp contains microseconds without Z', + input: '2025-01-23T12:00:00.123456', + output: '2025-01-23T12:00:00Z', + }, + ]; + + test.each(timestampCases)('getAirshipTimestamp - $description', ({ input, output, error }) => { + const message = { + timestamp: input, + } as RudderMessage; + if (error) { + expect(() => getAirshipTimestamp(message)).toThrow(error); + } else { + const timestamp = getAirshipTimestamp(message); + expect(timestamp).toBe(output); + } + }); +}); + +describe('Airship utils - prepareAttributePayload', () => { + const commonContextProps = { + app: { + build: '1', + name: 'Polarsteps', + namespace: 'com.polarsteps.Polarsteps', + version: '8.2.11', + }, + device: { + attTrackingStatus: 0, + id: '1d89c859-76c6-4374-ac0a-e32dee541e12', + manufacturer: 'Apple', + model: 'arm64', + name: 'iPhone 14 Pro Max', + type: 'iOS', + }, + library: { + name: 'rudder-ios-library', + version: '1.31.0', + }, + locale: 'en-US', + network: { + cellular: false, + wifi: true, + }, + os: { + name: 'iOS', + version: '17.0', + }, + screen: { + density: 3, + height: 932, + width: 430, + }, + sessionId: 1736246350, + timezone: 'Europe/Amsterdam', + }; + const commonEventProps = { + anonymousId: 'd00de6f3-2ea3-44bd-8fc5-0c318cb0b9d9', + channel: 'mobile', + messageId: 'b95d29ee-f9c8-486c-b9ef-acf231759612', + originalTimestamp: '2025-01-07T10:57:38.768Z', + receivedAt: '2025-01-07T10:57:49.882Z', + request_ip: '77.248.183.43', + rudderId: 'b931e94b-3b22-462c-8b58-243cb4b37366', + sentAt: '2025-01-07T10:57:47.707Z', + userId: '1c5577e3-8d2d-4ecd-9361-88c2bfb254c5', + }; + it('should return the correct attribute payload when jsonAttributes is not present in integrations object ', () => { + const message = { + ...commonEventProps, + context: { + ...commonContextProps, + traits: { + af_install_time: '2024-12-09 12:26:29.643', + af_status: 'Organic', + firstName: 'Orcun', + lastName: 'Test', + widgets_installed: ['no_widgets_installed', 'widgets_installed'], + }, + }, + event: 'identify', + integrations: { + All: true, + }, + type: 'identify', + }; + + const expectedAttributePayload = { + attributes: [ + { + action: 'set', + key: 'af_install_time', + value: '2024-12-09T12:26:29Z', + timestamp: '2025-01-07T10:57:38Z', + }, + { action: 'set', key: 'af_status', value: 'Organic', timestamp: '2025-01-07T10:57:38Z' }, + { action: 'set', key: 'first_name', value: 'Orcun', timestamp: '2025-01-07T10:57:38Z' }, + { action: 'set', key: 'last_name', value: 'Test', timestamp: '2025-01-07T10:57:38Z' }, + { + action: 'set', + key: 'widgets_installed[0]', + value: 'no_widgets_installed', + timestamp: '2025-01-07T10:57:38Z', + }, + { + action: 'set', + key: 'widgets_installed[1]', + value: 'widgets_installed', + timestamp: '2025-01-07T10:57:38Z', + }, + ], + }; + + const traits = getFieldValueFromMessage(message, 'traits'); + const flattenedTraits = flattenJson(traits); + // @ts-expect-error error with type + const attributePayload = prepareAttributePayload(flattenedTraits, message); + expect(attributePayload).toEqual(expectedAttributePayload); + }); + + it('should throw error when jsonAttributes is present in integrations object and jsonAttribute(widgets_installed#123) is array', () => { + const message = { + ...commonEventProps, + context: { + ...commonContextProps, + traits: { + af_install_time: '2024-12-09 12:26:29.643', + af_status: 'Organic', + firstName: 'Orcun', + lastName: 'Test', + widgets_installed: ['no_widgets_installed', 'widgets_installed'], + }, + }, + event: 'identify', + integrations: { + All: true, + AIRSHIP: { + JSONAttributes: { + 'widgets_installed#123': ['no_widgets_installed', 'widgets_installed'], + }, + }, + }, + type: 'identify', + }; + + const traits = getFieldValueFromMessage(message, 'traits'); + const flattenedTraits = flattenJson(traits); + // @ts-expect-error error with type + expect(() => prepareAttributePayload(flattenedTraits, message)).toThrow( + 'JsonAttribute as array is not supported for widgets_installed#123 in Airship', + ); + }); + + it('should return the correct attribute payload when jsonAttributes is present in integrations object and jsonAttribute(widgets_installed#123) is object', () => { + const message = { + ...commonEventProps, + context: { + ...commonContextProps, + traits: { + af_install_time: '2024-12-09 12:26:29.643', + af_status: 'Organic', + firstName: 'Orcun', + lastName: 'Test', + }, + }, + event: 'identify', + integrations: { + All: true, + AIRSHIP: { + JSONAttributes: { + 'widgets_installed#123': { + widgets: ['no_widgets_installed', 'widgets_installed'], + }, + }, + }, + }, + type: 'identify', + }; + + const expectedAttributePayload = { + attributes: [ + { + action: 'set', + key: 'af_install_time', + value: '2024-12-09T12:26:29Z', + timestamp: '2025-01-07T10:57:38Z', + }, + { action: 'set', key: 'af_status', value: 'Organic', timestamp: '2025-01-07T10:57:38Z' }, + { action: 'set', key: 'first_name', value: 'Orcun', timestamp: '2025-01-07T10:57:38Z' }, + { action: 'set', key: 'last_name', value: 'Test', timestamp: '2025-01-07T10:57:38Z' }, + { + action: 'set', + key: 'widgets_installed#123', + value: { + widgets: ['no_widgets_installed', 'widgets_installed'], + }, + timestamp: '2025-01-07T10:57:38Z', + }, + ], + }; + + const traits = getFieldValueFromMessage(message, 'traits'); + const flattenedTraits = flattenJson(traits); + // @ts-expect-error error with type + const attributePayload = prepareAttributePayload(flattenedTraits, message); + expect(attributePayload).toEqual(expectedAttributePayload); + }); + + it('should return the correct attribute payload when jsonAttributes is present in integrations object and jsonAttribute(data) is object & traits include an object', () => { + const message = { + ...commonEventProps, + context: { + ...commonContextProps, + traits: { + af_install_time: '2024-12-09 12:26:29.643', + af_status: 'Organic', + firstName: 'Orcun', + lastName: 'Test', + data: { + recordId: '123', + recordType: 'user', + }, + }, + }, + event: 'identify', + integrations: { + All: true, + AIRSHIP: { + JSONAttributes: { + 'widgets_installed#123': { + widgets: ['no_widgets_installed', 'widgets_installed'], + }, + }, + }, + }, + type: 'identify', + }; + + const expectedAttributePayload = { + attributes: [ + { + action: 'set', + key: 'af_install_time', + value: '2024-12-09T12:26:29Z', + timestamp: '2025-01-07T10:57:38Z', + }, + { action: 'set', key: 'af_status', value: 'Organic', timestamp: '2025-01-07T10:57:38Z' }, + { action: 'set', key: 'first_name', value: 'Orcun', timestamp: '2025-01-07T10:57:38Z' }, + { action: 'set', key: 'last_name', value: 'Test', timestamp: '2025-01-07T10:57:38Z' }, + { + action: 'set', + key: 'data_recordId', + value: '123', + timestamp: '2025-01-07T10:57:38Z', + }, + { + action: 'set', + key: 'data_recordType', + value: 'user', + timestamp: '2025-01-07T10:57:38Z', + }, + { + action: 'set', + key: 'widgets_installed#123', + value: { + widgets: ['no_widgets_installed', 'widgets_installed'], + }, + timestamp: '2025-01-07T10:57:38Z', + }, + ], + }; + + const traits = getFieldValueFromMessage(message, 'traits'); + const flattenedTraits = flattenJson(traits); + // @ts-expect-error error with type + const attributePayload = prepareAttributePayload(flattenedTraits, message); + expect(attributePayload).toEqual(expectedAttributePayload); + }); + + it('should return the correct attribute payload when jsonAttributes is present in integrations object and jsonAttribute(widgets_installed#123) is object & traits include an object', () => { + const message = { + ...commonEventProps, + context: { + ...commonContextProps, + traits: { + af_install_time: '2024-12-09 12:26:29.643', + af_status: 'Organic', + firstName: 'Orcun', + lastName: 'Test', + data: { + recordId: '123', + recordType: 'user', + }, + widgets_installed: ['no_widgets_installed', 'widgets_installed'], + }, + }, + event: 'identify', + integrations: { + All: true, + AIRSHIP: { + JSONAttributes: { + 'widgets_installed#123': { + widgets: ['no_widgets_installed', 'widgets_installed'], + }, + }, + }, + }, + type: 'identify', + }; + + const expectedAttributePayload = { + attributes: [ + { + action: 'set', + key: 'af_install_time', + value: '2024-12-09T12:26:29Z', + timestamp: '2025-01-07T10:57:38Z', + }, + { action: 'set', key: 'af_status', value: 'Organic', timestamp: '2025-01-07T10:57:38Z' }, + { action: 'set', key: 'first_name', value: 'Orcun', timestamp: '2025-01-07T10:57:38Z' }, + { action: 'set', key: 'last_name', value: 'Test', timestamp: '2025-01-07T10:57:38Z' }, + { + action: 'set', + key: 'data_recordId', + value: '123', + timestamp: '2025-01-07T10:57:38Z', + }, + { + action: 'set', + key: 'data_recordType', + value: 'user', + timestamp: '2025-01-07T10:57:38Z', + }, + { + action: 'set', + key: 'widgets_installed#123', + value: { + widgets: ['no_widgets_installed', 'widgets_installed'], + }, + timestamp: '2025-01-07T10:57:38Z', + }, + ], + }; + + const traits = getFieldValueFromMessage(message, 'traits'); + const flattenedTraits = flattenJson(traits); + // @ts-expect-error error with type + const attributePayload = prepareAttributePayload(flattenedTraits, message); + expect(attributePayload).toEqual(expectedAttributePayload); + }); +}); + +describe('Airship utils - isValidTimestamp', () => { + it('should return true when timestamp is a valid Unix timestamp', () => { + const timestamp = 1736246350; + expect(isValidTimestamp(timestamp)).toBe(true); + }); + + it('should return true when timestamp is a valid Unix timestamp with milliseconds', () => { + const timestamp = 1736246350 * 1000; + expect(isValidTimestamp(timestamp)).toBe(true); + }); + + it('should return true when timestamp is a valid date string', () => { + const timestamp = '2025-01-23T12:00:00Z'; + expect(isValidTimestamp(timestamp)).toBe(true); + }); + + it('should return false when timestamp is not a valid Unix timestamp or date string(invalid_timestamp)', () => { + const timestamp = 'invalid_timestamp'; + expect(isValidTimestamp(timestamp)).toBe(false); + }); + + it('should return false when timestamp is not a valid Unix timestamp or date string(uuid)', () => { + const timestamp = convertToUuid('invalid_timestamp'); + expect(isValidTimestamp(timestamp)).toBe(false); + }); + + it('should return false when timestamp is not a valid Unix timestamp or date string(91504)', () => { + const timestamp = 91504; + expect(isValidTimestamp(timestamp)).toBe(false); + }); + + it('should return false when timestamp is not a valid Unix timestamp or date string("91504")', () => { + const timestamp = '91504'; + expect(isValidTimestamp(timestamp)).toBe(false); + }); +}); diff --git a/src/v0/destinations/airship/utils.ts b/src/v0/destinations/airship/utils.ts new file mode 100644 index 00000000000..d8c48fa2d04 --- /dev/null +++ b/src/v0/destinations/airship/utils.ts @@ -0,0 +1,209 @@ +import moment from 'moment'; +import { InstrumentationError } from '@rudderstack/integrations-lib'; +import { RudderMessage } from '../../../types'; +import { getFieldValueFromMessage, getIntegrationsObj } from '../../util'; +import { RESERVED_TRAITS_MAPPING } from './config'; + +export type TagPayloadEventType = 'identify' | 'group'; + +type AirshipTagProperties = { + identify: 'rudderstack_integration'; + group: 'rudderstack_integration_group'; +}; + +const AIRSHIP_TAG_PROPERTIES: Record = { + identify: 'rudderstack_integration', + group: 'rudderstack_integration_group', +}; + +type AirshipTag = { + [K in keyof Pick]: string[]; +}; + +type TagPayload = { + add: AirshipTag[T]; + remove: AirshipTag[T]; + [key: string]: unknown; +}; + +type AttributeValue = string | number | object; + +type Attribute = { + action: 'set' | 'remove'; + key: string; + value?: AttributeValue; + timestamp: string; +}; + +type AttributePayload = { + attributes: Attribute[]; +}; + +type AirshipIntegrationsObj = { + JSONAttributes: Record; + removeAttributes: string[]; +}; + +type AirshipObjectAttributes = Partial<{ + jsonAttributes: Attribute[]; + removeAttributes: Omit[]; +}>; + +const getDigitCount = (num: number): number => Math.floor(Math.log10(Math.abs(num))) + 1; + +export const isValidTimestamp = (timestamp: string | number): boolean => { + // Check if timestamp is a valid Unix timestamp (10 digits) + if (typeof timestamp === 'number' || !Number.isNaN(Number(timestamp))) { + return getDigitCount(Number(timestamp)) >= 10; + } + + // Check if timestamp is a valid date string + const date = moment.utc(timestamp); + return date.isValid() && date.year() >= 1970; +}; + +// Airship timestamp format: https://docs.airship.com/api/ua/#api-request-format +const AIRSHIP_TIMESTAMP_FORMAT = 'YYYY-MM-DD[T]HH:mm:ss[Z]'; + +const convertToAirshipTimestamp = (timestamp: string) => { + if (!timestamp || !moment(timestamp).isValid()) { + throw new InstrumentationError(`timestamp is not supported: ${timestamp}`); + } + return moment.utc(timestamp).format(AIRSHIP_TIMESTAMP_FORMAT); +}; + +export const getAirshipTimestamp = (message: RudderMessage) => { + const timestamp = getFieldValueFromMessage(message, 'timestamp'); + return convertToAirshipTimestamp(timestamp); +}; + +export const prepareTagPayload = ( + flattenedTraits: Record, + initTagPayload: TagPayload, + eventType: TagPayloadEventType = 'identify', +): TagPayload => { + const property = AIRSHIP_TAG_PROPERTIES[eventType]; + const initialTagPayload: TagPayload = { + ...initTagPayload, + add: { + [property]: [], + } as unknown as AirshipTag[TagPayloadEventType], + remove: { + [property]: [], + } as unknown as AirshipTag[TagPayloadEventType], + }; + + const tagPayload = Object.entries(flattenedTraits).reduce((acc, [key, value]) => { + // tags + if (typeof value === 'boolean') { + const tag = key.toLowerCase().replace(/\./g, '_'); + if (value === true) { + acc.add[property].push(tag); + } + if (value === false) { + acc.remove[property].push(tag); + } + } + return acc; + }, initialTagPayload); + return tagPayload; +}; + +const getJsonAttributesFromIntegrationsObj = (message: RudderMessage): AirshipObjectAttributes => { + const integrationsObj = getIntegrationsObj( + message, + 'airship' as any, + ) as Partial; + const timestamp = getAirshipTimestamp(message); + const airshipObjectAttributes: AirshipObjectAttributes = {}; + if (integrationsObj?.JSONAttributes) { + airshipObjectAttributes.jsonAttributes = Object.entries(integrationsObj.JSONAttributes).map( + ([key, value]) => { + // object attribute type in Airship: https://docs.airship.com/api/ua/#schemas-setattributeobject + if (Array.isArray(value)) { + throw new InstrumentationError( + `JsonAttribute as array is not supported for ${key} in Airship`, + ); + } + return { + action: 'set', + key, + value: value as AttributeValue, + timestamp, + }; + }, + ); + } + if (integrationsObj?.removeAttributes) { + // Remove Attributes in Airship: https://docs.airship.com/api/ua/#schemas-removeattributeobject + airshipObjectAttributes.removeAttributes = integrationsObj.removeAttributes.map((key) => ({ + action: 'remove', + key, + timestamp, + })); + } + return airshipObjectAttributes; +}; + +export const getAttributeValue = (value: string | number | object): AttributeValue => { + if (isValidTimestamp(value as string)) { + return convertToAirshipTimestamp(value as string); + } + return value as AttributeValue; +}; + +export const prepareAttributePayload = ( + flattenedTraits: Record, + message: RudderMessage, +): AttributePayload => { + const timestamp = getAirshipTimestamp(message); + const initialAttributePayload: AttributePayload = { attributes: [] }; + const airshipObjectAttributes: AirshipObjectAttributes = + getJsonAttributesFromIntegrationsObj(message); + + const isJsonAttributesPresent = + Array.isArray(airshipObjectAttributes?.jsonAttributes) && + airshipObjectAttributes?.jsonAttributes.length > 0; + + const attributePayload = Object.entries(flattenedTraits).reduce((acc, [key, value]) => { + // attribute + if (typeof value !== 'boolean') { + const attribute: Attribute = { action: 'set', key: '', value: '', timestamp }; + const keyMapped = RESERVED_TRAITS_MAPPING[key] || RESERVED_TRAITS_MAPPING[key.toLowerCase()]; + const isKeyObjectType = key.includes('.') || (key.includes('[') && key.includes(']')); + if (keyMapped) { + attribute.key = keyMapped; + } else { + attribute.key = key.replace(/\./g, '_'); + } + if (isJsonAttributesPresent && isKeyObjectType) { + // Skip these keys + // they can be in the form of an array or object + const keyParts = key?.split(/[[\]_]+/g) || []; + if (keyParts.length === 0) { + // If key doesn't include any of the delimiters like '[' or ']' or '_' , skip it + return acc; + } + // Skip keys that exist in both traits and integrations object to avoid duplication + const isKeyPresentInJsonAttributes = airshipObjectAttributes.jsonAttributes?.some((attr) => + attr.key.includes(keyParts[0]), + ); + if (isKeyPresentInJsonAttributes) { + // Skip this key + return acc; + } + } + attribute.value = getAttributeValue(value as AttributeValue); + acc.attributes.push(attribute); + } + return acc; + }, initialAttributePayload); + + attributePayload.attributes = [ + ...attributePayload.attributes, + ...(airshipObjectAttributes?.jsonAttributes || []), + ...(airshipObjectAttributes?.removeAttributes || []), + ]; + + return attributePayload; +}; diff --git a/src/v0/destinations/am/deleteUsers.js b/src/v0/destinations/am/deleteUsers.js index 96c4f7b19c7..1fde1c4142e 100644 --- a/src/v0/destinations/am/deleteUsers.js +++ b/src/v0/destinations/am/deleteUsers.js @@ -16,7 +16,7 @@ const userDeletionHandler = async (userAttributes, config) => { if (!config) { throw new ConfigurationError('Config for deletion not present'); } - const { apiKey, apiSecret } = config; + const { apiKey, apiSecret, residencyServer } = config; if (!apiKey || !apiSecret) { throw new ConfigurationError('api key/secret for deletion not present'); } @@ -27,7 +27,10 @@ const userDeletionHandler = async (userAttributes, config) => { }; // Ref : https://www.docs.developers.amplitude.com/analytics/apis/user-privacy-api/#response const batchEvents = getUserIdBatches(userAttributes, DELETE_MAX_BATCH_SIZE); - const url = 'https://amplitude.com/api/2/deletions/users'; + const url = + residencyServer === 'EU' + ? 'https://analytics.eu.amplitude.com/api/2/deletions/users' + : 'https://amplitude.com/api/2/deletions/users'; const endpointPath = '/api/2/deletions/users'; await Promise.all( batchEvents.map(async (batch) => { diff --git a/src/v0/destinations/branch/data/eventMapping.js b/src/v0/destinations/branch/data/eventMapping.js index 84ae1a07af4..abab6a29932 100644 --- a/src/v0/destinations/branch/data/eventMapping.js +++ b/src/v0/destinations/branch/data/eventMapping.js @@ -40,6 +40,7 @@ const CommerceEventConfig = { 'Spend Credits': 'SPEND_CREDITS', 'Promotion Viewed': 'VIEW_AD', 'Promotion Clicked': 'CLICK_AD', + Purchase: 'PURCHASE', Reserve: 'RESERVE', }, event_data: ['transaction_id', 'currency', 'revenue', 'shipping', 'tax', 'coupon', 'description'], diff --git a/src/v0/destinations/branch/transform.js b/src/v0/destinations/branch/transform.js index 2626d8aa812..8362f10723a 100644 --- a/src/v0/destinations/branch/transform.js +++ b/src/v0/destinations/branch/transform.js @@ -46,17 +46,16 @@ function getCategoryAndName(rudderEventName) { let requiredName = null; let requiredCategory = null; // eslint-disable-next-line array-callback-return, sonarjs/no-ignored-return - Object.keys(category.name).find((branchKey) => { + Object.keys(category.name).forEach((branchKey) => { if ( typeof branchKey === 'string' && typeof rudderEventName === 'string' && - branchKey.toLowerCase() === rudderEventName.toLowerCase() + (branchKey.toLowerCase() === rudderEventName.toLowerCase() || + category.name[branchKey].toLowerCase() === rudderEventName.toLowerCase()) ) { requiredName = category.name[branchKey]; requiredCategory = category; - return true; } - return false; }); if (requiredName != null && requiredCategory != null) { return { evName: requiredName, category: requiredCategory }; @@ -116,14 +115,12 @@ function mapPayload(category, rudderProperty, rudderPropertiesObj) { let valFound = false; if (category.content_items) { // eslint-disable-next-line sonarjs/no-ignored-return - Object.keys(category.content_items).find((branchMappingProperty) => { + Object.keys(category.content_items).forEach((branchMappingProperty) => { if (branchMappingProperty === rudderProperty) { const tmpKeyName = category.content_items[branchMappingProperty]; contentItems[tmpKeyName] = rudderPropertiesObj[rudderProperty]; valFound = true; - return true; } - return false; }); } @@ -217,16 +214,17 @@ function getCommonPayload(message, category, evName) { function processMessage(message, destination) { let evName; let category; + let updatedEventName = message.event; switch (message.type) { case EventType.TRACK: { if (!message.event) { throw new InstrumentationError('Event name is required'); } - ({ evName, category } = getCategoryAndName(message.event)); const eventNameFromConfig = getMappedEventNameFromConfig(message, destination); if (eventNameFromConfig) { - evName = eventNameFromConfig; + updatedEventName = eventNameFromConfig; } + ({ evName, category } = getCategoryAndName(updatedEventName)); break; } case EventType.IDENTIFY: diff --git a/src/v0/destinations/braze/braze.util.test.js b/src/v0/destinations/braze/braze.util.test.js index 6fe4dbbb44e..c68f1e046be 100644 --- a/src/v0/destinations/braze/braze.util.test.js +++ b/src/v0/destinations/braze/braze.util.test.js @@ -13,6 +13,7 @@ const { removeUndefinedAndNullValues, removeUndefinedAndNullAndEmptyValues, } = require('../../util'); +const { generateRandomString } = require('@rudderstack/integrations-lib'); // Mock the handleHttpRequest function jest.mock('../../../adapters/network'); @@ -255,7 +256,7 @@ describe('dedup utility tests', () => { enableNestedArrayOperations: false, enableSubscriptionGroupInGroupCall: false, eventFilteringOption: 'disable', - restApiKey: 'test-rest-api-key', + restApiKey: generateRandomString(), supportDedup: true, trackAnonymousUser: true, whitelistedEvents: [], @@ -321,7 +322,7 @@ describe('dedup utility tests', () => { }, { headers: { - Authorization: 'Bearer test-rest-api-key', + Authorization: `Bearer ${destination.Config.restApiKey}`, }, timeout: 10000, }, @@ -341,7 +342,7 @@ describe('dedup utility tests', () => { ID: 'some-destination-id', Name: 'Test Destination', Config: { - restApiKey: 'test-rest-api-key', + restApiKey: generateRandomString(), }, }; diff --git a/src/v0/destinations/braze/util.js b/src/v0/destinations/braze/util.js index 74cb7fb9533..87119b91171 100644 --- a/src/v0/destinations/braze/util.js +++ b/src/v0/destinations/braze/util.js @@ -771,7 +771,7 @@ const collectStatsForAliasFailure = (brazeResponse, destinationId) => { if (!isDefinedAndNotNull(brazeResponse)) { return; } - const { aliases_processed: aliasesProcessed, errors } = brazeResponse; + const { aliases_processed: aliasesProcessed } = brazeResponse; if (aliasesProcessed === 0) { stats.increment('braze_alias_failure_count', { destination_id: destinationId }); } diff --git a/src/v0/destinations/clevertap/transform.js b/src/v0/destinations/clevertap/transform.js index e558b119f15..ee190246de5 100644 --- a/src/v0/destinations/clevertap/transform.js +++ b/src/v0/destinations/clevertap/transform.js @@ -404,7 +404,6 @@ const process = (event) => processEvent(event.message, event.destination); const processRouterDest = (inputs, reqMetadata) => { const eventsChunk = []; const errorRespList = []; - // const { destination } = inputs[0]; inputs.forEach((event) => { try { diff --git a/src/v0/destinations/clickup/util.js b/src/v0/destinations/clickup/util.js index 5da4192b5bb..55923b29538 100644 --- a/src/v0/destinations/clickup/util.js +++ b/src/v0/destinations/clickup/util.js @@ -1,4 +1,5 @@ const { NetworkError, InstrumentationError } = require('@rudderstack/integrations-lib'); +const validator = require('validator'); const { httpGET } = require('../../../adapters/network'); const { processAxiosResponse, @@ -9,6 +10,7 @@ const { getHashFromArrayWithValueAsObject, formatTimeStamp, } = require('../../util'); + const { getCustomFieldsEndPoint } = require('./config'); const tags = require('../../util/tags'); const { JSON_MIME_TYPE } = require('../../util/constant'); @@ -44,9 +46,7 @@ const validatePhoneWithCountryCode = (phone) => { * @param {*} email */ const validateEmail = (email) => { - const regex = - /^(([^\s"(),.:;<>@[\\\]]+(\.[^\s"(),.:;<>@[\\\]]+)*)|(".+"))@((\[(?:\d{1,3}\.){3}\d{1,3}])|(([\dA-Za-z-]+\.)+[A-Za-z]{2,}))$/; - if (!regex.test(email)) { + if (!validator.isEmail(email)) { throw new InstrumentationError('The provided email is invalid'); } }; @@ -56,7 +56,7 @@ const validateEmail = (email) => { * @param {*} url */ const validateUrl = (url) => { - const regex = /^(https?:\/\/)[\w.-]+(?:\.[\w.-]+)+[\w!#$&'()*+,/:;=?@[\]~-]+$/; + const regex = /^https?:\/\/[\w.-]+(\.[A-Za-z]{2,})+([#/?]\S*)?$/; if (!regex.test(url)) { throw new InstrumentationError('The provided url is invalid'); } diff --git a/src/v0/destinations/customerio/util.js b/src/v0/destinations/customerio/util.js index cadad5620ce..d5696123b04 100644 --- a/src/v0/destinations/customerio/util.js +++ b/src/v0/destinations/customerio/util.js @@ -1,6 +1,7 @@ const get = require('get-value'); const set = require('set-value'); const truncate = require('truncate-utf8-bytes'); +const validator = require('validator'); const { InstrumentationError, ConfigurationError } = require('@rudderstack/integrations-lib'); const { MAX_BATCH_SIZE, configFieldsToCheck } = require('./config'); const { @@ -10,7 +11,6 @@ const { getFieldValueFromMessage, defaultDeleteRequestConfig, isAppleFamily, - validateEmail, } = require('../../util'); const { EventType, SpecedTraits, TraitsMapping } = require('../../../constants'); @@ -166,26 +166,19 @@ const identifyResponseBuilder = (userId, message) => { const aliasResponseBuilder = (message, userId) => { // ref : https://customer.io/docs/api/#operation/merge - if (!userId && !message.previousId) { - throw new InstrumentationError('Both userId and previousId is mandatory for merge operation'); + if (!userId || !message.previousId) { + throw new InstrumentationError('Both userId and previousId are mandatory for merge operation'); } const endpoint = MERGE_USER_ENDPOINT; const requestConfig = defaultPostRequestConfig; - let cioProperty = 'id'; - if (validateEmail(userId)) { - cioProperty = 'email'; - } - // eslint-disable-next-line @typescript-eslint/naming-convention - let prev_cioProperty = 'id'; - if (validateEmail(message.previousId)) { - prev_cioProperty = 'email'; - } + const cioProperty = validator.isEmail(userId) ? 'email' : 'id'; + const prevCioProperty = validator.isEmail(message.previousId) ? 'email' : 'id'; const rawPayload = { primary: { [cioProperty]: userId, }, secondary: { - [prev_cioProperty]: message.previousId, + [prevCioProperty]: message.previousId, }, }; @@ -208,11 +201,8 @@ const groupResponseBuilder = (message) => { cio_relationships: [], }; const id = payload?.userId || payload?.email; - let cioProperty = 'id'; - if (validateEmail(id)) { - cioProperty = 'email'; - } if (id) { + const cioProperty = validator.isEmail(id) ? 'email' : 'id'; rawPayload.cio_relationships.push({ identifiers: { [cioProperty]: id } }); } const requestConfig = defaultPostRequestConfig; diff --git a/src/v0/destinations/customerio/util.test.js b/src/v0/destinations/customerio/util.test.js index 2c308cd262d..ee36bd3f1be 100644 --- a/src/v0/destinations/customerio/util.test.js +++ b/src/v0/destinations/customerio/util.test.js @@ -8,6 +8,7 @@ const { const getTestMessage = () => { let message = { anonymousId: 'anonId', + previousId: 'user0', traits: { email: 'abc@test.com', name: 'rudder', @@ -133,7 +134,7 @@ describe('Unit test cases for customerio aliasResponseBuilder', () => { it('Device token name does not match with event name as well as allowed list', async () => { let expectedOutput = { endpoint: 'https://track.customer.io/api/v1/merge_customers', - rawPayload: { primary: { id: 'user1' }, secondary: { id: undefined } }, + rawPayload: { primary: { id: 'user1' }, secondary: { id: 'user0' } }, requestConfig: { requestFormat: 'JSON', requestMethod: 'POST' }, }; expect(aliasResponseBuilder(getTestMessage(), 'user1')).toEqual(expectedOutput); diff --git a/src/v0/destinations/customerio_audience/config.ts b/src/v0/destinations/customerio_audience/config.ts new file mode 100644 index 00000000000..c6acbcdb6e4 --- /dev/null +++ b/src/v0/destinations/customerio_audience/config.ts @@ -0,0 +1,5 @@ +export const MAX_ITEMS = 1000; + +export const DEFAULT_ID_TYPE = 'id'; + +export const BASE_ENDPOINT = 'https://track.customer.io/api/v1/segments'; diff --git a/src/v0/destinations/customerio_audience/transform.ts b/src/v0/destinations/customerio_audience/transform.ts new file mode 100644 index 00000000000..4bbef334af5 --- /dev/null +++ b/src/v0/destinations/customerio_audience/transform.ts @@ -0,0 +1,62 @@ +import { + SegmentAction, + CustomerIOConnection, + CustomerIODestination, + CustomerIORouterRequest, + ProcessedEvent, +} from './type'; +import { batchResponseBuilder, createEventChunk } from './utils'; +import { handleRtTfSingleEventError } from '../../util'; + +const processRouterDest = async (inputs: CustomerIORouterRequest[], reqMetadata: any) => { + if (!inputs?.length) return []; + + const { destination, connection } = inputs[0]; + + const customerIODestination = destination as CustomerIODestination; + const customerIOConnection = connection as CustomerIOConnection; + + // Process events and separate valid and error cases + const processedEvents = inputs.map((event) => { + try { + return { + success: true, + data: createEventChunk(event), + }; + } catch (error) { + return { + success: false, + error: handleRtTfSingleEventError(event, error, reqMetadata), + }; + } + }); + + // Separate successful and failed events + const successfulEvents = processedEvents + .filter((result) => result.success) + .map((result) => result.data as ProcessedEvent); + + const errorEvents = processedEvents + .filter((result) => !result.success) + .map((result) => result.error); + + // Split successful events into delete and insert/update lists + const deleteRespList = successfulEvents + .filter((event) => event.eventAction === SegmentAction.DELETE) + .map(({ payload, metadata }) => ({ payload, metadata })); + + const insertOrUpdateRespList = successfulEvents + .filter((event) => event.eventAction !== SegmentAction.DELETE) + .map(({ payload, metadata }) => ({ payload, metadata })); + + const batchSuccessfulRespList = batchResponseBuilder( + insertOrUpdateRespList, + deleteRespList, + customerIODestination, + customerIOConnection, + ); + + return [...batchSuccessfulRespList, ...errorEvents]; +}; + +export { processRouterDest }; diff --git a/src/v0/destinations/customerio_audience/type.ts b/src/v0/destinations/customerio_audience/type.ts new file mode 100644 index 00000000000..ea883b093b9 --- /dev/null +++ b/src/v0/destinations/customerio_audience/type.ts @@ -0,0 +1,125 @@ +import { z } from 'zod'; + +import { + Connection, + Destination, + DestinationConnectionConfig, + MessageTypeSchema, + Metadata, + RouterTransformationRequestData, +} from '../../../types'; + +import { + BatchedRequest, + BatchedRequestBody, + BatchRequestOutput, +} from '../../../types/destinationTransformation'; + +// Basic response type for audience list operations +export type RespList = { + payload: { + ids: (string | number)[]; + }; + metadata: Partial; +}; + +// Types for API request components +export type SegmentationPayload = { + ids: (string | number)[]; +}; + +export type SegmentationParam = { + id_type: string; +}; + +export type SegmentationHeaders = { + 'Content-Type': string; + Authorization: string; +}; + +export const SegmentAction = { + INSERT: 'insert', + UPDATE: 'update', + DELETE: 'delete', +} as const; + +export const CustomerIODestinationConfigSchema = z + .object({ + apiKey: z.string(), + appApiKey: z.string(), + siteId: z.string(), + }) + .passthrough(); + +// CustomerIO specific configuration types +export type CustomerIODestinationConfig = z.infer; + +export const CustomerIOConnectionConfigSchema = z + .object({ + audienceId: z.string().nonempty(), + identifierMappings: z.array(z.object({ from: z.string(), to: z.string() })).nonempty(), + }) + .passthrough(); + +export type CustomerIOConnectionConfig = z.infer; + +const SegmentActionSchema = z.nativeEnum(SegmentAction); + +// Message type specific to CustomerIO +export const CustomerIOMessageSchema = z + .object({ + type: z.literal(MessageTypeSchema.enum.record), + action: SegmentActionSchema, + identifiers: z + .record(z.string(), z.union([z.string(), z.number()])) + .superRefine((identifiers, ctx) => { + if (Object.keys(identifiers).length === 0) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'cannot be empty', + }); + } else if (Object.keys(identifiers).length !== 1) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'only one identifier is supported', + }); + } + }), + }) + .passthrough(); + +export type SegmentActionType = z.infer; + +export type CustomerIOMessage = z.infer; + +// Final exported types using generics from base types +export type CustomerIODestination = Destination; +export type CustomerIOConnection = Connection< + DestinationConnectionConfig +>; + +export type CustomerIORouterRequest = RouterTransformationRequestData< + CustomerIOMessage, + CustomerIODestination, + CustomerIOConnection +>; + +// Remove the duplicate types and use the generic ones instead +export type CustomerIOBatchResponse = BatchRequestOutput< + SegmentationPayload, + SegmentationHeaders, + SegmentationParam, + CustomerIODestination +>; + +export type CustomerIOBatchedRequest = BatchedRequest< + SegmentationPayload, + SegmentationHeaders, + SegmentationParam +>; + +export type CustomerIOBatchedRequestBody = BatchedRequestBody; + +export type ProcessedEvent = RespList & { + eventAction: SegmentActionType; +}; diff --git a/src/v0/destinations/customerio_audience/utils.test.ts b/src/v0/destinations/customerio_audience/utils.test.ts new file mode 100644 index 00000000000..b8803d41053 --- /dev/null +++ b/src/v0/destinations/customerio_audience/utils.test.ts @@ -0,0 +1,140 @@ +import { batchResponseBuilder, createEventChunk } from './utils'; +import { InstrumentationError, ConfigurationError } from '@rudderstack/integrations-lib'; +describe('utils', () => { + describe('batchResponseBuilder', () => { + const mockDestination = { + Config: { + siteId: 'test-site', + apiKey: 'test-key', + }, + }; + + const mockConnection = { + config: { + destination: { + identifierMappings: [{ to: 'email' }], + audienceId: '123', + }, + }, + }; + + const testCases = [ + { + name: 'should build batch responses for insert and delete', + input: { + insertOrUpdateRespList: [{ payload: { ids: ['user1'] }, metadata: { sourceId: '1' } }], + deleteRespList: [{ payload: { ids: ['user2'] }, metadata: { sourceId: '2' } }], + }, + expected: { + length: 2, + firstEndpoint: 'https://track.customer.io/api/v1/segments/123/add_customers', + secondEndpoint: 'https://track.customer.io/api/v1/segments/123/remove_customers', + }, + }, + { + name: 'should handle empty lists', + input: { + insertOrUpdateRespList: [], + deleteRespList: [], + }, + expected: { + length: 0, + }, + }, + ]; + + testCases.forEach(({ name, input, expected }) => { + test(name, () => { + const result = batchResponseBuilder( + input.insertOrUpdateRespList, + input.deleteRespList, + mockDestination as any, + mockConnection as any, + ); + + expect(result).toHaveLength(expected.length); + if (expected.length > 0) { + expect(result[0].batchedRequest.endpoint).toBe(expected.firstEndpoint); + expect(result[1].batchedRequest.endpoint).toBe(expected.secondEndpoint); + } + }); + + describe('createEventChunk', () => { + const testCases = [ + { + name: 'should create valid event chunk', + input: { + message: { + type: 'record', + action: 'insert', + identifiers: { email: 'test@test.com' }, + }, + connection: { + config: { + destination: { + identifierMappings: [{ to: 'email', from: 'email' }], + audienceId: '123', + }, + }, + }, + metadata: { sourceId: '1' }, + }, + expected: { + payload: { ids: ['test@test.com'] }, + eventAction: 'insert', + metadata: { sourceId: '1' }, + }, + }, + { + name: 'should throw InstrumentationError for invalid message', + input: { + message: { + action: null, + identifiers: {}, + }, + connection: { + config: { + destination: { + identifierMappings: [{ to: 'email', from: 'email' }], + audienceId: '123', + }, + }, + }, + }, + throws: InstrumentationError, + }, + { + name: 'should throw ConfigurationError for invalid connection config', + input: { + message: { + type: 'record', + action: 'insert', + identifiers: { email: 'test@test.com' }, + }, + connection: { + config: { + destination: { + identifierMappings: [], + audienceId: null, + }, + }, + }, + }, + throws: ConfigurationError, + }, + ]; + + testCases.forEach(({ name, input, expected, throws }) => { + test(name, () => { + if (throws) { + expect(() => createEventChunk(input as any)).toThrow(throws); + } else { + const result = createEventChunk(input as any); + expect(result).toEqual(expected); + } + }); + }); + }); + }); + }); +}); diff --git a/src/v0/destinations/customerio_audience/utils.ts b/src/v0/destinations/customerio_audience/utils.ts new file mode 100644 index 00000000000..ed80f6816a2 --- /dev/null +++ b/src/v0/destinations/customerio_audience/utils.ts @@ -0,0 +1,160 @@ +import { + base64Convertor, + ConfigurationError, + formatZodError, + InstrumentationError, +} from '@rudderstack/integrations-lib'; +import { BatchUtils } from '@rudderstack/workflow-engine'; +import { BASE_ENDPOINT, DEFAULT_ID_TYPE, MAX_ITEMS } from './config'; +import { + CustomerIOConnection, + CustomerIODestination, + CustomerIORouterRequest, + RespList, + SegmentationHeaders, + SegmentationParam, + SegmentationPayload, + CustomerIOBatchResponse, + SegmentActionType, + CustomerIOConnectionConfigSchema, + CustomerIOMessageSchema, + ProcessedEvent, +} from './type'; +import { Metadata } from '../../../types'; + +const getIdType = (connection: CustomerIOConnection): string => + connection.config.destination.identifierMappings[0]?.to || DEFAULT_ID_TYPE; + +const getSegmentId = (connection: CustomerIOConnection): string | number => + connection.config.destination.audienceId; + +const getHeaders = (destination: CustomerIODestination): SegmentationHeaders => ({ + 'Content-Type': 'application/json', + Authorization: `Basic ${base64Convertor(`${destination.Config.siteId}:${destination.Config.apiKey}`)}`, +}); + +const getParams = (connection: CustomerIOConnection): SegmentationParam => ({ + id_type: getIdType(connection), +}); + +const getMergedPayload = (batch: RespList[]): SegmentationPayload => ({ + ids: batch.flatMap((input) => input.payload.ids), +}); + +const getMergedMetadata = (batch: RespList[]): Partial[] => + batch.map((input) => input.metadata); + +const buildBatchedResponse = ( + payload: SegmentationPayload, + endpoint: string, + headers: SegmentationHeaders, + params: SegmentationParam, + metadata: Partial[], + destination: CustomerIODestination, +): CustomerIOBatchResponse => ({ + batchedRequest: { + body: { + JSON: payload, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + version: '1', + type: 'REST', + method: 'POST', + endpoint, + headers, + params, + files: {}, + }, + metadata, + batched: true, + statusCode: 200, + destination, +}); + +const processBatch = ( + respList: RespList[], + endpoint: string, + destination: CustomerIODestination, + connection: CustomerIOConnection, +): CustomerIOBatchResponse[] => { + if (!respList?.length) { + return []; + } + + const headers = getHeaders(destination); + const params = getParams(connection); + const batches = BatchUtils.chunkArrayBySizeAndLength(respList, { maxItems: MAX_ITEMS }); + + return batches.items.map((batch) => { + const mergedPayload = getMergedPayload(batch); + const mergedMetadata = getMergedMetadata(batch); + return buildBatchedResponse( + mergedPayload, + endpoint, + headers, + params, + mergedMetadata, + destination, + ); + }); +}; + +export const batchResponseBuilder = ( + insertOrUpdateRespList: RespList[], + deleteRespList: RespList[], + destination: CustomerIODestination, + connection: CustomerIOConnection, +): CustomerIOBatchResponse[] => { + const segmentId = getSegmentId(connection); + + const insertResponses = processBatch( + insertOrUpdateRespList, + `${BASE_ENDPOINT}/${segmentId}/add_customers`, + destination, + connection, + ); + + const deleteResponses = processBatch( + deleteRespList, + `${BASE_ENDPOINT}/${segmentId}/remove_customers`, + destination, + connection, + ); + + return [...insertResponses, ...deleteResponses]; +}; + +const getEventAction = (event: CustomerIORouterRequest): string => event.message.action; + +const validateEvent = (event: CustomerIORouterRequest): boolean => { + const { message, connection } = event; + + const connectionValidation = CustomerIOConnectionConfigSchema.safeParse( + connection?.config.destination, + ); + + if (!connectionValidation.success) { + throw new ConfigurationError(formatZodError(connectionValidation.error)); + } + const messageValidation = CustomerIOMessageSchema.safeParse(message); + + if (!messageValidation.success) { + throw new InstrumentationError(formatZodError(messageValidation.error)); + } + + return true; +}; + +export const createEventChunk = (event: CustomerIORouterRequest): ProcessedEvent => { + validateEvent(event); + const eventAction = getEventAction(event); + const id = Object.values(event.message.identifiers)[0]; + + return { + payload: { ids: [id] }, + metadata: event.metadata, + eventAction: eventAction as SegmentActionType, + }; +}; diff --git a/src/v0/destinations/facebook_conversions/config.js b/src/v0/destinations/facebook_conversions/config.js index 2bbe9ab0170..d88e9d698c3 100644 --- a/src/v0/destinations/facebook_conversions/config.js +++ b/src/v0/destinations/facebook_conversions/config.js @@ -1,7 +1,7 @@ const { getMappingConfig } = require('../../util'); const ENDPOINT = (datasetId, accessToken) => - `https://graph.facebook.com/v20.0/${datasetId}/events?access_token=${accessToken}`; + `https://graph.facebook.com/v22.0/${datasetId}/events?access_token=${accessToken}`; const CONFIG_CATEGORIES = { USERDATA: { diff --git a/src/v0/destinations/facebook_pixel/config.js b/src/v0/destinations/facebook_pixel/config.js index f2598921652..b8411af1e00 100644 --- a/src/v0/destinations/facebook_pixel/config.js +++ b/src/v0/destinations/facebook_pixel/config.js @@ -1,6 +1,6 @@ const { getMappingConfig } = require('../../util'); -const VERSION = 'v20.0'; +const VERSION = 'v22.0'; const CONFIG_CATEGORIES = { USERDATA: { diff --git a/src/v0/destinations/fb/config.js b/src/v0/destinations/fb/config.js index d84fa7d6727..80d0749bb1d 100644 --- a/src/v0/destinations/fb/config.js +++ b/src/v0/destinations/fb/config.js @@ -1,7 +1,7 @@ const fs = require('fs'); const path = require('path'); -const VERSION = 'v20.0'; +const VERSION = 'v22.0'; const getPath = (file) => path.resolve(__dirname, file); diff --git a/src/v0/destinations/fb_custom_audience/config.js b/src/v0/destinations/fb_custom_audience/config.js index 5a3f0742e12..dfce02acd72 100644 --- a/src/v0/destinations/fb_custom_audience/config.js +++ b/src/v0/destinations/fb_custom_audience/config.js @@ -1,4 +1,4 @@ -const BASE_URL = 'https://graph.facebook.com/v20.0'; +const BASE_URL = 'https://graph.facebook.com/v22.0'; function getEndPoint(audienceId) { return `${BASE_URL}/${audienceId}/users`; diff --git a/src/v0/destinations/fb_custom_audience/recordTransform.js b/src/v0/destinations/fb_custom_audience/recordTransform.js index db1fbeec595..719a53619e3 100644 --- a/src/v0/destinations/fb_custom_audience/recordTransform.js +++ b/src/v0/destinations/fb_custom_audience/recordTransform.js @@ -23,54 +23,68 @@ const { generateAppSecretProof, } = require('./util'); -const processRecordEventArray = ( - recordChunksArray, - userSchema, - isHashRequired, - disableFormat, - paramsPayload, - prepareParams, - destination, - operation, - audienceId, -) => { +/** + * Processes a single record and updates the data element. + * @param {Object} record - The record to process. + * @param {Array} userSchema - The schema defining user properties. + * @param {boolean} isHashRequired - Whether hashing is required. + * @param {boolean} disableFormat - Whether formatting is disabled. + * @returns {Object} - The processed data element and metadata. + */ +const processRecord = (record, userSchema, isHashRequired, disableFormat) => { + const { fields } = record.message; + let dataElement = []; + let nullUserData = true; + + userSchema.forEach((eachProperty) => { + const userProperty = fields[eachProperty]; + let updatedProperty = userProperty; + + if (isHashRequired && !disableFormat) { + updatedProperty = ensureApplicableFormat(eachProperty, userProperty); + } + + dataElement = getUpdatedDataElement(dataElement, isHashRequired, eachProperty, updatedProperty); + + if (dataElement[dataElement.length - 1]) { + nullUserData = false; + } + }); + + if (nullUserData) { + stats.increment('fb_custom_audience_event_having_all_null_field_values_for_a_user', { + destinationId: record.destination.ID, + nullFields: userSchema, + }); + } + + return { dataElement, metadata: record.metadata }; +}; + +/** + * Processes an array of record chunks and prepares the payload for sending. + * @param {Array} recordChunksArray - The array of record chunks. + * @param {Object} config - Configuration object containing userSchema, isHashRequired, disableFormat, etc. + * @param {Object} destination - The destination configuration. + * @param {string} operation - The operation to perform (e.g., 'add', 'remove'). + * @param {string} audienceId - The audience ID. + * @returns {Array} - The response events to send. + */ +const processRecordEventArray = (recordChunksArray, config, destination, operation, audienceId) => { + const { userSchema, isHashRequired, disableFormat, paramsPayload, prepareParams } = config; const toSendEvents = []; const metadata = []; + recordChunksArray.forEach((recordArray) => { - const data = []; - recordArray.forEach((input) => { - const { fields } = input.message; - let dataElement = []; - let nullUserData = true; - - userSchema.forEach((eachProperty) => { - const userProperty = fields[eachProperty]; - let updatedProperty = userProperty; - - if (isHashRequired && !disableFormat) { - updatedProperty = ensureApplicableFormat(eachProperty, userProperty); - } - - dataElement = getUpdatedDataElement( - dataElement, - isHashRequired, - eachProperty, - updatedProperty, - ); - - if (dataElement[dataElement.length - 1]) { - nullUserData = false; - } - }); - - if (nullUserData) { - stats.increment('fb_custom_audience_event_having_all_null_field_values_for_a_user', { - destinationId: destination.ID, - nullFields: userSchema, - }); - } - data.push(dataElement); - metadata.push(input.metadata); + const data = recordArray.map((input) => { + const { dataElement, metadata: recordMetadata } = processRecord( + input, + userSchema, + isHashRequired, + disableFormat, + ); + metadata.push(recordMetadata); + return dataElement; }); const prepareFinalPayload = lodash.cloneDeep(paramsPayload); @@ -90,16 +104,19 @@ const processRecordEventArray = ( }; const builtResponse = responseBuilderSimple(wrappedResponse, audienceId); - toSendEvents.push(builtResponse); }); }); - const response = getSuccessRespEvents(toSendEvents, metadata, destination, true); - - return response; + return getSuccessRespEvents(toSendEvents, metadata, destination, true); }; +/** + * Prepares the payload for the given events and configuration. + * @param {Array} events - The events to process. + * @param {Object} config - The configuration object. + * @returns {Array} - The final response payload. + */ function preparePayload(events, config) { const { audienceId, userSchema, isRaw, type, subType, isHashRequired, disableFormat } = config; const { destination } = events[0]; @@ -138,64 +155,32 @@ function preparePayload(events, config) { record.message.action?.toLowerCase(), ); - let insertResponse; - let deleteResponse; - let updateResponse; - - if (groupedRecordsByAction.delete) { - const deleteRecordChunksArray = returnArrayOfSubarrays( - groupedRecordsByAction.delete, - MAX_USER_COUNT, - ); - deleteResponse = processRecordEventArray( - deleteRecordChunksArray, - cleanUserSchema, - isHashRequired, - disableFormat, - paramsPayload, - prepareParams, - destination, - 'remove', - audienceId, - ); - } - - if (groupedRecordsByAction.insert) { - const insertRecordChunksArray = returnArrayOfSubarrays( - groupedRecordsByAction.insert, - MAX_USER_COUNT, - ); - - insertResponse = processRecordEventArray( - insertRecordChunksArray, - cleanUserSchema, - isHashRequired, - disableFormat, - paramsPayload, - prepareParams, - destination, - 'add', - audienceId, - ); - } + const processAction = (action, operation) => { + if (groupedRecordsByAction[action]) { + const recordChunksArray = returnArrayOfSubarrays( + groupedRecordsByAction[action], + MAX_USER_COUNT, + ); + return processRecordEventArray( + recordChunksArray, + { + userSchema: cleanUserSchema, + isHashRequired, + disableFormat, + paramsPayload, + prepareParams, + }, + destination, + operation, + audienceId, + ); + } + return null; + }; - if (groupedRecordsByAction.update) { - const updateRecordChunksArray = returnArrayOfSubarrays( - groupedRecordsByAction.update, - MAX_USER_COUNT, - ); - updateResponse = processRecordEventArray( - updateRecordChunksArray, - cleanUserSchema, - isHashRequired, - disableFormat, - paramsPayload, - prepareParams, - destination, - 'add', - audienceId, - ); - } + const deleteResponse = processAction('delete', 'remove'); + const insertResponse = processAction('insert', 'add'); + const updateResponse = processAction('update', 'add'); const errorResponse = getErrorResponse(groupedRecordsByAction); @@ -203,7 +188,6 @@ function preparePayload(events, config) { deleteResponse, insertResponse, updateResponse, - errorResponse, ); if (finalResponse.length === 0) { @@ -214,6 +198,11 @@ function preparePayload(events, config) { return finalResponse; } +/** + * Processes record inputs for V1 flow. + * @param {Array} groupedRecordInputs - The grouped record inputs. + * @returns {Array} - The processed payload. + */ function processRecordInputsV1(groupedRecordInputs) { const { destination } = groupedRecordInputs[0]; const { message } = groupedRecordInputs[0]; @@ -239,11 +228,15 @@ function processRecordInputsV1(groupedRecordInputs) { }); } +/** + * Processes record inputs for V2 flow. + * @param {Array} groupedRecordInputs - The grouped record inputs. + * @returns {Array} - The processed payload. + */ const processRecordInputsV2 = (groupedRecordInputs) => { const { connection, message } = groupedRecordInputs[0]; const { isHashRequired, disableFormat, type, subType, isRaw, audienceId } = connection.config.destination; - // Ref: https://www.notion.so/rudderstacks/VDM-V2-Final-Config-and-Record-EventPayload-8cc80f3d88ad46c7bc43df4b87a0bbff const identifiers = message?.identifiers; let userSchema; if (identifiers) { @@ -267,6 +260,11 @@ const processRecordInputsV2 = (groupedRecordInputs) => { }); }; +/** + * Processes record inputs based on the flow type. + * @param {Array} groupedRecordInputs - The grouped record inputs. + * @returns {Array} - The processed payload. + */ function processRecordInputs(groupedRecordInputs) { const event = groupedRecordInputs[0]; // First check for rETL flow and second check for ES flow diff --git a/src/v0/destinations/fb_custom_audience/util.test.js b/src/v0/destinations/fb_custom_audience/util.test.js index 5c8eb15b71a..6e966887ad8 100644 --- a/src/v0/destinations/fb_custom_audience/util.test.js +++ b/src/v0/destinations/fb_custom_audience/util.test.js @@ -18,7 +18,7 @@ const basePayload = { const baseResponse = { version: '1', type: 'REST', - endpoint: 'https://graph.facebook.com/v20.0/23848494844100489/users', + endpoint: 'https://graph.facebook.com/v22.0/23848494844100489/users', headers: {}, params: { access_token: 'ABC', diff --git a/src/v0/destinations/ga4_v2/customMappingsHandler.js b/src/v0/destinations/ga4_v2/customMappingsHandler.js index b5818d6fff1..2bdfd375e25 100644 --- a/src/v0/destinations/ga4_v2/customMappingsHandler.js +++ b/src/v0/destinations/ga4_v2/customMappingsHandler.js @@ -23,7 +23,6 @@ const { isEmptyObject, removeUndefinedAndNullValues, isHybridModeEnabled, - getIntegrationsObj, applyCustomMappings, } = require('../../util'); const { trackCommonConfig, ConfigCategory, mappingConfig } = require('../ga4/config'); @@ -145,7 +144,6 @@ const handleCustomMappings = (message, Config) => { const boilerplateOperations = (ga4Payload, message, Config, eventName) => { removeReservedParameterPrefixNames(ga4Payload.events[0].params); ga4Payload.events[0].name = eventName; - const integrationsObj = getIntegrationsObj(message, 'ga4_v2'); if (ga4Payload.events[0].params) { ga4Payload.events[0].params = removeInvalidParams( diff --git a/src/v0/destinations/ga4_v2/transform.test.ts b/src/v0/destinations/ga4_v2/transform.test.ts new file mode 100644 index 00000000000..02babb75199 --- /dev/null +++ b/src/v0/destinations/ga4_v2/transform.test.ts @@ -0,0 +1,133 @@ +import { process } from './transform'; +import { ProcessorTransformationRequest } from '../../../types'; +import { handleCustomMappings } from './customMappingsHandler'; +import { processEvents as ga4Process } from '../ga4/transform'; + +// Mock dependencies +jest.mock('./customMappingsHandler'); +jest.mock('../ga4/transform'); +jest.mock('../ga4/utils'); + +describe('process', () => { + const mockHandleCustomMappings = handleCustomMappings as jest.Mock; + const mockGa4Process = ga4Process as jest.Mock; + + beforeEach(() => { + jest.restoreAllMocks(); + + jest.clearAllMocks(); + }); + + const testCases = [ + { + name: 'should process track events with custom mappings', + input: { + message: { + type: 'track', + event: 'test_event', + }, + destination: { + Config: { + configData: JSON.stringify({ + PROPERTY: 'test-property', + DATA_STREAM: { type: 'gtag', value: 'G-123456' }, + MEASUREMENT_PROTOCOL_SECRET: 'secret', + }), + }, + }, + } as unknown as ProcessorTransformationRequest, + expectedConfig: { + propertyId: 'test-property', + typesOfClient: 'gtag', + measurementId: 'G-123456', + apiSecret: 'secret', + configData: expect.any(String), + }, + shouldCallCustomMappings: true, + shouldCallGa4Process: false, + }, + { + name: 'should process non-track events with ga4Process', + input: { + message: { + type: 'identify', + }, + destination: { + Config: { + configData: JSON.stringify({ + PROPERTY: 'test-property', + DATA_STREAM: { type: 'firebase', value: 'app-id' }, + MEASUREMENT_PROTOCOL_SECRET: 'secret', + }), + }, + }, + } as unknown as ProcessorTransformationRequest, + expectedConfig: { + propertyId: 'test-property', + typesOfClient: 'firebase', + firebaseAppId: 'app-id', + apiSecret: 'secret', + configData: expect.any(String), + }, + shouldCallCustomMappings: false, + shouldCallGa4Process: true, + }, + ]; + + test.each(testCases)( + '$name', + ({ input, expectedConfig, shouldCallCustomMappings, shouldCallGa4Process }) => { + process(input); + + if (shouldCallCustomMappings) { + expect(mockHandleCustomMappings).toHaveBeenCalledWith( + input.message, + expect.objectContaining(expectedConfig), + ); + } else { + expect(mockHandleCustomMappings).not.toHaveBeenCalled(); + } + + if (shouldCallGa4Process) { + expect(mockGa4Process).toHaveBeenCalledWith({ event: input, destType: 'ga4_v2' }); + } else { + expect(mockGa4Process).not.toHaveBeenCalled(); + } + }, + ); + + const errorTestCases = [ + { + name: 'should throw error when message type is missing', + input: { + message: {}, + destination: { + Config: { + configData: JSON.stringify({ + PROPERTY: 'test-property', + DATA_STREAM: { type: 'gtag', value: 'G-123456' }, + MEASUREMENT_PROTOCOL_SECRET: 'secret', + }), + }, + }, + } as unknown as ProcessorTransformationRequest, + expectedError: 'Message Type is not present. Aborting message.', + }, + { + name: 'should throw error when configData is not a string', + input: { + message: { type: 'track' }, + destination: { + Config: { + configData: { invalid: 'object' }, + }, + }, + } as unknown as ProcessorTransformationRequest, + expectedError: 'Config data is not a string', + }, + ]; + + test.each(errorTestCases)('$name', ({ input, expectedError }) => { + expect(() => process(input)).toThrow(expectedError); + }); +}); diff --git a/src/v0/destinations/ga4_v2/transform.ts b/src/v0/destinations/ga4_v2/transform.ts index 06d4bd90236..ee2516c5ba3 100644 --- a/src/v0/destinations/ga4_v2/transform.ts +++ b/src/v0/destinations/ga4_v2/transform.ts @@ -1,9 +1,5 @@ -import { - InstrumentationError, - isDefinedAndNotNull, - RudderStackEvent, -} from '@rudderstack/integrations-lib'; -import { ProcessorTransformationRequest } from '../../../types'; +import { InstrumentationError, isDefinedAndNotNull } from '@rudderstack/integrations-lib'; +import { ProcessorTransformationRequest, RudderMessage } from '../../../types'; import { handleCustomMappings } from './customMappingsHandler'; import { processEvents as ga4Process } from '../ga4/transform'; import { basicConfigvalidaiton } from '../ga4/utils'; @@ -12,6 +8,9 @@ export function process(event: ProcessorTransformationRequest) { const { message, destination } = event; const { Config } = destination; if (isDefinedAndNotNull(Config.configData)) { + if (typeof Config.configData !== 'string') { + throw new InstrumentationError('Config data is not a string'); + } const configDetails = JSON.parse(Config.configData); Config.propertyId = configDetails.PROPERTY; Config.typesOfClient = configDetails.DATA_STREAM.type; @@ -23,7 +22,7 @@ export function process(event: ProcessorTransformationRequest) { Config.apiSecret = configDetails.MEASUREMENT_PROTOCOL_SECRET; } - const eventPayload = message as RudderStackEvent; + const eventPayload = message as RudderMessage; if (!eventPayload.type) { throw new InstrumentationError('Message Type is not present. Aborting message.'); diff --git a/src/v0/destinations/google_adwords_enhanced_conversions/config.js b/src/v0/destinations/google_adwords_enhanced_conversions/config.js index 8a3f8ab673d..8afc126749e 100644 --- a/src/v0/destinations/google_adwords_enhanced_conversions/config.js +++ b/src/v0/destinations/google_adwords_enhanced_conversions/config.js @@ -1,8 +1,8 @@ const { getMappingConfig } = require('../../util'); -const API_VERSION = 'v17'; +const API_VERSION = 'v18'; -const BASE_ENDPOINT = 'https://googleads.googleapis.com/v17/customers'; +const BASE_ENDPOINT = `https://googleads.googleapis.com/${API_VERSION}/customers`; const CONFIG_CATEGORIES = { TRACK_CONFIG: { type: 'track', name: 'trackConfig' }, diff --git a/src/v0/destinations/google_adwords_offline_conversions/config.js b/src/v0/destinations/google_adwords_offline_conversions/config.js index 6eec1068a6b..62b56109010 100644 --- a/src/v0/destinations/google_adwords_offline_conversions/config.js +++ b/src/v0/destinations/google_adwords_offline_conversions/config.js @@ -1,6 +1,6 @@ const { getMappingConfig } = require('../../util'); -const API_VERSION = 'v16'; +const API_VERSION = 'v18'; const BASE_ENDPOINT = `https://googleads.googleapis.com/${API_VERSION}/customers/:customerId`; @@ -65,4 +65,5 @@ module.exports = { trackAddStoreAddressConversionsMapping: MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK_STORE_ADDRESS_IDENTIFIER.name], consentConfigMap, + API_VERSION, }; diff --git a/src/v0/destinations/google_adwords_offline_conversions/data/TrackAddStoreConversionsConfig.json b/src/v0/destinations/google_adwords_offline_conversions/data/TrackAddStoreConversionsConfig.json index 9c88e59ddb3..9bfd0bc179f 100644 --- a/src/v0/destinations/google_adwords_offline_conversions/data/TrackAddStoreConversionsConfig.json +++ b/src/v0/destinations/google_adwords_offline_conversions/data/TrackAddStoreConversionsConfig.json @@ -17,7 +17,8 @@ ], "required": true, "metadata": { - "type": "toNumber" + "type": "toNumber", + "regex": "^([1-9]\\d*(\\.\\d+)?|0\\.\\d+)$" } }, { diff --git a/src/v0/destinations/google_adwords_offline_conversions/helper.test.js b/src/v0/destinations/google_adwords_offline_conversions/helper.test.js index 2ac5c6cfa04..a94097245d9 100644 --- a/src/v0/destinations/google_adwords_offline_conversions/helper.test.js +++ b/src/v0/destinations/google_adwords_offline_conversions/helper.test.js @@ -2,6 +2,14 @@ const moment = require('moment-timezone'); const { formatTimestamp } = require('./helper'); describe('google adwords offline conversions - helper', () => { + beforeAll(() => { + jest.spyOn(console, 'warn').mockImplementation(() => {}); + }); + + afterAll(() => { + console.warn.mockRestore(); + }); + it('should correctly format to IST', () => { moment.tz.setDefault('Asia/Calcutta'); expect(formatTimestamp('2019-10-14 11:15:18.299Z')).toEqual('2019-10-14 16:45:18+05:30'); diff --git a/src/v0/destinations/google_adwords_offline_conversions/transform.js b/src/v0/destinations/google_adwords_offline_conversions/transform.js index 2648f03e8a3..bef7af00017 100644 --- a/src/v0/destinations/google_adwords_offline_conversions/transform.js +++ b/src/v0/destinations/google_adwords_offline_conversions/transform.js @@ -18,7 +18,6 @@ const { getClickConversionPayloadAndEndpoint, getConsentsDataFromIntegrationObj, getCallConversionPayload, - updateConversion, } = require('./utils'); const helper = require('./helper'); @@ -49,17 +48,19 @@ const getConversions = (message, metadata, { Config }, event, conversionType) => filteredCustomerId, eventLevelConsentsData, ); - convertedPayload.payload.conversions[0] = updateConversion( - convertedPayload.payload.conversions[0], - ); payload = convertedPayload.payload; endpoint = convertedPayload.endpoint; } else if (conversionType === 'store') { - payload = getStoreConversionPayload(message, Config, filteredCustomerId); + payload = getStoreConversionPayload( + message, + Config, + filteredCustomerId, + eventLevelConsentsData, + ); endpoint = STORE_CONVERSION_CONFIG.replace(':customerId', filteredCustomerId); } else { // call conversions - payload = getCallConversionPayload(message, Config, eventLevelConsentsData); + payload = getCallConversionPayload(message, eventLevelConsentsData); endpoint = CALL_CONVERSION.replace(':customerId', filteredCustomerId); } diff --git a/src/v0/destinations/google_adwords_offline_conversions/utils.js b/src/v0/destinations/google_adwords_offline_conversions/utils.js index 2d47095eea7..24a2e471c60 100644 --- a/src/v0/destinations/google_adwords_offline_conversions/utils.js +++ b/src/v0/destinations/google_adwords_offline_conversions/utils.js @@ -227,14 +227,10 @@ function getExisitingUserIdentifier(userIdentifierInfo, defaultUserIdentifier) { return result; } -const getCallConversionPayload = (message, Config, eventLevelConsentsData) => { +const getCallConversionPayload = (message, eventLevelConsentsData) => { const payload = constructPayload(message, trackCallConversionsMapping); // here conversions[0] should be present because there are some mandatory properties mapped in the mapping json. - payload.conversions[0].consent = finaliseConsent( - consentConfigMap, - eventLevelConsentsData, - Config, - ); + payload.conversions[0].consent = finaliseConsent(consentConfigMap, eventLevelConsentsData); return payload; }; @@ -242,7 +238,7 @@ const getCallConversionPayload = (message, Config, eventLevelConsentsData) => { * This Function create the add conversion payload * and returns the payload */ -const getAddConversionPayload = (message, Config) => { +const getAddConversionPayload = (message, Config, eventLevelConsentsData) => { const { properties } = message; const { validateOnly, hashUserIdentifier, defaultUserIdentifier } = Config; const payload = constructPayload(message, trackAddStoreConversionsMapping); @@ -299,19 +295,19 @@ const getAddConversionPayload = (message, Config) => { } } // add consent support for store conversions. Note: No event level consent supported. - const consentObject = finaliseConsent(consentConfigMap, {}, Config); + const consentObject = finaliseConsent(consentConfigMap, eventLevelConsentsData); // create property should be present because there are some mandatory properties mapped in the mapping json. set(payload, 'operations.create.consent', consentObject); return payload; }; -const getStoreConversionPayload = (message, Config, event) => { +const getStoreConversionPayload = (message, Config, event, eventLevelConsentsData) => { const { validateOnly } = Config; const payload = { event, isStoreConversion: true, createJobPayload: getCreateJobPayload(message), - addConversionPayload: getAddConversionPayload(message, Config), + addConversionPayload: getAddConversionPayload(message, Config, eventLevelConsentsData), executeJobPayload: { validate_only: validateOnly }, }; return payload; @@ -346,6 +342,24 @@ const populateUserIdentifier = ({ email, phone, properties, payload, UserIdentif } return copiedPayload; }; + +/** + * remove redundant ids + * @param {*} conversionCopy + */ +const updateConversion = (conversion) => { + const conversionCopy = cloneDeep(conversion); + if (conversionCopy.gclid) { + delete conversionCopy.wbraid; + delete conversionCopy.gbraid; + } else if (conversionCopy.wbraid && conversionCopy.gbraid) { + throw new InstrumentationError(`You can't use both wbraid and gbraid.`); + } else if (conversionCopy.wbraid || conversionCopy.gbraid) { + delete conversionCopy.userIdentifiers; + } + return conversionCopy; +}; + const getClickConversionPayloadAndEndpoint = ( message, Config, @@ -420,9 +434,10 @@ const getClickConversionPayloadAndEndpoint = ( } // add consent support for click conversions - const consentObject = finaliseConsent(consentConfigMap, eventLevelConsent, Config); + const consentObject = finaliseConsent(consentConfigMap, eventLevelConsent); // here conversions[0] is expected to be present there are some mandatory properties mapped in the mapping json. set(payload, 'conversions[0].consent', consentObject); + payload.conversions[0] = updateConversion(payload.conversions[0]); return { payload, endpoint }; }; @@ -431,25 +446,6 @@ const getConsentsDataFromIntegrationObj = (message) => { return integrationObj?.consents || {}; }; -/** - * remove redundant ids - * @param {*} conversionCopy - */ -const updateConversion = (conversion) => { - const conversionCopy = cloneDeep(conversion); - if (conversionCopy.gclid) { - delete conversionCopy.wbraid; - delete conversionCopy.gbraid; - } - if (conversionCopy.wbraid && conversionCopy.gbraid) { - throw new InstrumentationError(`You can't use both wbraid and gbraid.`); - } - if (conversionCopy.wbraid || conversionCopy.gbraid) { - delete conversionCopy.userIdentifiers; - } - return conversionCopy; -}; - module.exports = { validateDestinationConfig, generateItemListFromProducts, diff --git a/src/v0/destinations/google_adwords_offline_conversions/utils.test.js b/src/v0/destinations/google_adwords_offline_conversions/utils.test.js index b6c66537829..bdcbc881310 100644 --- a/src/v0/destinations/google_adwords_offline_conversions/utils.test.js +++ b/src/v0/destinations/google_adwords_offline_conversions/utils.test.js @@ -6,6 +6,8 @@ const { getCallConversionPayload, } = require('./utils'); +const API_VERSION = 'v18'; + const getTestMessage = () => { let message = { event: 'testEventName', @@ -163,7 +165,7 @@ describe('getExisitingUserIdentifier util tests', () => { describe('getClickConversionPayloadAndEndpoint util tests', () => { it('getClickConversionPayloadAndEndpoint flow check when default field identifier is present', () => { let expectedOutput = { - endpoint: 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, payload: { conversions: [ { @@ -193,7 +195,7 @@ describe('getClickConversionPayloadAndEndpoint util tests', () => { delete fittingPayload.traits.email; delete fittingPayload.properties.email; let expectedOutput = { - endpoint: 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, payload: { conversions: [ { @@ -225,7 +227,7 @@ describe('getClickConversionPayloadAndEndpoint util tests', () => { delete fittingPayload.traits.phone; delete fittingPayload.properties.email; let expectedOutput = { - endpoint: 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, payload: { conversions: [ { @@ -263,7 +265,7 @@ describe('getClickConversionPayloadAndEndpoint util tests', () => { }, ]; let expectedOutput = { - endpoint: 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, payload: { conversions: [ { @@ -317,7 +319,7 @@ describe('getConsentsDataFromIntegrationObj', () => { }); describe('getCallConversionPayload', () => { - it('should call conversion payload with consent object', () => { + it('should call conversion payload with consent object and set default consent for adUserData', () => { const message = { properties: { callerId: '1234', @@ -325,17 +327,9 @@ describe('getCallConversionPayload', () => { conversionDateTime: '2022-01-01 12:32:45-08:00', }, }; - const result = getCallConversionPayload( - message, - { - userDataConsent: 'GRANTED', - personalizationConsent: 'DENIED', - }, - { - adUserData: 'GRANTED', - adPersonalization: 'GRANTED', - }, - ); + const result = getCallConversionPayload(message, { + adPersonalization: 'GRANTED', + }); expect(result).toEqual({ conversions: [ { @@ -343,7 +337,7 @@ describe('getCallConversionPayload', () => { callerId: '1234', consent: { adPersonalization: 'GRANTED', - adUserData: 'GRANTED', + adUserData: 'UNSPECIFIED', }, conversionDateTime: '2022-01-01 12:32:45-08:00', }, @@ -358,14 +352,10 @@ describe('getCallConversionPayload', () => { conversionDateTime: '2022-01-01 12:32:45-08:00', }, }; - const result = getCallConversionPayload( - message, - { - userDataConsent: 'GRANTED', - personalizationConsent: 'DENIED', - }, - {}, - ); + const result = getCallConversionPayload(message, { + adUserData: 'GRANTED', + adPersonalization: 'DENIED', + }); expect(result).toEqual({ conversions: [ { diff --git a/src/v0/destinations/google_adwords_remarketing_lists/config.js b/src/v0/destinations/google_adwords_remarketing_lists/config.js index 1e943aee562..7c89b6bc357 100644 --- a/src/v0/destinations/google_adwords_remarketing_lists/config.js +++ b/src/v0/destinations/google_adwords_remarketing_lists/config.js @@ -1,6 +1,6 @@ const { getMappingConfig } = require('../../util'); -const API_VERSION = 'v17'; +const API_VERSION = 'v18'; const BASE_ENDPOINT = `https://googleads.googleapis.com/${API_VERSION}/customers`; const CONFIG_CATEGORIES = { diff --git a/src/v0/destinations/google_adwords_remarketing_lists/util.test.js b/src/v0/destinations/google_adwords_remarketing_lists/util.test.js index a41c00f12f4..2ba4948566b 100644 --- a/src/v0/destinations/google_adwords_remarketing_lists/util.test.js +++ b/src/v0/destinations/google_adwords_remarketing_lists/util.test.js @@ -1,6 +1,8 @@ const { populateIdentifiers, responseBuilder, getOperationAudienceId } = require('./util'); const { API_VERSION } = require('./config'); -const accessToken = 'abcd1234'; +const { generateRandomString } = require('@rudderstack/integrations-lib'); + +const accessToken = generateRandomString(); const developerToken = 'ijkl9101'; const body = { operations: [ @@ -68,7 +70,7 @@ const expectedResponse = { method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json', 'developer-token': 'ijkl9101', }, diff --git a/src/v0/destinations/google_cloud_function/util.js b/src/v0/destinations/google_cloud_function/util.js index 8f85460902c..a960f02ab04 100644 --- a/src/v0/destinations/google_cloud_function/util.js +++ b/src/v0/destinations/google_cloud_function/util.js @@ -30,7 +30,6 @@ function generateBatchedPayload(events) { let batchEventResponse = events.map((event) => event.message); // Batch event into dest batch structure events.forEach((ev) => { - // batchResponseList.push(ev.message.body.JSON); metadata.push(ev.metadata); }); batchEventResponse = { diff --git a/src/v0/destinations/hs/HSTransform-v2.js b/src/v0/destinations/hs/HSTransform-v2.js index 3dd9f87ea4a..e4578a6c5b7 100644 --- a/src/v0/destinations/hs/HSTransform-v2.js +++ b/src/v0/destinations/hs/HSTransform-v2.js @@ -5,6 +5,7 @@ const { ConfigurationError, InstrumentationError, } = require('@rudderstack/integrations-lib'); +const validator = require('validator'); const { MappedToDestinationKey, GENERIC_TRUE_VALUES } = require('../../../constants'); const { defaultPostRequestConfig, @@ -72,6 +73,11 @@ const addHsAuthentication = (response, Config) => { const processIdentify = async ({ message, destination, metadata }, propertyMap) => { const { Config } = destination; let traits = getFieldValueFromMessage(message, 'traits'); + // since hubspot does not allow imvalid emails, we need to + // validate the email before sending it to hubspot + if (traits?.email && !validator.isEmail(traits.email)) { + throw new InstrumentationError(`Email "${traits.email}" is invalid`); + } const mappedToDestination = get(message, MappedToDestinationKey); const operation = get(message, 'context.hubspotOperation'); const externalIdObj = getDestinationExternalIDObjectForRetl(message, 'HS'); @@ -153,6 +159,7 @@ const processIdentify = async ({ message, destination, metadata }, propertyMap) // update endpoint = IDENTIFY_CRM_UPDATE_CONTACT.replace(':contactId', contactId); response.operation = 'updateContacts'; + response.method = defaultPatchRequestConfig.requestMethod; } else { // contact do not exist // create diff --git a/src/v0/destinations/hs/transform.js b/src/v0/destinations/hs/transform.js index b6ca213f031..68747bae6d8 100644 --- a/src/v0/destinations/hs/transform.js +++ b/src/v0/destinations/hs/transform.js @@ -86,7 +86,7 @@ const processBatchRouter = async (inputs, reqMetadata) => { try { if (mappedToDestination && GENERIC_TRUE_VALUES.includes(mappedToDestination?.toString())) { // skip splitting the batches to inserts and updates if object it is an association - if (objectType.toLowerCase() !== 'association') { + if (objectType?.toLowerCase() !== 'association') { propertyMap = await getProperties(destination, metadata); // get info about existing objects and splitting accordingly. tempInputs = await splitEventsForCreateUpdate(tempInputs, destination, metadata); diff --git a/src/v0/destinations/hs/util.js b/src/v0/destinations/hs/util.js index 56ec6e41675..b2aa61ed505 100644 --- a/src/v0/destinations/hs/util.js +++ b/src/v0/destinations/hs/util.js @@ -23,7 +23,6 @@ const { isNull, validateEventName, defaultBatchRequestConfig, - defaultPostRequestConfig, getSuccessRespEvents, } = require('../../util'); const { @@ -608,8 +607,8 @@ const performHubSpotSearch = async ( /* searchResults = { id: 'existing_contact_id', - property: 'existing_contact_email', // when email is identifier - hs_additional_emails: ['secondary_email'] // when email is identifier + property: 'existing_contact_email', // when email is identifier + hs_additional_emails: ['secondary_email'] // when email is identifier } */ return searchResults; }; @@ -838,9 +837,9 @@ const addExternalIdToHSTraits = (message) => { const externalIdObj = message.context?.externalId?.[0]; if (externalIdObj.useSecondaryObject) { /* this condition help us to NOT override the primary key value with the secondary key value - example: + example: for `email` as primary key and `hs_additonal_emails` as secondary key we don't want to override `email` with `hs_additional_emails`. - neither we want to map anything for `hs_additional_emails` as this property can not be set + neither we want to map anything for `hs_additional_emails` as this property can not be set */ return; } @@ -859,7 +858,7 @@ const convertToResponseFormat = (successRespListWithDontBatchTrue) => { batchedResponse.batchedRequest.endpoint = endpoint; batchedResponse.batchedRequest.body = message.body; batchedResponse.batchedRequest.params = message.params; - batchedResponse.batchedRequest.method = defaultPostRequestConfig.requestMethod; + batchedResponse.batchedRequest.method = message.method; batchedResponse.metadata = [metadata]; batchedResponse.destination = destination; diff --git a/src/v0/destinations/intercom/config.js b/src/v0/destinations/intercom/config.js deleted file mode 100644 index ae29eebc1eb..00000000000 --- a/src/v0/destinations/intercom/config.js +++ /dev/null @@ -1,53 +0,0 @@ -const { getMappingConfig } = require('../../util'); - -const BASE_ENDPOINT = 'https://api.intercom.io'; - -// track events | Track -const TRACK_ENDPOINT = `${BASE_ENDPOINT}/events`; -// Create, Update a user with a company | Identify -const IDENTIFY_ENDPOINT = `${BASE_ENDPOINT}/users`; -// create, update, delete a company | Group -const GROUP_ENDPOINT = `${BASE_ENDPOINT}/companies`; - -const ConfigCategory = { - TRACK: { - endpoint: TRACK_ENDPOINT, - name: 'INTERCOMTrackConfig', - }, - IDENTIFY: { - endpoint: IDENTIFY_ENDPOINT, - name: 'INTERCOMIdentifyConfig', - }, - GROUP: { - endpoint: GROUP_ENDPOINT, - name: 'INTERCOMGroupConfig', - }, -}; - -const MappingConfig = getMappingConfig(ConfigCategory, __dirname); - -const ReservedTraitsProperties = [ - 'userId', - 'email', - 'phone', - 'name', - 'createdAt', - 'firstName', - 'lastName', - 'firstname', - 'lastname', - 'company', -]; - -const ReservedCompanyProperties = ['id', 'name', 'industry']; - -// ref:- https://developers.intercom.com/intercom-api-reference/v1.4/reference/event-metadata-types -const MetadataTypes = { richLink: ['url', 'value'], monetaryAmount: ['amount', 'currency'] }; - -module.exports = { - ConfigCategory, - MappingConfig, - ReservedCompanyProperties, - ReservedTraitsProperties, - MetadataTypes, -}; diff --git a/src/v0/destinations/intercom/data/INTERCOMGroupConfig.json b/src/v0/destinations/intercom/data/INTERCOMGroupConfig.json deleted file mode 100644 index 6857c4e1045..00000000000 --- a/src/v0/destinations/intercom/data/INTERCOMGroupConfig.json +++ /dev/null @@ -1,53 +0,0 @@ -[ - { - "destKey": "company_id", - "sourceKeys": "groupId", - "required": true - }, - { - "destKey": "name", - "sourceKeys": "name", - "sourceFromGenericMap": true, - "required": false - }, - { - "destKey": "plan", - "sourceKeys": ["traits.plan", "context.traits.plan"], - "required": false - }, - { - "destKey": "size", - "sourceKeys": ["traits.size", "context.traits.size"], - "metadata": { - "type": "toNumber" - }, - "required": false - }, - { - "destKey": "website", - "sourceKeys": "website", - "sourceFromGenericMap": true, - "required": false - }, - { - "destKey": "industry", - "sourceKeys": ["traits.industry", "context.traits.industry"], - "required": false - }, - { - "destKey": "monthly_spend", - "sourceKeys": ["traits.monthlySpend", "context.traits.monthlySpend"], - "metadata": { - "type": "toNumber" - }, - "required": false - }, - { - "destKey": "remote_created_at", - "sourceKeys": ["traits.remoteCreatedAt", "context.traits.remoteCreatedAt"], - "metadata": { - "type": "toNumber" - }, - "required": false - } -] diff --git a/src/v0/destinations/intercom/data/INTERCOMIdentifyConfig.json b/src/v0/destinations/intercom/data/INTERCOMIdentifyConfig.json deleted file mode 100644 index 726a741161e..00000000000 --- a/src/v0/destinations/intercom/data/INTERCOMIdentifyConfig.json +++ /dev/null @@ -1,46 +0,0 @@ -[ - { - "destKey": "user_id", - "sourceKeys": [ - "userId", - "traits.userId", - "traits.id", - "context.traits.userId", - "context.traits.id" - ], - "required": false - }, - { - "destKey": "email", - "sourceKeys": ["traits.email", "context.traits.email"], - "required": false - }, - { - "destKey": "phone", - "sourceKeys": ["traits.phone", "context.traits.phone"], - "required": false - }, - { - "destKey": "name", - "sourceKeys": ["traits.name", "context.traits.name"], - "required": false - }, - { - "destKey": "signed_up_at", - "sourceKeys": ["traits.createdAt", "context.traits.createdAt"], - "required": false, - "metadata": { - "type": "secondTimestamp" - } - }, - { - "destKey": "last_seen_user_agent", - "sourceKeys": "context.userAgent", - "required": false - }, - { - "destKey": "custom_attributes", - "sourceKeys": ["traits", "context.traits"], - "required": false - } -] diff --git a/src/v0/destinations/intercom/data/INTERCOMTrackConfig.json b/src/v0/destinations/intercom/data/INTERCOMTrackConfig.json deleted file mode 100644 index f33c9a8a982..00000000000 --- a/src/v0/destinations/intercom/data/INTERCOMTrackConfig.json +++ /dev/null @@ -1,36 +0,0 @@ -[ - { - "destKey": "user_id", - "sourceKeys": [ - "userId", - "traits.userId", - "traits.id", - "context.traits.userId", - "context.traits.id" - ], - "required": false - }, - { - "destKey": "email", - "sourceKeys": ["traits.email", "context.traits.email"], - "required": false - }, - { - "destKey": "event_name", - "sourceKeys": "event", - "required": true - }, - { - "destKey": "created", - "sourceKeys": "timestamp", - "sourceFromGenericMap": true, - "required": true, - "metadata": { - "type": "secondTimestamp" - } - }, - { - "destKey": "metadata", - "sourceKeys": "properties" - } -] diff --git a/src/v0/destinations/intercom/transform.js b/src/v0/destinations/intercom/transform.js deleted file mode 100644 index 212eaba13b5..00000000000 --- a/src/v0/destinations/intercom/transform.js +++ /dev/null @@ -1,252 +0,0 @@ -const md5 = require('md5'); -const get = require('get-value'); -const { InstrumentationError } = require('@rudderstack/integrations-lib'); -const { EventType, MappedToDestinationKey } = require('../../../constants'); -const { - ConfigCategory, - MappingConfig, - ReservedTraitsProperties, - ReservedCompanyProperties, -} = require('./config'); -const { - constructPayload, - removeUndefinedAndNullValues, - defaultRequestConfig, - defaultPostRequestConfig, - getFieldValueFromMessage, - addExternalIdToTraits, - simpleProcessRouterDest, - flattenJson, -} = require('../../util'); -const { separateReservedAndRestMetadata } = require('./util'); -const { JSON_MIME_TYPE } = require('../../util/constant'); - -function getCompanyAttribute(company) { - const companiesList = []; - if (company.name || company.id) { - const customAttributes = {}; - Object.keys(company).forEach((key) => { - // the key is not in ReservedCompanyProperties - if (!ReservedCompanyProperties.includes(key)) { - const val = company[key]; - if (val !== Object(val)) { - customAttributes[key] = val; - } else { - customAttributes[key] = JSON.stringify(val); - } - } - }); - - companiesList.push({ - company_id: company.id || md5(company.name), - custom_attributes: removeUndefinedAndNullValues(customAttributes), - name: company.name, - industry: company.industry, - }); - } - return companiesList; -} - -function validateIdentify(message, payload, config) { - const finalPayload = payload; - - finalPayload.update_last_request_at = - config.updateLastRequestAt !== undefined ? config.updateLastRequestAt : true; - if (payload.user_id || payload.email) { - if (payload.name === undefined || payload.name === '') { - const firstName = getFieldValueFromMessage(message, 'firstName'); - const lastName = getFieldValueFromMessage(message, 'lastName'); - if (firstName && lastName) { - finalPayload.name = `${firstName} ${lastName}`; - } else { - finalPayload.name = firstName || lastName; - } - } - - if (get(finalPayload, 'custom_attributes.company')) { - finalPayload.companies = getCompanyAttribute(finalPayload.custom_attributes.company); - } - - if (finalPayload.custom_attributes) { - ReservedTraitsProperties.forEach((trait) => { - delete finalPayload.custom_attributes[trait]; - }); - finalPayload.custom_attributes = flattenJson(finalPayload.custom_attributes); - } - - return finalPayload; - } - throw new InstrumentationError('Either of `email` or `userId` is required for Identify call'); -} - -function validateTrack(payload) { - if (!payload.user_id && !payload.email) { - throw new InstrumentationError('Either of `email` or `userId` is required for Track call'); - } - // pass only string, number, boolean properties - if (payload.metadata) { - // reserved metadata contains JSON objects that does not requires flattening - const { reservedMetadata, restMetadata } = separateReservedAndRestMetadata(payload.metadata); - return { ...payload, metadata: { ...reservedMetadata, ...flattenJson(restMetadata) } }; - } - - return payload; -} - -const checkIfEmailOrUserIdPresent = (message, Config) => { - const { context, anonymousId } = message; - let { userId } = message; - if (Config.sendAnonymousId && !userId) { - userId = anonymousId; - } - return !!(userId || context.traits?.email); -}; - -function attachUserAndCompany(message, Config) { - const email = message.context?.traits?.email; - const { userId, anonymousId, traits, groupId } = message; - const requestBody = {}; - if (userId) { - requestBody.user_id = userId; - } - if (Config.sendAnonymousId && !userId) { - requestBody.user_id = anonymousId; - } - if (email) { - requestBody.email = email; - } - const companyObj = { - company_id: groupId, - }; - if (traits?.name) { - companyObj.name = traits.name; - } - requestBody.companies = [companyObj]; - const response = defaultRequestConfig(); - response.method = defaultPostRequestConfig.requestMethod; - response.endpoint = ConfigCategory.IDENTIFY.endpoint; - response.headers = { - 'Content-Type': JSON_MIME_TYPE, - Authorization: `Bearer ${Config.apiKey}`, - Accept: JSON_MIME_TYPE, - 'Intercom-Version': '1.4', - }; - response.body.JSON = requestBody; - return response; -} - -function buildCustomAttributes(message, payload) { - const finalPayload = payload; - const { traits } = message; - const customAttributes = {}; - const companyReservedKeys = [ - 'remoteCreatedAt', - 'monthlySpend', - 'industry', - 'website', - 'size', - 'plan', - 'name', - ]; - - if (traits) { - Object.keys(traits).forEach((key) => { - if (!companyReservedKeys.includes(key) && key !== 'userId') { - customAttributes[key] = traits[key]; - } - }); - } - - if (Object.keys(customAttributes).length > 0) { - finalPayload.custom_attributes = flattenJson(customAttributes); - } - - return finalPayload; -} - -function validateAndBuildResponse(message, payload, category, destination) { - const respList = []; - const response = defaultRequestConfig(); - response.method = defaultPostRequestConfig.requestMethod; - response.endpoint = category.endpoint; - response.headers = { - 'Content-Type': JSON_MIME_TYPE, - Authorization: `Bearer ${destination.Config.apiKey}`, - Accept: JSON_MIME_TYPE, - 'Intercom-Version': '1.4', - }; - response.userId = message.anonymousId; - const messageType = message.type.toLowerCase(); - switch (messageType) { - case EventType.IDENTIFY: - response.body.JSON = removeUndefinedAndNullValues( - validateIdentify(message, payload, destination.Config), - ); - break; - case EventType.TRACK: - response.body.JSON = removeUndefinedAndNullValues(validateTrack(payload)); - break; - case EventType.GROUP: { - response.body.JSON = removeUndefinedAndNullValues(buildCustomAttributes(message, payload)); - respList.push(response); - if (checkIfEmailOrUserIdPresent(message, destination.Config)) { - const attachUserAndCompanyResponse = attachUserAndCompany(message, destination.Config); - attachUserAndCompanyResponse.userId = message.anonymousId; - respList.push(attachUserAndCompanyResponse); - } - break; - } - default: - throw new InstrumentationError(`Message type ${messageType} not supported`); - } - - return messageType === EventType.GROUP ? respList : response; -} - -function processSingleMessage(message, destination) { - if (!message.type) { - throw new InstrumentationError('Message Type is not present. Aborting message.'); - } - const { sendAnonymousId } = destination.Config; - const messageType = message.type.toLowerCase(); - let category; - - switch (messageType) { - case EventType.IDENTIFY: - category = ConfigCategory.IDENTIFY; - break; - case EventType.TRACK: - category = ConfigCategory.TRACK; - break; - case EventType.GROUP: - category = ConfigCategory.GROUP; - break; - default: - throw new InstrumentationError(`Message type ${messageType} not supported`); - } - - // build the response and return - let payload; - if (get(message, MappedToDestinationKey)) { - addExternalIdToTraits(message); - payload = getFieldValueFromMessage(message, 'traits'); - } else { - payload = constructPayload(message, MappingConfig[category.name]); - } - if (category !== ConfigCategory.GROUP && sendAnonymousId && !payload.user_id) { - payload.user_id = message.anonymousId; - } - return validateAndBuildResponse(message, payload, category, destination); -} - -function process(event) { - const response = processSingleMessage(event.message, event.destination); - return response; -} - -const processRouterDest = async (inputs, reqMetadata) => { - const respList = await simpleProcessRouterDest(inputs, process, reqMetadata); - return respList; -}; - -module.exports = { process, processRouterDest }; diff --git a/src/v0/destinations/intercom/util.js b/src/v0/destinations/intercom/util.js deleted file mode 100644 index 24a2934f7e0..00000000000 --- a/src/v0/destinations/intercom/util.js +++ /dev/null @@ -1,32 +0,0 @@ -const { MetadataTypes } = require('./config'); - -/** - * Separates reserved metadata from rest of the metadata based on the metadata types - * ref:- https://developers.intercom.com/intercom-api-reference/v1.4/reference/event-metadata-types - * @param {*} metadata - * @returns - */ -function separateReservedAndRestMetadata(metadata) { - const reservedMetadata = {}; - const restMetadata = {}; - if (metadata) { - Object.entries(metadata).forEach(([key, value]) => { - if (value && typeof value === 'object') { - const hasMonetaryAmountKeys = MetadataTypes.monetaryAmount.every((type) => type in value); - const hasRichLinkKeys = MetadataTypes.richLink.every((type) => type in value); - if (hasMonetaryAmountKeys || hasRichLinkKeys) { - reservedMetadata[key] = value; - } else { - restMetadata[key] = value; - } - } else { - restMetadata[key] = value; - } - }); - } - - // Return the separated metadata objects - return { reservedMetadata, restMetadata }; -} - -module.exports = { separateReservedAndRestMetadata }; diff --git a/src/v0/destinations/intercom/util.test.js b/src/v0/destinations/intercom/util.test.js deleted file mode 100644 index 99dbdd1f7ec..00000000000 --- a/src/v0/destinations/intercom/util.test.js +++ /dev/null @@ -1,176 +0,0 @@ -const { separateReservedAndRestMetadata } = require('./util'); - -describe('separateReservedAndRestMetadata utility test', () => { - it('separate reserved and rest metadata', () => { - const metadata = { - property1: 1, - property2: 'test', - property3: true, - property4: { - property1: 1, - property2: 'test', - property3: { - subProp1: { - a: 'a', - b: 'b', - }, - subProp2: ['a', 'b'], - }, - }, - property5: {}, - property6: [], - property7: null, - property8: undefined, - revenue: { - amount: 1232, - currency: 'inr', - test: 123, - }, - price: { - amount: 3000, - currency: 'USD', - }, - article: { - url: 'https://example.org/ab1de.html', - value: 'the dude abides', - }, - }; - const expectedReservedMetadata = { - revenue: { - amount: 1232, - currency: 'inr', - test: 123, - }, - price: { - amount: 3000, - currency: 'USD', - }, - article: { - url: 'https://example.org/ab1de.html', - value: 'the dude abides', - }, - }; - const expectedRestMetadata = { - property1: 1, - property2: 'test', - property3: true, - property4: { - property1: 1, - property2: 'test', - property3: { - subProp1: { - a: 'a', - b: 'b', - }, - subProp2: ['a', 'b'], - }, - }, - property5: {}, - property6: [], - property7: null, - property8: undefined, - }; - const { reservedMetadata, restMetadata } = separateReservedAndRestMetadata(metadata); - - expect(expectedReservedMetadata).toEqual(reservedMetadata); - expect(expectedRestMetadata).toEqual(restMetadata); - }); - - it('reserved metadata types not present in input metadata', () => { - const metadata = { - property1: 1, - property2: 'test', - property3: true, - property4: { - property1: 1, - property2: 'test', - property3: { - subProp1: { - a: 'a', - b: 'b', - }, - subProp2: ['a', 'b'], - }, - }, - property5: {}, - property6: [], - property7: null, - property8: undefined, - }; - const expectedRestMetadata = { - property1: 1, - property2: 'test', - property3: true, - property4: { - property1: 1, - property2: 'test', - property3: { - subProp1: { - a: 'a', - b: 'b', - }, - subProp2: ['a', 'b'], - }, - }, - property5: {}, - property6: [], - property7: null, - property8: undefined, - }; - const { reservedMetadata, restMetadata } = separateReservedAndRestMetadata(metadata); - - expect({}).toEqual(reservedMetadata); - expect(expectedRestMetadata).toEqual(restMetadata); - }); - - it('metadata input contains only reserved metadata types', () => { - const metadata = { - revenue: { - amount: 1232, - currency: 'inr', - test: 123, - }, - price: { - amount: 3000, - currency: 'USD', - }, - article: { - url: 'https://example.org/ab1de.html', - value: 'the dude abides', - }, - }; - const expectedReservedMetadata = { - revenue: { - amount: 1232, - currency: 'inr', - test: 123, - }, - price: { - amount: 3000, - currency: 'USD', - }, - article: { - url: 'https://example.org/ab1de.html', - value: 'the dude abides', - }, - }; - const { reservedMetadata, restMetadata } = separateReservedAndRestMetadata(metadata); - - expect(expectedReservedMetadata).toEqual(reservedMetadata); - expect({}).toEqual(restMetadata); - }); - - it('empty metadata object', () => { - const metadata = {}; - const { reservedMetadata, restMetadata } = separateReservedAndRestMetadata(metadata); - expect({}).toEqual(reservedMetadata); - expect({}).toEqual(restMetadata); - }); - - it('null/undefined metadata', () => { - const metadata = null; - const { reservedMetadata, restMetadata } = separateReservedAndRestMetadata(metadata); - expect({}).toEqual(reservedMetadata); - expect({}).toEqual(restMetadata); - }); -}); diff --git a/src/v0/destinations/iterable/config.js b/src/v0/destinations/iterable/config.js index 125367875f2..e60e444c18a 100644 --- a/src/v0/destinations/iterable/config.js +++ b/src/v0/destinations/iterable/config.js @@ -76,11 +76,31 @@ const constructEndpoint = (dataCenter, category) => { return `${baseUrl}${category.endpoint}`; }; +const BULK_ENDPOINTS = ['/api/users/bulkUpdate', '/api/events/trackBulk']; + const IDENTIFY_MAX_BATCH_SIZE = 1000; const IDENTIFY_MAX_BODY_SIZE_IN_BYTES = 4000000; const TRACK_MAX_BATCH_SIZE = 8000; +const ITERABLE_RESPONSE_USER_ID_PATHS = [ + 'invalidUserIds', + 'failedUpdates.invalidUserIds', + 'failedUpdates.notFoundUserIds', + 'failedUpdates.forgottenUserIds', + 'failedUpdates.conflictUserIds', + 'failedUpdates.invalidDataUserIds', +]; + +const ITERABLE_RESPONSE_EMAIL_PATHS = [ + 'invalidEmails', + 'failedUpdates.invalidEmails', + 'failedUpdates.notFoundEmails', + 'failedUpdates.forgottenEmails', + 'failedUpdates.conflictEmails', + 'failedUpdates.invalidDataEmails', +]; + module.exports = { mappingConfig, ConfigCategory, @@ -88,4 +108,7 @@ module.exports = { TRACK_MAX_BATCH_SIZE, IDENTIFY_MAX_BATCH_SIZE, IDENTIFY_MAX_BODY_SIZE_IN_BYTES, + ITERABLE_RESPONSE_USER_ID_PATHS, + ITERABLE_RESPONSE_EMAIL_PATHS, + BULK_ENDPOINTS, }; diff --git a/src/v0/destinations/iterable/transform.js b/src/v0/destinations/iterable/transform.js index dd67deef69e..c676097c96a 100644 --- a/src/v0/destinations/iterable/transform.js +++ b/src/v0/destinations/iterable/transform.js @@ -1,6 +1,7 @@ const lodash = require('lodash'); const get = require('get-value'); const { InstrumentationError } = require('@rudderstack/integrations-lib'); +const logger = require('../../../logger'); const { getCatalogEndpoint, hasMultipleResponses, @@ -28,6 +29,7 @@ const { const { JSON_MIME_TYPE } = require('../../util/constant'); const { mappingConfig, ConfigCategory } = require('./config'); const { EventType, MappedToDestinationKey } = require('../../../constants'); +const { MD5 } = require('../../../cdk/v2/bindings/default'); /** * Common payload builder function for all events @@ -108,10 +110,16 @@ const responseBuilder = (message, category, destination) => { * @returns */ const responseBuilderForRegisterDeviceOrBrowserTokenEvents = (message, destination) => { - const { device } = message.context; + const { device, os } = message.context; const category = device?.token ? ConfigCategory.IDENTIFY_DEVICE : ConfigCategory.IDENTIFY_BROWSER; - const response = responseBuilder(message, category, destination); + + const categoryWithEndpoint = getCategoryWithEndpoint(category, destination.Config.dataCenter); + const response = responseBuilder(message, categoryWithEndpoint, destination); response.headers.api_key = destination.Config.registerDeviceOrBrowserApiKey; + logger.info('{{ITERABLE::}} registerDeviceApiCalled', { + destinationId: destination.ID, + token: MD5(device?.token || os?.token || 'no token'), + }); return response; }; diff --git a/src/v0/destinations/iterable/util.js b/src/v0/destinations/iterable/util.js index b918600253f..c68583afb62 100644 --- a/src/v0/destinations/iterable/util.js +++ b/src/v0/destinations/iterable/util.js @@ -69,6 +69,11 @@ const validateMandatoryField = (payload) => { } }; +const getCategoryWithEndpoint = (categoryConfig, dataCenter) => ({ + ...categoryConfig, + endpoint: constructEndpoint(dataCenter, categoryConfig), +}); + /** * Check for register device and register browser events * @param {*} message @@ -80,18 +85,13 @@ const hasMultipleResponses = (message, category, config) => { const { context } = message; const isIdentifyEvent = message.type === EventType.IDENTIFY; - const isIdentifyCategory = category === ConfigCategory.IDENTIFY; - const hasToken = context && (context.device?.token || context.os?.token); + const isIdentifyCategory = category.action === ConfigCategory.IDENTIFY.action; + const hasToken = Boolean(context && (context.device?.token || context.os?.token)); const hasRegisterDeviceOrBrowserKey = Boolean(config.registerDeviceOrBrowserApiKey); return isIdentifyEvent && isIdentifyCategory && hasToken && hasRegisterDeviceOrBrowserKey; }; -const getCategoryWithEndpoint = (categoryConfig, dataCenter) => ({ - ...categoryConfig, - endpoint: constructEndpoint(dataCenter, categoryConfig), -}); - /** * Returns category value * @param {*} message @@ -483,6 +483,7 @@ const batchUpdateUserEvents = (updateUserEvents, registerDeviceOrBrowserTokenEve /** * Processes chunks of catalog events, extracts the necessary data, and prepares batched requests for further processing + * ref : https://api.iterable.com/api/docs#catalogs_bulkUpdateCatalogItems * @param {*} catalogEventsChunks * @returns */ @@ -600,12 +601,12 @@ const batchTrackEvents = (trackEvents) => { */ const prepareBatchRequests = (filteredEvents) => { const { - trackEvents, - catalogEvents, - errorRespList, - updateUserEvents, - eventResponseList, - registerDeviceOrBrowserTokenEvents, + trackEvents, // track + catalogEvents, // identify + errorRespList, // track + updateUserEvents, // identify + eventResponseList, // track + registerDeviceOrBrowserTokenEvents, // identify } = filteredEvents; const updateUserBatchedResponseList = @@ -759,4 +760,6 @@ module.exports = { registerDeviceTokenEventPayloadBuilder, registerBrowserTokenEventPayloadBuilder, getCategoryWithEndpoint, + prepareAndSplitUpdateUserBatchesBasedOnPayloadSize, + getMergeNestedObjects, }; diff --git a/src/v0/destinations/iterable/util.test.js b/src/v0/destinations/iterable/util.test.js index 098960ac775..2fadfbe44f1 100644 --- a/src/v0/destinations/iterable/util.test.js +++ b/src/v0/destinations/iterable/util.test.js @@ -7,208 +7,194 @@ const { updateUserEventPayloadBuilder, registerDeviceTokenEventPayloadBuilder, registerBrowserTokenEventPayloadBuilder, + hasMultipleResponses, + getCategoryWithEndpoint, + getCategoryUsingEventName, + prepareAndSplitUpdateUserBatchesBasedOnPayloadSize, + getMergeNestedObjects, } = require('./util'); +const { ConfigCategory, constructEndpoint } = require('./config'); -const { ConfigCategory } = require('./config'); - -const getTestMessage = () => { - let message = { - event: 'testEventName', - anonymousId: 'anonId', - traits: { - email: 'abc@test.com', - name: 'rudder', - address: { - city: 'kolkata', - country: 'India', - }, - createdAt: '2014-05-21T15:54:20Z', - timestamp: '2014-05-21T15:54:20Z', +const testMessage = { + event: 'testEventName', + anonymousId: 'anonId', + traits: { + email: 'abc@test.com', + name: 'rudder', + address: { + city: 'kolkata', + country: 'India', }, - properties: { - category: 'test', - email: 'test@test.com', - templateId: 1234, - campaignId: 5678, - name: 'pageName', + createdAt: '2014-05-21T15:54:20Z', + timestamp: '2014-05-21T15:54:20Z', + }, + properties: { + category: 'test', + email: 'test@test.com', + templateId: 1234, + campaignId: 5678, + name: 'pageName', + }, + context: { + device: { + token: 1234, }, - context: { - device: { - token: 1234, - }, - os: { - token: 5678, - }, - mappedToDestination: false, - externalId: [ - { - id: '12345', - identifierType: 'test_identifier', - }, - ], + os: { + token: 5678, }, - }; - return message; + mappedToDestination: false, + externalId: [ + { + id: '12345', + identifierType: 'test_identifier', + }, + ], + }, }; -const getTestConfig = () => { - let config = { - apiKey: '12345', - mapToSingleEvent: false, - trackAllPages: true, - trackCategorisedPages: false, - trackNamedPages: false, - }; - return config; +const testConfig = { + apiKey: '12345', + mapToSingleEvent: false, + trackAllPages: true, + trackCategorisedPages: false, + trackNamedPages: false, }; -const getTestEcommMessage = () => { - let message = { - event: 'testEventName', - anonymousId: 'anonId', - traits: { - userId: 'userId', - email: 'abc@test.com', - name: 'rudder', - address: { - city: 'kolkata', - country: 'India', - }, - createdAt: '2014-05-21T15:54:20Z', - timestamp: '2014-05-21T15:54:20Z', +const testEcommMessage = { + event: 'testEventName', + anonymousId: 'anonId', + traits: { + userId: 'userId', + email: 'abc@test.com', + name: 'rudder', + address: { + city: 'kolkata', + country: 'India', }, - properties: { - product_id: 1234, - sku: 'abcd', - name: 'no product array present', - category: 'categoryTest1, categoryTest2', - price: '10', - quantity: '2', - total: '20', - campaignId: '1111', - templateId: '2222', + createdAt: '2014-05-21T15:54:20Z', + timestamp: '2014-05-21T15:54:20Z', + }, + properties: { + product_id: 1234, + sku: 'abcd', + name: 'no product array present', + category: 'categoryTest1, categoryTest2', + price: '10', + quantity: '2', + total: '20', + campaignId: '1111', + templateId: '2222', + }, + context: { + device: { + token: 1234, }, - context: { - device: { - token: 1234, - }, - os: { - token: 5678, - }, - mappedToDestination: false, - externalId: [ - { - id: '12345', - identifierType: 'test_identifier', - }, - ], + os: { + token: 5678, }, - }; - return message; + mappedToDestination: false, + externalId: [ + { + id: '12345', + identifierType: 'test_identifier', + }, + ], + }, }; describe('iterable utils test', () => { - describe('Unit test cases for iterable registerDeviceTokenEventPayloadBuilder', () => { - it('for no device type', async () => { - let expectedOutput = { - device: { - dataFields: { - campaignId: 5678, - category: 'test', - email: 'test@test.com', - name: 'pageName', - templateId: 1234, - }, - platform: 'GCM', - token: 1234, - }, - email: 'abc@test.com', - preferUserId: true, - userId: 'anonId', - }; - expect(registerDeviceTokenEventPayloadBuilder(getTestMessage(), getTestConfig())).toEqual( - expectedOutput, - ); - }); - it('For apple family device type', async () => { - const fittingPayload = { ...getTestMessage() }; - fittingPayload.context.device.type = 'ios'; - let expectedOutput = { - device: { - dataFields: { - campaignId: 5678, - category: 'test', - email: 'test@test.com', - name: 'pageName', - templateId: 1234, - }, - platform: 'APNS', - token: 1234, - }, - email: 'abc@test.com', - preferUserId: true, - userId: 'anonId', - }; - expect(registerDeviceTokenEventPayloadBuilder(fittingPayload, getTestConfig())).toEqual( - expectedOutput, - ); - }); + describe('Unit test cases for iterable constructEndpoint', () => { + test.each([ + { + dataCenter: 'USDC', + category: { endpoint: 'users/update' }, + expected: 'https://api.iterable.com/api/users/update', + }, + { + dataCenter: 'EUDC', + category: { endpoint: 'users/update' }, + expected: 'https://api.eu.iterable.com/api/users/update', + }, + { + dataCenter: 'INVALID', + category: { endpoint: 'events/track' }, + expected: 'https://api.iterable.com/api/events/track', + }, + ])( + 'should construct endpoint for dataCenter=$dataCenter and category=$category', + ({ dataCenter, category, expected }) => { + const result = constructEndpoint(dataCenter, category); + expect(result).toBe(expected); + }, + ); + }); - it('For non apple family device type', async () => { - let fittingPayload = { ...getTestMessage() }; - fittingPayload.context.device.type = 'android'; - let expectedOutput = { - device: { - dataFields: { - campaignId: 5678, - category: 'test', - email: 'test@test.com', - name: 'pageName', - templateId: 1234, + describe('Unit test cases for iterable registerDeviceTokenEventPayloadBuilder', () => { + test.each([ + { + deviceType: undefined, + expectedPlatform: 'GCM', + }, + { + deviceType: 'ios', + expectedPlatform: 'APNS', + }, + { + deviceType: 'android', + expectedPlatform: 'GCM', + }, + ])( + 'should build payload for deviceType=$deviceType with platform=$expectedPlatform', + ({ deviceType, expectedPlatform }) => { + const message = { ...testMessage }; + if (deviceType) { + message.context.device.type = deviceType; + } + const expectedOutput = { + device: { + dataFields: { + campaignId: 5678, + category: 'test', + email: 'test@test.com', + name: 'pageName', + templateId: 1234, + }, + platform: expectedPlatform, + token: 1234, }, - platform: 'GCM', - token: 1234, - }, - email: 'abc@test.com', - preferUserId: true, - userId: 'anonId', - }; - expect(registerDeviceTokenEventPayloadBuilder(fittingPayload, getTestConfig())).toEqual( - expectedOutput, - ); - }); + email: 'abc@test.com', + preferUserId: true, + userId: 'anonId', + }; + expect(registerDeviceTokenEventPayloadBuilder(message, testConfig)).toEqual(expectedOutput); + }, + ); }); + describe('Unit test cases for iterable registerBrowserTokenEventPayloadBuilder', () => { - it('flow check', async () => { - let expectedOutput = { browserToken: 5678, email: 'abc@test.com', userId: 'anonId' }; - expect(registerBrowserTokenEventPayloadBuilder(getTestMessage())).toEqual(expectedOutput); + it('should build payload for browser token', () => { + const expectedOutput = { browserToken: 5678, email: 'abc@test.com', userId: 'anonId' }; + expect(registerBrowserTokenEventPayloadBuilder(testMessage)).toEqual(expectedOutput); }); }); + describe('Unit test cases for iterable updateUserEventPayloadBuilder', () => { - it('flow check without externalId', async () => { - let expectedOutput = { - dataFields: { + test.each([ + { + mappedToDestination: false, + externalId: undefined, + expectedDataFields: { address: { city: 'kolkata', country: 'India' }, createdAt: '2014-05-21T15:54:20Z', email: 'abc@test.com', name: 'rudder', timestamp: '2014-05-21T15:54:20Z', }, - email: 'abc@test.com', - mergeNestedObjects: true, - preferUserId: true, - userId: 'anonId', - }; - expect( - updateUserEventPayloadBuilder(getTestMessage(), ConfigCategory.IDENTIFY, getTestConfig()), - ).toEqual(expectedOutput); - }); - - it('flow check with externalId', async () => { - let fittingPayload = { ...getTestMessage() }; - fittingPayload.context.mappedToDestination = true; - let expectedOutput = { - dataFields: { + }, + { + mappedToDestination: true, + externalId: '12345', + expectedDataFields: { address: { city: 'kolkata', country: 'India' }, createdAt: '2014-05-21T15:54:20Z', email: 'abc@test.com', @@ -216,29 +202,55 @@ describe('iterable utils test', () => { test_identifier: '12345', timestamp: '2014-05-21T15:54:20Z', }, - email: 'abc@test.com', - mergeNestedObjects: true, - preferUserId: true, - userId: 'anonId', - }; - expect( - updateUserEventPayloadBuilder(fittingPayload, ConfigCategory.IDENTIFY, getTestConfig()), - ).toEqual(expectedOutput); - }); + }, + ])( + 'should build payload with mappedToDestination=$mappedToDestination and externalId=$externalId', + ({ mappedToDestination, externalId, expectedDataFields }) => { + const message = { ...testMessage }; + message.context.mappedToDestination = mappedToDestination; + if (externalId) { + message.context.externalId[0].id = externalId; + } + const expectedOutput = { + dataFields: expectedDataFields, + email: 'abc@test.com', + mergeNestedObjects: true, + preferUserId: true, + userId: 'anonId', + }; + expect(updateUserEventPayloadBuilder(message, ConfigCategory.IDENTIFY, testConfig)).toEqual( + expectedOutput, + ); + }, + ); }); - describe('Unit test cases for iterbale pageEventPayloadBuilder', () => { - it('For trackAllPages', async () => { - let destination = { - Config: { - apiKey: '12345', - mapToSingleEvent: false, - trackAllPages: true, + + describe('Unit test cases for iterable pageEventPayloadBuilder', () => { + test.each([ + { + config: { trackAllPages: true, trackCategorisedPages: false, trackNamedPages: false }, + eventName: 'pageName page', + }, + { + config: { trackAllPages: false, trackCategorisedPages: true, trackNamedPages: false }, + eventName: 'pageName page', + }, + { + config: { trackAllPages: false, trackCategorisedPages: false, trackNamedPages: true }, + eventName: 'pageName page', + }, + { + config: { + mapToSingleEvent: true, + trackAllPages: false, trackCategorisedPages: false, - trackNamedPages: false, + trackNamedPages: true, }, - Enabled: true, - }; - let expectedOutput = { + eventName: 'Loaded a Page', + }, + ])('should build page event payload with config=$config', ({ config, eventName }) => { + const destination = { Config: { ...testConfig, ...config }, Enabled: true }; + const expectedOutput = { campaignId: 5678, createdAt: 1400687660000, dataFields: { @@ -249,554 +261,812 @@ describe('iterable utils test', () => { templateId: 1234, }, email: 'test@test.com', - eventName: 'pageName page', + eventName, templateId: 1234, userId: 'anonId', }; expect( - pageEventPayloadBuilder( - { ...getTestMessage(), type: 'page' }, - destination, - ConfigCategory.PAGE, - ), + pageEventPayloadBuilder({ ...testMessage, type: 'page' }, destination, ConfigCategory.PAGE), ).toEqual(expectedOutput); }); + }); - it('For trackCategorisedPages', async () => { - let destination = { - Config: { - apiKey: '12345', - mapToSingleEvent: false, - trackAllPages: false, - trackCategorisedPages: true, - trackNamedPages: false, + describe('Unit test cases for iterable screenEventPayloadBuilder', () => { + test.each([ + { + description: 'For trackAllPages', + destination: { + Config: { + apiKey: '12345', + mapToSingleEvent: false, + trackAllPages: true, + trackCategorisedPages: false, + trackNamedPages: false, + }, + Enabled: true, }, - Enabled: true, - }; - let expectedOutput = { - campaignId: 5678, - createdAt: 1400687660000, - dataFields: { + expectedOutput: { campaignId: 5678, - category: 'test', + createdAt: 1400687660000, + dataFields: { + campaignId: 5678, + category: 'test', + email: 'test@test.com', + name: 'pageName', + templateId: 1234, + }, email: 'test@test.com', - name: 'pageName', + eventName: 'pageName screen', templateId: 1234, + userId: 'anonId', }, - email: 'test@test.com', - eventName: 'pageName page', - templateId: 1234, - userId: 'anonId', - }; - expect( - pageEventPayloadBuilder( - { ...getTestMessage(), type: 'page' }, - destination, - ConfigCategory.PAGE, - ), - ).toEqual(expectedOutput); - }); - - it('For trackNamedPages', async () => { - let destination = { - Config: { - apiKey: '12345', - mapToSingleEvent: false, - trackAllPages: false, - trackCategorisedPages: false, - trackNamedPages: true, + }, + { + description: 'For trackCategorisedPages', + destination: { + Config: { + apiKey: '12345', + mapToSingleEvent: false, + trackAllPages: false, + trackCategorisedPages: true, + trackNamedPages: false, + }, + Enabled: true, }, - Enabled: true, - }; - let expectedOutput = { - campaignId: 5678, - createdAt: 1400687660000, - dataFields: { + expectedOutput: { campaignId: 5678, - category: 'test', + createdAt: 1400687660000, + dataFields: { + campaignId: 5678, + category: 'test', + email: 'test@test.com', + name: 'pageName', + templateId: 1234, + }, email: 'test@test.com', - name: 'pageName', + eventName: 'pageName screen', templateId: 1234, + userId: 'anonId', }, - email: 'test@test.com', - eventName: 'pageName page', - templateId: 1234, - userId: 'anonId', - }; - expect( - pageEventPayloadBuilder( - { ...getTestMessage(), type: 'page' }, - destination, - ConfigCategory.PAGE, - ), - ).toEqual(expectedOutput); - }); - - it('For mapToSingleEvent', async () => { - let destination = { - Config: { - apiKey: '12345', - mapToSingleEvent: true, - trackAllPages: false, - trackCategorisedPages: false, - trackNamedPages: true, + }, + { + description: 'For trackNamedPages', + destination: { + Config: { + apiKey: '12345', + mapToSingleEvent: false, + trackAllPages: false, + trackCategorisedPages: false, + trackNamedPages: true, + }, + Enabled: true, }, - Enabled: true, - }; - let expectedOutput = { - campaignId: 5678, - createdAt: 1400687660000, - dataFields: { + expectedOutput: { campaignId: 5678, - category: 'test', + createdAt: 1400687660000, + dataFields: { + campaignId: 5678, + category: 'test', + email: 'test@test.com', + name: 'pageName', + templateId: 1234, + }, email: 'test@test.com', - name: 'pageName', + eventName: 'pageName screen', templateId: 1234, + userId: 'anonId', }, - email: 'test@test.com', - eventName: 'Loaded a Page', - templateId: 1234, - userId: 'anonId', - }; - expect( - pageEventPayloadBuilder( - { ...getTestMessage(), type: 'page' }, - destination, - ConfigCategory.PAGE, - ), - ).toEqual(expectedOutput); - }); - - it('For non-mapToSingleEvent', async () => { - let destination = { - Config: { - apiKey: '12345', - mapToSingleEvent: false, - trackAllPages: false, - trackCategorisedPages: false, - trackNamedPages: true, + }, + { + description: 'For mapToSingleEvent', + destination: { + Config: { + apiKey: '12345', + mapToSingleEvent: true, + trackAllPages: false, + trackCategorisedPages: false, + trackNamedPages: true, + }, + Enabled: true, }, - Enabled: true, - }; - let expectedOutput = { - campaignId: 5678, - createdAt: 1400687660000, - dataFields: { + expectedOutput: { campaignId: 5678, - category: 'test', + createdAt: 1400687660000, + dataFields: { + campaignId: 5678, + category: 'test', + email: 'test@test.com', + name: 'pageName', + templateId: 1234, + }, email: 'test@test.com', - name: 'pageName', + eventName: 'Loaded a Screen', templateId: 1234, + userId: 'anonId', }, - email: 'test@test.com', - eventName: 'pageName page', - templateId: 1234, - userId: 'anonId', - }; - expect( - pageEventPayloadBuilder( - { ...getTestMessage(), type: 'page' }, - destination, - ConfigCategory.PAGE, - ), - ).toEqual(expectedOutput); - }); - }); - describe('Unit test cases for iterbale screenEventPayloadBuilder', () => { - it('For trackAllPages', async () => { - let destination = { - Config: { - apiKey: '12345', - mapToSingleEvent: false, - trackAllPages: true, - trackCategorisedPages: false, - trackNamedPages: false, + }, + { + description: 'For non-mapToSingleEvent', + destination: { + Config: { + apiKey: '12345', + mapToSingleEvent: false, + trackAllPages: false, + trackCategorisedPages: false, + trackNamedPages: true, + }, + Enabled: true, }, - Enabled: true, - }; - let expectedOutput = { - campaignId: 5678, - createdAt: 1400687660000, - dataFields: { + expectedOutput: { campaignId: 5678, - category: 'test', + createdAt: 1400687660000, + dataFields: { + campaignId: 5678, + category: 'test', + email: 'test@test.com', + name: 'pageName', + templateId: 1234, + }, email: 'test@test.com', - name: 'pageName', + eventName: 'pageName screen', templateId: 1234, + userId: 'anonId', }, - email: 'test@test.com', - eventName: 'pageName screen', - templateId: 1234, - userId: 'anonId', - }; - expect( - screenEventPayloadBuilder( - { ...getTestMessage(), type: 'screen' }, - destination, - ConfigCategory.SCREEN, - ), - ).toEqual(expectedOutput); + }, + ])('$description', ({ destination, expectedOutput }) => { + const message = { ...testMessage, type: 'screen' }; + const result = screenEventPayloadBuilder(message, destination, ConfigCategory.SCREEN); + expect(result).toEqual(expectedOutput); }); + }); - it('For trackCategorisedPages', async () => { - let destination = { - Config: { - apiKey: '12345', - mapToSingleEvent: false, - trackAllPages: false, - trackCategorisedPages: true, - trackNamedPages: false, - }, - Enabled: true, - }; - let expectedOutput = { - campaignId: 5678, - createdAt: 1400687660000, - dataFields: { + describe('Unit test cases for iterable trackEventPayloadBuilder', () => { + test.each([ + { + description: 'Valid payload with all fields', + message: testMessage, + category: ConfigCategory.TRACK, + expectedOutput: { campaignId: 5678, - category: 'test', + createdAt: 1400687660000, + dataFields: { + campaignId: 5678, + category: 'test', + email: 'test@test.com', + name: 'pageName', + templateId: 1234, + }, email: 'test@test.com', - name: 'pageName', + eventName: 'testEventName', templateId: 1234, + userId: 'anonId', }, - email: 'test@test.com', - eventName: 'pageName screen', - templateId: 1234, - userId: 'anonId', - }; - expect( - screenEventPayloadBuilder( - { ...getTestMessage(), type: 'screen' }, - destination, - ConfigCategory.SCREEN, - ), - ).toEqual(expectedOutput); - }); - - it('For trackNamedPages', async () => { - let destination = { - Config: { - apiKey: '12345', - mapToSingleEvent: false, - trackAllPages: false, - trackCategorisedPages: false, - trackNamedPages: true, + }, + { + description: 'Payload without campaignId and templateId', + message: { + ...testMessage, + properties: { + ...testMessage.properties, + campaignId: undefined, + templateId: undefined, + }, }, - Enabled: true, - }; - let expectedOutput = { - campaignId: 5678, - createdAt: 1400687660000, - dataFields: { - campaignId: 5678, - category: 'test', + category: ConfigCategory.TRACK, + expectedOutput: { + campaignId: undefined, + createdAt: 1400687660000, + dataFields: { + campaignId: undefined, + category: 'test', + email: 'test@test.com', + name: 'pageName', + templateId: undefined, + }, email: 'test@test.com', - name: 'pageName', - templateId: 1234, + eventName: 'testEventName', + templateId: undefined, + userId: 'anonId', }, - email: 'test@test.com', - eventName: 'pageName screen', - templateId: 1234, - userId: 'anonId', - }; - expect( - screenEventPayloadBuilder( - { ...getTestMessage(), type: 'screen' }, - destination, - ConfigCategory.SCREEN, - ), - ).toEqual(expectedOutput); - }); - - it('For mapToSingleEvent', async () => { - let destination = { - Config: { - apiKey: '12345', - mapToSingleEvent: true, - trackAllPages: false, - trackCategorisedPages: false, - trackNamedPages: true, + }, + { + description: 'Payload without email', + message: { + ...testMessage, + properties: { + ...testMessage.properties, + email: undefined, + }, }, - Enabled: true, - }; - let expectedOutput = { - campaignId: 5678, - createdAt: 1400687660000, - dataFields: { + category: ConfigCategory.TRACK, + expectedOutput: { campaignId: 5678, - category: 'test', - email: 'test@test.com', - name: 'pageName', + createdAt: 1400687660000, + dataFields: { + campaignId: 5678, + category: 'test', + email: undefined, + name: 'pageName', + templateId: 1234, + }, + email: undefined, + eventName: 'testEventName', templateId: 1234, + userId: 'anonId', }, - email: 'test@test.com', - eventName: 'Loaded a Screen', - templateId: 1234, - userId: 'anonId', - }; - expect( - screenEventPayloadBuilder( - { ...getTestMessage(), type: 'screen' }, - destination, - ConfigCategory.SCREEN, - ), - ).toEqual(expectedOutput); - }); - - it('For non-mapToSingleEvent', async () => { - let destination = { - Config: { - apiKey: '12345', - mapToSingleEvent: false, - trackAllPages: false, - trackCategorisedPages: false, - trackNamedPages: true, + }, + { + description: 'Payload without userId', + message: { + ...testMessage, + anonymousId: undefined, }, - Enabled: true, - }; - let expectedOutput = { - campaignId: 5678, - createdAt: 1400687660000, - dataFields: { + category: ConfigCategory.TRACK, + expectedOutput: { campaignId: 5678, - category: 'test', + createdAt: 1400687660000, + dataFields: { + campaignId: 5678, + category: 'test', + email: 'test@test.com', + name: 'pageName', + templateId: 1234, + }, email: 'test@test.com', - name: 'pageName', + eventName: 'testEventName', templateId: 1234, + userId: undefined, }, - email: 'test@test.com', - eventName: 'pageName screen', - templateId: 1234, - userId: 'anonId', - }; - expect( - screenEventPayloadBuilder( - { ...getTestMessage(), type: 'screen' }, - destination, - ConfigCategory.SCREEN, - ), - ).toEqual(expectedOutput); + }, + ])('$description', ({ message, category, expectedOutput }) => { + const result = trackEventPayloadBuilder(message, category); + expect(result).toEqual(expectedOutput); }); - }); - describe('Unit test cases for iterable trackEventPayloadBuilder', () => { - it('flow check', async () => { - let expectedOutput = { - campaignId: 5678, - createdAt: 1400687660000, - dataFields: { - campaignId: 5678, - category: 'test', - email: 'test@test.com', - name: 'pageName', - templateId: 1234, - }, - email: 'test@test.com', - eventName: 'testEventName', - templateId: 1234, - userId: 'anonId', + + test('should throw an error if neither email nor userId is present', () => { + const invalidMessage = { + ...testMessage, + properties: { ...testMessage.properties, email: undefined }, + anonymousId: undefined, }; - expect(trackEventPayloadBuilder(getTestMessage(), ConfigCategory.TRACK)).toEqual( - expectedOutput, + + expect(() => trackEventPayloadBuilder(invalidMessage, ConfigCategory.TRACK)).toThrow( + 'userId or email is mandatory for this request', ); }); }); + describe('Unit test cases for iterable purchaseEventPayloadBuilder', () => { - it('flow check without product array', async () => { - let expectedOutput = { - campaignId: 1111, - createdAt: 1400687660000, - dataFields: { - campaignId: '1111', - category: 'categoryTest1, categoryTest2', - name: 'no product array present', - price: '10', - product_id: 1234, - quantity: '2', - sku: 'abcd', - templateId: '2222', - total: '20', - }, - items: [ - { - categories: ['categoryTest1', ' categoryTest2'], - id: 1234, + test.each([ + { + description: 'Valid payload without product array', + message: testEcommMessage, + category: ConfigCategory.TRACK_PURCHASE, + config: testConfig, + expectedOutput: { + campaignId: 1111, + createdAt: 1400687660000, + dataFields: { + campaignId: '1111', + category: 'categoryTest1, categoryTest2', name: 'no product array present', - price: 10, - quantity: 2, + price: '10', + product_id: 1234, + quantity: '2', sku: 'abcd', + templateId: '2222', + total: '20', }, - ], - templateId: 2222, - total: 20, - user: { + items: [ + { + categories: ['categoryTest1', ' categoryTest2'], + id: 1234, + name: 'no product array present', + price: 10, + quantity: 2, + sku: 'abcd', + }, + ], + templateId: 2222, + total: 20, + user: { + dataFields: { + address: { city: 'kolkata', country: 'India' }, + createdAt: '2014-05-21T15:54:20Z', + email: 'abc@test.com', + name: 'rudder', + timestamp: '2014-05-21T15:54:20Z', + userId: 'userId', + }, + email: 'abc@test.com', + mergeNestedObjects: true, + preferUserId: true, + userId: 'userId', + }, + }, + }, + { + description: 'Valid payload with product array', + message: { + ...testEcommMessage, + properties: { + ...testEcommMessage.properties, + products: [ + { + product_id: 1234, + sku: 'abcd', + name: 'product 1', + category: 'categoryTest1, categoryTest2', + price: '10', + quantity: '2', + total: '20', + }, + ], + }, + }, + category: ConfigCategory.TRACK_PURCHASE, + config: testConfig, + expectedOutput: { + campaignId: 1111, + createdAt: 1400687660000, dataFields: { - address: { city: 'kolkata', country: 'India' }, - createdAt: '2014-05-21T15:54:20Z', + campaignId: '1111', + category: 'categoryTest1, categoryTest2', + name: 'no product array present', + price: '10', + product_id: 1234, + products: [ + { + category: 'categoryTest1, categoryTest2', + name: 'product 1', + price: '10', + product_id: 1234, + quantity: '2', + sku: 'abcd', + total: '20', + }, + ], + quantity: '2', + sku: 'abcd', + templateId: '2222', + total: '20', + }, + items: [ + { + categories: ['categoryTest1', ' categoryTest2'], + id: 1234, + name: 'product 1', + price: 10, + quantity: 2, + sku: 'abcd', + }, + ], + templateId: 2222, + total: 20, + user: { + dataFields: { + address: { city: 'kolkata', country: 'India' }, + createdAt: '2014-05-21T15:54:20Z', + email: 'abc@test.com', + name: 'rudder', + timestamp: '2014-05-21T15:54:20Z', + userId: 'userId', + }, email: 'abc@test.com', - name: 'rudder', - timestamp: '2014-05-21T15:54:20Z', + mergeNestedObjects: true, + preferUserId: true, userId: 'userId', }, - email: 'abc@test.com', - mergeNestedObjects: true, - preferUserId: true, - userId: 'userId', }, + }, + ])('$description', ({ message, category, config, expectedOutput }) => { + const result = purchaseEventPayloadBuilder(message, category, config); + expect(result).toEqual(expectedOutput); + }); + + test('should throw an error if neither email nor userId is present', () => { + const invalidMessage = { + ...testEcommMessage, + traits: { ...testEcommMessage.traits, email: undefined, userId: undefined }, + anonymousId: undefined, }; - expect( - purchaseEventPayloadBuilder( - getTestEcommMessage(), - ConfigCategory.TRACK_PURCHASE, - getTestConfig(), - ), - ).toEqual(expectedOutput); + + expect(() => + purchaseEventPayloadBuilder(invalidMessage, ConfigCategory.TRACK_PURCHASE, testConfig), + ).toThrow('userId or email is mandatory for this request'); }); + }); - it('flow check with product array', async () => { - let fittingPayload = { ...getTestEcommMessage() }; - fittingPayload.properties.products = [ - { - product_id: 1234, - sku: 'abcd', - name: 'no product array present', - category: 'categoryTest1, categoryTest2', - price: '10', - quantity: '2', - total: '20', - }, - ]; - let expectedOutput = { - campaignId: 1111, - createdAt: 1400687660000, - dataFields: { - campaignId: '1111', - category: 'categoryTest1, categoryTest2', - name: 'no product array present', - price: '10', - product_id: 1234, - products: [ + describe('Unit test cases for iterable updateCartEventPayloadBuilder', () => { + test.each([ + { + description: 'Valid payload without product array', + message: testEcommMessage, + config: testConfig, + expectedOutput: { + items: [ { - category: 'categoryTest1, categoryTest2', + categories: ['categoryTest1', ' categoryTest2'], + id: 1234, name: 'no product array present', - price: '10', - product_id: 1234, - quantity: '2', + price: 10, + quantity: 2, sku: 'abcd', - total: '20', }, ], - quantity: '2', - sku: 'abcd', - templateId: '2222', - total: '20', + user: { + dataFields: { + address: { city: 'kolkata', country: 'India' }, + createdAt: '2014-05-21T15:54:20Z', + email: 'abc@test.com', + name: 'rudder', + timestamp: '2014-05-21T15:54:20Z', + userId: 'userId', + }, + email: 'abc@test.com', + mergeNestedObjects: true, + preferUserId: true, + userId: 'userId', + }, }, - items: [ - { - categories: ['categoryTest1', ' categoryTest2'], - id: 1234, - name: 'no product array present', - price: 10, - quantity: 2, - sku: 'abcd', + }, + { + description: 'Valid payload with product array', + message: { + ...testEcommMessage, + properties: { + ...testEcommMessage.properties, + products: [ + { + product_id: 1234, + sku: 'abcd', + name: 'product 1', + category: 'categoryTest1, categoryTest2', + price: '10', + quantity: '2', + total: '20', + }, + ], }, - ], - templateId: 2222, - total: 20, - user: { - dataFields: { - address: { city: 'kolkata', country: 'India' }, - createdAt: '2014-05-21T15:54:20Z', + }, + config: testConfig, + expectedOutput: { + items: [ + { + categories: ['categoryTest1', ' categoryTest2'], + id: 1234, + name: 'product 1', + price: 10, + quantity: 2, + sku: 'abcd', + }, + ], + user: { + dataFields: { + address: { city: 'kolkata', country: 'India' }, + createdAt: '2014-05-21T15:54:20Z', + email: 'abc@test.com', + name: 'rudder', + timestamp: '2014-05-21T15:54:20Z', + userId: 'userId', + }, email: 'abc@test.com', - name: 'rudder', - timestamp: '2014-05-21T15:54:20Z', + mergeNestedObjects: true, + preferUserId: true, userId: 'userId', }, - email: 'abc@test.com', - mergeNestedObjects: true, - preferUserId: true, - userId: 'userId', }, + }, + ])('$description', ({ message, config, expectedOutput }) => { + const result = updateCartEventPayloadBuilder(message, config); + expect(result).toEqual(expectedOutput); + }); + + test('should throw an error if neither email nor userId is present', () => { + const invalidMessage = { + ...testEcommMessage, + traits: { ...testEcommMessage.traits, email: undefined, userId: undefined }, + anonymousId: undefined, }; - expect( - purchaseEventPayloadBuilder(fittingPayload, ConfigCategory.TRACK_PURCHASE, getTestConfig()), - ).toEqual(expectedOutput); + + expect(() => updateCartEventPayloadBuilder(invalidMessage, testConfig)).toThrow( + 'userId or email is mandatory for this request', + ); }); }); - describe('Unit test cases for iterable updateCartEventPayloadBuilder', () => { - it('flow check without product array', async () => { - let expectedOutput = { - items: [ - { - categories: ['categoryTest1', ' categoryTest2'], - id: 1234, - name: 'no product array present', - price: 10, - quantity: 2, - sku: 'abcd', + + describe('Unit test cases for iterable hasMultipleResponses', () => { + test.each([ + { + description: 'should return false when message type is not identify', + message: { + type: 'track', + context: { + device: { token: '123' }, + os: { token: '456' }, }, - ], - user: { - dataFields: { - address: { city: 'kolkata', country: 'India' }, - createdAt: '2014-05-21T15:54:20Z', - email: 'abc@test.com', - name: 'rudder', - timestamp: '2014-05-21T15:54:20Z', - userId: 'userId', + }, + category: getCategoryWithEndpoint(ConfigCategory.IDENTIFY, 'USDC'), + config: { registerDeviceOrBrowserApiKey: 'test-key' }, + expected: false, + }, + { + description: 'should return false when category is not identify', + message: { + type: 'identify', + context: { + device: { token: '123' }, + os: { token: '456' }, }, - email: 'abc@test.com', - mergeNestedObjects: true, - preferUserId: true, - userId: 'userId', }, - }; - expect( - updateCartEventPayloadBuilder(getTestEcommMessage(), ConfigCategory.UPDATE_CART), - ).toEqual(expectedOutput); + category: getCategoryWithEndpoint(ConfigCategory.PAGE, 'USDC'), + config: { registerDeviceOrBrowserApiKey: 'test-key' }, + expected: false, + }, + { + description: 'should return false when no device/os token is present', + message: { + type: 'identify', + context: { + device: {}, + os: {}, + }, + }, + category: getCategoryWithEndpoint(ConfigCategory.IDENTIFY, 'USDC'), + config: { registerDeviceOrBrowserApiKey: 'test-key' }, + expected: false, + }, + { + description: + 'should return false when registerDeviceOrBrowserApiKey is not present in config', + message: { + type: 'identify', + context: { + device: { token: '123' }, + os: { token: '456' }, + }, + }, + category: getCategoryWithEndpoint(ConfigCategory.IDENTIFY, 'USDC'), + config: {}, + expected: false, + }, + { + description: 'should return true when all conditions are met with device token', + message: { + type: 'identify', + context: { + device: { token: '123' }, + }, + }, + category: getCategoryWithEndpoint(ConfigCategory.IDENTIFY, 'USDC'), + config: { + dataCenter: 'USDC', + registerDeviceOrBrowserApiKey: 'test-key', + }, + expected: true, + }, + { + description: 'should return true when all conditions are met with os token', + message: { + type: 'identify', + context: { + os: { token: '456' }, + }, + }, + category: getCategoryWithEndpoint(ConfigCategory.IDENTIFY, 'USDC'), + config: { + dataCenter: 'USDC', + registerDeviceOrBrowserApiKey: 'test-key', + }, + expected: true, + }, + ])('$description', ({ message, category, config, expected }) => { + const result = hasMultipleResponses(message, category, config); + expect(result).toBe(expected); }); + }); - it('flow check with product array', async () => { - let fittingPayload = { ...getTestEcommMessage() }; - fittingPayload.properties.products = [ - { - product_id: 1234, - sku: 'abcd', - name: 'no product array present', - category: 'categoryTest1, categoryTest2', - price: '10', - quantity: '2', - total: '20', - }, - ]; - let expectedOutput = { - items: [ + describe('Unit test cases for iterable getCategoryUsingEventName', () => { + test.each([ + { + description: 'should return TRACK_PURCHASE category when event is "order completed"', + message: { + event: 'order completed', + properties: { + total: 100, + }, + }, + dataCenter: 'USDC', + expected: { + name: 'IterableTrackPurchaseConfig', + action: 'trackPurchase', + endpoint: 'https://api.iterable.com/api/commerce/trackPurchase', + }, + }, + { + description: 'should return UPDATE_CART category when event is "product added"', + message: { + event: 'product added', + properties: { + total: 100, + }, + }, + dataCenter: 'USDC', + expected: { + ...ConfigCategory.UPDATE_CART, + endpoint: 'https://api.iterable.com/api/commerce/updateCart', + }, + }, + { + description: 'should return UPDATE_CART category when event is "product removed"', + message: { + event: 'PRODUCT REMOVED', + properties: { + total: 100, + }, + }, + dataCenter: 'EUDC', + expected: { + ...ConfigCategory.UPDATE_CART, + endpoint: 'https://api.eu.iterable.com/api/commerce/updateCart', + }, + }, + { + description: 'should return TRACK category when event is a generic event', + message: { + event: 'custom event', + properties: { + total: 100, + }, + }, + dataCenter: 'USDC', + expected: { + ...ConfigCategory.TRACK, + endpoint: 'https://api.iterable.com/api/events/track', + }, + }, + ])('$description', ({ message, dataCenter, expected }) => { + const result = getCategoryUsingEventName(message, dataCenter); + expect(result).toEqual(expected); + }); + }); + describe('Unit test cases for iterable prepareAndSplitUpdateUserBatchesBasedOnPayloadSize', () => { + test.each([ + { + description: 'should split events into multiple batches when payload size exceeds limit', + chunk: [ { - categories: ['categoryTest1', ' categoryTest2'], - id: 1234, - name: 'no product array present', - price: 10, - quantity: 2, - sku: 'abcd', + metadata: { jobId: '1' }, + destination: 'dest1', + message: { body: { JSON: { id: '1', data: 'a'.repeat(3000000) } } }, + }, + { + metadata: { jobId: '2' }, + destination: 'dest1', + message: { body: { JSON: { id: '2', data: 'b'.repeat(3000000) } } }, }, ], - user: { - dataFields: { - address: { city: 'kolkata', country: 'India' }, - createdAt: '2014-05-21T15:54:20Z', - email: 'abc@test.com', - name: 'rudder', - timestamp: '2014-05-21T15:54:20Z', - userId: 'userId', + registerDeviceOrBrowserTokenEvents: { + 1: { deviceToken: 'token1' }, + 2: { deviceToken: 'token2' }, + }, + expectedBatches: [ + { + users: [{ id: '1', data: 'a'.repeat(3000000) }], + metadata: [{ jobId: '1' }], + nonBatchedRequests: [{ deviceToken: 'token1' }], + destination: 'dest1', }, - email: 'abc@test.com', - mergeNestedObjects: true, - preferUserId: true, - userId: 'userId', + { + users: [{ id: '2', data: 'b'.repeat(3000000) }], + metadata: [{ jobId: '2' }], + nonBatchedRequests: [{ deviceToken: 'token2' }], + destination: 'dest1', + }, + ], + }, + { + description: 'should return empty batches array for empty input chunk', + chunk: [], + registerDeviceOrBrowserTokenEvents: {}, + expectedBatches: [], + }, + { + description: 'should create batches with users, metadata, and non-batched requests arrays', + chunk: [ + { + metadata: { jobId: '1' }, + destination: 'dest1', + message: { body: { JSON: { id: '1' } } }, + }, + { + metadata: { jobId: '2' }, + destination: 'dest1', + message: { body: { JSON: { id: '2' } } }, + }, + ], + registerDeviceOrBrowserTokenEvents: {}, + expectedBatches: [ + { + users: [{ id: '1' }, { id: '2' }], + metadata: [{ jobId: '1' }, { jobId: '2' }], + nonBatchedRequests: [], + destination: 'dest1', + }, + ], + }, + { + description: 'should add device/browser token events to nonBatchedRequests array', + chunk: [ + { + metadata: { jobId: '1' }, + destination: 'dest1', + message: { body: { JSON: { id: '1' } } }, + }, + ], + registerDeviceOrBrowserTokenEvents: { + 1: { deviceToken: 'token1' }, }, - }; - expect(updateCartEventPayloadBuilder(fittingPayload, ConfigCategory.UPDATE_CART)).toEqual( - expectedOutput, + expectedBatches: [ + { + users: [{ id: '1' }], + metadata: [{ jobId: '1' }], + nonBatchedRequests: [{ deviceToken: 'token1' }], + destination: 'dest1', + }, + ], + }, + { + description: 'should create final batch even if size limit not reached', + chunk: [ + { + metadata: { jobId: '1' }, + destination: 'dest1', + message: { body: { JSON: { id: '1' } } }, + }, + ], + registerDeviceOrBrowserTokenEvents: { + 1: { deviceToken: 'token1' }, + }, + expectedBatches: [ + { + users: [{ id: '1' }], + metadata: [{ jobId: '1' }], + nonBatchedRequests: [{ deviceToken: 'token1' }], + destination: 'dest1', + }, + ], + }, + ])('$description', ({ chunk, registerDeviceOrBrowserTokenEvents, expectedBatches }) => { + const result = prepareAndSplitUpdateUserBatchesBasedOnPayloadSize( + chunk, + registerDeviceOrBrowserTokenEvents, ); + + expect(result).toEqual(expectedBatches); + }); + }); + + describe('Unit test cases for iterable getMergeNestedObjects', () => { + test.each([ + { + description: 'should return true when mergeNestedObjects is undefined', + config: {}, + expected: true, + }, + { + description: 'should return true when mergeNestedObjects is true', + config: { mergeNestedObjects: true }, + expected: true, + }, + { + description: 'should return false when mergeNestedObjects is false', + config: { mergeNestedObjects: false }, + expected: false, + }, + ])('$description', ({ config, expected }) => { + const result = getMergeNestedObjects(config); + expect(result).toBe(expected); }); }); }); diff --git a/src/v0/destinations/klaviyo/util.js b/src/v0/destinations/klaviyo/util.js index 4421764d953..42e1d8a8012 100644 --- a/src/v0/destinations/klaviyo/util.js +++ b/src/v0/destinations/klaviyo/util.js @@ -1,5 +1,6 @@ const set = require('set-value'); const lodash = require('lodash'); +const { parsePhoneNumberFromString } = require('libphonenumber-js'); const { NetworkError, InstrumentationError } = require('@rudderstack/integrations-lib'); const { WhiteListedTraits } = require('../../../constants'); const { @@ -32,6 +33,24 @@ const { const REVISION_CONSTANT = '2023-02-22'; +/** + * This function is used to check if the phone number is in E.164 format. It uses libphonenumber-js library to parse the phone number + * @param {*} phoneNumber + * @returns boolean + */ +function isValidE164PhoneNumber(phoneNumber) { + try { + // Remove all non-numeric characters from the phone number like spaces, hyphens, etc. + const sanitizedPhoneNumber = phoneNumber.replace(/[^\d+]/g, ''); + const parsedNumber = parsePhoneNumberFromString(sanitizedPhoneNumber); + // Check if the number is valid and properly formatted in E.164. + return parsedNumber && parsedNumber.format('E.164') === sanitizedPhoneNumber; + } catch (error) { + // If parsing fails, it's not a valid E.164 number, i.e doesn't start with '+' and country code + return false; + } +} + /** * This function calls the create user endpoint ref: https://developers.klaviyo.com/en/reference/create_profile * If the user doesn't exist, it creates a profile for the user and return 201 status code and the response which contains all the profile data @@ -414,6 +433,12 @@ const constructProfile = (message, destination, isIdentifyCall) => { message, MAPPING_CONFIG[CONFIG_CATEGORIES.PROFILEV2.name], ); + if ( + isDefinedAndNotNull(profileAttributes.phone_number) && + !isValidE164PhoneNumber(profileAttributes.phone_number) + ) { + throw new InstrumentationError('Phone number is not in E.164 format.'); + } const { enforceEmailAsPrimary, flattenProperties } = destination.Config; let customPropertyPayload = {}; const { meta, metadataFields } = getProfileMetadataAndMetadataFields(message); diff --git a/src/v0/destinations/lambda/transform.js b/src/v0/destinations/lambda/transform.js index efc68b89d6f..5f6cbfda8b9 100644 --- a/src/v0/destinations/lambda/transform.js +++ b/src/v0/destinations/lambda/transform.js @@ -1,6 +1,5 @@ const _ = require('lodash'); -const { getErrorRespEvents } = require('@rudderstack/integrations-lib'); -const { getSuccessRespEvents } = require('../../util'); +const { getSuccessRespEvents, getErrorRespEvents } = require('../../util'); const { ConfigurationError } = require('@rudderstack/integrations-lib'); const DEFAULT_INVOCATION_TYPE = 'Event'; // asynchronous invocation diff --git a/src/v0/destinations/marketo/networkHandler.js b/src/v0/destinations/marketo/networkHandler.js index ac555accfe2..f3bb4c9da70 100644 --- a/src/v0/destinations/marketo/networkHandler.js +++ b/src/v0/destinations/marketo/networkHandler.js @@ -1,13 +1,12 @@ -const v0Utils = require('../../util'); const { marketoResponseHandler } = require('./util'); const { proxyRequest, prepareProxyRequest } = require('../../../adapters/network'); const { processAxiosResponse } = require('../../../adapters/utils/networkUtils'); +const { authCache } = require('./transform'); const responseHandler = (responseParams) => { - const { destinationResponse, destType, rudderJobMetadata } = responseParams; + const { destinationResponse, rudderJobMetadata } = responseParams; const message = 'Request Processed Successfully'; const { status } = destinationResponse; - const authCache = v0Utils.getDestAuthCacheInstance(destType); // check for marketo application level failures marketoResponseHandler( destinationResponse, diff --git a/src/v0/destinations/marketo/transform.js b/src/v0/destinations/marketo/transform.js index accca1d4490..683d4bd8ffb 100644 --- a/src/v0/destinations/marketo/transform.js +++ b/src/v0/destinations/marketo/transform.js @@ -7,17 +7,10 @@ const { InstrumentationError, ConfigurationError, UnauthorizedError, - getErrorRespEvents, } = require('@rudderstack/integrations-lib'); const stats = require('../../../util/stats'); const { EventType, MappedToDestinationKey } = require('../../../constants'); -const { - identifyConfig, - formatConfig, - LEAD_LOOKUP_METRIC, - ACTIVITY_METRIC, - FETCH_TOKEN_METRIC, -} = require('./config'); +const { identifyConfig, formatConfig, LEAD_LOOKUP_METRIC, ACTIVITY_METRIC } = require('./config'); const { addExternalIdToTraits, getDestinationExternalIDInfoForRetl, @@ -32,52 +25,17 @@ const { isDefinedAndNotNull, generateErrorObject, handleRtTfSingleEventError, + getErrorRespEvents, } = require('../../util'); const Cache = require('../../util/cache'); const { USER_LEAD_CACHE_TTL, AUTH_CACHE_TTL, JSON_MIME_TYPE } = require('../../util/constant'); -const { - marketoResponseHandler, - sendGetRequest, - sendPostRequest, - getResponseHandlerData, -} = require('./util'); +const { sendGetRequest, sendPostRequest, getResponseHandlerData, getAuthToken } = require('./util'); const logger = require('../../../logger'); const userIdLeadCache = new Cache(USER_LEAD_CACHE_TTL); // 1 day const emailLeadCache = new Cache(USER_LEAD_CACHE_TTL); // 1 day const authCache = new Cache(AUTH_CACHE_TTL); // 1 hr -// ////////////////////////////////////////////////////////////////////// -// BASE URL REF: https://developers.marketo.com/rest-api/base-url/ -// ////////////////////////////////////////////////////////////////////// - -// calls Marketo Auth API and fetches bearer token -// fails the transformer if auth fails -// ------------------------ -// Ref: https://developers.marketo.com/rest-api/authentication/#creating_an_access_token -const getAuthToken = async (formattedDestination, metadata) => - authCache.get(formattedDestination.ID, async () => { - const { accountId, clientId, clientSecret } = formattedDestination; - const clientResponse = await sendGetRequest( - `https://${accountId}.mktorest.com/identity/oauth/token`, - { - params: { - client_id: clientId, - client_secret: clientSecret, - grant_type: 'client_credentials', - }, - }, - metadata, - ); - const data = marketoResponseHandler(clientResponse, 'During fetching auth token'); - if (data) { - stats.increment(FETCH_TOKEN_METRIC, { status: 'success' }); - return { value: data.access_token, age: data.expires_in }; - } - stats.increment(FETCH_TOKEN_METRIC, { status: 'failed' }); - return null; - }); - // lookup Marketo with userId or anonymousId // Marketo will create the lead // fails transformer if lookup fails - fields are not created in Marketo @@ -460,7 +418,7 @@ const processEvent = async ({ message, destination, metadata }, token) => { }; const process = async (event) => { - const token = await getAuthToken(formatConfig(event.destination), event.metadata); + const token = await getAuthToken(authCache, formatConfig(event.destination), event.metadata); if (!token) { throw new UnauthorizedError('Authorization failed'); } @@ -473,7 +431,7 @@ const processRouterDest = async (inputs, reqMetadata) => { // If destination information is not present Error should be thrown let token; try { - token = await getAuthToken(formatConfig(inputs[0].destination), inputs[0].metadata); + token = await getAuthToken(authCache, formatConfig(inputs[0].destination), inputs[0].metadata); // If token is null track/identify calls cannot be executed. if (!token) { diff --git a/src/v0/destinations/marketo/util.js b/src/v0/destinations/marketo/util.js index aee872efac0..1a88653a544 100644 --- a/src/v0/destinations/marketo/util.js +++ b/src/v0/destinations/marketo/util.js @@ -6,6 +6,7 @@ const { UnhandledStatusCodeError, InstrumentationError, } = require('@rudderstack/integrations-lib'); +const stats = require('../../../util/stats'); const { httpGET, httpPOST } = require('../../../adapters/network'); const { getDynamicErrorType, @@ -59,7 +60,7 @@ const MARKETO_THROTTLED_CODES = ['502', '606', '607', '608', '615']; // '1049', // ]; -const { DESTINATION } = require('./config'); +const { DESTINATION, FETCH_TOKEN_METRIC } = require('./config'); const logger = require('../../../logger'); // handles marketo application level failures @@ -72,12 +73,14 @@ const marketoApplicationErrorHandler = (marketoResponse, sourceMessage, destinat 400, marketoResponse, ); - } else if (errors && MARKETO_THROTTLED_CODES.includes(errors[0].code)) { + } + if (errors && MARKETO_THROTTLED_CODES.includes(errors[0].code)) { throw new ThrottledError( `Request Failed for ${destination}, ${errors[0].message} (Throttled).${sourceMessage}`, marketoResponse, ); - } else if (errors && MARKETO_RETRYABLE_CODES.includes(errors[0].code)) { + } + if (errors && MARKETO_RETRYABLE_CODES.includes(errors[0].code)) { throw new RetryableError( `Request Failed for ${destination}, ${errors[0].message} (Retryable).${sourceMessage}`, 500, @@ -283,7 +286,35 @@ const getResponseHandlerData = (clientResponse, lookupMessage, formattedDestinat authCache, ); +// ////////////////////////////////////////////////////////////////////// +// BASE URL REF: https://developers.marketo.com/rest-api/base-url/ +// ////////////////////////////////////////////////////////////////////// + +// calls Marketo Auth API and fetches bearer token +// fails the transformer if auth fails +// ------------------------ +// Ref: https://developers.marketo.com/rest-api/authentication/#creating_an_access_token +const getAuthToken = async (authCache, formattedDestination, metadata) => + authCache.get(formattedDestination.ID, async () => { + const { accountId, clientId, clientSecret } = formattedDestination; + const clientResponse = await sendGetRequest( + `https://${accountId}.mktorest.com/identity/oauth/token`, + { + params: { + client_id: clientId, + client_secret: clientSecret, + grant_type: 'client_credentials', + }, + }, + metadata, + ); + const data = marketoResponseHandler(clientResponse, 'During fetching auth token'); + stats.increment(FETCH_TOKEN_METRIC, { status: 'success' }); + return { value: data.access_token, age: data.expires_in }; + }); + module.exports = { + getAuthToken, marketoResponseHandler, sendGetRequest, sendPostRequest, diff --git a/src/v0/destinations/marketo/util.test.js b/src/v0/destinations/marketo/util.test.js new file mode 100644 index 00000000000..b8ac7970664 --- /dev/null +++ b/src/v0/destinations/marketo/util.test.js @@ -0,0 +1,157 @@ +const { getAuthToken } = require('./util'); +const { httpGET } = require('../../../adapters/network'); +const stats = require('../../../util/stats'); +const { + RetryableError, + filter, + UnhandledStatusCodeError, + ThrottledError, +} = require('@rudderstack/integrations-lib'); + +jest.mock('../../../adapters/network'); +jest.mock('../../../util/stats'); + +describe('getAuthToken', () => { + const mockAuthCache = { + get: jest.fn().mockImplementation(async (key, fn) => fn()), + }; + + const mockFormattedDestination = { + ID: 'test-dest-id', + accountId: 'test-account', + clientId: 'test-client', + clientSecret: 'test-secret', + }; + + const mockMetadata = { + jobId: 'test-job', + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + const testCases = [ + { + name: 'should successfully get auth token', + mockResponse: { + success: true, + response: { + data: { + access_token: 'test-token', + expires_in: 3600, + }, + status: 200, + }, + }, + expectedResult: { + value: 'test-token', + age: 3600, + }, + expectedStats: { + increment: { + metric: 'marketo_fetch_token', + tags: { status: 'success' }, + }, + }, + }, + { + name: 'should handle expired token', + mockResponse: { + success: true, + response: { + data: { + access_token: 'expired-token', + expires_in: 0, + }, + status: 200, + }, + }, + expectedError: new RetryableError( + 'Request Failed for marketo, Access Token Expired (Retryable).During fetching auth token', + 500, + ), + }, + { + name: 'should handle throttled status code', + mockResponse: { + response: { + data: { + errors: [ + { + code: '606', + }, + ], + }, + status: 200, + }, + }, + expectedError: new ThrottledError( + 'Request Failed for marketo, undefined (Throttled).During fetching auth token', + ), + }, + { + name: 'should handle unknown status code', + mockResponse: { + response: { + data: { + errors: [ + { + code: 'unknown-code', + }, + ], + }, + status: 200, + }, + }, + expectedError: new UnhandledStatusCodeError('Error occurred During fetching auth token', { + data: { + errors: [{ code: 'unknown-code' }], + }, + }), + }, + ]; + + filter(testCases).forEach( + ({ name, mockResponse, expectedResult, expectedError, expectedStats }) => { + it(name, async () => { + httpGET.mockResolvedValueOnce(mockResponse); + + if (expectedError) { + await expect( + getAuthToken(mockAuthCache, mockFormattedDestination, mockMetadata), + ).rejects.toThrow(expectedError); + } else { + const result = await getAuthToken(mockAuthCache, mockFormattedDestination, mockMetadata); + expect(result).toEqual(expectedResult); + } + + expect(httpGET).toHaveBeenCalledWith( + 'https://test-account.mktorest.com/identity/oauth/token', + { + params: { + client_id: 'test-client', + client_secret: 'test-secret', + grant_type: 'client_credentials', + }, + }, + { + destType: 'marketo', + feature: 'transformation', + endpointPath: '/v1/leads', + requestMethod: 'GET', + module: 'router', + metadata: mockMetadata, + }, + ); + + if (expectedStats) { + expect(stats.increment).toHaveBeenCalledWith( + expectedStats.increment.metric, + expectedStats.increment.tags, + ); + } + }); + }, + ); +}); diff --git a/src/v0/destinations/marketo_static_list/networkHandler.js b/src/v0/destinations/marketo_static_list/networkHandler.js index 086378cf6ac..2b59c36fafd 100644 --- a/src/v0/destinations/marketo_static_list/networkHandler.js +++ b/src/v0/destinations/marketo_static_list/networkHandler.js @@ -1,14 +1,13 @@ const { marketoResponseHandler } = require('../marketo/util'); const { proxyRequest, prepareProxyRequest } = require('../../../adapters/network'); -const v0Utils = require('../../util'); const { processAxiosResponse } = require('../../../adapters/utils/networkUtils'); const { DESTINATION } = require('./config'); +const { authCache } = require('./util'); const responseHandler = (responseParams) => { - const { destinationResponse, destType, rudderJobMetadata } = responseParams; + const { destinationResponse, rudderJobMetadata } = responseParams; const message = 'Request Processed Successfully'; const { status } = destinationResponse; - const authCache = v0Utils.getDestAuthCacheInstance(destType); // check for marketo application level failures marketoResponseHandler( destinationResponse, diff --git a/src/v0/destinations/marketo_static_list/testData/constants.js b/src/v0/destinations/marketo_static_list/testData/constants.js index 2c420c6bc2a..673db80ac6e 100644 --- a/src/v0/destinations/marketo_static_list/testData/constants.js +++ b/src/v0/destinations/marketo_static_list/testData/constants.js @@ -1,16 +1,20 @@ +const { generateRandomString } = require('@rudderstack/integrations-lib'); + +const clientSecret = generateRandomString(); +const ACCESS_TOKEN = generateRandomString(); const EXTERNAL_ID = 'marketoStaticListId'; -const TOKEN = 'Bearer access_token_success'; +const AUTH_HEADER_TOKEN = `Bearer ${ACCESS_TOKEN}`; const CONTENT_TYPE = 'application/json'; const DEST_CONFIG = { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', - staticListId: 1234, + clientId: 'marketo_static_list_client_id_success', + clientSecret, + accountId: 'marketo_static_list_unit_test_success', + staticListId: 1122, }; const DEST_DEFINITION = { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', - Name: 'MARKETO', - DisplayName: 'Marketo', + Name: 'MARKETO_STATIC_LIST', + DisplayName: 'Marketo Static List', transformAt: 'processor', transformAtV1: 'processor', }; @@ -18,12 +22,7 @@ const DEST_OBJECT = { ID: '1zwa1wKshSt81YksKmUdJnr4IOK', Name: 'test_marketo_rc', DestinationDefinition: DEST_DEFINITION, - Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', - staticListId: 1122, - }, + Config: DEST_CONFIG, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -36,7 +35,8 @@ const MESSAGE_SOURCES_CONTEXT = { module.exports = { EXTERNAL_ID, - TOKEN, + ACCESS_TOKEN, + AUTH_HEADER_TOKEN, CONTENT_TYPE, DEST_OBJECT, DEST_DEFINITION, diff --git a/src/v0/destinations/marketo_static_list/testData/testData.js b/src/v0/destinations/marketo_static_list/testData/testData.js index 45328436ce7..a94a97f4d9c 100644 --- a/src/v0/destinations/marketo_static_list/testData/testData.js +++ b/src/v0/destinations/marketo_static_list/testData/testData.js @@ -1,6 +1,6 @@ const { EXTERNAL_ID, - TOKEN, + AUTH_HEADER_TOKEN, CONTENT_TYPE, DEST_OBJECT, DEST_DEFINITION, @@ -128,9 +128,9 @@ const recordOutput = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/id001/leads.json?id=1001&id=1003', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/id001/leads.json?id=1001&id=1003', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -162,9 +162,9 @@ const recordOutput = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/id002/leads.json?id=2001', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/id002/leads.json?id=2001', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -193,9 +193,9 @@ const recordOutput = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/id002/leads.json?id=1002', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/id002/leads.json?id=1002', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -1375,9 +1375,9 @@ const largeRecordOutput = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=351&id=352&id=353&id=354&id=355&id=356&id=357&id=358&id=359&id=360&id=361&id=362&id=363&id=364&id=365&id=366&id=367&id=368&id=369&id=370&id=371&id=372&id=373&id=374&id=375&id=376&id=377&id=378&id=379&id=380&id=381&id=382&id=383&id=384&id=385&id=386&id=387&id=388&id=389&id=390&id=391&id=392&id=393&id=394&id=395&id=396&id=397&id=398&id=399&id=400&id=401&id=402&id=403&id=404&id=405&id=406&id=407&id=408&id=409&id=410&id=411&id=412&id=413&id=414&id=415&id=416&id=417&id=418&id=419&id=420&id=421&id=422&id=423&id=424&id=425&id=426&id=427&id=428&id=429&id=430&id=431&id=432&id=433&id=434&id=435&id=436&id=437&id=438&id=439&id=440&id=441&id=442&id=443&id=444&id=445&id=446&id=447&id=448&id=449&id=450', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=351&id=352&id=353&id=354&id=355&id=356&id=357&id=358&id=359&id=360&id=361&id=362&id=363&id=364&id=365&id=366&id=367&id=368&id=369&id=370&id=371&id=372&id=373&id=374&id=375&id=376&id=377&id=378&id=379&id=380&id=381&id=382&id=383&id=384&id=385&id=386&id=387&id=388&id=389&id=390&id=391&id=392&id=393&id=394&id=395&id=396&id=397&id=398&id=399&id=400&id=401&id=402&id=403&id=404&id=405&id=406&id=407&id=408&id=409&id=410&id=411&id=412&id=413&id=414&id=415&id=416&id=417&id=418&id=419&id=420&id=421&id=422&id=423&id=424&id=425&id=426&id=427&id=428&id=429&id=430&id=431&id=432&id=433&id=434&id=435&id=436&id=437&id=438&id=439&id=440&id=441&id=442&id=443&id=444&id=445&id=446&id=447&id=448&id=449&id=450', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -1703,9 +1703,9 @@ const largeRecordOutput = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299&id=300', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299&id=300', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -1722,9 +1722,9 @@ const largeRecordOutput = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -2803,9 +2803,9 @@ const mixedBatchOutput = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=911&id=912&id=913&id=914&id=915&id=916&id=917&id=918&id=919&id=920', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=911&id=912&id=913&id=914&id=915&id=916&id=917&id=918&id=919&id=920', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -2861,9 +2861,9 @@ const mixedBatchOutput = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=901&id=902&id=903&id=904&id=905&id=906&id=907&id=908&id=909&id=910', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=901&id=902&id=903&id=904&id=905&id=906&id=907&id=908&id=909&id=910', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -2919,9 +2919,9 @@ const mixedBatchOutput = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=704&id=705&id=706', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=704&id=705&id=706', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -2938,9 +2938,9 @@ const mixedBatchOutput = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=501&id=502&id=503', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=501&id=502&id=503', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -2977,9 +2977,9 @@ const mixedBatchOutput = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -2996,9 +2996,9 @@ const mixedBatchOutput = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=300&id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', + 'https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=300&id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', headers: { - Authorization: TOKEN, + Authorization: AUTH_HEADER_TOKEN, 'Content-Type': CONTENT_TYPE, }, params: {}, @@ -3037,12 +3037,7 @@ const recordEventGenerator = (id, action, externalId) => { ID: '1zwa1wKshSt81YksKmUdJnr4IOK', Name: 'test_marketo_rc', DestinationDefinition: DEST_DEFINITION, - Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', - staticListId: 1122, - }, + Config: DEST_CONFIG, Enabled: true, Transformations: [], IsProcessorEnabled: true, diff --git a/src/v0/destinations/marketo_static_list/transform.js b/src/v0/destinations/marketo_static_list/transform.js index 810b528bbf1..c6f55c473cf 100644 --- a/src/v0/destinations/marketo_static_list/transform.js +++ b/src/v0/destinations/marketo_static_list/transform.js @@ -1,26 +1,20 @@ const lodash = require('lodash'); const cloneDeep = require('lodash/cloneDeep'); -const { - InstrumentationError, - UnauthorizedError, - getErrorRespEvents, -} = require('@rudderstack/integrations-lib'); +const { InstrumentationError, UnauthorizedError } = require('@rudderstack/integrations-lib'); const { defaultPostRequestConfig, defaultDeleteRequestConfig, generateErrorObject, simpleProcessRouterDest, + getErrorRespEvents, } = require('../../util'); -const { AUTH_CACHE_TTL, JSON_MIME_TYPE } = require('../../util/constant'); -const { getIds, validateMessageType } = require('./util'); +const { JSON_MIME_TYPE } = require('../../util/constant'); +const { getIds, validateMessageType, authCache } = require('./util'); const { getDestinationExternalID, defaultRequestConfig } = require('../../util'); const { formatConfig, MAX_LEAD_IDS_SIZE } = require('./config'); -const Cache = require('../../util/cache'); -const { getAuthToken } = require('../marketo/transform'); +const { getAuthToken } = require('../marketo/util'); const { processRecordInputs } = require('./transformV2'); -const authCache = new Cache(AUTH_CACHE_TTL); // 1 hr - const responseBuilder = (endPoint, leadIds, operation, token) => { let updatedEndpoint = endPoint; if (leadIds.length > 0) { @@ -93,7 +87,7 @@ const processEvent = (event) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const process = async (event, _processParams) => { - const token = await getAuthToken(formatConfig(event.destination), event.metadata); + const token = await getAuthToken(authCache, formatConfig(event.destination), event.metadata); if (!token) { throw new UnauthorizedError('Authorization failed'); } @@ -108,7 +102,7 @@ const processRouterDest = async (inputs, reqMetadata) => { const { destination, metadata } = inputs[0]; try { - const token = await getAuthToken(formatConfig(destination), metadata); + const token = await getAuthToken(authCache, formatConfig(destination), metadata); if (!token) { throw new UnauthorizedError('Could not retrieve authorisation token'); } diff --git a/src/v0/destinations/marketo_static_list/transform.test.js b/src/v0/destinations/marketo_static_list/transform.test.js deleted file mode 100644 index 3c387c42957..00000000000 --- a/src/v0/destinations/marketo_static_list/transform.test.js +++ /dev/null @@ -1,138 +0,0 @@ -const { processRouterDest } = require('./transform'); -const axios = require('axios'); -const MockAxiosAdapter = require('axios-mock-adapter'); -const { - recordInputs, - audiencelistInputs, - reqMetadata, - recordOutput, - largeRecordOutput, - mixedBatchOutput, - recordEventGenerator, -} = require('./testData/testData'); - -const mockAdapter = new MockAxiosAdapter(axios, { onNoMatch: 'throwException' }); -beforeAll(() => { - mockAdapter - .onGet('https://marketo_acct_id_success.mktorest.com/identity/oauth/token') - .reply(200, { access_token: 'access_token_success' }); -}); -describe('Unit cases covering the router flow for both record and audiencelist event types', () => { - it('Sending a small batch of only record events (4 events)', async () => { - const inputs = recordInputs; - const result = await processRouterDest(inputs, reqMetadata); - - // assert that the result is as expected - expect(result.length).toEqual(3); - expect(result[0].batchedRequest.length).toEqual(1); // 1 batched request for 2 record events - expect(result[1].batchedRequest.length).toEqual(1); // 1 batched request for 1 record events - expect(result[2].batchedRequest.length).toEqual(1); // 1 batched request for 1 record events - expect(result[0].batchedRequest[0].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/id001/leads.json?id=1001&id=1003', - ); // 1 api call for 2 leadIds - expect(result[1].batchedRequest[0].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/id002/leads.json?id=2001', - ); // 1 api call for 1 leadId - expect(result[2].batchedRequest[0].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/id002/leads.json?id=1002', - ); // 1 api call for 1 leadId - expect(result[1].batchedRequest[0].method).toEqual('DELETE'); // DELETE requests are sent first - expect(result[0].metadata.length).toEqual(2); // 2 metadata objects for 2 record events - expect(result[1].metadata.length).toEqual(1); // 1 metadata object for 1 record event - expect(result[2].metadata.length).toEqual(1); // 1 metadata object for 1 record event - expect(result).toEqual(recordOutput); // overall result should be equal to the expected output - }); - - it('Sending a large batch of only record events (450 events: 350 inserts | 100 deletes )', async () => { - const largeRecordInputs = []; - for (let index = 0; index < 350; index++) { - largeRecordInputs.push(recordEventGenerator(index + 1, 'insert', 1122)); - } - for (let index = 350; index < 450; index++) { - largeRecordInputs.push(recordEventGenerator(index + 1, 'delete', 1122)); - } - const result = await processRouterDest(largeRecordInputs, reqMetadata); - - // assert that the result is as expected - /* - Total 3 API calls - 1. 1 API call for 100 DELETE requests - 2. 1 API call for 100 POST requests = limit reached for Marketo, leads split to next API call - 3. 1 API call for 50 POST requests - */ - expect(result.length).toEqual(2); - expect(result[0].batchedRequest.length).toEqual(1); // 1 batched request for 1 record event - expect(result[1].batchedRequest.length).toEqual(2); // 1 batched request for 2 record events - expect(result[0].batchedRequest[0].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=351&id=352&id=353&id=354&id=355&id=356&id=357&id=358&id=359&id=360&id=361&id=362&id=363&id=364&id=365&id=366&id=367&id=368&id=369&id=370&id=371&id=372&id=373&id=374&id=375&id=376&id=377&id=378&id=379&id=380&id=381&id=382&id=383&id=384&id=385&id=386&id=387&id=388&id=389&id=390&id=391&id=392&id=393&id=394&id=395&id=396&id=397&id=398&id=399&id=400&id=401&id=402&id=403&id=404&id=405&id=406&id=407&id=408&id=409&id=410&id=411&id=412&id=413&id=414&id=415&id=416&id=417&id=418&id=419&id=420&id=421&id=422&id=423&id=424&id=425&id=426&id=427&id=428&id=429&id=430&id=431&id=432&id=433&id=434&id=435&id=436&id=437&id=438&id=439&id=440&id=441&id=442&id=443&id=444&id=445&id=446&id=447&id=448&id=449&id=450', - ); - expect(result[1].batchedRequest[0].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299&id=300', - ); - expect(result[1].batchedRequest[1].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', - ); - expect(result[0].batchedRequest[0].method).toEqual('DELETE'); // DELETE requests are sent first - expect(result[1].batchedRequest[0].method).toEqual('POST'); - expect(result[1].batchedRequest[1].method).toEqual('POST'); - expect(result[0].metadata.length).toEqual(100); // 100 metadata objects for 100 record events - expect(result[1].metadata.length).toEqual(350); // 350 metadata objects for 350 record events - expect(result).toEqual(largeRecordOutput); // overall result should be equal to the expected output - }); - - it('Sending a mixed batch of record and audiencelist events (22 events: 10 inserts | 10 deletes | 2 audiencelist (⌐■_■) )', async () => { - const mixedBatchInputs = []; - for (let index = 900; index < 910; index++) { - mixedBatchInputs.push(recordEventGenerator(index + 1, 'insert', 1122)); - } - for (let index = 910; index < 920; index++) { - mixedBatchInputs.push(recordEventGenerator(index + 1, 'delete', 1122)); - } - mixedBatchInputs.push(...audiencelistInputs); - const result = await processRouterDest(mixedBatchInputs, reqMetadata); - - // assert that the result is as expected - /* - Total 4 API calls - 1. 1 API call for 10 DELETE requests - 2. 1 API call for 10 POST requests = limit reached for Marketo, leads split to next API call - 3. 1 API call for 2 POST requests - 4. 1 API call for 2 POST requests - */ - expect(result.length).toEqual(4); - expect(result[0].batchedRequest.length).toEqual(1); // 1 batched request for 1 record event - expect(result[1].batchedRequest.length).toEqual(1); // 1 batched request for 1 record event - expect(result[2].batchedRequest.length).toEqual(2); // 1 batched request for 2 audiencelist events - expect(result[3].batchedRequest.length).toEqual(2); // 1 batched request for 2 audiencelist events - expect(result[0].batchedRequest[0].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=911&id=912&id=913&id=914&id=915&id=916&id=917&id=918&id=919&id=920', - ); - expect(result[1].batchedRequest[0].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=901&id=902&id=903&id=904&id=905&id=906&id=907&id=908&id=909&id=910', - ); - expect(result[2].batchedRequest[0].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=704&id=705&id=706', - ); - expect(result[2].batchedRequest[1].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=501&id=502&id=503', - ); - expect(result[3].batchedRequest[0].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', - ); - expect(result[2].batchedRequest[1].endpoint).toEqual( - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=501&id=502&id=503', - ); - expect(result[0].batchedRequest[0].method).toEqual('DELETE'); // DELETE requests are sent first - expect(result[1].batchedRequest[0].method).toEqual('POST'); - expect(result[1].batchedRequest[0].method).toEqual('POST'); - expect(result[2].batchedRequest[0].method).toEqual('DELETE'); - expect(result[0].metadata.length).toEqual(10); - expect(result[1].metadata.length).toEqual(10); - expect(result[2].metadata.length).toEqual(1); - expect(result[3].metadata.length).toEqual(1); - expect(result).toEqual(mixedBatchOutput); // overall result should be equal to the expected output - }); -}); -afterAll(() => { - mockAdapter.restore(); -}); diff --git a/src/v0/destinations/marketo_static_list/transformV2.js b/src/v0/destinations/marketo_static_list/transformV2.js index 73d4bec8f81..0c58ab2a5ab 100644 --- a/src/v0/destinations/marketo_static_list/transformV2.js +++ b/src/v0/destinations/marketo_static_list/transformV2.js @@ -1,9 +1,5 @@ const lodash = require('lodash'); -const { - InstrumentationError, - UnauthorizedError, - getErrorRespEvents, -} = require('@rudderstack/integrations-lib'); +const { InstrumentationError, UnauthorizedError } = require('@rudderstack/integrations-lib'); const { defaultPostRequestConfig, defaultDeleteRequestConfig, @@ -11,11 +7,13 @@ const { getSuccessRespEvents, isDefinedAndNotNull, generateErrorObject, + getErrorRespEvents, } = require('../../util'); const { JSON_MIME_TYPE } = require('../../util/constant'); const { MAX_LEAD_IDS_SIZE } = require('./config'); -const { getAuthToken } = require('../marketo/transform'); +const { getAuthToken } = require('../marketo/util'); const { formatConfig } = require('../marketo/config'); +const { authCache } = require('./util'); /** * Generates the final response structure to be sent to the destination @@ -76,7 +74,7 @@ const batchResponseBuilder = (listId, Config, token, leadIds, operation) => { * @returns An array containing the batched responses for the insert and delete actions along with the metadata. */ async function processRecordInputs(groupedRecordInputs, destination, listId) { - const token = await getAuthToken(formatConfig(destination)); + const token = await getAuthToken(authCache, formatConfig(destination)); if (!token) { throw new UnauthorizedError('Authorization failed'); } diff --git a/src/v0/destinations/marketo_static_list/util.js b/src/v0/destinations/marketo_static_list/util.js index c6959cb2564..39cc6c147e3 100644 --- a/src/v0/destinations/marketo_static_list/util.js +++ b/src/v0/destinations/marketo_static_list/util.js @@ -1,5 +1,9 @@ /* eslint-disable unicorn/consistent-destructuring */ const { InstrumentationError } = require('@rudderstack/integrations-lib'); +const Cache = require('../../util/cache'); +const { AUTH_CACHE_TTL } = require('../../util/constant'); + +const authCache = new Cache(AUTH_CACHE_TTL); // 1 hr /** * Fetches the ids from the array of objects @@ -38,4 +42,5 @@ const validateMessageType = (message, allowedTypes) => { module.exports = { getIds, validateMessageType, + authCache, }; diff --git a/src/v0/destinations/mautic/utils.js b/src/v0/destinations/mautic/utils.js index fc9654d2e3a..061c91f3578 100644 --- a/src/v0/destinations/mautic/utils.js +++ b/src/v0/destinations/mautic/utils.js @@ -1,5 +1,6 @@ /* eslint-disable no-return-assign, no-param-reassign, no-restricted-syntax */ const get = require('get-value'); +const validator = require('validator'); const { NetworkError, InstrumentationError, @@ -24,15 +25,7 @@ const { JSON_MIME_TYPE } = require('../../util/constant'); function createAxiosUrl(propertyName, value, baseUrl) { return `${baseUrl}/contacts?where%5B0%5D%5Bcol%5D=${propertyName}&where%5B0%5D%5Bexpr%5D=eq&where%5B0%5D%5Bval%5D=${value}`; } -/** - * @param {*} inputText - * @returns Boolean Value - * for validating email match - */ -function validateEmail(inputText) { - const mailformat = /^[\d%+._a-z-]+@[\d.a-z-]+\.[a-z]{2,3}$/; - return mailformat.test(inputText); -} + /** * @param {*} message * @param {*} lookUpField @@ -126,7 +119,7 @@ const validatePayload = (payload) => { throw new InstrumentationError('The provided phone number is invalid'); } - if (payload.email && !validateEmail(payload.email)) { + if (payload.email && !validator.isEmail(payload.email)) { throw new InstrumentationError('The provided email is invalid'); } return true; @@ -220,7 +213,6 @@ const getEndpoint = (Config) => { }; module.exports = { deduceStateField, - validateEmail, validatePhone, deduceAddressFields, validateGroupCall, diff --git a/src/v0/destinations/moengage/config.js b/src/v0/destinations/moengage/config.js index 95aa6c0f89f..98efac4f166 100644 --- a/src/v0/destinations/moengage/config.js +++ b/src/v0/destinations/moengage/config.js @@ -24,6 +24,7 @@ const endpointIND = { alias: `https://api-03.moengage.com/v1/customer/merge?app_id=`, }; +// moengage supports object types, we added a new mapping for identify, track and device to support object data type const CONFIG_CATEGORIES = { IDENTIFY: { type: 'identify', name: 'MOENGAGEIdentifyConfig' }, TRACK: { type: 'track', name: 'MOENGAGETrackConfig' }, @@ -32,14 +33,26 @@ const CONFIG_CATEGORIES = { type: 'identifyAttr', name: 'MOENGAGEIdentifyAttributesConfig', }, + IDENTIFY_ATTR_OBJ: { + type: 'identifyAttr', + name: 'MOENGAGEIdentifyAttributesObjectConfig', + }, DEVICE_ATTR: { type: 'deviceAttr', name: 'MOENGAGEDeviceAttributesConfig', }, + DEVICE_ATTR_OBJ: { + type: 'deviceAttr', + name: 'MOENGAGEDeviceAttributesObjectConfig', + }, TRACK_ATTR: { type: 'trackAttr', name: 'MOENGAGETrackAttributesConfig', }, + TRACK_ATTR_OBJ: { + type: 'trackAttrObj', + name: 'MOENGAGETrackAttributesObjectConfig', + }, ALIAS: { type: 'alias', name: 'MoEngageAliasConfig' }, }; diff --git a/src/v0/destinations/moengage/data/MOENGAGEDeviceAttributesObjectConfig.json b/src/v0/destinations/moengage/data/MOENGAGEDeviceAttributesObjectConfig.json new file mode 100644 index 00000000000..d7578a4d522 --- /dev/null +++ b/src/v0/destinations/moengage/data/MOENGAGEDeviceAttributesObjectConfig.json @@ -0,0 +1,45 @@ +[ + { + "destKey": "platform", + "sourceKeys": ["context.device.type", "channel"], + "required": true + }, + { + "destKey": "push_id", + "sourceKeys": "context.device.token", + "required": true + }, + { + "destKey": "model", + "sourceKeys": "context.device.model", + "required": false + }, + { + "destKey": "push_preference", + "sourceKeys": ["properties.push_preference", "properties.pushPreference"], + "required": false + }, + { + "destKey": "app_version", + "sourceKeys": "context.app.version", + "required": false + }, + { + "destKey": "os_version", + "sourceKeys": "context.os.version", + "required": false + }, + { + "destKey": "active", + "sourceKeys": "properties.active", + "required": false + }, + { + "destKey": "data", + "sourceKeys": "properties", + "required": false, + "metadata": { + "excludes": ["active", "push_preference", "id", "_id", "pushPreference"] + } + } +] diff --git a/src/v0/destinations/moengage/data/MOENGAGEIdentifyAttributesObjectConfig.json b/src/v0/destinations/moengage/data/MOENGAGEIdentifyAttributesObjectConfig.json new file mode 100644 index 00000000000..5b0d9310c7d --- /dev/null +++ b/src/v0/destinations/moengage/data/MOENGAGEIdentifyAttributesObjectConfig.json @@ -0,0 +1,149 @@ +[ + { + "destKey": "name", + "sourceKeys": ["traits.name", "context.traits.name"], + "required": false, + "metadata": { + "type": "toString" + } + }, + { + "destKey": "first_name", + "sourceKeys": [ + "traits.firstname", + "traits.first_name", + "traits.firstName", + "context.traits.firstname", + "context.traits.first_name", + "context.traits.firstName" + ], + "required": false, + "metadata": { + "type": "toString" + } + }, + { + "destKey": "last_name", + "sourceKeys": [ + "traits.lastname", + "traits.last_name", + "traits.lastName", + "context.traits.lastname", + "context.traits.last_name", + "context.traits.lastName" + ], + "required": false, + "metadata": { + "type": "toString" + } + }, + { + "destKey": "email", + "sourceKeys": ["traits.email", "context.traits.email"], + "required": false, + "metadata": { + "type": "toString" + } + }, + { + "destKey": "age", + "sourceKeys": ["traits.age", "context.traits.age"], + "required": false, + "metadata": { + "type": "toNumber" + } + }, + { + "destKey": "gender", + "sourceKeys": ["traits.gender", "context.traits.gender"], + "required": false, + "metadata": { + "type": "toString" + } + }, + { + "destKey": "mobile", + "sourceKeys": ["traits.mobile", "context.traits.mobile"], + "required": false, + "metadata": { + "type": "toString" + } + }, + { + "destKey": "source", + "sourceKeys": ["traits.source", "context.traits.source"], + "required": false, + "metadata": { + "type": "toString" + } + }, + { + "destKey": "created_time", + "sourceKeys": ["traits.createdAt", "context.traits.createdAt"], + "required": false + }, + { + "destKey": "last_seen", + "sourceKeys": [ + "traits.last_seen", + "context.traits.last_seen", + "traits.lastSeen", + "context.traits.lastSeen" + ], + "required": false + }, + { + "destKey": "transactions", + "sourceKeys": ["traits.transactions", "context.traits.transactions"], + "required": false, + "metadata": { + "type": "toNumber" + } + }, + { + "destKey": "revenue", + "sourceKeys": ["traits.revenue", "context.traits.revenue"], + "required": false, + "metadata": { + "type": "toNumber" + } + }, + { + "destKey": "moe_unsubscribe", + "sourceKeys": [ + "traits.moe_unsubscribe", + "context.traits.moe_unsubscribe", + "traits.moeUnsubscribe", + "context.traits.moeUnsubscribe" + ], + "required": false + }, + { + "destKey": "data", + "sourceKeys": ["traits", "context.traits"], + "required": false, + "metadata": { + "excludes": [ + "_id", + "age", + "email", + "firstName", + "first_name", + "firstname", + "gender", + "id", + "lastName", + "lastSeen", + "last_name", + "last_seen", + "lastname", + "mobile", + "moeUnsubscribe", + "moe_unsubscribe", + "revenue", + "source", + "transactions" + ] + } + } +] diff --git a/src/v0/destinations/moengage/data/MOENGAGETrackAttributesObjectConfig.json b/src/v0/destinations/moengage/data/MOENGAGETrackAttributesObjectConfig.json new file mode 100644 index 00000000000..cb08c38e48e --- /dev/null +++ b/src/v0/destinations/moengage/data/MOENGAGETrackAttributesObjectConfig.json @@ -0,0 +1,35 @@ +[ + { + "destKey": "action", + "sourceKeys": "event", + "required": true + }, + { + "destKey": "attributes", + "sourceKeys": "properties", + "required": false + }, + { + "destKey": "platform", + "sourceKeys": ["context.device.type", "channel"], + "required": false + }, + { + "destKey": "app_version", + "sourceKeys": "context.app.version", + "required": false + }, + { + "destKey": "current_time", + "sourceKeys": ["timestamp", "originalTimestamp"], + "required": false + }, + { + "destKey": "user_timezone_offset", + "sourceKeys": "context.timezone", + "required": false, + "metadata": { + "type": "getOffsetInSec" + } + } +] diff --git a/src/v0/destinations/moengage/transform.js b/src/v0/destinations/moengage/transform.js index 8a16d9c7a71..2b094067592 100644 --- a/src/v0/destinations/moengage/transform.js +++ b/src/v0/destinations/moengage/transform.js @@ -3,6 +3,8 @@ const { ConfigurationError, TransformationError, InstrumentationError, + isObject, + isEmptyObject, } = require('@rudderstack/integrations-lib'); const { EventType } = require('../../../constants'); const { @@ -23,24 +25,92 @@ const { } = require('../../util'); const { JSON_MIME_TYPE } = require('../../util/constant'); -function responseBuilderSimple(message, category, destination) { - const payload = constructPayload(message, MAPPING_CONFIG[category.name]); - const { apiId, region, apiKey } = destination.Config; - const response = defaultRequestConfig(); - // check the region and which api end point should be used +// moengage supports object type, if user enables object data type we merge the custom attributes +// ref: https://help.moengage.com/hc/en-us/articles/29787626775828-Support-for-Object-Data-Type +const mergeCustomAttributes = (attributes) => { + if (!attributes.data) { + return attributes; + } + const { data, ...rest } = attributes; + return isObject(data) ? { ...rest, ...data } : rest; +}; + +// check the region and which api end point should be used +const getCommonDestinationEndpoint = ({ apiId, region, category }) => { switch (region) { case 'EU': - response.endpoint = `${endpointEU[category.type]}${apiId}`; - break; + return `${endpointEU[category.type]}${apiId}`; case 'US': - response.endpoint = `${endpointUS[category.type]}${apiId}`; - break; + return `${endpointUS[category.type]}${apiId}`; case 'IND': - response.endpoint = `${endpointIND[category.type]}${apiId}`; - break; + return `${endpointIND[category.type]}${apiId}`; default: throw new ConfigurationError('The region is not valid'); } +}; + +const createDestinationPayload = ({ message, category, useObjectData }) => { + const payload = {}; + const setPayloadAttributes = (configCategory) => { + payload.attributes = constructPayload(message, MAPPING_CONFIG[configCategory]); + payload.attributes = useObjectData + ? mergeCustomAttributes(payload.attributes) + : flattenJson(payload.attributes); + }; + + switch (category.type) { + case 'identify': + // Track User + payload.type = 'customer'; + setPayloadAttributes( + useObjectData + ? CONFIG_CATEGORIES.IDENTIFY_ATTR_OBJ.name + : CONFIG_CATEGORIES.IDENTIFY_ATTR.name, + ); + return payload; + case 'device': + // Track Device + payload.type = 'device'; + setPayloadAttributes( + useObjectData ? CONFIG_CATEGORIES.DEVICE_ATTR_OBJ.name : CONFIG_CATEGORIES.DEVICE_ATTR.name, + ); + + if (isAppleFamily(payload.attributes?.platform)) { + payload.attributes.platform = 'iOS'; + } + return payload; + case 'track': + // Create Event + payload.type = 'event'; + payload.actions = [ + constructPayload( + message, + useObjectData + ? MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK_ATTR_OBJ.name] + : MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK_ATTR.name], + ), + ]; + + if (isAppleFamily(payload.actions[0]?.platform)) { + payload.actions[0].platform = 'iOS'; + } + return payload; + default: + throw new InstrumentationError(`Event type ${category.type} is not supported`); + } +}; + +function responseBuilderSimple(message, category, destination) { + // preparing base payload with mandatory fields + const basePayload = constructPayload(message, MAPPING_CONFIG[category.name]); + if (!basePayload) { + // fail-safety for developer error + throw new TransformationError('Base payload could not be constructed'); + } + + const { apiId, region, apiKey, useObjectData } = destination.Config; + const response = defaultRequestConfig(); + response.endpoint = getCommonDestinationEndpoint({ apiId, region, category }); response.method = defaultPostRequestConfig.requestMethod; response.headers = { 'Content-Type': JSON_MIME_TYPE, @@ -49,59 +119,19 @@ function responseBuilderSimple(message, category, destination) { // using base64 and prepends it with the string 'Basic '. Authorization: `Basic ${btoa(`${apiId}:${apiKey}`)}`, }; - response.userId = message.anonymousId || message.userId; - if (payload) { - switch (category.type) { - case 'identify': - // Ref: https://docs.moengage.com/docs/data-import-apis#user-api - payload.type = 'customer'; - payload.attributes = constructPayload( - message, - MAPPING_CONFIG[CONFIG_CATEGORIES.IDENTIFY_ATTR.name], - ); - // nested attributes are not by moengage so it is falttened - payload.attributes = flattenJson(payload.attributes); - break; - case 'device': - // Ref: https://docs.moengage.com/docs/data-import-apis#device-api - payload.type = 'device'; - payload.attributes = constructPayload( - message, - MAPPING_CONFIG[CONFIG_CATEGORIES.DEVICE_ATTR.name], - ); - // nested attributes are not by moengage so it is falttened - payload.attributes = flattenJson(payload.attributes); - - // Ref - https://developers.moengage.com/hc/en-us/articles/4413167466260-Device- - if (isAppleFamily(payload.attributes?.platform)) { - payload.attributes.platform = 'iOS'; - } - break; - case 'track': - // Ref: https://docs.moengage.com/docs/data-import-apis#event-api - payload.type = 'event'; - payload.actions = [ - constructPayload(message, MAPPING_CONFIG[CONFIG_CATEGORIES.TRACK_ATTR.name]), - ]; + response.userId = message.userId || message.anonymousId; - // Ref - https://developers.moengage.com/hc/en-us/articles/4413174104852-Event- - if (isAppleFamily(payload.actions[0]?.platform)) { - payload.actions[0].platform = 'iOS'; - } - break; - case EventType.ALIAS: - // clean as per merge user call in moengage - delete response.headers['MOE-APPKEY']; - break; - default: - throw new InstrumentationError(`Event type ${category.type} is not supported`); - } - - response.body.JSON = removeUndefinedAndNullValues(payload); - } else { - // fail-safety for developer error + if (category.type === 'alias') { + delete response.headers['MOE-APPKEY']; + response.body.JSON = removeUndefinedAndNullValues(basePayload); + return response; + } + + const payload = createDestinationPayload({ message, category, useObjectData }); + if (isEmptyObject(payload)) { throw new TransformationError('Payload could not be constructed'); } + response.body.JSON = removeUndefinedAndNullValues({ ...basePayload, ...payload }); return response; } @@ -153,4 +183,9 @@ const processRouterDest = async (inputs, reqMetadata) => { return respList; }; -module.exports = { process, processRouterDest }; +module.exports = { + process, + processRouterDest, + mergeCustomAttributes, + getCommonDestinationEndpoint, +}; diff --git a/src/v0/destinations/moengage/transform.test.js b/src/v0/destinations/moengage/transform.test.js new file mode 100644 index 00000000000..54ad7bc9f50 --- /dev/null +++ b/src/v0/destinations/moengage/transform.test.js @@ -0,0 +1,74 @@ +const { mergeCustomAttributes, getCommonDestinationEndpoint } = require('./transform'); +const { endpointEU, endpointUS, endpointIND } = require('./config'); +const { ConfigurationError } = require('@rudderstack/integrations-lib'); + +describe('mergeCustomAttributes', () => { + test('should return attributes as is if data is not present', () => { + const attributes = { key1: 'value1', key2: 'value2' }; + const result = mergeCustomAttributes(attributes); + expect(result).toEqual(attributes); + }); + + test('should merge data into attributes if data is an object', () => { + const attributes = { key1: 'value1', data: { key2: 'value2', key3: 'value3' } }; + const result = mergeCustomAttributes(attributes); + expect(result).toEqual({ key1: 'value1', key2: 'value2', key3: 'value3' }); + }); + + test('should return attributes without data if data is not an object', () => { + const attributes = { key1: 'value1', data: 'notAnObject' }; + const result = mergeCustomAttributes(attributes); + expect(result).toEqual({ key1: 'value1' }); + }); + + test('should handle empty attributes', () => { + const attributes = {}; + const result = mergeCustomAttributes(attributes); + expect(result).toEqual(attributes); + }); + + test('should handle attributes with empty data object', () => { + const attributes = { key1: 'value1', data: {} }; + const result = mergeCustomAttributes(attributes); + expect(result).toEqual({ key1: 'value1' }); + }); +}); + +describe('getCommonDestinationEndpoint', () => { + test('should return EU endpoint', () => { + const result = getCommonDestinationEndpoint({ + apiId: 'testApiId', + region: 'EU', + category: { type: 'identify' }, + }); + expect(result).toBe(endpointEU.identify + 'testApiId'); + }); + + test('should return US endpoint', () => { + const result = getCommonDestinationEndpoint({ + apiId: 'testApiId', + region: 'US', + category: { type: 'track' }, + }); + expect(result).toBe(endpointUS.track + 'testApiId'); + }); + + test('should return IND endpoint', () => { + const result = getCommonDestinationEndpoint({ + apiId: 'testApiId', + region: 'IND', + category: { type: 'device' }, + }); + expect(result).toBe(endpointIND.device + 'testApiId'); + }); + + test('should throw ConfigurationError for invalid region', () => { + expect(() => { + getCommonDestinationEndpoint({ + apiId: 'testApiId', + region: 'INVALID', + category: { type: 'identify' }, + }); + }).toThrow(new ConfigurationError('The region is not valid')); + }); +}); diff --git a/src/v0/destinations/mp/data/MPEventPropertiesConfig.json b/src/v0/destinations/mp/data/MPEventPropertiesConfig.json index 956b60248eb..bed246bc7be 100644 --- a/src/v0/destinations/mp/data/MPEventPropertiesConfig.json +++ b/src/v0/destinations/mp/data/MPEventPropertiesConfig.json @@ -76,11 +76,11 @@ "destKey": "mp_lib" }, { - "sourceKeys": "context.page.initialReferrer", + "sourceKeys": ["context.page.initialReferrer", "context.page.initial_referrer"], "destKey": "$initial_referrer" }, { - "sourceKeys": "context.page.initialReferringDomain", + "sourceKeys": ["context.page.initialReferringDomain", "context.page.initial_referring_domain"], "destKey": "$initial_referring_domain" }, { diff --git a/src/v0/destinations/mp/data/MPProfilePropertiesIOS.json b/src/v0/destinations/mp/data/MPProfilePropertiesIOS.json index 7220ebda231..0ffffdefc19 100644 --- a/src/v0/destinations/mp/data/MPProfilePropertiesIOS.json +++ b/src/v0/destinations/mp/data/MPProfilePropertiesIOS.json @@ -12,11 +12,11 @@ "destKey": "$ios_version" }, { - "sourceKeys": "context.app.build", + "sourceKeys": "context.app.version", "destKey": "$ios_app_release" }, { - "sourceKeys": "context.app.version", + "sourceKeys": "context.app.build", "destKey": "$ios_app_version" }, { diff --git a/src/v0/destinations/mp/transform.js b/src/v0/destinations/mp/transform.js index 02eca8ed22f..1860f9c9db8 100644 --- a/src/v0/destinations/mp/transform.js +++ b/src/v0/destinations/mp/transform.js @@ -163,9 +163,14 @@ const getEventValueForTrackEvent = (message, destination) => { } const unixTimestamp = toUnixTimestampInMS(message.timestamp || message.originalTimestamp); + + const traits = destination.Config?.dropTraitsInTrackEvent + ? {} + : { ...message?.context?.traits }; + let properties = { ...message.properties, - ...get(message, 'context.traits'), + ...traits, ...mappedProperties, token: destination.Config.token, distinct_id: message.userId || message.anonymousId, diff --git a/src/v0/destinations/mp/util.js b/src/v0/destinations/mp/util.js index b2807d6e119..50a8f9ac2b8 100644 --- a/src/v0/destinations/mp/util.js +++ b/src/v0/destinations/mp/util.js @@ -17,6 +17,7 @@ const { isObject, isDefinedAndNotNullAndNotEmpty, isDefinedAndNotNull, + removeUndefinedValues, } = require('../../util'); const { ConfigCategory, @@ -32,6 +33,30 @@ const mPProfileAndroidConfigJson = mappingConfig[ConfigCategory.PROFILE_ANDROID. const mPProfileIosConfigJson = mappingConfig[ConfigCategory.PROFILE_IOS.name]; const mPSetOnceConfigJson = mappingConfig[ConfigCategory.SET_ONCE.name]; +/** + * This method populates the payload with device fields based on mp mapping + * @param message + * @param rawPayload + * @returns + */ +const populateDeviceFieldsInPayload = (message, rawPayload) => { + const device = get(message, 'context.device'); + let payload = {}; + let updatedRawPayload = { ...rawPayload }; + if (device) { + const deviceTokenArray = isDefinedAndNotNull(device.token) ? [device.token] : undefined; + if (isAppleFamily(device.type)) { + payload = constructPayload(message, mPProfileIosConfigJson); + updatedRawPayload.$ios_devices = deviceTokenArray; + } else if (device.type?.toLowerCase() === 'android') { + payload = constructPayload(message, mPProfileAndroidConfigJson); + updatedRawPayload.$android_devices = deviceTokenArray; + } + updatedRawPayload = removeUndefinedValues(updatedRawPayload); + } + return { ...updatedRawPayload, ...payload }; +}; + /** * this function has been used to create * @param {*} message rudderstack identify payload @@ -75,18 +100,8 @@ const getTransformedJSON = (message, mappingJson, useNewMapping) => { } } - const device = get(message, 'context.device'); - if (device && device.token) { - let payload; - if (isAppleFamily(device.type)) { - payload = constructPayload(message, mPProfileIosConfigJson); - rawPayload.$ios_devices = [device.token]; - } else if (device.type.toLowerCase() === 'android') { - payload = constructPayload(message, mPProfileAndroidConfigJson); - rawPayload.$android_devices = [device.token]; - } - rawPayload = { ...rawPayload, ...payload }; - } + rawPayload = populateDeviceFieldsInPayload(message, rawPayload); + if (message.channel === 'web' && message.context?.userAgent) { const browser = getBrowserInfo(message.context.userAgent); rawPayload.$browser = browser.name; @@ -373,4 +388,5 @@ module.exports = { trimTraits, generatePageOrScreenCustomEventName, recordBatchSizeMetrics, + getTransformedJSON, }; diff --git a/src/v0/destinations/mp/util.test.js b/src/v0/destinations/mp/util.test.js index 3666081f593..98c9b88201d 100644 --- a/src/v0/destinations/mp/util.test.js +++ b/src/v0/destinations/mp/util.test.js @@ -5,9 +5,11 @@ const { buildUtmParams, trimTraits, generatePageOrScreenCustomEventName, + getTransformedJSON, } = require('./util'); const { FEATURE_GZIP_SUPPORT } = require('../../util/constant'); const { ConfigurationError } = require('@rudderstack/integrations-lib'); +const { mappingConfig, ConfigCategory } = require('./config'); const maxBatchSizeMock = 2; @@ -30,7 +32,7 @@ describe('Unit test cases for groupEventsByEndpoint', () => { endpoint: '/engage', body: { JSON_ARRAY: { - batch: '[{prop:1}]', + batch: JSON.stringify([{ prop: 1 }]), }, }, userId: 'user1', @@ -41,7 +43,7 @@ describe('Unit test cases for groupEventsByEndpoint', () => { endpoint: '/engage', body: { JSON_ARRAY: { - batch: '[{prop:2}]', + batch: JSON.stringify([{ prop: 2 }]), }, }, userId: 'user2', @@ -52,7 +54,7 @@ describe('Unit test cases for groupEventsByEndpoint', () => { endpoint: '/groups', body: { JSON_ARRAY: { - batch: '[{prop:3}]', + batch: JSON.stringify([{ prop: 3 }]), }, }, userId: 'user1', @@ -63,7 +65,7 @@ describe('Unit test cases for groupEventsByEndpoint', () => { endpoint: '/track', body: { JSON_ARRAY: { - batch: '[{prop:4}]', + batch: JSON.stringify([{ prop: 4 }]), }, }, userId: 'user1', @@ -74,7 +76,7 @@ describe('Unit test cases for groupEventsByEndpoint', () => { endpoint: '/import', body: { JSON_ARRAY: { - batch: '[{prop:5}]', + batch: JSON.stringify([{ prop: 5 }]), }, }, userId: 'user2', @@ -90,7 +92,7 @@ describe('Unit test cases for groupEventsByEndpoint', () => { endpoint: '/engage', body: { JSON_ARRAY: { - batch: '[{prop:1}]', + batch: JSON.stringify([{ prop: 1 }]), }, }, userId: 'user1', @@ -101,7 +103,7 @@ describe('Unit test cases for groupEventsByEndpoint', () => { endpoint: '/engage', body: { JSON_ARRAY: { - batch: '[{prop:2}]', + batch: JSON.stringify([{ prop: 2 }]), }, }, userId: 'user2', @@ -114,7 +116,7 @@ describe('Unit test cases for groupEventsByEndpoint', () => { endpoint: '/groups', body: { JSON_ARRAY: { - batch: '[{prop:3}]', + batch: JSON.stringify([{ prop: 3 }]), }, }, userId: 'user1', @@ -127,7 +129,7 @@ describe('Unit test cases for groupEventsByEndpoint', () => { endpoint: '/import', body: { JSON_ARRAY: { - batch: '[{prop:5}]', + batch: JSON.stringify([{ prop: 5 }]), }, }, userId: 'user2', @@ -147,7 +149,7 @@ describe('Unit test cases for batchEvents', () => { endpoint: '/engage', body: { JSON_ARRAY: { - batch: '[{"prop":1}]', + batch: JSON.stringify([{ prop: 1 }]), }, }, headers: {}, @@ -161,7 +163,7 @@ describe('Unit test cases for batchEvents', () => { endpoint: '/engage', body: { JSON_ARRAY: { - batch: '[{"prop":2}]', + batch: JSON.stringify([{ prop: 2 }]), }, }, headers: {}, @@ -175,7 +177,7 @@ describe('Unit test cases for batchEvents', () => { endpoint: '/engage', body: { JSON_ARRAY: { - batch: '[{"prop":3}]', + batch: JSON.stringify([{ prop: 3 }]), }, }, headers: {}, @@ -192,7 +194,12 @@ describe('Unit test cases for batchEvents', () => { { batched: true, batchedRequest: { - body: { FORM: {}, JSON: {}, JSON_ARRAY: { batch: '[{"prop":1},{"prop":2}]' }, XML: {} }, + body: { + FORM: {}, + JSON: {}, + JSON_ARRAY: { batch: JSON.stringify([{ prop: 1 }, { prop: 2 }]) }, + XML: {}, + }, endpoint: '/engage', files: {}, headers: {}, @@ -208,7 +215,12 @@ describe('Unit test cases for batchEvents', () => { { batched: true, batchedRequest: { - body: { FORM: {}, JSON: {}, JSON_ARRAY: { batch: '[{"prop":3}]' }, XML: {} }, + body: { + FORM: {}, + JSON: {}, + JSON_ARRAY: { batch: JSON.stringify([{ prop: 3 }]) }, + XML: {}, + }, endpoint: '/engage', files: {}, headers: {}, @@ -235,13 +247,13 @@ describe('Unit test cases for generateBatchedPayloadForArray', () => { it('should generate a batched payload with GZIP payload for /import endpoint when given an array of events', () => { const events = [ { - body: { JSON_ARRAY: { batch: '[{"event": "event1"}]' } }, + body: { JSON_ARRAY: { batch: JSON.stringify([{ event: 'event1' }]) } }, endpoint: '/import', headers: { 'Content-Type': 'application/json' }, params: {}, }, { - body: { JSON_ARRAY: { batch: '[{"event": "event2"}]' } }, + body: { JSON_ARRAY: { batch: JSON.stringify([{ event: 'event2' }]) } }, endpoint: '/import', headers: { 'Content-Type': 'application/json' }, params: {}, @@ -254,7 +266,7 @@ describe('Unit test cases for generateBatchedPayloadForArray', () => { JSON_ARRAY: {}, XML: {}, GZIP: { - payload: '[{"event":"event1"},{"event":"event2"}]', + payload: JSON.stringify([{ event: 'event1' }, { event: 'event2' }]), }, }, endpoint: '/import', @@ -276,13 +288,13 @@ describe('Unit test cases for generateBatchedPayloadForArray', () => { it('should generate a batched payload with JSON_ARRAY body when given an array of events', () => { const events = [ { - body: { JSON_ARRAY: { batch: '[{"event": "event1"}]' } }, + body: { JSON_ARRAY: { batch: JSON.stringify([{ event: 'event1' }]) } }, endpoint: '/endpoint', headers: { 'Content-Type': 'application/json' }, params: {}, }, { - body: { JSON_ARRAY: { batch: '[{"event": "event2"}]' } }, + body: { JSON_ARRAY: { batch: JSON.stringify([{ event: 'event2' }]) } }, endpoint: '/endpoint', headers: { 'Content-Type': 'application/json' }, params: {}, @@ -292,7 +304,7 @@ describe('Unit test cases for generateBatchedPayloadForArray', () => { body: { FORM: {}, JSON: {}, - JSON_ARRAY: { batch: '[{"event":"event1"},{"event":"event2"}]' }, + JSON_ARRAY: { batch: JSON.stringify([{ event: 'event1' }, { event: 'event2' }]) }, XML: {}, }, endpoint: '/endpoint', @@ -489,3 +501,199 @@ describe('generatePageOrScreenCustomEventName', () => { expect(result).toBe(expected); }); }); + +describe('Unit test cases for getTransformedJSON', () => { + it('should transform the message payload to appropriate payload if device.token is present', () => { + const message = { + context: { + app: { + build: '1', + name: 'LeanPlumIntegrationAndroid', + namespace: 'com.android.SampleLeanPlum', + version: '1.0', + }, + device: { + id: '5094f5704b9cf2b3', + manufacturer: 'Google', + model: 'Android SDK built for x86', + name: 'generic_x86', + type: 'ios', + token: 'test_device_token', + }, + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'iOS', version: '8.1.0' }, + timezone: 'Asia/Kolkata', + traits: { userId: 'test_user_id' }, + }, + }; + const result = getTransformedJSON(message, mappingConfig[ConfigCategory.IDENTIFY.name], true); + + const expectedResult = { + $carrier: 'Android', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + $wifi: true, + userId: 'test_user_id', + $ios_devices: ['test_device_token'], + $os: 'iOS', + $ios_device_model: 'Android SDK built for x86', + $ios_version: '8.1.0', + $ios_app_release: '1.0', + $ios_app_version: '1', + }; + + expect(result).toEqual(expectedResult); + }); + + it('should transform the message payload to appropriate payload if device.token is present and device.token is null', () => { + const message = { + context: { + app: { + build: '1', + name: 'LeanPlumIntegrationAndroid', + namespace: 'com.android.SampleLeanPlum', + version: '1.0', + }, + device: { + id: '5094f5704b9cf2b3', + manufacturer: 'Google', + model: 'Android SDK built for x86', + name: 'generic_x86', + type: 'android', + token: null, + }, + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + timezone: 'Asia/Kolkata', + traits: { userId: 'test_user_id' }, + }, + }; + const result = getTransformedJSON(message, mappingConfig[ConfigCategory.IDENTIFY.name], true); + + const expectedResult = { + $carrier: 'Android', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + $wifi: true, + userId: 'test_user_id', + $os: 'Android', + $android_model: 'Android SDK built for x86', + $android_os_version: '8.1.0', + $android_manufacturer: 'Google', + $android_app_version: '1.0', + $android_app_version_code: '1.0', + $android_brand: 'Google', + }; + + expect(result).toEqual(expectedResult); + }); + + it('should transform the message payload to appropriate payload if device.token is not present for apple device', () => { + const message = { + context: { + app: { + build: '1', + name: 'LeanPlumIntegrationAndroid', + namespace: 'com.android.SampleLeanPlum', + version: '1.0', + }, + device: { + id: '5094f5704b9cf2b3', + manufacturer: 'Google', + model: 'Android SDK built for x86', + name: 'generic_x86', + type: 'ios', + }, + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'iOS', version: '8.1.0' }, + timezone: 'Asia/Kolkata', + traits: { userId: 'test_user_id' }, + }, + }; + const result = getTransformedJSON(message, mappingConfig[ConfigCategory.IDENTIFY.name], true); + + const expectedResult = { + $carrier: 'Android', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + $wifi: true, + userId: 'test_user_id', + $os: 'iOS', + $ios_device_model: 'Android SDK built for x86', + $ios_version: '8.1.0', + $ios_app_release: '1.0', + $ios_app_version: '1', + }; + + expect(result).toEqual(expectedResult); + }); + + it('should transform the message payload to appropriate payload if device.token is not present for android device', () => { + const message = { + context: { + app: { + build: '1', + name: 'LeanPlumIntegrationAndroid', + namespace: 'com.android.SampleLeanPlum', + version: '1.0', + }, + device: { + id: '5094f5704b9cf2b3', + manufacturer: 'Google', + model: 'Android SDK built for x86', + name: 'generic_x86', + type: 'android', + token: undefined, + }, + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'Android', version: '8.1.0' }, + timezone: 'Asia/Kolkata', + traits: { userId: 'test_user_id' }, + }, + }; + const result = getTransformedJSON(message, mappingConfig[ConfigCategory.IDENTIFY.name], true); + + const expectedResult = { + $carrier: 'Android', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + $wifi: true, + userId: 'test_user_id', + $os: 'Android', + $android_model: 'Android SDK built for x86', + $android_os_version: '8.1.0', + $android_manufacturer: 'Google', + $android_app_version: '1.0', + $android_app_version_code: '1.0', + $android_brand: 'Google', + }; + + expect(result).toEqual(expectedResult); + }); + + it('should transform the message payload to appropriate payload if device is not present', () => { + const message = { + context: { + app: { + build: '1', + name: 'LeanPlumIntegrationAndroid', + namespace: 'com.android.SampleLeanPlum', + version: '1.0', + }, + network: { carrier: 'Android', bluetooth: false, cellular: true, wifi: true }, + os: { name: 'iOS', version: '8.1.0' }, + timezone: 'Asia/Kolkata', + traits: { userId: 'test_user_id' }, + }, + }; + const result = getTransformedJSON(message, mappingConfig[ConfigCategory.IDENTIFY.name], true); + + const expectedResult = { + $carrier: 'Android', + $wifi: true, + userId: 'test_user_id', + }; + + expect(result).toEqual(expectedResult); + }); +}); diff --git a/src/v0/destinations/profitwell/utils.test.js b/src/v0/destinations/profitwell/utils.test.js index d6fa5e7df0f..74efe4b2a9a 100644 --- a/src/v0/destinations/profitwell/utils.test.js +++ b/src/v0/destinations/profitwell/utils.test.js @@ -1,3 +1,4 @@ +const path = require('path'); const { validatePayloadAndRetunImpIds, createMissingSubscriptionResponse, @@ -48,6 +49,8 @@ const getTestMessage = () => { return message; }; +const secretApiKey = path.basename(__dirname) + 1; + describe('profitwell utils test cases', () => { describe('createResponseForSubscribedUser', () => { it('correct flow', async () => { @@ -65,7 +68,7 @@ describe('profitwell utils test cases', () => { }, endpoint: 'https://api.profitwell.com/v2/subscriptions/testId/', files: {}, - headers: { Authorization: 'dummyApiKey', 'Content-Type': 'application/json' }, + headers: { Authorization: secretApiKey, 'Content-Type': 'application/json' }, method: 'PUT', params: {}, type: 'REST', @@ -73,7 +76,7 @@ describe('profitwell utils test cases', () => { }; expect( createResponseForSubscribedUser(getTestMessage(), 'testId', 'testAlias', { - privateApiKey: 'dummyApiKey', + privateApiKey: secretApiKey, }), ).toEqual(expectedOutput); }); @@ -83,7 +86,7 @@ describe('profitwell utils test cases', () => { fittingPayload.traits.effectiveDate = '2019-10-15T09:35:31.288Z'; expect(() => createResponseForSubscribedUser(fittingPayload, 'testId', 'testAlias', { - privateApiKey: 'dummyApiKey', + privateApiKey: secretApiKey, }), ).toThrow('Invalid timestamp format for effectiveDate. Aborting'); }); @@ -108,7 +111,7 @@ describe('profitwell utils test cases', () => { }, endpoint: 'https://api.profitwell.com/v2/subscriptions/', files: {}, - headers: { Authorization: 'dummyApiKey', 'Content-Type': 'application/json' }, + headers: { Authorization: secretApiKey, 'Content-Type': 'application/json' }, method: 'POST', params: {}, type: 'REST', @@ -116,7 +119,7 @@ describe('profitwell utils test cases', () => { }; expect( createMissingSubscriptionResponse('testId', 'testAlias', null, null, getTestMessage(), { - privateApiKey: 'dummyApiKey', + privateApiKey: secretApiKey, }), ).toEqual(expectedOutput); }); @@ -126,7 +129,7 @@ describe('profitwell utils test cases', () => { fittingPayload.traits.planInterval = 'test'; expect(() => createMissingSubscriptionResponse('testId', 'testAlias', null, null, fittingPayload, { - privateApiKey: 'dummyApiKey', + privateApiKey: secretApiKey, }), ).toThrow('invalid format for planInterval. Aborting'); }); @@ -136,7 +139,7 @@ describe('profitwell utils test cases', () => { fittingPayload.traits.planInterval = 'test'; expect(() => createMissingSubscriptionResponse('testId', 'testAlias', 124, fittingPayload, { - privateApiKey: 'dummyApiKey', + privateApiKey: secretApiKey, }), ).toThrow('Profitwell subscription_id not found'); }); diff --git a/src/v0/destinations/salesforce/transform.js b/src/v0/destinations/salesforce/transform.js index 7e66dd88106..f25659bfa4f 100644 --- a/src/v0/destinations/salesforce/transform.js +++ b/src/v0/destinations/salesforce/transform.js @@ -3,7 +3,6 @@ const cloneDeep = require('lodash/cloneDeep'); const { InstrumentationError, NetworkInstrumentationError, - getErrorRespEvents, } = require('@rudderstack/integrations-lib'); const { EventType, MappedToDestinationKey } = require('../../../constants'); const { @@ -26,6 +25,7 @@ const { handleRtTfSingleEventError, generateErrorObject, isHttpStatusSuccess, + getErrorRespEvents, } = require('../../util'); const { salesforceResponseHandler, collectAuthorizationInfo, getAuthHeader } = require('./utils'); const { handleHttpRequest } = require('../../../adapters/network'); diff --git a/src/v0/destinations/sendinblue/util.js b/src/v0/destinations/sendinblue/util.js index 3af35cd7b99..813d5c4150b 100644 --- a/src/v0/destinations/sendinblue/util.js +++ b/src/v0/destinations/sendinblue/util.js @@ -1,10 +1,10 @@ const { NetworkError, InstrumentationError } = require('@rudderstack/integrations-lib'); +const validator = require('validator'); const { EMAIL_SUFFIX, getContactDetailsEndpoint } = require('./config'); const { getHashFromArray, getIntegrationsObj, isNotEmpty, - validateEmail, validatePhoneWithCountryCode, getDestinationExternalID, } = require('../../util'); @@ -36,7 +36,7 @@ const checkIfEmailOrPhoneExists = (email, phone) => { }; const validateEmailAndPhone = (email, phone = null) => { - if (email && !validateEmail(email)) { + if (email && !validator.isEmail(email)) { throw new InstrumentationError('The provided email is invalid'); } diff --git a/src/v0/destinations/sfmc/transform.test.js b/src/v0/destinations/sfmc/transform.test.js index e182fb0d78a..12bcce4579e 100644 --- a/src/v0/destinations/sfmc/transform.test.js +++ b/src/v0/destinations/sfmc/transform.test.js @@ -1,4 +1,4 @@ -const { ConfigurationError } = require('@rudderstack/integrations-lib'); +const { ConfigurationError, generateRandomString } = require('@rudderstack/integrations-lib'); const axios = require('axios'); const MockAxiosAdapter = require('axios-mock-adapter'); const { responseBuilderSimple, responseBuilderForMessageEvent } = require('./transform'); @@ -6,7 +6,7 @@ beforeAll(() => { const mock = new MockAxiosAdapter(axios); mock .onPost('https://yourSubDomain.auth.marketingcloudapis.com/v2/token') - .reply(200, '{"access_token":"yourAuthToken"}'); + .reply(200, JSON.stringify({ access_token: 'yourAuthToken' })); }); describe('responseBuilderSimple', () => { @@ -134,7 +134,7 @@ describe('responseBuilderSimple', () => { }, }; const subDomain = 'subdomain'; - const authToken = 'token'; + const authToken = generateRandomString(); const hashMapEventDefinition = { testevent: 'eventDefinitionKey', }; @@ -151,7 +151,7 @@ describe('responseBuilderSimple', () => { ); expect(response.headers).toEqual({ 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: `Bearer ${authToken}`, }); expect(response.body.JSON).toEqual({ ContactKey: '12345', diff --git a/src/v0/destinations/snapchat_conversion/util.js b/src/v0/destinations/snapchat_conversion/util.js index ee0329995c1..b7adaf91a5f 100644 --- a/src/v0/destinations/snapchat_conversion/util.js +++ b/src/v0/destinations/snapchat_conversion/util.js @@ -34,24 +34,14 @@ function getHashedValue(identifier) { } function getNormalizedPhoneNumber(message) { - const regexExp = /^[\da-f]{64}$/gi; - let phoneNumber = getFieldValueFromMessage(message, 'phone'); - if (regexExp.test(phoneNumber)) { - return phoneNumber; - } - let leadingZero = true; - if (phoneNumber) { - for (let i = 0; i < phoneNumber.length; i += 1) { - if (Number.isNaN(parseInt(phoneNumber[i], 10)) || (phoneNumber[i] === '0' && leadingZero)) { - phoneNumber = phoneNumber.replace(phoneNumber[i], ''); - i -= 1; - } else { - leadingZero = false; - } - } - return phoneNumber; - } - return null; + const regexExp = /^[\da-f]{64}$/i; + const phoneNumber = getFieldValueFromMessage(message, 'phone'); + + if (!phoneNumber) return null; + if (regexExp.test(phoneNumber)) return phoneNumber; + + // Remove leading zeros and non-numeric characters + return String(phoneNumber).replace(/\D/g, '').replace(/^0+/, '') || null; } function getDataUseValue(message) { diff --git a/src/v0/destinations/snapchat_conversion/util.test.js b/src/v0/destinations/snapchat_conversion/util.test.js new file mode 100644 index 00000000000..05bd0cdbef0 --- /dev/null +++ b/src/v0/destinations/snapchat_conversion/util.test.js @@ -0,0 +1,365 @@ +const { generateRandomString } = require('@rudderstack/integrations-lib'); +const { + msUnixTimestamp, + getItemIds, + getPriceSum, + getDataUseValue, + getNormalizedPhoneNumber, + getHashedValue, + channelMapping, + generateBatchedPayloadForArray, +} = require('./util'); + +describe('Snapchat Conversion Utils', () => { + describe('getNormalizedPhoneNumber', () => { + const testCases = [ + { + name: 'should remove non-numeric characters and leading zeros from phone number', + input: { traits: { phone: '+1 (234) 567-8900' } }, + expected: '12345678900', + }, + { + name: 'should remove leading zeros from phone number when present', + input: { traits: { phone: '00123456789' } }, + expected: '123456789', + }, + { + name: 'should remove non-numeric characters and leading zeros from mixed alphanumeric input', + input: { traits: { phone: 'abc0123def0456' } }, + expected: '1230456', + }, + { + name: 'should return null when phone number is not present', + input: { traits: {} }, + expected: null, + }, + { + name: 'should return null when message is empty', + input: {}, + expected: null, + }, + { + name: 'should return the original hash when phone is already a 64-char hex', + input: { traits: { phone: 'a'.repeat(64) } }, + expected: 'a'.repeat(64), + }, + { + name: 'should return null when phone normalizes to empty string', + input: { traits: { phone: '000' } }, + expected: null, + }, + { + name: 'should handle integer phone numbers', + input: { traits: { phone: 1234567890 } }, + expected: '1234567890', + }, + { + name: 'should handle object in place of phone number', + input: { traits: { phone: { test: 'test' } } }, + expected: null, + }, + ]; + + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + const result = getNormalizedPhoneNumber(input); + expect(result).toBe(expected); + }); + }); + }); +}); + +describe('msUnixTimestamp', () => { + const testCases = [ + { + name: 'should convert timestamp to milliseconds unix timestamp', + input: new Date('2024-01-01T00:00:00Z'), + expected: + new Date('2024-01-01T00:00:00Z').getTime() * 1000 + + new Date('2024-01-01T00:00:00Z').getMilliseconds(), + }, + { + name: 'should handle different timezone', + input: new Date('2024-01-01T12:30:45+05:30'), + expected: + new Date('2024-01-01T12:30:45+05:30').getTime() * 1000 + + new Date('2024-01-01T12:30:45+05:30').getMilliseconds(), + }, + ]; + + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + expect(msUnixTimestamp(input)).toBe(expected); + }); + }); +}); + +describe('getHashedValue', () => { + const testCases = [ + { + name: 'should return null for null input', + input: null, + expected: null, + }, + { + name: 'should return null for undefined input', + input: undefined, + expected: null, + }, + { + name: 'should return null for empty string', + input: '', + expected: null, + }, + { + name: 'should return original value if already a 64-char hex', + input: 'a'.repeat(64), + expected: 'a'.repeat(64), + }, + { + name: 'should hash non-hex64 values', + input: 'test', + expectedLength: 64, + expectedPattern: /^[a-f0-9]{64}$/i, + }, + ]; + + testCases.forEach(({ name, input, expected, expectedLength, expectedPattern }) => { + it(name, () => { + const result = getHashedValue(input); + if (expected !== undefined) { + expect(result).toBe(expected); + } + if (expectedLength) { + expect(result).toHaveLength(expectedLength); + } + if (expectedPattern) { + expect(result).toMatch(expectedPattern); + } + }); + }); +}); + +describe('getItemIds', () => { + const testCases = [ + { + name: 'should return null when products is not an array', + input: { properties: {} }, + expected: null, + }, + { + name: 'should return array of product_ids', + input: { + properties: { + products: [{ product_id: '123' }, { product_id: '456' }], + }, + }, + expected: ['123', '456'], + }, + { + name: 'should skip products without product_id', + input: { + properties: { + products: [{ product_id: '123' }, { name: 'test' }, { product_id: '456' }], + }, + }, + expected: ['123', '456'], + }, + { + name: 'should return null when products is null', + input: { properties: { products: null } }, + expected: null, + }, + { + name: 'should handle empty products array', + input: { properties: { products: [] } }, + expected: [], + }, + ]; + + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + expect(getItemIds(input)).toEqual(expected); + }); + }); +}); + +describe('getPriceSum', () => { + const testCases = [ + { + name: 'should return null when products is not an array', + input: { properties: {} }, + expected: 'null', + }, + { + name: 'should sum prices * quantities', + input: { + properties: { + products: [ + { price: '10.5', quantity: 2 }, + { price: '20.0', quantity: 1 }, + ], + }, + }, + expected: '41', + }, + { + name: 'should use quantity=1 when not specified', + input: { + properties: { + products: [{ price: '10.5' }, { price: '20.0' }], + }, + }, + expected: '30.5', + }, + { + name: 'should skip invalid prices or quantities', + input: { + properties: { + products: [ + { price: 'invalid', quantity: 2 }, + { price: '20.0', quantity: 'invalid' }, + { price: '10.0', quantity: 2 }, + ], + }, + }, + expected: '20', + }, + ]; + + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + expect(getPriceSum(input)).toBe(expected); + }); + }); +}); + +describe('getDataUseValue', () => { + const testCases = [ + { + name: 'should return null when att is not defined', + input: {}, + expected: null, + }, + { + name: 'should return ["lmu"] when att is 2', + input: { + context: { + device: { + attTrackingStatus: 2, + }, + }, + }, + expected: "['lmu']", + }, + { + name: 'should return null when att is 3', + input: { + context: { + device: { + attTrackingStatus: 3, + }, + }, + }, + expected: null, + }, + { + name: 'should return null for other att values', + input: { + context: { + device: { + attTrackingStatus: 1, + }, + }, + }, + expected: null, + }, + ]; + + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + expect(getDataUseValue(input)).toBe(expected); + }); + }); +}); + +describe('generateBatchedPayloadForArray', () => { + const apiKey = generateRandomString(); + const testCases = [ + { + name: 'should generate batched payload with correct structure', + input: { + events: [{ body: { JSON: { event: 1 } } }, { body: { JSON: { event: 2 } } }], + destination: { + Config: { + apiKey, + }, + }, + }, + expected: { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiKey}`, + }, + endpoint: 'https://tr.snapchat.com/v2/conversion', + body: { + JSON_ARRAY: { + batch: JSON.stringify([{ event: 1 }, { event: 2 }]), + }, + }, + }, + }, + { + name: 'should handle empty events array', + input: { + events: [], + destination: { + Config: { + apiKey, + }, + }, + }, + expected: { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiKey}`, + }, + endpoint: 'https://tr.snapchat.com/v2/conversion', + body: { + JSON_ARRAY: { + batch: '[]', + }, + }, + }, + }, + ]; + + testCases.forEach(({ name, input, expected }) => { + it(name, () => { + const result = generateBatchedPayloadForArray(input.events, input.destination); + expect(result.headers).toEqual(expected.headers); + expect(result.endpoint).toEqual(expected.endpoint); + expect(result.body.JSON_ARRAY).toEqual(expected.body.JSON_ARRAY); + }); + }); +}); + +describe('channelMapping', () => { + const testCases = [ + { + name: 'should have correct mapping values', + expected: { + web: 'WEB', + mobile: 'MOBILE_APP', + mobile_app: 'MOBILE_APP', + offline: 'OFFLINE', + }, + }, + ]; + + testCases.forEach(({ name, expected }) => { + it(name, () => { + expect(channelMapping).toEqual(expected); + }); + }); +}); diff --git a/src/v0/destinations/twitter_ads/transform.js b/src/v0/destinations/twitter_ads/transform.js index 71536be2d91..74bb1fc4f34 100644 --- a/src/v0/destinations/twitter_ads/transform.js +++ b/src/v0/destinations/twitter_ads/transform.js @@ -80,114 +80,129 @@ function populateEventId(event, requestJson, destination) { } function populateContents(requestJson) { - const reqJson = { ...requestJson }; - if (reqJson.contents) { - const transformedContents = requestJson.contents - .map((obj) => ({ - ...(obj.id && { content_id: obj.id }), - ...(obj.groupId && { content_group_id: obj.groupId }), - ...(obj.name && { content_name: obj.name }), - ...(obj.price && { content_price: parseFloat(obj.price) }), - ...(obj.type && { content_type: obj.type }), - ...(obj.quantity && { num_items: parseInt(obj.quantity, 10) }), - })) - .filter((tfObj) => Object.keys(tfObj).length > 0); - if (transformedContents.length > 0) { - reqJson.contents = transformedContents; - } - } - return reqJson; + const { contents, ...rest } = requestJson; + + if (!Array.isArray(contents)) return requestJson; + + const transformedContents = contents + .map(({ id, groupId, name, price, type, quantity }) => { + const transformed = {}; + if (id) { + transformed.content_id = id; + } + if (groupId) { + transformed.content_group_id = groupId; + } + if (name) { + transformed.content_name = name; + } + if (type) { + transformed.content_type = type; + } + if (price && Number.isFinite(parseFloat(price))) { + const parsedPrice = parseFloat(price); + // content_price should be a string + transformed.content_price = Number.isInteger(parsedPrice) + ? parsedPrice.toFixed(2) + : parsedPrice.toString(); + } + if (quantity && Number.isFinite(parseInt(quantity, 10))) { + transformed.num_items = parseInt(quantity, 10); + } + return Object.keys(transformed).length > 0 ? transformed : null; + }) + .filter(Boolean); // Removes null entries + + return transformedContents.length > 0 ? { ...rest, contents: transformedContents } : rest; } -// process track call -function processTrack(message, metadata, destination) { - let requestJson = constructPayload(message, mappingConfig[ConfigCategories.TRACK.name]); - - requestJson.event_id = - requestJson.event_id || populateEventId(message.event, requestJson, destination); - - requestJson.conversion_time = isDefinedAndNotNull(requestJson.conversion_time) - ? requestJson.conversion_time - : message.timestamp; - +// Separate identifier creation logic for better maintainability +function createIdentifiers(properties) { + if (!properties) { + throw new InstrumentationError( + '[TWITTER ADS]: properties must be present in event. Aborting message', + ); + } const identifiers = []; + const { email, phone, twclid, ip_address: ipAddress, user_agent: userAgent } = properties; - if (message.properties.email) { - let email = message.properties.email.trim(); - if (email) { - email = email.toLowerCase(); - identifiers.push({ hashed_email: sha256(email) }); - } + // Handle email + if (email?.trim()) { + identifiers.push({ + hashed_email: sha256(email.trim().toLowerCase()), + }); } - if (message.properties.phone) { - const phone = message.properties.phone.trim(); - if (phone) { - identifiers.push({ hashed_phone_number: sha256(phone) }); - } + // Handle phone + if (phone?.trim()) { + identifiers.push({ + hashed_phone_number: sha256(phone.trim()), + }); } - if (message.properties.twclid) { - identifiers.push({ twclid: message.properties.twclid }); + // Handle twclid + if (twclid) { + identifiers.push({ twclid }); } - if (message.properties.ip_address) { - const ipAddress = message.properties.ip_address.trim(); - if (ipAddress) { - identifiers.push({ ip_address: ipAddress }); + // Handle IP and user agent + const trimmedIp = ipAddress?.trim(); + const trimmedUserAgent = userAgent?.trim(); + // ip_address or/and user_agent is required to be + // passed in conjunction with another identifier + // ref: https://developer.x.com/en/docs/x-ads-api/measurement/web-conversions/api-reference/conversions + if (trimmedIp && trimmedUserAgent) { + identifiers.push({ + ip_address: trimmedIp, + user_agent: trimmedUserAgent, + }); + } else { + if (identifiers.length === 0) { + throw new InstrumentationError( + '[TWITTER ADS]: one of twclid, phone, email or ip_address with user_agent must be present in properties.', + ); } - } - - if (message.properties.user_agent) { - const userAgent = message.properties.user_agent.trim(); - if (userAgent) { - identifiers.push({ user_agent: userAgent }); + if (trimmedIp) { + identifiers[0].ip_address = trimmedIp; + } + if (trimmedUserAgent) { + identifiers[0].user_agent = trimmedUserAgent; } } - requestJson = populateContents(requestJson); + return identifiers; +} +// process track call +function processTrack(message, metadata, destination) { + const identifiers = createIdentifiers(message.properties); + let requestJson = constructPayload(message, mappingConfig[ConfigCategories.TRACK.name]); requestJson.identifiers = identifiers; - const endpointUrl = prepareUrl(message, destination); - - return buildResponse(message, requestJson, metadata, endpointUrl); -} + // Populate required fields + requestJson.event_id = + requestJson.event_id || populateEventId(message.event, requestJson, destination); -function validateRequest(message) { - const { properties } = message; + requestJson.conversion_time = isDefinedAndNotNull(requestJson.conversion_time) + ? requestJson.conversion_time + : message.timestamp; - if (!properties) { - throw new InstrumentationError( - '[TWITTER ADS]: properties must be present in event. Aborting message', - ); - } + // Add identifiers and transform contents + requestJson = populateContents(requestJson); - if ( - !properties.email && - !properties.phone && - !properties.twclid && - !properties.ip_address && - !properties.user_agent - ) { - throw new InstrumentationError( - '[TWITTER ADS]: one of twclid, phone, email, ip_address or user_agent must be present in properties.', - ); - } + const endpointUrl = prepareUrl(message, destination); + return buildResponse(message, requestJson, metadata, endpointUrl); } function process(event) { const { message, metadata, destination } = event; - validateRequest(message); - const messageType = message.type?.toLowerCase(); - if (messageType === EventType.TRACK) { - return processTrack(message, metadata, destination); + if (messageType !== EventType.TRACK) { + throw new InstrumentationError(`Message type ${messageType} not supported`); } - - throw new InstrumentationError(`Message type ${messageType} not supported`); + return processTrack(message, metadata, destination); } const processRouterDest = async (inputs, reqMetadata) => { diff --git a/src/v0/destinations/zendesk/transform.js b/src/v0/destinations/zendesk/transform.js index 792e8df3506..32abb2b8c97 100644 --- a/src/v0/destinations/zendesk/transform.js +++ b/src/v0/destinations/zendesk/transform.js @@ -118,7 +118,10 @@ const payloadBuilderforUpdatingEmail = async ( const { identities } = res.response.data; if (identities && Array.isArray(identities)) { const identitiesDetails = identities.find( - (identitieslist) => identitieslist.primary === true && identitieslist.value !== userEmail, + (identitieslist) => + identitieslist.primary === true && + identitieslist.type === 'email' && + identitieslist.value !== userEmail, ); if (identitiesDetails?.id && userEmail) { return responseBuilderToUpdatePrimaryAccount( diff --git a/src/v0/sources/adjust/transform.js b/src/v0/sources/adjust/transform.js deleted file mode 100644 index f68e87d4764..00000000000 --- a/src/v0/sources/adjust/transform.js +++ /dev/null @@ -1,62 +0,0 @@ -const lodash = require('lodash'); -const path = require('path'); -const fs = require('fs'); -const { TransformationError } = require('@rudderstack/integrations-lib'); -const logger = require('../../../logger'); -const Message = require('../message'); -const { CommonUtils } = require('../../../util/common'); -const { excludedFieldList } = require('./config'); -const { extractCustomFields, generateUUID } = require('../../util'); -const { convertToISODate } = require('./utils'); - -// ref : https://help.adjust.com/en/article/global-callbacks#general-recommended-placeholders -// import mapping json using JSON.parse to preserve object key order -const mapping = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); - -const formatProperties = (input) => { - const { query_parameters: qParams } = input; - logger.debug(`[Adjust] Input event: query_params: ${JSON.stringify(qParams)}`); - if (!qParams) { - throw new TransformationError('Query_parameters is missing'); - } - const formattedOutput = {}; - Object.entries(qParams).forEach(([key, [value]]) => { - formattedOutput[key] = value; - }); - return formattedOutput; -}; - -const processEvent = (inputEvent) => { - const message = new Message(`Adjust`); - const event = lodash.cloneDeep(inputEvent); - const formattedPayload = formatProperties(event); - // event type is always track - const eventType = 'track'; - message.setEventType(eventType); - message.setPropertiesV2(formattedPayload, mapping); - let customProperties = {}; - customProperties = extractCustomFields( - formattedPayload, - customProperties, - 'root', - excludedFieldList, - ); - message.properties = { ...message.properties, ...customProperties }; - - if (formattedPayload.created_at) { - const ts = convertToISODate(formattedPayload.created_at); - message.setProperty('originalTimestamp', ts); - message.setProperty('timestamp', ts); - } - // adjust does not has the concept of user but we need to set some random anonymousId in order to make the server accept the message - message.anonymousId = generateUUID(); - return message; -}; - -// This fucntion just converts the incoming payload to array of already not and sends it to processEvent -const process = (events) => { - const eventsArray = CommonUtils.toArray(events); - return eventsArray.map(processEvent); -}; - -module.exports = { process }; diff --git a/src/v0/sources/adjust/utils.test.js b/src/v0/sources/adjust/utils.test.js deleted file mode 100644 index f5a0caa832b..00000000000 --- a/src/v0/sources/adjust/utils.test.js +++ /dev/null @@ -1,37 +0,0 @@ -const { convertToISODate } = require('./utils'); -const { TransformationError } = require('@rudderstack/integrations-lib'); - -describe('convertToISODate', () => { - // Converts valid numeric timestamp to ISO date string - it('should return ISO date string when given a valid numeric timestamp', () => { - const timestamp = 1633072800; // Example timestamp for 2021-10-01T00:00:00.000Z - const result = convertToISODate(timestamp); - expect(result).toBe('2021-10-01T07:20:00.000Z'); - }); - - // Throws error for non-numeric string input - it('should throw TransformationError when given a non-numeric string', () => { - const invalidTimestamp = 'invalid'; - expect(() => convertToISODate(invalidTimestamp)).toThrow(TransformationError); - }); - - // Converts valid numeric string timestamp to ISO date string - it('should convert valid numeric string timestamp to ISO date string', () => { - const rawTimestamp = '1633072800'; // Corresponds to 2021-10-01T00:00:00.000Z - const result = convertToISODate(rawTimestamp); - expect(result).toBe('2021-10-01T07:20:00.000Z'); - }); - - // Throws error for non-number and non-string input - it('should throw error for non-number and non-string input', () => { - expect(() => convertToISODate({})).toThrow(TransformationError); - expect(() => convertToISODate([])).toThrow(TransformationError); - expect(() => convertToISODate(null)).toThrow(TransformationError); - expect(() => convertToISODate(undefined)).toThrow(TransformationError); - }); - - it('should throw error for timestamp that results in invalid date when multiplied', () => { - const hugeTimestamp = 999999999999999; // This will become invalid when multiplied by 1000 - expect(() => convertToISODate(hugeTimestamp)).toThrow(TransformationError); - }); -}); diff --git a/src/v0/sources/appsflyer/transform.js b/src/v0/sources/appsflyer/transform.js deleted file mode 100644 index 1f21392b67c..00000000000 --- a/src/v0/sources/appsflyer/transform.js +++ /dev/null @@ -1,83 +0,0 @@ -const path = require('path'); -const fs = require('fs'); -const { TransformationError } = require('@rudderstack/integrations-lib'); -const Message = require('../message'); -const { generateUUID } = require('../../util'); - -const mappingJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, './mapping.json'), 'utf-8')); - -const { removeUndefinedAndNullValues, isObject, isAppleFamily } = require('../../util'); - -function processEvent(event) { - const messageType = 'track'; - - if (event.event_name) { - const eventName = event.event_name; - const message = new Message(`AF`); - - message.setEventType(messageType); - - message.setEventName(eventName); - - const properties = { ...event }; - message.setProperty('properties', properties); - - // set fields in payload from mapping json - message.setProperties(event, mappingJson); - - // Remove the fields from properties that are already mapped to other fields. - Object.keys(mappingJson).forEach((key) => { - if (message.properties && message.properties[key] !== undefined) { - delete message.properties[key]; - } - }); - - if (!isObject(message.context.device)) { - message.context.device = {}; - } - - if (event.platform) { - if (isAppleFamily(event.platform)) { - message.context.device.advertisingId = event.idfa; - } else if (event.platform.toLowerCase() === 'android') { - message.context.device.advertisingId = event.android_id; - } - // remove idfa from message properties as it is already mapped. - if (message.properties && message.properties.idfa !== undefined) { - delete message.properties.idfa; - } - // remove android_id from message properties as it is already mapped. - if (message.properties && message.properties.android_id !== undefined) { - delete message.properties.android_id; - } - } - if (message.context.device.advertisingId) { - message.context.device.adTrackingEnabled = true; - } - - if (event.appsflyer_id) { - message.context.externalId = [ - { - type: 'appsflyerExternalId', - value: event.appsflyer_id, - }, - ]; - // remove appsflyer_id from message properties as it is already mapped. - if (message.properties && message.properties.appsflyer_id !== undefined) { - delete message.properties.appsflyer_id; - } - } - message.setProperty('anonymousId', generateUUID()); - - return message; - } - throw new TransformationError('Unknwon event type from Appsflyer'); -} - -function process(event) { - const response = processEvent(event); - const returnValue = removeUndefinedAndNullValues(response); - return returnValue; -} - -exports.process = process; diff --git a/src/v0/sources/moengage/transform.js b/src/v0/sources/moengage/transform.js deleted file mode 100644 index e5b3c92bfea..00000000000 --- a/src/v0/sources/moengage/transform.js +++ /dev/null @@ -1,8 +0,0 @@ -function process(events) { - if (events.batch) { - return events.batch; - } - return events; -} - -exports.process = process; diff --git a/src/v0/sources/segment/transform.js b/src/v0/sources/segment/transform.js deleted file mode 100644 index 4fd35f6821c..00000000000 --- a/src/v0/sources/segment/transform.js +++ /dev/null @@ -1,5 +0,0 @@ -function process(events) { - return events; -} - -exports.process = process; diff --git a/src/v0/sources/shopify/transform.js b/src/v0/sources/shopify/transform.js index 8cf39dfa5c2..f1cb0aaecbf 100644 --- a/src/v0/sources/shopify/transform.js +++ b/src/v0/sources/shopify/transform.js @@ -16,7 +16,7 @@ const { const logger = require('../../../logger'); const { RedisDB } = require('../../../util/redis/redisConnector'); const { removeUndefinedAndNullValues, isDefinedAndNotNull } = require('../../util'); -const Message = require('../message'); +const Message = require('../../../sources/message'); const { EventType } = require('../../../constants'); const { INTEGERATION, diff --git a/src/v0/sources/shopify/util.js b/src/v0/sources/shopify/util.js index b7e79e35a16..3665dfff203 100644 --- a/src/v0/sources/shopify/util.js +++ b/src/v0/sources/shopify/util.js @@ -272,6 +272,7 @@ module.exports = { createPropertiesForEcomEvent, extractEmailFromPayload, getAnonymousIdAndSessionId, + getCartToken, checkAndUpdateCartItems, getHashLineItems, getDataFromRedis, diff --git a/src/v0/util/constant.js b/src/v0/util/constant.js index 8f5d6c97a13..ba350c2f395 100644 --- a/src/v0/util/constant.js +++ b/src/v0/util/constant.js @@ -85,6 +85,11 @@ const HTTP_STATUS_CODES = { NETWORK_AUTHENTICATION_REQUIRED: 511, }; +const ERROR_MESSAGES = { + MALFORMED_JSON_IN_REQUEST_BODY: 'Malformed JSON in request body', + REQUEST_BODY_NOT_PRESENT_IN_V2_SPEC_PAYLOAD: 'request.body is not present in V2 spec payload', +}; + module.exports = { API_CALL, AUTH_CACHE_TTL, @@ -94,4 +99,5 @@ module.exports = { FEATURE_FILTER_CODE, FEATURE_GZIP_SUPPORT, VDM_V2_SCHEMA_VERSION, + ERROR_MESSAGES, }; diff --git a/src/v0/util/facebookUtils/networkHandler.js b/src/v0/util/facebookUtils/networkHandler.js index 46ac59a07af..39835f2617e 100644 --- a/src/v0/util/facebookUtils/networkHandler.js +++ b/src/v0/util/facebookUtils/networkHandler.js @@ -212,6 +212,12 @@ const errorDetailsMap = { .setMessage('There have been too many calls to this ad-account.') .build(), }, + 2655: { + default: new ErrorDetailsExtractorBuilder() + .setStatus(400) + .setMessage('Marketing Messaging TOS not accepted.') + .build(), + }, 200: { default: new ErrorDetailsExtractorBuilder() .setStatus(403) diff --git a/src/v0/util/index.js b/src/v0/util/index.js index 0f9abfb0403..36dcdddd5cf 100644 --- a/src/v0/util/index.js +++ b/src/v0/util/index.js @@ -23,16 +23,15 @@ const { PlatformError, TransformationError, OAuthSecretError, - getErrorRespEvents, } = require('@rudderstack/integrations-lib'); const { JsonTemplateEngine, PathType } = require('@rudderstack/json-template-engine'); const isString = require('lodash/isString'); const logger = require('../../logger'); const stats = require('../../util/stats'); -const { DestCanonicalNames, DestHandlerMap } = require('../../constants/destinationCanonicalNames'); +const { DestCanonicalNames } = require('../../constants/destinationCanonicalNames'); const { client: errNotificationClient } = require('../../util/errorNotifier'); -const { HTTP_STATUS_CODES, VDM_V2_SCHEMA_VERSION } = require('./constant'); +const { HTTP_STATUS_CODES, VDM_V2_SCHEMA_VERSION, ERROR_MESSAGES } = require('./constant'); const { REFRESH_TOKEN, AUTH_STATUS_INACTIVE, @@ -971,6 +970,7 @@ const handleMetadataForValue = (value, metadata, destKey, integrationsObj = null validateTimestamp, allowedKeyCheck, toArray, + regex, } = metadata; // if value is null and defaultValue is supplied - use that @@ -1044,7 +1044,14 @@ const handleMetadataForValue = (value, metadata, destKey, integrationsObj = null } return [formattedVal]; } - + if (regex) { + const regexPattern = new RegExp(regex); + if (!regexPattern.test(formattedVal)) { + throw new InstrumentationError( + `The value '${formattedVal}' does not match the regex pattern, ${regex}`, + ); + } + } return formattedVal; }; @@ -1655,6 +1662,14 @@ function isAppleFamily(platform) { return false; } +function isAndroidFamily(platform) { + const androidOsNames = ['android']; + if (typeof platform === 'string') { + return androidOsNames.includes(platform?.toLowerCase()); + } + return false; +} + function removeHyphens(str) { if (!isString(str)) { return str; @@ -1711,6 +1726,14 @@ function getValidDynamicFormConfig( return res; } +const getErrorRespEvents = (metadata, statusCode, error, statTags, batched = false) => ({ + metadata, + batched, + statusCode, + error, + statTags, +}); + /** * This method is used to check if the input events sent to router transformation are valid * It is to be used only for router transform destinations @@ -1874,31 +1897,6 @@ const flattenMultilevelPayload = (payload) => { return flattenedPayload; }; -/** - * Gets the destintion's transform.js file used for transformation - * **Note**: The transform.js file is imported from - * `v0/destinations/${dest}/transform` - * @param {*} _version -> version for the transfor - * @param {*} dest destination name - * @returns - * The transform.js instance used for destination transformation - */ -const getDestHandler = (dest) => { - const destName = DestHandlerMap[dest] || dest; - // eslint-disable-next-line import/no-dynamic-require, global-require - return require(`../destinations/${destName}/transform`); -}; - -/** - * Obtain the authCache instance used to store the access token information to send/get information to/from destination - * @param {string} destType destination name - * @returns {Cache | undefined} The instance of "v0/util/cache.js" - */ -const getDestAuthCacheInstance = (destType) => { - const destInf = getDestHandler(destType); - return destInf?.authCache || {}; -}; - /** * This function removes all those variables which are * empty or undefined or null from all levels of object. @@ -1924,12 +1922,6 @@ const refinePayload = (obj) => { return refinedPayload; }; -const validateEmail = (email) => { - const regex = - /^(([^\s"(),.:;<>@[\\\]]+(\.[^\s"(),.:;<>@[\\\]]+)*)|(".+"))@((\[(?:\d{1,3}\.){3}\d{1,3}])|(([\dA-Za-z-]+\.)+[A-Za-z]{2,}))$/; - return !!regex.test(email); -}; - const validatePhoneWithCountryCode = (phone) => { const regex = /^\+(?:[\d{] ?){6,14}\d$/; return !!regex.test(phone); @@ -2362,6 +2354,18 @@ const convertToUuid = (input) => { throw new InstrumentationError(errorMessage); } }; + +const getBodyFromV2SpecPayload = ({ request }) => { + if (request?.body) { + try { + const parsedBody = JSON.parse(request.body); + return parsedBody; + } catch (error) { + throw new TransformationError(ERROR_MESSAGES.MALFORMED_JSON_IN_REQUEST_BODY); + } + } + throw new TransformationError(ERROR_MESSAGES.REQUEST_BODY_NOT_PRESENT_IN_V2_SPEC_PAYLOAD); +}; // ======================================================================== // EXPORTS // ======================================================================== @@ -2395,11 +2399,13 @@ module.exports = { generateErrorObject, generateUUID, getBrowserInfo, + getBodyFromV2SpecPayload, getDateInFormat, getDestinationExternalID, getDestinationExternalIDInfoForRetl, getDestinationExternalIDObjectForRetl, getDeviceModel, + getErrorRespEvents, getEventTime, getFieldValueFromMessage, getFirstAndLastName, @@ -2425,6 +2431,7 @@ module.exports = { handleSourceKeysOperation, hashToSha256, isAppleFamily, + isAndroidFamily, isBlank, isDefined, isDefinedAndNotNull, @@ -2462,9 +2469,7 @@ module.exports = { simpleProcessRouterDestSync, handleRtTfSingleEventError, getErrorStatusCode, - getDestAuthCacheInstance, refinePayload, - validateEmail, validateEventName, validatePhoneWithCountryCode, getEventReqMetadata, @@ -2489,4 +2494,5 @@ module.exports = { removeEmptyKey, isAxiosError, convertToUuid, + handleMetadataForValue, }; diff --git a/src/v0/util/index.test.js b/src/v0/util/index.test.js index cfdfefddee3..ba27ee1f703 100644 --- a/src/v0/util/index.test.js +++ b/src/v0/util/index.test.js @@ -15,6 +15,7 @@ const { convertToUuid, } = require('./index'); const exp = require('constants'); +const { ERROR_MESSAGES } = require('./constant'); // Names of the utility functions to test const functionNames = [ @@ -1049,3 +1050,116 @@ describe('convertToUuid', () => { expect(result).toBe('672ca00c-37f4-5d71-b8c3-6ae0848080ec'); }); }); + +describe('', () => { + it('should return original value when regex pattern is invalid', () => { + const value = 'test value'; + const metadata = { + regex: `\\b(?!1000\\b)\\d{4,}\\b`, + }; + try { + const result = utilities.handleMetadataForValue(value, metadata); + } catch (e) { + expect(e.message).toBe( + `The value 'test value' does not match the regex pattern, \\b(?!1000\\b)\\d{4,}\\b`, + ); + } + }); + it('should return true when the regex matches', () => { + const value = 1003; + const metadata = { + regex: `\\b(?!1000\\b)\\d{4,}\\b`, + }; + const res = utilities.handleMetadataForValue(value, metadata); + expect(res).toBe(1003); + }); +}); + +describe('isAndroidFamily', () => { + it('should return true for "android" platform', () => { + expect(utilities.isAndroidFamily('android')).toBe(true); + }); + + it('should return true for "ANDROID" platform (case insensitive)', () => { + expect(utilities.isAndroidFamily('ANDROID')).toBe(true); + }); + + it('should return false for non-android platforms', () => { + expect(utilities.isAndroidFamily('ios')).toBe(false); + expect(utilities.isAndroidFamily('web')).toBe(false); + expect(utilities.isAndroidFamily('windows')).toBe(false); + }); + + it('should return false for empty string', () => { + expect(utilities.isAndroidFamily('')).toBe(false); + }); + + it('should return false for non-string inputs', () => { + expect(utilities.isAndroidFamily(null)).toBe(false); + expect(utilities.isAndroidFamily(undefined)).toBe(false); + expect(utilities.isAndroidFamily(123)).toBe(false); + expect(utilities.isAndroidFamily({})).toBe(false); + expect(utilities.isAndroidFamily([])).toBe(false); + expect(utilities.isAndroidFamily(true)).toBe(false); + }); +}); + +describe('getBodyFromV2SpecPayload', () => { + it('should successfully parse valid JSON body', () => { + const input = { + request: { + body: '{"key": "value", "number": 123}', + }, + }; + const expected = { + key: 'value', + number: 123, + }; + expect(utilities.getBodyFromV2SpecPayload(input)).toEqual(expected); + }); + + it('should throw TransformationError for malformed JSON', () => { + const input = { + request: { + body: '{invalid json}', + }, + }; + expect(() => utilities.getBodyFromV2SpecPayload(input)).toThrow( + ERROR_MESSAGES.MALFORMED_JSON_IN_REQUEST_BODY, + ); + }); + + it('should throw TransformationError when request body is missing', () => { + const input = { + request: {}, + }; + expect(() => utilities.getBodyFromV2SpecPayload(input)).toThrow( + ERROR_MESSAGES.REQUEST_BODY_NOT_PRESENT_IN_V2_SPEC_PAYLOAD, + ); + }); + + it('should throw TransformationError when request is missing', () => { + const input = {}; + expect(() => utilities.getBodyFromV2SpecPayload(input)).toThrow( + ERROR_MESSAGES.REQUEST_BODY_NOT_PRESENT_IN_V2_SPEC_PAYLOAD, + ); + }); + + it('should parse empty JSON object', () => { + const input = { + request: { + body: '{}', + }, + }; + expect(utilities.getBodyFromV2SpecPayload(input)).toEqual({}); + }); + + it('should parse JSON array', () => { + const input = { + request: { + body: '[1,2,3]', + }, + }; + expect(utilities.getBodyFromV2SpecPayload(input)).toEqual([1, 2, 3]); + }); +}); diff --git a/src/v0/util/recordUtils.js b/src/v0/util/recordUtils.js index a3dd65ef336..2df8a55ed0b 100644 --- a/src/v0/util/recordUtils.js +++ b/src/v0/util/recordUtils.js @@ -1,5 +1,5 @@ -const { InstrumentationError, getErrorRespEvents } = require('@rudderstack/integrations-lib'); -const { generateErrorObject } = require('./index'); +const { InstrumentationError } = require('@rudderstack/integrations-lib'); +const { generateErrorObject, getErrorRespEvents } = require('./index'); const eventTypes = ['update', 'insert', 'delete']; diff --git a/src/v1/destinations/iterable/networkHandler.ts b/src/v1/destinations/iterable/networkHandler.ts new file mode 100644 index 00000000000..e3edb5daab7 --- /dev/null +++ b/src/v1/destinations/iterable/networkHandler.ts @@ -0,0 +1,33 @@ +import { prepareProxyRequest, proxyRequest } from '../../../adapters/network'; +import { processAxiosResponse } from '../../../adapters/utils/networkUtils'; +import { BULK_ENDPOINTS } from '../../../v0/destinations/iterable/config'; +import { GenericStrategy } from './strategies/generic'; +import { TrackIdentifyStrategy } from './strategies/track-identify'; +import { GenericProxyHandlerInput } from './types'; + +const strategyRegistry: { [key: string]: any } = { + [TrackIdentifyStrategy.name]: new TrackIdentifyStrategy(), + [GenericStrategy.name]: new GenericStrategy(), +}; + +const getResponseStrategy = (endpoint: string) => { + if (BULK_ENDPOINTS.some((path) => endpoint.includes(path))) { + return strategyRegistry[TrackIdentifyStrategy.name]; + } + return strategyRegistry[GenericStrategy.name]; +}; + +const responseHandler = (responseParams: GenericProxyHandlerInput) => { + const { destinationRequest } = responseParams; + const strategy = getResponseStrategy(destinationRequest.endpoint); + return strategy.handleResponse(responseParams); +}; + +function networkHandler(this: any) { + this.prepareProxy = prepareProxyRequest; + this.proxy = proxyRequest; + this.processAxiosResponse = processAxiosResponse; + this.responseHandler = responseHandler; +} + +export { networkHandler }; diff --git a/src/v1/destinations/iterable/strategies/base.ts b/src/v1/destinations/iterable/strategies/base.ts new file mode 100644 index 00000000000..dfde1e92253 --- /dev/null +++ b/src/v1/destinations/iterable/strategies/base.ts @@ -0,0 +1,22 @@ +import { isHttpStatusSuccess } from '../../../../v0/util'; +import { GenericProxyHandlerInput } from '../types'; + +// Base strategy is the base class for all strategies in Iterable destination +abstract class BaseStrategy { + handleResponse(responseParams: GenericProxyHandlerInput): void { + const { destinationResponse } = responseParams; + const { status } = destinationResponse; + + if (!isHttpStatusSuccess(status)) { + return this.handleError(responseParams); + } + + return this.handleSuccess(responseParams); + } + + abstract handleError(responseParams: GenericProxyHandlerInput): void; + + abstract handleSuccess(responseParams: any): void; +} + +export { BaseStrategy }; diff --git a/src/v1/destinations/iterable/strategies/generic.ts b/src/v1/destinations/iterable/strategies/generic.ts new file mode 100644 index 00000000000..e43eb7623b5 --- /dev/null +++ b/src/v1/destinations/iterable/strategies/generic.ts @@ -0,0 +1,57 @@ +import { BaseStrategy } from './base'; +import { + GenericProxyHandlerInput, + IterableBulkApiResponse, + IterableSuccessResponse, +} from '../types'; +import { ProxyMetdata } from '../../../../types'; +import { TransformerProxyError } from '../../../../v0/util/errorTypes'; +import { TAG_NAMES } from '../../../../v0/util/tags'; +import { getDynamicErrorType } from '../../../../adapters/utils/networkUtils'; + +class GenericStrategy extends BaseStrategy { + handleSuccess(responseParams: { + destinationResponse: IterableBulkApiResponse; + rudderJobMetadata: ProxyMetdata[]; + }): IterableSuccessResponse { + const { destinationResponse, rudderJobMetadata } = responseParams; + const { status } = destinationResponse; + + const responseWithIndividualEvents = rudderJobMetadata.map((metadata) => ({ + statusCode: status, + metadata, + error: 'success', + })); + + return { + status, + message: '[ITERABLE Response Handler] - Request Processed Successfully', + destinationResponse, + response: responseWithIndividualEvents, + }; + } + + handleError(responseParams: GenericProxyHandlerInput): void { + const { destinationResponse, rudderJobMetadata } = responseParams; + const { response, status } = destinationResponse; + const responseMessage = response.params || response.msg || response.message; + const errorMessage = JSON.stringify(responseMessage) || 'unknown error format'; + + const responseWithIndividualEvents = rudderJobMetadata.map((metadata) => ({ + statusCode: status, + metadata, + error: errorMessage, + })); + + throw new TransformerProxyError( + `ITERABLE: Error transformer proxy during ITERABLE response transformation. ${errorMessage}`, + status, + { [TAG_NAMES.ERROR_TYPE]: getDynamicErrorType(status) }, + destinationResponse, + '', + responseWithIndividualEvents, + ); + } +} + +export { GenericStrategy }; diff --git a/src/v1/destinations/iterable/strategies/track-identify.ts b/src/v1/destinations/iterable/strategies/track-identify.ts new file mode 100644 index 00000000000..a8a08682514 --- /dev/null +++ b/src/v1/destinations/iterable/strategies/track-identify.ts @@ -0,0 +1,69 @@ +import { BaseStrategy } from './base'; +import { GenericProxyHandlerInput, IterableBulkProxyInput } from '../types'; +import { checkIfEventIsAbortableAndExtractErrorMessage } from '../utils'; +import { DeliveryJobState, DeliveryV1Response } from '../../../../types'; +import { TransformerProxyError } from '../../../../v0/util/errorTypes'; +import { getDynamicErrorType } from '../../../../adapters/utils/networkUtils'; +import { TAG_NAMES } from '../../../../v0/util/tags'; + +class TrackIdentifyStrategy extends BaseStrategy { + handleSuccess(responseParams: IterableBulkProxyInput): DeliveryV1Response { + const { destinationResponse, rudderJobMetadata, destinationRequest } = responseParams; + const { status } = destinationResponse; + const responseWithIndividualEvents: DeliveryJobState[] = []; + + const { events, users } = destinationRequest?.body.JSON || {}; + const finalData = events || users; + + if (finalData) { + finalData.forEach((event, idx) => { + const parsedOutput = { + statusCode: 200, + metadata: rudderJobMetadata[idx], + error: 'success', + }; + + const { isAbortable, errorMsg } = checkIfEventIsAbortableAndExtractErrorMessage( + event, + destinationResponse, + ); + if (isAbortable) { + parsedOutput.statusCode = 400; + parsedOutput.error = errorMsg; + } + responseWithIndividualEvents.push(parsedOutput); + }); + } + + return { + status, + message: '[ITERABLE Response Handler] - Request Processed Successfully', + destinationResponse, + response: responseWithIndividualEvents, + }; + } + + handleError(responseParams: GenericProxyHandlerInput): void { + const { destinationResponse, rudderJobMetadata } = responseParams; + const { response, status } = destinationResponse; + const responseMessage = response.params || response.msg || response.message; + const errorMessage = JSON.stringify(responseMessage) || 'unknown error format'; + + const responseWithIndividualEvents = rudderJobMetadata.map((metadata) => ({ + statusCode: status, + metadata, + error: errorMessage, + })); + + throw new TransformerProxyError( + `ITERABLE: Error transformer proxy during ITERABLE response transformation. ${errorMessage}`, + status, + { [TAG_NAMES.ERROR_TYPE]: getDynamicErrorType(status) }, + destinationResponse, + '', + responseWithIndividualEvents, + ); + } +} + +export { TrackIdentifyStrategy }; diff --git a/src/v1/destinations/iterable/types.ts b/src/v1/destinations/iterable/types.ts new file mode 100644 index 00000000000..f0875494ed3 --- /dev/null +++ b/src/v1/destinations/iterable/types.ts @@ -0,0 +1,69 @@ +import { ProxyMetdata, ProxyV1Request } from '../../../types'; + +type FailedUpdates = { + invalidEmails?: string[]; + invalidUserIds?: string[]; + notFoundEmails?: string[]; + notFoundUserIds?: string[]; + invalidDataEmails?: string[]; + invalidDataUserIds?: string[]; + conflictEmails?: string[]; + conflictUserIds?: string[]; + forgottenEmails?: string[]; + forgottenUserIds?: string[]; +}; + +export type GeneralApiResponse = { + msg?: string; + code?: string; + params?: Record; + successCount?: number; + failCount?: number; + invalidEmails?: string[]; + invalidUserIds?: string[]; + filteredOutFields?: string[]; + createdFields?: string[]; + disallowedEventNames?: string[]; + failedUpdates?: FailedUpdates; +}; + +export type IterableBulkApiResponse = { + status: number; + response: GeneralApiResponse; +}; + +type IterableBulkRequestBody = { + events?: any[]; + users?: any[]; +}; + +export type IterableBulkProxyInput = { + destinationResponse: IterableBulkApiResponse; + rudderJobMetadata: ProxyMetdata[]; + destType: string; + destinationRequest?: { + body: { + JSON: IterableBulkRequestBody; + }; + }; +}; + +export type GenericProxyHandlerInput = { + destinationResponse: any; + rudderJobMetadata: ProxyMetdata[]; + destType: string; + destinationRequest: ProxyV1Request; +}; + +export type Response = { + statusCode: number; + metadata: any; + error: string; +}; + +export type IterableSuccessResponse = { + status: number; + message: string; + destinationResponse: IterableBulkApiResponse; + response: Response[]; +}; diff --git a/src/v1/destinations/iterable/utils.test.ts b/src/v1/destinations/iterable/utils.test.ts new file mode 100644 index 00000000000..a556e3704f8 --- /dev/null +++ b/src/v1/destinations/iterable/utils.test.ts @@ -0,0 +1,184 @@ +import { checkIfEventIsAbortableAndExtractErrorMessage } from './utils'; +describe('checkIfEventIsAbortableAndExtractErrorMessage', () => { + // Returns non-abortable and empty error message when failCount is 0 + it('should return non-abortable and empty error message when failCount is 0', () => { + const event = { + email: 'test@example.com', + userId: 'user123', + eventName: 'testEvent', + }; + const destinationResponse = { + status: 200, + response: { + failCount: 0, + }, + }; + + const result = checkIfEventIsAbortableAndExtractErrorMessage(event, destinationResponse); + expect(result).toEqual({ isAbortable: false, errorMsg: '' }); + }); + + // Handles undefined or null event fields gracefully + it('should handle undefined or null event fields gracefully', () => { + const event = { + email: null, + userId: undefined, + eventName: 'testEvent', + }; + const destinationResponse = { + status: 200, + response: { + failCount: 1, + invalidEmails: ['test@example.com'], + }, + }; + const result = checkIfEventIsAbortableAndExtractErrorMessage(event, destinationResponse); + expect(result).toEqual({ isAbortable: false, errorMsg: '' }); + }); + + // Handles events with all expected fields present + it('should handle events with all expected fields present and return non-abortable when no match', () => { + const event = { + email: 'test@example.com', + userId: 'user123', + eventName: 'purchase', + id: 'event123', + createdAt: '2023-10-01T00:00:00Z', + campaignId: 'campaign123', + templateId: 'template123', + createNewFields: true, + dataFields: { field1: 'value1' }, + }; + + const destinationResponse = { + status: 200, + response: { + failCount: 1, + invalidEmails: ['another@example.com'], + }, + }; + + const result = checkIfEventIsAbortableAndExtractErrorMessage(event, destinationResponse); + + expect(result.isAbortable).toBe(false); + expect(result.errorMsg).toBe(''); + }); + + // Returns appropriate error message for abortable event + + it('should find the right value for which it should fail and passes otherwise for emails', () => { + const event = { + email: 'test', + userId: 'user123', + eventName: 'purchase', + dataFields: { customField1: 'value1', customField2: 'value2' }, + }; + const destinationResponse = { + status: 200, + response: { + failCount: 1, + failedUpdates: { + invalidEmails: ['test'], + }, + }, + }; + const result = checkIfEventIsAbortableAndExtractErrorMessage(event, destinationResponse); + expect(result).toEqual({ + isAbortable: true, + errorMsg: 'email error:"test" in "failedUpdates.invalidEmails".', + }); + }); + + it('should find the right value for which it should fail', () => { + const event = { + email: 'test@gmail.com', + userId: 'user123', + eventName: 'purchase', + dataFields: { customField1: 'test', customField2: 'value2' }, + }; + const destinationResponse = { + status: 200, + response: { + failCount: 1, + failedUpdates: { + invalidEmails: ['test'], + }, + }, + }; + const result = checkIfEventIsAbortableAndExtractErrorMessage(event, destinationResponse); + expect(result.isAbortable).toBe(false); + expect(result.errorMsg).toBe(''); + }); + + it('should find all the matching paths it failed for and curate error message', () => { + const event = { + email: 'test', + userId: 'user123', + eventName: 'purchase', + dataFields: { customField1: 'test', customField2: 'value2' }, + }; + const destinationResponse = { + status: 200, + response: { + failCount: 1, + invalidEmails: ['test'], + failedUpdates: { + invalidEmails: ['test'], + conflictEmails: ['test'], + }, + }, + }; + const result = checkIfEventIsAbortableAndExtractErrorMessage(event, destinationResponse); + expect(result.isAbortable).toBe(true); + expect(result.errorMsg).toBe( + 'email error:"test" in "invalidEmails,failedUpdates.invalidEmails,failedUpdates.conflictEmails".', + ); + }); + + it('should find the right value for which it should fail and passes otherwise for userIds', () => { + const event = { + email: 'test', + userId: 'user123', + eventName: 'purchase', + dataFields: { customField1: 'value1', customField2: 'value2' }, + }; + const destinationResponse = { + status: 200, + response: { + failCount: 1, + failedUpdates: { + invalidUserIds: ['user123'], + }, + }, + }; + const result = checkIfEventIsAbortableAndExtractErrorMessage(event, destinationResponse); + expect(result).toEqual({ + isAbortable: true, + errorMsg: 'userId error:"user123" in "failedUpdates.invalidUserIds".', + }); + }); + + it('should find the right value for which it should fail and passes otherwise for disallowed events', () => { + const event = { + email: 'test', + userId: 'user123', + eventName: 'purchase', + dataFields: { customField1: 'value1', customField2: 'value2' }, + }; + const destinationResponse = { + status: 200, + response: { + failCount: 1, + disallowedEventNames: ['purchase'], + failedUpdates: { + invalidUserIds: [], + }, + }, + }; + const result = checkIfEventIsAbortableAndExtractErrorMessage(event, destinationResponse); + expect(result).toEqual({ + isAbortable: true, + errorMsg: 'eventName error:"purchase" in "disallowedEventNames".', + }); + }); +}); diff --git a/src/v1/destinations/iterable/utils.ts b/src/v1/destinations/iterable/utils.ts new file mode 100644 index 00000000000..90985a8e949 --- /dev/null +++ b/src/v1/destinations/iterable/utils.ts @@ -0,0 +1,92 @@ +import { + ITERABLE_RESPONSE_EMAIL_PATHS, + ITERABLE_RESPONSE_USER_ID_PATHS, +} from '../../../v0/destinations/iterable/config'; +import { IterableBulkApiResponse } from './types'; + +const get = require('get-value'); + +/** + * Checks if a value is present in a response array based on a given path. + * @param {Object} response - The response object to search within. + * @param {string} path - The path to the response array. + * @param {any} value - The value to check for in the array. + * @returns {boolean} - True if the value is in the array, otherwise false. + */ +const isValueInResponseArray = (destinationResponse, path, value) => { + const respArr = get(destinationResponse, path); + return Array.isArray(respArr) && respArr.includes(value); +}; + +/** + * Determines if an event should be aborted based on the response from a destination + * and extracts an error message if applicable. + * ref: + * 1) https://api.iterable.com/api/docs#users_updateEmail + * 2) https://api.iterable.com/api/docs#events_track + * 3) https://api.iterable.com/api/docs#users_bulkUpdateUser + * 4) https://api.iterable.com/api/docs#events_trackBulk + * 5) https://api.iterable.com/api/docs#catalogs_bulkUpdateCatalogItems + * 6) https://api.iterable.com/api/docs#users_registerDeviceToken + * 7) https://api.iterable.com/api/docs#users_registerBrowserToken + * 8) https://api.iterable.com/api/docs#commerce_trackPurchase + * 9) https://api.iterable.com/api/docs#commerce_updateCart + * + * @param {Object} event - The event object containing various event properties. + * @param {Object} destinationResponse - The response object from the destination. + * @returns {Object} An object containing a boolean `isAbortable` indicating if the event + * should be aborted, and an `errorMsg` string with the error message if applicable. + */ + +export const checkIfEventIsAbortableAndExtractErrorMessage = ( + event: any, + destinationResponse: IterableBulkApiResponse, +): { + isAbortable: boolean; + errorMsg: string; +} => { + const { failCount } = destinationResponse.response; + + if (failCount === 0) { + return { isAbortable: false, errorMsg: '' }; + } + + const eventValues = { + email: event.email, + userId: event.userId, + eventName: event.eventName, + }; + + let errorMsg = ''; + const userIdMatchPath = ITERABLE_RESPONSE_USER_ID_PATHS.filter((userIdPath) => + isValueInResponseArray(destinationResponse.response, userIdPath, eventValues.userId), + ); + if (userIdMatchPath.length > 0) { + errorMsg += `userId error:"${eventValues.userId}" in "${userIdMatchPath}".`; + } + + const emailMatchPath = ITERABLE_RESPONSE_EMAIL_PATHS.filter((emailPath) => + isValueInResponseArray(destinationResponse.response, emailPath, eventValues.email), + ); + + if (emailMatchPath.length > 0) { + errorMsg += `email error:"${eventValues.email}" in "${emailMatchPath}".`; + } + + const eventNameMatchPath = ['disallowedEventNames'].filter((eventNamePath) => + isValueInResponseArray(destinationResponse.response, eventNamePath, eventValues.eventName), + ); + + if (eventNameMatchPath.length > 0) { + errorMsg += `eventName error:"${eventValues.eventName}" in "${eventNameMatchPath}".`; + } + + if (errorMsg) { + return { + isAbortable: true, + errorMsg, + }; + } + + return { isAbortable: false, errorMsg: '' }; +}; diff --git a/src/v1/sources/shopify/config.js b/src/v1/sources/shopify/config.js index 5d88353d60c..f39a3e3cd19 100644 --- a/src/v1/sources/shopify/config.js +++ b/src/v1/sources/shopify/config.js @@ -31,10 +31,26 @@ const PIXEL_EVENT_MAPPING = { checkout_address_info_submitted: 'Checkout Address Info Submitted', checkout_contact_info_submitted: 'Checkout Contact Info Submitted', checkout_shipping_info_submitted: 'Checkout Shipping Info Submitted', - payment_info_submitted: 'Payment Info Submitted', + payment_info_submitted: 'Payment Info Entered', search_submitted: 'Search Submitted', }; +const ECOM_TOPICS = { + CHECKOUTS_CREATE: 'checkouts_create', + CHECKOUTS_UPDATE: 'checkouts_update', + ORDERS_UPDATE: 'orders_updated', + ORDERS_CREATE: 'orders_create', + ORDERS_CANCELLED: 'orders_cancelled', +}; + +const RUDDER_ECOM_MAP = { + checkouts_create: 'Checkout Started Webhook', + checkouts_update: 'Checkout Updated', + orders_updated: 'Order Updated', + orders_create: 'Order Created', + orders_cancelled: 'Order Cancelled', +}; + const contextualFieldMappingJSON = JSON.parse( fs.readFileSync(path.resolve(__dirname, 'pixelEventsMappings', 'contextualFieldMapping.json')), ); @@ -63,6 +79,18 @@ const checkoutStartedCompletedEventMappingJSON = JSON.parse( ), ); +const identifyMappingJSON = JSON.parse( + fs.readFileSync(path.resolve(__dirname, 'webhookEventsMapping', 'identifyMapping.json')), +); + +const productMappingJSON = JSON.parse( + fs.readFileSync(path.resolve(__dirname, 'webhookEventsMapping', 'productMapping.json')), +); + +const lineItemsMappingJSON = JSON.parse( + fs.readFileSync(path.resolve(__dirname, 'webhookEventsMapping', 'lineItemsMapping.json')), +); + const pixelEventToCartTokenLocationMapping = { cart_viewed: 'properties.cart_id', checkout_address_info_submitted: commonCartTokenLocation, @@ -79,6 +107,8 @@ module.exports = { INTEGERATION, PIXEL_EVENT_TOPICS, PIXEL_EVENT_MAPPING, + ECOM_TOPICS, + RUDDER_ECOM_MAP, contextualFieldMappingJSON, cartViewedEventMappingJSON, productListViewedEventMappingJSON, @@ -86,4 +116,7 @@ module.exports = { productToCartEventMappingJSON, checkoutStartedCompletedEventMappingJSON, pixelEventToCartTokenLocationMapping, + productMappingJSON, + lineItemsMappingJSON, + identifyMappingJSON, }; diff --git a/src/v1/sources/shopify/pixelEventsMappings/campaignObjectMappings.json b/src/v1/sources/shopify/pixelEventsMappings/campaignObjectMappings.json new file mode 100644 index 00000000000..319502e377b --- /dev/null +++ b/src/v1/sources/shopify/pixelEventsMappings/campaignObjectMappings.json @@ -0,0 +1,18 @@ +[ + { + "sourceKeys": "utm_campaign", + "destKeys": "name" + }, + { + "sourceKeys": "utm_medium", + "destKeys": "medium" + }, + { + "sourceKeys": "utm_term", + "destKeys": "term" + }, + { + "sourceKeys": "utm_content", + "destKeys": "content" + } +] diff --git a/src/v1/sources/shopify/transform.js b/src/v1/sources/shopify/transform.js index 5ebf4a34fc5..23228ecc10f 100644 --- a/src/v1/sources/shopify/transform.js +++ b/src/v1/sources/shopify/transform.js @@ -1,29 +1,13 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -const { processPixelWebEvents } = require('./webpixelTransformations/pixelTransform'); -const { process: processWebhookEvents } = require('../../../v0/sources/shopify/transform'); -const { - process: processPixelWebhookEvents, -} = require('./webhookTransformations/serverSideTransform'); +const { process: processV0 } = require('../../../v0/sources/shopify/transform'); +const { processV1Events } = require('./transformV1'); +const { isShopifyV1Event } = require('./utils'); const process = async (inputEvent) => { const { event } = inputEvent; - const { query_parameters } = event; - // check identify the event is from the web pixel based on the pixelEventLabel property. - const { pixelEventLabel: pixelClientEventLabel } = event; - if (pixelClientEventLabel) { - // this is a event fired from the web pixel loaded on the browser - // by the user interactions with the store. - const pixelWebEventResponse = await processPixelWebEvents(event); - return pixelWebEventResponse; + if (isShopifyV1Event(event)) { + return processV1Events(event); } - if (query_parameters && query_parameters?.version?.[0] === 'pixel') { - // this is a server-side event from the webhook subscription made by the pixel app. - const pixelWebhookEventResponse = await processPixelWebhookEvents(event); - return pixelWebhookEventResponse; - } - // this is a server-side event from the webhook subscription made by the legacy tracker-based app. - const response = await processWebhookEvents(event); - return response; + return processV0(event); }; module.exports = { process }; diff --git a/src/v1/sources/shopify/transformV1.js b/src/v1/sources/shopify/transformV1.js new file mode 100644 index 00000000000..bf8f6d7241c --- /dev/null +++ b/src/v1/sources/shopify/transformV1.js @@ -0,0 +1,36 @@ +const { PlatformError } = require('@rudderstack/integrations-lib'); +const { isIdentifierEvent, processIdentifierEvent } = require('./utils'); +const { processWebhookEvents } = require('./webhookTransformations/serverSideTransform'); +const { processPixelWebEvents } = require('./webpixelTransformations/pixelTransform'); + +const processV1Events = async (event) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { query_parameters } = event; + + // these are the events from the front-end tracking, viz. web-pixel or theme-app extension. + const { pixelEventLabel: clientSideEvent } = event; + const isServerSideEvent = query_parameters && query_parameters?.version?.[0] === 'pixel'; + + if (clientSideEvent) { + // check if the event is an identifier event, used to set the anonymousId in the redis for identity stitching. + if (isIdentifierEvent(event)) { + return processIdentifierEvent(event); + } + // handle events from the app pixel. + const pixelWebEventResponse = await processPixelWebEvents(event); + return pixelWebEventResponse; + } + if (isServerSideEvent) { + // this is a server-side event from the webhook subscription made by the pixel app. + const pixelWebhookEventResponse = await processWebhookEvents(event); + return pixelWebhookEventResponse; + } + throw new PlatformError( + 'Invalid Event for Shopiyf V1 (not matching client or server side event requirements)', + 500, + ); +}; + +module.exports = { + processV1Events, +}; diff --git a/src/v1/sources/shopify/utils.js b/src/v1/sources/shopify/utils.js new file mode 100644 index 00000000000..4a63e780759 --- /dev/null +++ b/src/v1/sources/shopify/utils.js @@ -0,0 +1,69 @@ +const { RedisDB } = require('../../../util/redis/redisConnector'); +const stats = require('../../../util/stats'); + +const NO_OPERATION_SUCCESS = { + outputToSource: { + body: Buffer.from('OK').toString('base64'), + contentType: 'text/plain', + }, + statusCode: 200, +}; + +/** + * Updates the anonymousId to userId mapping in Redis + * @param {String} anonymousId + * @param {String} userId + */ +const updateAnonymousIdToUserIdInRedis = async (anonymousId, userId) => { + if (anonymousId && userId) { + // set the anonymousId to userId mapping in Redis for 24 hours + await RedisDB.setVal(`pixel:${anonymousId}`, ['userId', userId], 86400).then(() => { + stats.increment('shopify_pixel_userid_mapping', { + action: 'stitchUserIdToAnonId', + operation: 'set', + }); + }); + } +}; + +const isIdentifierEvent = (payload) => ['rudderIdentifier'].includes(payload?.event); + +/** + * Sets the cartToken <-> anonymousId mapping or anonymousId <-> userId mapping in Redis based on the event action + * @param {Object} event + * @returns {Object} NO_OPERATION_SUCCESS + */ +const processIdentifierEvent = async (event) => { + const { cartToken, anonymousId, userId, action } = event; + if (cartToken && anonymousId && action === 'stitchCartTokenToAnonId') { + // set the cartToken to anonymousId mapping in Redis for 12 hours + await RedisDB.setVal(`pixel:${cartToken}`, ['anonymousId', anonymousId], 43200).then(() => { + stats.increment('shopify_pixel_cart_token_mapping', { + action: 'stitchCartTokenToAnonId', + operation: 'set', + }); + }); + } + if (action === 'stitchUserIdToAnonId') { + updateAnonymousIdToUserIdInRedis(anonymousId, userId); + } + return NO_OPERATION_SUCCESS; +}; + +const isShopifyV1Event = (event) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { query_parameters } = event; + const { pixelEventLabel: pixelClientEventLabel } = event; + + return !!( + (query_parameters && query_parameters?.version?.[0] === 'pixel') || + pixelClientEventLabel + ); +}; + +module.exports = { + processIdentifierEvent, + isIdentifierEvent, + isShopifyV1Event, + updateAnonymousIdToUserIdInRedis, +}; diff --git a/src/v1/sources/shopify/utils.test.js b/src/v1/sources/shopify/utils.test.js new file mode 100644 index 00000000000..2945b69e870 --- /dev/null +++ b/src/v1/sources/shopify/utils.test.js @@ -0,0 +1,148 @@ +const { + isIdentifierEvent, + processIdentifierEvent, + updateAnonymousIdToUserIdInRedis, +} = require('./utils'); +const { RedisDB } = require('../../../util/redis/redisConnector'); +const stats = require('../../../util/stats'); + +jest.mock('../../../util/stats', () => ({ + increment: jest.fn(), +})); + +describe('Identifier Utils Tests', () => { + describe('test isIdentifierEvent', () => { + it('should return true if the event is rudderIdentifier', () => { + const event = { event: 'rudderIdentifier' }; + expect(isIdentifierEvent(event)).toBe(true); + }); + + it('should return false if the event is not rudderIdentifier', () => { + const event = { event: 'checkout started' }; + expect(isIdentifierEvent(event)).toBe(false); + }); + }); + + describe('test processIdentifierEvent', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should set the cartToken mapping in redis and increment stats', async () => { + const setValSpy = jest.spyOn(RedisDB, 'setVal').mockResolvedValue('OK'); + const event = { + cartToken: 'cartTokenTest1', + anonymousId: 'anonymousIdTest1', + action: 'stitchCartTokenToAnonId', + }; + + const response = await processIdentifierEvent(event); + + expect(setValSpy).toHaveBeenCalledWith( + 'pixel:cartTokenTest1', + ['anonymousId', 'anonymousIdTest1'], + 43200, + ); + expect(stats.increment).toHaveBeenCalledWith('shopify_pixel_cart_token_mapping', { + action: 'stitchCartTokenToAnonId', + operation: 'set', + }); + expect(response).toEqual({ + outputToSource: { + body: Buffer.from('OK').toString('base64'), + contentType: 'text/plain', + }, + statusCode: 200, + }); + }); + + it('should update the anonymousId to userId mapping in redis and increment stats', async () => { + const setValSpy = jest.spyOn(RedisDB, 'setVal').mockResolvedValue('OK'); + const event = { + anonymousId: 'anonymousIdTest1', + userId: 'userIdTest1', + action: 'stitchUserIdToAnonId', + }; + + const response = await processIdentifierEvent(event); + + expect(setValSpy).toHaveBeenCalled(); + expect(stats.increment).toHaveBeenCalledWith('shopify_pixel_userid_mapping', { + action: 'stitchUserIdToAnonId', + operation: 'set', + }); + expect(response).toEqual({ + outputToSource: { + body: Buffer.from('OK').toString('base64'), + contentType: 'text/plain', + }, + statusCode: 200, + }); + }); + + it('should handle redis errors and increment error stats', async () => { + const error = new Error('Redis connection failed'); + jest.spyOn(RedisDB, 'setVal').mockRejectedValue(error); + const event = { + cartToken: 'cartTokenTest1', + anonymousId: 'anonymousIdTest1', + action: 'stitchCartTokenToAnonId', + }; + + await expect(processIdentifierEvent(event)).rejects.toThrow('Redis connection failed'); + expect(stats.increment).not.toHaveBeenCalled(); + }); + }); + + describe('test updateAnonymousIdToUserIdInRedis', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should update the anonymousId to userId in redis and increment stats', async () => { + const setValSpy = jest.spyOn(RedisDB, 'setVal').mockResolvedValue('OK'); + const event = { + anonymousId: 'anonymousTest1', + userId: 'userIdTest1', + }; + + await updateAnonymousIdToUserIdInRedis(event.anonymousId, event.userId); + + expect(setValSpy).toHaveBeenCalledWith( + 'pixel:anonymousTest1', + ['userId', 'userIdTest1'], + 86400, + ); + expect(stats.increment).toHaveBeenCalledWith('shopify_pixel_userid_mapping', { + action: 'stitchUserIdToAnonId', + operation: 'set', + }); + }); + + it('should handle redis errors in updateAnonymousIdToUserIdInRedis', async () => { + const error = new Error('Redis connection failed'); + jest.spyOn(RedisDB, 'setVal').mockRejectedValue(error); + const event = { + anonymousId: 'anonymousTest1', + userId: 'userIdTest1', + }; + + await expect( + updateAnonymousIdToUserIdInRedis(event.anonymousId, event.userId), + ).rejects.toThrow('Redis connection failed'); + expect(stats.increment).not.toHaveBeenCalled(); + }); + + it('should handle null values and not call Redis or stats', async () => { + const setValSpy = jest.spyOn(RedisDB, 'setVal').mockResolvedValue('OK'); + const event = { + anonymousId: null, + userId: null, + }; + + await updateAnonymousIdToUserIdInRedis(event.anonymousId, event.userId); + expect(setValSpy).not.toHaveBeenCalled(); + expect(stats.increment).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/src/v1/sources/shopify/webhookEventsMapping/identifyMapping.json b/src/v1/sources/shopify/webhookEventsMapping/identifyMapping.json new file mode 100644 index 00000000000..03672675028 --- /dev/null +++ b/src/v1/sources/shopify/webhookEventsMapping/identifyMapping.json @@ -0,0 +1,112 @@ +[ + { + "sourceKeys": "id", + "destKeys": "userId" + }, + { + "sourceKeys": "email", + "destKeys": "traits.email" + }, + + { + "sourceKeys": "first_name", + "destKeys": "traits.firstName" + }, + + { + "sourceKeys": "last_name", + "destKeys": "traits.lastName" + }, + + { + "sourceKeys": "phone", + "destKeys": "traits.phone" + }, + + { + "sourceKeys": "addresses", + "destKeys": "traits.addressList" + }, + + { + "sourceKeys": "default_address", + "destKeys": "traits.address" + }, + + { + "sourceKeys": "shipping_address", + "destKeys": "traits.shippingAddress" + }, + + { + "sourceKeys": "billing_address", + "destKeys": "traits.billingAddress" + }, + + { + "sourceKeys": "accepts_marketing", + "destKeys": "traits.acceptsMarketing" + }, + + { + "sourceKeys": "orders_count", + "destKeys": "traits.orderCount" + }, + + { + "sourceKeys": "state", + "destKeys": "traits.state" + }, + { + "sourceKeys": "total_spent", + "destKeys": "traits.totalSpent" + }, + { + "sourceKeys": "note", + "destKeys": "traits.note" + }, + { + "sourceKeys": "verified_email", + "destKeys": "traits.verifiedEmail" + }, + { + "sourceKeys": "multipass_identifier", + "destKeys": "traits.multipassIdentifier" + }, + { + "sourceKeys": "tax_exempt", + "destKeys": "traits.taxExempt" + }, + { + "sourceKeys": "tags", + "destKeys": "traits.tags" + }, + { + "sourceKeys": "last_order_name", + "destKeys": "traits.lastOrderName" + }, + { + "sourceKeys": "currency", + "destKeys": "traits.currency" + }, + { + "sourceKeys": "marketing_opt_in_level", + "destKeys": "traits.marketingOptInLevel" + }, + { + "sourceKeys": "tax_exemptions", + "destKeys": "traits.taxExemptions" + }, + { + "sourceKeys": "sms_marketing_consent", + "destKeys": "traits.smsMarketingConsent" + }, + { + "sourceKeys": "admin_graphql_api_id", + "destKeys": "traits.adminGraphqlApiId" + }, + { + "sourceKeys": "accepts_marketing_updated_at", + "destKeys": "traits.acceptsMarketingUpdatedAt" + } +] diff --git a/src/v1/sources/shopify/webhookEventsMapping/lineItemsMapping.json b/src/v1/sources/shopify/webhookEventsMapping/lineItemsMapping.json new file mode 100644 index 00000000000..3bcef331b07 --- /dev/null +++ b/src/v1/sources/shopify/webhookEventsMapping/lineItemsMapping.json @@ -0,0 +1,32 @@ +[ + { + "sourceKeys": "product_id", + "destKey": "product_id", + "metadata": { + "type": "toString" + } + }, + { + "sourceKeys": "sku", + "destKey": "sku" + }, + { + "sourceKeys": "name", + "destKey": "title" + }, + { + "sourceKeys": "price", + "destKey": "price", + "metadata": { + "type": "toNumber" + } + }, + { + "sourceKeys": "vendor", + "destKey": "brand" + }, + { + "sourceKeys": "quantity", + "destKey": "quantity" + } +] diff --git a/src/v1/sources/shopify/webhookEventsMapping/mapping.json b/src/v1/sources/shopify/webhookEventsMapping/mapping.json new file mode 100644 index 00000000000..6c268ef13c6 --- /dev/null +++ b/src/v1/sources/shopify/webhookEventsMapping/mapping.json @@ -0,0 +1,10 @@ +[ + { + "sourceKeys": "line_items", + "destKeys": "products" + }, + { + "sourceKeys": "id", + "destKeys": "properties.order_id" + } +] diff --git a/src/v1/sources/shopify/webhookEventsMapping/productMapping.json b/src/v1/sources/shopify/webhookEventsMapping/productMapping.json new file mode 100644 index 00000000000..7bd20498286 --- /dev/null +++ b/src/v1/sources/shopify/webhookEventsMapping/productMapping.json @@ -0,0 +1,27 @@ +[ + { + "sourceKeys": "id", + "destKey": "order_id", + "metadata": { + "type": "toString" + } + }, + { + "sourceKeys": "total_price", + "destKey": "value", + "metadata": { + "type": "toNumber" + } + }, + { + "sourceKeys": "total_tax", + "destKey": "tax", + "metadata": { + "type": "toNumber" + } + }, + { + "sourceKeys": "currency", + "destKey": "currency" + } +] diff --git a/src/v1/sources/shopify/webhookTransformations/serverSideTransform.js b/src/v1/sources/shopify/webhookTransformations/serverSideTransform.js index 292a980a93b..c49eb97b6d9 100644 --- a/src/v1/sources/shopify/webhookTransformations/serverSideTransform.js +++ b/src/v1/sources/shopify/webhookTransformations/serverSideTransform.js @@ -1,26 +1,27 @@ -/* eslint-disable @typescript-eslint/naming-convention */ const lodash = require('lodash'); const get = require('get-value'); +const { isDefinedNotNullNotEmpty } = require('@rudderstack/integrations-lib'); const stats = require('../../../../util/stats'); -const { getShopifyTopic, extractEmailFromPayload } = require('../../../../v0/sources/shopify/util'); -const { removeUndefinedAndNullValues, isDefinedAndNotNull } = require('../../../../v0/util'); -const Message = require('../../../../v0/sources/message'); +const { getShopifyTopic } = require('../../../../v0/sources/shopify/util'); +const { removeUndefinedAndNullValues } = require('../../../../v0/util'); +const Message = require('../../../../sources/message'); const { EventType } = require('../../../../constants'); const { - INTEGERATION, - MAPPING_CATEGORIES, IDENTIFY_TOPICS, - ECOM_TOPICS, - RUDDER_ECOM_MAP, SUPPORTED_TRACK_EVENTS, SHOPIFY_TRACK_MAP, - lineItemsMappingJSON, } = require('../../../../v0/sources/shopify/config'); +const { INTEGERATION, identifyMappingJSON, lineItemsMappingJSON } = require('../config'); +const { ECOM_TOPICS, RUDDER_ECOM_MAP } = require('../config'); const { createPropertiesForEcomEventFromWebhook, getProductsFromLineItems, - getAnonymousIdFromAttributes, + setAnonymousId, + handleCommonProperties, + addCartTokenHashToTraits, } = require('./serverSideUtlis'); +const { updateAnonymousIdToUserIdInRedis } = require('../utils'); +const { RedisDB } = require('../../../../util/redis/redisConnector'); const NO_OPERATION_SUCCESS = { outputToSource: { @@ -33,7 +34,7 @@ const NO_OPERATION_SUCCESS = { const identifyPayloadBuilder = (event) => { const message = new Message(INTEGERATION); message.setEventType(EventType.IDENTIFY); - message.setPropertiesV2(event, MAPPING_CATEGORIES[EventType.IDENTIFY]); + message.setPropertiesV2(event, identifyMappingJSON); if (event.updated_at) { // converting shopify updated_at timestamp to rudder timestamp format message.setTimestamp(new Date(event.updated_at).toISOString()); @@ -46,28 +47,22 @@ const ecomPayloadBuilder = (event, shopifyTopic) => { message.setEventType(EventType.TRACK); message.setEventName(RUDDER_ECOM_MAP[shopifyTopic]); - const properties = createPropertiesForEcomEventFromWebhook(event); + const properties = createPropertiesForEcomEventFromWebhook(event, shopifyTopic); message.properties = removeUndefinedAndNullValues(properties); // Map Customer details if present const customerDetails = get(event, 'customer'); if (customerDetails) { - message.setPropertiesV2(customerDetails, MAPPING_CATEGORIES[EventType.IDENTIFY]); + message.setPropertiesV2(customerDetails, identifyMappingJSON); } if (event.updated_at) { message.setTimestamp(new Date(event.updated_at).toISOString()); } - if (event.customer) { - message.setPropertiesV2(event.customer, MAPPING_CATEGORIES[EventType.IDENTIFY]); - } if (event.shipping_address) { message.setProperty('traits.shippingAddress', event.shipping_address); } if (event.billing_address) { message.setProperty('traits.billingAddress', event.billing_address); } - if (!message.userId && event.user_id) { - message.setProperty('userId', event.user_id); - } return message; }; @@ -82,9 +77,46 @@ const trackPayloadBuilder = (event, shopifyTopic) => { return message; }; +/** + * Creates an identify event with userId and anonymousId from message object and identifyMappingJSON + * @param {String} message + * @returns {Message} identifyEvent + */ +const createIdentifyEvent = (message) => { + const { userId, anonymousId, traits } = message; + const identifyEvent = new Message(INTEGERATION); + identifyEvent.setEventType(EventType.IDENTIFY); + if (userId) { + identifyEvent.userId = userId; + } + if (anonymousId) { + identifyEvent.anonymousId = anonymousId; + } + const mappedTraits = {}; + identifyMappingJSON.forEach((mapping) => { + if (mapping.destKeys.startsWith('traits.')) { + const traitKey = mapping.destKeys.replace('traits.', ''); + const sourceValue = get(traits, traitKey); + if (sourceValue !== undefined) { + lodash.set(mappedTraits, traitKey, sourceValue); + } + } + }); + // Set the mapped traits + identifyEvent.context.traits = removeUndefinedAndNullValues(mappedTraits); + identifyEvent.setProperty(`integrations.${INTEGERATION}`, true); + identifyEvent.setProperty('context.library', { + eventOrigin: 'server', + name: 'RudderStack Shopify Cloud', + version: '2.0.0', + }); + return identifyEvent; +}; + const processEvent = async (inputEvent, metricMetadata) => { let message; const event = lodash.cloneDeep(inputEvent); + const { customer } = event; const shopifyTopic = getShopifyTopic(event); delete event.query_parameters; switch (shopifyTopic) { @@ -96,6 +128,7 @@ const processEvent = async (inputEvent, metricMetadata) => { case ECOM_TOPICS.ORDERS_UPDATE: case ECOM_TOPICS.CHECKOUTS_CREATE: case ECOM_TOPICS.CHECKOUTS_UPDATE: + case ECOM_TOPICS.ORDERS_CANCELLED: message = ecomPayloadBuilder(event, shopifyTopic); break; default: @@ -110,42 +143,41 @@ const processEvent = async (inputEvent, metricMetadata) => { message = trackPayloadBuilder(event, shopifyTopic); break; } - - if (message.userId) { - message.userId = String(message.userId); - } - if (!get(message, 'traits.email')) { - const email = extractEmailFromPayload(event); - if (email) { - message.setProperty('traits.email', email); - } - } // attach anonymousId if the event is track event using note_attributes if (message.type !== EventType.IDENTIFY) { - const anonymousId = getAnonymousIdFromAttributes(event); - if (isDefinedAndNotNull(anonymousId)) { - message.setProperty('anonymousId', anonymousId); - } + await setAnonymousId(message, event, metricMetadata); + await updateAnonymousIdToUserIdInRedis(message.anonymousId, message.userId); } - message.setProperty(`integrations.${INTEGERATION}`, true); - message.setProperty('context.library', { - eventOrigin: 'server', - name: 'RudderStack Shopify Cloud', - version: '2.0.0', - }); - message.setProperty('context.topic', shopifyTopic); - // attaching cart, checkout and order tokens in context object - message.setProperty(`context.cart_token`, event.cart_token); - message.setProperty(`context.checkout_token`, event.checkout_token); - // raw shopify payload passed inside context object under shopifyDetails - message.setProperty('context.shopifyDetails', event); - if (shopifyTopic === 'orders_updated') { - message.setProperty(`context.order_token`, event.token); + // attach email and other contextual properties + message = handleCommonProperties(message, event, shopifyTopic); + // add cart_token_hash to traits if cart_token is present + message = addCartTokenHashToTraits(message, event); + const redisData = await RedisDB.getVal(`pixel:${message.anonymousId}`); + if (isDefinedNotNullNotEmpty(redisData)) { + message.userId = redisData.userId; + stats.increment('shopify_pixel_userid_mapping', { + action: 'stitchUserIdToAnonId', + operation: 'get', + }); + } + if (message.userId) { + message.userId = String(message.userId); } message = removeUndefinedAndNullValues(message); + + // if the message payload contains both anonymousId and userId or contains customer object, hence the user is identified + // then create an identify event by multiplexing the original event and return both the message and identify event + if ( + (message.userId && message.anonymousId) || + (message.userId && customer) || + (message.anonymousId && customer) + ) { + const identifyEvent = createIdentifyEvent(message); + return [message, identifyEvent]; + } return message; }; -const process = async (event) => { +const processWebhookEvents = async (event) => { const metricMetadata = { writeKey: event.query_parameters?.writeKey?.[0], source: 'SHOPIFY', @@ -155,7 +187,7 @@ const process = async (event) => { }; module.exports = { - process, + processWebhookEvents, processEvent, identifyPayloadBuilder, ecomPayloadBuilder, diff --git a/src/v1/sources/shopify/webhookTransformations/serverSideUtils.test.js b/src/v1/sources/shopify/webhookTransformations/serverSideUtils.test.js index 4a2839103b9..42bf859ba12 100644 --- a/src/v1/sources/shopify/webhookTransformations/serverSideUtils.test.js +++ b/src/v1/sources/shopify/webhookTransformations/serverSideUtils.test.js @@ -1,17 +1,22 @@ +const { processEvent } = require('./serverSideTransform'); const { getProductsFromLineItems, createPropertiesForEcomEventFromWebhook, getAnonymousIdFromAttributes, + getCartToken, + setAnonymousId, + addCartTokenHashToTraits, } = require('./serverSideUtlis'); +const { RedisDB } = require('../../../../util/redis/redisConnector'); +const stats = require('../../../../util/stats'); -const { constructPayload } = require('../../../../v0/util'); +const { lineItemsMappingJSON } = require('../../../../v0/sources/shopify/config'); +const Message = require('../../../../sources/message'); -const { - lineItemsMappingJSON, - productMappingJSON, -} = require('../../../../v0/sources/shopify/config'); -const Message = require('../../../../v0/sources/message'); -jest.mock('../../../../v0/sources/message'); +jest.mock('../../../../sources/message'); +jest.mock('../../../../util/stats', () => ({ + increment: jest.fn(), +})); const LINEITEMS = [ { @@ -63,7 +68,6 @@ describe('serverSideUtils.js', () => { }); it('should return array of products', () => { - const mapping = {}; const result = getProductsFromLineItems(LINEITEMS, lineItemsMappingJSON); expect(result).toEqual([ { brand: 'Hydrogen Vendor', price: '600.00', product_id: 7234590408818, quantity: 1 }, @@ -98,11 +102,11 @@ describe('serverSideUtils.js', () => { const result = createPropertiesForEcomEventFromWebhook(message); expect(result).toEqual({ products: [ - { brand: 'Hydrogen Vendor', price: '600.00', product_id: 7234590408818, quantity: 1 }, + { brand: 'Hydrogen Vendor', price: 600.0, product_id: '7234590408818', quantity: 1 }, { brand: 'Hydrogen Vendor', - price: '600.00', - product_id: 7234590408817, + price: 600.0, + product_id: '7234590408817', quantity: 1, title: 'The Collection Snowboard: Nitrogen', }, @@ -115,7 +119,13 @@ describe('serverSideUtils.js', () => { // Handles empty note_attributes array gracefully it('should return null when note_attributes is an empty array', async () => { const event = { note_attributes: [] }; - const result = await getAnonymousIdFromAttributes(event); + const result = getAnonymousIdFromAttributes(event); + expect(result).toBeNull(); + }); + + it('should return null when note_attributes is not present', async () => { + const event = {}; + const result = getAnonymousIdFromAttributes(event); expect(result).toBeNull(); }); @@ -123,8 +133,183 @@ describe('serverSideUtils.js', () => { const event = { note_attributes: [{ name: 'rudderAnonymousId', value: '123456' }], }; - const result = await getAnonymousIdFromAttributes(event); + const result = getAnonymousIdFromAttributes(event); expect(result).toEqual('123456'); }); }); + + describe('Test getCartToken', () => { + it('should return null if cart_token is not present', () => { + const event = {}; + const result = getCartToken(event); + expect(result).toBeNull(); + }); + + it('should return cart_token if it is present', () => { + const event = { cart_token: 'cartTokenTest1' }; + const result = getCartToken(event); + expect(result).toEqual('cartTokenTest1'); + }); + }); + + describe('Test addCartTokenHashToTraits', () => { + // Add cart token hash to traits when cart token exists in event + it('should add cart_token_hash to message traits when cart token exists', () => { + const message = { traits: { existingTrait: 'value' } }; + const event = { cart_token: 'Z2NwLXVzLWVhc3QxOjAxSkJaTUVRSjgzNUJUN1BTNjEzRFdRUFFQ' }; + const expectedHash = '9125e1da-57b9-5bdc-953e-eb2b0ded5edc'; + + addCartTokenHashToTraits(message, event); + + expect(message.traits).toEqual({ + existingTrait: 'value', + cart_token_hash: expectedHash, + }); + }); + + // Do not add cart token hash to traits when cart token does not exist in event + it('should not add cart_token_hash to message traits when cart token does not exist', () => { + const message = { traits: { existingTrait: 'value' } }; + const event = { property: 'value' }; + addCartTokenHashToTraits(message, event); + + expect(message.traits).toEqual({ existingTrait: 'value' }); + }); + }); +}); + +describe('Redis cart token tests', () => { + it('should get anonymousId property from redis', async () => { + const getValSpy = jest + .spyOn(RedisDB, 'getVal') + .mockResolvedValue({ anonymousId: 'anonymousIdTest1' }); + const event = { + id: 35550298931313, + token: '84ad78572dae52a8cbea7d55371afe89', + cart_token: 'Z2NwLXVzLWVhc3QxOjAxSkJaTUVRSjgzNUJUN1BTNjEzRFdRUFFQ', + email: null, + gateway: null, + buyer_accepts_marketing: false, + buyer_accepts_sms_marketing: false, + sms_marketing_phone: null, + created_at: '2024-11-06T02:22:00+00:00', + updated_at: '2024-11-05T21:22:02-05:00', + landing_site: '/', + note: '', + note_attributes: [], + referring_site: '', + shipping_lines: [], + shipping_address: [], + taxes_included: false, + total_weight: 0, + currency: 'USD', + completed_at: null, + phone: null, + customer_locale: 'en-US', + line_items: [ + { + key: '41327142600817', + fulfillment_service: 'manual', + gift_card: false, + grams: 0, + presentment_title: 'The Collection Snowboard: Hydrogen', + presentment_variant_title: '', + product_id: 7234590408817, + quantity: 1, + requires_shipping: true, + sku: '', + tax_lines: [], + taxable: true, + title: 'The Collection Snowboard: Hydrogen', + variant_id: 41327142600817, + variant_title: '', + variant_price: '600.00', + vendor: 'Hydrogen Vendor', + unit_price_measurement: { + measured_type: null, + quantity_value: null, + quantity_unit: null, + reference_value: null, + reference_unit: null, + }, + compare_at_price: null, + line_price: '600.00', + price: '600.00', + applied_discounts: [], + destination_location_id: null, + user_id: null, + rank: null, + origin_location_id: null, + properties: {}, + }, + ], + name: '#35550298931313', + abandoned_checkout_url: + 'https://pixel-testing-rs.myshopify.com/59026964593/checkouts/ac/Z2NwLXVzLWVhc3QxOjAxSkJaTUVRSjgzNUJUN1BTNjEzRFdRUFFQ/recover?key=0385163be3875d3a2117e982d9cc3517&locale=en-US', + discount_codes: [], + tax_lines: [], + presentment_currency: 'USD', + source_name: 'web', + total_line_items_price: '600.00', + total_tax: '0.00', + total_discounts: '0.00', + subtotal_price: '600.00', + total_price: '600.00', + total_duties: '0.00', + device_id: null, + user_id: null, + location_id: null, + source_identifier: null, + source_url: null, + source: null, + closed_at: null, + query_parameters: { + topic: ['checkouts_create'], + version: ['pixel'], + writeKey: ['2mw9SN679HngnXXXHT4oSVVBVmb'], + }, + }; + const message = await processEvent(event); + expect(getValSpy).toHaveBeenCalledTimes(2); + expect(getValSpy).toHaveBeenCalledWith('pixel:anonymousIdTest1'); + expect(message.anonymousId).toEqual('anonymousIdTest1'); + }); + + it('should generate new anonymousId using UUID v5 when no existing ID is found', async () => { + const message = {}; + const event = { + note_attributes: [], + }; + const metricMetadata = { source: 'test', writeKey: 'test-key' }; + const cartToken = 'test-cart-token'; + const mockRedisData = null; + const expectedAnonymousId = '40a532a2-88be-5e3a-8687-56e34739e89d'; + jest.mock('uuid', () => ({ + v5: jest.fn(() => expectedAnonymousId), + DNS: 'dns-namespace', + })); + RedisDB.getVal = jest.spyOn(RedisDB, 'getVal').mockResolvedValue(mockRedisData); + await setAnonymousId(message, { ...event, cart_token: cartToken }, metricMetadata); + expect(message.anonymousId).toBe(expectedAnonymousId); + }); + + it('should handle undefined event parameter without error', async () => { + const message = {}; + + const metricMetadata = { + source: 'test-source', + writeKey: 'test-key', + }; + + await setAnonymousId(message, undefined, metricMetadata); + + expect(message.anonymousId).toBeUndefined(); + + expect(stats.increment).toHaveBeenCalledWith('shopify_pixel_id_stitch_gaps', { + event: message.event, + reason: 'cart_token_miss', + source: metricMetadata.source, + writeKey: metricMetadata.writeKey, + }); + }); }); diff --git a/src/v1/sources/shopify/webhookTransformations/serverSideUtlis.js b/src/v1/sources/shopify/webhookTransformations/serverSideUtlis.js index 951fa479e4f..8a9ec2ba05e 100644 --- a/src/v1/sources/shopify/webhookTransformations/serverSideUtlis.js +++ b/src/v1/sources/shopify/webhookTransformations/serverSideUtlis.js @@ -1,9 +1,11 @@ -const { isDefinedAndNotNull } = require('@rudderstack/integrations-lib'); +/* eslint-disable no-param-reassign */ +const get = require('get-value'); +const { isDefinedAndNotNull, uuidv5 } = require('@rudderstack/integrations-lib'); +const { extractEmailFromPayload } = require('../../../../v0/sources/shopify/util'); const { constructPayload } = require('../../../../v0/util'); -const { - lineItemsMappingJSON, - productMappingJSON, -} = require('../../../../v0/sources/shopify/config'); +const { INTEGERATION, lineItemsMappingJSON, productMappingJSON } = require('../config'); +const { RedisDB } = require('../../../../util/redis/redisConnector'); +const stats = require('../../../../util/stats'); /** * Returns an array of products from the lineItems array received from the webhook event @@ -28,12 +30,15 @@ const getProductsFromLineItems = (lineItems, mapping) => { * @param {Object} message * @returns {Object} properties */ -const createPropertiesForEcomEventFromWebhook = (message) => { +const createPropertiesForEcomEventFromWebhook = (message, shopifyTopic) => { const { line_items: lineItems } = message; if (!lineItems || lineItems.length === 0) { return []; } const mappedPayload = constructPayload(message, productMappingJSON); + if (shopifyTopic === 'orders_updated' || shopifyTopic === 'checkouts_update') { + delete mappedPayload.value; + } mappedPayload.products = getProductsFromLineItems(lineItems, lineItemsMappingJSON); return mappedPayload; }; @@ -54,8 +59,117 @@ const getAnonymousIdFromAttributes = (event) => { return rudderAnonymousIdObject ? rudderAnonymousIdObject.value : null; }; +/** + * Returns the cart_token from the event message + * @param {Object} event + * @returns {String} cart_token + */ +const getCartToken = (event) => event?.cart_token || null; + +/** + * Adds the cartTokenHash to the traits object in the message + * @param {Object} message + * @param {String} event + * */ +const addCartTokenHashToTraits = (message, event) => { + const cartToken = getCartToken(event); + if (cartToken) { + const cartTokenHash = uuidv5(cartToken); + message.traits = { + ...message.traits, + cart_token_hash: cartTokenHash, + }; + } + return message; +}; + +/** + * Handles the anonymousId assignment for the message, based on the event attributes and redis data + * @param {Object} message rudderstack message object + * @param {Object} event raw shopify event payload + * @param {Object} metricMetadata metric metadata object + */ +const setAnonymousId = async (message, event, metricMetadata) => { + const anonymousId = getAnonymousIdFromAttributes(event); + const cartToken = getCartToken(event); + const cartTokenHash = cartToken ? uuidv5(cartToken) : null; + if (isDefinedAndNotNull(anonymousId)) { + message.anonymousId = anonymousId; + } + // if anonymousId is not present in note_attributes or note_attributes is not present, query redis for anonymousId + // when cart_token is present + else if (cartToken) { + const redisData = await RedisDB.getVal(`pixel:${cartToken}`); + if (redisData?.anonymousId) { + message.anonymousId = redisData.anonymousId; + stats.increment('shopify_pixel_cart_token_mapping', { + action: 'stitchCartTokenToAnonId', + operation: 'get', + }); + } else { + // if anonymousId is not present in note_attributes or redis, generate a new anonymousId + // the anonymousId will be generated by hashing the cart_token using uuidv5 + // this hash will be present in the traits object as cart_token_hash + message.anonymousId = cartTokenHash; + stats.increment('shopify_pixel_id_stitch_gaps', { + event: message.event, + reason: 'redis_cache_miss', + source: metricMetadata.source, + writeKey: metricMetadata.writeKey, + }); + } + } else { + stats.increment('shopify_pixel_id_stitch_gaps', { + event: message.event, + reason: 'cart_token_miss', + source: metricMetadata.source, + writeKey: metricMetadata.writeKey, + }); + } +}; + +/** + Handles email and contextual properties enrichment for the message payload + * @param {Object} message rudderstack message object + * @param {Object} event raw shopify event payload + * @param {String} shopifyTopic shopify event topic +*/ +const handleCommonProperties = (message, event, shopifyTopic) => { + if (!get(message, 'traits.email')) { + const email = extractEmailFromPayload(event); + if (email) { + message.setProperty('traits.email', email); + } + } + message.setProperty(`integrations.${INTEGERATION}`, true); + message.setProperty('context.library', { + eventOrigin: 'server', + name: 'RudderStack Shopify Cloud', + version: '2.0.0', + }); + message.setProperty('context.topic', shopifyTopic); + // attaching cart, checkout and order tokens in context object + message.setProperty(`context.cart_token`, event.cart_token); + message.setProperty(`context.checkout_token`, event.checkout_token); + // raw shopify payload passed inside context object under shopifyDetails + message.setProperty('context.shopifyDetails', event); + if (shopifyTopic === 'orders_updated') { + message.setProperty(`context.order_token`, event.token); + } + message.setProperty('integrations.DATA_WAREHOUSE', { + options: { + jsonPaths: [`${message.type}.context.shopifyDetails`], + }, + }); + return message; +}; + module.exports = { createPropertiesForEcomEventFromWebhook, + getCartToken, getProductsFromLineItems, getAnonymousIdFromAttributes, + setAnonymousId, + handleCommonProperties, + addCartTokenHashToTraits, }; diff --git a/src/v1/sources/shopify/webpixelTransformations/pixelTransform.js b/src/v1/sources/shopify/webpixelTransformations/pixelTransform.js index b1d1c8b2fac..80f2fb10e23 100644 --- a/src/v1/sources/shopify/webpixelTransformations/pixelTransform.js +++ b/src/v1/sources/shopify/webpixelTransformations/pixelTransform.js @@ -15,7 +15,9 @@ const { checkoutEventBuilder, checkoutStepEventBuilder, searchEventBuilder, + extractCampaignParams, } = require('./pixelUtils'); +const campaignObjectMappings = require('../pixelEventsMappings/campaignObjectMappings.json'); const { INTEGERATION, PIXEL_EVENT_TOPICS, @@ -68,7 +70,7 @@ const handleCartTokenRedisOperations = async (inputEvent, clientId) => { const cartToken = extractCartToken(inputEvent); try { if (isDefinedNotNullNotEmpty(clientId) && isDefinedNotNullNotEmpty(cartToken)) { - await RedisDB.setVal(cartToken, ['anonymousId', clientId]); + await RedisDB.setVal(`pixel:${cartToken}`, ['anonymousId', clientId], 43200); stats.increment('shopify_pixel_cart_token_set', { event: inputEvent.name, writeKey: inputEvent.query_parameters.writeKey, @@ -83,16 +85,13 @@ const handleCartTokenRedisOperations = async (inputEvent, clientId) => { } }; -function processPixelEvent(inputEvent) { +async function processPixelEvent(inputEvent) { // eslint-disable-next-line @typescript-eslint/naming-convention - const { name, query_parameters, clientId, data, id } = inputEvent; + const { name, query_parameters, context, clientId, id } = inputEvent; const shopifyDetails = { ...inputEvent }; delete shopifyDetails.context; delete shopifyDetails.query_parameters; delete shopifyDetails.pixelEventLabel; - const { checkout } = data ?? {}; - const { order } = checkout ?? {}; - const { customer } = order ?? {}; let message = {}; switch (name) { case PIXEL_EVENT_TOPICS.PAGE_VIEWED: @@ -114,7 +113,6 @@ function processPixelEvent(inputEvent) { break; case PIXEL_EVENT_TOPICS.CHECKOUT_STARTED: case PIXEL_EVENT_TOPICS.CHECKOUT_COMPLETED: - if (customer.id) message.userId = customer.id || ''; handleCartTokenRedisOperations(inputEvent, clientId); message = checkoutEventBuilder(inputEvent); break; @@ -122,7 +120,6 @@ function processPixelEvent(inputEvent) { case PIXEL_EVENT_TOPICS.CHECKOUT_CONTACT_INFO_SUBMITTED: case PIXEL_EVENT_TOPICS.CHECKOUT_SHIPPING_INFO_SUBMITTED: case PIXEL_EVENT_TOPICS.PAYMENT_INFO_SUBMITTED: - if (customer.id) message.userId = customer.id || ''; handleCartTokenRedisOperations(inputEvent, clientId); message = checkoutStepEventBuilder(inputEvent); break; @@ -140,6 +137,11 @@ function processPixelEvent(inputEvent) { } message.anonymousId = clientId; message.setProperty(`integrations.${INTEGERATION}`, true); + message.setProperty('integrations.DATA_WAREHOUSE', { + options: { + jsonPaths: [`${message.type}.context.shopifyDetails`], + }, + }); message.setProperty('context.library', { name: 'RudderStack Shopify Cloud', eventOrigin: 'client', @@ -147,13 +149,30 @@ function processPixelEvent(inputEvent) { }); message.setProperty('context.topic', name); message.setProperty('context.shopifyDetails', shopifyDetails); + + // adding campaign object with utm parameters to the message context + const campaignParams = extractCampaignParams(context, campaignObjectMappings); + if (campaignParams) { + message.context.campaign = campaignParams; + } message.messageId = id; + + // attach userId to the message if anonymousId is present in Redis + // this allows stitching of events from the same user across multiple checkouts + const redisData = await RedisDB.getVal(`pixel:${message.anonymousId}`); + if (isDefinedNotNullNotEmpty(redisData)) { + message.userId = redisData.userId; + stats.increment('shopify_pixel_userid_mapping', { + action: 'stitchUserIdToAnonId', + operation: 'get', + }); + } message = removeUndefinedAndNullValues(message); return message; } const processPixelWebEvents = async (event) => { - const pixelEvent = processPixelEvent(event); + const pixelEvent = await processPixelEvent(event); return removeUndefinedAndNullValues(pixelEvent); }; diff --git a/src/v1/sources/shopify/webpixelTransformations/pixelUtils.js b/src/v1/sources/shopify/webpixelTransformations/pixelUtils.js index 46ae59e0cf8..40f81a93b9c 100644 --- a/src/v1/sources/shopify/webpixelTransformations/pixelUtils.js +++ b/src/v1/sources/shopify/webpixelTransformations/pixelUtils.js @@ -1,5 +1,6 @@ /* eslint-disable no-param-reassign */ -const Message = require('../../../../v0/sources/message'); +const { isDefinedAndNotNull } = require('@rudderstack/integrations-lib'); +const Message = require('../../../../sources/message'); const { EventType } = require('../../../../constants'); const { INTEGERATION, @@ -203,6 +204,41 @@ const searchEventBuilder = (inputEvent) => { ); }; +/** + * Extracts UTM parameters from the context object + * @param {*} context context object from the event + * @param {*} campaignMappings mappings for UTM parameters + * @returns campaignParams, an object containing UTM parameters + */ +const extractCampaignParams = (context, campaignMappings) => { + if (context?.document?.location?.href) { + const url = new URL(context.document.location.href); + const campaignParams = {}; + + // Loop through mappings and extract UTM parameters + campaignMappings.forEach((mapping) => { + const value = url.searchParams.get(mapping.sourceKeys); + if (isDefinedAndNotNull(value)) { + campaignParams[mapping.destKeys] = value; + } + }); + + // Extract any UTM parameters not in the mappings + const campaignObjectSourceKeys = campaignMappings.flatMap((mapping) => mapping.sourceKeys); + url.searchParams.forEach((value, key) => { + if (key.startsWith('utm_') && !campaignObjectSourceKeys.includes(key)) { + campaignParams[key] = value; + } + }); + + // Only return campaign object if we have any UTM parameters + if (Object.keys(campaignParams).length > 0) { + return campaignParams; + } + } + return null; +}; + module.exports = { pageViewedEventBuilder, cartViewedEventBuilder, @@ -212,4 +248,5 @@ module.exports = { checkoutEventBuilder, checkoutStepEventBuilder, searchEventBuilder, + extractCampaignParams, }; diff --git a/src/v1/sources/shopify/webpixelTransformations/pixelUtils.test.js b/src/v1/sources/shopify/webpixelTransformations/pixelUtils.test.js index e8f53a5f153..fcd8888d834 100644 --- a/src/v1/sources/shopify/webpixelTransformations/pixelUtils.test.js +++ b/src/v1/sources/shopify/webpixelTransformations/pixelUtils.test.js @@ -7,10 +7,12 @@ const { checkoutEventBuilder, checkoutStepEventBuilder, searchEventBuilder, + extractCampaignParams, } = require('./pixelUtils'); -const Message = require('../../../../v0/sources/message'); +const campaignObjectMappings = require('../pixelEventsMappings/campaignObjectMappings.json'); +const Message = require('../../../../sources/message'); jest.mock('ioredis', () => require('../../../../test/__mocks__/redis')); -jest.mock('../../../../v0/sources/message'); +jest.mock('../../../../sources/message'); describe('utilV2.js', () => { beforeEach(() => { @@ -787,4 +789,59 @@ describe('utilV2.js', () => { expect(message.context).toEqual({ userAgent: 'Mozilla/5.0' }); }); }); + + describe('extractCampaignParams', () => { + it('should extract campaign parameters from URL', () => { + const context = { + document: { + location: { + href: 'https://example.com?utm_source=google&utm_medium=cpc&utm_campaign=spring_sale', + }, + }, + }; + + const result = extractCampaignParams(context, campaignObjectMappings); + expect(result).toEqual({ + utm_source: 'google', + medium: 'cpc', + name: 'spring_sale', + }); + }); + + it('should return null if no campaign parameters are found', () => { + const context = { + document: { + location: { + href: 'https://example.com', + }, + }, + }; + + const result = extractCampaignParams(context, campaignObjectMappings); + expect(result).toBeNull(); + }); + + it('should extract additional UTM parameters not in mappings', () => { + const context = { + document: { + location: { + href: 'https://example.com?utm_source=google&utm_term=shoes', + }, + }, + }; + + const result = extractCampaignParams(context, campaignObjectMappings); + expect(result).toEqual({ + utm_source: 'google', + term: 'shoes', + }); + }); + + it('should handle missing context or location gracefully', () => { + const context = {}; + + const result = extractCampaignParams(context, campaignObjectMappings); + expect(result).toBeNull(); + }); + }); }); diff --git a/src/warehouse/index.js b/src/warehouse/index.js index ea663c9b2fc..c5f167909f7 100644 --- a/src/warehouse/index.js +++ b/src/warehouse/index.js @@ -11,6 +11,7 @@ const { validTimestamp, getVersionedUtils, isRudderSourcesEvent, + mergeJSONPathsFromDataWarehouse, } = require('./util'); const { getMergeRuleEvent } = require('./identity'); @@ -307,8 +308,8 @@ function isStringLikeObject(obj) { let minKey = Infinity; let maxKey = -Infinity; - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; + for (const element of keys) { + const key = element; const value = obj[key]; if (!isNonNegativeInteger(key)) return false; @@ -336,8 +337,8 @@ function stringLikeObjectToString(obj) { .sort((a, b) => a - b); let result = ''; - for (let i = 0; i < keys.length; i++) { - result += obj[keys[i].toString()]; + for (const element of keys) { + result += obj[element.toString()]; } return result; @@ -655,6 +656,8 @@ function processWarehouseMessage(message, options) { const skipReservedKeywordsEscaping = options.integrationOptions.skipReservedKeywordsEscaping || false; + mergeJSONPathsFromDataWarehouse(message, options); + // underscoreDivideNumbers when set to false, if a column has a format like "_v_3_", it will be formatted to "_v3_" // underscoreDivideNumbers when set to true, if a column has a format like "_v_3_", we keep it like that // For older destinations, it will come as true and for new destinations this config will not be present which means we will treat it as false. diff --git a/src/warehouse/util.js b/src/warehouse/util.js index 7f4e224a349..1f2d9215f2c 100644 --- a/src/warehouse/util.js +++ b/src/warehouse/util.js @@ -136,6 +136,27 @@ const getRecordIDForExtract = (message) => { return recordId; }; +function mergeJSONPathsFromDataWarehouse(message, options) { + const dataWarehouseOptions = message.integrations?.['DATA_WAREHOUSE']?.options; + if (!dataWarehouseOptions?.jsonPaths) return; + + const dataWarehouseJSONPaths = Array.isArray(dataWarehouseOptions.jsonPaths) + ? dataWarehouseOptions.jsonPaths + : []; + const currentJSONPaths = Array.isArray(options.integrationOptions?.jsonPaths) + ? options.integrationOptions.jsonPaths + : []; + + switch (options.provider) { + case 'rs': + case 'postgres': + case 'snowflake': + case 'bq': + options.integrationOptions.jsonPaths = [...dataWarehouseJSONPaths, ...currentJSONPaths]; + break; + } +} + module.exports = { isObject, isValidJsonPathKey, @@ -148,4 +169,5 @@ module.exports = { sourceCategoriesToUseRecordId, getCloudRecordID, getRecordIDForExtract, + mergeJSONPathsFromDataWarehouse, }; diff --git a/swagger/api.yaml b/swagger/api.yaml index 8e7a67d6f8e..6b4a484a2cf 100644 --- a/swagger/api.yaml +++ b/swagger/api.yaml @@ -52,8 +52,10 @@ paths: $ref: './routes/bulkUpload.yaml#/~1getWarningJobs' #Delivery Routes - /{version}/destinations/{destination}/proxy: - $ref: './routes/delivery.yaml#/~1{version}~1destinations~1{destination}~1proxy' + /v0/destinations/{destination}/proxy: + $ref: './routes/delivery.yaml#/~1v0~1destinations~1{destination}~1proxy' + /v1/destinations/{destination}/proxy: + $ref: './routes/delivery.yaml#/~1v1~1destinations~1{destination}~1proxy' /{version}/destinations/{destination}/proxyTest: $ref: './routes/delivery.yaml#/~1{version}~1destinations~1{destination}~1proxyTest' diff --git a/swagger/components/examples/delivery/v0/request/request.yaml b/swagger/components/examples/delivery/v0/request/request.yaml new file mode 100644 index 00000000000..ee2eee44e95 --- /dev/null +++ b/swagger/components/examples/delivery/v0/request/request.yaml @@ -0,0 +1,33 @@ +value: + version: v1 + type: REST + method: POST + endpoint: "https://demoapp-api.bloomreach.com/data/v2/projects/{project}/catalogs/{catalog}/items/partial-update" + userId: "" + headers: + Authorization: "Basic token" + params: {} + body: + JSON: {} + JSON_ARRAY: + batch: + - item_id: "222" + properties: { } + XML: {} + FORM: {} + files: {} + metadata: + userId: '<<>>12345<<>>12345' + jobId: 1 + sourceId: '2ifsnRxzoONtZeIoGxgNWsr4xx' + sourceCategory: '' + destinationId: '2JIqVoWNvSOHa9ppKOqSxxx' + attemptNum: 0 + receivedAt: '2024-07-17T16:45:40.114+05:30' + createdAt: '2024-07-17T11:15:41.140Z' + firstAttemptedAt: '' + transformAt: 'router' + workspaceId: '2hSS1hZ8kuCpUZAAYsQucAFdxxx' + secret: null + workerAssignedTime: '2024-07-17T16:45:41.264239+05:30' + dontBatch: false \ No newline at end of file diff --git a/swagger/components/examples/delivery/v0/response/failure.yaml b/swagger/components/examples/delivery/v0/response/failure.yaml new file mode 100644 index 00000000000..91e3e0c1ee1 --- /dev/null +++ b/swagger/components/examples/delivery/v0/response/failure.yaml @@ -0,0 +1,23 @@ +message: "[Generic Response Handler] Request failed for destination bloomreach_catalog with status: 401" +status: 401 +destinationResponse: + response: "Could not verify your access level for that URL.\nYou have to login with proper credentials using HTTP Basic Auth (public key as username and private key as password)" + status: 401 + headers: + server: "nginx" + date: "Fri, 1 Jan 2029 03:03:43 GMT" + content-type: "text/html; charset=utf-8" + content-length: "165" + www-authenticate: 'Basic realm="Login Required"' + vary: "Cookie" + via: "1.1 google" + alt-svc: 'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000' +statTags: + errorCategory: "network" + errorType: "aborted" + destType: "BLOOMREACH_CATALOG" + module: "destination" + implementation: "native" + feature: "dataDelivery" + destinationId: "2JIqVoWNvSOHa9ppKOqSxxx" + workspaceId: "2hSS1hZ8kuCpUZAAYsQucAFdxxx" \ No newline at end of file diff --git a/swagger/components/examples/delivery/v0/response/success.yaml b/swagger/components/examples/delivery/v0/response/success.yaml new file mode 100644 index 00000000000..26fa5a1a900 --- /dev/null +++ b/swagger/components/examples/delivery/v0/response/success.yaml @@ -0,0 +1,20 @@ +output: + status: 200 + message: "[Generic Response Handler] Request for destination: bloomreach_catalog Processed Successfully" + destinationResponse: + response: + - queued: true + success: true + status: 200 + headers: + server: "nginx" + date: "Mon, 01 Jan 2029 03:45:29 GMT" + content-type: "application/json" + x-ratelimit-limit: 5 + x-ratelimit-remaining: 4 + x-ratelimit-reset: 1736135140 + retry-after: "Mon, 06 Jan 2025 03:45:40 GMT" + strict-transport-security: "max-age=31536000; includeSubDomains" + via: "1.1 google" + alt-svc: "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + transfer-encoding: "chunked" \ No newline at end of file diff --git a/swagger/components/examples/delivery/v1/request/request.yaml b/swagger/components/examples/delivery/v1/request/request.yaml new file mode 100644 index 00000000000..bc33c56b7ad --- /dev/null +++ b/swagger/components/examples/delivery/v1/request/request.yaml @@ -0,0 +1,49 @@ +value: + version: v1 + type: REST + method: POST + endpoint: "https://demoapp-api.bloomreach.com/data/v2/projects/{project}/catalogs/{catalog}/items/partial-update" + userId: "" + headers: + Authorization: "Basic token" + params: {} + body: + JSON: {} + JSON_ARRAY: + batch: + - item_id: "222" + properties: {} + - item_id: "11234" + properties: {} + XML: {} + FORM: {} + files: {} + metadata: + - userId: '<<>>12345<<>>12345' + jobId: 1 + sourceId: '2ifsnRxzoONtZeIoGxgNWsr4xx' + sourceCategory: '' + destinationId: '2JIqVoWNvSOHa9ppKOqSxxx' + attemptNum: 0 + receivedAt: '2024-07-17T16:45:40.114+05:30' + createdAt: '2024-07-17T11:15:41.140Z' + firstAttemptedAt: '' + transformAt: 'router' + workspaceId: '2hSS1hZ8kuCpUZAAYsQucAFdxxx' + secret: null + workerAssignedTime: '2024-07-17T16:45:41.264239+05:30' + dontBatch: false + - userId: '<<>>12345<<>>12345' + jobId: 2 + sourceId: '2ifsnRxzoONtZeIoGxgNWsr4xx' + sourceCategory: '' + destinationId: '2JIqVoWNvSOHa9ppKOqSxxx' + attemptNum: 0 + receivedAt: '2024-07-17T16:45:40.114+05:30' + createdAt: '2024-07-17T11:15:41.140Z' + firstAttemptedAt: '' + transformAt: 'router' + workspaceId: '2hSS1hZ8kuCpUZAAYsQucAFdxxx' + secret: null + workerAssignedTime: '2024-07-17T16:45:41.264239+05:30' + dontBatch: false \ No newline at end of file diff --git a/swagger/components/examples/delivery/v1/response/failure.yaml b/swagger/components/examples/delivery/v1/response/failure.yaml new file mode 100644 index 00000000000..e269f4db504 --- /dev/null +++ b/swagger/components/examples/delivery/v1/response/failure.yaml @@ -0,0 +1,29 @@ +response: + - error: "\"Could not verify your access level for that URL.\\nYou have to login with proper credentials using HTTP Basic Auth (public key as username and private key as password)\"" + statusCode: 401 + metadata: + userId: "<<>>12345<<>>12345" + jobId: 1 + sourceId: "2ifsnRxzoONtZeIoGxgNWsr4xx" + sourceCategory: "" + destinationId: "2JIqVoWNvSOHa9ppKOqSxxx" + attemptNum: 0 + receivedAt: "2024-07-17T16:45:40.114+05:30" + createdAt: "2024-07-17T11:15:41.140Z" + firstAttemptedAt: "" + transformAt: "router" + workspaceId: "2hSS1hZ8kuCpUZAAYsQucAFdxxx" + secret: null + workerAssignedTime: "2024-07-17T16:45:41.264239+05:30" + dontBatch: false +statTags: + errorCategory: "network" + errorType: "aborted" + destType: "BLOOMREACH_CATALOG" + module: "destination" + implementation: "native" + feature: "dataDelivery" + destinationId: "2JIqVoWNvSOHa9ppKOqSxxx" + workspaceId: "2hSS1hZ8kuCpUZAAYsQucAFdxxx" +message: "BLOOMREACH_CATALOG: Error encountered in transformer proxy V1" +status: 401 \ No newline at end of file diff --git a/swagger/components/examples/delivery/v1/response/success.yaml b/swagger/components/examples/delivery/v1/response/success.yaml new file mode 100644 index 00000000000..f30e131fe95 --- /dev/null +++ b/swagger/components/examples/delivery/v1/response/success.yaml @@ -0,0 +1,57 @@ +output: + status: 200 + message: "[BLOOMREACH_CATALOG Response V1 Handler] - Request Processed Successfully" + destinationResponse: + response: + - queued: true + success: true + - queued: true + success: true + status: 200 + headers: + server: "nginx" + date: "Mon, 06 Jan 2025 03:45:29 GMT" + content-type: "application/json" + x-ratelimit-limit: 5 + x-ratelimit-remaining: 4 + x-ratelimit-reset: 1736135140 + retry-after: "Mon, 06 Jan 2025 03:45:40 GMT" + strict-transport-security: "max-age=31536000; includeSubDomains" + via: "1.1 google" + alt-svc: "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000" + transfer-encoding: "chunked" +response: + - statusCode: 200 + error: "success" + metadata: + userId: "<<>>12345<<>>12345" + jobId: 1 + sourceId: "2ifsnRxzoONtZeIoGxgNWsr4xx" + sourceCategory: "" + destinationId: "2JIqVoWNvSOHa9ppKOqSxxx" + attemptNum: 0 + receivedAt: "2024-07-17T16:45:40.114+05:30" + createdAt: "2024-07-17T11:15:41.140Z" + firstAttemptedAt: "" + transformAt: "router" + workspaceId: "2hSS1hZ8kuCpUZAAYsQucAFdxxx" + secret: null + workerAssignedTime: "2024-07-17T16:45:41.264239+05:30" + dontBatch: false + - statusCode: 200 + error: "success" + metadata: + userId: "<<>>12345<<>>12345" + jobId: 2 + sourceId: "2ifsnRxzoONtZeIoGxgNWsr4xx" + sourceCategory: "" + destinationId: "2JIqVoWNvSOHa9ppKOqSxxx" + attemptNum: 0 + receivedAt: "2024-07-17T16:45:40.114+05:30" + createdAt: "2024-07-17T11:15:41.140Z" + firstAttemptedAt: "" + transformAt: "router" + workspaceId: "2hSS1hZ8kuCpUZAAYsQucAFdxxx" + secret: null + workerAssignedTime: "2024-07-17T16:45:41.264239+05:30" + dontBatch: false \ No newline at end of file diff --git a/swagger/components/schemas/v0DeliveryRequest.yaml b/swagger/components/schemas/v0DeliveryRequest.yaml new file mode 100644 index 00000000000..8dced0661c0 --- /dev/null +++ b/swagger/components/schemas/v0DeliveryRequest.yaml @@ -0,0 +1,32 @@ +title: Proxy Request +type: object +properties: + version: + type: string + type: + type: string + method: + type: string + endpoint: + type: string + userId: + type: string + headers: + type: object + params: + type: object + body: + type: object + properties: + JSON: + type: object + JSON_ARRAY: + type: object + XML: + type: object + FORM: + type: object + files: + type: object + metadata: + $ref: './metadata.yaml' \ No newline at end of file diff --git a/swagger/components/schemas/deliveryResponse.yaml b/swagger/components/schemas/v0DeliveryResponse.yaml similarity index 97% rename from swagger/components/schemas/deliveryResponse.yaml rename to swagger/components/schemas/v0DeliveryResponse.yaml index 8f373c2aeb9..91f4816bea1 100644 --- a/swagger/components/schemas/deliveryResponse.yaml +++ b/swagger/components/schemas/v0DeliveryResponse.yaml @@ -28,4 +28,4 @@ properties: workspaceId: type: string authErrorCategory: - type: string + type: string \ No newline at end of file diff --git a/swagger/components/schemas/v1DeliveryRequest.yaml b/swagger/components/schemas/v1DeliveryRequest.yaml new file mode 100644 index 00000000000..53ec6a650ee --- /dev/null +++ b/swagger/components/schemas/v1DeliveryRequest.yaml @@ -0,0 +1,34 @@ +title: Proxy Request +type: object +properties: + version: + type: string + type: + type: string + method: + type: string + endpoint: + type: string + userId: + type: string + headers: + type: object + params: + type: object + body: + type: object + properties: + JSON: + type: object + JSON_ARRAY: + type: object + XML: + type: object + FORM: + type: object + files: + type: object + metadata: + type: array + items: + $ref: './metadata.yaml' \ No newline at end of file diff --git a/swagger/components/schemas/v1DeliveryResponse.yaml b/swagger/components/schemas/v1DeliveryResponse.yaml new file mode 100644 index 00000000000..d24cdf7a161 --- /dev/null +++ b/swagger/components/schemas/v1DeliveryResponse.yaml @@ -0,0 +1,42 @@ +title: Delivery response +type: object +properties: + status: + type: number + message: + type: string + statTags: + type: object + properties: + errorCategory: + type: string + errorType: + type: string + destType: + type: string + module: + type: string + implementation: + type: string + feature: + type: string + example: 'dataDelivery' + destinationId: + type: string + workspaceId: + type: string + destinationResponse: + type: object + authErrorCategory: + type: string + response: + type: array + items: + type: object + properties: + error: + type: string + statusCode: + type: number + metadata: + $ref: './metadata.yaml' diff --git a/swagger/routes/delivery.yaml b/swagger/routes/delivery.yaml index 7506666d460..97de9257c7d 100644 --- a/swagger/routes/delivery.yaml +++ b/swagger/routes/delivery.yaml @@ -1,14 +1,9 @@ -/{version}/destinations/{destination}/proxy: +/v0/destinations/{destination}/proxy: post: tags: - Delivery summary: Destination processor transformation parameters: - - in: path - name: version - required: true - schema: - type: string - in: path name: destination description: The destination identifier @@ -21,7 +16,10 @@ content: application/json: schema: - $ref: '../components/schemas/processorTransformationOutput.yaml' + $ref: '../components/schemas/v0DeliveryRequest.yaml' + examples: + request: + $ref: '../components/examples/delivery/v0/request/request.yaml' responses: 200: description: Success @@ -31,25 +29,58 @@ type: object properties: output: - $ref: '../components/schemas/deliveryResponse.yaml' - 400: - description: Bad Request - content: - application/json: - schema: - type: object - properties: - output: - $ref: '../components/schemas/deliveryResponse.yaml' - 500: - description: Internal Server Error + $ref: '../components/schemas/v0DeliveryResponse.yaml' + examples: + success: + value: + output: + $ref: '../components/examples/delivery/v0/response/success.yaml' + failure: + value: + output: + $ref: '../components/examples/delivery/v0/response/failure.yaml' + +/v1/destinations/{destination}/proxy: + post: + tags: + - Delivery + summary: Destination processor transformation + parameters: + - in: path + name: destination + description: The destination identifier + required: true + schema: + type: string + requestBody: + description: Request Body + required: true + content: + application/json: + schema: + $ref: '../components/schemas/v1DeliveryRequest.yaml' + examples: + request: + $ref: '../components/examples/delivery/v1/request/request.yaml' + responses: + 200: + description: Success content: application/json: schema: type: object properties: output: - $ref: '../components/schemas/deliveryResponse.yaml' + $ref: '../components/schemas/v1DeliveryResponse.yaml' + examples: + success: + value: + output: + $ref: '../components/examples/delivery/v1/response/success.yaml' + failure: + value: + output: + $ref: '../components/examples/delivery/v1/response/failure.yaml' /{version}/destinations/{destination}/proxyTest: post: diff --git a/swagger/routes/source.yaml b/swagger/routes/source.yaml index 3babdb57e14..4dc64df540e 100644 --- a/swagger/routes/source.yaml +++ b/swagger/routes/source.yaml @@ -22,6 +22,23 @@ type: array items: type: object + examples: + v2Spec: + summary: V2 Spec Request Structure Example + value: + - request: + body: '{"key": "value", "nested": {"data": "example"}}' + url: "https://rudderstack.webhook.endpoint/v1/webhook?paramkey=paramvalue" + method: "POST" + query_parameters: {paramKey: ["paramValue"]} + headers: {headerKey: ["headerValue"]} + source: {} + v1Spec: + summary: V1 Spec Request Structure Example + value: + - request: + event: {"key": "value", "nested": {"data": "example"}, query_parameters: {paramKey: "paramValue"}} + source: {} responses: 200: description: Success diff --git a/test/__mocks__/data/marketo_static_list/proxy_response.json b/test/__mocks__/data/marketo_static_list/proxy_response.json index 290a4f5fbf6..c80777db68a 100644 --- a/test/__mocks__/data/marketo_static_list/proxy_response.json +++ b/test/__mocks__/data/marketo_static_list/proxy_response.json @@ -1,5 +1,5 @@ { - "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=110&id=111&id=112": { + "https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=110&id=111&id=112": { "data": { "requestId": "b6d1#18a8d2c10e7", "result": [ @@ -26,7 +26,7 @@ }, "status": 200 }, - "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3": { + "https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=1&id=2&id=3": { "data": { "requestId": "68d8#1846058ee27", "success": false, @@ -39,7 +39,7 @@ }, "status": 200 }, - "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2": { + "https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=1&id=2": { "data": { "requestId": "12d3c#1846057dce2", "result": [ @@ -56,7 +56,7 @@ }, "status": 200 }, - "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=3&id=4": { + "https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=3&id=4": { "data": { "requestId": "12d3c#1846057dce2", "result": [ @@ -79,7 +79,7 @@ }, "status": 200 }, - "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=5&id=6": { + "https://marketo_static_list_unit_test_success.mktorest.com/rest/v1/lists/1122/leads.json?id=5&id=6": { "data": { "requestId": "12d3c#1846057dce2", "result": { diff --git a/test/__tests__/data/marketo_static_list_proxy_input.json b/test/__tests__/data/marketo_static_list_proxy_input.json index 6f84e7416dc..86c458c0806 100644 --- a/test/__tests__/data/marketo_static_list_proxy_input.json +++ b/test/__tests__/data/marketo_static_list_proxy_input.json @@ -1,7 +1,7 @@ [ { "type": "REST", - "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=110&id=111&id=112", + "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=110&id=111&id=112", "method": "POST", "userId": "", "headers": { @@ -21,7 +21,7 @@ }, { "type": "REST", - "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3", + "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=1&id=2&id=3", "method": "POST", "userId": "", "headers": { @@ -41,7 +41,7 @@ }, { "type": "REST", - "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2", + "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=1&id=2", "method": "POST", "userId": "", "headers": { @@ -75,7 +75,7 @@ }, { "type": "REST", - "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=3&id=4", + "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=3&id=4", "method": "POST", "userId": "", "headers": { @@ -116,7 +116,7 @@ }, { "type": "REST", - "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=5&id=6", + "endpoint": "https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=5&id=6", "method": "POST", "userId": "", "headers": { diff --git a/test/__tests__/data/versioned_processor_heap_output.json b/test/__tests__/data/versioned_processor_heap_output.json index 73ef473017e..fb0cc2019ce 100644 --- a/test/__tests__/data/versioned_processor_heap_output.json +++ b/test/__tests__/data/versioned_processor_heap_output.json @@ -14,8 +14,7 @@ "JSON": { "identity": "sampath", "properties": { - "anonymousId": "sampath", - "email": "sampath@gmail.com" + "anonymousId": "sampath" }, "app_id": "" }, @@ -46,8 +45,7 @@ "JSON": { "identity": "sampath", "properties": { - "anonymousId": "sampath", - "email": "sampath@gmail.com" + "anonymousId": "sampath" }, "app_id": "Test_App_Id" }, @@ -78,8 +76,7 @@ "JSON": { "identity": "sampath", "properties": { - "anonymousId": "sampath", - "email": "sampath@gmail.com" + "anonymousId": "sampath" }, "app_id": "" }, diff --git a/test/__tests__/data/warehouse/flatten_event_properties.js b/test/__tests__/data/warehouse/flatten_event_properties.js index 844d01744ec..0c34349180a 100644 --- a/test/__tests__/data/warehouse/flatten_event_properties.js +++ b/test/__tests__/data/warehouse/flatten_event_properties.js @@ -86,7 +86,7 @@ const sampleEvents = { object_prop_first_level_map_second_level_map_third_level_string: "third level", object_prop_first_level_map_second_level_map_third_level_map: - '{"fourthLevelInt":4}' + JSON.stringify({"fourthLevelInt":4}) }, columnTypes: { int_prop: "int", @@ -106,12 +106,12 @@ const sampleEvents = { int_prop: 0, float_prop: 2.2, string_prop: "zero", - array_prop: '["zero","level"]', + array_prop: JSON.stringify(["zero","level"]), object_prop_first_level_int: 1, object_prop_first_level_bool: true, object_prop_first_level_map_second_level_array: ["second", "level"], object_prop_first_level_map_second_level_map: - '{"thirdLevelString":"third level","thirdLevelMap":{"fourthLevelInt":4}}' + JSON.stringify({"thirdLevelString":"third level","thirdLevelMap":{"fourthLevelInt":4}}) }, columnTypes: { int_prop: "int", @@ -136,7 +136,7 @@ const sampleEvents = { object_prop_first_level_map_second_level_map_third_level_string: "third level", object_prop_first_level_map_second_level_map_third_level_map: - '{"fourthLevelInt":4}' + JSON.stringify({"fourthLevelInt":4}) }, columnTypes: { int_prop: "int", @@ -156,13 +156,13 @@ const sampleEvents = { int_prop: 0, float_prop: 2.2, string_prop: "zero", - array_prop: '["zero","level"]', + array_prop: JSON.stringify(["zero","level"]), object_prop_first_level_int: 1, object_prop_first_level_map_second_level_array: ["second", "level"], object_prop_first_level_map_second_level_map_third_level_string: "third level", object_prop_first_level_map_second_level_map_third_level_map: - '{"fourthLevelInt":4,"fourthLevelMap":{"fifthLevelString":"fifth level"}}' + JSON.stringify({"fourthLevelInt":4,"fourthLevelMap":{"fifthLevelString":"fifth level"}}) }, columnTypes: { int_prop: "int", @@ -280,7 +280,7 @@ const sampleEvents = { object_prop_first_level_map_second_level_map_third_level_string: "third level", object_prop_first_level_map_second_level_map_third_level_map: - '{"fourthLevelInt":4}' + JSON.stringify({"fourthLevelInt":4}) }, columnTypes: { int_prop: "int", @@ -300,12 +300,12 @@ const sampleEvents = { int_prop: 0, float_prop: 2.2, string_prop: "zero", - array_prop: '["zero","level"]', + array_prop: JSON.stringify(["zero","level"]), object_prop_first_level_int: 1, object_prop_first_level_bool: true, object_prop_first_level_map_second_level_array: ["second", "level"], object_prop_first_level_map_second_level_map: - '{"thirdLevelString":"third level","thirdLevelMap":{"fourthLevelInt":4}}' + JSON.stringify({"thirdLevelString":"third level","thirdLevelMap":{"fourthLevelInt":4}}) }, columnTypes: { int_prop: "int", @@ -330,7 +330,7 @@ const sampleEvents = { object_prop_first_level_map_second_level_map_third_level_string: "third level", object_prop_first_level_map_second_level_map_third_level_map: - '{"fourthLevelInt":4}' + JSON.stringify({"fourthLevelInt":4}) }, columnTypes: { int_prop: "int", @@ -350,13 +350,13 @@ const sampleEvents = { int_prop: 0, float_prop: 2.2, string_prop: "zero", - array_prop: '["zero","level"]', + array_prop: JSON.stringify(["zero","level"]), object_prop_first_level_int: 1, object_prop_first_level_map_second_level_array: ["second", "level"], object_prop_first_level_map_second_level_map_third_level_string: "third level", object_prop_first_level_map_second_level_map_third_level_map: - '{"fourthLevelInt":4,"fourthLevelMap":{"fifthLevelString":"fifth level"}}' + JSON.stringify({"fourthLevelInt":4,"fourthLevelMap":{"fifthLevelString":"fifth level"}}) }, columnTypes: { int_prop: "int", @@ -476,7 +476,7 @@ const sampleEvents = { object_prop_first_level_map_second_level_map_third_level_string: "third level", object_prop_first_level_map_second_level_map_third_level_map: - '{"fourthLevelInt":4}' + JSON.stringify({"fourthLevelInt":4}) }, columnTypes: { int_prop: "int", @@ -496,12 +496,12 @@ const sampleEvents = { int_prop: 0, float_prop: 2.2, string_prop: "zero", - array_prop: '["zero","level"]', + array_prop: JSON.stringify(["zero","level"]), object_prop_first_level_int: 1, object_prop_first_level_bool: true, object_prop_first_level_map_second_level_array: ["second", "level"], object_prop_first_level_map_second_level_map: - '{"thirdLevelString":"third level","thirdLevelMap":{"fourthLevelInt":4}}' + JSON.stringify({"thirdLevelString":"third level","thirdLevelMap":{"fourthLevelInt":4}}) }, columnTypes: { int_prop: "int", @@ -526,7 +526,7 @@ const sampleEvents = { object_prop_first_level_map_second_level_map_third_level_string: "third level", object_prop_first_level_map_second_level_map_third_level_map: - '{"fourthLevelInt":4}' + JSON.stringify({"fourthLevelInt":4}) }, columnTypes: { int_prop: "int", @@ -546,13 +546,13 @@ const sampleEvents = { int_prop: 0, float_prop: 2.2, string_prop: "zero", - array_prop: '["zero","level"]', + array_prop: JSON.stringify(["zero","level"]), object_prop_first_level_int: 1, object_prop_first_level_map_second_level_array: ["second", "level"], object_prop_first_level_map_second_level_map_third_level_string: "third level", object_prop_first_level_map_second_level_map_third_level_map: - '{"fourthLevelInt":4,"fourthLevelMap":{"fifthLevelString":"fifth level"}}' + JSON.stringify({"fourthLevelInt":4,"fourthLevelMap":{"fifthLevelString":"fifth level"}}) }, columnTypes: { int_prop: "int", diff --git a/test/__tests__/data/warehouse/integration_options_events.js b/test/__tests__/data/warehouse/integration_options_events.js index b3f076851b9..aacf9abd5c2 100644 --- a/test/__tests__/data/warehouse/integration_options_events.js +++ b/test/__tests__/data/warehouse/integration_options_events.js @@ -323,10 +323,10 @@ const sampleEvents = { path_to_$1_000_000: "None", _9omega: true, camelcase123key: "camel case", - testmap_nestedmap: '{"n1":"nested prop 1"}', + testmap_nestedmap: JSON.stringify({"n1":"nested prop 1"}), tmap_t1: 10, tmap_t2: 20, - testarray: '["This is","an","array"]', + testarray: JSON.stringify(["This is","an","array"]), context_app_build: "1.0.0", context_app_name: "RudderLabs JavaScript SDK", context_app_namespace: "com.rudderlabs.javascript", @@ -406,9 +406,9 @@ const sampleEvents = { PATH_TO_$1_000_000: "None", _9OMEGA: true, CAMELCASE123KEY: "camel case", - TESTMAP_NESTEDMAP: '{"n1":"nested prop 1"}', - TMAP: '{"t1":10,"t2":20}', - TESTARRAY: '["This is","an","array"]', + TESTMAP_NESTEDMAP: JSON.stringify({"n1":"nested prop 1"}), + TMAP: JSON.stringify({"t1":10,"t2":20}), + TESTARRAY: JSON.stringify(["This is","an","array"]), CONTEXT_APP_BUILD: "1.0.0", CONTEXT_APP_NAME: "RudderLabs JavaScript SDK", CONTEXT_APP_NAMESPACE: "com.rudderlabs.javascript", @@ -488,9 +488,9 @@ const sampleEvents = { PATH_TO_$1_000_000: "None", _9OMEGA: true, CAMELCASE123KEY: "camel case", - TESTMAP_NESTEDMAP: '{"n1":"nested prop 1"}', - TMAP: '{"t1":10,"t2":20}', - TESTARRAY: '["This is","an","array"]', + TESTMAP_NESTEDMAP: JSON.stringify({"n1":"nested prop 1"}), + TMAP: JSON.stringify({"t1":10,"t2":20}), + TESTARRAY: JSON.stringify(["This is","an","array"]), CONTEXT_APP_BUILD: "1.0.0", CONTEXT_APP_NAME: "RudderLabs JavaScript SDK", CONTEXT_APP_NAMESPACE: "com.rudderlabs.javascript", @@ -784,9 +784,9 @@ const sampleEvents = { path_to_1_000_000: "None", _9_omega: true, camel_case_123_key: "camel case", - test_map_nested_map: '{"n1":"nested prop 1"}', - t_map: '{"t1":10,"t2":20}', - test_array: '["This is","an","array"]', + test_map_nested_map: JSON.stringify({"n1":"nested prop 1"}), + t_map: JSON.stringify({"t1":10,"t2":20}), + test_array: JSON.stringify(["This is","an","array"]), context_app_build: "1.0.0", context_app_name: "RudderLabs JavaScript SDK", context_app_namespace: "com.rudderlabs.javascript", diff --git a/test/__tests__/legacyRouter.test.ts b/test/__tests__/legacyRouter.test.ts deleted file mode 100644 index 926f6e76d4e..00000000000 --- a/test/__tests__/legacyRouter.test.ts +++ /dev/null @@ -1,113 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import { DestinationController } from '../../src/controllers/destination'; -const destArg = process.argv.filter((x) => x.startsWith('--destName='))[0]; // send arguments on which destination -const typeArg = process.argv.filter((x) => x.startsWith('--type='))[0]; // send argument on which function - -// To invoke CDK live compare: -// router: CDK_LIVE_TEST=1 npx jest versionedRouter --destName=algolia --type=router -// processor: CDK_LIVE_TEST=1 npx jest versionedRouter --destName=algolia --type=processor - -let destination; -if (typeArg) { - destination = destArg ? destArg.split('=')[1] : 'heap'; // default - const type = typeArg.split('=')[1]; - let reqBody; - let respBody; - if (type !== 'all') { - try { - reqBody = JSON.parse( - fs - .readFileSync( - path.resolve(__dirname, `./data/versioned_${type}_${destination}_input.json`), - ) - .toString(), - ); - respBody = JSON.parse( - fs - .readFileSync( - path.resolve(__dirname, `./data/versioned_${type}_${destination}_output.json`), - ) - .toString(), - ); - } catch (error) { - throw new Error('destination/type not valid' + error); - } - } - if (type === 'router') { - it(`Testing: routerHandleDest`, async () => { - const output = await DestinationController.destinationTransformAtRouter(reqBody); - expect(output).toEqual(respBody); - }); - } else if (type === 'processor') { - it(`Testing: handleDest`, async () => { - const output = await DestinationController.destinationTransformAtProcessor(reqBody); - expect(output).toEqual(respBody); - }); - } else if (type === 'batch') { - it(`Testing: batchHandler`, async () => { - const output = await DestinationController.batchProcess(reqBody); - expect(output).toEqual(respBody); - }); - } else if (type === 'all') { - it(`Testing: routerHandleDest`, async () => { - const reqBody = JSON.parse( - fs - .readFileSync( - path.resolve(__dirname, `./data/versioned_router_${destination}_input.json`), - ) - .toString(), - ); - const respBody = JSON.parse( - fs - .readFileSync( - path.resolve(__dirname, `./data/versioned_router_${destination}_output.json`), - ) - .toString(), - ); - const output = await DestinationController.destinationTransformAtRouter(reqBody); - expect(output).toEqual(respBody); - }); - it(`Testing: handleDest`, async () => { - const reqBody = JSON.parse( - fs - .readFileSync( - path.resolve(__dirname, `./data/versioned_processor_${destination}_input.json`), - ) - .toString(), - ); - const respBody = JSON.parse( - fs - .readFileSync( - path.resolve(__dirname, `./data/versioned_processor_${destination}_output.json`), - ) - .toString(), - ); - destination = destination || 'heap'; // default - const output = await DestinationController.destinationTransformAtProcessor(reqBody); - expect(output).toEqual(respBody); - }); - it(`Testing: batchHandler`, async () => { - const reqBody = JSON.parse( - fs - .readFileSync(path.resolve(__dirname, `./data/versioned_batch_braze_input.json`)) - .toString(), - ); - const respBody = JSON.parse( - fs - .readFileSync(path.resolve(__dirname, `./data/versioned_batch_braze_output.json`)) - .toString(), - ); - }); - } else { - it(`Type is not all/router/batch/processor`, () => { - expect('Type is not all/router/batch/processor').toEqual( - 'Type is not all/router/batch/processor', - ); - }); - } -} else { - it(`No type and destination mentioned for testing versionedRouter`, () => { - expect('no command line argument provided').toEqual('no command line argument provided'); - }); -} diff --git a/test/__tests__/shopify_warehouse.test.js b/test/__tests__/shopify_warehouse.test.js new file mode 100644 index 00000000000..b7c1fbf59fb --- /dev/null +++ b/test/__tests__/shopify_warehouse.test.js @@ -0,0 +1,103 @@ +const event = { + "request": { + "query": { + "whSchemaVersion": "v1" + } + }, + "message": { + "context": { + "shopifyDetails": { + "id": 5778367414385, + "current_total_tax": "10.00", + "current_total_tax_set": { + "shop_money": { + "amount": "10.00", + "currency_code": "USD" + }, + }, + "name": "#1017", + "phone": null, + } + }, + "integrations": { + "SHOPIFY": true, + "DATA_WAREHOUSE": { + "options": { + "jsonPaths": [ + "track.context.shopifyDetails" + ] + } + } + }, + "type": "track", + "event": "Order Updated", + "properties": { + "order_id": "5778367414385", + "currency": "USD", + "products": [ + { + "product_id": "7234590408817", + "price": 600, + "quantity": 1 + } + ] + }, + "userId": "123321", + "traits": {}, + "timestamp": "2024-01-01T01:23:45.678Z", + }, + "destination": { + "Config": {}, + } +}; + +/* + Test for warehouse agnostic DATA_WAREHOUSE JSON column support for Shopify source +*/ +describe('DATA_WAREHOUSE integrations', () => { + it('should process event and return responses for common providers for agnostic support', () => { + const responses = require('../../src/v0/destinations/snowflake/transform').process(event); + expect(responses).toHaveLength(2); + expect(responses[0].metadata.table).toBe('TRACKS'); + expect(responses[1].metadata.table).toBe('ORDER_UPDATED'); + + expect(responses[0].metadata.columns.CONTEXT_SHOPIFY_DETAILS).toBe('json'); + expect(responses[0].data.CONTEXT_SHOPIFY_DETAILS).toBe(JSON.stringify({"id":5778367414385,"current_total_tax":"10.00","current_total_tax_set":{"shop_money":{"amount":"10.00","currency_code":"USD"}},"name":"#1017","phone":null})); + + expect(responses[1].metadata.columns.CONTEXT_SHOPIFY_DETAILS).toBe('json'); + expect(responses[1].data.CONTEXT_SHOPIFY_DETAILS).toBe(JSON.stringify({"id":5778367414385,"current_total_tax":"10.00","current_total_tax_set":{"shop_money":{"amount":"10.00","currency_code":"USD"}},"name":"#1017","phone":null})); + }); + + it('should process event and return response for other providers like mssql', () => { + const responses = require('../../src/v0/destinations/mssql/transform').process(event); + expect(responses).toHaveLength(2); + expect(responses[0].metadata.table).toBe('tracks'); + expect(responses[1].metadata.table).toBe('order_updated'); + + expect(responses[0].metadata.columns.context_shopify_details).toBe(undefined); + expect(responses[0].metadata.columns.context_shopify_details_id).toBe('int'); + expect(responses[0].metadata.columns.context_shopify_details_current_total_tax).toBe('string'); + expect(responses[0].metadata.columns.context_shopify_details_current_total_tax_set_shop_money_amount).toBe('string'); + expect(responses[0].metadata.columns.context_shopify_details_current_total_tax_set_shop_money_currency_code).toBe('string'); + expect(responses[0].metadata.columns.context_shopify_details_name).toBe('string'); + expect(responses[0].data.context_shopify_details).toBe(undefined); + expect(responses[0].data.context_shopify_details_id).toBe(5778367414385); + expect(responses[0].data.context_shopify_details_current_total_tax).toBe('10.00'); + expect(responses[0].data.context_shopify_details_current_total_tax_set_shop_money_amount).toBe('10.00'); + expect(responses[0].data.context_shopify_details_current_total_tax_set_shop_money_currency_code).toBe('USD'); + expect(responses[0].data.context_shopify_details_name).toBe('#1017'); + + expect(responses[1].metadata.columns.context_shopify_details).toBe(undefined); + expect(responses[1].metadata.columns.context_shopify_details_id).toBe('int'); + expect(responses[1].metadata.columns.context_shopify_details_current_total_tax).toBe('string'); + expect(responses[1].metadata.columns.context_shopify_details_current_total_tax_set_shop_money_amount).toBe('string'); + expect(responses[1].metadata.columns.context_shopify_details_current_total_tax_set_shop_money_currency_code).toBe('string'); + expect(responses[1].metadata.columns.context_shopify_details_name).toBe('string'); + expect(responses[1].data.context_shopify_details).toBe(undefined); + expect(responses[1].data.context_shopify_details_id).toBe(5778367414385); + expect(responses[1].data.context_shopify_details_current_total_tax).toBe('10.00'); + expect(responses[1].data.context_shopify_details_current_total_tax_set_shop_money_amount).toBe('10.00'); + expect(responses[1].data.context_shopify_details_current_total_tax_set_shop_money_currency_code).toBe('USD'); + expect(responses[1].data.context_shopify_details_name).toBe('#1017'); + }); +}); \ No newline at end of file diff --git a/test/__tests__/user_transformation_fetch.test.js b/test/__tests__/user_transformation_fetch.test.js index 3f0b0606898..635f7d16e70 100644 --- a/test/__tests__/user_transformation_fetch.test.js +++ b/test/__tests__/user_transformation_fetch.test.js @@ -149,7 +149,7 @@ describe("User transformation fetch tests", () => { } ` }; - const errMsg = "request to https://abc.xyz.com/dummyUrl failed, reason: Invalid IP address: unable to resolve IP address for abc.xyz.com"; + const errMsg = "request to https://abc.xyz.com/dummyUrl failed, reason: unable to resolve IP address for abc.xyz.com"; mockResolver.mockRejectedValue('invalid host'); const output = await userTransformHandler(inputData, versionId, [], trRevCode, true); @@ -305,7 +305,7 @@ describe("User transformation fetch tests", () => { } ` }; - const errMsg = "request to https://abc.xyz.com/dummyUrl failed, reason: Invalid IP address: cannot use 127.0.0.1 as IP address"; + const errMsg = "request to https://abc.xyz.com/dummyUrl failed, reason: cannot use 127.0.0.1 as IP address"; mockResolver.mockResolvedValue([{ address: '127.0.0.1', ttl: 100 }, { address: '3.122.122.122', ttl: 600 }]); const output = await userTransformHandler(inputData, versionId, [], trRevCode, true); diff --git a/test/apitests/data_scenarios/source/v2/response_to_caller.json b/test/apitests/data_scenarios/source/v2/response_to_caller.json new file mode 100644 index 00000000000..c2f992e524e --- /dev/null +++ b/test/apitests/data_scenarios/source/v2/response_to_caller.json @@ -0,0 +1,18 @@ +{ + "input": [ + { + "request": { + "body": "{\"challenge\": \"some_key\"}" + } + } + ], + "output": [ + { + "outputToSource": { + "body": "eyJjaGFsbGVuZ2UiOiJzb21lX2tleSJ9", + "contentType": "application/json" + }, + "statusCode": 200 + } + ] +} diff --git a/test/apitests/service.api.test.ts b/test/apitests/service.api.test.ts index 2ad1f323ace..4c53178c76f 100644 --- a/test/apitests/service.api.test.ts +++ b/test/apitests/service.api.test.ts @@ -22,7 +22,7 @@ beforeAll(async () => { }), ); applicationRoutes(app); - server = app.listen(9090); + server = app.listen(); }); afterAll(async () => { @@ -543,32 +543,10 @@ describe('Destination api tests', () => { }); describe('Source api tests', () => { - test('(shopify) successful source transform', async () => { - const data = getDataFromPath('./data_scenarios/source/v0/successful.json'); - const response = await request(server) - .post('/v0/sources/shopify') - .set('Accept', 'application/json') - .send(data.input); - const parsedResp = JSON.parse(response.text); - delete parsedResp[0].output.batch[0].anonymousId; - expect(response.status).toEqual(200); - expect(parsedResp).toEqual(data.output); - }); - - test('(shopify) failure source transform (shopify)', async () => { - const data = getDataFromPath('./data_scenarios/source/v0/failure.json'); - const response = await request(server) - .post('/v0/sources/shopify') - .set('Accept', 'application/json') - .send(data.input); - expect(response.status).toEqual(200); - expect(JSON.parse(response.text)).toEqual(data.output); - }); - test('(shopify) success source transform (monday)', async () => { - const data = getDataFromPath('./data_scenarios/source/v0/response_to_caller.json'); + const data = getDataFromPath('./data_scenarios/source/v2/response_to_caller.json'); const response = await request(server) - .post('/v0/sources/monday') + .post('/v2/sources/monday') .set('Accept', 'application/json') .send(data.input); expect(response.status).toEqual(200); diff --git a/test/integrations/common/criteo/network.ts b/test/integrations/common/criteo/network.ts index cd5e1ca1e81..b1ce915c86f 100644 --- a/test/integrations/common/criteo/network.ts +++ b/test/integrations/common/criteo/network.ts @@ -1,5 +1,6 @@ +import { defaultAccessTokenAuthHeader } from '../secrets'; const headers = { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', 'User-Agent': 'RudderLabs', diff --git a/test/integrations/common/secrets.ts b/test/integrations/common/secrets.ts new file mode 100644 index 00000000000..73d428a8f5c --- /dev/null +++ b/test/integrations/common/secrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; + +export const defaultAccessToken = path.basename(__dirname) + 'AccessToken'; +export const defaultApiKey = path.basename(__dirname) + 'ApiKey'; +export const defaultAccessTokenAuthHeader = `Bearer ${defaultAccessToken}`; diff --git a/test/integrations/component.test.ts b/test/integrations/component.test.ts index baad6813dfb..cc786678f09 100644 --- a/test/integrations/component.test.ts +++ b/test/integrations/component.test.ts @@ -7,23 +7,26 @@ import axios from 'axios'; import bodyParser from 'koa-bodyparser'; import { Command } from 'commander'; import { createHttpTerminator } from 'http-terminator'; -import { MockHttpCallsData, TestCaseData } from './testTypes'; +import { ExtendedTestCaseData, TestCaseData } from './testTypes'; import { applicationRoutes } from '../../src/routes/index'; import MockAxiosAdapter from 'axios-mock-adapter'; import { getTestDataFilePaths, getTestData, - getMockHttpCallsData, - getAllTestMockDataFilePaths, - addMock, + registerAxiosMocks, validateTestWithZOD, + getTestMockData, } from './testUtils'; import tags from '../../src/v0/util/tags'; import { Server } from 'http'; import { appendFileSync } from 'fs'; import { assertRouterOutput, responses } from '../testHelper'; -import { generateTestReport, initaliseReport } from '../test_reporter/reporter'; +import { initaliseReport } from '../test_reporter/reporter'; import _ from 'lodash'; +import defaultFeaturesConfig from '../../src/features'; +import { ControllerUtility } from '../../src/controllers/util'; +import { FetchHandler } from '../../src/helpers/fetchHandlers'; +import { enhancedTestUtils } from '../test_reporter/allureReporter'; // To run single destination test cases // npm run test:ts -- component --destination=adobe_analytics @@ -38,7 +41,7 @@ command .allowUnknownOption() .option('-d, --destination ', 'Enter Destination Name') .option('-f, --feature ', 'Enter Feature Name(processor, router)') - .option('-i, --index ', 'Enter Test index') + .option('-i, --index ', 'Enter Test index', parseInt) .option('-g, --generate ', 'Enter "true" If you want to generate network file') .option('-id, --id ', 'Enter unique "Id" of the test case you want to run') .option('-s, --source ', 'Enter Source Name') @@ -55,7 +58,13 @@ if (opts.generate === 'true') { let server: Server; -const INTEGRATIONS_WITH_UPDATED_TEST_STRUCTURE = ['klaviyo', 'campaign_manager', 'criteo_audience']; +const INTEGRATIONS_WITH_UPDATED_TEST_STRUCTURE = [ + 'active_campaign', + 'klaviyo', + 'campaign_manager', + 'criteo_audience', + 'branch', +]; beforeAll(async () => { initaliseReport(); @@ -70,6 +79,7 @@ beforeAll(async () => { }); afterAll(async () => { + await createHttpTerminator({ server }).terminate(); if (opts.generate === 'true') { const callsDataStr = responses.join('\n'); const calls = ` @@ -79,26 +89,7 @@ afterAll(async () => { `; appendFileSync(join(__dirname, 'destinations', opts.destination, 'network.ts'), calls); } - await createHttpTerminator({ server }).terminate(); }); -let mockAdapter; -if (!opts.generate || opts.generate === 'false') { - // unmock already existing axios-mocking - mockAdapter = new MockAxiosAdapter(axios, { onNoMatch: 'throwException' }); - const registerAxiosMocks = (axiosMocks: MockHttpCallsData[]) => { - axiosMocks.forEach((axiosMock) => addMock(mockAdapter, axiosMock)); - }; - - // // all the axios requests will be stored in this map - const allTestMockDataFilePaths = getAllTestMockDataFilePaths(__dirname, opts.destination); - const allAxiosRequests = allTestMockDataFilePaths - .map((currPath) => { - const mockNetworkCallsData: MockHttpCallsData[] = getMockHttpCallsData(currPath); - return mockNetworkCallsData; - }) - .flat(); - registerAxiosMocks(allAxiosRequests); -} // END const rootDir = __dirname; @@ -133,6 +124,21 @@ const testRoute = async (route, tcData: TestCaseData) => { .send(body); const outputResp = tcData.output.response || ({} as any); + expect(response.status).toEqual(outputResp.status); + + if (INTEGRATIONS_WITH_UPDATED_TEST_STRUCTURE.includes(tcData.name?.toLocaleLowerCase())) { + expect(validateTestWithZOD(tcData, response)).toEqual(true); + enhancedTestUtils.beforeTestRun(tcData); + enhancedTestUtils.afterTestRun(tcData, response.body); + } + + if (outputResp?.body) { + expect(response.body).toEqual(outputResp.body); + } + + if (outputResp.headers !== undefined) { + expect(response.headers).toEqual(outputResp.headers); + } if (tcData.feature === tags.FEATURES.BATCH || tcData.feature === tags.FEATURES.ROUTER) { //TODO get rid of these skipped destinations after they are fixed if ( @@ -148,27 +154,6 @@ const testRoute = async (route, tcData: TestCaseData) => { assertRouterOutput(response.body.output, tcData.input.request.body.input); } } - - expect(response.status).toEqual(outputResp.status); - - if (INTEGRATIONS_WITH_UPDATED_TEST_STRUCTURE.includes(tcData.name?.toLocaleLowerCase())) { - expect(validateTestWithZOD(tcData, response)).toEqual(true); - const bodyMatched = _.isEqual(response.body, outputResp.body); - const statusMatched = response.status === outputResp.status; - if (bodyMatched && statusMatched) { - generateTestReport(tcData, response.body, 'passed'); - } else { - generateTestReport(tcData, response.body, 'failed'); - } - } - - if (outputResp?.body) { - expect(response.body).toEqual(outputResp.body); - } - - if (outputResp.headers !== undefined) { - expect(response.headers).toEqual(outputResp.headers); - } }; const destinationTestHandler = async (tcData: TestCaseData) => { @@ -209,42 +194,79 @@ const sourceTestHandler = async (tcData) => { await testRoute(route, tcData); }; -// Trigger the test suites -describe.each(allTestDataFilePaths)('%s Tests', (testDataPath) => { - beforeEach(() => { - jest.resetAllMocks(); - jest.clearAllMocks(); - }); - // add special mocks for specific destinations - let testData: TestCaseData[] = getTestData(testDataPath); - if (opts.index !== undefined) { - testData = [testData[parseInt(opts.index)]]; - } - if (opts.id) { - testData = testData.filter((data) => { - if (data['id'] === opts.id) { - return true; +const mockAdapter = new MockAxiosAdapter(axios as any, { onNoMatch: 'throwException' }); +registerAxiosMocks(mockAdapter, getTestMockData(opts.destination || opts.source)); + +describe('Component Test Suite', () => { + if (allTestDataFilePaths.length === 0) { + // Reason: No test cases matched the given criteria + test.skip('No test cases provided. Skipping tests.', () => {}); + } else { + describe.each(allTestDataFilePaths)('%s Tests', (testDataPath) => { + beforeEach(() => { + jest.resetAllMocks(); + jest.clearAllMocks(); + }); + let testData: TestCaseData[] = getTestData(testDataPath); + if (opts.index < testData.length && opts.index >= 0) { + testData = [testData[opts.index]]; } - return false; - }); - } - describe(`${testData[0].name} ${testData[0].module}`, () => { - test.each(testData)('$feature -> $description (index: $#)', async (tcData) => { - tcData?.mockFns?.(mockAdapter); - - switch (tcData.module) { - case tags.MODULES.DESTINATION: - await destinationTestHandler(tcData); - break; - case tags.MODULES.SOURCE: - await sourceTestHandler(tcData); - break; - default: - console.log('Invalid module'); - // Intentionally fail the test case - expect(true).toEqual(false); - break; + if (opts.id) { + testData = testData.filter((data) => data.id === opts.id); + } + + const extendedTestData: ExtendedTestCaseData[] = testData.flatMap((tcData) => { + if (tcData.module === tags.MODULES.SOURCE) { + return [ + { + tcData, + sourceTransformV2Flag: false, + descriptionSuffix: ' (sourceTransformV2Flag: false)', + }, + { + tcData, + sourceTransformV2Flag: true, + descriptionSuffix: ' (sourceTransformV2Flag: true)', + }, + ]; + } + return [{ tcData, descriptionSuffix: '' }]; + }); + if (extendedTestData.length === 0) { + // Reason: user may have skipped the test cases + test.skip('No test cases provided. Skipping tests.', () => {}); + } else { + describe(`${testData[0].name} ${testData[0].module}`, () => { + test.each(extendedTestData)( + '$tcData.feature -> $tcData.description$descriptionSuffix (index: $#)', + async ({ tcData, sourceTransformV2Flag }) => { + tcData?.mockFns?.(mockAdapter); + + switch (tcData.module) { + case tags.MODULES.DESTINATION: + await destinationTestHandler(tcData); + break; + case tags.MODULES.SOURCE: + tcData?.mockFns?.(mockAdapter); + testSetupSourceTransformV2(sourceTransformV2Flag); + await sourceTestHandler(tcData); + break; + default: + console.log('Invalid module'); + // Intentionally fail the test case + expect(true).toEqual(false); + break; + } + }, + ); + }); } }); - }); + } }); + +const testSetupSourceTransformV2 = (flag) => { + defaultFeaturesConfig.upgradedToSourceTransformV2 = flag; + ControllerUtility['sourceVersionMap'] = new Map(); + FetchHandler['sourceHandlerMap'] = new Map(); +}; diff --git a/test/integrations/destinations/accoil_analytics/maskedSecrets.ts b/test/integrations/destinations/accoil_analytics/maskedSecrets.ts new file mode 100644 index 00000000000..f1b1c5acae9 --- /dev/null +++ b/test/integrations/destinations/accoil_analytics/maskedSecrets.ts @@ -0,0 +1,8 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secretStaging1 = `stg_` + path.basename(__dirname) + 1; + +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':')}`; +export const authHeaderStaging1 = `Basic ${base64Convertor(secretStaging1 + ':')}`; diff --git a/test/integrations/destinations/accoil_analytics/processor/data.ts b/test/integrations/destinations/accoil_analytics/processor/data.ts new file mode 100644 index 00000000000..d0842cc447d --- /dev/null +++ b/test/integrations/destinations/accoil_analytics/processor/data.ts @@ -0,0 +1,1397 @@ +import { ProcessorTestData } from '../../../testTypes'; +import { Metadata } from '../../../../../src/types'; +import { authHeader1, authHeaderStaging1, secret1, secretStaging1 } from '../maskedSecrets'; + +const baseMetadata: Partial = { + destinationDefinitionId: 'default-dest-def', + destinationType: 'default-destination-type', + eventName: 'default-event', + eventType: 'default-type', + instanceId: 'default-instance', + jobId: 1, + jobRunId: 'default-job-run', + mergedTpConfig: {}, + messageId: 'default-message-id', + messageIds: ['default-message-id'], + namespace: 'default-namespace', + oauthAccessToken: 'default-token', + receivedAt: '2024-12-10T06:45:09.572Z', + recordId: {}, + rudderId: 'default-rudder-id', + sourceBatchId: 'default-batch', + sourceCategory: 'default-category', + sourceDefinitionId: 'default-source-def', + sourceId: 'default-source', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + sourceTpConfig: {}, + sourceType: 'default-source-type', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + transformationId: 'default-transform', + destinationId: 'default-destination', + workspaceId: 'default-workspace', +}; + +export const data: ProcessorTestData[] = [ + // Successful track + { + id: 'accoil-analytics-destination-processor-100', + name: 'accoil_analytics', + description: 'Successful track event', + scenario: 'Track event is received and processed', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: '1234567890', + event: 'Activated', + type: 'track', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://in.accoil.com/segment', + headers: { + 'Content-Type': 'application/json', + Authorization: authHeader1, + }, + params: {}, + body: { + JSON: { + type: 'track', + event: 'Activated', + userId: '1234567890', + timestamp: '2024-01-23T08:35:17.562Z', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: baseMetadata, + statusCode: 200, + }, + ], + }, + }, + }, + // Successful identify + { + id: 'accoil-analytics-destination-processor-200', + name: 'accoil_analytics', + description: 'Successful identify event', + scenario: 'Identify event is received and processed', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: 'bobby', + type: 'identify', + traits: { + email: 'bobby@example.com', + name: 'Little Bobby', + role: 'admin', + createdAt: '2024-01-20T08:35:17.342Z', + accountStatus: 'trial', + }, + timestamp: '2024-01-20T08:35:17.342Z', + originalTimestamp: '2024-01-23T08:35:17.342Z', + sentAt: '2024-01-23T08:35:35.234Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://in.accoil.com/segment', + headers: { + 'Content-Type': 'application/json', + Authorization: authHeader1, + }, + params: {}, + body: { + JSON: { + userId: 'bobby', + type: 'identify', + traits: { + email: 'bobby@example.com', + name: 'Little Bobby', + role: 'admin', + createdAt: '2024-01-20T08:35:17.342Z', + accountStatus: 'trial', + }, + timestamp: '2024-01-20T08:35:17.342Z', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: baseMetadata, + statusCode: 200, + }, + ], + }, + }, + }, + // Successful group + { + id: 'accoil-analytics-destination-processor-300', + name: 'accoil_analytics', + description: 'Successful group event', + scenario: 'Group event is received and processed', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: 'bobby', + groupId: 'bobbygroup', + type: 'group', + traits: { + name: 'Little Bobby Group', + createdAt: '2024-01-20T08:35:17.342Z', + status: 'paid', + mrr: '10.1', + plan: 'basic', + }, + timestamp: '2024-01-20T08:35:17.342Z', + originalTimestamp: '2024-01-23T08:35:17.342Z', + sentAt: '2024-01-23T08:35:35.234Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://in.accoil.com/segment', + headers: { + 'Content-Type': 'application/json', + Authorization: authHeader1, + }, + params: {}, + body: { + JSON: { + userId: 'bobby', + groupId: 'bobbygroup', + type: 'group', + traits: { + name: 'Little Bobby Group', + createdAt: '2024-01-20T08:35:17.342Z', + status: 'paid', + mrr: '10.1', + plan: 'basic', + }, + timestamp: '2024-01-20T08:35:17.342Z', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: baseMetadata, + statusCode: 200, + }, + ], + }, + }, + }, + // Successful page + { + id: 'accoil-analytics-destination-processor-400', + name: 'accoil_analytics', + description: 'Successful page event', + scenario: 'Page event is received and processed', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: 'bobby', + type: 'page', + name: 'Account Details', + traits: { + name: 'Sub page: Configuration', + }, + timestamp: '2024-01-20T08:35:17.342Z', + originalTimestamp: '2024-01-23T08:35:17.342Z', + sentAt: '2024-01-23T08:35:35.234Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://in.accoil.com/segment', + headers: { + 'Content-Type': 'application/json', + Authorization: authHeader1, + }, + params: {}, + body: { + JSON: { + userId: 'bobby', + type: 'page', + name: 'Account Details', + timestamp: '2024-01-20T08:35:17.342Z', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: baseMetadata, + statusCode: 200, + }, + ], + }, + }, + }, + // Successful screen + { + id: 'accoil-analytics-destination-processor-500', + name: 'accoil_analytics', + description: 'Successful screen event', + scenario: 'Screen event is received and processed', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: 'bobby', + type: 'screen', + name: 'Configuration', + traits: { + account: 'Bobby Account', + }, + timestamp: '2024-01-20T08:35:17.342Z', + originalTimestamp: '2024-01-23T08:35:17.342Z', + sentAt: '2024-01-23T08:35:35.234Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://in.accoil.com/segment', + headers: { + 'Content-Type': 'application/json', + Authorization: authHeader1, + }, + params: {}, + body: { + JSON: { + userId: 'bobby', + type: 'screen', + name: 'Configuration', + timestamp: '2024-01-20T08:35:17.342Z', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: baseMetadata, + statusCode: 200, + }, + ], + }, + }, + }, + // Verify sending to staging environment + { + id: 'accoil-analytics-destination-processor-600', + name: 'accoil_analytics', + description: 'Successful screen event: staging', + scenario: 'Screen event is received and processed for staging environment', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: 'bobby', + type: 'screen', + name: 'Configuration', + traits: { + account: 'Bobby Account', + }, + timestamp: '2024-01-20T08:35:17.342Z', + originalTimestamp: '2024-01-23T08:35:17.342Z', + sentAt: '2024-01-23T08:35:35.234Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secretStaging1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://instaging.accoil.com/segment', + headers: { + 'Content-Type': 'application/json', + Authorization: authHeaderStaging1, + }, + params: {}, + body: { + JSON: { + userId: 'bobby', + type: 'screen', + name: 'Configuration', + timestamp: '2024-01-20T08:35:17.342Z', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: baseMetadata, + statusCode: 200, + }, + ], + }, + }, + }, + + // Verify checking for invalid payloads (eg no apiKey, missing parts of message) + // Global validation + { + id: 'accoil-analytics-destination-processor-700', + name: 'accoil_analytics', + description: 'Missing required api key', + scenario: 'Event is rejected due to bad config', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: '1234567890', + event: 'Activated', + type: 'track', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiUrl: 'https://in.accoil.com/segment', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'apiKey must be supplied in destination config: Workflow: procWorkflow, Step: validateInput, ChildStep: undefined, OriginalError: apiKey must be supplied in destination config', + statTags: { + errorCategory: 'dataValidation', + errorType: 'configuration', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, + { + id: 'accoil-analytics-destination-processor-701', + name: 'accoil_analytics', + description: 'Missing required timestamp', + scenario: 'Event is rejected due to missing timestamp', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: '1234567890', + event: 'Activated', + type: 'track', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'timestamp is required for all calls: Workflow: procWorkflow, Step: validateTimestamp, ChildStep: undefined, OriginalError: timestamp is required for all calls', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, + // Track validation + { + id: 'accoil-analytics-destination-processor-800', + name: 'accoil_analytics', + description: 'Missing required event', + scenario: 'Event is rejected due to missing event', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: '1234567890', + type: 'track', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'event is required for track call: Workflow: procWorkflow, Step: validateTrackPayload, ChildStep: undefined, OriginalError: event is required for track call', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, + { + id: 'accoil-analytics-destination-processor-801', + name: 'accoil_analytics', + description: 'Missing required userId', + scenario: 'Event is rejected due to missing userId', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + event: 'event', + type: 'track', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'userId is required for track call: Workflow: procWorkflow, Step: validateTrackPayload, ChildStep: undefined, OriginalError: userId is required for track call', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, + // Page validation + { + id: 'accoil-analytics-destination-processor-900', + name: 'accoil_analytics', + description: 'Missing required name', + scenario: 'Event is rejected due to missing name', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: 'bobby', + type: 'page', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'name is required for page call: Workflow: procWorkflow, Step: validatePagePayload, ChildStep: undefined, OriginalError: name is required for page call', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, + { + id: 'accoil-analytics-destination-processor-901', + name: 'accoil_analytics', + description: 'Missing required userId', + scenario: 'Event is rejected due to missing userId', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + name: 'Page name', + type: 'page', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'userId is required for page call: Workflow: procWorkflow, Step: validatePagePayload, ChildStep: undefined, OriginalError: userId is required for page call', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, + // Validate screen + { + id: 'accoil-analytics-destination-processor-1000', + name: 'accoil_analytics', + description: 'Missing required name', + scenario: 'Event is rejected due to missing name', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: 'bobby', + type: 'screen', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'name is required for screen call: Workflow: procWorkflow, Step: validateScreenPayload, ChildStep: undefined, OriginalError: name is required for screen call', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, + { + id: 'accoil-analytics-destination-processor-1001', + name: 'accoil_analytics', + description: 'Missing required userId', + scenario: 'Event is rejected due to missing userId', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + name: 'screen name', + type: 'screen', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'userId is required for screen call: Workflow: procWorkflow, Step: validateScreenPayload, ChildStep: undefined, OriginalError: userId is required for screen call', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, + // Identify validate + { + id: 'accoil-analytics-destination-processor-1100', + name: 'accoil_analytics', + description: 'Missing required userId', + scenario: 'Event is rejected due to missing userId', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + type: 'identify', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'userId is required for identify call: Workflow: procWorkflow, Step: validateIdentifyPayload, ChildStep: undefined, OriginalError: userId is required for identify call', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, + // Group validate + { + id: 'accoil-analytics-destination-processor-1200', + name: 'accoil_analytics', + description: 'Missing required userId', + scenario: 'Event is rejected due to missing userId', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + type: 'group', + groupId: 'group1', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'userId is required for group call: Workflow: procWorkflow, Step: validateGroupPayload, ChildStep: undefined, OriginalError: userId is required for group call', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, + { + id: 'accoil-analytics-destination-processor-1201', + name: 'accoil_analytics', + description: 'Missing required groupId', + scenario: 'Event is rejected due to missing groupId', + successCriteria: 'Processor test should pass successfully', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + userId: 'user', + type: 'group', + messageId: '1873f8bd-68f7-40fc-b262-56a245f22862', + properties: { + email: 'frank@example.com', + }, + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Config: { + apiKey: secret1, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: + 'groupId is required for group call: Workflow: procWorkflow, Step: validateGroupPayload, ChildStep: undefined, OriginalError: groupId is required for group call', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ACCOIL_ANALYTICS', + module: 'destination', + implementation: 'cdkV2', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + feature: 'processor', + }, + }, + ], + }, + }, + }, +]; diff --git a/test/integrations/destinations/accoil_analytics/router/data.ts b/test/integrations/destinations/accoil_analytics/router/data.ts new file mode 100644 index 00000000000..6b9e1949add --- /dev/null +++ b/test/integrations/destinations/accoil_analytics/router/data.ts @@ -0,0 +1,471 @@ +import { RouterTestData } from '../../../testTypes'; +import { authHeader1, authHeaderStaging1, secret1, secretStaging1 } from '../maskedSecrets'; + +export const data: RouterTestData[] = [ + { + id: 'accoil-analytics-destination-router-100', + name: 'accoil_analytics', + description: 'Router batch request', + scenario: 'Scenario which tests for a successful batch request', + successCriteria: 'Router test should pass successfully', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + Config: { + apiKey: secret1, + }, + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + message: { + userId: 'user-uuid', + event: 'User Signed Up', + type: 'track', + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + }, + { + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + Config: { + apiKey: secret1, + }, + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + message: { + userId: 'user-uuid', + event: 'User Deleted account', + type: 'track', + messageId: '8bc79b03-2a5c-4615-b2da-54c0aaaaaae8', + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 2, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + }, + { + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + Config: { + apiKey: secretStaging1, + }, + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + message: { + userId: 'user-uuid', + event: 'User Deleted account', + type: 'track', + messageId: '8bc79b03-2a5c-4615-b2da-54c0aaaaaae8', + timestamp: '2024-01-23T08:35:17.562Z', + }, + metadata: { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 3, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + }, + ], + destType: 'accoil_analytics', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + body: { + FORM: {}, + JSON_ARRAY: {}, + XML: {}, + JSON: { + userId: 'user-uuid', + type: 'track', + event: 'User Signed Up', + timestamp: '2024-01-23T08:35:17.562Z', + }, + }, + endpoint: 'https://in.accoil.com/segment', + files: {}, + params: {}, + type: 'REST', + version: '1', + method: 'POST', + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + }, + }, + batched: false, + metadata: [ + { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + ], + statusCode: 200, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + Config: { + apiKey: secret1, + }, + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + { + batchedRequest: { + body: { + FORM: {}, + JSON_ARRAY: {}, + XML: {}, + JSON: { + userId: 'user-uuid', + type: 'track', + event: 'User Deleted account', + timestamp: '2024-01-23T08:35:17.562Z', + }, + }, + endpoint: 'https://in.accoil.com/segment', + files: {}, + params: {}, + type: 'REST', + version: '1', + method: 'POST', + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + }, + }, + batched: false, + metadata: [ + { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 2, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + ], + statusCode: 200, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + Config: { + apiKey: secret1, + }, + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + { + batchedRequest: { + body: { + FORM: {}, + JSON_ARRAY: {}, + XML: {}, + JSON: { + userId: 'user-uuid', + type: 'track', + event: 'User Deleted account', + timestamp: '2024-01-23T08:35:17.562Z', + }, + }, + endpoint: 'https://instaging.accoil.com/segment', + files: {}, + params: {}, + type: 'REST', + version: '1', + method: 'POST', + headers: { + Authorization: authHeaderStaging1, + 'Content-Type': 'application/json', + }, + }, + batched: false, + metadata: [ + { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 3, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + ], + statusCode: 200, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + Config: { + apiKey: secretStaging1, + }, + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: { + cdkV2Enabled: true, + }, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/active_campaign/network.ts b/test/integrations/destinations/active_campaign/network.ts index 34834096b19..7ccd5fea4e9 100644 --- a/test/integrations/destinations/active_campaign/network.ts +++ b/test/integrations/destinations/active_campaign/network.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../common/secrets'; + export const networkCallsData = [ { httpReq: { @@ -565,7 +567,7 @@ export const networkCallsData = [ }, }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -638,7 +640,7 @@ export const networkCallsData = [ httpReq: { data: { contactList: { contact: '2', list: 2, status: '1' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -652,7 +654,7 @@ export const networkCallsData = [ httpReq: { data: { contactList: { contact: '2', list: 3, status: '2' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -664,7 +666,7 @@ export const networkCallsData = [ }, { httpReq: { - headers: { Accept: 'application/json, text/plain, */*', 'Api-Token': 'dummyApiKey' }, + headers: { Accept: 'application/json, text/plain, */*', 'Api-Token': defaultApiKey }, method: 'GET', @@ -807,7 +809,7 @@ export const networkCallsData = [ }, }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -879,7 +881,7 @@ export const networkCallsData = [ { httpReq: { headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -956,7 +958,7 @@ export const networkCallsData = [ httpReq: { data: { tag: { description: '', tag: 'Test_User', tagType: 'contact' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1037,7 +1039,7 @@ export const networkCallsData = [ httpReq: { data: { tag: { description: '', tag: 'Interested_User', tagType: 'contact' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1118,7 +1120,7 @@ export const networkCallsData = [ httpReq: { data: { contactTag: { contact: '2', tag: '5' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1143,7 +1145,7 @@ export const networkCallsData = [ httpReq: { data: { contactTag: { contact: '2', tag: 6 } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1168,7 +1170,7 @@ export const networkCallsData = [ httpReq: { data: { contactTag: { contact: '2', tag: 7 } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1193,7 +1195,7 @@ export const networkCallsData = [ httpReq: { data: { contactList: { contact: '2', list: 2, status: '1' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1207,7 +1209,7 @@ export const networkCallsData = [ httpReq: { data: { contactList: { contact: '2', list: 3, status: '2' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1219,7 +1221,7 @@ export const networkCallsData = [ }, { httpReq: { - headers: { Accept: 'application/json, text/plain, */*', 'Api-Token': 'dummyApiKey' }, + headers: { Accept: 'application/json, text/plain, */*', 'Api-Token': defaultApiKey }, method: 'GET', @@ -1354,7 +1356,7 @@ export const networkCallsData = [ { httpReq: { headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1375,7 +1377,7 @@ export const networkCallsData = [ httpReq: { data: { eventTrackingEvent: { name: 'ScreenViewed' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1387,7 +1389,7 @@ export const networkCallsData = [ }, { httpReq: { - headers: { 'Api-Token': 'dummyApiKey', Accept: 'application/json, text/plain, */*' }, + headers: { 'Api-Token': defaultApiKey, Accept: 'application/json, text/plain, */*' }, method: 'GET', @@ -1405,7 +1407,7 @@ export const networkCallsData = [ httpReq: { data: { eventTrackingEvent: { name: 'Tracking Action' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1419,7 +1421,7 @@ export const networkCallsData = [ httpReq: { data: { contact: { email: 'jamesDoe@gmail.com', phone: '92374162212' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1491,7 +1493,7 @@ export const networkCallsData = [ { httpReq: { headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1568,7 +1570,7 @@ export const networkCallsData = [ httpReq: { data: { tag: { description: '', tag: 'Test_User', tagType: 'contact' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1649,7 +1651,7 @@ export const networkCallsData = [ httpReq: { data: { tag: { description: '', tag: 'Interested_User', tagType: 'contact' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1730,7 +1732,7 @@ export const networkCallsData = [ httpReq: { data: { contactTag: { contact: '2', tag: '5' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1755,7 +1757,7 @@ export const networkCallsData = [ httpReq: { data: { contactTag: { contact: '2', tag: 11 } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1780,7 +1782,7 @@ export const networkCallsData = [ httpReq: { data: { contactTag: { contact: '2', tag: 12 } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1805,7 +1807,7 @@ export const networkCallsData = [ httpReq: { data: { contactList: { contact: '2', list: 2, status: '1' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1819,7 +1821,7 @@ export const networkCallsData = [ httpReq: { data: { contactList: { contact: '2', list: 3, status: '2' } }, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, @@ -1831,7 +1833,7 @@ export const networkCallsData = [ }, { httpReq: { - headers: { Accept: 'application/json, text/plain, */*', 'Api-Token': 'dummyApiKey' }, + headers: { Accept: 'application/json, text/plain, */*', 'Api-Token': defaultApiKey }, method: 'GET', diff --git a/test/integrations/destinations/active_campaign/processor/data.ts b/test/integrations/destinations/active_campaign/processor/data.ts index cef8c2a3a80..06393dfe43f 100644 --- a/test/integrations/destinations/active_campaign/processor/data.ts +++ b/test/integrations/destinations/active_campaign/processor/data.ts @@ -1,25 +1,64 @@ +/** + * Auto-migrated and optimized test cases + * Generated on: 2024-12-10T06:45:10.187Z + */ + +import { ProcessorTestData } from '../../../testTypes'; +import { Metadata } from '../../../../../src/types'; import MockAdapter from 'axios-mock-adapter'; import { isMatch } from 'lodash'; +import { defaultApiKey } from '../../../common/secrets'; + +const baseMetadata: Partial = { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-10T06:45:09.572Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, +}; -export const data = [ +export const data: ProcessorTestData[] = [ { + id: 'processor-1733813110185', name: 'active_campaign', - description: 'Test 0', + description: 'Test 0: Indetify scenario which tests the happy path of creating a contact', + scenario: + 'The contact is created successfully with all the fields info , a test tag is also added and the contact is subscribe to to list 2 and unsubscribed from list 3 and an invalid operation is performed on list 3', + successCriteria: 'Processor test should pass successfully, and the contact should be created', feature: 'processor', module: 'destination', version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - Config: { - apiKey: 'dummyApiKey', - apiUrl: 'https://active.campaigns.rudder.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, message: { channel: 'web', messageId: '84e26acc-56a5-4835-8233-591137fca468', @@ -42,9 +81,18 @@ export const data = [ Random: 'random', }, lists: [ - { id: 2, status: 'subscribe' }, - { id: 3, status: 'unsubscribe' }, - { id: 3, status: 'unsubscribexyz' }, + { + id: 2, + status: 'subscribe', + }, + { + id: 3, + status: 'unsubscribe', + }, + { + id: 3, + status: 'unsubscribexyz', + }, ], address: { city: 'kolkata', @@ -54,12 +102,36 @@ export const data = [ street: '', }, }, - integrations: { All: true }, + integrations: { + All: true, + }, sentAt: '2019-10-14T09:03:22.563Z', }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: defaultApiKey, + apiUrl: 'https://active.campaigns.rudder.com', + actid: '476550467', + eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], - method: 'POST', }, }, output: { @@ -74,7 +146,7 @@ export const data = [ endpoint: 'https://active.campaigns.rudder.com/api/3/contact/sync', headers: { 'Content-Type': 'application/json', - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, }, params: {}, body: { @@ -85,10 +157,22 @@ export const data = [ firstName: 'James', lastName: 'Doe', fieldValues: [ - { field: '0', value: 'Trastkiv' }, - { field: '1', value: 'Russia' }, - { field: '3', value: '||Potato||Onion||' }, - { field: '4', value: 'random' }, + { + field: '0', + value: 'Trastkiv', + }, + { + field: '1', + value: 'Russia', + }, + { + field: '3', + value: '||Potato||Onion||', + }, + { + field: '4', + value: 'random', + }, ], }, }, @@ -99,6 +183,7 @@ export const data = [ files: {}, userId: '', }, + metadata: baseMetadata, statusCode: 200, }, ], @@ -106,23 +191,21 @@ export const data = [ }, }, { + id: 'processor-1733813110186', name: 'active_campaign', - description: 'Test 0', + description: + 'Test 1: Identify scenario which tests the happy path of creating a contact with multiple tags', + scenario: + 'Identify scenario which tests the happy path of creating a contact with all fields info and multiple tags and the contact is subscribed to list 2 and unsubscribed from list 3 and an invalid operation is performed on list 3', + successCriteria: 'Processor test should pass successfully', feature: 'processor', module: 'destination', version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - Config: { - apiKey: 'dummyApiKey', - apiUrl: 'https://active.campaigns.rudder.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, message: { channel: 'web', messageId: '84e26acc-56a5-4835-8233-591137fca468', @@ -145,9 +228,18 @@ export const data = [ Random: 'random', }, lists: [ - { id: 2, status: 'subscribe' }, - { id: 3, status: 'unsubscribe' }, - { id: 3, status: 'unsubscribexyz' }, + { + id: 2, + status: 'subscribe', + }, + { + id: 3, + status: 'unsubscribe', + }, + { + id: 3, + status: 'unsubscribexyz', + }, ], address: { city: 'kolkata', @@ -157,12 +249,36 @@ export const data = [ street: '', }, }, - integrations: { All: true }, + integrations: { + All: true, + }, sentAt: '2019-10-14T09:03:22.563Z', }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: defaultApiKey, + apiUrl: 'https://active.campaigns.rudder.com', + actid: '476550467', + eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], - method: 'POST', }, }, output: { @@ -177,7 +293,7 @@ export const data = [ endpoint: 'https://active.campaigns.rudder.com/api/3/contact/sync', headers: { 'Content-Type': 'application/json', - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, }, params: {}, body: { @@ -188,10 +304,22 @@ export const data = [ firstName: 'James', lastName: 'Doe', fieldValues: [ - { field: '0', value: 'Trastkiv' }, - { field: '1', value: 'Russia' }, - { field: '3', value: '||Potato||Onion||' }, - { field: '4', value: 'random' }, + { + field: '0', + value: 'Trastkiv', + }, + { + field: '1', + value: 'Russia', + }, + { + field: '3', + value: '||Potato||Onion||', + }, + { + field: '4', + value: 'random', + }, ], }, }, @@ -202,6 +330,7 @@ export const data = [ files: {}, userId: '', }, + metadata: baseMetadata, statusCode: 200, }, ], @@ -209,128 +338,49 @@ export const data = [ }, }, { + id: 'processor-1733813110186', name: 'active_campaign', - description: 'Test 1', + description: 'Test 2: Page scenario which tests the happy path of tracking a page view', + scenario: 'Scenario which tests the happy path of tracking a page view', + successCriteria: 'Processor test should pass successfully', feature: 'processor', module: 'destination', version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - Config: { - apiKey: 'dummyApiKey', - apiUrl: 'https://active.campaigns.rudder.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, message: { channel: 'web', context: { - page: { referring_domain: 'https://www.rudderlabs.com' }, + page: { + referring_domain: 'https://www.rudderlabs.com', + }, app: { build: '1.0.0', name: 'RudderLabs JavaScript SDK', namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - traits: { email: 'jamesDoe@gmail.com', anonymousId: '12345' }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', - locale: 'en-US', - os: { name: '', version: '' }, - screen: { density: 2 }, - }, - request_ip: '1.1.1.1', - type: 'page', - messageId: '5e10d13a-bf9a-44bf-b884-43a9e591ea71', - session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', - originalTimestamp: '2019-10-14T11:15:18.299Z', - anonymousId: '00000000000000000000000000', - userId: '12345', - properties: { - name: 'ApplicationLoaded', - path: '/test', - referrer: 'Rudder', - search: 'abc', - title: 'Test Page', - url: 'https://www.rudderlabs.com', - }, - integrations: { All: true }, - sentAt: '2019-10-14T11:15:53.296Z', - }, - }, - ], - method: 'POST', - }, - }, - output: { - response: { - status: 200, - body: [ - { - output: { - body: { - XML: {}, - FORM: {}, - JSON_ARRAY: {}, - JSON: { siteTrackingDomain: { name: 'rudderlabs.com' } }, - }, - type: 'REST', - files: {}, - method: 'POST', - params: {}, - headers: { - 'Api-Token': 'dummyApiKey', - 'Content-Type': 'application/json', - }, - version: '1', - endpoint: 'https://active.campaigns.rudder.com/api/3/siteTrackingDomains', - userId: '', - }, - statusCode: 200, - }, - ], - }, - }, - }, - { - name: 'active_campaign', - description: 'Test 2', - feature: 'processor', - module: 'destination', - version: 'v0', - input: { - request: { - body: [ - { - destination: { - Config: { - apiKey: 'dummyApiKey', - apiUrl: 'https://active.campaigns.rudder.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, - message: { - channel: 'web', - context: { - app: { - build: '1.0.0', + traits: { + email: 'jamesDoe@gmail.com', + anonymousId: '12345', + }, + library: { name: 'RudderLabs JavaScript SDK', - namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - traits: { email: 'jamesDoe@gmail.com', anonymousId: '12345' }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', locale: 'en-US', - os: { name: '', version: '' }, - screen: { density: 2 }, + os: { + name: '', + version: '', + }, + screen: { + density: 2, + }, }, request_ip: '1.1.1.1', type: 'page', @@ -347,101 +397,36 @@ export const data = [ title: 'Test Page', url: 'https://www.rudderlabs.com', }, - integrations: { All: true }, - sentAt: '2019-10-14T11:15:53.296Z', - }, - }, - ], - method: 'POST', - }, - }, - output: { - response: { - status: 200, - body: [ - { - output: { - body: { - XML: {}, - FORM: {}, - JSON_ARRAY: {}, - JSON: { siteTrackingDomain: { name: 'rudderlabs.com' } }, - }, - type: 'REST', - files: {}, - method: 'POST', - params: {}, - headers: { - 'Api-Token': 'dummyApiKey', - 'Content-Type': 'application/json', + integrations: { + All: true, }, - version: '1', - endpoint: 'https://active.campaigns.rudder.com/api/3/siteTrackingDomains', - userId: '', + sentAt: '2019-10-14T11:15:53.296Z', }, - statusCode: 200, - }, - ], - }, - }, - }, - { - name: 'active_campaign', - description: 'Test 3', - feature: 'processor', - module: 'destination', - version: 'v0', - input: { - request: { - body: [ - { + metadata: baseMetadata, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, apiUrl: 'https://active.campaigns.rudder.com', actid: '476550467', eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', }, - }, - message: { - channel: 'web', - context: { - app: { - build: '1.0.0', - name: 'RudderLabs JavaScript SDK', - namespace: 'com.rudderlabs.javascript', - version: '1.0.0', - }, - traits: { email: 'jamesDoe@gmail.com', anonymousId: '12345' }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', - locale: 'en-US', - os: { name: '', version: '' }, - screen: { density: 2 }, - }, - request_ip: '1.1.1.1', - type: 'page', - messageId: '5e10d13a-bf9a-44bf-b884-43a9e591ea71', - session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', - originalTimestamp: '2019-10-14T11:15:18.299Z', - anonymousId: '00000000000000000000000000', - userId: '12345', - properties: { - name: 'ApplicationLoaded', - path: '/test', - referrer: 'Rudder', - referring_domain: 'https://www.rudderlabs.com', - search: 'abc', - title: 'Test Page', - url: 'https://www.rudderlabs.com', - }, - integrations: { All: true }, - sentAt: '2019-10-14T11:15:53.296Z', + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, ], - method: 'POST', }, }, output: { @@ -454,20 +439,25 @@ export const data = [ XML: {}, FORM: {}, JSON_ARRAY: {}, - JSON: { siteTrackingDomain: { name: 'rudderlabs.com' } }, + JSON: { + siteTrackingDomain: { + name: 'rudderlabs.com', + }, + }, }, type: 'REST', files: {}, method: 'POST', params: {}, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, version: '1', endpoint: 'https://active.campaigns.rudder.com/api/3/siteTrackingDomains', userId: '', }, + metadata: baseMetadata, statusCode: 200, }, ], @@ -475,23 +465,21 @@ export const data = [ }, }, { + id: 'processor-1733813110186', name: 'active_campaign', - description: 'Test 4', + description: + 'Test 3: Screen event scenario which tests the happy path of tracking a screen view', + scenario: + 'Screen event scenario which tests the happy path of tracking a screen viewn the email field is passed in the visit field for the destination and the properties name is passed in the eventdata field the event is ScreenViewed', + successCriteria: 'Processor test should pass successfully', feature: 'processor', module: 'destination', version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - Config: { - apiKey: 'dummyApiKey', - apiUrl: 'https://active.campaigns.rudder.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, message: { channel: 'web', context: { @@ -501,13 +489,24 @@ export const data = [ namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - traits: { email: 'jamesDoe@gmail.com', anonymousId: '12345' }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + traits: { + email: 'jamesDoe@gmail.com', + anonymousId: '12345', + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', locale: 'en-US', - os: { name: '', version: '' }, - screen: { density: 2 }, + os: { + name: '', + version: '', + }, + screen: { + density: 2, + }, }, request_ip: '1.1.1.1', type: 'screen', @@ -525,12 +524,36 @@ export const data = [ name: 'Rudder_Event_Screen_Test', }, event: 'ScreenViewed', - integrations: { All: true }, + integrations: { + All: true, + }, sentAt: '2019-10-14T11:15:53.296Z', }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: defaultApiKey, + apiUrl: 'https://active.campaigns.rudder.com', + actid: '476550467', + eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], - method: 'POST', }, }, output: { @@ -556,13 +579,14 @@ export const data = [ method: 'POST', params: {}, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/x-www-form-urlencoded', }, version: '1', endpoint: 'https://trackcmp.net/event', userId: '', }, + metadata: baseMetadata, statusCode: 200, }, ], @@ -570,23 +594,20 @@ export const data = [ }, }, { + id: 'processor-1733813110186', name: 'active_campaign', - description: 'Test 5', + description: 'Test 4: Track event scenario which tests the happy path of tracking an event', + scenario: + 'Track event scenraio where the event name is Tracking Action and the properties name is Rudder_Event_Track_Test', + successCriteria: 'Processor test should pass successfully', feature: 'processor', module: 'destination', version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - Config: { - apiKey: 'dummyApiKey', - apiUrl: 'https://active.campaigns.rudder.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, message: { anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', context: { @@ -596,26 +617,60 @@ export const data = [ model: 'Redmi 6', name: 'xiaomi', }, - network: { carrier: 'Banglalink' }, - os: { name: 'android', version: '8.1.0' }, + network: { + carrier: 'Banglalink', + }, + os: { + name: 'android', + version: '8.1.0', + }, traits: { email: 'jamesDoe@gmail.com', - address: { city: 'Dhaka', country: 'Bangladesh' }, + address: { + city: 'Dhaka', + country: 'Bangladesh', + }, anonymousId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', }, }, event: 'Tracking Action', - integrations: { All: true }, + integrations: { + All: true, + }, message_id: 'a80f82be-9bdc-4a9f-b2a5-15621ee41df8', - properties: { name: 'Rudder_Event_Track_Test' }, + properties: { + name: 'Rudder_Event_Track_Test', + }, userId: 'test_user_id', timestamp: '2019-09-01T15:46:51.693Z', originalTimestamp: '2019-09-01T15:46:51.693Z', type: 'track', }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: defaultApiKey, + apiUrl: 'https://active.campaigns.rudder.com', + actid: '476550467', + eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], - method: 'POST', }, }, output: { @@ -641,13 +696,14 @@ export const data = [ method: 'POST', params: {}, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/x-www-form-urlencoded', }, version: '1', endpoint: 'https://trackcmp.net/event', userId: '', }, + metadata: baseMetadata, statusCode: 200, }, ], @@ -655,23 +711,20 @@ export const data = [ }, }, { + id: 'processor-1733813110186', name: 'active_campaign', - description: 'Test 6', + description: + 'Test 5: Identify scenario which tests the happy path of creating/updating a contact with all fields info', + scenario: 'Scneario is exactly same as Test 0', + successCriteria: 'Processor test should pass successfully', feature: 'processor', module: 'destination', version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - Config: { - apiKey: 'dummyApiKey', - apiUrl: 'https://active.campaigns.rudder.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, message: { channel: 'web', context: { @@ -681,13 +734,21 @@ export const data = [ namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', locale: 'en-US', ip: '0.0.0.0', - os: { name: '', version: '' }, - screen: { density: 2 }, + os: { + name: '', + version: '', + }, + screen: { + density: 2, + }, }, messageId: '84e26acc-56a5-4835-8233-591137fca468', session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', @@ -707,9 +768,18 @@ export const data = [ Random: 'random', }, lists: [ - { id: 2, status: 'subscribe' }, - { id: 3, status: 'unsubscribe' }, - { id: 3, status: 'unsubscribexyz' }, + { + id: 2, + status: 'subscribe', + }, + { + id: 3, + status: 'unsubscribe', + }, + { + id: 3, + status: 'unsubscribexyz', + }, ], address: { city: 'kolkata', @@ -719,12 +789,36 @@ export const data = [ street: '', }, }, - integrations: { All: true }, + integrations: { + All: true, + }, sentAt: '2019-10-14T09:03:22.563Z', }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: defaultApiKey, + apiUrl: 'https://active.campaigns.rudder.com', + actid: '476550467', + eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], - method: 'POST', }, }, output: { @@ -742,10 +836,22 @@ export const data = [ email: 'jamesDoe@gmail.com', phone: '92374162212', fieldValues: [ - { field: '0', value: 'Trastkiv' }, - { field: '1', value: 'Russia' }, - { field: '3', value: '||Potato||Onion||' }, - { field: '4', value: 'random' }, + { + field: '0', + value: 'Trastkiv', + }, + { + field: '1', + value: 'Russia', + }, + { + field: '3', + value: '||Potato||Onion||', + }, + { + field: '4', + value: 'random', + }, ], }, }, @@ -755,39 +861,36 @@ export const data = [ method: 'POST', params: {}, headers: { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }, version: '1', endpoint: 'https://active.campaigns.rudder.com/api/3/contact/sync', userId: '', }, + metadata: baseMetadata, statusCode: 200, }, ], }, }, }, - { + id: 'processor-1733813110186', name: 'active_campaign', description: - 'Test 7: node error(ECONNABORTED) where there is no response coming from dest. server', + 'Test 6: node error(ECONNABORTED) where there is no response coming from dest. server', + scenario: + 'Scenario which tests the failure case where there is no response from the destination server', + successCriteria: 'Processor test should pass successfully', feature: 'processor', module: 'destination', version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - Config: { - apiKey: 'dummyApiKey', - apiUrl: 'https://active.campaigns.dumber.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, message: { channel: 'web', context: { @@ -797,13 +900,21 @@ export const data = [ namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', locale: 'en-US', ip: '0.0.0.0', - os: { name: '', version: '' }, - screen: { density: 2 }, + os: { + name: '', + version: '', + }, + screen: { + density: 2, + }, }, messageId: '84e26acc-56a5-4835-8233-591137fca468', session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', @@ -823,9 +934,18 @@ export const data = [ Random: 'random', }, lists: [ - { id: 2, status: 'subscribe' }, - { id: 3, status: 'unsubscribe' }, - { id: 3, status: 'unsubscribexyz' }, + { + id: 2, + status: 'subscribe', + }, + { + id: 3, + status: 'unsubscribe', + }, + { + id: 3, + status: 'unsubscribexyz', + }, ], address: { city: 'kolkata', @@ -835,12 +955,36 @@ export const data = [ street: '', }, }, - integrations: { All: true }, + integrations: { + All: true, + }, sentAt: '2019-10-14T09:03:22.563Z', }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: defaultApiKey, + apiUrl: 'https://active.campaigns.dumber.com', + actid: '476550467', + eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], - method: 'POST', }, }, output: { @@ -848,17 +992,20 @@ export const data = [ status: 200, body: [ { + metadata: baseMetadata, + statusCode: 500, error: '{"message":"Failed to create new contact (undefined,\\"[ECONNABORTED] :: Connection aborted\\")","destinationResponse":"[ECONNABORTED] :: Connection aborted"}', statTags: { destType: 'ACTIVE_CAMPAIGN', + destinationId: 'default-destination', errorCategory: 'network', errorType: 'retryable', feature: 'processor', implementation: 'native', module: 'destination', + workspaceId: 'default-workspace', }, - statusCode: 500, }, ], }, @@ -880,7 +1027,7 @@ export const data = [ { asymmetricMatch: (actual) => { return isMatch(actual, { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }); }, @@ -890,23 +1037,20 @@ export const data = [ }, }, { + id: 'processor-1733813110186', name: 'active_campaign', - description: 'Test 8: erreneous response from active_campaign server(5xx)', + description: 'Test 7: erreneous response from active_campaign server(5xx)', + scenario: + 'Scenario which tests the failure case where the destination server returns a 5xx error', + successCriteria: 'Processor test should pass successfully', feature: 'processor', module: 'destination', version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - Config: { - apiKey: 'dummyApiKey', - apiUrl: 'https://active.campaigns.dumber2.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, message: { channel: 'web', context: { @@ -916,13 +1060,21 @@ export const data = [ namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', locale: 'en-US', ip: '0.0.0.0', - os: { name: '', version: '' }, - screen: { density: 2 }, + os: { + name: '', + version: '', + }, + screen: { + density: 2, + }, }, messageId: '84e26acc-56a5-4835-8233-591137fca468', session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', @@ -942,9 +1094,18 @@ export const data = [ Random: 'random', }, lists: [ - { id: 2, status: 'subscribe' }, - { id: 3, status: 'unsubscribe' }, - { id: 3, status: 'unsubscribexyz' }, + { + id: 2, + status: 'subscribe', + }, + { + id: 3, + status: 'unsubscribe', + }, + { + id: 3, + status: 'unsubscribexyz', + }, ], address: { city: 'kolkata', @@ -954,12 +1115,36 @@ export const data = [ street: '', }, }, - integrations: { All: true }, + integrations: { + All: true, + }, sentAt: '2019-10-14T09:03:22.563Z', }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: defaultApiKey, + apiUrl: 'https://active.campaigns.dumber2.com', + actid: '476550467', + eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], - method: 'POST', }, }, output: { @@ -967,17 +1152,20 @@ export const data = [ status: 200, body: [ { + metadata: baseMetadata, + statusCode: 504, error: '{"message":"Failed to create new contact (undefined,\\"\\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\\\n \\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\\\naccurx.api-us1.com | 504: Gateway time-out\\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\\\n
\\\\\\\\n
\\\\\\\\n
\\\\\\\\n

\\\\\\\\n Gateway time-out\\\\\\\\n Error code 504\\\\\\\\n

\\\\\\\\n
\\\\\\\\n Visit cloudflare.com for more information.\\\\\\\\n
\\\\\\\\n
2023-12-06 10:33:27 UTC
\\\\\\\\n
\\\\\\\\n
\\\\\\\\n
\\\\\\\\n
\\\\\\\\n \\\\\\\\n
\\\\\\\\n
\\\\\\\\n \\\\\\\\n \\\\\\\\n \\\\\\\\n \\\\\\\\n
\\\\\\\\n You\\\\\\\\n

\\\\\\\\n \\\\\\\\n Browser\\\\\\\\n \\\\\\\\n

\\\\\\\\n Working\\\\\\\\n
\\\\\\\\n\\\\\\\\n
\\\\\\\\n
\\\\\\\\n \\\\\\\\n \\\\\\\\n \\\\\\\\n \\\\\\\\n
\\\\\\\\n Frankfurt\\\\\\\\n

\\\\\\\\n \\\\\\\\n Cloudflare\\\\\\\\n \\\\\\\\n

\\\\\\\\n Working\\\\\\\\n
\\\\\\\\n\\\\\\\\n
\\\\\\\\n
\\\\\\\\n \\\\\\\\n \\\\\\\\n \\\\\\\\n \\\\\\\\n
\\\\\\\\n accurx.api-us1.com\\\\\\\\n

\\\\\\\\n \\\\\\\\n Host\\\\\\\\n \\\\\\\\n

\\\\\\\\n Error\\\\\\\\n
\\\\\\\\n\\\\\\\\n
\\\\\\\\n
\\\\\\\\n
\\\\\\\\n\\\\\\\\n
\\\\\\\\n
\\\\\\\\n
\\\\\\\\n

What happened?

\\\\\\\\n

The web server reported a gateway time-out error.

\\\\\\\\n
\\\\\\\\n
\\\\\\\\n

What can I do?

\\\\\\\\n

Please try again in a few minutes.

\\\\\\\\n
\\\\\\\\n
\\\\\\\\n
\\\\\\\\n\\\\\\\\n \\\\\\\\n\\\\\\\\n\\\\\\\\n
\\\\\\\\n
\\\\\\\\n\\\\\\\\n\\\\\\\\n\\\\\\")\\")","destinationResponse":"\\\\n\\\\n\\\\n\\\\n \\\\n\\\\n\\\\n\\\\naccurx.api-us1.com | 504: Gateway time-out\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n\\\\n
\\\\n
\\\\n
\\\\n

\\\\n Gateway time-out\\\\n Error code 504\\\\n

\\\\n
\\\\n Visit cloudflare.com for more information.\\\\n
\\\\n
2023-12-06 10:33:27 UTC
\\\\n
\\\\n
\\\\n
\\\\n
\\\\n \\\\n
\\\\n
\\\\n \\\\n \\\\n \\\\n \\\\n
\\\\n You\\\\n

\\\\n \\\\n Browser\\\\n \\\\n

\\\\n Working\\\\n
\\\\n\\\\n
\\\\n
\\\\n \\\\n \\\\n \\\\n \\\\n
\\\\n Frankfurt\\\\n

\\\\n \\\\n Cloudflare\\\\n \\\\n

\\\\n Working\\\\n
\\\\n\\\\n
\\\\n
\\\\n \\\\n \\\\n \\\\n \\\\n
\\\\n accurx.api-us1.com\\\\n

\\\\n \\\\n Host\\\\n \\\\n

\\\\n Error\\\\n
\\\\n\\\\n
\\\\n
\\\\n
\\\\n\\\\n
\\\\n
\\\\n
\\\\n

What happened?

\\\\n

The web server reported a gateway time-out error.

\\\\n
\\\\n
\\\\n

What can I do?

\\\\n

Please try again in a few minutes.

\\\\n
\\\\n
\\\\n
\\\\n\\\\n \\\\n\\\\n\\\\n
\\\\n
\\\\n\\\\n\\\\n\\")"}', statTags: { destType: 'ACTIVE_CAMPAIGN', + destinationId: 'default-destination', errorCategory: 'network', errorType: 'retryable', feature: 'processor', implementation: 'native', module: 'destination', + workspaceId: 'default-workspace', }, - statusCode: 504, }, ], }, @@ -999,7 +1187,7 @@ export const data = [ { asymmetricMatch: (actual) => { return isMatch(actual, { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }); }, @@ -1010,29 +1198,25 @@ export const data = [ '\\n\\n\\n\\n \\n\\n\\n\\naccurx.api-us1.com | 504: Gateway time-out\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\n
\\n
\\n

\\n Gateway time-out\\n Error code 504\\n

\\n
\\n Visit cloudflare.com for more information.\\n
\\n
2023-12-06 10:33:27 UTC
\\n
\\n
\\n
\\n
\\n \\n
\\n
\\n \\n \\n \\n \\n
\\n You\\n

\\n \\n Browser\\n \\n

\\n Working\\n
\\n\\n
\\n
\\n \\n \\n \\n \\n
\\n Frankfurt\\n

\\n \\n Cloudflare\\n \\n

\\n Working\\n
\\n\\n
\\n
\\n \\n \\n \\n \\n
\\n accurx.api-us1.com\\n

\\n \\n Host\\n \\n

\\n Error\\n
\\n\\n
\\n
\\n
\\n\\n
\\n
\\n
\\n

What happened?

\\n

The web server reported a gateway time-out error.

\\n
\\n
\\n

What can I do?

\\n

Please try again in a few minutes.

\\n
\\n
\\n
\\n\\n \\n\\n\\n
\\n
\\n\\n\\n")', { Accept: 'application/json, text/plain, */*', - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, }, ); }, }, { + id: 'processor-1733813110186', name: 'active_campaign', - description: 'Test 9: erreneous response from active_campaign server(4xx)', + description: 'Test 8: erreneous response from active_campaign server(4xx)', + scenario: 'Scenrio which tests the processor when the active_campaign server returns 4xx error', + successCriteria: 'Processor test should pass successfully', feature: 'processor', module: 'destination', version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - Config: { - apiKey: 'dummyApiKey', - apiUrl: 'https://active.campaigns.dumber2.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, message: { channel: 'web', context: { @@ -1042,13 +1226,21 @@ export const data = [ namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', locale: 'en-US', ip: '0.0.0.0', - os: { name: '', version: '' }, - screen: { density: 2 }, + os: { + name: '', + version: '', + }, + screen: { + density: 2, + }, }, messageId: '84e26acc-56a5-4835-8233-591137fca468', session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', @@ -1068,9 +1260,18 @@ export const data = [ Random: 'random', }, lists: [ - { id: 2, status: 'subscribe' }, - { id: 3, status: 'unsubscribe' }, - { id: 3, status: 'unsubscribexyz' }, + { + id: 2, + status: 'subscribe', + }, + { + id: 3, + status: 'unsubscribe', + }, + { + id: 3, + status: 'unsubscribexyz', + }, ], address: { city: 'kolkata', @@ -1080,12 +1281,36 @@ export const data = [ street: '', }, }, - integrations: { All: true }, + integrations: { + All: true, + }, sentAt: '2019-10-14T09:03:22.563Z', }, + metadata: baseMetadata, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: defaultApiKey, + apiUrl: 'https://active.campaigns.dumber2.com', + actid: '476550467', + eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], - method: 'POST', }, }, output: { @@ -1093,17 +1318,20 @@ export const data = [ status: 200, body: [ { + metadata: baseMetadata, + statusCode: 422, error: '{"message":"Failed to create new contact (undefined,{\\"errors\\":[{\\"title\\":\\"Contact Email Address is not valid.\\",\\"detail\\":\\"\\",\\"code\\":\\"email_invalid\\",\\"error\\":\\"must_be_valid_email_address\\",\\"source\\":{\\"pointer\\":\\"/data/attributes/email\\"}}]})","destinationResponse":{"errors":[{"title":"Contact Email Address is not valid.","detail":"","code":"email_invalid","error":"must_be_valid_email_address","source":{"pointer":"/data/attributes/email"}}]}}', statTags: { destType: 'ACTIVE_CAMPAIGN', + destinationId: 'default-destination', errorCategory: 'network', errorType: 'aborted', feature: 'processor', implementation: 'native', module: 'destination', + workspaceId: 'default-workspace', }, - statusCode: 422, }, ], }, @@ -1125,7 +1353,7 @@ export const data = [ { asymmetricMatch: (actual) => { return isMatch(actual, { - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, 'Content-Type': 'application/json', }); }, @@ -1148,7 +1376,7 @@ export const data = [ }, { Accept: 'application/json, text/plain, */*', - 'Api-Token': 'dummyApiKey', + 'Api-Token': defaultApiKey, }, ); }, diff --git a/test/integrations/destinations/active_campaign/router/data.ts b/test/integrations/destinations/active_campaign/router/data.ts index a73140c161c..148e330b189 100644 --- a/test/integrations/destinations/active_campaign/router/data.ts +++ b/test/integrations/destinations/active_campaign/router/data.ts @@ -1,7 +1,18 @@ -export const data = [ +/** + * Auto-migrated and optimized test cases + * Generated on: 2024-12-06T12:28:59.200Z + */ + +import { RouterTestData } from '../../../testTypes'; +import {} from '../../../../../src/types'; + +export const data: RouterTestData[] = [ { + id: 'router-1733488139199', name: 'active_campaign', - description: 'Test 0', + description: 'Test 0: Successful identify event', + scenario: 'Scenario which tests for a successful identify event', + successCriteria: 'Router test should pass successfully', feature: 'router', module: 'destination', version: 'v0', @@ -10,15 +21,6 @@ export const data = [ body: { input: [ { - destination: { - Config: { - apiKey: 'dummyApiToken', - apiUrl: 'https://active.campaigns.rudder.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, - metadata: { jobId: 2, userId: 'u1' }, message: { channel: 'web', context: { @@ -28,13 +30,21 @@ export const data = [ namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', locale: 'en-US', ip: '0.0.0.0', - os: { name: '', version: '' }, - screen: { density: 2 }, + os: { + name: '', + version: '', + }, + screen: { + density: 2, + }, }, messageId: '84e26acc-56a5-4835-8233-591137fca468', session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', @@ -56,9 +66,18 @@ export const data = [ Random: 'random', }, lists: [ - { id: 2, status: 'subscribe' }, - { id: 3, status: 'unsubscribe' }, - { id: 3, status: 'unsubscribexyz' }, + { + id: 2, + status: 'subscribe', + }, + { + id: 3, + status: 'unsubscribe', + }, + { + id: 3, + status: 'unsubscribexyz', + }, ], address: { city: 'kolkata', @@ -68,9 +87,66 @@ export const data = [ street: '', }, }, - integrations: { All: true }, + integrations: { + All: true, + }, sentAt: '2019-10-14T09:03:22.563Z', }, + metadata: { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 2, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: 'dummyApiToken', + apiUrl: 'https://active.campaigns.rudder.com', + actid: '476550467', + eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], destType: 'active_campaign', @@ -96,10 +172,22 @@ export const data = [ lastName: 'Doe', phone: '92374162212', fieldValues: [ - { field: '0', value: 'Trastkiv' }, - { field: '1', value: 'Russia' }, - { field: '3', value: '||Potato||Onion||' }, - { field: '4', value: 'random' }, + { + field: '0', + value: 'Trastkiv', + }, + { + field: '1', + value: 'Russia', + }, + { + field: '3', + value: '||Potato||Onion||', + }, + { + field: '4', + value: 'random', + }, ], }, }, @@ -108,21 +196,72 @@ export const data = [ files: {}, method: 'POST', params: {}, - headers: { 'Api-Token': 'dummyApiToken', 'Content-Type': 'application/json' }, + headers: { + 'Api-Token': 'dummyApiToken', + 'Content-Type': 'application/json', + }, version: '1', endpoint: 'https://active.campaigns.rudder.com/api/3/contact/sync', }, - metadata: [{ jobId: 2, userId: 'u1' }], - batched: false, + metadata: [ + { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 2, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + ], statusCode: 200, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: 'dummyApiToken', apiUrl: 'https://active.campaigns.rudder.com', actid: '476550467', eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: false, }, ], }, @@ -130,8 +269,11 @@ export const data = [ }, }, { + id: 'router-1733488139199', name: 'active_campaign', - description: 'Test 1', + description: 'Test 1: Test case for a successful page event', + scenario: 'Scenario which tests for a successful page event', + successCriteria: 'Router test should pass successfully', feature: 'router', module: 'destination', version: 'v0', @@ -140,15 +282,6 @@ export const data = [ body: { input: [ { - destination: { - Config: { - apiKey: 'dummyApiToken', - apiUrl: 'https://active.campaigns.rudder.com', - actid: '476550467', - eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', - }, - }, - metadata: { jobId: 2, userId: 'u1' }, message: { channel: 'web', context: { @@ -158,13 +291,24 @@ export const data = [ namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - traits: { email: 'jamesDoe@gmail.com', anonymousId: '12345' }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + traits: { + email: 'jamesDoe@gmail.com', + anonymousId: '12345', + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', locale: 'en-US', - os: { name: '', version: '' }, - screen: { density: 2 }, + os: { + name: '', + version: '', + }, + screen: { + density: 2, + }, }, request_ip: '1.1.1.1', type: 'page', @@ -181,9 +325,66 @@ export const data = [ title: 'Test Page', url: 'https://www.rudderlabs.com', }, - integrations: { All: true }, + integrations: { + All: true, + }, sentAt: '2019-10-14T11:15:53.296Z', }, + metadata: { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 2, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: 'dummyApiToken', + apiUrl: 'https://active.campaigns.rudder.com', + actid: '476550467', + eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], destType: 'active_campaign', @@ -202,27 +403,82 @@ export const data = [ XML: {}, FORM: {}, JSON_ARRAY: {}, - JSON: { siteTrackingDomain: { name: 'rudderlabs.com' } }, + JSON: { + siteTrackingDomain: { + name: 'rudderlabs.com', + }, + }, }, type: 'REST', files: {}, method: 'POST', params: {}, - headers: { 'Api-Token': 'dummyApiToken', 'Content-Type': 'application/json' }, + headers: { + 'Api-Token': 'dummyApiToken', + 'Content-Type': 'application/json', + }, version: '1', endpoint: 'https://active.campaigns.rudder.com/api/3/siteTrackingDomains', }, - metadata: [{ jobId: 2, userId: 'u1' }], - batched: false, + metadata: [ + { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 2, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + ], statusCode: 200, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: 'dummyApiToken', apiUrl: 'https://active.campaigns.rudder.com', actid: '476550467', eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: false, }, ], }, @@ -230,8 +486,11 @@ export const data = [ }, }, { + id: 'router-1733488139199', name: 'active_campaign', - description: 'Test 2', + description: 'Test 2: Page event with invalid URL', + scenario: 'Scenario which tests for a page event with invalid URL', + successCriteria: 'Router test should pass successfully', feature: 'router', module: 'destination', version: 'v0', @@ -246,7 +505,10 @@ export const data = [ sentAt: '2023-01-10T22:31:10.954Z', channel: 'web', context: { - os: { name: '', version: '' }, + os: { + name: '', + version: '', + }, app: { name: 'RudderLabs JavaScript SDK', build: '1.0.0', @@ -273,7 +535,10 @@ export const data = [ innerHeight: 782, }, traits: {}, - library: { name: 'RudderLabs JavaScript SDK', version: '2.20.0' }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '2.20.0', + }, campaign: {}, sessionId: 1673389635049, userAgent: @@ -297,18 +562,66 @@ export const data = [ receivedAt: '2023-01-10T22:31:11.612Z', request_ip: '0.0.0.20', anonymousId: '878e8f5f-9b6c-4aef-b5d3-1b970a13f17a', - integrations: { All: true }, + integrations: { + All: true, + }, originalTimestamp: '2023-01-10T22:31:10.943Z', }, + metadata: { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 5, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: 'dummyApiToken', apiUrl: 'https://active.campaigns.rudder.com', actid: '476550467', eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: { jobId: 5, userId: 'u1' }, }, ], destType: 'active_campaign', @@ -322,25 +635,75 @@ export const data = [ body: { output: [ { - error: 'Invalid URL: url', - statTags: { - destType: 'ACTIVE_CAMPAIGN', - errorCategory: 'dataValidation', - errorType: 'instrumentation', - feature: 'router', - implementation: 'native', - module: 'destination', - }, + metadata: [ + { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 5, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-06T12:28:58.577Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + ], statusCode: 400, - metadata: [{ jobId: 5, userId: 'u1' }], - batched: false, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: 'dummyApiToken', apiUrl: 'https://active.campaigns.rudder.com', actid: '476550467', eventKey: 'f8a866fddc721350fdc2fbbd2e5c43a6dddaaa03', }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + batched: false, + error: 'Invalid URL: url', + statTags: { + destType: 'ACTIVE_CAMPAIGN', + destinationId: 'default-destination', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'router', + implementation: 'native', + module: 'destination', + workspaceId: 'default-workspace', }, }, ], diff --git a/test/integrations/destinations/adj/processor/data.ts b/test/integrations/destinations/adj/processor/data.ts index e28a25cf59d..310a644fa73 100644 --- a/test/integrations/destinations/adj/processor/data.ts +++ b/test/integrations/destinations/adj/processor/data.ts @@ -105,8 +105,14 @@ export const data = [ endpoint: 'https://s2s.adjust.com/event', headers: { Accept: '*/*' }, params: { - callback_params: - '{"key1":"value1","key2":"value2","key3.k4":"v4","key3.k5.k6":"v6","key5[0].k":"v1","key5[1].k":"v2"}', + callback_params: JSON.stringify({ + key1: 'value1', + key2: 'value2', + 'key3.k4': 'v4', + 'key3.k5.k6': 'v6', + 'key5[0].k': 'v1', + 'key5[1].k': 'v2', + }), revenue: 20.38, android_id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', gps_adid: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', @@ -462,8 +468,14 @@ export const data = [ endpoint: 'https://s2s.adjust.com/event', headers: { Accept: '*/*' }, params: { - callback_params: - '{"key1":"value1","key2":"value2","key3.k4":"v4","key3.k5.k6":"v6","key5[0].k":"v1","key5[1].k":"v2"}', + callback_params: JSON.stringify({ + key1: 'value1', + key2: 'value2', + 'key3.k4': 'v4', + 'key3.k5.k6': 'v6', + 'key5[0].k': 'v1', + 'key5[1].k': 'v2', + }), revenue: 20.38, idfv: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', idfa: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', @@ -933,8 +945,14 @@ export const data = [ endpoint: 'https://s2s.adjust.com/event', headers: { Accept: '*/*' }, params: { - callback_params: - '{"key1":"value1","key2":"value2","key3.k4":"v4","key3.k5.k6":"v6","key5[0].k":"v1","key5[1].k":"v2"}', + callback_params: JSON.stringify({ + key1: 'value1', + key2: 'value2', + 'key3.k4': 'v4', + 'key3.k5.k6': 'v6', + 'key5[0].k': 'v1', + 'key5[1].k': 'v2', + }), revenue: 20.38, android_id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', gps_adid: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', @@ -1062,8 +1080,14 @@ export const data = [ endpoint: 'https://s2s.adjust.com/event', headers: { Accept: '*/*' }, params: { - callback_params: - '{"key1":"value1","key2":"value2","key3.k4":"v4","key3.k5.k6":"v6","key5[0].k":"v1","key5[1].k":"v2"}', + callback_params: JSON.stringify({ + key1: 'value1', + key2: 'value2', + 'key3.k4': 'v4', + 'key3.k5.k6': 'v6', + 'key5[0].k': 'v1', + 'key5[1].k': 'v2', + }), revenue: 20.38, android_id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', gps_adid: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', @@ -1191,8 +1215,14 @@ export const data = [ endpoint: 'https://s2s.adjust.com/event', headers: { Accept: '*/*' }, params: { - callback_params: - '{"key1":"value1","key2":"value2","key3.k4":"v4","key3.k5.k6":"v6","key5[0].k":"v1","key5[1].k":"v2"}', + callback_params: JSON.stringify({ + key1: 'value1', + key2: 'value2', + 'key3.k4': 'v4', + 'key3.k5.k6': 'v6', + 'key5[0].k': 'v1', + 'key5[1].k': 'v2', + }), revenue: 20.37, android_id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', gps_adid: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', @@ -1433,8 +1463,14 @@ export const data = [ endpoint: 'https://s2s.adjust.com/event', headers: { Accept: '*/*' }, params: { - callback_params: - '{"key1":"value1","key2":"value2","key3.k4":"v4","key3.k5.k6":"v6","key5[0].k":"v1","key5[1].k":"v2"}', + callback_params: JSON.stringify({ + key1: 'value1', + key2: 'value2', + 'key3.k4': 'v4', + 'key3.k5.k6': 'v6', + 'key5[0].k': 'v1', + 'key5[1].k': 'v2', + }), revenue: 20.37, android_id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', gps_adid: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', @@ -1681,8 +1717,14 @@ export const data = [ endpoint: 'https://s2s.adjust.com/event', headers: { Accept: '*/*' }, params: { - callback_params: - '{"key1":"value1","key2":"value2","key3.k4":"v4","key3.k5.k6":"v6","key5[0].k":"v1","key5[1].k":"v2"}', + callback_params: JSON.stringify({ + key1: 'value1', + key2: 'value2', + 'key3.k4': 'v4', + 'key3.k5.k6': 'v6', + 'key5[0].k': 'v1', + 'key5[1].k': 'v2', + }), revenue: 20.38, idfv: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', idfa: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', @@ -2053,8 +2095,14 @@ export const data = [ endpoint: 'https://s2s.adjust.com/event', headers: { Accept: '*/*' }, params: { - callback_params: - '{"key1":"value1","key2":"value2","key3.k4":"v4","key3.k5.k6":"v6","key5[0].k":"v1","key5[1].k":"v2"}', + callback_params: JSON.stringify({ + key1: 'value1', + key2: 'value2', + 'key3.k4': 'v4', + 'key3.k5.k6': 'v6', + 'key5[0].k': 'v1', + 'key5[1].k': 'v2', + }), partner_params: { 'partnerParamKey-1': 'value1', 'partnerParamKey-2': 'value2', diff --git a/test/integrations/destinations/adj/router/data.ts b/test/integrations/destinations/adj/router/data.ts index 22c4e899d2f..c4d3670c8a8 100644 --- a/test/integrations/destinations/adj/router/data.ts +++ b/test/integrations/destinations/adj/router/data.ts @@ -110,8 +110,14 @@ export const data = [ endpoint: 'https://s2s.adjust.com/event', headers: { Accept: '*/*' }, params: { - callback_params: - '{"key1":"value1","key2":"value2","key3.k4":"v4","key3.k5.k6":"v6","key5[0].k":"v1","key5[1].k":"v2"}', + callback_params: JSON.stringify({ + key1: 'value1', + key2: 'value2', + 'key3.k4': 'v4', + 'key3.k5.k6': 'v6', + 'key5[0].k': 'v1', + 'key5[1].k': 'v2', + }), revenue: 20.38, android_id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', gps_adid: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', @@ -279,8 +285,14 @@ export const data = [ endpoint: 'https://s2s.adjust.com/event', headers: { Accept: '*/*' }, params: { - callback_params: - '{"key1":"value1","key2":"value2","key3.k4":"v4","key3.k5.k6":"v6","key5[0].k":"v1","key5[1].k":"v2"}', + callback_params: JSON.stringify({ + key1: 'value1', + key2: 'value2', + 'key3.k4': 'v4', + 'key3.k5.k6': 'v6', + 'key5[0].k': 'v1', + 'key5[1].k': 'v2', + }), revenue: 20.38, idfv: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', idfa: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', diff --git a/test/integrations/destinations/adobe_analytics/processor/data.ts b/test/integrations/destinations/adobe_analytics/processor/data.ts index fa050897c95..2ace5bed4b9 100644 --- a/test/integrations/destinations/adobe_analytics/processor/data.ts +++ b/test/integrations/destinations/adobe_analytics/processor/data.ts @@ -1412,7 +1412,7 @@ export const data = [ JSON_ARRAY: {}, XML: { payload: - '17941080sales campaignweb127.0.0.1en-USDalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)https://www.google.com/search?q=estore+bestsellerroottval001RudderLabs JavaScript SDK <Custom>TEDxGROWTH&MARKETINGoWatched Videohttps://www.estore.com/best-seller/1growth2020-01-09T10:01:53.558Zmktcloudid001event1footlockerrudderstackpoc', + '17941080sales campaignweb127.0.0.1en-USDalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)https://www.google.com/search?q=estore+bestsellerroottval001RudderLabs JavaScript SDK <Custom>TEDxGROWTH&MARKETINGoWatched Videohttps://www.estore.com/best-seller/1growth2020-01-09T10:01:53.558Zmktcloudid001event1footlockerrudderstackpoc', }, FORM: {}, }, @@ -1582,7 +1582,7 @@ export const data = [ JSON_ARRAY: {}, XML: { payload: - '17941080sales campaignweb127.0.0.1en-USDalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)https://www.google.com/search?q=estore+bestsellerroottval001Kolkata9935400932RudderLabs JavaScript SDKopage viewhttps://www.estore.com/best-seller/1r15,faze90Rciaz,hummer,tharcustompropval1custompropval22020-01-09T10:01:53.558Zmktcloudid001event2footlockerrudderstackpoc', + '17941080sales campaignweb127.0.0.1en-USDalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)https://www.google.com/search?q=estore+bestsellerroottval001Kolkata9935400932RudderLabs JavaScript SDKopage viewhttps://www.estore.com/best-seller/1r15,faze90Rciaz,hummer,tharcustompropval1custompropval22020-01-09T10:01:53.558Zmktcloudid001event2footlockerrudderstackpoc', }, FORM: {}, }, @@ -3044,7 +3044,7 @@ export const data = [ JSON_ARRAY: {}, XML: { payload: - '17941080sales campaignweb127.0.0.1en-USDalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)https://www.google.com/search?q=estore+bestsellerroottval001RudderLabs JavaScript SDKorandom unmapped eventhttps://www.estore.com/best-seller/12020-01-09T10:01:53.558Zmktcloudid001override eventfootlockerrudderstackpoc', + '17941080sales campaignweb127.0.0.1en-USDalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)https://www.google.com/search?q=estore+bestsellerroottval001RudderLabs JavaScript SDKorandom unmapped eventhttps://www.estore.com/best-seller/12020-01-09T10:01:53.558Zmktcloudid001override eventfootlockerrudderstackpoc', }, FORM: {}, }, diff --git a/test/integrations/destinations/af/deleteUsers/data.ts b/test/integrations/destinations/af/deleteUsers/data.ts index 608e7e55869..3309d0505e1 100644 --- a/test/integrations/destinations/af/deleteUsers/data.ts +++ b/test/integrations/destinations/af/deleteUsers/data.ts @@ -1,3 +1,4 @@ +import { secret1 } from '../maskedSecrets'; import { cloneDeep } from 'lodash'; import { FEATURES } from '../../../../../src/v0/util/tags'; import { networkCallsData } from '../network'; @@ -28,7 +29,7 @@ const requests = [ ], config: { devKey: 'ef1d42390426e3f7c90ac78272e74344', - apiToken: 'dummyApiToken', + apiToken: secret1, }, }, ], @@ -54,7 +55,7 @@ const requests = [ appleAppId: '123456789', statusCallbackUrls: 'https://examplecontroller.com/opengdpr_callbacks,https://examplecontroller.com/opengdpr_callbacks,https://examplecontroller.com/opengdpr_callbacks,https://examplecontroller.com/opengdpr_callbacks', - apiToken: 'dummyApiToken', + apiToken: secret1, }, }, ], @@ -82,7 +83,7 @@ const requests = [ groupValueTrait: 'age', trackProductsOnce: false, trackRevenuePerProduct: false, - apiToken: 'dummyApiToken', + apiToken: secret1, }, }, ], @@ -110,7 +111,7 @@ const requests = [ groupValueTrait: 'age', trackProductsOnce: false, trackRevenuePerProduct: false, - apiToken: 'dummyApiToken', + apiToken: secret1, }, }, ], @@ -138,7 +139,7 @@ const requests = [ groupValueTrait: 'age', trackProductsOnce: false, trackRevenuePerProduct: false, - apiToken: 'dummyApiToken', + apiToken: secret1, }, }, ], @@ -230,7 +231,7 @@ export const data = [ devKey: 'ef1d42390426e3f7c90ac78272e74344', appleAppId: '123456789', androidAppId: 'AnAID', - apiToken: 'dummyApiToken', + apiToken: secret1, }, }, ], @@ -274,7 +275,7 @@ export const data = [ devKey: 'ef1d42390426e3f7c90ac78272e74344', appleAppId: '123456789', androidAppId: 'AnAID', - apiToken: 'dummyApiToken', + apiToken: secret1, statusCallbackUrls: 'https://examplecontroller.com/opengdpr_callbacks', }, }, diff --git a/test/integrations/destinations/af/maskedSecrets.ts b/test/integrations/destinations/af/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/af/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/af/network.ts b/test/integrations/destinations/af/network.ts index 2e9557539e1..027887a5d5d 100644 --- a/test/integrations/destinations/af/network.ts +++ b/test/integrations/destinations/af/network.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from './maskedSecrets'; import { JSON_MIME_TYPE } from '../../../../src/v0/util/constant'; export const networkCallsData = [ @@ -8,7 +9,7 @@ export const networkCallsData = [ headers: { 'Content-Type': JSON_MIME_TYPE, - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, }, data: { subject_request_type: 'erasure', @@ -56,7 +57,7 @@ export const networkCallsData = [ headers: { 'Content-Type': JSON_MIME_TYPE, - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, }, }, httpRes: { diff --git a/test/integrations/destinations/af/processor/data.ts b/test/integrations/destinations/af/processor/data.ts index dacef389431..16f28cbcb67 100644 --- a/test/integrations/destinations/af/processor/data.ts +++ b/test/integrations/destinations/af/processor/data.ts @@ -197,7 +197,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -281,8 +287,12 @@ export const existingTestCases = [ params: {}, body: { JSON: { - eventValue: - '{"properties":{"user_actual_role":"system_admin, system_user","user_actual_id":12345}}', + eventValue: JSON.stringify({ + properties: { + user_actual_role: 'system_admin, system_user', + user_actual_id: 12345, + }, + }), eventName: 'test track event HS', customer_user_id: '12345', ip: '0.0.0.0', @@ -546,7 +556,13 @@ export const existingTestCases = [ JSON: { bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'some_other2345_sample_external_id', os: '', @@ -638,7 +654,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -726,7 +748,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -796,8 +824,48 @@ export const existingTestCases = [ body: { JSON: { bundleIdentifier: 'com.rudderlabs.javascript', - eventValue: - '{"properties":{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"sku":"45790-32","url":"https://www.example.com/product/path","name":"Monopoly: 3rd Edition","price":19,"category":"Games","quantity":1,"image_url":"https:///www.example.com/product/path.jpg","product_id":"507f1f77bcf86cd799439011"},{"sku":"46493-32","name":"Uno Card Game","price":3,"category":"Games","quantity":2,"product_id":"505bd76785ebb509fc183733"}],"shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f"},"af_revenue":48,"af_price":[19,3],"af_quantity":[1,2],"af_order_id":"50314b8e9bcf000000000000","af_content_id":["507f1f77bcf86cd799439011","505bd76785ebb509fc183733"]}', + eventValue: JSON.stringify({ + properties: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + sku: '45790-32', + url: 'https://www.example.com/product/path', + name: 'Monopoly: 3rd Edition', + price: 19, + category: 'Games', + quantity: 1, + image_url: 'https:///www.example.com/product/path.jpg', + product_id: '507f1f77bcf86cd799439011', + }, + { + sku: '46493-32', + name: 'Uno Card Game', + price: 3, + category: 'Games', + quantity: 2, + product_id: '505bd76785ebb509fc183733', + }, + ], + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + af_revenue: 48, + af_price: [19, 3], + af_quantity: [1, 2], + af_order_id: '50314b8e9bcf000000000000', + af_content_id: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + }), eventName: 'Order Completed', eventCurrency: 'ZAR', eventTime: '2020-08-14T05:30:30.118Z', @@ -881,8 +949,27 @@ export const existingTestCases = [ body: { JSON: { bundleIdentifier: 'com.rudderlabs.javascript', - eventValue: - '{"properties":{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f"},"af_revenue":48,"af_price":25,"af_quantity":2,"af_order_id":"50314b8e9bcf000000000000"}', + eventValue: JSON.stringify({ + properties: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + af_revenue: 48, + af_price: 25, + af_quantity: 2, + af_order_id: '50314b8e9bcf000000000000', + }), eventName: 'Order Completed', eventCurrency: 'ZAR', eventTime: '2020-08-14T05:30:30.118Z', @@ -1020,8 +1107,47 @@ export const existingTestCases = [ params: {}, body: { JSON: { - eventValue: - '{"properties":{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"sku":"45790-32","url":"https://www.example.com/product/path","name":"Monopoly: 3rd Edition","price":19,"category":"Games","quantity":1,"image_url":"https:///www.example.com/product/path.jpg","product_id":"507f1f77bcf86cd799439011"},{"sku":"46493-32","name":"Uno Card Game","price":3,"category":"Games","quantity":2,"product_id":"505bd76785ebb509fc183733"}],"shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f"},"af_revenue":48,"af_quantity":2,"af_price":25,"af_currency":"ZAR"}', + eventValue: JSON.stringify({ + properties: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + sku: '45790-32', + url: 'https://www.example.com/product/path', + name: 'Monopoly: 3rd Edition', + price: 19, + category: 'Games', + quantity: 1, + image_url: 'https:///www.example.com/product/path.jpg', + product_id: '507f1f77bcf86cd799439011', + }, + { + sku: '46493-32', + name: 'Uno Card Game', + price: 3, + category: 'Games', + quantity: 2, + product_id: '505bd76785ebb509fc183733', + }, + ], + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + af_revenue: 48, + af_quantity: 2, + af_price: 25, + af_currency: 'ZAR', + }), eventName: 'normal track event', eventTime: '2020-08-14T05:30:30.118Z', eventCurrency: 'ZAR', @@ -1272,7 +1398,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -1365,7 +1497,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -1535,7 +1673,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -1621,8 +1765,10 @@ export const existingTestCases = [ params: {}, body: { JSON: { - eventValue: - '{"user_actual_role":"system_admin, system_user","user_actual_id":12345}', + eventValue: JSON.stringify({ + user_actual_role: 'system_admin, system_user', + user_actual_id: 12345, + }), eventName: 'test track event HS', customer_user_id: '12345', ip: '0.0.0.0', @@ -1696,8 +1842,46 @@ export const existingTestCases = [ body: { JSON: { bundleIdentifier: 'com.rudderlabs.javascript', - eventValue: - '{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"sku":"45790-32","url":"https://www.example.com/product/path","name":"Monopoly: 3rd Edition","price":19,"category":"Games","quantity":1,"image_url":"https:///www.example.com/product/path.jpg","product_id":"507f1f77bcf86cd799439011"},{"sku":"46493-32","name":"Uno Card Game","price":3,"category":"Games","quantity":2,"product_id":"505bd76785ebb509fc183733"}],"shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f","af_revenue":48,"af_price":[19,3],"af_quantity":[1,2],"af_order_id":"50314b8e9bcf000000000000","af_content_id":["507f1f77bcf86cd799439011","505bd76785ebb509fc183733"]}', + eventValue: JSON.stringify({ + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + sku: '45790-32', + url: 'https://www.example.com/product/path', + name: 'Monopoly: 3rd Edition', + price: 19, + category: 'Games', + quantity: 1, + image_url: 'https:///www.example.com/product/path.jpg', + product_id: '507f1f77bcf86cd799439011', + }, + { + sku: '46493-32', + name: 'Uno Card Game', + price: 3, + category: 'Games', + quantity: 2, + product_id: '505bd76785ebb509fc183733', + }, + ], + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + af_revenue: 48, + af_price: [19, 3], + af_quantity: [1, 2], + af_order_id: '50314b8e9bcf000000000000', + af_content_id: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + }), eventName: 'Order Completed', eventCurrency: 'ZAR', eventTime: '2020-08-14T05:30:30.118Z', @@ -1788,8 +1972,51 @@ export const existingTestCases = [ body: { JSON: { bundleIdentifier: 'com.rudderlabs.javascript', - eventValue: - '{"prop1":"value1","prop2":"value2","properties":{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"sku":"45790-32","url":"https://www.example.com/product/path","name":"Monopoly: 3rd Edition","price":19,"category":"Games","quantity":1,"image_url":"https:///www.example.com/product/path.jpg","product_id":"507f1f77bcf86cd799439011"},{"sku":"46493-32","name":"Uno Card Game","price":3,"category":"Games","quantity":2,"product_id":"505bd76785ebb509fc183733"}],"shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f","Prop3":"value3"},"af_revenue":48,"af_price":[19,3],"af_quantity":[1,2],"af_order_id":"50314b8e9bcf000000000000","af_content_id":["507f1f77bcf86cd799439011","505bd76785ebb509fc183733"]}', + eventValue: JSON.stringify({ + prop1: 'value1', + prop2: 'value2', + properties: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + sku: '45790-32', + url: 'https://www.example.com/product/path', + name: 'Monopoly: 3rd Edition', + price: 19, + category: 'Games', + quantity: 1, + image_url: 'https:///www.example.com/product/path.jpg', + product_id: '507f1f77bcf86cd799439011', + }, + { + sku: '46493-32', + name: 'Uno Card Game', + price: 3, + category: 'Games', + quantity: 2, + product_id: '505bd76785ebb509fc183733', + }, + ], + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + Prop3: 'value3', + }, + af_revenue: 48, + af_price: [19, 3], + af_quantity: [1, 2], + af_order_id: '50314b8e9bcf000000000000', + af_content_id: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + }), eventName: 'Order Completed', eventCurrency: 'ZAR', eventTime: '2020-08-14T05:30:30.118Z', diff --git a/test/integrations/destinations/af/processor/validation.ts b/test/integrations/destinations/af/processor/validation.ts index 8042570c7d2..ed34cae6925 100644 --- a/test/integrations/destinations/af/processor/validation.ts +++ b/test/integrations/destinations/af/processor/validation.ts @@ -235,7 +235,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -319,8 +325,12 @@ export const existingTestCases = [ params: {}, body: { JSON: { - eventValue: - '{"properties":{"user_actual_role":"system_admin, system_user","user_actual_id":12345}}', + eventValue: JSON.stringify({ + properties: { + user_actual_role: 'system_admin, system_user', + user_actual_id: 12345, + }, + }), eventName: 'test track event HS', customer_user_id: '12345', ip: '0.0.0.0', @@ -584,7 +594,13 @@ export const existingTestCases = [ JSON: { bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'some_other2345_sample_external_id', os: '', @@ -676,7 +692,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -764,7 +786,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -834,8 +862,48 @@ export const existingTestCases = [ body: { JSON: { bundleIdentifier: 'com.rudderlabs.javascript', - eventValue: - '{"properties":{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"sku":"45790-32","url":"https://www.example.com/product/path","name":"Monopoly: 3rd Edition","price":19,"category":"Games","quantity":1,"image_url":"https:///www.example.com/product/path.jpg","product_id":"507f1f77bcf86cd799439011"},{"sku":"46493-32","name":"Uno Card Game","price":3,"category":"Games","quantity":2,"product_id":"505bd76785ebb509fc183733"}],"shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f"},"af_revenue":48,"af_price":[19,3],"af_quantity":[1,2],"af_order_id":"50314b8e9bcf000000000000","af_content_id":["507f1f77bcf86cd799439011","505bd76785ebb509fc183733"]}', + eventValue: JSON.stringify({ + properties: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + sku: '45790-32', + url: 'https://www.example.com/product/path', + name: 'Monopoly: 3rd Edition', + price: 19, + category: 'Games', + quantity: 1, + image_url: 'https:///www.example.com/product/path.jpg', + product_id: '507f1f77bcf86cd799439011', + }, + { + sku: '46493-32', + name: 'Uno Card Game', + price: 3, + category: 'Games', + quantity: 2, + product_id: '505bd76785ebb509fc183733', + }, + ], + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + af_revenue: 48, + af_price: [19, 3], + af_quantity: [1, 2], + af_order_id: '50314b8e9bcf000000000000', + af_content_id: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + }), eventName: 'Order Completed', eventCurrency: 'ZAR', eventTime: '2020-08-14T05:30:30.118Z', @@ -919,8 +987,27 @@ export const existingTestCases = [ body: { JSON: { bundleIdentifier: 'com.rudderlabs.javascript', - eventValue: - '{"properties":{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f"},"af_revenue":48,"af_price":25,"af_quantity":2,"af_order_id":"50314b8e9bcf000000000000"}', + eventValue: JSON.stringify({ + properties: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + af_revenue: 48, + af_price: 25, + af_quantity: 2, + af_order_id: '50314b8e9bcf000000000000', + }), eventName: 'Order Completed', eventCurrency: 'ZAR', eventTime: '2020-08-14T05:30:30.118Z', @@ -1058,8 +1145,47 @@ export const existingTestCases = [ params: {}, body: { JSON: { - eventValue: - '{"properties":{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"sku":"45790-32","url":"https://www.example.com/product/path","name":"Monopoly: 3rd Edition","price":19,"category":"Games","quantity":1,"image_url":"https:///www.example.com/product/path.jpg","product_id":"507f1f77bcf86cd799439011"},{"sku":"46493-32","name":"Uno Card Game","price":3,"category":"Games","quantity":2,"product_id":"505bd76785ebb509fc183733"}],"shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f"},"af_revenue":48,"af_quantity":2,"af_price":25,"af_currency":"ZAR"}', + eventValue: JSON.stringify({ + properties: { + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + sku: '45790-32', + url: 'https://www.example.com/product/path', + name: 'Monopoly: 3rd Edition', + price: 19, + category: 'Games', + quantity: 1, + image_url: 'https:///www.example.com/product/path.jpg', + product_id: '507f1f77bcf86cd799439011', + }, + { + sku: '46493-32', + name: 'Uno Card Game', + price: 3, + category: 'Games', + quantity: 2, + product_id: '505bd76785ebb509fc183733', + }, + ], + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + }, + af_revenue: 48, + af_quantity: 2, + af_price: 25, + af_currency: 'ZAR', + }), eventName: 'normal track event', eventTime: '2020-08-14T05:30:30.118Z', eventCurrency: 'ZAR', @@ -1310,7 +1436,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -1403,7 +1535,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -1573,7 +1711,13 @@ export const existingTestCases = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -1659,8 +1803,10 @@ export const existingTestCases = [ params: {}, body: { JSON: { - eventValue: - '{"user_actual_role":"system_admin, system_user","user_actual_id":12345}', + eventValue: JSON.stringify({ + user_actual_role: 'system_admin, system_user', + user_actual_id: 12345, + }), eventName: 'test track event HS', customer_user_id: '12345', ip: '0.0.0.0', @@ -1734,8 +1880,46 @@ export const existingTestCases = [ body: { JSON: { bundleIdentifier: 'com.rudderlabs.javascript', - eventValue: - '{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"sku":"45790-32","url":"https://www.example.com/product/path","name":"Monopoly: 3rd Edition","price":19,"category":"Games","quantity":1,"image_url":"https:///www.example.com/product/path.jpg","product_id":"507f1f77bcf86cd799439011"},{"sku":"46493-32","name":"Uno Card Game","price":3,"category":"Games","quantity":2,"product_id":"505bd76785ebb509fc183733"}],"shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f","af_revenue":48,"af_price":[19,3],"af_quantity":[1,2],"af_order_id":"50314b8e9bcf000000000000","af_content_id":["507f1f77bcf86cd799439011","505bd76785ebb509fc183733"]}', + eventValue: JSON.stringify({ + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + sku: '45790-32', + url: 'https://www.example.com/product/path', + name: 'Monopoly: 3rd Edition', + price: 19, + category: 'Games', + quantity: 1, + image_url: 'https:///www.example.com/product/path.jpg', + product_id: '507f1f77bcf86cd799439011', + }, + { + sku: '46493-32', + name: 'Uno Card Game', + price: 3, + category: 'Games', + quantity: 2, + product_id: '505bd76785ebb509fc183733', + }, + ], + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + af_revenue: 48, + af_price: [19, 3], + af_quantity: [1, 2], + af_order_id: '50314b8e9bcf000000000000', + af_content_id: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + }), eventName: 'Order Completed', eventCurrency: 'ZAR', eventTime: '2020-08-14T05:30:30.118Z', @@ -1786,6 +1970,7 @@ export const newConfigValidationTests: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1843,6 +2028,7 @@ export const newConfigValidationTests: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1900,6 +2086,7 @@ export const newConfigValidationTests: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1956,6 +2143,7 @@ export const newConfigValidationTests: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1970,8 +2158,46 @@ export const newConfigValidationTests: ProcessorTestData[] = [ JSON: { customer_user_id: 'default-user-id', bundleIdentifier: 'com.rudderlabs.javascript', - eventValue: - '{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"sku":"45790-32","url":"https://www.example.com/product/path","name":"Monopoly: 3rd Edition","price":19,"category":"Games","quantity":1,"image_url":"https:///www.example.com/product/path.jpg","product_id":"507f1f77bcf86cd799439011"},{"sku":"46493-32","name":"Uno Card Game","price":3,"category":"Games","quantity":2,"product_id":"505bd76785ebb509fc183733"}],"shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f","af_revenue":48,"af_price":[19,3],"af_quantity":[1,2],"af_order_id":"50314b8e9bcf000000000000","af_content_id":["507f1f77bcf86cd799439011","505bd76785ebb509fc183733"]}', + eventValue: JSON.stringify({ + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + sku: '45790-32', + url: 'https://www.example.com/product/path', + name: 'Monopoly: 3rd Edition', + price: 19, + category: 'Games', + quantity: 1, + image_url: 'https:///www.example.com/product/path.jpg', + product_id: '507f1f77bcf86cd799439011', + }, + { + sku: '46493-32', + name: 'Uno Card Game', + price: 3, + category: 'Games', + quantity: 2, + product_id: '505bd76785ebb509fc183733', + }, + ], + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + af_revenue: 48, + af_price: [19, 3], + af_quantity: [1, 2], + af_order_id: '50314b8e9bcf000000000000', + af_content_id: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + }), eventName: 'Order Completed', eventCurrency: 'ZAR', appsflyer_id: 'afUid', @@ -2016,6 +2242,7 @@ export const newConfigValidationTests: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2029,8 +2256,46 @@ export const newConfigValidationTests: ProcessorTestData[] = [ headers: { ...commonHeader, authentication: 'dummy' }, JSON: { bundleIdentifier: 'com.rudderlabs.javascript', - eventValue: - '{"tax":2,"total":27.5,"coupon":"hasbros","revenue":48,"price":25,"quantity":2,"currency":"ZAR","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"sku":"45790-32","url":"https://www.example.com/product/path","name":"Monopoly: 3rd Edition","price":19,"category":"Games","quantity":1,"image_url":"https:///www.example.com/product/path.jpg","product_id":"507f1f77bcf86cd799439011"},{"sku":"46493-32","name":"Uno Card Game","price":3,"category":"Games","quantity":2,"product_id":"505bd76785ebb509fc183733"}],"shipping":3,"subtotal":22.5,"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f","af_revenue":48,"af_price":[19,3],"af_quantity":[1,2],"af_order_id":"50314b8e9bcf000000000000","af_content_id":["507f1f77bcf86cd799439011","505bd76785ebb509fc183733"]}', + eventValue: JSON.stringify({ + tax: 2, + total: 27.5, + coupon: 'hasbros', + revenue: 48, + price: 25, + quantity: 2, + currency: 'ZAR', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + sku: '45790-32', + url: 'https://www.example.com/product/path', + name: 'Monopoly: 3rd Edition', + price: 19, + category: 'Games', + quantity: 1, + image_url: 'https:///www.example.com/product/path.jpg', + product_id: '507f1f77bcf86cd799439011', + }, + { + sku: '46493-32', + name: 'Uno Card Game', + price: 3, + category: 'Games', + quantity: 2, + product_id: '505bd76785ebb509fc183733', + }, + ], + shipping: 3, + subtotal: 22.5, + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + af_revenue: 48, + af_price: [19, 3], + af_quantity: [1, 2], + af_order_id: '50314b8e9bcf000000000000', + af_content_id: ['507f1f77bcf86cd799439011', '505bd76785ebb509fc183733'], + }), eventName: 'Order Completed', eventCurrency: 'ZAR', customer_user_id: 'default-user-id', diff --git a/test/integrations/destinations/af/router/data.ts b/test/integrations/destinations/af/router/data.ts index b6dca3a75ec..4e67d1953f3 100644 --- a/test/integrations/destinations/af/router/data.ts +++ b/test/integrations/destinations/af/router/data.ts @@ -165,7 +165,13 @@ export const data = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', @@ -204,8 +210,12 @@ export const data = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: - '{"properties":{"user_actual_role":"system_admin, system_user","user_actual_id":12345}}', + eventValue: JSON.stringify({ + properties: { + user_actual_role: 'system_admin, system_user', + user_actual_id: 12345, + }, + }), eventName: 'test track event HS', appsflyer_id: 'afUid', os: '', @@ -244,7 +254,13 @@ export const data = [ app_version_name: '1.0.0', bundleIdentifier: 'com.rudderlabs.javascript', customer_user_id: '12345', - eventValue: '{"path":"","referrer":"","search":"","title":"","url":""}', + eventValue: JSON.stringify({ + path: '', + referrer: '', + search: '', + title: '', + url: '', + }), eventName: 'page', appsflyer_id: 'afUid', os: '', diff --git a/test/integrations/destinations/airship/maskedSecrets.ts b/test/integrations/destinations/airship/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/airship/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/airship/processor/business.ts b/test/integrations/destinations/airship/processor/business.ts new file mode 100644 index 00000000000..0ee0beb8f24 --- /dev/null +++ b/test/integrations/destinations/airship/processor/business.ts @@ -0,0 +1,233 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; +const arrayHandlingCases = [ + { + description: + '[identify] should send array traits as is to airship when present in integrationsObject(even when similar key is present in traits)', + inputEvent: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.0.0', + }, + traits: { + email: 'testone@gmail.com', + firstName: 'test', + lastName: 'one', + colors: ['red', 'blue'], + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', + locale: 'en-US', + ip: '0.0.0.0', + os: { name: '', version: '' }, + screen: { density: 2 }, + }, + type: 'identify', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '123456', + userId: 'testuserId1', + integrations: { + All: true, + Airship: { + JSONAttributes: { + 'colors#r012': { + colors: ['green', 'yellow'], + }, + }, + }, + }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + expectedOutputResponse: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://go.urbanairship.com/api/named_users/testuserId1/attributes', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/vnd.urbanairship+json; version=3', + Authorization: authHeader1, + }, + params: {}, + body: { + JSON: { + attributes: [ + { + action: 'set', + key: 'email', + value: 'testone@gmail.com', + timestamp: '2019-10-14T09:03:17Z', + }, + { + action: 'set', + key: 'first_name', + value: 'test', + timestamp: '2019-10-14T09:03:17Z', + }, + { + action: 'set', + key: 'last_name', + value: 'one', + timestamp: '2019-10-14T09:03:17Z', + }, + { + action: 'set', + key: 'colors#r012', + value: { + colors: ['green', 'yellow'], + }, + timestamp: '2019-10-14T09:03:17Z', + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + // not expected in reality & leads to error in airship, but just to test the delimiter handling + { + description: '[identify] should handle keys with delimiters and JSON attributes correctly', + inputEvent: { + channel: 'web', + context: { + traits: { + preferences: ['value1'], // should be processed as preferences_0 + 'settings.theme': 'dark', + 'data[test]_value': 'test', + simple: 'value', // no delimiters + 'company[location]': 'SF', // should be processed since not in JSONAttributes + }, + }, + type: 'identify', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + originalTimestamp: '2019-10-14T09:03:17.562Z', + userId: 'testuserId1', + integrations: { + All: true, + Airship: { + JSONAttributes: { + 'company#pow2': { + name: 'Test Corp', + size: 100, + }, + }, + }, + }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + expectedOutputResponse: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://go.urbanairship.com/api/named_users/testuserId1/attributes', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/vnd.urbanairship+json; version=3', + Authorization: authHeader1, + }, + params: {}, + body: { + JSON: { + attributes: [ + { + action: 'set', + key: 'preferences[0]', + value: 'value1', + timestamp: '2019-10-14T09:03:17Z', + }, + { + action: 'set', + key: 'settings_theme', + value: 'dark', + timestamp: '2019-10-14T09:03:17Z', + }, + { + action: 'set', + key: 'data[test]_value', + value: 'test', + timestamp: '2019-10-14T09:03:17Z', + }, + { + action: 'set', + key: 'simple', + value: 'value', + timestamp: '2019-10-14T09:03:17Z', + }, + { + action: 'set', + key: 'company#pow2', + value: { + name: 'Test Corp', + size: 100, + }, + timestamp: '2019-10-14T09:03:17Z', + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, +]; + +const getIdentifyTestCase = ({ description, inputEvent, expectedOutputResponse }) => { + return { + name: 'airship', + description: description, + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: inputEvent, + destination: { + Config: { + apiKey: secret1, + appKey: 'O2YARRI15I', + dataCenter: false, + }, + }, + }, + ], + method: 'POST', + }, + }, + output: { + response: expectedOutputResponse, + }, + }; +}; + +export const identifyTestCases = arrayHandlingCases.map((tc) => getIdentifyTestCase(tc)); diff --git a/test/integrations/destinations/airship/processor/data.ts b/test/integrations/destinations/airship/processor/data.ts index 3c6d827ce6c..20e07f57596 100644 --- a/test/integrations/destinations/airship/processor/data.ts +++ b/test/integrations/destinations/airship/processor/data.ts @@ -1,4 +1,8 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; +import { identifyTestCases } from './business'; + export const data = [ + ...identifyTestCases, { name: 'airship', description: 'Test 0', @@ -51,7 +55,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'O2YARRI15I', dataCenter: false, }, @@ -75,7 +79,7 @@ export const data = [ 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', 'X-UA-Appkey': 'O2YARRI15I', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -162,7 +166,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'O2YARRI15I', dataCenter: false, }, @@ -243,7 +247,7 @@ export const data = [ sentAt: '2019-10-14T09:03:22.563Z', }, destination: { - Config: { apiKey: 'dummyApiKey', dataCenter: false }, + Config: { apiKey: secret1, dataCenter: false }, }, }, ], @@ -322,7 +326,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'O2YARRI15I', dataCenter: true, }, @@ -346,7 +350,7 @@ export const data = [ 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', 'X-UA-Appkey': 'O2YARRI15I', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -425,7 +429,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'O2YARRI15I', dataCenter: false, }, @@ -448,7 +452,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -549,7 +553,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'O2YARRI15I', dataCenter: false, }, @@ -572,7 +576,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -640,7 +644,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'O2YARRI15I', dataCenter: false, }, @@ -663,7 +667,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -690,7 +694,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -806,7 +810,7 @@ export const data = [ version: '1', }, destination: { - Config: { apiKey: 'dummyApiKey', dataCenter: true }, + Config: { apiKey: secret1, dataCenter: true }, }, }, ], @@ -826,7 +830,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -853,7 +857,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -954,7 +958,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'O2YARRI15I', appSecret: 'fhf', dataCenter: true, @@ -1027,7 +1031,7 @@ export const data = [ version: '1', }, destination: { - Config: { apiKey: 'dummyApiKey', dataCenter: false }, + Config: { apiKey: secret1, dataCenter: false }, }, }, ], @@ -1047,7 +1051,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1147,7 +1151,7 @@ export const data = [ version: '1', }, destination: { - Config: { apiKey: 'dummyApiKey', dataCenter: false }, + Config: { apiKey: secret1, dataCenter: false }, }, }, ], @@ -1167,7 +1171,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1234,7 +1238,7 @@ export const data = [ version: '1', }, destination: { - Config: { apiKey: 'dummyApiKey', dataCenter: false }, + Config: { apiKey: secret1, dataCenter: false }, }, }, ], @@ -1254,7 +1258,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1281,7 +1285,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1397,7 +1401,7 @@ export const data = [ version: '1', }, destination: { - Config: { apiKey: 'dummyApiKey', dataCenter: true }, + Config: { apiKey: secret1, dataCenter: true }, }, }, ], @@ -1417,7 +1421,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1444,7 +1448,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1545,7 +1549,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'O2YARRI15I', appSecret: 'fhf', dataCenter: true, @@ -1621,7 +1625,7 @@ export const data = [ version: '1', }, destination: { - Config: { apiKey: 'dummyApiKey', dataCenter: false }, + Config: { apiKey: secret1, dataCenter: false }, }, }, ], @@ -1641,7 +1645,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1668,7 +1672,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1887,7 +1891,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'ffdf', appSecret: 'fhf', dataCenter: false, @@ -1912,7 +1916,7 @@ export const data = [ 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', 'X-UA-Appkey': 'ffdf', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1934,6 +1938,77 @@ export const data = [ }, }, }, + { + name: 'airship', + description: 'Test 16', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + messageId: '84e26acc-56a5-4835-8233-591137fca468', + session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', + originalTimestamp: '2019-10-14T09:03:17.562Z', + anonymousId: '123456', + event: 'Product Clicked', + userId: 'testuserId1', + properties: { value: 55 }, + integrations: { All: true }, + sentAt: '2019-10-14T09:03:22.563Z', + }, + destination: { + Config: { + apiKey: secret1, + appKey: 'ffdf', + appSecret: 'fhf', + dataCenter: false, + }, + }, + }, + ], + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://go.urbanairship.com/api/custom-events', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/vnd.urbanairship+json; version=3', + 'X-UA-Appkey': 'ffdf', + Authorization: authHeader1, + }, + params: {}, + body: { + JSON: { + occured: '2019-10-14T09:03:17.562Z', + user: { named_user_id: 'testuserId1' }, + body: { name: 'product_clicked', value: 55 }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, { name: 'airship', description: 'Test 17', @@ -1975,7 +2050,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'ffdf', dataCenter: false, }, @@ -1999,7 +2074,7 @@ export const data = [ 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', 'X-UA-Appkey': 'ffdf', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2062,7 +2137,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'ffdf', dataCenter: false, }, @@ -2086,7 +2161,7 @@ export const data = [ 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', 'X-UA-Appkey': 'ffdf', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2267,7 +2342,7 @@ export const data = [ sentAt: '2019-10-14T09:03:22.563Z', }, destination: { - Config: { appKey: 'dummyApiKey', dataCenter: false }, + Config: { appKey: secret1, dataCenter: false }, }, }, ], @@ -2333,7 +2408,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'ffdf', dataCenter: false, }, @@ -2357,7 +2432,7 @@ export const data = [ 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', 'X-UA-Appkey': 'ffdf', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2420,7 +2495,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'ffdf', dataCenter: false, }, @@ -2444,7 +2519,7 @@ export const data = [ 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', 'X-UA-Appkey': 'ffdf', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2508,7 +2583,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'ffdf', dataCenter: false, }, @@ -2532,7 +2607,7 @@ export const data = [ 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', 'X-UA-Appkey': 'ffdf', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2595,7 +2670,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appKey: 'ffdf', dataCenter: false, }, @@ -2619,7 +2694,7 @@ export const data = [ 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', 'X-UA-Appkey': 'ffdf', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/airship/router/data.ts b/test/integrations/destinations/airship/router/data.ts index df500d7413c..ea63b789e71 100644 --- a/test/integrations/destinations/airship/router/data.ts +++ b/test/integrations/destinations/airship/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'airship', @@ -11,7 +12,7 @@ export const data = [ input: [ { destination: { - Config: { apiKey: 'dummyApiKey', appKey: 'O2YARRI15I', dataCenter: false }, + Config: { apiKey: secret1, appKey: 'O2YARRI15I', dataCenter: false }, }, metadata: { jobId: 1, userId: 'u1' }, message: { @@ -76,7 +77,7 @@ export const data = [ 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', 'X-UA-Appkey': 'O2YARRI15I', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -109,7 +110,7 @@ export const data = [ batched: false, statusCode: 200, destination: { - Config: { apiKey: 'dummyApiKey', appKey: 'O2YARRI15I', dataCenter: false }, + Config: { apiKey: secret1, appKey: 'O2YARRI15I', dataCenter: false }, }, }, ], @@ -129,7 +130,7 @@ export const data = [ input: [ { destination: { - Config: { apiKey: 'dummyApiKey', appKey: 'O2YARRI15I', dataCenter: false }, + Config: { apiKey: secret1, appKey: 'O2YARRI15I', dataCenter: false }, }, metadata: { jobId: 2, userId: 'u1' }, message: { @@ -188,7 +189,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -211,7 +212,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -285,7 +286,7 @@ export const data = [ batched: false, statusCode: 200, destination: { - Config: { apiKey: 'dummyApiKey', appKey: 'O2YARRI15I', dataCenter: false }, + Config: { apiKey: secret1, appKey: 'O2YARRI15I', dataCenter: false }, }, }, ], @@ -304,7 +305,7 @@ export const data = [ body: { input: [ { - destination: { Config: { apiKey: 'dummyApiKey', dataCenter: false } }, + destination: { Config: { apiKey: secret1, dataCenter: false } }, metadata: { jobId: 3, userId: 'u1' }, message: { anonymousId: '507f191e810c19729de860ea', @@ -362,7 +363,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -385,7 +386,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/vnd.urbanairship+json; version=3', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -458,7 +459,7 @@ export const data = [ metadata: [{ jobId: 3, userId: 'u1' }], batched: false, statusCode: 200, - destination: { Config: { apiKey: 'dummyApiKey', dataCenter: false } }, + destination: { Config: { apiKey: secret1, dataCenter: false } }, }, ], }, diff --git a/test/integrations/destinations/algolia/dataDelivery/business.ts b/test/integrations/destinations/algolia/dataDelivery/business.ts index 8ba964e2ddb..1f09d5854b8 100644 --- a/test/integrations/destinations/algolia/dataDelivery/business.ts +++ b/test/integrations/destinations/algolia/dataDelivery/business.ts @@ -1,6 +1,8 @@ import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV0Payload, generateProxyV1Payload } from '../../../testUtils'; import { abortStatTags, commonRequestProperties, metadataArray, retryStatTags } from './constant'; +import { defaultAccessToken } from '../../../common/secrets'; + const proxyMetdata3 = { jobId: 3, attemptNum: 1, @@ -214,8 +216,10 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'ALGOLIA: Error transformer proxy v1 during ALGOLIA response transformation', response: [ { - error: - '{"status":422,"message":"EventType must be one of \\"click\\", \\"conversion\\" or \\"view\\""}', + error: JSON.stringify({ + status: 422, + message: `EventType must be one of "click", "conversion" or "view"`, + }), metadata: { jobId: 1, attemptNum: 1, @@ -224,7 +228,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: true, }, @@ -277,8 +281,10 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'ALGOLIA: Error transformer proxy v1 during ALGOLIA response transformation', response: [ { - error: - '{"status":422,"message":"EventType must be one of \\"click\\", \\"conversion\\" or \\"view\\""}', + error: JSON.stringify({ + status: 422, + message: `EventType must be one of "click", "conversion" or "view"`, + }), metadata: { jobId: 1, attemptNum: 1, @@ -292,8 +298,10 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ statusCode: 500, }, { - error: - '{"status":422,"message":"EventType must be one of \\"click\\", \\"conversion\\" or \\"view\\""}', + error: JSON.stringify({ + status: 422, + message: `EventType must be one of "click", "conversion" or "view"`, + }), metadata: { jobId: 2, attemptNum: 1, @@ -307,8 +315,10 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ statusCode: 500, }, { - error: - '{"status":422,"message":"EventType must be one of \\"click\\", \\"conversion\\" or \\"view\\""}', + error: JSON.stringify({ + status: 422, + message: `EventType must be one of "click", "conversion" or "view"`, + }), metadata: { jobId: 3, attemptNum: 1, diff --git a/test/integrations/destinations/algolia/dataDelivery/constant.ts b/test/integrations/destinations/algolia/dataDelivery/constant.ts index e8d0817a7fe..bf6dfeeaf68 100644 --- a/test/integrations/destinations/algolia/dataDelivery/constant.ts +++ b/test/integrations/destinations/algolia/dataDelivery/constant.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + const proxyMetdata1 = { jobId: 1, attemptNum: 1, @@ -35,7 +37,7 @@ export const abortStatTags = { export const commonRequestProperties = { commonHeaders: { - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, 'X-Algolia-Application-Id': 'O2YARRI15I', 'User-Agent': 'RudderLabs', }, diff --git a/test/integrations/destinations/algolia/dataDelivery/other.ts b/test/integrations/destinations/algolia/dataDelivery/other.ts index f5ccc703378..27f927fae58 100644 --- a/test/integrations/destinations/algolia/dataDelivery/other.ts +++ b/test/integrations/destinations/algolia/dataDelivery/other.ts @@ -1,6 +1,6 @@ import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV0Payload, generateProxyV1Payload } from '../../../testUtils'; - +import { defaultAccessToken } from '../../../common/secrets'; export const otherScenariosV0 = [ { id: 'algolia_v0_other_scenario_1', @@ -258,8 +258,13 @@ export const otherScenariosV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"message":"Service Unavailable","description":"The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later."}}', + error: JSON.stringify({ + error: { + message: 'Service Unavailable', + description: + 'The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later.', + }, + }), statusCode: 503, metadata: { jobId: 1, @@ -269,7 +274,7 @@ export const otherScenariosV1: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: true, }, @@ -326,7 +331,7 @@ export const otherScenariosV1: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: true, }, @@ -383,7 +388,7 @@ export const otherScenariosV1: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: true, }, @@ -440,7 +445,7 @@ export const otherScenariosV1: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: true, }, @@ -498,7 +503,7 @@ export const otherScenariosV1: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: true, }, diff --git a/test/integrations/destinations/algolia/processor/data.ts b/test/integrations/destinations/algolia/processor/data.ts index b37b6e42465..f8d9e01dd7b 100644 --- a/test/integrations/destinations/algolia/processor/data.ts +++ b/test/integrations/destinations/algolia/processor/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'algolia', @@ -74,7 +76,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -117,7 +119,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', files: {}, headers: { - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, 'X-Algolia-Application-Id': 'O2YARRI15I', }, method: 'POST', @@ -225,7 +227,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -266,7 +268,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', files: {}, headers: { - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, 'X-Algolia-Application-Id': 'O2YARRI15I', }, method: 'POST', @@ -365,7 +367,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [], }, @@ -480,7 +482,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [], }, @@ -605,7 +607,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -735,7 +737,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -775,7 +777,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', files: {}, headers: { - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, 'X-Algolia-Application-Id': 'O2YARRI15I', }, method: 'POST', @@ -883,7 +885,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -1013,7 +1015,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -1143,7 +1145,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', }, }, @@ -1256,7 +1258,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -1376,7 +1378,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -1492,7 +1494,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -1582,7 +1584,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -1727,7 +1729,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -1786,7 +1788,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -1902,7 +1904,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -1961,7 +1963,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -2078,7 +2080,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2137,7 +2139,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -2235,7 +2237,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2279,7 +2281,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -2388,7 +2390,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2510,7 +2512,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2554,7 +2556,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, diff --git a/test/integrations/destinations/algolia/router/data.ts b/test/integrations/destinations/algolia/router/data.ts index adc7be1596f..c200e1234ee 100644 --- a/test/integrations/destinations/algolia/router/data.ts +++ b/test/integrations/destinations/algolia/router/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'algolia', @@ -265,7 +267,7 @@ export const data = [ metadata: { jobId: 3, userId: 'u1' }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [{ from: 'product clicked', to: 'cLick ' }], }, @@ -369,7 +371,7 @@ export const data = [ batched: false, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [{ from: 'product clicked', to: 'cLick ' }], }, @@ -2227,7 +2229,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2324,7 +2326,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2421,7 +2423,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2518,7 +2520,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2641,7 +2643,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -2668,7 +2670,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2749,7 +2751,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -2776,7 +2778,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2857,7 +2859,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -2884,7 +2886,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -2965,7 +2967,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -2992,7 +2994,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -3073,7 +3075,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -3170,7 +3172,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -3267,7 +3269,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -3364,7 +3366,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -3461,7 +3463,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -3598,7 +3600,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -3645,7 +3647,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -3726,7 +3728,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -3753,7 +3755,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -3834,7 +3836,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -3861,7 +3863,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -3942,7 +3944,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -4039,7 +4041,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -4136,7 +4138,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -4233,7 +4235,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -4330,7 +4332,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { @@ -4481,7 +4483,7 @@ export const data = [ endpoint: 'https://insights.algolia.io/1/events', headers: { 'X-Algolia-Application-Id': 'O2YARRI15I', - 'X-Algolia-API-Key': 'dummyApiKey', + 'X-Algolia-API-Key': defaultApiKey, }, params: {}, files: {}, @@ -4548,7 +4550,7 @@ export const data = [ }, Config: { cdkV2Enabled: true, - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, applicationId: 'O2YARRI15I', eventTypeSettings: [ { diff --git a/test/integrations/destinations/am/batch/data.ts b/test/integrations/destinations/am/batch/data.ts index 91a17606a90..c7217956c27 100644 --- a/test/integrations/destinations/am/batch/data.ts +++ b/test/integrations/destinations/am/batch/data.ts @@ -416,7 +416,16 @@ export const data = [ FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', identification: [ - '{"group_type":"Company","group_value":"Comapny-ABC","group_properties":{"KEY_2":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"KEY_3":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"name_trait":"Company","value_trait":"Comapny-ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'Comapny-ABC', + group_properties: { + KEY_2: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + KEY_3: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + name_trait: 'Company', + value_trait: 'Comapny-ABC', + }, + }), ], }, JSON: {}, @@ -449,7 +458,12 @@ export const data = [ JSON_ARRAY: {}, FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', - mapping: ['{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3"}'], + mapping: [ + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + }), + ], }, JSON: {}, }, @@ -557,7 +571,16 @@ export const data = [ FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', identification: [ - '{"group_type":"Company","group_value":"Comapny-ABC","group_properties":{"KEY_2":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"KEY_3":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"name_trait":"Company","value_trait":"Comapny-ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'Comapny-ABC', + group_properties: { + KEY_2: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + KEY_3: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + name_trait: 'Company', + value_trait: 'Comapny-ABC', + }, + }), ], }, JSON: {}, @@ -592,7 +615,12 @@ export const data = [ JSON_ARRAY: {}, FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', - mapping: ['{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3"}'], + mapping: [ + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + }), + ], }, JSON: {}, }, @@ -1046,7 +1074,16 @@ export const data = [ FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', identification: [ - '{"group_type":"Company","group_value":"Comapny-ABC","group_properties":{"KEY_2":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"KEY_3":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"name_trait":"Company","value_trait":"Comapny-ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'Comapny-ABC', + group_properties: { + KEY_2: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + KEY_3: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + name_trait: 'Company', + value_trait: 'Comapny-ABC', + }, + }), ], }, JSON: {}, @@ -1079,7 +1116,12 @@ export const data = [ JSON_ARRAY: {}, FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', - mapping: ['{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3"}'], + mapping: [ + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + }), + ], }, JSON: {}, }, @@ -1185,7 +1227,16 @@ export const data = [ FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', identification: [ - '{"group_type":"Company","group_value":"Comapny-ABC","group_properties":{"KEY_2":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"KEY_3":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"name_trait":"Company","value_trait":"Comapny-ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'Comapny-ABC', + group_properties: { + KEY_2: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + KEY_3: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + name_trait: 'Company', + value_trait: 'Comapny-ABC', + }, + }), ], }, JSON: {}, @@ -1220,7 +1271,12 @@ export const data = [ JSON_ARRAY: {}, FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', - mapping: ['{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3"}'], + mapping: [ + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + }), + ], }, JSON: {}, }, @@ -2370,7 +2426,16 @@ export const data = [ FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', identification: [ - '{"group_type":"Company","group_value":"Comapny-ABC","group_properties":{"KEY_2":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"KEY_3":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"name_trait":"Company","value_trait":"Comapny-ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'Comapny-ABC', + group_properties: { + KEY_2: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + KEY_3: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + name_trait: 'Company', + value_trait: 'Comapny-ABC', + }, + }), ], }, JSON: {}, @@ -2403,7 +2468,12 @@ export const data = [ JSON_ARRAY: {}, FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', - mapping: ['{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3"}'], + mapping: [ + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + }), + ], }, JSON: {}, }, @@ -2511,7 +2581,16 @@ export const data = [ FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', identification: [ - '{"group_type":"Company","group_value":"Comapny-ABC","group_properties":{"KEY_2":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"KEY_3":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"name_trait":"Company","value_trait":"Comapny-ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'Comapny-ABC', + group_properties: { + KEY_2: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + KEY_3: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + name_trait: 'Company', + value_trait: 'Comapny-ABC', + }, + }), ], }, JSON: {}, @@ -2546,7 +2625,12 @@ export const data = [ JSON_ARRAY: {}, FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', - mapping: ['{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3"}'], + mapping: [ + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + }), + ], }, JSON: {}, }, @@ -3009,7 +3093,16 @@ export const data = [ FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', identification: [ - '{"group_type":"Company","group_value":"Comapny-ABC","group_properties":{"KEY_2":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"KEY_3":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"name_trait":"Company","value_trait":"Comapny-ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'Comapny-ABC', + group_properties: { + KEY_2: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + KEY_3: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + name_trait: 'Company', + value_trait: 'Comapny-ABC', + }, + }), ], }, JSON: {}, @@ -3042,7 +3135,12 @@ export const data = [ JSON_ARRAY: {}, FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', - mapping: ['{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3"}'], + mapping: [ + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + }), + ], }, JSON: {}, }, @@ -3149,7 +3247,16 @@ export const data = [ FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', identification: [ - '{"group_type":"Company","group_value":"Comapny-ABC","group_properties":{"KEY_2":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"KEY_3":{"CHILD_KEY_102":"value_103","CHILD_KEY_92":"value_95"},"name_trait":"Company","value_trait":"Comapny-ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'Comapny-ABC', + group_properties: { + KEY_2: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + KEY_3: { CHILD_KEY_102: 'value_103', CHILD_KEY_92: 'value_95' }, + name_trait: 'Company', + value_trait: 'Comapny-ABC', + }, + }), ], }, JSON: {}, @@ -3184,7 +3291,12 @@ export const data = [ JSON_ARRAY: {}, FORM: { api_key: '4c7ed7573eb73517ee4c26ed4bde9a85', - mapping: ['{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3"}'], + mapping: [ + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + }), + ], }, JSON: {}, }, diff --git a/test/integrations/destinations/am/deleteUsers/data.ts b/test/integrations/destinations/am/deleteUsers/data.ts index bd10a4d7e05..7092cc13ab9 100644 --- a/test/integrations/destinations/am/deleteUsers/data.ts +++ b/test/integrations/destinations/am/deleteUsers/data.ts @@ -1,3 +1,5 @@ +import { secret1, secret2 } from '../maskedSecrets'; + export const data = [ { name: 'am', @@ -374,8 +376,8 @@ export const data = [ }, ], config: { - apiKey: '1234', - apiSecret: 'abcd', + apiKey: secret1, + apiSecret: secret2, }, }, ], @@ -393,4 +395,45 @@ export const data = [ }, }, }, + { + name: 'am', + description: 'user deletion test with EU residencyServer', + feature: 'userDeletion', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + jobId: 'dummy-job-id', + destType: 'AM', + userAttributes: [ + { + userId: 'test_user_id_1', + }, + { + userId: 'test_user_id_2', + }, + ], + config: { + apiKey: secret1, + apiSecret: secret2, + residencyServer: 'EU', + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + statusCode: 200, + status: 'successful', + }, + ], + }, + }, + }, ]; diff --git a/test/integrations/destinations/am/maskedSecrets.ts b/test/integrations/destinations/am/maskedSecrets.ts new file mode 100644 index 00000000000..9ff6062bfd4 --- /dev/null +++ b/test/integrations/destinations/am/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; diff --git a/test/integrations/destinations/am/network.ts b/test/integrations/destinations/am/network.ts index 5cd016069c7..5fe8e4ebfd7 100644 --- a/test/integrations/destinations/am/network.ts +++ b/test/integrations/destinations/am/network.ts @@ -1,3 +1,5 @@ +import { authHeader1 } from './maskedSecrets'; + const deleteNwData = [ { httpReq: { @@ -111,7 +113,7 @@ const deleteNwData = [ }, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic MTIzNDphYmNk', + Authorization: authHeader1, }, }, httpRes: { @@ -154,7 +156,7 @@ const deleteNwData = [ }, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic MTIzNDphYmNk', + Authorization: authHeader1, }, }, httpRes: { @@ -174,7 +176,7 @@ const deleteNwData = [ }, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic MTIzNDphYmNk', + Authorization: authHeader1, }, }, httpRes: { @@ -194,7 +196,7 @@ const deleteNwData = [ }, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic MTIzNDphYmNk', + Authorization: authHeader1, }, }, httpRes: { @@ -205,6 +207,44 @@ const deleteNwData = [ }, }, }, + { + httpReq: { + method: 'post', + url: 'https://analytics.eu.amplitude.com/api/2/deletions/users', + data: { + user_ids: ['test_user_id_1', 'test_user_id_2'], + requester: 'RudderStack', + ignore_invalid_id: 'true', + }, + headers: { + 'Content-Type': 'application/json', + Authorization: authHeader1, + }, + }, + httpRes: { + data: [ + { + active_scrub_done_date: null, + amplitude_ids: [ + { + amplitude_id: 44547850078, + requested_on_day: '2024-12-01', + requester: 'RudderStack', + }, + { + amplitude_id: 44547886812, + requested_on_day: '2024-12-01', + requester: 'RudderStack', + }, + ], + app: '10000000', + day: '2025-01-10', + status: 'staging', + }, + ], + status: 200, + }, + }, ]; const deliveryNwData = [ diff --git a/test/integrations/destinations/am/processor/data.ts b/test/integrations/destinations/am/processor/data.ts index 01f9feb44a3..eda651b9517 100644 --- a/test/integrations/destinations/am/processor/data.ts +++ b/test/integrations/destinations/am/processor/data.ts @@ -1,3 +1,5 @@ +import { secret2 } from '../maskedSecrets'; + export const data = [ { name: 'am', @@ -47,7 +49,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: true, @@ -105,7 +107,7 @@ export const data = [ destination: { Config: { groupTypeTrait: 'email', - apiKey: 'abcde', + apiKey: secret2, groupValueTrait: 'age', trackProductsOnce: true, trackRevenuePerProduct: false, @@ -239,7 +241,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: true, @@ -266,7 +268,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -382,7 +384,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: true, @@ -409,7 +411,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -573,7 +575,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', traitsToIncrement: [ @@ -603,7 +605,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -757,7 +759,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', }, @@ -782,7 +784,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -910,7 +912,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', }, @@ -935,7 +937,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -1058,7 +1060,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -1081,7 +1083,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -1213,7 +1215,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -1236,7 +1238,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -1361,7 +1363,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -1384,7 +1386,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -1512,7 +1514,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -1535,7 +1537,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -1615,7 +1617,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -1638,7 +1640,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '123456', @@ -1703,7 +1705,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -1726,7 +1728,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '123456', @@ -1791,7 +1793,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -1814,7 +1816,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '123456', @@ -1878,7 +1880,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -1901,7 +1903,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '123456', @@ -2027,7 +2029,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -2050,7 +2052,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -2108,8 +2110,8 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - api_key: 'abcde', - identification: ['{"group_type":"Company","group_value":"ABC"}'], + api_key: secret2, + identification: [JSON.stringify({ group_type: 'Company', group_value: 'ABC' })], }, }, files: {}, @@ -2206,7 +2208,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'name_trait', groupValueTrait: 'value_trait', }, @@ -2231,7 +2233,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -2289,9 +2291,18 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - api_key: 'abcde', + api_key: secret2, identification: [ - '{"group_type":"Company","group_value":"ABC","group_properties":{"KEY_3":{"CHILD_KEY_92":"value_95","CHILD_KEY_102":"value_103"},"KEY_2":{"CHILD_KEY_92":"value_95","CHILD_KEY_102":"value_103"},"name_trait":"Company","value_trait":"ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'ABC', + group_properties: { + KEY_3: { CHILD_KEY_92: 'value_95', CHILD_KEY_102: 'value_103' }, + KEY_2: { CHILD_KEY_92: 'value_95', CHILD_KEY_102: 'value_103' }, + name_trait: 'Company', + value_trait: 'ABC', + }, + }), ], }, }, @@ -2389,7 +2400,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'name_trait', groupValueTrait: 'value_trait', }, @@ -2491,7 +2502,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -2515,9 +2526,22 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - api_key: 'abcde', + api_key: secret2, mapping: [ - '{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3","user_properties":{"initial_referrer":"https://docs.rudderstack.com","initial_referring_domain":"docs.rudderstack.com","utm_source":"google","utm_medium":"medium","utm_term":"keyword","utm_content":"some content","utm_name":"some campaign","utm_test":"other value"}}', + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + user_properties: { + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + utm_source: 'google', + utm_medium: 'medium', + utm_term: 'keyword', + utm_content: 'some content', + utm_name: 'some campaign', + utm_test: 'other value', + }, + }), ], }, }, @@ -2606,7 +2630,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -2630,9 +2654,22 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - api_key: 'abcde', + api_key: secret2, mapping: [ - '{"user_id":"sampleusrRudder3","user_properties":{"initial_referrer":"https://docs.rudderstack.com","initial_referring_domain":"docs.rudderstack.com","utm_source":"google","utm_medium":"medium","utm_term":"keyword","utm_content":"some content","utm_name":"some campaign","utm_test":"other value"},"unmap":true}', + JSON.stringify({ + user_id: 'sampleusrRudder3', + user_properties: { + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + utm_source: 'google', + utm_medium: 'medium', + utm_term: 'keyword', + utm_content: 'some content', + utm_name: 'some campaign', + utm_test: 'other value', + }, + unmap: true, + }), ], }, }, @@ -2718,7 +2755,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -2741,7 +2778,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -2856,7 +2893,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -2879,7 +2916,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -2997,7 +3034,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -3020,7 +3057,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -3138,7 +3175,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -3161,7 +3198,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'iOS', @@ -3280,7 +3317,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -3303,7 +3340,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'iOS', @@ -3379,7 +3416,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -3402,7 +3439,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: 'anon-id-new', @@ -3505,7 +3542,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: false, @@ -3532,7 +3569,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -3587,7 +3624,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -3636,7 +3673,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -3744,7 +3781,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: true, @@ -3771,7 +3808,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -3907,7 +3944,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: false, @@ -3934,7 +3971,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -3988,7 +4025,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -4038,7 +4075,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -4147,7 +4184,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: true, @@ -4174,7 +4211,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -4248,7 +4285,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -4298,7 +4335,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -4387,7 +4424,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: true, @@ -4414,7 +4451,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -4510,7 +4547,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: true, @@ -4537,7 +4574,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -4633,7 +4670,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: false, @@ -4660,7 +4697,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -4756,7 +4793,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', trackProductsOnce: false, @@ -4783,7 +4820,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: '50be5c78-6c3f-4b60-be84-97805a316fb1', @@ -4897,7 +4934,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', traitsToIncrement: [ @@ -4930,7 +4967,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -5042,7 +5079,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', traitsToSetOnce: [ @@ -5075,7 +5112,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -5185,7 +5222,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', traitsToAppend: [ @@ -5218,7 +5255,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -5328,7 +5365,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', traitsToPrepend: [ @@ -5361,7 +5398,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -5471,7 +5508,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', traitsToIncrement: [ @@ -5528,7 +5565,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -5681,7 +5718,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, trackProductsOnce: false, trackRevenuePerProduct: true, }, @@ -5706,7 +5743,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -5780,7 +5817,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -5850,7 +5887,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -6008,7 +6045,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, trackProductsOnce: true, trackRevenuePerProduct: false, }, @@ -6033,7 +6070,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -6187,7 +6224,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, trackProductsOnce: true, trackRevenuePerProduct: false, }, @@ -6212,7 +6249,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -6323,7 +6360,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', traitsToIncrement: [ @@ -6356,7 +6393,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -6494,7 +6531,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, trackProductsOnce: true, trackRevenuePerProduct: true, }, @@ -6519,7 +6556,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -6612,7 +6649,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -6681,7 +6718,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -6814,7 +6851,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -6837,7 +6874,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -6960,7 +6997,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', }, @@ -6985,7 +7022,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -7104,7 +7141,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -7127,7 +7164,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_manufacturer: 'Apple', @@ -7238,7 +7275,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -7261,7 +7298,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_manufacturer: 'Apple', @@ -7372,7 +7409,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -7395,7 +7432,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_manufacturer: 'Apple', @@ -7516,7 +7553,7 @@ export const data = [ destination: { Config: { mapDeviceBrand: true, - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', }, @@ -7541,7 +7578,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -7671,7 +7708,7 @@ export const data = [ destination: { Config: { mapDeviceBrand: true, - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -7694,7 +7731,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -7773,7 +7810,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, mapDeviceBrand: true, }, }, @@ -7797,7 +7834,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_manufacturer: 'testManufacturer', @@ -7929,7 +7966,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', residencyServer: 'EU', @@ -7955,7 +7992,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -8094,7 +8131,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'name_trait', groupValueTrait: 'value_trait', residencyServer: 'EU', @@ -8120,7 +8157,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -8178,9 +8215,18 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - api_key: 'abcde', + api_key: secret2, identification: [ - '{"group_type":"Company","group_value":"ABC","group_properties":{"KEY_3":{"CHILD_KEY_92":"value_95","CHILD_KEY_102":"value_103"},"KEY_2":{"CHILD_KEY_92":"value_95","CHILD_KEY_102":"value_103"},"name_trait":"Company","value_trait":"ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'ABC', + group_properties: { + KEY_3: { CHILD_KEY_92: 'value_95', CHILD_KEY_102: 'value_103' }, + KEY_2: { CHILD_KEY_92: 'value_95', CHILD_KEY_102: 'value_103' }, + name_trait: 'Company', + value_trait: 'ABC', + }, + }), ], }, }, @@ -8266,7 +8312,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, residencyServer: 'EU', }, }, @@ -8291,9 +8337,22 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - api_key: 'abcde', + api_key: secret2, mapping: [ - '{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3","user_properties":{"initial_referrer":"https://docs.rudderstack.com","initial_referring_domain":"docs.rudderstack.com","utm_source":"google","utm_medium":"medium","utm_term":"keyword","utm_content":"some content","utm_name":"some campaign","utm_test":"other value"}}', + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + user_properties: { + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + utm_source: 'google', + utm_medium: 'medium', + utm_term: 'keyword', + utm_content: 'some content', + utm_name: 'some campaign', + utm_test: 'other value', + }, + }), ], }, }, @@ -8377,7 +8436,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, trackProductsOnce: true, trackRevenuePerProduct: false, }, @@ -8402,7 +8461,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -8527,7 +8586,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, trackProductsOnce: true, trackRevenuePerProduct: false, }, @@ -8552,7 +8611,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -8677,7 +8736,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, trackProductsOnce: true, trackRevenuePerProduct: false, }, @@ -8702,7 +8761,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -8853,7 +8912,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', }, @@ -8878,7 +8937,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -9031,7 +9090,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age', }, @@ -9056,7 +9115,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -9199,7 +9258,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'name_trait', groupValueTrait: 'value_trait', }, @@ -9224,7 +9283,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -9283,9 +9342,18 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - api_key: 'abcde', + api_key: secret2, identification: [ - '{"group_type":"Company","group_value":"ABC","group_properties":{"KEY_3":{"CHILD_KEY_92":"value_95","CHILD_KEY_102":"value_103"},"KEY_2":{"CHILD_KEY_92":"value_95","CHILD_KEY_102":"value_103"},"name_trait":"Company","value_trait":"ABC"}}', + JSON.stringify({ + group_type: 'Company', + group_value: 'ABC', + group_properties: { + KEY_3: { CHILD_KEY_92: 'value_95', CHILD_KEY_102: 'value_103' }, + KEY_2: { CHILD_KEY_92: 'value_95', CHILD_KEY_102: 'value_103' }, + name_trait: 'Company', + value_trait: 'ABC', + }, + }), ], }, }, @@ -9333,7 +9401,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -9356,7 +9424,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { event_id: 7, @@ -9468,7 +9536,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -9491,7 +9559,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -9622,7 +9690,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -9646,9 +9714,23 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - api_key: 'abcde', + api_key: secret2, mapping: [ - '{"global_user_id":"newUserIdAlias","user_id":"sampleusrRudder3","event_id":67,"user_properties":{"initial_referrer":"https://docs.rudderstack.com","initial_referring_domain":"docs.rudderstack.com","utm_source":"google","utm_medium":"medium","utm_term":"keyword","utm_content":"some content","utm_name":"some campaign","utm_test":"other value"}}', + JSON.stringify({ + global_user_id: 'newUserIdAlias', + user_id: 'sampleusrRudder3', + event_id: 67, + user_properties: { + initial_referrer: 'https://docs.rudderstack.com', + initial_referring_domain: 'docs.rudderstack.com', + utm_source: 'google', + utm_medium: 'medium', + utm_term: 'keyword', + utm_content: 'some content', + utm_name: 'some campaign', + utm_test: 'other value', + }, + }), ], }, }, @@ -9732,7 +9814,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -9755,7 +9837,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -9870,7 +9952,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -9893,7 +9975,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -10032,7 +10114,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -10055,7 +10137,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -10177,7 +10259,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, }, }, }, @@ -10200,7 +10282,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Android', @@ -10330,7 +10412,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, groupTypeTrait: 'name_trait', groupValueTrait: 'value_trait', }, @@ -10435,7 +10517,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, useUserDefinedPageEventName: true, userProvidedPageEventString: 'My custom Page Name is {{ name }} . Custom Name.', }, @@ -10460,7 +10542,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -10591,7 +10673,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, useUserDefinedPageEventName: true, userProvidedPageEventString: '{{name}}', }, @@ -10616,7 +10698,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -10748,7 +10830,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, useUserDefinedPageEventName: true, userProvidedPageEventString: '', }, @@ -10773,7 +10855,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -10903,7 +10985,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, useUserDefinedPageEventName: false, userProvidedPageEventString: 'Viewed {{context.page.title}} event.', }, @@ -10928,7 +11010,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -11010,7 +11092,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, useUserDefinedScreenEventName: true, userProvidedScreenEventString: 'My {{ event }} event.', }, @@ -11035,7 +11117,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: 'anon-id-new', @@ -11097,7 +11179,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, useUserDefinedScreenEventName: false, userProvidedScreenEventString: 'My {{ event }} event.', }, @@ -11122,7 +11204,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: 'anon-id-new', @@ -11184,7 +11266,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, useUserDefinedScreenEventName: true, userProvidedScreenEventString: '{{ event }}', }, @@ -11209,7 +11291,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: 'anon-id-new', @@ -11271,7 +11353,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, useUserDefinedScreenEventName: true, userProvidedScreenEventString: '', }, @@ -11296,7 +11378,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { device_id: 'anon-id-new', @@ -11353,7 +11435,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret2, useUserDefinedPageEventName: true, userProvidedPageEventString: '', }, diff --git a/test/integrations/destinations/am/router/data.ts b/test/integrations/destinations/am/router/data.ts index 1b4026c85e0..b1f028c7303 100644 --- a/test/integrations/destinations/am/router/data.ts +++ b/test/integrations/destinations/am/router/data.ts @@ -1,3 +1,5 @@ +import { secret2 } from '../maskedSecrets'; + export const data = [ { name: 'am', @@ -61,7 +63,7 @@ export const data = [ }, metadata: { jobId: 1, userId: 'u1' }, destination: { - Config: { apiKey: 'abcde', groupTypeTrait: 'email', groupValueTrait: 'age' }, + Config: { apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age' }, }, }, { @@ -114,7 +116,7 @@ export const data = [ sentAt: '2019-10-14T11:15:53.296Z', }, metadata: { jobId: 2, userId: 'u1' }, - destination: { Config: { apiKey: 'abcde' } }, + destination: { Config: { apiKey: secret2 } }, }, ], destType: 'am', @@ -138,7 +140,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -185,7 +187,7 @@ export const data = [ batched: false, statusCode: 200, destination: { - Config: { apiKey: 'abcde', groupTypeTrait: 'email', groupValueTrait: 'age' }, + Config: { apiKey: secret2, groupTypeTrait: 'email', groupValueTrait: 'age' }, }, }, { @@ -199,7 +201,7 @@ export const data = [ params: {}, body: { JSON: { - api_key: 'abcde', + api_key: secret2, events: [ { os_name: 'Chrome', @@ -249,7 +251,7 @@ export const data = [ metadata: [{ jobId: 2, userId: 'u1' }], batched: false, statusCode: 200, - destination: { Config: { apiKey: 'abcde' } }, + destination: { Config: { apiKey: secret2 } }, }, ], }, diff --git a/test/integrations/destinations/amazon_audience/common.ts b/test/integrations/destinations/amazon_audience/common.ts index 728bdf1d257..1aed2084319 100644 --- a/test/integrations/destinations/amazon_audience/common.ts +++ b/test/integrations/destinations/amazon_audience/common.ts @@ -1,3 +1,4 @@ +import { secret1 } from './maskedSecrets'; export const destination = { DestinationDefinition: { Config: { @@ -6,7 +7,7 @@ export const destination = { }, }, Config: { - advertiserId: '{"Dummy Name":"1234"}', + advertiserId: JSON.stringify({ 'Dummy Name': '1234' }), audienceId: 'dummyId', }, ID: 'amazonAud-1234', @@ -22,7 +23,7 @@ export const generateMetadata = (jobId: number, userId?: string): any => { workspaceId: 'default-workspaceId', dontBatch: false, secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, refreshToken: 'dummyRefreshToken', clientId: 'dummyClientId', }, diff --git a/test/integrations/destinations/amazon_audience/dataDelivery/data.ts b/test/integrations/destinations/amazon_audience/dataDelivery/data.ts index c78a53c8994..fa3496bc7f5 100644 --- a/test/integrations/destinations/amazon_audience/dataDelivery/data.ts +++ b/test/integrations/destinations/amazon_audience/dataDelivery/data.ts @@ -1,4 +1,5 @@ import { generateMetadata, generateProxyV0Payload } from '../../../testUtils'; +import { authHeader1, authHeader2 } from '../maskedSecrets'; const commonStatTags = { destType: 'AMAZON_AUDIENCE', @@ -23,7 +24,7 @@ export const data = [ request: { body: generateProxyV0Payload({ headers: { - Authorization: 'Bearer success_access_token', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -86,7 +87,7 @@ export const data = [ request: { body: generateProxyV0Payload({ headers: { - Authorization: 'Bearer success_access_token', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -158,7 +159,7 @@ export const data = [ request: { body: generateProxyV0Payload({ headers: { - Authorization: 'Bearer fail_token', + Authorization: authHeader2, 'Content-Type': 'application/json', Accept: 'application/json', }, diff --git a/test/integrations/destinations/amazon_audience/maskedSecrets.ts b/test/integrations/destinations/amazon_audience/maskedSecrets.ts new file mode 100644 index 00000000000..4141fcbebe4 --- /dev/null +++ b/test/integrations/destinations/amazon_audience/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; diff --git a/test/integrations/destinations/amazon_audience/network.ts b/test/integrations/destinations/amazon_audience/network.ts index b0941712c6a..ec63974d83b 100644 --- a/test/integrations/destinations/amazon_audience/network.ts +++ b/test/integrations/destinations/amazon_audience/network.ts @@ -1,8 +1,5 @@ -const headers = { - 'Amazon-Advertising-API-ClientId': 'dummyClientId', - 'Content-Type': 'application/json', - Authorization: 'Bearer success_access_token', -}; +import { authHeader1, authHeader2 } from './maskedSecrets'; + export const networkCallsData = [ { description: 'successful step 1', @@ -23,7 +20,7 @@ export const networkCallsData = [ }, params: {}, headers: { - Authorization: 'Bearer success_access_token', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -51,7 +48,7 @@ export const networkCallsData = [ }, params: {}, headers: { - Authorization: 'Bearer success_access_token', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -80,7 +77,7 @@ export const networkCallsData = [ }, params: {}, headers: { - Authorization: 'Bearer success_access_token', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -107,7 +104,7 @@ export const networkCallsData = [ }, params: {}, headers: { - Authorization: 'Bearer fail_token', + Authorization: authHeader2, 'Content-Type': 'application/json', Accept: 'application/json', }, diff --git a/test/integrations/destinations/amazon_audience/processor/data.ts b/test/integrations/destinations/amazon_audience/processor/data.ts index 49931ed92bc..7a4a25ca53b 100644 --- a/test/integrations/destinations/amazon_audience/processor/data.ts +++ b/test/integrations/destinations/amazon_audience/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; import { destination, generateMetadata } from '../common'; const sha256 = require('sha256'); @@ -97,7 +98,7 @@ export const data = [ headers: { 'Amazon-Advertising-API-ClientId': 'dummyClientId', 'Content-Type': 'application/json', - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, }, method: 'POST', params: {}, @@ -151,7 +152,7 @@ export const data = [ headers: { 'Amazon-Advertising-API-ClientId': 'dummyClientId', 'Content-Type': 'application/json', - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/amazon_audience/router/data.ts b/test/integrations/destinations/amazon_audience/router/data.ts index 6787e03160e..f663e25b8ec 100644 --- a/test/integrations/destinations/amazon_audience/router/data.ts +++ b/test/integrations/destinations/amazon_audience/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; import { destination, generateMetadata } from '../common'; export const data = [ @@ -106,7 +107,7 @@ export const data = [ headers: { 'Amazon-Advertising-API-ClientId': 'dummyClientId', 'Content-Type': 'application/json', - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, }, params: {}, body: { @@ -157,7 +158,7 @@ export const data = [ headers: { 'Amazon-Advertising-API-ClientId': 'dummyClientId', 'Content-Type': 'application/json', - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/attentive_tag/maskedSecrets.ts b/test/integrations/destinations/attentive_tag/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/attentive_tag/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/attentive_tag/processor/data.ts b/test/integrations/destinations/attentive_tag/processor/data.ts index 137a9aee9af..80aced02023 100644 --- a/test/integrations/destinations/attentive_tag/processor/data.ts +++ b/test/integrations/destinations/attentive_tag/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const mockFns = (_) => { jest.spyOn(Date, 'now').mockReturnValue(new Date('2023-10-14T00:00:00.000Z').valueOf()); }; @@ -40,7 +41,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '241654', }, }, @@ -60,7 +61,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.attentivemobile.com/v1/subscriptions', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -168,7 +169,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -238,7 +239,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '241654', }, }, @@ -258,7 +259,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.attentivemobile.com/v1/subscriptions/unsubscribe', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -364,7 +365,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -476,7 +477,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -589,7 +590,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -702,7 +703,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -805,7 +806,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -917,7 +918,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -988,7 +989,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '241654', }, }, @@ -1008,7 +1009,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.attentivemobile.com/v1/subscriptions', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1114,7 +1115,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -1223,7 +1224,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -1333,7 +1334,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -1444,7 +1445,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -1514,7 +1515,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '241654', }, }, @@ -1534,7 +1535,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.attentivemobile.com/v1/subscriptions', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1624,7 +1625,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -1644,7 +1645,7 @@ export const data = [ userId: '', endpoint: 'https://api.attentivemobile.com/v1/events/ecommerce/product-view', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1728,7 +1729,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, signUpSourceId: '240654', }, }, @@ -1748,7 +1749,7 @@ export const data = [ userId: '', endpoint: 'https://api.attentivemobile.com/v1/events/custom', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, diff --git a/test/integrations/destinations/attentive_tag/router/data.ts b/test/integrations/destinations/attentive_tag/router/data.ts index 63bd477f0cf..2bbd91c3c05 100644 --- a/test/integrations/destinations/attentive_tag/router/data.ts +++ b/test/integrations/destinations/attentive_tag/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'attentive_tag', @@ -10,7 +11,7 @@ export const data = [ body: { input: [ { - destination: { Config: { apiKey: 'dummyApiKey', signUpSourceId: '241654' } }, + destination: { Config: { apiKey: secret1, signUpSourceId: '241654' } }, metadata: { jobId: 1, userId: 'u1' }, message: { anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', @@ -59,7 +60,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.attentivemobile.com/v1/subscriptions/unsubscribe', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -74,7 +75,7 @@ export const data = [ metadata: [{ jobId: 1, userId: 'u1' }], batched: false, statusCode: 200, - destination: { Config: { apiKey: 'dummyApiKey', signUpSourceId: '241654' } }, + destination: { Config: { apiKey: secret1, signUpSourceId: '241654' } }, }, ], }, diff --git a/test/integrations/destinations/attribution/data.ts b/test/integrations/destinations/attribution/data.ts index db8d7cb393b..3ed7f3da5a3 100644 --- a/test/integrations/destinations/attribution/data.ts +++ b/test/integrations/destinations/attribution/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from './maskedSecrets'; export const data = [ { name: 'attribution', @@ -22,7 +23,7 @@ export const data = [ }, }, Config: { - writeKey: 'abcdefghijklmnopqrstuvwxyz', + writeKey: secret1, }, Enabled: true, Transformations: [], @@ -80,7 +81,7 @@ export const data = [ endpoint: 'https://track.attributionapp.com/v1/import', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6', + Authorization: authHeader1, }, params: {}, body: { @@ -165,7 +166,7 @@ export const data = [ }, }, Config: { - writeKey: 'abcdefghijklmnopqrstuvwxyz', + writeKey: secret1, }, Enabled: true, Transformations: [], @@ -215,7 +216,7 @@ export const data = [ endpoint: 'https://track.attributionapp.com/v1/import', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6', + Authorization: authHeader1, }, params: {}, body: { @@ -287,7 +288,7 @@ export const data = [ }, }, Config: { - writeKey: 'abcdefghijklmnopqrstuvwxyz', + writeKey: secret1, }, Enabled: true, Transformations: [], @@ -337,7 +338,7 @@ export const data = [ endpoint: 'https://track.attributionapp.com/v1/import', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6', + Authorization: authHeader1, }, params: {}, body: { @@ -406,7 +407,7 @@ export const data = [ }, }, Config: { - writeKey: 'abcdefghijklmnopqrstuvwxyz', + writeKey: secret1, }, Enabled: true, Transformations: [], @@ -458,7 +459,7 @@ export const data = [ endpoint: 'https://track.attributionapp.com/v1/import', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6', + Authorization: authHeader1, }, params: {}, body: { @@ -532,7 +533,7 @@ export const data = [ }, }, Config: { - writeKey: 'abcdefghijklmnopqrstuvwxyz', + writeKey: secret1, }, Enabled: true, Transformations: [], @@ -582,7 +583,7 @@ export const data = [ endpoint: 'https://track.attributionapp.com/v1/import', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/attribution/maskedSecrets.ts b/test/integrations/destinations/attribution/maskedSecrets.ts new file mode 100644 index 00000000000..ba0b28ba8a1 --- /dev/null +++ b/test/integrations/destinations/attribution/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + '')}`; diff --git a/test/integrations/destinations/autopilot/processor/data.ts b/test/integrations/destinations/autopilot/processor/data.ts index 135e3e22f74..0c4edb30203 100644 --- a/test/integrations/destinations/autopilot/processor/data.ts +++ b/test/integrations/destinations/autopilot/processor/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'autopilot', @@ -23,7 +25,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [ { from: '0001', @@ -105,7 +107,7 @@ export const data = [ endpoint: 'https://api2.autopilothq.com/v1/contact', headers: { Accept: 'application/json', - autopilotapikey: 'dummyApiKey', + autopilotapikey: defaultApiKey, 'Content-Type': 'application/json', }, params: {}, @@ -160,7 +162,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [ { from: '0001', @@ -248,7 +250,7 @@ export const data = [ 'https://api2.autopilothq.com/v1/trigger/00XX/contact/testmp@rudderstack.com', headers: { Accept: 'application/json', - autopilotapikey: 'dummyApiKey', + autopilotapikey: defaultApiKey, 'Content-Type': 'application/json', }, params: {}, @@ -300,7 +302,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [ { from: '0001', @@ -426,7 +428,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [ { from: '0001', @@ -551,7 +553,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [ { from: '0001', @@ -675,7 +677,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [ { from: '0001', @@ -801,7 +803,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [ { from: '0001', @@ -881,7 +883,7 @@ export const data = [ endpoint: 'https://api2.autopilothq.com/v1/contact', headers: { Accept: 'application/json', - autopilotapikey: 'dummyApiKey', + autopilotapikey: defaultApiKey, 'Content-Type': 'application/json', }, params: {}, @@ -933,7 +935,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [ { from: '0001', @@ -1058,7 +1060,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [ { from: '0001', @@ -1177,7 +1179,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [ { from: '0001', diff --git a/test/integrations/destinations/autopilot/router/data.ts b/test/integrations/destinations/autopilot/router/data.ts index 92117a97c80..f05bb198902 100644 --- a/test/integrations/destinations/autopilot/router/data.ts +++ b/test/integrations/destinations/autopilot/router/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'autopilot', @@ -20,7 +22,7 @@ export const data = [ Config: { excludeKeys: [], includeKeys: [] }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [{ from: '0001', to: 'Signup' }], triggerId: '00XX', }, @@ -76,7 +78,7 @@ export const data = [ Config: { excludeKeys: [], includeKeys: [] }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [{ from: '0001', to: 'Signup' }], triggerId: '00XX', }, @@ -141,7 +143,7 @@ export const data = [ method: 'POST', endpoint: 'https://api2.autopilothq.com/v1/contact', headers: { - autopilotapikey: 'dummyApiKey', + autopilotapikey: defaultApiKey, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -174,7 +176,7 @@ export const data = [ Config: { excludeKeys: [], includeKeys: [] }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [{ from: '0001', to: 'Signup' }], triggerId: '00XX', }, @@ -191,7 +193,7 @@ export const data = [ endpoint: 'https://api2.autopilothq.com/v1/trigger/00XX/contact/testmp@rudderstack.com', headers: { - autopilotapikey: 'dummyApiKey', + autopilotapikey: defaultApiKey, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -218,7 +220,7 @@ export const data = [ Config: { excludeKeys: [], includeKeys: [] }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, customMappings: [{ from: '0001', to: 'Signup' }], triggerId: '00XX', }, diff --git a/test/integrations/destinations/bloomreach/common.ts b/test/integrations/destinations/bloomreach/common.ts index 798e744cbcb..a9acceff6e0 100644 --- a/test/integrations/destinations/bloomreach/common.ts +++ b/test/integrations/destinations/bloomreach/common.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from './maskedSecrets'; import { Destination } from '../../../../src/types'; const destType = 'bloomreach'; @@ -7,8 +8,8 @@ const channel = 'web'; const destination: Destination = { Config: { apiBaseUrl: 'https://demoapp-api.bloomreach.com', - apiKey: 'test-api-key', - apiSecret: 'test-api-secret', + apiKey: secret1, + apiSecret: secret2, projectToken: 'test-project-token', hardID: 'registered', softID: 'cookie', @@ -82,7 +83,7 @@ const proxyV1RetryableErrorStatTags = { const headers = { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdC1hcGkta2V5OnRlc3QtYXBpLXNlY3JldA==', + Authorization: authHeader1, }; export { diff --git a/test/integrations/destinations/bloomreach/dataDelivery/other.ts b/test/integrations/destinations/bloomreach/dataDelivery/other.ts index f0dd9cc09a4..9a46448aedb 100644 --- a/test/integrations/destinations/bloomreach/dataDelivery/other.ts +++ b/test/integrations/destinations/bloomreach/dataDelivery/other.ts @@ -34,8 +34,13 @@ export const otherProxyV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"message":"Service Unavailable","description":"The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later."}}', + error: JSON.stringify({ + error: { + message: 'Service Unavailable', + description: + 'The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later.', + }, + }), statusCode: 503, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/bloomreach/maskedSecrets.ts b/test/integrations/destinations/bloomreach/maskedSecrets.ts new file mode 100644 index 00000000000..156e87fe1e6 --- /dev/null +++ b/test/integrations/destinations/bloomreach/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; diff --git a/test/integrations/destinations/bloomreach/processor/identify.ts b/test/integrations/destinations/bloomreach/processor/identify.ts index 2a79cb57e38..cf9486081b7 100644 --- a/test/integrations/destinations/bloomreach/processor/identify.ts +++ b/test/integrations/destinations/bloomreach/processor/identify.ts @@ -30,6 +30,7 @@ export const identify: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -107,6 +108,7 @@ export const identify: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/bloomreach/processor/page.ts b/test/integrations/destinations/bloomreach/processor/page.ts index 3081feeb26a..ae454ba3ef3 100644 --- a/test/integrations/destinations/bloomreach/processor/page.ts +++ b/test/integrations/destinations/bloomreach/processor/page.ts @@ -40,6 +40,7 @@ export const page: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -97,6 +98,7 @@ export const page: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/bloomreach/processor/track.ts b/test/integrations/destinations/bloomreach/processor/track.ts index a369f508b23..bca516a3b4c 100644 --- a/test/integrations/destinations/bloomreach/processor/track.ts +++ b/test/integrations/destinations/bloomreach/processor/track.ts @@ -30,6 +30,7 @@ export const track: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -87,6 +88,7 @@ export const track: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -142,6 +144,7 @@ export const track: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/bloomreach/processor/validation.ts b/test/integrations/destinations/bloomreach/processor/validation.ts index 1a6199abb06..dcd36908377 100644 --- a/test/integrations/destinations/bloomreach/processor/validation.ts +++ b/test/integrations/destinations/bloomreach/processor/validation.ts @@ -34,6 +34,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -78,6 +79,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -118,6 +120,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -162,6 +165,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/bloomreach_catalog/common.ts b/test/integrations/destinations/bloomreach_catalog/common.ts index 2b4266837b5..49853d17d2f 100644 --- a/test/integrations/destinations/bloomreach_catalog/common.ts +++ b/test/integrations/destinations/bloomreach_catalog/common.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from './maskedSecrets'; import { Destination } from '../../../../src/types'; const destType = 'bloomreach_catalog'; @@ -7,8 +8,8 @@ const channel = 'web'; const destination: Destination = { Config: { apiBaseUrl: 'https://demoapp-api.bloomreach.com', - apiKey: 'test-api-key', - apiSecret: 'test-api-secret', + apiKey: secret1, + apiSecret: secret2, projectToken: 'test-project-token', catalogID: 'test-catalog-id', }, @@ -58,7 +59,7 @@ const proxyV1RetryableErrorStatTags = { const headers = { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdC1hcGkta2V5OnRlc3QtYXBpLXNlY3JldA==', + Authorization: authHeader1, }; const sampleContext = { diff --git a/test/integrations/destinations/bloomreach_catalog/dataDelivery/data.ts b/test/integrations/destinations/bloomreach_catalog/dataDelivery/data.ts index f8cccd04ed2..83d861e76c7 100644 --- a/test/integrations/destinations/bloomreach_catalog/dataDelivery/data.ts +++ b/test/integrations/destinations/bloomreach_catalog/dataDelivery/data.ts @@ -21,8 +21,10 @@ export const data: ProxyV1TestData[] = [ params: {}, JSON: {}, JSON_ARRAY: { - batch: - '[{"item_id":"test-item-id","properties":{"unprinted":"1"}},{"item_id":"test-item-id-faulty","properties":{"unprinted1":"1"}}]', + batch: JSON.stringify([ + { item_id: 'test-item-id', properties: { unprinted: '1' } }, + { item_id: 'test-item-id-faulty', properties: { unprinted1: '1' } }, + ]), }, endpoint: updateEndpoint, }, @@ -89,8 +91,10 @@ export const data: ProxyV1TestData[] = [ params: {}, JSON: {}, JSON_ARRAY: { - batch: - '[{"item_id":"test-item-id-1","properties":{"unprinted":"1"}},{"item_id":"test-item-id-2","properties":{"unprinted":"2"}}]', + batch: JSON.stringify([ + { item_id: 'test-item-id-1', properties: { unprinted: '1' } }, + { item_id: 'test-item-id-2', properties: { unprinted: '2' } }, + ]), }, endpoint: updateEndpoint, }, @@ -154,7 +158,9 @@ export const data: ProxyV1TestData[] = [ params: {}, JSON: {}, JSON_ARRAY: { - batch: '[{"item_id":"test-item-id-faulty","properties":{"unprinted1":"1"}}]', + batch: JSON.stringify([ + { item_id: 'test-item-id-faulty', properties: { unprinted1: '1' } }, + ]), }, endpoint: updateEndpoint, }, diff --git a/test/integrations/destinations/bloomreach_catalog/maskedSecrets.ts b/test/integrations/destinations/bloomreach_catalog/maskedSecrets.ts new file mode 100644 index 00000000000..156e87fe1e6 --- /dev/null +++ b/test/integrations/destinations/bloomreach_catalog/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; diff --git a/test/integrations/destinations/bloomreach_catalog/router/data.ts b/test/integrations/destinations/bloomreach_catalog/router/data.ts index 68ab4224444..2bba2849773 100644 --- a/test/integrations/destinations/bloomreach_catalog/router/data.ts +++ b/test/integrations/destinations/bloomreach_catalog/router/data.ts @@ -211,8 +211,27 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"item_id":"test-item-id","properties":{"title":"Hardcover Monthbooks","status":"up to date","unprinted":1}},{"item_id":"test-item-id-7","properties":{"title":"Hardcover Monthbooks","status":"up to date","unprinted":1,"test_empty":"","test_null":null,"test_empty_array":[]}}]', + batch: JSON.stringify([ + { + item_id: 'test-item-id', + properties: { + title: 'Hardcover Monthbooks', + status: 'up to date', + unprinted: 1, + }, + }, + { + item_id: 'test-item-id-7', + properties: { + title: 'Hardcover Monthbooks', + status: 'up to date', + unprinted: 1, + test_empty: '', + test_null: null, + test_empty_array: [], + }, + }, + ]), }, XML: {}, FORM: {}, @@ -235,8 +254,24 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"item_id":"test-item-id","properties":{"title":"Hardcover Monthbooks","status":"up to date","unprinted":3}},{"item_id":"test-item-id","properties":{"title":"Hardcover Monthbooks","status":"up to date","unprinted":2}}]', + batch: JSON.stringify([ + { + item_id: 'test-item-id', + properties: { + title: 'Hardcover Monthbooks', + status: 'up to date', + unprinted: 3, + }, + }, + { + item_id: 'test-item-id', + properties: { + title: 'Hardcover Monthbooks', + status: 'up to date', + unprinted: 2, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -259,7 +294,7 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: '["test-item-id-1","test-item-id-2"]', + batch: JSON.stringify(['test-item-id-1', 'test-item-id-2']), }, XML: {}, FORM: {}, @@ -282,7 +317,7 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: '["test-item-id-3"]', + batch: JSON.stringify(['test-item-id-3']), }, XML: {}, FORM: {}, diff --git a/test/integrations/destinations/bluecore/identifyTestData.ts b/test/integrations/destinations/bluecore/identifyTestData.ts index fee27ccf0fa..dbc6c3967c3 100644 --- a/test/integrations/destinations/bluecore/identifyTestData.ts +++ b/test/integrations/destinations/bluecore/identifyTestData.ts @@ -237,7 +237,7 @@ export const identifyData = [ body: [ { error: - "[Bluecore] traits.action must be 'identify' for identify action: Workflow: procWorkflow, Step: prepareIdentifyPayload, ChildStep: undefined, OriginalError: [Bluecore] traits.action must be 'identify' for identify action", + "[Bluecore] traits.action must be 'identify' for identify action: Workflow: procWorkflow, Step: prepareIdentifyPayload, ChildStep: undefined, OriginalError: [Bluecore] traits.action must be 'identify' for identify action", metadata: { destinationId: '', destinationType: '', diff --git a/test/integrations/destinations/blueshift/maskedSecrets.ts b/test/integrations/destinations/blueshift/maskedSecrets.ts new file mode 100644 index 00000000000..5c76d3abeb9 --- /dev/null +++ b/test/integrations/destinations/blueshift/maskedSecrets.ts @@ -0,0 +1,7 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1)}`; +export const authHeader2 = `Basic ${base64Convertor(secret2)}`; diff --git a/test/integrations/destinations/blueshift/processor/data.ts b/test/integrations/destinations/blueshift/processor/data.ts index be235216217..803da039896 100644 --- a/test/integrations/destinations/blueshift/processor/data.ts +++ b/test/integrations/destinations/blueshift/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, authHeader2, secret2 } from '../maskedSecrets'; export const data = [ { name: 'blueshift', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, dataCenter: 'standard', }, }, @@ -91,7 +92,7 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', dataCenter: 'standard', }, @@ -133,7 +134,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getblueshift.com/api/v1/event', headers: { - Authorization: 'Basic ZWZlYjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q2MjBlYzE=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -169,8 +170,8 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', - usersApiKey: 'b4a29aba5e75d99c8a18acd920ec1e2e', + eventApiKey: secret1, + usersApiKey: secret2, dataCenter: 'standard', }, }, @@ -230,7 +231,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getblueshift.com/api/v1/event', headers: { - Authorization: 'Basic ZWZlYjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q2MjBlYzE=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -276,7 +277,7 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', dataCenter: 'standard', }, @@ -378,7 +379,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getblueshift.com/api/v1/event', headers: { - Authorization: 'Basic ZWZlYjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q2MjBlYzE=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -443,7 +444,7 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', dataCenter: 'eu', }, @@ -541,7 +542,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.eu.getblueshift.com/api/v1/event', headers: { - Authorization: 'Basic ZWZlYjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q2MjBlYzE=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -602,7 +603,7 @@ export const data = [ { destination: { Config: { - usersApiKey: 'b4a29aba5e75d99c8a18acd920ec1e2e', + usersApiKey: secret2, dataCenter: 'standard', }, }, @@ -684,7 +685,7 @@ export const data = [ destination: { Config: { eventApiKey: 'a5e75d99c8a18acb4a29abd920ec1e2e', - usersApiKey: 'b4a29aba5e75d99c8a18acd920ec1e2e', + usersApiKey: secret2, dataCenter: 'standard', }, }, @@ -766,7 +767,7 @@ export const data = [ destination: { Config: { eventApiKey: 'a5e75d99c8a18acb4a29abd920ec1e2e', - usersApiKey: 'b4a29aba5e75d99c8a18acd920ec1e2e', + usersApiKey: secret2, dataCenter: 'standard', }, }, @@ -852,7 +853,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getblueshift.com/api/v1/customers', headers: { - Authorization: 'Basic YjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q5MjBlYzFlMmU=', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: {}, @@ -1023,7 +1024,7 @@ export const data = [ destination: { Config: { eventApiKey: 'a5e75d99c8a18acb4a29abd920ec1e2e', - usersApiKey: 'b4a29aba5e75d99c8a18acd920ec1e2e', + usersApiKey: secret2, dataCenter: 'eu', }, }, @@ -1070,7 +1071,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.eu.getblueshift.com/api/v1/customers', headers: { - Authorization: 'Basic YjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q5MjBlYzFlMmU=', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: {}, @@ -1112,7 +1113,7 @@ export const data = [ destination: { Config: { eventApiKey: 'a5e75d99c8a18acb4a29abd920ec1e2e', - usersApiKey: 'b4a29aba5e75d99c8a18acd920ec1e2e', + usersApiKey: secret2, dataCenter: 'eu', }, }, @@ -1180,7 +1181,7 @@ export const data = [ destination: { Config: { eventApiKey: 'a5e75d99c8a18acb4a29abd920ec1e2e', - usersApiKey: 'b4a29aba5e75d99c8a18acd920ec1e2e', + usersApiKey: secret2, dataCenter: 'eu', }, }, @@ -1248,7 +1249,7 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', dataCenter: 'eu', }, @@ -1347,7 +1348,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.eu.getblueshift.com/api/v1/event', headers: { - Authorization: 'Basic ZWZlYjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q2MjBlYzE=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1411,8 +1412,8 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', - usersApiKey: 'b4a29aba5e75d99c8a18acd920ec1e2e', + eventApiKey: secret1, + usersApiKey: secret2, dataCenter: 'eu', }, }, @@ -1472,7 +1473,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.eu.getblueshift.com/api/v1/event', headers: { - Authorization: 'Basic ZWZlYjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q2MjBlYzE=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1518,7 +1519,7 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', dataCenter: 'eu', }, @@ -1639,7 +1640,7 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', dataCenter: 'eu', }, @@ -1760,7 +1761,7 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', dataCenter: 'standard', }, @@ -1845,7 +1846,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getblueshift.com/api/v1/event', headers: { - Authorization: 'Basic ZWZlYjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q2MjBlYzE=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, diff --git a/test/integrations/destinations/blueshift/router/data.ts b/test/integrations/destinations/blueshift/router/data.ts index 7104beb873f..7f9b1645223 100644 --- a/test/integrations/destinations/blueshift/router/data.ts +++ b/test/integrations/destinations/blueshift/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, authHeader2, secret2 } from '../maskedSecrets'; export const data = [ { name: 'blueshift', @@ -12,7 +13,7 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', datacenterEU: false, }, @@ -44,7 +45,7 @@ export const data = [ { destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', datacenterEU: false, }, @@ -86,7 +87,7 @@ export const data = [ destination: { Config: { eventApiKey: 'a5e75d99c8a18acb4a29abd920ec1e2e', - usersApiKey: 'b4a29aba5e75d99c8a18acd920ec1e2e', + usersApiKey: secret2, datacenterEU: false, }, }, @@ -164,7 +165,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getblueshift.com/api/v1/event', headers: { - Authorization: 'Basic ZWZlYjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q2MjBlYzE=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -186,7 +187,7 @@ export const data = [ statusCode: 200, destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', datacenterEU: false, }, @@ -221,7 +222,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic ZWZlYjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q2MjBlYzE=', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.getblueshift.com/api/v1/event', @@ -231,7 +232,7 @@ export const data = [ statusCode: 200, destination: { Config: { - eventApiKey: 'efeb4a29aba5e75d99c8a18acd620ec1', + eventApiKey: secret1, usersApiKey: 'b4a29aba5e75duic8a18acd920ec1e2e', datacenterEU: false, }, @@ -244,7 +245,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getblueshift.com/api/v1/customers', headers: { - Authorization: 'Basic YjRhMjlhYmE1ZTc1ZDk5YzhhMThhY2Q5MjBlYzFlMmU=', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: {}, @@ -291,7 +292,7 @@ export const data = [ destination: { Config: { eventApiKey: 'a5e75d99c8a18acb4a29abd920ec1e2e', - usersApiKey: 'b4a29aba5e75d99c8a18acd920ec1e2e', + usersApiKey: secret2, datacenterEU: false, }, }, diff --git a/test/integrations/destinations/branch/processor/data.ts b/test/integrations/destinations/branch/processor/data.ts index dc1bdd33bca..ba8fb3f6d19 100644 --- a/test/integrations/destinations/branch/processor/data.ts +++ b/test/integrations/destinations/branch/processor/data.ts @@ -1,7 +1,53 @@ -export const data = [ +/** + * Auto-migrated and optimized test cases + * Generated on: 2024-12-30T11:04:59.426Z + */ + +import { ProcessorTestData } from '../../../testTypes'; +import { Metadata } from '../../../../../src/types'; + +const baseMetadata: Partial = { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-30T11:04:58.693Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, +}; + +export const data: ProcessorTestData[] = [ { + id: 'processor-1735556699424', name: 'branch', description: 'Test 0', + scenario: + 'Success scenario where the event will be mapped to standard event through default mappings', + successCriteria: 'Should hit the standard endpoint', feature: 'processor', module: 'destination', version: 'v0', @@ -9,21 +55,6 @@ export const data = [ request: { body: [ { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, message: { anonymousId: 'sampath', channel: 'web', @@ -80,8 +111,30 @@ export const data = [ type: 'track', userId: 'sampath', }, + metadata: baseMetadata, + destination: { + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'branch test', + DestinationDefinition: { + DisplayName: 'Branch Metrics', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'BRANCH', + Config: {}, + }, + Config: { + branchKey: '', + useNativeSDK: false, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], + method: 'POST', }, }, output: { @@ -129,6 +182,7 @@ export const data = [ files: {}, userId: 'sampath', }, + metadata: baseMetadata, statusCode: 200, }, ], @@ -136,8 +190,11 @@ export const data = [ }, }, { + id: 'processor-1735556699424', name: 'branch', description: 'Test 1', + scenario: 'Success scenario with identify event', + successCriteria: 'Should hit the custom endpoint with userId as event name', feature: 'processor', module: 'destination', version: 'v0', @@ -145,21 +202,6 @@ export const data = [ request: { body: [ { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, message: { anonymousId: 'sampath', channel: 'web', @@ -212,8 +254,30 @@ export const data = [ type: 'identify', userId: 'sampath', }, + metadata: baseMetadata, + destination: { + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'branch test', + DestinationDefinition: { + DisplayName: 'Branch Metrics', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'BRANCH', + Config: {}, + }, + Config: { + branchKey: '', + useNativeSDK: false, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], + method: 'POST', }, }, output: { @@ -261,6 +325,7 @@ export const data = [ files: {}, userId: 'sampath', }, + metadata: baseMetadata, statusCode: 200, }, ], @@ -268,8 +333,11 @@ export const data = [ }, }, { + id: 'processor-1735556699424', name: 'branch', description: 'Test 2', + scenario: 'Default processor scenario', + successCriteria: 'Processor test should pass successfully', feature: 'processor', module: 'destination', version: 'v0', @@ -277,112 +345,6 @@ export const data = [ request: { body: [ { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, - message: { - anonymousId: 'sampath', - channel: 'web', - context: { - app: { - build: '1.0.0', - name: 'RudderLabs JavaScript SDK', - namespace: 'com.rudderlabs.javascript', - version: '1.0.0', - }, - ip: '0.0.0.0', - library: { - name: 'RudderLabs JavaScript SDK', - version: '1.0.0', - }, - locale: 'en-US', - os: { - name: '', - version: '', - }, - screen: { - density: 2, - }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - integrations: { - All: true, - }, - traits: { - anonymousId: 'sampath', - email: 'sampath@gmail.com', - }, - messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', - originalTimestamp: '2020-01-17T04:53:51.185Z', - receivedAt: '2020-01-17T10:23:52.688+05:30', - request_ip: '[::1]:64059', - sentAt: '2020-01-17T04:53:52.667Z', - timestamp: '2020-01-17T10:23:51.206+05:30', - type: 'page', - userId: 'sampath', - }, - }, - ], - }, - }, - output: { - response: { - status: 200, - body: [ - { - statusCode: 400, - statTags: { - destType: 'BRANCH', - errorCategory: 'dataValidation', - errorType: 'instrumentation', - feature: 'processor', - implementation: 'native', - module: 'destination', - }, - error: 'Message type is not supported', - }, - ], - }, - }, - }, - { - name: 'branch', - description: 'Test 3', - feature: 'processor', - module: 'destination', - version: 'v0', - input: { - request: { - body: [ - { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, message: { anonymousId: 'sampath', channel: 'web', @@ -409,7 +371,7 @@ export const data = [ }, locale: 'en-US', os: { - name: 'watchos', + name: 'tvos', }, screen: { density: 2, @@ -437,8 +399,30 @@ export const data = [ type: 'track', userId: 'sampath', }, + metadata: baseMetadata, + destination: { + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'branch test', + DestinationDefinition: { + DisplayName: 'Branch Metrics', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'BRANCH', + Config: {}, + }, + Config: { + branchKey: '', + useNativeSDK: false, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], + method: 'POST', }, }, output: { @@ -464,7 +448,7 @@ export const data = [ }, ], user_data: { - os: 'watchos', + os: 'tvos', app_version: '1.0.0', screen_dpi: 2, developer_identity: 'sampath', @@ -485,6 +469,7 @@ export const data = [ files: {}, userId: 'sampath', }, + metadata: baseMetadata, statusCode: 200, }, ], @@ -492,8 +477,11 @@ export const data = [ }, }, { + id: 'processor-1735556699424', name: 'branch', - description: 'Test 4', + description: 'Test 3', + scenario: 'Successful scenario with track event but without any products', + successCriteria: 'The transformed payload should not contain any content_items', feature: 'processor', module: 'destination', version: 'v0', @@ -501,21 +489,6 @@ export const data = [ request: { body: [ { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, message: { anonymousId: 'sampath', channel: 'web', @@ -533,6 +506,7 @@ export const data = [ manufacturer: 'Google', model: 'AOSP on IA Emulator', name: 'generic_x86_arm', + type: 'ios', attTrackingStatus: 3, }, ip: '0.0.0.0', @@ -542,7 +516,8 @@ export const data = [ }, locale: 'en-US', os: { - name: 'ipados', + name: 'iOS', + version: '14.4.1', }, screen: { density: 2, @@ -560,9 +535,6 @@ export const data = [ }, messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', originalTimestamp: '2020-01-17T04:53:51.185Z', - properties: { - name: 'sampath', - }, receivedAt: '2020-01-17T10:23:52.688+05:30', request_ip: '[::1]:64059', sentAt: '2020-01-17T04:53:52.667Z', @@ -570,8 +542,30 @@ export const data = [ type: 'track', userId: 'sampath', }, + metadata: baseMetadata, + destination: { + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'branch test', + DestinationDefinition: { + DisplayName: 'Branch Metrics', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'BRANCH', + Config: {}, + }, + Config: { + branchKey: '', + useNativeSDK: false, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], + method: 'POST', }, }, output: { @@ -591,13 +585,9 @@ export const data = [ params: {}, body: { JSON: { - content_items: [ - { - $product_name: 'sampath', - }, - ], user_data: { - os: 'ipados', + os: 'iOS', + os_version: '14.4.1', app_version: '1.0.0', screen_dpi: 2, developer_identity: 'sampath', @@ -618,6 +608,7 @@ export const data = [ files: {}, userId: 'sampath', }, + metadata: baseMetadata, statusCode: 200, }, ], @@ -625,8 +616,11 @@ export const data = [ }, }, { + id: 'processor-1735556699425', name: 'branch', - description: 'Test 5', + description: 'Test 4', + scenario: 'Failure scenario when event name is not present', + successCriteria: 'Should return error message for missing event name', feature: 'processor', module: 'destination', version: 'v0', @@ -634,31 +628,10 @@ export const data = [ request: { body: [ { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, message: { anonymousId: 'sampath', channel: 'web', context: { - app: { - build: '1.0.0', - name: 'RudderLabs JavaScript SDK', - namespace: 'com.rudderlabs.javascript', - version: '1.0.0', - }, device: { adTrackingEnabled: true, advertisingId: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', @@ -666,6 +639,7 @@ export const data = [ manufacturer: 'Google', model: 'AOSP on IA Emulator', name: 'generic_x86_arm', + type: 'ios', attTrackingStatus: 3, }, ip: '0.0.0.0', @@ -675,10 +649,8 @@ export const data = [ }, locale: 'en-US', os: { - name: 'tvos', - }, - screen: { - density: 2, + name: 'iOS', + version: '14.4.1', }, traits: { anonymousId: 'sampath', @@ -687,753 +659,42 @@ export const data = [ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', }, - event: 'product added', integrations: { All: true, }, messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', originalTimestamp: '2020-01-17T04:53:51.185Z', - properties: { - name: 'sampath', - }, - receivedAt: '2020-01-17T10:23:52.688+05:30', - request_ip: '[::1]:64059', - sentAt: '2020-01-17T04:53:52.667Z', - timestamp: '2020-01-17T10:23:51.206+05:30', - type: 'track', - userId: 'sampath', - }, - }, - ], - }, - }, - output: { - response: { - status: 200, - body: [ - { - output: { - version: '1', - type: 'REST', - method: 'POST', - endpoint: 'https://api2.branch.io/v2/event/standard', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - params: {}, - body: { - JSON: { - content_items: [ - { - $product_name: 'sampath', - }, - ], - user_data: { - os: 'tvos', - app_version: '1.0.0', - screen_dpi: 2, - developer_identity: 'sampath', - idfa: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - idfv: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - limit_ad_tracking: false, - model: 'AOSP on IA Emulator', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - name: 'ADD_TO_CART', - branch_key: '', - }, - JSON_ARRAY: {}, - XML: {}, - FORM: {}, - }, - files: {}, - userId: 'sampath', - }, - statusCode: 200, - }, - ], - }, - }, - }, - { - name: 'branch', - description: 'Test 6', - feature: 'processor', - module: 'destination', - version: 'v0', - input: { - request: { - body: [ - { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, - message: { - anonymousId: 'sampath', - channel: 'web', - context: { - app: { - build: '1.0.0', - name: 'RudderLabs JavaScript SDK', - namespace: 'com.rudderlabs.javascript', - version: '1.0.0', - }, - device: { - adTrackingEnabled: true, - advertisingId: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - manufacturer: 'Google', - model: 'AOSP on IA Emulator', - name: 'generic_x86_arm', - type: 'ios', - attTrackingStatus: 3, - }, - ip: '0.0.0.0', - library: { - name: 'RudderLabs JavaScript SDK', - version: '1.0.0', - }, - locale: 'en-US', - os: { - name: 'iOS', - version: '14.4.1', - }, - screen: { - density: 2, - }, - traits: { - anonymousId: 'sampath', - email: 'sampath@gmail.com', - }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - event: 'product added', - integrations: { - All: true, - }, - messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', - originalTimestamp: '2020-01-17T04:53:51.185Z', - receivedAt: '2020-01-17T10:23:52.688+05:30', - request_ip: '[::1]:64059', - sentAt: '2020-01-17T04:53:52.667Z', - timestamp: '2020-01-17T10:23:51.206+05:30', - type: 'track', - userId: 'sampath', - }, - }, - ], - }, - }, - output: { - response: { - status: 200, - body: [ - { - output: { - version: '1', - type: 'REST', - method: 'POST', - endpoint: 'https://api2.branch.io/v2/event/standard', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - params: {}, - body: { - JSON: { - user_data: { - os: 'iOS', - os_version: '14.4.1', - app_version: '1.0.0', - screen_dpi: 2, - developer_identity: 'sampath', - idfa: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - idfv: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - limit_ad_tracking: false, - model: 'AOSP on IA Emulator', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - name: 'ADD_TO_CART', - branch_key: '', - }, - JSON_ARRAY: {}, - XML: {}, - FORM: {}, - }, - files: {}, - userId: 'sampath', - }, - statusCode: 200, - }, - ], - }, - }, - }, - { - name: 'branch', - description: 'Test 7', - feature: 'processor', - module: 'destination', - version: 'v0', - input: { - request: { - body: [ - { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, - message: { - anonymousId: 'sampath', - channel: 'web', - context: { - app: { - build: '1.0.0', - name: 'RudderLabs JavaScript SDK', - namespace: 'com.rudderlabs.javascript', - version: '1.0.0', - }, - device: { - adTrackingEnabled: true, - advertisingId: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - manufacturer: 'Google', - model: 'AOSP on IA Emulator', - name: 'generic_x86_arm', - type: 'ios', - attTrackingStatus: 3, - }, - ip: '0.0.0.0', - library: { - name: 'RudderLabs JavaScript SDK', - version: '1.0.0', - }, - locale: 'en-US', - screen: { - density: 2, - }, - traits: { - anonymousId: 'sampath', - email: 'sampath@gmail.com', - }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - event: 'product added', - integrations: { - All: true, - }, - messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', - originalTimestamp: '2020-01-17T04:53:51.185Z', - receivedAt: '2020-01-17T10:23:52.688+05:30', - request_ip: '[::1]:64059', - sentAt: '2020-01-17T04:53:52.667Z', - timestamp: '2020-01-17T10:23:51.206+05:30', - type: 'track', - userId: 'sampath', - }, - }, - ], - }, - }, - output: { - response: { - status: 200, - body: [ - { - output: { - version: '1', - type: 'REST', - method: 'POST', - endpoint: 'https://api2.branch.io/v2/event/standard', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - params: {}, - body: { - JSON: { - user_data: { - app_version: '1.0.0', - screen_dpi: 2, - developer_identity: 'sampath', - limit_ad_tracking: false, - model: 'AOSP on IA Emulator', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - name: 'ADD_TO_CART', - branch_key: '', - }, - JSON_ARRAY: {}, - XML: {}, - FORM: {}, - }, - files: {}, - userId: 'sampath', - }, - statusCode: 200, - }, - ], - }, - }, - }, - { - name: 'branch', - description: 'Test 8', - feature: 'processor', - module: 'destination', - version: 'v0', - input: { - request: { - body: [ - { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, - message: { - anonymousId: 'sampath', - channel: 'web', - context: { - device: { - adTrackingEnabled: true, - advertisingId: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - manufacturer: 'Google', - model: 'AOSP on IA Emulator', - name: 'generic_x86_arm', - type: 'ios', - attTrackingStatus: 3, - }, - ip: '0.0.0.0', - library: { - name: 'RudderLabs JavaScript SDK', - version: '1.0.0', - }, - locale: 'en-US', - os: { - name: 'iOS', - version: '14.4.1', - }, - traits: { - anonymousId: 'sampath', - email: 'sampath@gmail.com', - }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - event: 'product added', - integrations: { - All: true, - }, - messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', - originalTimestamp: '2020-01-17T04:53:51.185Z', - receivedAt: '2020-01-17T10:23:52.688+05:30', - request_ip: '[::1]:64059', - sentAt: '2020-01-17T04:53:52.667Z', - timestamp: '2020-01-17T10:23:51.206+05:30', - type: 'track', - userId: 'sampath', - }, - }, - ], - }, - }, - output: { - response: { - status: 200, - body: [ - { - output: { - version: '1', - type: 'REST', - method: 'POST', - endpoint: 'https://api2.branch.io/v2/event/standard', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - params: {}, - body: { - JSON: { - user_data: { - os: 'iOS', - os_version: '14.4.1', - developer_identity: 'sampath', - idfa: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - idfv: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - limit_ad_tracking: false, - model: 'AOSP on IA Emulator', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - name: 'ADD_TO_CART', - branch_key: '', - }, - JSON_ARRAY: {}, - XML: {}, - FORM: {}, - }, - files: {}, - userId: 'sampath', - }, - statusCode: 200, - }, - ], - }, - }, - }, - { - name: 'branch', - description: 'Test 9', - feature: 'processor', - module: 'destination', - version: 'v0', - input: { - request: { - body: [ - { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, - message: { - anonymousId: 'sampath', - channel: 'web', - context: { - device: { - adTrackingEnabled: true, - advertisingId: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - manufacturer: 'Google', - model: 'AOSP on IA Emulator', - name: 'generic_x86_arm', - type: 'ios', - attTrackingStatus: 3, - }, - ip: '0.0.0.0', - library: { - name: 'RudderLabs JavaScript SDK', - version: '1.0.0', - }, - locale: 'en-US', - os: { - name: 'iOS', - version: '14.4.1', - }, - traits: { - anonymousId: 'sampath', - email: 'sampath@gmail.com', - }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - integrations: { - All: true, - }, - messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', - originalTimestamp: '2020-01-17T04:53:51.185Z', - receivedAt: '2020-01-17T10:23:52.688+05:30', - request_ip: '[::1]:64059', - sentAt: '2020-01-17T04:53:52.667Z', - timestamp: '2020-01-17T10:23:51.206+05:30', - type: 'track', - userId: 'sampath', - }, - }, - ], - }, - }, - output: { - response: { - status: 200, - body: [ - { - statusCode: 400, - error: 'Event name is required', - statTags: { - destType: 'BRANCH', - errorCategory: 'dataValidation', - errorType: 'instrumentation', - feature: 'processor', - implementation: 'native', - module: 'destination', - }, - }, - ], - }, - }, - }, - { - name: 'branch', - description: 'Test 10', - feature: 'processor', - module: 'destination', - version: 'v0', - input: { - request: { - body: [ - { - destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, - message: { - anonymousId: 'sampath', - channel: 'web', - context: { - app: { - build: '1.0.0', - name: 'RudderLabs JavaScript SDK', - namespace: 'com.rudderlabs.javascript', - version: '1.0.0', - }, - device: { - adTrackingEnabled: true, - advertisingId: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - manufacturer: 'Google', - model: 'AOSP on IA Emulator', - name: 'generic_x86_arm', - type: 'Android', - attTrackingStatus: 2, - brand: 'testBrand', - }, - ip: '0.0.0.0', - library: { - name: 'RudderLabs JavaScript SDK', - version: '1.0.0', - }, - locale: 'en-US', - os: { - name: 'Android', - version: '9', - }, - screen: { - density: 2, - height: 1794, - width: 1080, - }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - integrations: { - All: true, - }, - traits: { - anonymousId: 'sampath', - email: 'sampath@gmail.com', - }, - messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', - originalTimestamp: '2020-01-17T04:53:51.185Z', receivedAt: '2020-01-17T10:23:52.688+05:30', request_ip: '[::1]:64059', sentAt: '2020-01-17T04:53:52.667Z', timestamp: '2020-01-17T10:23:51.206+05:30', - type: 'identify', - userId: 'sampath', - }, - }, - ], - }, - }, - output: { - response: { - status: 200, - body: [ - { - output: { - version: '1', - type: 'REST', - method: 'POST', - endpoint: 'https://api2.branch.io/v2/event/custom', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - params: {}, - body: { - JSON: { - custom_data: { - anonymousId: 'sampath', - email: 'sampath@gmail.com', - }, - content_items: [{}], - user_data: { - os: 'Android', - os_version: '9', - app_version: '1.0.0', - model: 'AOSP on IA Emulator', - brand: 'testBrand', - screen_dpi: 2, - screen_height: 1794, - screen_width: 1080, - developer_identity: 'sampath', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - android_id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - aaid: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - limit_ad_tracking: true, - }, - name: 'sampath', - branch_key: '', - }, - JSON_ARRAY: {}, - XML: {}, - FORM: {}, - }, - files: {}, + type: 'track', userId: 'sampath', }, - statusCode: 200, - }, - ], - }, - }, - }, - { - name: 'branch', - description: 'Test 11', - feature: 'processor', - module: 'destination', - version: 'v0', - input: { - request: { - body: [ - { + metadata: baseMetadata, destination: { - Config: { - branchKey: '', - useNativeSDK: false, - }, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'branch test', DestinationDefinition: { DisplayName: 'Branch Metrics', ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', Name: 'BRANCH', + Config: {}, + }, + Config: { + branchKey: '', + useNativeSDK: false, }, Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', + WorkspaceID: 'default-workspace', Transformations: [], - }, - message: { - anonymousId: 'sampath', - channel: 'web', - context: { - app: { - build: '1.0.0', - name: 'RudderLabs JavaScript SDK', - namespace: 'com.rudderlabs.javascript', - version: '1.0.0', - }, - device: { - adTrackingEnabled: true, - advertisingId: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - id: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - manufacturer: 'Google', - model: 'AOSP on IA Emulator', - name: 'generic_x86_arm', - type: 'ios', - attTrackingStatus: 2, - brand: 'testBrand', - }, - ip: '0.0.0.0', - library: { - name: 'RudderLabs JavaScript SDK', - version: '1.0.0', - }, - locale: 'en-US', - os: { - name: 'iOS', - version: '14.4.1', - }, - screen: { - density: 2, - height: 1794, - width: 1080, - }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - }, - integrations: { - All: true, - }, - traits: { - anonymousId: 'sampath', - email: 'sampath@gmail.com', - }, - messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', - originalTimestamp: '2020-01-17T04:53:51.185Z', - receivedAt: '2020-01-17T10:23:52.688+05:30', - request_ip: '[::1]:64059', - sentAt: '2020-01-17T04:53:52.667Z', - timestamp: '2020-01-17T10:23:51.206+05:30', - type: 'identify', - userId: 'sampath', + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, ], + method: 'POST', }, }, output: { @@ -1441,86 +702,38 @@ export const data = [ status: 200, body: [ { - output: { - version: '1', - type: 'REST', - method: 'POST', - endpoint: 'https://api2.branch.io/v2/event/custom', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - params: {}, - body: { - JSON: { - custom_data: { - anonymousId: 'sampath', - email: 'sampath@gmail.com', - }, - content_items: [{}], - user_data: { - os: 'iOS', - os_version: '14.4.1', - app_version: '1.0.0', - model: 'AOSP on IA Emulator', - brand: 'testBrand', - screen_dpi: 2, - screen_height: 1794, - screen_width: 1080, - developer_identity: 'sampath', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', - idfa: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - idfv: '3f034872-5e28-45a1-9eda-ce22a3e36d1a', - limit_ad_tracking: true, - }, - name: 'sampath', - branch_key: '', - }, - JSON_ARRAY: {}, - XML: {}, - FORM: {}, - }, - files: {}, - userId: 'sampath', + metadata: baseMetadata, + statusCode: 400, + error: 'Event name is required', + statTags: { + destType: 'BRANCH', + destinationId: 'default-destination', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + workspaceId: 'default-workspace', }, - statusCode: 200, }, ], }, }, }, { + id: 'processor-1735556699425', name: 'branch', - description: 'Map event name to branch standard event name in track call', + description: 'Test 5', + scenario: 'Default processor scenario', + successCriteria: 'Processor test should pass successfully', feature: 'processor', module: 'destination', version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - Config: { - branchKey: 'test_branch_key', - eventsMapping: [ - { - from: 'Order Completed', - to: 'PURCHASE', - }, - ], - useNativeSDK: false, - }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, message: { anonymousId: 'anonId123', channel: 'web', @@ -1561,7 +774,7 @@ export const data = [ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', }, - event: 'Order Completed', + event: 'Some Random Event', integrations: { All: true, }, @@ -1582,6 +795,33 @@ export const data = [ type: 'track', userId: 'userId123', }, + metadata: baseMetadata, + destination: { + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'branch test', + DestinationDefinition: { + DisplayName: 'Branch Metrics', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'BRANCH', + Config: {}, + }, + Config: { + branchKey: 'test_branch_key', + eventsMapping: [ + { + from: 'Some Random Event', + to: 'PURCHASE', + }, + ], + useNativeSDK: false, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], }, @@ -1640,6 +880,7 @@ export const data = [ files: {}, userId: 'anonId123', }, + metadata: baseMetadata, statusCode: 200, }, ], diff --git a/test/integrations/destinations/branch/router/data.ts b/test/integrations/destinations/branch/router/data.ts index 6451c463f18..3076adf1758 100644 --- a/test/integrations/destinations/branch/router/data.ts +++ b/test/integrations/destinations/branch/router/data.ts @@ -1,7 +1,18 @@ -export const data = [ +/** + * Auto-migrated and optimized test cases + * Generated on: 2024-12-30T12:23:26.084Z + */ + +import { RouterTestData } from '../../../testTypes'; +import { Metadata } from '../../../../../src/types'; + +export const data: RouterTestData[] = [ { + id: 'router-1735561406084', name: 'branch', description: 'Test 0', + scenario: 'Default router scenario', + successCriteria: 'Router test should pass successfully', feature: 'router', module: 'destination', version: 'v0', @@ -10,19 +21,6 @@ export const data = [ body: { input: [ { - destination: { - Config: { branchKey: '', useNativeSDK: false }, - DestinationDefinition: { - DisplayName: 'Branch Metrics', - ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', - Name: 'BRANCH', - }, - Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', - Transformations: [], - }, - metadata: { jobId: 1, userId: 'u1' }, message: { anonymousId: 'sampath', channel: 'web', @@ -34,19 +32,34 @@ export const data = [ version: '1.0.0', }, ip: '0.0.0.0', - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, locale: 'en-US', - os: { name: 'iOS', version: '' }, - screen: { density: 2 }, - traits: { anonymousId: 'sampath', email: 'sampath@gmail.com' }, + os: { + name: 'iOS', + version: '', + }, + screen: { + density: 2, + }, + traits: { + anonymousId: 'sampath', + email: 'sampath@gmail.com', + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', }, event: 'product added', - integrations: { All: true }, + integrations: { + All: true, + }, messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', originalTimestamp: '2020-01-17T04:53:51.185Z', - properties: { name: 'sampath' }, + properties: { + name: 'sampath', + }, receivedAt: '2020-01-17T10:23:52.688+05:30', request_ip: '[::1]:64059', sentAt: '2020-01-17T04:53:52.667Z', @@ -54,21 +67,61 @@ export const data = [ type: 'track', userId: 'sampath', }, - }, - { + metadata: { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-30T12:23:25.430Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, destination: { - Config: { branchKey: '', useNativeSDK: false }, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'branch test', DestinationDefinition: { DisplayName: 'Branch Metrics', ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', Name: 'BRANCH', + Config: {}, + }, + Config: { + branchKey: '', + useNativeSDK: false, }, Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', + WorkspaceID: 'default-workspace', Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: { jobId: 2, userId: 'u1' }, + }, + { message: { anonymousId: 'sampath', channel: 'web', @@ -80,15 +133,28 @@ export const data = [ version: '1.0.0', }, ip: '0.0.0.0', - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, locale: 'en-US', - os: { name: 'iOS', version: '' }, - screen: { density: 2 }, + os: { + name: 'iOS', + version: '', + }, + screen: { + density: 2, + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36', }, - integrations: { All: true }, - traits: { anonymousId: 'sampath', email: 'sampath@gmail.com' }, + integrations: { + All: true, + }, + traits: { + anonymousId: 'sampath', + email: 'sampath@gmail.com', + }, messageId: 'ea5cfab2-3961-4d8a-8187-3d1858c90a9f', originalTimestamp: '2020-01-17T04:53:51.185Z', receivedAt: '2020-01-17T10:23:52.688+05:30', @@ -98,6 +164,59 @@ export const data = [ type: 'identify', userId: 'sampath', }, + metadata: { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 2, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-30T12:23:25.430Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + } as unknown as Metadata, + destination: { + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'branch test', + DestinationDefinition: { + DisplayName: 'Branch Metrics', + ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', + Name: 'BRANCH', + Config: {}, + }, + Config: { + branchKey: '', + useNativeSDK: false, + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], destType: 'branch', @@ -116,13 +235,20 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api2.branch.io/v2/event/standard', - headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + }, params: {}, body: { JSON: { branch_key: '', name: 'ADD_TO_CART', - content_items: [{ $product_name: 'sampath' }], + content_items: [ + { + $product_name: 'sampath', + }, + ], user_data: { os: 'iOS', os_version: '', @@ -140,21 +266,63 @@ export const data = [ files: {}, userId: 'sampath', }, - metadata: [{ jobId: 1, userId: 'u1' }], - batched: false, + metadata: [ + { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-30T12:23:25.430Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + ], statusCode: 200, destination: { - Config: { branchKey: '', useNativeSDK: false }, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'branch test', DestinationDefinition: { DisplayName: 'Branch Metrics', ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', Name: 'BRANCH', + Config: {}, + }, + Config: { + branchKey: '', + useNativeSDK: false, }, Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', + WorkspaceID: 'default-workspace', Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: false, }, { batchedRequest: { @@ -162,13 +330,19 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api2.branch.io/v2/event/custom', - headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + }, params: {}, body: { JSON: { branch_key: '', name: 'sampath', - custom_data: { anonymousId: 'sampath', email: 'sampath@gmail.com' }, + custom_data: { + anonymousId: 'sampath', + email: 'sampath@gmail.com', + }, content_items: [{}], user_data: { os: 'iOS', @@ -187,21 +361,63 @@ export const data = [ files: {}, userId: 'sampath', }, - metadata: [{ jobId: 2, userId: 'u1' }], - batched: false, + metadata: [ + { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 2, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2024-12-30T12:23:25.430Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, + }, + ], statusCode: 200, destination: { - Config: { branchKey: '', useNativeSDK: false }, + ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', + Name: 'branch test', DestinationDefinition: { DisplayName: 'Branch Metrics', ID: '1WTpBSTiL3iAUHUdW7rHT4sawgU', Name: 'BRANCH', + Config: {}, + }, + Config: { + branchKey: '', + useNativeSDK: false, }, Enabled: true, - ID: '1WTpIHpH7NTBgjeiUPW1kCUgZGI', - Name: 'branch test', + WorkspaceID: 'default-workspace', Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: false, }, ], }, diff --git a/test/integrations/destinations/braze/dataDelivery/business.ts b/test/integrations/destinations/braze/dataDelivery/business.ts index 4997c5ffaeb..a69a8fc20c8 100644 --- a/test/integrations/destinations/braze/dataDelivery/business.ts +++ b/test/integrations/destinations/braze/dataDelivery/business.ts @@ -1,6 +1,7 @@ import { ProxyMetdata } from '../../../../../src/types'; import { ProxyV1TestData } from '../../../testTypes'; import { generateMetadata, generateProxyV1Payload } from '../../../testUtils'; +import { authHeader1 } from '../maskedSecrets'; const BRAZE_USERS_TRACK_ENDPOINT = 'https://rest.iad-03.braze.com/users/track'; @@ -8,7 +9,7 @@ const partner = 'RudderStack'; const headers = { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }; @@ -128,7 +129,7 @@ const BrazePurchaseEvent = { const metadataArray = [generateMetadata(1), generateMetadata(2), generateMetadata(3)]; const errorMessages = { - message_1: '{"events_processed":2,"purchases_processed":1,"message":"success"}', + message_1: JSON.stringify({ events_processed: 2, purchases_processed: 1, message: 'success' }), message_2: '{"events_processed":1,"message":"success","errors":[{"type":"\'external_id\', \'braze_id\', \'user_alias\', \'email\' or \'phone\' is required","input_array":"events","index":1},{"type":"\'quantity\' is not valid","input_array":"purchases","index":0}]}', message_3: @@ -351,17 +352,17 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ output: { response: [ { - error: '{"message":"Invalid API Key"}', + error: JSON.stringify({ message: 'Invalid API Key' }), statusCode: 401, metadata: generateMetadata(1), }, { - error: '{"message":"Invalid API Key"}', + error: JSON.stringify({ message: 'Invalid API Key' }), statusCode: 401, metadata: generateMetadata(2), }, { - error: '{"message":"Invalid API Key"}', + error: JSON.stringify({ message: 'Invalid API Key' }), statusCode: 401, metadata: generateMetadata(3), }, diff --git a/test/integrations/destinations/braze/dataDelivery/data.ts b/test/integrations/destinations/braze/dataDelivery/data.ts index 2596a4b9592..1d46883b975 100644 --- a/test/integrations/destinations/braze/dataDelivery/data.ts +++ b/test/integrations/destinations/braze/dataDelivery/data.ts @@ -1,6 +1,7 @@ import MockAdapter from 'axios-mock-adapter'; import { testScenariosForV1API } from './business'; import { otherScenariosV1 } from './other'; +import { authHeader1 } from '../maskedSecrets'; export const existingTestData = [ { @@ -18,7 +19,7 @@ export const existingTestData = [ userId: 'gabi_userId_45', headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -79,7 +80,7 @@ export const existingTestData = [ userId: 'gabi_userId_45', headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -140,7 +141,7 @@ export const existingTestData = [ userId: 'gabi_userId_45', headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -211,7 +212,7 @@ export const existingTestData = [ userId: 'gabi_userId_45', headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -269,7 +270,7 @@ export const existingTestData = [ userId: 'gabi_userId_45', headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -337,7 +338,7 @@ export const existingTestData = [ userId: 'gabi_userId_45', headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -404,7 +405,7 @@ export const existingTestData = [ }, { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -431,7 +432,7 @@ export const existingTestData = [ userId: 'gabi_userId_45', headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -499,7 +500,7 @@ export const existingTestData = [ userId: 'gabi_userId_45', headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -549,7 +550,7 @@ export const existingTestData = [ message: 'Request for braze Processed Successfully', response: [ { - error: '{"aliases_processed":1,"message":"success"}', + error: JSON.stringify({ aliases_processed: 1, message: 'success' }), statusCode: 201, metadata: { jobId: 2, @@ -587,7 +588,7 @@ export const existingTestData = [ userId: 'gabi_userId_45', headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -637,7 +638,7 @@ export const existingTestData = [ status: 401, response: [ { - error: '{"code":400,"message":"Bad Req","status":"Fail Case"}', + error: JSON.stringify({ code: 400, message: 'Bad Req', status: 'Fail Case' }), statusCode: 401, metadata: { jobId: 2, @@ -686,7 +687,7 @@ export const existingTestData = [ userId: 'gabi_userId_45', headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { diff --git a/test/integrations/destinations/braze/dataDelivery/other.ts b/test/integrations/destinations/braze/dataDelivery/other.ts index 9353899a654..61e1a65da2f 100644 --- a/test/integrations/destinations/braze/dataDelivery/other.ts +++ b/test/integrations/destinations/braze/dataDelivery/other.ts @@ -38,8 +38,13 @@ export const otherScenariosV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"message":"Service Unavailable","description":"The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later."}}', + error: JSON.stringify({ + error: { + message: 'Service Unavailable', + description: + 'The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later.', + }, + }), statusCode: 503, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/braze/deleteUsers/data.ts b/test/integrations/destinations/braze/deleteUsers/data.ts index cad61fd12d8..ae2d65a8fab 100644 --- a/test/integrations/destinations/braze/deleteUsers/data.ts +++ b/test/integrations/destinations/braze/deleteUsers/data.ts @@ -1,3 +1,5 @@ +import { secret1, secret2 } from '../maskedSecrets'; + export const data = [ { name: 'braze', @@ -167,7 +169,7 @@ export const data = [ ], config: { dataCenter: 'US-03', - restApiKey: '1234', + restApiKey: secret2, }, }, ], @@ -353,7 +355,7 @@ export const data = [ ], config: { dataCenter: 'US-03', - restApiKey: '1234', + restApiKey: secret2, }, }, ], @@ -461,7 +463,7 @@ export const data = [ }, ], config: { - restApiKey: 'b1bd90e2-d203-480a-962c-f7bb03ea0afe', + restApiKey: secret1, dataCenter: 'US-03', }, }, diff --git a/test/integrations/destinations/braze/maskedSecrets.ts b/test/integrations/destinations/braze/maskedSecrets.ts new file mode 100644 index 00000000000..c598977b6a1 --- /dev/null +++ b/test/integrations/destinations/braze/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; +export const secret2 = path.basename(__dirname) + 1; +export const authHeader2 = `Bearer ${secret2}`; diff --git a/test/integrations/destinations/braze/network.ts b/test/integrations/destinations/braze/network.ts index bcfa78de5de..a2c4f9dff88 100644 --- a/test/integrations/destinations/braze/network.ts +++ b/test/integrations/destinations/braze/network.ts @@ -1,3 +1,4 @@ +import { authHeader1, authHeader2 } from './maskedSecrets'; const dataDeliveryMocksData = [ { httpReq: { @@ -13,7 +14,7 @@ const dataDeliveryMocksData = [ params: { destination: 'braze' }, headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -35,7 +36,7 @@ const dataDeliveryMocksData = [ params: { destination: 'braze' }, headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -57,7 +58,7 @@ const dataDeliveryMocksData = [ params: { destination: 'braze' }, headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -82,7 +83,7 @@ const dataDeliveryMocksData = [ params: { destination: 'braze' }, headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -104,7 +105,7 @@ const dataDeliveryMocksData = [ params: { destination: 'braze' }, headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -126,7 +127,7 @@ const dataDeliveryMocksData = [ params: { destination: 'braze' }, headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -197,7 +198,7 @@ const deleteNwData = [ }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer 1234', + Authorization: authHeader2, }, }, httpRes: { @@ -269,7 +270,7 @@ const deleteNwData = [ }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer 1234', + Authorization: authHeader2, }, }, httpRes: { @@ -288,7 +289,7 @@ const deleteNwData = [ data: { external_ids: ['test_user_id51'] }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer 1234', + Authorization: authHeader2, }, }, httpRes: { @@ -311,7 +312,7 @@ const deleteNwData = [ }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer 1234', + Authorization: authHeader2, }, }, httpRes: { @@ -339,7 +340,7 @@ const deleteNwData = [ params: { destination: 'braze' }, headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -386,7 +387,7 @@ const deleteNwData = [ params: { destination: 'braze' }, headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -421,7 +422,7 @@ const deleteNwData = [ 'user_aliases', ], }, - headers: { Authorization: 'Bearer dummyApiKey' }, + headers: { Authorization: authHeader1 }, url: 'https://rest.iad-03.braze.com/users/export/ids', }, httpRes: { @@ -511,7 +512,7 @@ const deleteNwData = [ params: { destination: 'braze' }, headers: { Accept: 'application/json', - Authorization: 'Bearer api_key', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, diff --git a/test/integrations/destinations/braze/processor/data.ts b/test/integrations/destinations/braze/processor/data.ts index 9b6f6dac65b..7fa6f3d0195 100644 --- a/test/integrations/destinations/braze/processor/data.ts +++ b/test/integrations/destinations/braze/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'braze', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -90,7 +91,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -135,7 +136,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -224,7 +225,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, @@ -298,7 +299,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -341,7 +342,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, @@ -419,7 +420,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -469,7 +470,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'eu-01', @@ -547,7 +548,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -597,7 +598,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -674,7 +675,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -717,7 +718,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, enableNestedArrayOperations: false, @@ -800,7 +801,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -861,7 +862,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, @@ -970,7 +971,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1132,7 +1133,7 @@ export const data = [ }, destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, @@ -1231,7 +1232,7 @@ export const data = [ }, destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, @@ -1262,7 +1263,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1300,7 +1301,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -1383,7 +1384,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1421,7 +1422,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, @@ -1530,7 +1531,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1601,7 +1602,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, @@ -1710,7 +1711,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1781,7 +1782,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, enableNestedArrayOperations: true, @@ -1908,7 +1909,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2012,7 +2013,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, enableNestedArrayOperations: true, @@ -2133,7 +2134,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2229,7 +2230,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -2310,7 +2311,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2360,7 +2361,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -2441,7 +2442,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2491,7 +2492,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'US-03', @@ -2556,7 +2557,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2597,7 +2598,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'US-03', @@ -2680,7 +2681,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'US-03', @@ -2763,7 +2764,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -2845,7 +2846,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -2898,7 +2899,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -3005,7 +3006,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -3119,7 +3120,7 @@ export const data = [ }, destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, enableSubscriptionGroupInGroupCall: true, @@ -3151,7 +3152,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -3240,7 +3241,7 @@ export const data = [ }, destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, enableSubscriptionGroupInGroupCall: true, @@ -3272,7 +3273,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -3311,7 +3312,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, @@ -3393,7 +3394,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -3442,7 +3443,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, sendPurchaseEventWithExtraProperties: true, @@ -3552,7 +3553,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -3633,7 +3634,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -3711,7 +3712,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, sendPurchaseEventWithExtraProperties: true, @@ -3856,7 +3857,7 @@ export const data = [ files: {}, headers: { Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -3883,7 +3884,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, @@ -3959,7 +3960,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -4029,7 +4030,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -4091,7 +4092,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -4196,7 +4197,7 @@ export const data = [ }, destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, @@ -4295,7 +4296,7 @@ export const data = [ }, destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, }, diff --git a/test/integrations/destinations/braze/router/data.ts b/test/integrations/destinations/braze/router/data.ts index 8ab04c5d04c..02b6506b7f3 100644 --- a/test/integrations/destinations/braze/router/data.ts +++ b/test/integrations/destinations/braze/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'braze', @@ -12,7 +13,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'eu-01', @@ -68,7 +69,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -122,7 +123,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -150,7 +151,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -178,7 +179,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -200,7 +201,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -222,7 +223,7 @@ export const data = [ { destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'us-01', @@ -268,7 +269,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -320,7 +321,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -354,7 +355,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -390,7 +391,7 @@ export const data = [ statusCode: 200, destination: { Config: { - restApiKey: 'dummyApiKey', + restApiKey: secret1, prefixProperties: true, useNativeSDK: false, dataCenter: 'eu-01', @@ -432,7 +433,7 @@ export const data = [ enableNestedArrayOperations: false, enableSubscriptionGroupInGroupCall: false, eventFilteringOption: 'disable', - restApiKey: 'dummyApiKey', + restApiKey: secret1, supportDedup: true, trackAnonymousUser: true, whitelistedEvents: [], @@ -501,7 +502,7 @@ export const data = [ enableNestedArrayOperations: false, enableSubscriptionGroupInGroupCall: false, eventFilteringOption: 'disable', - restApiKey: 'dummyApiKey', + restApiKey: secret1, supportDedup: true, trackAnonymousUser: true, whitelistedEvents: [], @@ -570,7 +571,7 @@ export const data = [ enableNestedArrayOperations: false, enableSubscriptionGroupInGroupCall: false, eventFilteringOption: 'disable', - restApiKey: 'dummyApiKey', + restApiKey: secret1, supportDedup: true, trackAnonymousUser: true, whitelistedEvents: [], @@ -623,7 +624,7 @@ export const data = [ enableNestedArrayOperations: false, enableSubscriptionGroupInGroupCall: false, eventFilteringOption: 'disable', - restApiKey: 'dummyApiKey', + restApiKey: secret1, supportDedup: true, trackAnonymousUser: true, whitelistedEvents: [], @@ -676,7 +677,7 @@ export const data = [ enableNestedArrayOperations: false, enableSubscriptionGroupInGroupCall: false, eventFilteringOption: 'disable', - restApiKey: 'dummyApiKey', + restApiKey: secret1, supportDedup: true, trackAnonymousUser: true, whitelistedEvents: [], @@ -738,7 +739,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -828,7 +829,7 @@ export const data = [ enableNestedArrayOperations: false, enableSubscriptionGroupInGroupCall: false, eventFilteringOption: 'disable', - restApiKey: 'dummyApiKey', + restApiKey: secret1, supportDedup: true, trackAnonymousUser: true, whitelistedEvents: [], @@ -863,7 +864,7 @@ export const data = [ enableNestedArrayOperations: false, enableSubscriptionGroupInGroupCall: false, eventFilteringOption: 'disable', - restApiKey: 'dummyApiKey', + restApiKey: secret1, supportDedup: true, trackAnonymousUser: true, whitelistedEvents: [], diff --git a/test/integrations/destinations/campaign_manager/dataDelivery/business.ts b/test/integrations/destinations/campaign_manager/dataDelivery/business.ts index e663f3212a8..040d2392adb 100644 --- a/test/integrations/destinations/campaign_manager/dataDelivery/business.ts +++ b/test/integrations/destinations/campaign_manager/dataDelivery/business.ts @@ -1,12 +1,13 @@ import { ProxyMetdata } from '../../../../../src/types'; import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV0Payload, generateProxyV1Payload } from '../../../testUtils'; +import { authHeader1 } from '../../am/maskedSecrets'; // Boilerplate data for the test cases // ====================================== const commonHeaders = { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }; diff --git a/test/integrations/destinations/campaign_manager/dataDelivery/oauth.ts b/test/integrations/destinations/campaign_manager/dataDelivery/oauth.ts index 288a06bfe6f..44f5aeb7638 100644 --- a/test/integrations/destinations/campaign_manager/dataDelivery/oauth.ts +++ b/test/integrations/destinations/campaign_manager/dataDelivery/oauth.ts @@ -1,10 +1,12 @@ import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV1Payload, generateProxyV0Payload } from '../../../testUtils'; +import { defaultAccessToken } from '../../../common/secrets'; +import { authHeader1 } from '../../am/maskedSecrets'; // Boilerplat data for the test cases // ====================================== const commonHeaders = { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }; @@ -331,8 +333,34 @@ export const v1oauthScenarios: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"code":401,"message":"Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.","errors":[{"message":"Login Required.","domain":"global","reason":"required","location":"Authorization","locationType":"header"}],"status":"UNAUTHENTICATED","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","reason":"CREDENTIALS_MISSING","domain":"googleapis.com","metadata":{"method":"google.ads.xfa.op.v4.DfareportingConversions.Batchinsert","service":"googleapis.com"}}]}}', + error: JSON.stringify({ + error: { + code: 401, + message: + 'Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.', + errors: [ + { + message: 'Login Required.', + domain: 'global', + reason: 'required', + location: 'Authorization', + locationType: 'header', + }, + ], + status: 'UNAUTHENTICATED', + details: [ + { + '@type': 'type.googleapis.com/google.rpc.ErrorInfo', + reason: 'CREDENTIALS_MISSING', + domain: 'googleapis.com', + metadata: { + method: 'google.ads.xfa.op.v4.DfareportingConversions.Batchinsert', + service: 'googleapis.com', + }, + }, + ], + }, + }), statusCode: 401, metadata: { jobId: 1, @@ -342,7 +370,7 @@ export const v1oauthScenarios: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -394,8 +422,31 @@ export const v1oauthScenarios: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"code":403,"message":"Request had insufficient authentication scopes.","errors":[{"message":"Insufficient Permission","domain":"global","reason":"insufficientPermissions"}],"status":"PERMISSION_DENIED","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","reason":"ACCESS_TOKEN_SCOPE_INSUFFICIENT","domain":"googleapis.com","metadata":{"service":"gmail.googleapis.com","method":"caribou.api.proto.MailboxService.GetProfile"}}]}}', + error: JSON.stringify({ + error: { + code: 403, + message: 'Request had insufficient authentication scopes.', + errors: [ + { + message: 'Insufficient Permission', + domain: 'global', + reason: 'insufficientPermissions', + }, + ], + status: 'PERMISSION_DENIED', + details: [ + { + '@type': 'type.googleapis.com/google.rpc.ErrorInfo', + reason: 'ACCESS_TOKEN_SCOPE_INSUFFICIENT', + domain: 'googleapis.com', + metadata: { + service: 'gmail.googleapis.com', + method: 'caribou.api.proto.MailboxService.GetProfile', + }, + }, + ], + }, + }), statusCode: 403, metadata: { jobId: 1, @@ -405,7 +456,7 @@ export const v1oauthScenarios: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -457,8 +508,9 @@ export const v1oauthScenarios: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"code":403,"message":"invalid_grant","error_description":"Bad accesss"}}', + error: JSON.stringify({ + error: { code: 403, message: 'invalid_grant', error_description: 'Bad accesss' }, + }), statusCode: 403, metadata: { jobId: 1, @@ -468,7 +520,7 @@ export const v1oauthScenarios: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -519,8 +571,10 @@ export const v1oauthScenarios: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":"unauthorized","error_description":"Access token expired: 2020-10-20T12:00:00.000Z"}', + error: JSON.stringify({ + error: 'unauthorized', + error_description: 'Access token expired: 2020-10-20T12:00:00.000Z', + }), statusCode: 401, metadata: { jobId: 1, @@ -530,7 +584,7 @@ export const v1oauthScenarios: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, diff --git a/test/integrations/destinations/campaign_manager/dataDelivery/other.ts b/test/integrations/destinations/campaign_manager/dataDelivery/other.ts index 1c0c45728c0..fe006755762 100644 --- a/test/integrations/destinations/campaign_manager/dataDelivery/other.ts +++ b/test/integrations/destinations/campaign_manager/dataDelivery/other.ts @@ -1,6 +1,6 @@ import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV0Payload, generateProxyV1Payload } from '../../../testUtils'; - +import { defaultAccessToken } from '../../../common/secrets'; export const otherScenariosV0 = [ { id: 'cm360_v0_other_scenario_1', @@ -258,8 +258,13 @@ export const otherScenariosV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"message":"Service Unavailable","description":"The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later."}}', + error: JSON.stringify({ + error: { + message: 'Service Unavailable', + description: + 'The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later.', + }, + }), statusCode: 503, metadata: { jobId: 1, @@ -269,7 +274,7 @@ export const otherScenariosV1: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -327,7 +332,7 @@ export const otherScenariosV1: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -385,7 +390,7 @@ export const otherScenariosV1: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -443,7 +448,7 @@ export const otherScenariosV1: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -502,7 +507,7 @@ export const otherScenariosV1: ProxyV1TestData[] = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, diff --git a/test/integrations/destinations/campaign_manager/maskedSecrets.ts b/test/integrations/destinations/campaign_manager/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/campaign_manager/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/campaign_manager/network.ts b/test/integrations/destinations/campaign_manager/network.ts index b7c23012481..11121559317 100644 --- a/test/integrations/destinations/campaign_manager/network.ts +++ b/test/integrations/destinations/campaign_manager/network.ts @@ -1,5 +1,7 @@ +import { authHeader1 } from '../am/maskedSecrets'; + const commonHeaders = { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }; diff --git a/test/integrations/destinations/campaign_manager/processor/data.ts b/test/integrations/destinations/campaign_manager/processor/data.ts index 9aa41691c68..8f4351815fe 100644 --- a/test/integrations/destinations/campaign_manager/processor/data.ts +++ b/test/integrations/destinations/campaign_manager/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'campaign_manager', @@ -79,7 +80,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -110,7 +111,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/34245/conversions/batchinsert', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -148,7 +149,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -239,7 +240,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -270,7 +271,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/34245/conversions/batchupdate', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -300,7 +301,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -393,7 +394,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -419,7 +420,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -472,7 +473,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -498,7 +499,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -599,7 +600,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -630,7 +631,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/34245/conversions/batchinsert', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -662,7 +663,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -753,7 +754,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -784,7 +785,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/34245/conversions/batchinsert', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -816,7 +817,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -907,7 +908,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -940,7 +941,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/34245/conversions/batchupdate', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1000,7 +1001,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1091,7 +1092,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1124,7 +1125,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/34245/conversions/batchupdate', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1180,7 +1181,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1260,7 +1261,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1293,7 +1294,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/34245/conversions/batchupdate', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1329,7 +1330,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, diff --git a/test/integrations/destinations/campaign_manager/router/data.ts b/test/integrations/destinations/campaign_manager/router/data.ts index 5b4e5bcce4c..3b237887aec 100644 --- a/test/integrations/destinations/campaign_manager/router/data.ts +++ b/test/integrations/destinations/campaign_manager/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'campaign_manager', @@ -12,7 +13,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -92,7 +93,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -172,7 +173,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -271,7 +272,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/437689/conversions/batchinsert', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -309,7 +310,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'dummyApiToken', + access_token: secret1, developer_token: 'ijkl91011', refresh_token: 'efgh5678', }, @@ -337,7 +338,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/437689/conversions/batchupdate', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -373,7 +374,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'dummyApiToken', + access_token: secret1, developer_token: 'ijkl91011', refresh_token: 'efgh5678', }, @@ -409,7 +410,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'dummyApiToken', + access_token: secret1, developer_token: 'ijkl91011', refresh_token: 'efgh5678', }, @@ -445,7 +446,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -487,7 +488,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -529,7 +530,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -587,7 +588,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/437689/conversions/batchinsert', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -645,7 +646,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -654,7 +655,7 @@ export const data = [ }, { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -663,7 +664,7 @@ export const data = [ }, { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -701,7 +702,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -743,7 +744,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -785,7 +786,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -843,7 +844,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/437689/conversions/batchupdate', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -884,7 +885,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -893,7 +894,7 @@ export const data = [ }, { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -921,7 +922,7 @@ export const data = [ endpoint: 'https://dfareporting.googleapis.com/dfareporting/v4/userprofiles/437689/conversions/batchinsert', headers: { - Authorization: 'Bearer dummyApiToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -953,7 +954,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -991,7 +992,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1032,7 +1033,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1073,7 +1074,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1126,7 +1127,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1160,7 +1161,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1194,7 +1195,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'dummyApiToken', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, diff --git a/test/integrations/destinations/candu/maskedSecrets.ts b/test/integrations/destinations/candu/maskedSecrets.ts new file mode 100644 index 00000000000..74d160ff192 --- /dev/null +++ b/test/integrations/destinations/candu/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${base64Convertor(secret1)}`; diff --git a/test/integrations/destinations/candu/processor/data.ts b/test/integrations/destinations/candu/processor/data.ts index 22bd0b35672..a81317afb4f 100644 --- a/test/integrations/destinations/candu/processor/data.ts +++ b/test/integrations/destinations/candu/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'candu', @@ -42,7 +43,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, Enabled: true, Transformations: [], @@ -122,7 +123,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.candu.ai/api/eventWebhook', headers: { - Authorization: 'Basic RlhMa0xVRWhHSnl2bVk0', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -198,7 +199,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, Enabled: true, Transformations: [], @@ -280,7 +281,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.candu.ai/api/eventWebhook', headers: { - Authorization: 'Basic RlhMa0xVRWhHSnl2bVk0', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -358,7 +359,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, Enabled: true, Transformations: [], @@ -484,7 +485,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, Enabled: true, Transformations: [], @@ -753,7 +754,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, Enabled: true, Transformations: [], @@ -885,7 +886,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, Enabled: true, Transformations: [], @@ -965,7 +966,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.candu.ai/api/eventWebhook', headers: { - Authorization: 'Basic RlhMa0xVRWhHSnl2bVk0', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1042,7 +1043,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, Enabled: true, Transformations: [], @@ -1124,7 +1125,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.candu.ai/api/eventWebhook', headers: { - Authorization: 'Basic RlhMa0xVRWhHSnl2bVk0', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1202,7 +1203,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, Enabled: true, Transformations: [], @@ -1284,7 +1285,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.candu.ai/api/eventWebhook', headers: { - Authorization: 'Basic RlhMa0xVRWhHSnl2bVk0', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, diff --git a/test/integrations/destinations/candu/router/data.ts b/test/integrations/destinations/candu/router/data.ts index 02e1caa3e93..2498286c4c7 100644 --- a/test/integrations/destinations/candu/router/data.ts +++ b/test/integrations/destinations/candu/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'candu', @@ -40,7 +41,7 @@ export const data = [ }, ResponseRules: {}, }, - Config: { apiKey: 'FXLkLUEhGJyvmY4' }, + Config: { apiKey: secret1 }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -109,7 +110,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.candu.ai/api/eventWebhook', headers: { - Authorization: 'Basic RlhMa0xVRWhHSnl2bVk0', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -167,7 +168,7 @@ export const data = [ }, ResponseRules: {}, }, - Config: { apiKey: 'FXLkLUEhGJyvmY4' }, + Config: { apiKey: secret1 }, Enabled: true, Transformations: [], IsProcessorEnabled: true, diff --git a/test/integrations/destinations/canny/maskedSecrets.ts b/test/integrations/destinations/canny/maskedSecrets.ts new file mode 100644 index 00000000000..aaf5a0cbb37 --- /dev/null +++ b/test/integrations/destinations/canny/maskedSecrets.ts @@ -0,0 +1,7 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${secret1}`; +export const authHeader2 = `Basic ${secret2}`; diff --git a/test/integrations/destinations/canny/network.ts b/test/integrations/destinations/canny/network.ts index db1b6396327..68ff8b638dd 100644 --- a/test/integrations/destinations/canny/network.ts +++ b/test/integrations/destinations/canny/network.ts @@ -1,3 +1,5 @@ +import { secret2 } from './maskedSecrets'; + export const networkCallsData = [ { httpReq: { @@ -5,7 +7,7 @@ export const networkCallsData = [ Accept: 'application/json', 'Content-Type': 'application/x-www-form-urlencoded', }, - data: 'apiKey=apikey123&email=test%40rudderstack.com', + data: `apiKey=${secret2}&email=test%40rudderstack.com`, method: 'POST', url: 'https://canny.io/api/v1/users/retrieve', }, diff --git a/test/integrations/destinations/canny/data.ts b/test/integrations/destinations/canny/processor/data.ts similarity index 98% rename from test/integrations/destinations/canny/data.ts rename to test/integrations/destinations/canny/processor/data.ts index 3c6823ca1b5..ad28652d5f5 100644 --- a/test/integrations/destinations/canny/data.ts +++ b/test/integrations/destinations/canny/processor/data.ts @@ -1,5 +1,4 @@ -import { enhanceRequestOptions } from '../../../../src/adapters/network'; -import qs from 'qs'; +import { authHeader1, secret1, authHeader2, secret2 } from '../maskedSecrets'; export const data = [ { @@ -14,7 +13,7 @@ export const data = [ { destination: { Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, }, message: { @@ -93,7 +92,7 @@ export const data = [ method: 'POST', endpoint: 'https://canny.io/api/v1/users/create_or_update', headers: { - Authorization: 'Basic FXLkLUEhGJyvmY4', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -104,7 +103,7 @@ export const data = [ title: 'VP', gender: 'female', }, - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, userID: 'user123456001', email: 'firstUser@testmail.com', name: 'First User', @@ -135,7 +134,7 @@ export const data = [ { destination: { Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, }, message: { @@ -232,7 +231,7 @@ export const data = [ { destination: { Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, }, message: { @@ -329,7 +328,7 @@ export const data = [ { destination: { Config: { - apiKey: 'FXLkLUEhGJyvmY4', + apiKey: secret1, }, }, message: { @@ -619,7 +618,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey123', + apiKey: secret2, eventsToEvents: [ { from: 'abc', @@ -719,7 +718,7 @@ export const data = [ method: 'POST', endpoint: 'https://canny.io/api/v1/votes/create', headers: { - Authorization: 'Basic apikey123', + Authorization: authHeader2, 'Content-Type': 'application/x-www-form-urlencoded', }, params: {}, @@ -729,7 +728,7 @@ export const data = [ XML: {}, FORM: { postID: 'postid', - apiKey: 'apikey123', + apiKey: secret2, voterID: '52d14c90fff7c80abcd12345', }, }, @@ -745,13 +744,13 @@ export const data = [ method: 'POST', endpoint: 'https://canny.io/api/v1/posts/create', headers: { - Authorization: 'Basic apikey123', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: {}, body: { JSON: { - apiKey: 'apikey123', + apiKey: secret2, boardID: 'boardid', details: 'details', title: 'title', @@ -781,7 +780,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey123', + apiKey: secret2, eventsToEvents: [ { from: 'abc def', @@ -872,7 +871,7 @@ export const data = [ userId: '', endpoint: 'https://canny.io/api/v1/posts/create', headers: { - Authorization: 'Basic apikey123', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: {}, @@ -881,7 +880,7 @@ export const data = [ JSON_ARRAY: {}, XML: {}, JSON: { - apiKey: 'apikey123', + apiKey: secret2, authorID: '52d14c90fff7c80abcd12345', boardID: 'boardid', details: 'details', @@ -908,7 +907,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey123', + apiKey: secret2, eventsToEvents: [ { from: 'sample', @@ -1001,7 +1000,7 @@ export const data = [ method: 'POST', endpoint: 'https://canny.io/api/v1/posts/create', headers: { - Authorization: 'Basic apikey123', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: {}, @@ -1010,7 +1009,7 @@ export const data = [ JSON_ARRAY: {}, XML: {}, JSON: { - apiKey: 'apikey123', + apiKey: secret2, authorID: '62d1', boardID: '62de8', details: 'Array of images', @@ -1042,7 +1041,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey123', + apiKey: secret2, eventsToEvents: [ { from: 'sample', @@ -1151,7 +1150,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey123', + apiKey: secret2, eventsToEvents: [ { from: 'sample', @@ -1263,7 +1262,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey123', + apiKey: secret2, eventsToEvents: [], }, }, @@ -1363,7 +1362,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey123', + apiKey: secret2, eventsToEvents: [ { from: 'abc', @@ -1474,7 +1473,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey123', + apiKey: secret2, eventsToEvents: [ { from: 'abc def', @@ -1585,7 +1584,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey123', + apiKey: secret2, eventsToEvents: [ { from: 'abc def', @@ -1695,7 +1694,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey123', + apiKey: secret2, eventsToEvents: [ { from: 'abc def', diff --git a/test/integrations/destinations/clevertap/dataDelivery/business.ts b/test/integrations/destinations/clevertap/dataDelivery/business.ts index d9f83f52f35..cd5bcd1e6fd 100644 --- a/test/integrations/destinations/clevertap/dataDelivery/business.ts +++ b/test/integrations/destinations/clevertap/dataDelivery/business.ts @@ -57,10 +57,15 @@ export const V1BusinessTestScenarion: ProxyV1TestData[] = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), }, identity: 'anon_id', }, @@ -83,7 +88,7 @@ export const V1BusinessTestScenarion: ProxyV1TestData[] = [ response: [ { metadata: generateMetadata(123), - error: '{"status":"success","processed":1,"unprocessed":[]}', + error: JSON.stringify({ status: 'success', processed: 1, unprocessed: [] }), statusCode: 200, }, ], @@ -141,7 +146,7 @@ export const V1BusinessTestScenarion: ProxyV1TestData[] = [ response: [ { metadata: generateMetadata(123), - error: '{"status":"fail","error":"Invalid Credentials","code":401}', + error: JSON.stringify({ status: 'fail', error: 'Invalid Credentials', code: 401 }), statusCode: 401, }, ], @@ -200,7 +205,7 @@ export const V1BusinessTestScenarion: ProxyV1TestData[] = [ response: [ { metadata: generateMetadata(123), - error: '{"status":"fail","processed":0,"unprocessed":[]}', + error: JSON.stringify({ status: 'fail', processed: 0, unprocessed: [] }), statusCode: 400, }, ], @@ -271,8 +276,23 @@ export const V1BusinessTestScenarion: ProxyV1TestData[] = [ response: [ { metadata: generateMetadata(123), - error: - '{"status":"partial","processed":2,"unprocessed":[{"status":"fail","code":509,"error":"Event Name is incorrect. ErrorCode: 509 - Event name is mandatory. Skipped record number : 2","record":{"evtData":{"name":1234,"revenue":4.99},"type":"event","identity":"user123"}}]}', + error: JSON.stringify({ + status: 'partial', + processed: 2, + unprocessed: [ + { + status: 'fail', + code: 509, + error: + 'Event Name is incorrect. ErrorCode: 509 - Event name is mandatory. Skipped record number : 2', + record: { + evtData: { name: 1234, revenue: 4.99 }, + type: 'event', + identity: 'user123', + }, + }, + ], + }), statusCode: 400, }, ], diff --git a/test/integrations/destinations/clevertap/dataDelivery/data.ts b/test/integrations/destinations/clevertap/dataDelivery/data.ts index 57e0d0ceea1..f83c0bc9f6b 100644 --- a/test/integrations/destinations/clevertap/dataDelivery/data.ts +++ b/test/integrations/destinations/clevertap/dataDelivery/data.ts @@ -39,10 +39,15 @@ const oldV0TestCases = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), }, identity: 'anon_id', }, diff --git a/test/integrations/destinations/clevertap/network.ts b/test/integrations/destinations/clevertap/network.ts index 9122ba11293..103fcfb1c5b 100644 --- a/test/integrations/destinations/clevertap/network.ts +++ b/test/integrations/destinations/clevertap/network.ts @@ -21,10 +21,15 @@ const dataDeliveryMocksData = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), }, identity: 'anon_id', }, diff --git a/test/integrations/destinations/clevertap/processor/data.ts b/test/integrations/destinations/clevertap/processor/data.ts index f15fc409fba..de84242d231 100644 --- a/test/integrations/destinations/clevertap/processor/data.ts +++ b/test/integrations/destinations/clevertap/processor/data.ts @@ -99,10 +99,15 @@ export const data = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), 'category-unsubscribe': { email: ['Marketing', 'Transactional'] }, }, identity: 'anon_id', @@ -223,10 +228,15 @@ export const data = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), 'category-unsubscribe': { email: ['Marketing', 'Transactional'] }, }, identity: 'anon_id', @@ -368,10 +378,15 @@ export const data = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), }, identity: 'anon_id', }, @@ -1094,10 +1109,15 @@ export const data = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), }, identity: 'anon_id', }, @@ -1237,10 +1257,15 @@ export const data = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), }, identity: 'anon_id', }, @@ -1818,10 +1843,15 @@ export const data = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), }, ts: 1615377562, identity: 'anon_id', @@ -2203,10 +2233,15 @@ export const data = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), first_name: 'John', last_name: 'Doe', }, @@ -2356,10 +2391,15 @@ export const data = [ msgSms: true, msgemail: true, msgwhatsapp: false, - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', + custom_mappings: JSON.stringify({ Office: 'Trastkiv', Country: 'Russia' }), + custom_tags: JSON.stringify(['Test_User', 'Interested_User', 'DIY_Hobby']), + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), first_name: 'John', last_name: 'Doe', }, diff --git a/test/integrations/destinations/clevertap/router/data.ts b/test/integrations/destinations/clevertap/router/data.ts index 5f25bbe83e7..dea46f52e0d 100644 --- a/test/integrations/destinations/clevertap/router/data.ts +++ b/test/integrations/destinations/clevertap/router/data.ts @@ -162,10 +162,22 @@ export const data = [ msgSms: true, msgemail: true, msgwhatsapp: false, - address: - '{"city":"kolkata","country":"India","postalCode":789223,"state":"WB","street":""}', - custom_mappings: '{"Office":"Trastkiv","Country":"Russia"}', - custom_tags: '["Test_User","Interested_User","DIY_Hobby"]', + address: JSON.stringify({ + city: 'kolkata', + country: 'India', + postalCode: 789223, + state: 'WB', + street: '', + }), + custom_mappings: JSON.stringify({ + Office: 'Trastkiv', + Country: 'Russia', + }), + custom_tags: JSON.stringify([ + 'Test_User', + 'Interested_User', + 'DIY_Hobby', + ]), }, objectId: 'anon_id', }, diff --git a/test/integrations/destinations/clicksend/commonConfig.ts b/test/integrations/destinations/clicksend/commonConfig.ts index c5c49e2b926..d68c466ce7d 100644 --- a/test/integrations/destinations/clicksend/commonConfig.ts +++ b/test/integrations/destinations/clicksend/commonConfig.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from './maskedSecrets'; export const destination = { ID: 'random_id', Name: 'clicksend', @@ -7,8 +8,8 @@ export const destination = { }, }, Config: { - clicksendUsername: 'dummy', - clicksendPassword: 'dummy', + clicksendUsername: secret1, + clicksendPassword: secret1, defaultCampaignScheduleUnit: 'day', defaultCampaignSchedule: '2', defaultSource: 'php', @@ -74,8 +75,8 @@ export const routerInstrumentationErrorStatTags = { module: 'destination', }; export const commonIdentifyOutput = { - address_line_1: '{"city":"New York","country":"USA","pinCode":"123456"}', - address_line_2: '{"city":"New York","country":"USA","pinCode":"123456"}', + address_line_1: JSON.stringify({ city: 'New York', country: 'USA', pinCode: '123456' }), + address_line_2: JSON.stringify({ city: 'New York', country: 'USA', pinCode: '123456' }), city: 'New York', email: 'abc@gmail.com', first_name: 'John', @@ -93,6 +94,6 @@ export const processInstrumentationErrorStatTags = { }; export const commonHeader = { - Authorization: 'Basic ZHVtbXk6ZHVtbXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }; diff --git a/test/integrations/destinations/clicksend/dataDelivery/data.ts b/test/integrations/destinations/clicksend/dataDelivery/data.ts index f376e757ea9..a6c79684051 100644 --- a/test/integrations/destinations/clicksend/dataDelivery/data.ts +++ b/test/integrations/destinations/clicksend/dataDelivery/data.ts @@ -1,9 +1,11 @@ import { generateMetadata, generateProxyV1Payload } from '../../../testUtils'; import { ProxyV1TestData } from '../../../testTypes'; +import { defaultAccessToken } from '../../../common/secrets'; +import { secret1 } from '../maskedSecrets'; export const headerBlockWithCorrectAccessToken = { 'Content-Type': 'application/json', - Authorization: 'dummy-key', + Authorization: secret1, }; export const contactPayload = { @@ -32,7 +34,7 @@ export const metadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -44,7 +46,7 @@ export const metadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -56,7 +58,7 @@ export const metadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -68,7 +70,7 @@ export const metadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -83,7 +85,7 @@ export const singleMetadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -224,8 +226,12 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { statusCode: 404, metadata: generateMetadata(1), - error: - '{"http_code":404,"response_code":"NOT_FOUND","response_msg":"Contact record not found.","data":null}', + error: JSON.stringify({ + http_code: 404, + response_code: 'NOT_FOUND', + response_msg: 'Contact record not found.', + data: null, + }), }, ], }, @@ -267,8 +273,12 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { statusCode: 404, metadata: generateMetadata(1), - error: - '{"http_code":404,"response_code":"NOT_FOUND","response_msg":"Contact record not found.","data":null}', + error: JSON.stringify({ + http_code: 404, + response_code: 'NOT_FOUND', + response_msg: 'Contact record not found.', + data: null, + }), }, ], }, @@ -310,8 +320,13 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { statusCode: 400, metadata: generateMetadata(1), - error: - '{"http_code":400,"response_code":400,"response_msg":"preg_replace(): Parameter mismatch, pattern is a string while replacement is an array","data":null}', + error: JSON.stringify({ + http_code: 400, + response_code: 400, + response_msg: + 'preg_replace(): Parameter mismatch, pattern is a string while replacement is an array', + data: null, + }), }, ], }, @@ -353,8 +368,12 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { statusCode: 404, metadata: generateMetadata(1), - error: - '{"http_code":404,"response_code":"NOT_FOUND","response_msg":"Your list is not found.","data":null}', + error: JSON.stringify({ + http_code: 404, + response_code: 'NOT_FOUND', + response_msg: 'Your list is not found.', + data: null, + }), }, ], }, diff --git a/test/integrations/destinations/clicksend/maskedSecrets.ts b/test/integrations/destinations/clicksend/maskedSecrets.ts new file mode 100644 index 00000000000..22256c7d5f0 --- /dev/null +++ b/test/integrations/destinations/clicksend/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret1)}`; diff --git a/test/integrations/destinations/clicksend/network.ts b/test/integrations/destinations/clicksend/network.ts index aa1013d8169..e0cfbae8085 100644 --- a/test/integrations/destinations/clicksend/network.ts +++ b/test/integrations/destinations/clicksend/network.ts @@ -1,6 +1,8 @@ +import { secret1 } from './maskedSecrets'; + export const headerBlockWithCorrectAccessToken = { 'Content-Type': 'application/json', - Authorization: 'dummy-key', + Authorization: secret1, }; export const contactPayload = { diff --git a/test/integrations/destinations/clicksend/processor/track.ts b/test/integrations/destinations/clicksend/processor/track.ts index e4a8c5be979..eee7c573e9a 100644 --- a/test/integrations/destinations/clicksend/processor/track.ts +++ b/test/integrations/destinations/clicksend/processor/track.ts @@ -62,7 +62,7 @@ export const track = [ body: 'abcd', from: 'abc@gmail.com', name: 'new campaign', - schedule: 1631201576, + schedule: 1611761576, }, userId: '', }), @@ -227,7 +227,7 @@ export const track = [ from: 'abc@gmail.com', from_email: 'dummy@gmail.com', custom_string: 'test string', - schedule: 1631201576, + schedule: 1611761576, source: 'php', to: '+9182XXXX068', }, diff --git a/test/integrations/destinations/clicksend/router/data.ts b/test/integrations/destinations/clicksend/router/data.ts index 54018787b03..0c072800db6 100644 --- a/test/integrations/destinations/clicksend/router/data.ts +++ b/test/integrations/destinations/clicksend/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { commonInput, destination, @@ -11,8 +12,8 @@ const commonDestination = { ID: 'random_id', Name: 'clicksend', Config: { - clicksendPassword: 'dummy', - clicksendUsername: 'dummy', + clicksendPassword: secret1, + clicksendUsername: secret1, defaultCampaignSchedule: '2', defaultCampaignScheduleUnit: 'day', defaultSenderId: 'abc@gmail.com', @@ -121,7 +122,7 @@ export const data = [ from: 'abc@gmail.com', list_id: 123345, name: 'new campaign', - schedule: 1631201576, + schedule: 1611761576, }, JSON_ARRAY: {}, XML: {}, @@ -129,7 +130,7 @@ export const data = [ endpoint: 'https://rest.clicksend.com/v3/sms-campaigns/send', files: {}, headers: { - Authorization: 'Basic ZHVtbXk6ZHVtbXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -160,7 +161,7 @@ export const data = [ email: 'abc@gmail.com', from: 'abc@gmail.com', from_email: 'dummy@gmail.com', - schedule: 1631201576, + schedule: 1611761576, source: 'php', to: '+9182XXXX068', }, @@ -172,7 +173,7 @@ export const data = [ endpoint: 'https://rest.clicksend.com/v3/sms/send', files: {}, headers: { - Authorization: 'Basic ZHVtbXk6ZHVtbXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -196,8 +197,16 @@ export const data = [ body: { FORM: {}, JSON: { - address_line_1: '{"city":"New York","country":"USA","pinCode":"123456"}', - address_line_2: '{"city":"New York","country":"USA","pinCode":"123456"}', + address_line_1: JSON.stringify({ + city: 'New York', + country: 'USA', + pinCode: '123456', + }), + address_line_2: JSON.stringify({ + city: 'New York', + country: 'USA', + pinCode: '123456', + }), city: 'New York', contact_id: '111', email: 'abc@gmail.com', @@ -211,7 +220,7 @@ export const data = [ endpoint: 'https://rest.clicksend.com/v3/lists/123345/contacts/111', files: {}, headers: { - Authorization: 'Basic ZHVtbXk6ZHVtbXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'PUT', @@ -373,7 +382,7 @@ export const data = [ from: 'abc@gmail.com', list_id: 123345, name: 'new campaign', - schedule: 1631201576, + schedule: 1611761576, }, JSON_ARRAY: {}, XML: {}, @@ -381,7 +390,7 @@ export const data = [ endpoint: 'https://rest.clicksend.com/v3/sms-campaigns/send', files: {}, headers: { - Authorization: 'Basic ZHVtbXk6ZHVtbXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -412,7 +421,7 @@ export const data = [ email: 'abc@gmail.com', from: 'abc@gmail.com', from_email: 'dummy@gmail.com', - schedule: 1631201576, + schedule: 1611761576, source: 'php', to: '+9182XXXX068', }, @@ -422,7 +431,7 @@ export const data = [ email: 'abc@gmail.com', from: 'abc@gmail.com', from_email: 'dummy@gmail.com', - schedule: 1631201576, + schedule: 1611761576, source: 'php', to: '+9182XXXX068', }, @@ -432,7 +441,7 @@ export const data = [ email: 'abc@gmail.com', from: 'abc@gmail.com', from_email: 'dummy@gmail.com', - schedule: 1631201576, + schedule: 1611761576, source: 'php', to: '+9182XXXX068', }, @@ -444,7 +453,7 @@ export const data = [ endpoint: 'https://rest.clicksend.com/v3/sms/send', files: {}, headers: { - Authorization: 'Basic ZHVtbXk6ZHVtbXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', diff --git a/test/integrations/destinations/clickup/maskedSecrets.ts b/test/integrations/destinations/clickup/maskedSecrets.ts new file mode 100644 index 00000000000..67e579d0869 --- /dev/null +++ b/test/integrations/destinations/clickup/maskedSecrets.ts @@ -0,0 +1,3 @@ +import path from 'path'; + +export const secretApiToken = path.basename(__dirname) + 1; diff --git a/test/integrations/destinations/clickup/processor/data.ts b/test/integrations/destinations/clickup/processor/data.ts index 686bf670e2e..e553c54711c 100644 --- a/test/integrations/destinations/clickup/processor/data.ts +++ b/test/integrations/destinations/clickup/processor/data.ts @@ -1,3 +1,5 @@ +import { secretApiToken } from '../maskedSecrets'; + export const data = [ { name: 'clickup', @@ -11,7 +13,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', }, ID: 'clickup-1234', @@ -64,7 +66,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', keyToCustomFieldName: [ { @@ -122,7 +124,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', keyToCustomFieldName: [ { @@ -180,7 +182,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', keyToCustomFieldName: [ { @@ -238,7 +240,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', keyToCustomFieldName: [ { @@ -300,7 +302,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', keyToCustomFieldName: [ { @@ -358,7 +360,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', keyToCustomFieldName: [ { @@ -460,7 +462,7 @@ export const data = [ endpoint: 'https://api.clickup.com/api/v2/list/correctListId123/task', headers: { 'Content-Type': 'application/json', - Authorization: 'pk_123', + Authorization: secretApiToken, }, params: {}, body: { @@ -557,7 +559,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', }, ID: 'clickup-1234', @@ -604,7 +606,7 @@ export const data = [ endpoint: 'https://api.clickup.com/api/v2/list/correctListId123/task', headers: { 'Content-Type': 'application/json', - Authorization: 'pk_123', + Authorization: secretApiToken, }, params: {}, body: { @@ -637,7 +639,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', whitelistedEvents: [ { @@ -698,7 +700,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', whitelistedEvents: [ { @@ -759,7 +761,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', }, ID: 'clickup-1234', @@ -795,7 +797,7 @@ export const data = [ endpoint: 'https://api.clickup.com/api/v2/list/correctListId456/task', headers: { 'Content-Type': 'application/json', - Authorization: 'pk_123', + Authorization: secretApiToken, }, params: {}, body: { diff --git a/test/integrations/destinations/clickup/router/data.ts b/test/integrations/destinations/clickup/router/data.ts index b77cb90b473..8306081ff91 100644 --- a/test/integrations/destinations/clickup/router/data.ts +++ b/test/integrations/destinations/clickup/router/data.ts @@ -1,3 +1,5 @@ +import { secretApiToken } from '../maskedSecrets'; + export const data = [ { name: 'clickup', @@ -12,7 +14,7 @@ export const data = [ { description: 'Creating task using listId from externalId array', destination: { - Config: { apiToken: 'pk_123', listId: 'correctListId123' }, + Config: { apiToken: secretApiToken, listId: 'correctListId123' }, ID: 'clickup-1234', }, metadata: { jobId: 1, userId: 'u1' }, @@ -28,7 +30,7 @@ export const data = [ { description: 'Creating task with assignees', destination: { - Config: { apiToken: 'pk_123', listId: 'correctListId123' }, + Config: { apiToken: secretApiToken, listId: 'correctListId123' }, ID: 'clickup-1234', }, metadata: { jobId: 2, userId: 'u1' }, @@ -52,7 +54,7 @@ export const data = [ description: 'Creating task with valid custom fields values', destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', keyToCustomFieldName: [ { from: 'industry', to: 'Industry' }, @@ -111,7 +113,7 @@ export const data = [ description: 'Custom field: Invalid location latitude', destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', keyToCustomFieldName: [{ from: 'location', to: 'Location' }], }, @@ -147,14 +149,14 @@ export const data = [ body: { FORM: {}, JSON: { name: 'anonymous page visit' }, JSON_ARRAY: {}, XML: {} }, endpoint: 'https://api.clickup.com/api/v2/list/correctListId456/task', files: {}, - headers: { Authorization: 'pk_123', 'Content-Type': 'application/json' }, + headers: { Authorization: secretApiToken, 'Content-Type': 'application/json' }, method: 'POST', params: {}, type: 'REST', version: '1', }, destination: { - Config: { apiToken: 'pk_123', listId: 'correctListId123' }, + Config: { apiToken: secretApiToken, listId: 'correctListId123' }, ID: 'clickup-1234', }, metadata: [{ jobId: 1, userId: 'u1' }], @@ -171,14 +173,14 @@ export const data = [ }, endpoint: 'https://api.clickup.com/api/v2/list/correctListId123/task', files: {}, - headers: { Authorization: 'pk_123', 'Content-Type': 'application/json' }, + headers: { Authorization: secretApiToken, 'Content-Type': 'application/json' }, method: 'POST', params: {}, type: 'REST', version: '1', }, destination: { - Config: { apiToken: 'pk_123', listId: 'correctListId123' }, + Config: { apiToken: secretApiToken, listId: 'correctListId123' }, ID: 'clickup-1234', }, metadata: [{ jobId: 2, userId: 'u1' }], @@ -244,7 +246,7 @@ export const data = [ }, endpoint: 'https://api.clickup.com/api/v2/list/correctListId123/task', files: {}, - headers: { Authorization: 'pk_123', 'Content-Type': 'application/json' }, + headers: { Authorization: secretApiToken, 'Content-Type': 'application/json' }, method: 'POST', params: {}, type: 'REST', @@ -252,7 +254,7 @@ export const data = [ }, destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, keyToCustomFieldName: [ { from: 'industry', to: 'Industry' }, { from: 'Payment Status', to: 'Payment Status' }, @@ -276,7 +278,7 @@ export const data = [ { destination: { Config: { - apiToken: 'pk_123', + apiToken: secretApiToken, listId: 'correctListId123', keyToCustomFieldName: [{ from: 'location', to: 'Location' }], }, diff --git a/test/integrations/destinations/cordial/common.ts b/test/integrations/destinations/cordial/common.ts index 1ebd0db34b0..1ac3a951e7f 100644 --- a/test/integrations/destinations/cordial/common.ts +++ b/test/integrations/destinations/cordial/common.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from './maskedSecrets'; import { Destination } from '../../../../src/types'; const destType = 'cordial'; @@ -6,7 +7,7 @@ const displayName = 'Cordial'; const destination: Destination = { Config: { apiBaseUrl: 'https://abc.example.com', - apiKey: 'test-api-key', + apiKey: secret1, }, DestinationDefinition: { DisplayName: displayName, @@ -46,7 +47,7 @@ const context = { }; const headers = { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdC1hcGkta2V5Og==', + Authorization: authHeader1, }; const properties = { product_id: '622c6f5d5cf86a4c77358033', diff --git a/test/integrations/destinations/cordial/maskedSecrets.ts b/test/integrations/destinations/cordial/maskedSecrets.ts new file mode 100644 index 00000000000..ba0b28ba8a1 --- /dev/null +++ b/test/integrations/destinations/cordial/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + '')}`; diff --git a/test/integrations/destinations/cordial/network.ts b/test/integrations/destinations/cordial/network.ts index 9cc6f42408e..c7b62c86769 100644 --- a/test/integrations/destinations/cordial/network.ts +++ b/test/integrations/destinations/cordial/network.ts @@ -1,10 +1,11 @@ +import { authHeader1 } from './maskedSecrets'; import { destination } from './common'; export const networkCallsData = [ { httpReq: { url: `${destination.Config.apiBaseUrl}/v2/contacts/email:johndoe@example.com`, headers: { - Authorization: 'Basic dGVzdC1hcGkta2V5Og==', + Authorization: authHeader1, }, method: 'GET', }, @@ -38,7 +39,7 @@ export const networkCallsData = [ httpReq: { url: `${destination.Config.apiBaseUrl}/v2/contacts/6690fe3655e334d6270287b5`, headers: { - Authorization: 'Basic dGVzdC1hcGkta2V5Og==', + Authorization: authHeader1, }, method: 'GET', }, diff --git a/test/integrations/destinations/cordial/processor/identify.ts b/test/integrations/destinations/cordial/processor/identify.ts index 074852b1993..ef7636a7162 100644 --- a/test/integrations/destinations/cordial/processor/identify.ts +++ b/test/integrations/destinations/cordial/processor/identify.ts @@ -39,6 +39,7 @@ export const identify: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -102,6 +103,7 @@ export const identify: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -166,6 +168,7 @@ export const identify: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/cordial/processor/track.ts b/test/integrations/destinations/cordial/processor/track.ts index 3e7a560a52d..3ead5a959cb 100644 --- a/test/integrations/destinations/cordial/processor/track.ts +++ b/test/integrations/destinations/cordial/processor/track.ts @@ -40,6 +40,7 @@ export const track: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -96,6 +97,7 @@ export const track: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/cordial/processor/validation.ts b/test/integrations/destinations/cordial/processor/validation.ts index 61f2e1cbed9..ea7dff6dac9 100644 --- a/test/integrations/destinations/cordial/processor/validation.ts +++ b/test/integrations/destinations/cordial/processor/validation.ts @@ -27,6 +27,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -71,6 +72,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/courier/maskedSecrets.ts b/test/integrations/destinations/courier/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/courier/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/courier/processor/data.ts b/test/integrations/destinations/courier/processor/data.ts index 9371f9e7b25..32e11e6a284 100644 --- a/test/integrations/destinations/courier/processor/data.ts +++ b/test/integrations/destinations/courier/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'courier', @@ -73,7 +74,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, }, @@ -92,7 +93,7 @@ export const data = [ endpoint: 'https://api.courier.com/inbound/rudderstack', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -151,7 +152,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, }, @@ -170,7 +171,7 @@ export const data = [ endpoint: 'https://api.courier.com/inbound/rudderstack', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -229,7 +230,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, }, @@ -281,7 +282,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, }, @@ -300,7 +301,7 @@ export const data = [ endpoint: 'https://api.courier.com/inbound/rudderstack', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/courier/router/data.ts b/test/integrations/destinations/courier/router/data.ts index 268504b9033..83a02f0e898 100644 --- a/test/integrations/destinations/courier/router/data.ts +++ b/test/integrations/destinations/courier/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'courier', @@ -21,7 +22,7 @@ export const data = [ messageId: '2116ef8c-efc3-4ca4-851b-02ee60dad6ff', anonymousId: '97c46c81-3140-456d-b2a9-690d70aaca35', }, - destination: { Config: { apiKey: 'dummyApiKey' } }, + destination: { Config: { apiKey: secret1 } }, metadata: { jobId: 1, userId: 'u1' }, }, { @@ -66,7 +67,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.courier.com/inbound/rudderstack', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -88,7 +89,7 @@ export const data = [ }, files: {}, }, - destination: { Config: { apiKey: 'dummyApiKey' } }, + destination: { Config: { apiKey: secret1 } }, metadata: [{ jobId: 1, userId: 'u1' }], statusCode: 200, }, diff --git a/test/integrations/destinations/criteo_audience/dataDelivery/business.ts b/test/integrations/destinations/criteo_audience/dataDelivery/business.ts index f30bf73d7a9..a8767869a7d 100644 --- a/test/integrations/destinations/criteo_audience/dataDelivery/business.ts +++ b/test/integrations/destinations/criteo_audience/dataDelivery/business.ts @@ -1,7 +1,9 @@ import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV1Payload, generateMetadata } from '../../../testUtils'; +import { defaultAccessTokenAuthHeader } from '../../../common/secrets'; + export const headers = { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }; @@ -230,8 +232,15 @@ export const V1BusinessTestScenarion: ProxyV1TestData[] = [ message: 'AudienceId is Invalid. Please Provide Valid AudienceId', response: [ { - error: - '{"errors":[{"traceIdentifier":"80a1a0ba3981b04da847d05700752c77","type":"authorization","code":"audience-invalid"}]}', + error: JSON.stringify({ + errors: [ + { + traceIdentifier: '80a1a0ba3981b04da847d05700752c77', + type: 'authorization', + code: 'audience-invalid', + }, + ], + }), metadata: generateMetadata(4), statusCode: 400, }, diff --git a/test/integrations/destinations/criteo_audience/dataDelivery/data.ts b/test/integrations/destinations/criteo_audience/dataDelivery/data.ts index c603ef66648..f3e3fa911fb 100644 --- a/test/integrations/destinations/criteo_audience/dataDelivery/data.ts +++ b/test/integrations/destinations/criteo_audience/dataDelivery/data.ts @@ -1,3 +1,4 @@ +import { defaultAccessTokenAuthHeader } from '../../../common/secrets'; import { generateMetadata } from '../../../testUtils'; import { V1BusinessTestScenarion } from './business'; import { v1OauthScenarios } from './oauth'; @@ -18,7 +19,7 @@ const v0testCases = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34894/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -80,7 +81,7 @@ const v0testCases = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/3485/contactlist/expiredAccessToken', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -160,7 +161,7 @@ const v0testCases = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34895/contactlist/invalidAccessToken', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -240,7 +241,7 @@ const v0testCases = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34896/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -320,7 +321,7 @@ const v0testCases = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34897/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -399,7 +400,7 @@ const v0testCases = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34898/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -471,7 +472,7 @@ const v0testCases = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34899/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, diff --git a/test/integrations/destinations/criteo_audience/dataDelivery/other.ts b/test/integrations/destinations/criteo_audience/dataDelivery/other.ts index 145be62528a..2c6a599b125 100644 --- a/test/integrations/destinations/criteo_audience/dataDelivery/other.ts +++ b/test/integrations/destinations/criteo_audience/dataDelivery/other.ts @@ -172,7 +172,7 @@ export const v1OtherScenarios: ProxyV1TestData[] = [ status: 400, response: [ { - error: '{"message":"unknown error"}', + error: JSON.stringify({ message: 'unknown error' }), metadata: generateMetadata(3), statusCode: 400, }, diff --git a/test/integrations/destinations/criteo_audience/maskedSecrets.ts b/test/integrations/destinations/criteo_audience/maskedSecrets.ts new file mode 100644 index 00000000000..30165eac945 --- /dev/null +++ b/test/integrations/destinations/criteo_audience/maskedSecrets.ts @@ -0,0 +1,3 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; diff --git a/test/integrations/destinations/criteo_audience/network.ts b/test/integrations/destinations/criteo_audience/network.ts index 7ccf649e2a0..6fb61153402 100644 --- a/test/integrations/destinations/criteo_audience/network.ts +++ b/test/integrations/destinations/criteo_audience/network.ts @@ -1,5 +1,7 @@ +import { defaultAccessTokenAuthHeader } from '../../common/secrets'; + const headers = { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', 'User-Agent': 'RudderLabs', diff --git a/test/integrations/destinations/criteo_audience/processor/data.ts b/test/integrations/destinations/criteo_audience/processor/data.ts index 61573fed9b2..14e771d98c2 100644 --- a/test/integrations/destinations/criteo_audience/processor/data.ts +++ b/test/integrations/destinations/criteo_audience/processor/data.ts @@ -1,3 +1,6 @@ +import { defaultAccessToken, defaultAccessTokenAuthHeader } from '../../../common/secrets'; +import { secret1 } from '../maskedSecrets'; + export const data = [ { name: 'criteo_audience', @@ -11,7 +14,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, message: { @@ -58,7 +61,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34894', audienceType: 'email', }, @@ -79,7 +82,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34894/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -112,7 +115,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -133,7 +136,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, message: { @@ -197,7 +200,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'madid', }, @@ -218,7 +221,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -252,7 +255,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -264,7 +267,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -298,7 +301,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -319,7 +322,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, message: { @@ -360,7 +363,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34894', audienceType: 'email', }, @@ -381,7 +384,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34894/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -407,7 +410,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -428,7 +431,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, message: { @@ -466,7 +469,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34895', audienceType: 'madid', }, @@ -487,7 +490,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34895/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -513,7 +516,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -534,7 +537,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, message: { @@ -580,7 +583,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'madid', }, @@ -601,7 +604,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -627,7 +630,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -639,7 +642,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -665,7 +668,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -686,7 +689,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, message: { @@ -732,7 +735,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'identityLink', }, @@ -753,7 +756,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -779,7 +782,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -791,7 +794,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -817,7 +820,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -838,7 +841,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, message: { @@ -884,7 +887,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'gum', gumCallerId: '329739', @@ -906,7 +909,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -933,7 +936,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -945,7 +948,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -972,7 +975,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 200, @@ -993,7 +996,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, message: { @@ -1034,7 +1037,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'email', }, @@ -1051,7 +1054,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 400, @@ -1081,13 +1084,13 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'email', }, @@ -1149,7 +1152,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 400, @@ -1179,13 +1182,13 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'email', }, @@ -1240,7 +1243,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 400, @@ -1270,7 +1273,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, message: { @@ -1290,7 +1293,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'email', }, @@ -1307,7 +1310,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 400, @@ -1337,13 +1340,13 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'email', }, @@ -1397,7 +1400,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 400, @@ -1427,7 +1430,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, destination: { @@ -1508,7 +1511,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 400, @@ -1538,7 +1541,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, message: { @@ -1578,7 +1581,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34894', audienceType: 'email', }, @@ -1595,7 +1598,7 @@ export const data = [ { metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, statusCode: 400, diff --git a/test/integrations/destinations/criteo_audience/router/data.ts b/test/integrations/destinations/criteo_audience/router/data.ts index 755d83547e1..faa503caa3e 100644 --- a/test/integrations/destinations/criteo_audience/router/data.ts +++ b/test/integrations/destinations/criteo_audience/router/data.ts @@ -1,3 +1,6 @@ +import { defaultAccessToken, defaultAccessTokenAuthHeader } from '../../../common/secrets'; +import { secret1 } from '../maskedSecrets'; + export const data = [ { name: 'criteo_audience', @@ -13,13 +16,13 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'email', }, ID: 'iwehr83843', }, - metadata: { secret: { accessToken: 'success_access_token' }, jobId: 1, userId: 'u1' }, + metadata: { secret: { accessToken: defaultAccessToken }, jobId: 1, userId: 'u1' }, message: { userId: 'user 1', type: 'audiencelist', @@ -55,13 +58,13 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'madid', }, ID: 'iwehr83843', }, - metadata: { secret: { accessToken: 'success_access_token' }, jobId: 2, userId: 'u1' }, + metadata: { secret: { accessToken: defaultAccessToken }, jobId: 2, userId: 'u1' }, message: { userId: 'user 1', type: 'audiencelist', @@ -120,7 +123,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -144,15 +147,13 @@ export const data = [ files: {}, }, ], - metadata: [ - { jobId: 1, secret: { accessToken: 'success_access_token' }, userId: 'u1' }, - ], + metadata: [{ jobId: 1, secret: { accessToken: defaultAccessToken }, userId: 'u1' }], batched: false, statusCode: 200, destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'email', }, @@ -167,7 +168,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -196,7 +197,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -220,15 +221,13 @@ export const data = [ files: {}, }, ], - metadata: [ - { jobId: 2, secret: { accessToken: 'success_access_token' }, userId: 'u1' }, - ], + metadata: [{ jobId: 2, secret: { accessToken: defaultAccessToken }, userId: 'u1' }], batched: false, statusCode: 200, destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'madid', }, @@ -254,7 +253,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'email', }, @@ -262,7 +261,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, jobId: 1, userId: 'u1', @@ -316,7 +315,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceType: 'email', 'warehouse-adAccountId': '123', }, @@ -324,7 +323,7 @@ export const data = [ }, metadata: { secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, jobId: 2, userId: 'u1', @@ -393,7 +392,7 @@ export const data = [ method: 'PATCH', endpoint: 'https://api.criteo.com/2022-10/audiences/34893/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -422,7 +421,7 @@ export const data = [ jobId: 1, userId: 'u1', secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, ], @@ -431,7 +430,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, audienceId: '34893', audienceType: 'email', }, @@ -447,7 +446,7 @@ export const data = [ endpoint: 'https://api.criteo.com/2022-10/audiences/23848494844100489/contactlist', headers: { - Authorization: 'Bearer success_access_token', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', Accept: 'application/json', }, @@ -476,7 +475,7 @@ export const data = [ jobId: 2, userId: 'u1', secret: { - accessToken: 'success_access_token', + accessToken: defaultAccessToken, }, }, ], @@ -485,7 +484,7 @@ export const data = [ destination: { Config: { clientId: 'abcdef8-f49-4cd6-b4c5-958b3d66d431', - clientSecret: 'sjhdkhfrz6yc9LrRRIPimE9h53jADLccXTykHCcA6eEoFR4rXQg', + clientSecret: secret1, 'warehouse-adAccountId': '123', audienceType: 'email', }, diff --git a/test/integrations/destinations/custify/deleteUsers/data.ts b/test/integrations/destinations/custify/deleteUsers/data.ts index 22a120770a1..0d0b758f926 100644 --- a/test/integrations/destinations/custify/deleteUsers/data.ts +++ b/test/integrations/destinations/custify/deleteUsers/data.ts @@ -1,3 +1,4 @@ +import { secret1 } from '../maskedSecrets'; const destType = 'custify'; const commonData = { name: destType, @@ -48,7 +49,7 @@ export const data = [ }, ], config: { - apiToken: 'dummyApiKey', + apiToken: secret1, }, }, ], @@ -83,7 +84,7 @@ export const data = [ }, ], config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, ], @@ -114,7 +115,7 @@ export const data = [ }, ], config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, ], @@ -123,7 +124,9 @@ export const data = [ output: { response: { status: 400, - body: [{ statusCode: 400, error: '{"error":"User: rudder3 has a problem"}' }], + body: [ + { statusCode: 400, error: JSON.stringify({ error: 'User: rudder3 has a problem' }) }, + ], }, }, }, @@ -142,7 +145,7 @@ export const data = [ {}, ], config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, ], diff --git a/test/integrations/destinations/custify/maskedSecrets.ts b/test/integrations/destinations/custify/maskedSecrets.ts new file mode 100644 index 00000000000..da90788f323 --- /dev/null +++ b/test/integrations/destinations/custify/maskedSecrets.ts @@ -0,0 +1,10 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const secret4 = undefined; + +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; +export const authHeader3 = `Bearer ${secret4}`; diff --git a/test/integrations/destinations/custify/network.ts b/test/integrations/destinations/custify/network.ts index 242f54c97b2..5bddb89ad16 100644 --- a/test/integrations/destinations/custify/network.ts +++ b/test/integrations/destinations/custify/network.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from './maskedSecrets'; export const networkCallsData = [ { httpReq: { @@ -39,7 +40,7 @@ export const networkCallsData = [ method: 'delete', url: 'https://api.custify.com/people?user_id=rudder1', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, }, httpRes: { @@ -56,7 +57,7 @@ export const networkCallsData = [ method: 'delete', url: 'https://api.custify.com/people?user_id=rudder2', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, }, httpRes: { @@ -72,7 +73,7 @@ export const networkCallsData = [ method: 'delete', url: 'https://api.custify.com/people?user_id=rudder3', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, }, httpRes: { diff --git a/test/integrations/destinations/custify/processor/data.ts b/test/integrations/destinations/custify/processor/data.ts index b5bd8bd753f..e53005b2ac5 100644 --- a/test/integrations/destinations/custify/processor/data.ts +++ b/test/integrations/destinations/custify/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader2, secret2 } from '../maskedSecrets'; export const data = [ { name: 'custify', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apiKey_key_test_001', + apiKey: secret2, sendAnonymousId: false, }, ID: 'custify-1234', @@ -63,7 +64,7 @@ export const data = [ endpoint: 'https://api.custify.com/people', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apiKey_key_test_001', + Authorization: authHeader2, Accept: 'application/json', }, params: {}, @@ -120,7 +121,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apiKey_key_test_001', + apiKey: secret2, sendAnonymousId: false, }, ID: 'custify-1234', @@ -173,7 +174,7 @@ export const data = [ endpoint: 'https://api.custify.com/people', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apiKey_key_test_001', + Authorization: authHeader2, Accept: 'application/json', }, params: {}, @@ -230,7 +231,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apiKey_key_test_001', + apiKey: secret2, sendAnonymousId: false, }, ID: 'custify-1234', @@ -300,7 +301,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apiKey_key_test_001', + apiKey: secret2, sendAnonymousId: false, }, ID: 'custify-1234', @@ -371,7 +372,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apiKey_key_test_001', + apiKey: secret2, sendAnonymousId: true, }, ID: 'custify-1234', @@ -422,7 +423,7 @@ export const data = [ endpoint: 'https://api.custify.com/people', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apiKey_key_test_001', + Authorization: authHeader2, Accept: 'application/json', }, params: {}, @@ -478,7 +479,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apiKey_key_test_001', + apiKey: secret2, sendAnonymousId: false, }, ID: 'custify-1234', @@ -529,7 +530,7 @@ export const data = [ endpoint: 'https://api.custify.com/event', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apiKey_key_test_001', + Authorization: authHeader2, Accept: 'application/json', }, params: {}, @@ -572,7 +573,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apiKey_key_test_001', + apiKey: secret2, sendAnonymousId: false, }, ID: 'custify-1234', @@ -631,7 +632,7 @@ export const data = [ endpoint: 'https://api.custify.com/people', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apiKey_key_test_001', + Authorization: authHeader2, Accept: 'application/json', }, params: {}, diff --git a/test/integrations/destinations/custify/router/data.ts b/test/integrations/destinations/custify/router/data.ts index a88f36fc698..bbefaf755c4 100644 --- a/test/integrations/destinations/custify/router/data.ts +++ b/test/integrations/destinations/custify/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader2, authHeader3, secret2, secret3 } from '../maskedSecrets'; export const data = [ { name: 'custify', @@ -12,7 +13,7 @@ export const data = [ { description: 'Group callw with all parameters', destination: { - Config: { apiKey: 'apiKey_key_test_001', sendAnonymousId: false }, + Config: { apiKey: secret2, sendAnonymousId: false }, ID: 'custify-1234', }, metadata: { jobId: 1, userId: 'u1' }, @@ -54,7 +55,7 @@ export const data = [ { description: 'Identify with all parameters', destination: { - Config: { apiKeyToken: 'pk_123', listId: 'correctListId123' }, + Config: { apiKeyToken: secret3, listId: 'correctListId123' }, ID: 'custify-1234', }, metadata: { jobId: 2, userId: 'u1' }, @@ -108,7 +109,7 @@ export const data = [ endpoint: 'https://api.custify.com/people', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apiKey_key_test_001', + Authorization: authHeader2, Accept: 'application/json', }, params: {}, @@ -139,7 +140,7 @@ export const data = [ batched: false, statusCode: 200, destination: { - Config: { apiKey: 'apiKey_key_test_001', sendAnonymousId: false }, + Config: { apiKey: secret2, sendAnonymousId: false }, ID: 'custify-1234', }, }, @@ -151,8 +152,8 @@ export const data = [ endpoint: 'https://api.custify.com/people', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer undefined', Accept: 'application/json', + Authorization: authHeader3, }, params: {}, body: { @@ -189,7 +190,7 @@ export const data = [ batched: false, statusCode: 200, destination: { - Config: { apiKeyToken: 'pk_123', listId: 'correctListId123' }, + Config: { apiKeyToken: secret3, listId: 'correctListId123' }, ID: 'custify-1234', }, }, diff --git a/test/integrations/destinations/customerio/maskedSecrets.ts b/test/integrations/destinations/customerio/maskedSecrets.ts new file mode 100644 index 00000000000..ff4c3b6cd40 --- /dev/null +++ b/test/integrations/destinations/customerio/maskedSecrets.ts @@ -0,0 +1,15 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const secret4 = path.basename(__dirname) + 4; +export const secret5 = path.basename(__dirname) + 5; +export const secret6 = path.basename(__dirname) + 6; +export const secret7 = path.basename(__dirname) + 7; +export const secret8 = path.basename(__dirname) + 8; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; +export const authHeader2 = `Basic ${base64Convertor(secret3 + ':' + secret4)}`; +export const authHeader3 = `Basic ${base64Convertor(secret5 + ':' + secret6)}`; +export const authHeader4 = `Basic ${base64Convertor(secret7 + ':' + secret8)}`; diff --git a/test/integrations/destinations/customerio/processor/data.ts b/test/integrations/destinations/customerio/processor/data.ts index 92cea4250d8..a9957449ba4 100644 --- a/test/integrations/destinations/customerio/processor/data.ts +++ b/test/integrations/destinations/customerio/processor/data.ts @@ -1,3 +1,17 @@ +import { + authHeader1, + secret1, + secret2, + authHeader2, + secret3, + secret4, + authHeader3, + secret5, + secret6, + authHeader4, + secret7, + secret8, +} from '../maskedSecrets'; export const data = [ { name: 'customerio', @@ -25,8 +39,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -52,7 +66,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/cio_1234', userId: 'cio_1234', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -143,7 +157,7 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', + siteID: secret1, }, }, }, @@ -247,8 +261,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -283,7 +297,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/123456', userId: '123456', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -371,8 +385,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -475,8 +489,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -511,7 +525,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/test@gmail.com', userId: '123456', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -585,8 +599,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -620,7 +634,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -692,8 +706,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -725,7 +739,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -797,8 +811,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -830,7 +844,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/test@rudderstack.com/events', userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -901,8 +915,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -935,7 +949,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/events', userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -1023,8 +1037,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -1057,7 +1071,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/devices', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -1145,8 +1159,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -1169,7 +1183,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/devices/abcxyz', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -1248,8 +1262,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -1272,7 +1286,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/devices/somel', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -1350,8 +1364,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -1375,7 +1389,7 @@ export const data = [ 'https://track.customer.io/api/v1/customers/test@rudderstack.com/devices/somel', userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -1452,8 +1466,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -1544,8 +1558,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -1577,7 +1591,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/test@rudderstack.com/devices', userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -1654,8 +1668,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -1688,7 +1702,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/events', userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -1767,8 +1781,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -1800,7 +1814,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/devices', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -1878,8 +1892,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -1911,7 +1925,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -1989,8 +2003,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -2022,7 +2036,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -2101,8 +2115,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -2134,7 +2148,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/devices', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -2213,8 +2227,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -2238,7 +2252,7 @@ export const data = [ 'https://track.customer.io/api/v1/customers/12345/devices/sample_device_token', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -2328,8 +2342,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -2363,7 +2377,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/123456', userId: '123456', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -2437,8 +2451,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -2472,7 +2486,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -2544,8 +2558,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -2577,7 +2591,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -2649,8 +2663,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -2682,7 +2696,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/test@rudderstack.com/events', userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -2753,8 +2767,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -2787,7 +2801,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/events', userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -2875,8 +2889,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -2909,7 +2923,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/12345/devices', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -2997,8 +3011,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -3021,7 +3035,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/12345/devices/abcxyz', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -3100,8 +3114,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -3124,7 +3138,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/12345/devices/somel', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -3201,8 +3215,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -3293,8 +3307,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -3327,7 +3341,7 @@ export const data = [ 'https://track-eu.customer.io/api/v1/customers/test@rudderstack.com/devices', userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -3404,8 +3418,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -3438,7 +3452,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/events', userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -3517,8 +3531,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -3550,7 +3564,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/12345/devices', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -3628,8 +3642,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -3661,7 +3675,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -3739,8 +3753,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -3772,7 +3786,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -3851,8 +3865,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -3884,7 +3898,7 @@ export const data = [ endpoint: 'https://track-eu.customer.io/api/v1/customers/12345/devices', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -3963,8 +3977,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -3988,7 +4002,7 @@ export const data = [ 'https://track-eu.customer.io/api/v1/customers/12345/devices/sample_device_token', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -4059,8 +4073,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -4078,7 +4092,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v1/events', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, params: {}, body: { @@ -4165,8 +4179,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -4184,7 +4198,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v1/customers/test@rudderstack.com/events', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, params: {}, body: { @@ -4269,8 +4283,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -4288,7 +4302,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v1/events', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, params: {}, body: { @@ -4375,8 +4389,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -4394,7 +4408,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v1/customers/test@rudderstack.com/events', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, params: {}, body: { @@ -4491,8 +4505,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: 'abc', - apiKey: 'xyz', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -4510,7 +4524,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v1/customers/dummy-user-id-100/events', headers: { - Authorization: 'Basic YWJjOnh5eg==', + Authorization: authHeader1, }, params: {}, body: { @@ -4605,8 +4619,8 @@ export const data = [ destination: { Config: { datacenter: 'EU', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -4624,7 +4638,7 @@ export const data = [ method: 'PUT', endpoint: 'https://track-eu.customer.io/api/v1/customers/dummy-user-id-100', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, params: {}, body: { @@ -4729,9 +4743,9 @@ export const data = [ ResponseRules: null, }, Config: { - apiKey: 'a292d85ac36de15fc219', + apiKey: secret4, datacenter: 'US', - siteID: 'eead090ab9e2e35004dc', + siteID: secret3, }, Enabled: true, Transformations: [], @@ -4756,7 +4770,7 @@ export const data = [ method: 'PUT', endpoint: 'https://track.customer.io/api/v1/customers/xaviercharles@hotmail.com', headers: { - Authorization: 'Basic ZWVhZDA5MGFiOWUyZTM1MDA0ZGM6YTI5MmQ4NWFjMzZkZTE1ZmMyMTk=', + Authorization: authHeader2, }, params: {}, body: { @@ -4856,9 +4870,9 @@ export const data = [ ResponseRules: null, }, Config: { - apiKey: 'a292d85ac36de15fc219', + apiKey: secret4, datacenter: 'US', - siteID: 'eead090ab9e2e35004dc', + siteID: secret3, }, Enabled: true, Transformations: [], @@ -4883,7 +4897,7 @@ export const data = [ method: 'PUT', endpoint: 'https://track.customer.io/api/v1/customers/xaviercharles', headers: { - Authorization: 'Basic ZWVhZDA5MGFiOWUyZTM1MDA0ZGM6YTI5MmQ4NWFjMzZkZTE1ZmMyMTk=', + Authorization: authHeader2, }, params: {}, body: { @@ -5033,10 +5047,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -5058,7 +5072,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/devices', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -5210,10 +5224,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -5235,7 +5249,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/events', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -5386,10 +5400,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -5411,7 +5425,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/devices', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -5562,10 +5576,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -5587,7 +5601,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/devices', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -5735,10 +5749,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -5760,7 +5774,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/devices', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -5911,10 +5925,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -5936,7 +5950,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/devices', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -6088,10 +6102,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -6113,7 +6127,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/events', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -6265,10 +6279,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -6290,7 +6304,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/devices', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -6441,10 +6455,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -6466,7 +6480,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/devices', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -6614,10 +6628,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -6639,7 +6653,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/devices', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -6790,10 +6804,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'DESAU SAI', + apiKey: secret6, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'DESU SAI', + siteID: secret5, }, Enabled: true, Transformations: [], @@ -6815,7 +6829,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/e91e0378-63fe-11ec-82ac-0a028ee659c3/devices', headers: { - Authorization: 'Basic REVTVSBTQUk6REVTQVUgU0FJ', + Authorization: authHeader3, }, params: {}, body: { @@ -6932,10 +6946,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'ef32c3f60fb98f39ef35', + apiKey: secret8, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'c0efdbd20b9fbe24a7e2', + siteID: secret7, }, Enabled: true, Transformations: [], @@ -6956,7 +6970,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v2/batch', headers: { - Authorization: 'Basic YzBlZmRiZDIwYjlmYmUyNGE3ZTI6ZWYzMmMzZjYwZmI5OGYzOWVmMzU=', + Authorization: authHeader4, }, params: {}, body: { @@ -7085,10 +7099,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'ef32c3f60fb98f39ef35', + apiKey: secret8, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'c0efdbd20b9fbe24a7e2', + siteID: secret7, }, Enabled: true, Transformations: [], @@ -7109,7 +7123,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v2/batch', headers: { - Authorization: 'Basic YzBlZmRiZDIwYjlmYmUyNGE3ZTI6ZWYzMmMzZjYwZmI5OGYzOWVmMzU=', + Authorization: authHeader4, }, params: {}, body: { @@ -7241,10 +7255,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'ef32c3f60fb98f39ef35', + apiKey: secret8, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'c0efdbd20b9fbe24a7e2', + siteID: secret7, }, Enabled: true, Transformations: [], @@ -7265,7 +7279,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v2/batch', headers: { - Authorization: 'Basic YzBlZmRiZDIwYjlmYmUyNGE3ZTI6ZWYzMmMzZjYwZmI5OGYzOWVmMzU=', + Authorization: authHeader4, }, params: {}, body: { @@ -7397,10 +7411,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'ef32c3f60fb98f39ef35', + apiKey: secret8, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'c0efdbd20b9fbe24a7e2', + siteID: secret7, }, Enabled: true, Transformations: [], @@ -7421,7 +7435,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v2/batch', headers: { - Authorization: 'Basic YzBlZmRiZDIwYjlmYmUyNGE3ZTI6ZWYzMmMzZjYwZmI5OGYzOWVmMzU=', + Authorization: authHeader4, }, params: {}, body: { @@ -7553,10 +7567,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'ef32c3f60fb98f39ef35', + apiKey: secret8, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'c0efdbd20b9fbe24a7e2', + siteID: secret7, }, Enabled: true, Transformations: [], @@ -7577,7 +7591,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v2/batch', headers: { - Authorization: 'Basic YzBlZmRiZDIwYjlmYmUyNGE3ZTI6ZWYzMmMzZjYwZmI5OGYzOWVmMzU=', + Authorization: authHeader4, }, params: {}, body: { @@ -7723,10 +7737,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'ef32c3f60fb98f39ef35', + apiKey: secret8, datacenter: 'US', deviceTokenEventName: 'device_token_registered', - siteID: 'c0efdbd20b9fbe24a7e2', + siteID: secret7, }, Enabled: true, Transformations: [], @@ -7747,7 +7761,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v2/batch', headers: { - Authorization: 'Basic YzBlZmRiZDIwYjlmYmUyNGE3ZTI6ZWYzMmMzZjYwZmI5OGYzOWVmMzU=', + Authorization: authHeader4, }, params: {}, body: { @@ -7893,10 +7907,10 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'ef32c3f60fb98f39ef35', + apiKey: secret8, datacenter: 'EU', deviceTokenEventName: 'device_token_registered', - siteID: 'c0efdbd20b9fbe24a7e2', + siteID: secret7, }, Enabled: true, Transformations: [], @@ -7917,7 +7931,7 @@ export const data = [ method: 'POST', endpoint: 'https://track-eu.customer.io/api/v2/batch', headers: { - Authorization: 'Basic YzBlZmRiZDIwYjlmYmUyNGE3ZTI6ZWYzMmMzZjYwZmI5OGYzOWVmMzU=', + Authorization: authHeader4, }, params: {}, body: { @@ -8028,8 +8042,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -8063,7 +8077,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -8135,8 +8149,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -8168,7 +8182,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -8234,8 +8248,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -8261,7 +8275,7 @@ export const data = [ endpoint: 'https://track.customer.io/api/v1/customers/12345/events', userId: '12345', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, }, version: '1', params: {}, @@ -8301,8 +8315,8 @@ export const data = [ destination: { Config: { datacenter: 'US', - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, diff --git a/test/integrations/destinations/customerio/router/data.ts b/test/integrations/destinations/customerio/router/data.ts index 12751477109..0f4d6fe0eb6 100644 --- a/test/integrations/destinations/customerio/router/data.ts +++ b/test/integrations/destinations/customerio/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; export const data = [ { name: 'customerio', @@ -65,8 +66,8 @@ export const data = [ destination: { Config: { datacenterEU: false, - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -109,8 +110,8 @@ export const data = [ destination: { Config: { datacenterEU: false, - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -147,8 +148,8 @@ export const data = [ destination: { Config: { datacenterEU: false, - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -185,8 +186,8 @@ export const data = [ destination: { Config: { datacenterEU: false, - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -207,7 +208,7 @@ export const data = [ type: 'REST', method: 'PUT', endpoint: 'https://track.customer.io/api/v1/customers/123456', - headers: { Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=' }, + headers: { Authorization: authHeader1 }, params: {}, body: { JSON: { @@ -237,8 +238,8 @@ export const data = [ destination: { Config: { datacenterEU: false, - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -248,7 +249,7 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://track.customer.io/api/v1/customers/12345/events', - headers: { Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=' }, + headers: { Authorization: authHeader1 }, params: {}, body: { JSON: { @@ -277,8 +278,8 @@ export const data = [ destination: { Config: { datacenterEU: false, - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, @@ -289,7 +290,7 @@ export const data = [ method: 'POST', endpoint: 'https://track.customer.io/api/v2/batch', headers: { - Authorization: 'Basic NDZiZTU0NzY4ZTdkNDlhYjI2Mjg6ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -335,8 +336,8 @@ export const data = [ destination: { Config: { datacenterEU: false, - siteID: '46be54768e7d49ab2628', - apiKey: 'dummyApiKey', + siteID: secret1, + apiKey: secret2, }, }, }, diff --git a/test/integrations/destinations/customerio_audience/common.ts b/test/integrations/destinations/customerio_audience/common.ts new file mode 100644 index 00000000000..e54190d04ac --- /dev/null +++ b/test/integrations/destinations/customerio_audience/common.ts @@ -0,0 +1,105 @@ +import { authHeader1, secret1, secret2 } from './maskedSecrets'; +import { Connection, Destination } from '../../../../src/types'; +import { VDM_V2_SCHEMA_VERSION } from '../../../../src/v0/util/constant'; + +const destType = 'customerio_audience'; +const destTypeInUpperCase = 'CUSTOMERIO_AUDIENCE'; +const displayName = 'Customer.io Audience'; +const channel = 'web'; +const destination: Destination = { + Config: { + apiKey: secret2, + appApiKey: 'test-app-api-key', + connectionMode: 'cloud', + siteId: secret1, + }, + DestinationDefinition: { + DisplayName: displayName, + ID: '123', + Name: destTypeInUpperCase, + Config: {}, + }, + Enabled: true, + ID: '123', + Name: destTypeInUpperCase, + Transformations: [], + WorkspaceID: 'test-workspace-id', +}; +const connection: Connection = { + sourceId: 'dummy-source-id', + destinationId: 'dummy-destination-id', + enabled: true, + config: { + destination: { + schemaVersion: VDM_V2_SCHEMA_VERSION, + audienceId: 'test-segment-id', + identifierMappings: [ + { + from: 'some-key', + to: 'id', + }, + ], + }, + }, +}; + +const inValidConnection: Connection = { + ...connection, + config: { + ...connection.config, + destination: { + audienceId: '', + }, + }, +}; + +const insertOrUpdateEndpoint = + 'https://track.customer.io/api/v1/segments/test-segment-id/add_customers'; + +const deleteEndpoint = 'https://track.customer.io/api/v1/segments/test-segment-id/remove_customers'; + +const processorInstrumentationErrorStatTags = { + destType: destTypeInUpperCase, + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + destinationId: 'default-destinationId', + workspaceId: 'default-workspaceId', +}; + +const RouterInstrumentationErrorStatTags = { + ...processorInstrumentationErrorStatTags, + feature: 'router', +}; + +const RouterConfigurationErrorStatTags = { + ...processorInstrumentationErrorStatTags, + feature: 'router', + errorType: 'configuration', +}; + +const headers = { + 'Content-Type': 'application/json', + Authorization: authHeader1, +}; + +const params = { + id_type: 'id', +}; + +export { + destType, + channel, + destination, + connection, + inValidConnection, + processorInstrumentationErrorStatTags, + RouterInstrumentationErrorStatTags, + RouterConfigurationErrorStatTags, + headers, + params, + insertOrUpdateEndpoint, + deleteEndpoint, +}; diff --git a/test/integrations/destinations/customerio_audience/maskedSecrets.ts b/test/integrations/destinations/customerio_audience/maskedSecrets.ts new file mode 100644 index 00000000000..156e87fe1e6 --- /dev/null +++ b/test/integrations/destinations/customerio_audience/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; diff --git a/test/integrations/destinations/customerio_audience/mocks.ts b/test/integrations/destinations/customerio_audience/mocks.ts new file mode 100644 index 00000000000..2c613706e67 --- /dev/null +++ b/test/integrations/destinations/customerio_audience/mocks.ts @@ -0,0 +1,5 @@ +import * as config from '../../../../src/v0/destinations/customerio_audience/config'; + +export const defaultMockFns = () => { + jest.replaceProperty(config, 'MAX_ITEMS', 3 as typeof config.MAX_ITEMS); +}; diff --git a/test/integrations/destinations/customerio_audience/router/data.ts b/test/integrations/destinations/customerio_audience/router/data.ts new file mode 100644 index 00000000000..f9964a79ecd --- /dev/null +++ b/test/integrations/destinations/customerio_audience/router/data.ts @@ -0,0 +1,377 @@ +import { generateMetadata, generateRecordPayload, overrideDestination } from '../../../testUtils'; +import { defaultMockFns } from '../mocks'; +import { + destType, + destination, + headers, + RouterInstrumentationErrorStatTags, + insertOrUpdateEndpoint, + deleteEndpoint, + connection, + params, + inValidConnection, + RouterConfigurationErrorStatTags, +} from '../common'; + +const routerRequest1 = { + input: [ + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-1', + }, + action: 'insert', + }), + metadata: generateMetadata(1), + destination, + connection, + }, + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-2', + }, + action: 'insert', + }), + metadata: generateMetadata(2), + destination, + connection, + }, + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-3', + }, + action: 'insert', + }), + metadata: generateMetadata(3), + destination, + connection, + }, + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-4', + }, + action: 'insert', + }), + metadata: generateMetadata(4), + destination, + connection, + }, + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-5', + }, + action: 'update', + }), + metadata: generateMetadata(5), + destination, + connection, + }, + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-6', + }, + action: 'delete', + }), + metadata: generateMetadata(6), + destination, + connection, + }, + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-7', + }, + action: 'delete', + }), + metadata: generateMetadata(7), + destination, + connection, + }, + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-8', + }, + action: 'dummy-action', + }), + metadata: generateMetadata(8), + destination, + connection, + }, + { + message: { + type: 'identify', + action: 'insert', + identifiers: { + id: 'test-id-9', + }, + anonymousId: 'anonId1', + userId: 'userId1', + integrations: { + All: true, + }, + originalTimestamp: '2024-03-04T15:32:56.409Z', + }, + metadata: generateMetadata(9), + destination, + connection, + }, + { + message: generateRecordPayload({ + action: 'insert', + }), + metadata: generateMetadata(10), + destination, + connection, + }, + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-7', + email: 'test@gmail.com', + }, + action: 'insert', + }), + metadata: generateMetadata(11), + destination, + connection, + }, + ], + destType, +}; + +// scenario when all the events are malfunctioned +const routerRequest2 = { + input: [ + { + message: generateRecordPayload({ + identifiers: { + id: [], + }, + action: 'insert', + }), + metadata: generateMetadata(1), + destination, + connection: inValidConnection, + }, + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-1', + }, + action: 'insert', + }), + metadata: generateMetadata(2), + destination, + connection: inValidConnection, + }, + { + message: generateRecordPayload({ + identifiers: { + id: 'test-id-1', + }, + action: 'insert', + }), + metadata: generateMetadata(3), + destination, + connection: { + ...connection, + config: { + ...connection.config, + destination: { + audienceId: 'test-audience-id', + }, + }, + }, + }, + ], + destType, +}; + +export const data = [ + { + id: 'customerio-segment-router-test-1', + name: destType, + description: 'Basic Router Test to test correct record payloads', + scenario: 'Framework+Business', + successCriteria: 'All events should be transformed successfully and status code should be 200', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: routerRequest1, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: insertOrUpdateEndpoint, + headers, + params, + body: { + JSON: { + ids: ['test-id-1', 'test-id-2', 'test-id-3'], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [generateMetadata(1), generateMetadata(2), generateMetadata(3)], + batched: true, + statusCode: 200, + destination, + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: insertOrUpdateEndpoint, + headers, + params, + body: { + JSON: { + ids: ['test-id-4', 'test-id-5'], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [generateMetadata(4), generateMetadata(5)], + batched: true, + statusCode: 200, + destination, + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: deleteEndpoint, + headers, + params, + body: { + JSON: { + ids: ['test-id-6', 'test-id-7'], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [generateMetadata(6), generateMetadata(7)], + batched: true, + statusCode: 200, + destination, + }, + { + metadata: [generateMetadata(8)], + batched: false, + statusCode: 400, + error: + "action: Invalid enum value. Expected 'insert' | 'update' | 'delete', received 'dummy-action'", + statTags: RouterInstrumentationErrorStatTags, + destination, + }, + { + metadata: [generateMetadata(9)], + batched: false, + statusCode: 400, + error: 'type: Invalid literal value, expected "record"', + statTags: RouterInstrumentationErrorStatTags, + destination, + }, + { + metadata: [generateMetadata(10)], + batched: false, + statusCode: 400, + error: 'identifiers: cannot be empty', + statTags: RouterInstrumentationErrorStatTags, + destination, + }, + { + metadata: [generateMetadata(11)], + batched: false, + statusCode: 400, + error: 'identifiers: only one identifier is supported', + statTags: RouterInstrumentationErrorStatTags, + destination, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + id: 'customerio-segment-router-test-2', + name: destType, + description: 'Basic Router Test to test incorrect connection config', + scenario: 'Framework', + successCriteria: 'All events should throw error', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: routerRequest2, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + metadata: [generateMetadata(1)], + batched: false, + statusCode: 400, + error: + 'audienceId: String must contain at least 1 character(s); identifierMappings: Required', + statTags: RouterConfigurationErrorStatTags, + destination, + }, + { + metadata: [generateMetadata(2)], + batched: false, + statusCode: 400, + error: + 'audienceId: String must contain at least 1 character(s); identifierMappings: Required', + statTags: RouterConfigurationErrorStatTags, + destination, + }, + { + metadata: [generateMetadata(3)], + batched: false, + statusCode: 400, + error: 'identifierMappings: Required', + statTags: RouterConfigurationErrorStatTags, + destination, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, +]; diff --git a/test/integrations/destinations/delighted/maskedSecrets.ts b/test/integrations/destinations/delighted/maskedSecrets.ts new file mode 100644 index 00000000000..74d160ff192 --- /dev/null +++ b/test/integrations/destinations/delighted/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${base64Convertor(secret1)}`; diff --git a/test/integrations/destinations/delighted/network.ts b/test/integrations/destinations/delighted/network.ts index 1ccc785ea32..ce7c7da9dc5 100644 --- a/test/integrations/destinations/delighted/network.ts +++ b/test/integrations/destinations/delighted/network.ts @@ -1,9 +1,11 @@ +import { authHeader1 } from './maskedSecrets'; + export const networkCallsData = [ { httpReq: { url: 'https://api.delighted.com/v1/people.json', method: 'GET', - headers: { Authorization: `Basic ZHVtbXlBcGlLZXk=` }, + headers: { Authorization: authHeader1 }, params: { email: 'identified_user@email.com', }, @@ -17,7 +19,7 @@ export const networkCallsData = [ httpReq: { url: 'https://api.delighted.com/v1/people.json', method: 'GET', - headers: { Authorization: `Basic ZHVtbXlBcGlLZXlmb3JmYWlsdXJl` }, + headers: { Authorization: authHeader1 }, params: { email: 'unidentified_user@email.com', }, @@ -31,9 +33,9 @@ export const networkCallsData = [ httpReq: { url: 'https://api.delighted.com/v1/people.json', method: 'GET', - headers: { Authorization: `Basic ZHVtbXlBcGlLZXlmb3JmYWlsdXJl` }, + headers: { Authorization: authHeader1 }, params: { - email: 'test@rudderlabs.com', + email: 'test429@rudderlabs.com', }, }, httpRes: { diff --git a/test/integrations/destinations/delighted/processor/data.ts b/test/integrations/destinations/delighted/processor/data.ts index f35c2d8ecb8..41d4b8987fb 100644 --- a/test/integrations/destinations/delighted/processor/data.ts +++ b/test/integrations/destinations/delighted/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'delighted', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -77,7 +78,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.delighted.com/v1/people.json', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -116,7 +117,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -186,7 +187,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', @@ -211,7 +212,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -295,7 +296,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', @@ -320,7 +321,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKeyforfailure', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -409,7 +410,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -497,7 +498,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -585,7 +586,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -666,7 +667,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -754,7 +755,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -847,7 +848,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -918,7 +919,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.delighted.com/v1/people.json', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -956,7 +957,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKeyforfailure', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [ @@ -995,7 +996,7 @@ export const data = [ session_id: '3049dc4c-5a95-4ccd-a3e7-d74a7e411f22', originalTimestamp: '2019-10-14T09:03:17.562Z', type: 'track', - userId: 'test@rudderlabs.com', + userId: 'test429@rudderlabs.com', event: 'Product Reviewed', properties: { review_id: '12345', @@ -1017,8 +1018,10 @@ export const data = [ status: 200, body: [ { - error: - '{"message":"Error occurred while checking user: {}","destinationResponse":{"response":{},"status":429}}', + error: JSON.stringify({ + message: 'Error occurred while checking user: {}', + destinationResponse: { response: {}, status: 429 }, + }), statTags: { destType: 'DELIGHTED', errorCategory: 'network', diff --git a/test/integrations/destinations/delighted/router/data.ts b/test/integrations/destinations/delighted/router/data.ts index b9e98823831..776f0680a9f 100644 --- a/test/integrations/destinations/delighted/router/data.ts +++ b/test/integrations/destinations/delighted/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'delighted', @@ -12,7 +13,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [{ event: '' }], @@ -54,7 +55,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [{ event: '' }], @@ -120,7 +121,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', @@ -131,7 +132,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [{ event: '' }], @@ -151,7 +152,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', @@ -162,7 +163,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, channel: 'email', delay: 0, eventNamesSettings: [{ event: '' }], diff --git a/test/integrations/destinations/drip/maskedSecrets.ts b/test/integrations/destinations/drip/maskedSecrets.ts new file mode 100644 index 00000000000..74d160ff192 --- /dev/null +++ b/test/integrations/destinations/drip/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${base64Convertor(secret1)}`; diff --git a/test/integrations/destinations/drip/processor/data.ts b/test/integrations/destinations/drip/processor/data.ts index 1874f932fa1..c0065b128e7 100644 --- a/test/integrations/destinations/drip/processor/data.ts +++ b/test/integrations/destinations/drip/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'drip', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '', enableUserCreation: true, @@ -75,7 +76,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getdrip.com/v2/1809802/subscribers', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -119,7 +120,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '', enableUserCreation: true, @@ -204,7 +205,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '', enableUserCreation: true, @@ -266,7 +267,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getdrip.com/v2/1809802/subscribers', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -311,7 +312,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: true, @@ -375,7 +376,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getdrip.com/v2/1809802/campaigns/915194776/subscribers', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -413,7 +414,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: true, @@ -475,7 +476,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getdrip.com/v2/1809802/events', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -517,7 +518,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: true, @@ -600,7 +601,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: false, @@ -662,7 +663,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getdrip.com/v2/1809802/events', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -704,7 +705,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: false, @@ -764,7 +765,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getdrip.com/v2/1809802/events', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -806,7 +807,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: false, @@ -887,7 +888,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: false, @@ -949,7 +950,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getdrip.com/v3/1809802/shopper_activity/order', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -986,7 +987,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: false, @@ -1054,7 +1055,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getdrip.com/v3/1809802/shopper_activity/order', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1097,7 +1098,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: false, @@ -1160,7 +1161,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getdrip.com/v2/1809802/events', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1202,7 +1203,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '', enableUserCreation: true, @@ -1443,7 +1444,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.getdrip.com/v2/1809802/subscribers', headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, diff --git a/test/integrations/destinations/drip/router/data.ts b/test/integrations/destinations/drip/router/data.ts index 44aac7dd1ab..47bae3d87ef 100644 --- a/test/integrations/destinations/drip/router/data.ts +++ b/test/integrations/destinations/drip/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'drip', @@ -12,7 +13,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '', enableUserCreation: true, @@ -54,7 +55,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: true, @@ -123,7 +124,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', @@ -134,7 +135,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '', enableUserCreation: true, @@ -163,7 +164,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Basic ZHVtbXlBcGlLZXk=', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', @@ -174,7 +175,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, accountId: '1809802', campaignId: '915194776', enableUserCreation: true, diff --git a/test/integrations/destinations/dynamic_yield/processor/data.ts b/test/integrations/destinations/dynamic_yield/processor/data.ts index f72f1574f71..76537a589b2 100644 --- a/test/integrations/destinations/dynamic_yield/processor/data.ts +++ b/test/integrations/destinations/dynamic_yield/processor/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'dynamic_yield', @@ -32,7 +34,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, hashEmail: true, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, @@ -62,7 +64,7 @@ export const data = [ endpoint: 'https://dy-api.com/v2/collect/user/event', headers: { 'Content-Type': 'application/json', - 'DY-API-Key': 'dummyApiKey', + 'DY-API-Key': defaultApiKey, }, params: {}, body: { @@ -126,7 +128,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, hashEmail: false, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, @@ -156,7 +158,7 @@ export const data = [ endpoint: 'https://dy-api.com/v2/collect/user/event', headers: { 'Content-Type': 'application/json', - 'DY-API-Key': 'dummyApiKey', + 'DY-API-Key': defaultApiKey, }, params: {}, body: { @@ -233,7 +235,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, hashEmail: false, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, @@ -263,7 +265,7 @@ export const data = [ endpoint: 'https://dy-api.com/v2/collect/user/event', headers: { 'Content-Type': 'application/json', - 'DY-API-Key': 'dummyApiKey', + 'DY-API-Key': defaultApiKey, }, params: {}, body: { @@ -326,7 +328,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, hashEmail: false, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, @@ -356,7 +358,7 @@ export const data = [ endpoint: 'https://dy-api.com/v2/collect/user/event', headers: { 'Content-Type': 'application/json', - 'DY-API-Key': 'dummyApiKey', + 'DY-API-Key': defaultApiKey, }, params: {}, body: { @@ -433,7 +435,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, hashEmail: false, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, @@ -463,7 +465,7 @@ export const data = [ endpoint: 'https://dy-api.com/v2/collect/user/event', headers: { 'Content-Type': 'application/json', - 'DY-API-Key': 'dummyApiKey', + 'DY-API-Key': defaultApiKey, }, params: {}, body: { @@ -541,7 +543,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, hashEmail: false, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, @@ -571,7 +573,7 @@ export const data = [ endpoint: 'https://dy-api.com/v2/collect/user/event', headers: { 'Content-Type': 'application/json', - 'DY-API-Key': 'dummyApiKey', + 'DY-API-Key': defaultApiKey, }, params: {}, body: { @@ -667,7 +669,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, hashEmail: false, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, @@ -697,7 +699,7 @@ export const data = [ endpoint: 'https://dy-api.com/v2/collect/user/event', headers: { 'Content-Type': 'application/json', - 'DY-API-Key': 'dummyApiKey', + 'DY-API-Key': defaultApiKey, }, params: {}, body: { @@ -774,7 +776,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, }, @@ -845,7 +847,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, }, @@ -999,7 +1001,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, }, diff --git a/test/integrations/destinations/emarsys/dataDelivery/data.ts b/test/integrations/destinations/emarsys/dataDelivery/data.ts index ac3ec780f7a..6f3ae661a7a 100644 --- a/test/integrations/destinations/emarsys/dataDelivery/data.ts +++ b/test/integrations/destinations/emarsys/dataDelivery/data.ts @@ -1,6 +1,6 @@ import { generateMetadata, generateProxyV1Payload } from '../../../testUtils'; import { ProxyV1TestData } from '../../../testTypes'; - +import { defaultAccessToken } from '../../../common/secrets'; export const headerBlockWithCorrectAccessToken = { 'Content-Type': 'application/json', Accept: 'application/json', @@ -115,7 +115,7 @@ export const metadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -127,7 +127,7 @@ export const metadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -220,12 +220,12 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { statusCode: 400, metadata: generateMetadata(1), - error: '{"2004":"Invalid key field id: 100"}', + error: JSON.stringify({ '2004': 'Invalid key field id: 100' }), }, { statusCode: 400, metadata: generateMetadata(2), - error: '{"2004":"Invalid key field id: 100"}', + error: JSON.stringify({ '2004': 'Invalid key field id: 100' }), }, ], }, @@ -337,7 +337,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { statusCode: 400, metadata: generateMetadata(2), - error: '{"2010":"Contacts with the external id already exist: 3"}', + error: JSON.stringify({ '2010': 'Contacts with the external id already exist: 3' }), }, ], }, @@ -427,12 +427,20 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { statusCode: 400, metadata: generateMetadata(1), - error: '{"replyCode":2004,"replyText":"Invalid key field id: wrong_id","data":""}', + error: JSON.stringify({ + replyCode: 2004, + replyText: 'Invalid key field id: wrong_id', + data: '', + }), }, { statusCode: 400, metadata: generateMetadata(2), - error: '{"replyCode":2004,"replyText":"Invalid key field id: wrong_id","data":""}', + error: JSON.stringify({ + replyCode: 2004, + replyText: 'Invalid key field id: wrong_id', + data: '', + }), }, ], }, @@ -495,12 +503,12 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { statusCode: 400, metadata: generateMetadata(2), - error: '{"2008":"No contact found with the external id: 3"}', + error: JSON.stringify({ '2008': 'No contact found with the external id: 3' }), }, { statusCode: 400, metadata: generateMetadata(3), - error: '{"2008":"No contact found with the external id: 3"}', + error: JSON.stringify({ '2008': 'No contact found with the external id: 3' }), }, { statusCode: 200, @@ -547,7 +555,11 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { statusCode: 400, metadata: generateMetadata(1), - error: '{"replyCode":1,"replyText":"Action Wrong-id is invalid.","data":""}', + error: JSON.stringify({ + replyCode: 1, + replyText: 'Action Wrong-id is invalid.', + data: '', + }), }, ], }, diff --git a/test/integrations/destinations/engage/deleteUsers/data.ts b/test/integrations/destinations/engage/deleteUsers/data.ts index 5a6ea9d2680..d4e76549c6c 100644 --- a/test/integrations/destinations/engage/deleteUsers/data.ts +++ b/test/integrations/destinations/engage/deleteUsers/data.ts @@ -1,3 +1,5 @@ +import { secret1, secret2 } from '../maskedSecrets'; + export const data = [ { name: 'engage', @@ -22,8 +24,8 @@ export const data = [ }, ], config: { - publicKey: 'abcd', - privateKey: 'efgh', + publicKey: secret1, + privateKey: secret2, }, }, ], @@ -64,8 +66,8 @@ export const data = [ }, ], config: { - publicKey: 'abcd', - privateKey: 'efgh', + publicKey: secret1, + privateKey: secret2, }, }, ], @@ -106,8 +108,8 @@ export const data = [ }, ], config: { - publicKey: 'abcd', - privateKey: 'efgh', + publicKey: secret1, + privateKey: secret2, }, }, ], @@ -142,8 +144,8 @@ export const data = [ }, ], config: { - publicKey: 'abcd', - privateKey: 'efgh', + publicKey: secret1, + privateKey: secret2, }, }, ], @@ -181,7 +183,7 @@ export const data = [ }, ], config: { - privateKey: 'abcd', + privateKey: secret2, }, }, ], @@ -219,8 +221,8 @@ export const data = [ }, ], config: { - publicKey: 'abcd', - privateKey: 'efgh', + publicKey: secret1, + privateKey: secret2, }, }, ], diff --git a/test/integrations/destinations/engage/maskedSecrets.ts b/test/integrations/destinations/engage/maskedSecrets.ts new file mode 100644 index 00000000000..cc8cbd337ba --- /dev/null +++ b/test/integrations/destinations/engage/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; diff --git a/test/integrations/destinations/engage/network.ts b/test/integrations/destinations/engage/network.ts index a675603d4ec..0a748e4eb33 100644 --- a/test/integrations/destinations/engage/network.ts +++ b/test/integrations/destinations/engage/network.ts @@ -1,3 +1,5 @@ +import { authHeader1 } from './maskedSecrets'; + const deleteNwData = [ { httpReq: { @@ -61,7 +63,7 @@ const deleteNwData = [ url: 'https://api.engage.so/v1/users/6', 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZDplZmdo', + Authorization: authHeader1, }, httpRes: { data: { @@ -78,7 +80,7 @@ const deleteNwData = [ url: 'https://api.engage.so/v1/users/7', 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZDplZmdo', + Authorization: authHeader1, }, httpRes: { status: 200, @@ -91,7 +93,7 @@ const deleteNwData = [ url: 'https://api.engage.so/v1/users/8', 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZDplZmdo', + Authorization: authHeader1, }, httpRes: { data: { @@ -108,7 +110,7 @@ const deleteNwData = [ url: 'https://api.engage.so/v1/users/9', 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZDplZmdo', + Authorization: authHeader1, }, httpRes: { status: 200, diff --git a/test/integrations/destinations/engage/processor/data.ts b/test/integrations/destinations/engage/processor/data.ts index b0b3ae8ec3e..1bca1fb1a32 100644 --- a/test/integrations/destinations/engage/processor/data.ts +++ b/test/integrations/destinations/engage/processor/data.ts @@ -1,3 +1,5 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; + export const data = [ { name: 'engage', @@ -21,8 +23,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, }, }, }, @@ -83,8 +85,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -127,8 +129,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic NDl1cjQ5MHJqZm8zNGdpMDR5MzhyOWdvOm44OWczODl5cjM4OWZnYmVmMHUycmZm', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.engage.so/v1/users/1', @@ -168,8 +169,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -212,8 +213,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic NDl1cjQ5MHJqZm8zNGdpMDR5MzhyOWdvOm44OWczODl5cjM4OWZnYmVmMHUycmZm', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.engage.so/v1/users/1', @@ -253,8 +253,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, }, }, }, @@ -293,8 +293,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic NDl1cjQ5MHJqZm8zNGdpMDR5MzhyOWdvOm44OWczODl5cjM4OWZnYmVmMHUycmZm', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.engage.so/v1/users/1', @@ -326,8 +325,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, }, }, }, @@ -357,8 +356,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic NDl1cjQ5MHJqZm8zNGdpMDR5MzhyOWdvOm44OWczODl5cjM4OWZnYmVmMHUycmZm', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.engage.so/v1/users/1/events', @@ -384,8 +382,8 @@ export const data = [ message: { userId: 1, name: 'Contact Customer Care', category: 'Help', type: 'page' }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, }, }, }, @@ -411,8 +409,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic NDl1cjQ5MHJqZm8zNGdpMDR5MzhyOWdvOm44OWczODl5cjM4OWZnYmVmMHUycmZm', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.engage.so/v1/users/1/events', @@ -447,8 +444,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -472,8 +469,7 @@ export const data = [ endpoint: 'https://api.engage.so/v1/lists/17/subscribers/246', headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic NDl1cjQ5MHJqZm8zNGdpMDR5MzhyOWdvOm44OWczODl5cjM4OWZnYmVmMHUycmZm', + Authorization: authHeader1, }, params: {}, body: { JSON: { subscribed: 'false' }, JSON_ARRAY: {}, XML: {}, FORM: {} }, @@ -503,8 +499,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -559,8 +555,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -597,8 +593,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic NDl1cjQ5MHJqZm8zNGdpMDR5MzhyOWdvOm44OWczODl5cjM4OWZnYmVmMHUycmZm', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.engage.so/v1/lists/17/subscribers', @@ -630,8 +625,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -656,8 +651,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic NDl1cjQ5MHJqZm8zNGdpMDR5MzhyOWdvOm44OWczODl5cjM4OWZnYmVmMHUycmZm', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.engage.so/v1/lists/17/subscribers/1', diff --git a/test/integrations/destinations/engage/router/data.ts b/test/integrations/destinations/engage/router/data.ts index 248deff04dc..2dec38eebda 100644 --- a/test/integrations/destinations/engage/router/data.ts +++ b/test/integrations/destinations/engage/router/data.ts @@ -1,3 +1,5 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; + export const data = [ { name: 'engage', @@ -18,8 +20,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -47,8 +49,7 @@ export const data = [ endpoint: 'https://api.engage.so/v1/lists/17/subscribers/246', headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic NDl1cjQ5MHJqZm8zNGdpMDR5MzhyOWdvOm44OWczODl5cjM4OWZnYmVmMHUycmZm', + Authorization: authHeader1, }, params: {}, body: { JSON: { subscribed: true }, JSON_ARRAY: {}, XML: {}, FORM: {} }, @@ -56,8 +57,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -107,8 +108,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -155,16 +156,15 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic NDl1cjQ5MHJqZm8zNGdpMDR5MzhyOWdvOm44OWczODl5cjM4OWZnYmVmMHUycmZm', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.engage.so/v1/users/1', }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -199,8 +199,8 @@ export const data = [ }, destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, @@ -224,8 +224,8 @@ export const data = [ metadata: [{ jobId: 3, userId: 'u1' }], destination: { Config: { - publicKey: '49ur490rjfo34gi04y38r9go', - privateKey: 'n89g389yr389fgbef0u2rff', + publicKey: secret1, + privateKey: secret2, listIds: [ { listId: '9834trg3rgy3g08oi9893rgfb' }, { listId: 'f39487tyh49go3h093gh2if2f2' }, diff --git a/test/integrations/destinations/eventbridge/data.ts b/test/integrations/destinations/eventbridge/data.ts index e9edde68dcd..5a5bc3d64d9 100644 --- a/test/integrations/destinations/eventbridge/data.ts +++ b/test/integrations/destinations/eventbridge/data.ts @@ -142,8 +142,97 @@ export const data = [ { output: { DetailType: 'newDetailType', - Detail: - '{"channel":"web","context":{"app":{"build":"1.0.0","name":"RudderLabs JavaScript SDK","namespace":"com.rudderlabs.javascript","version":"1.1.2"},"traits":{"abc":"1234"},"library":{"name":"RudderLabs JavaScript SDK","version":"1.1.2"},"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","locale":"en-GB","os":{"name":"","version":""},"screen":{"density":2},"page":{"path":"/tests/html/ecomm_test.html","referrer":"http://0.0.0.0:1112/tests/html/","search":"","title":"GA Ecommerce Test","url":"http://0.0.0.0:1112/tests/html/ecomm_test.html"}},"type":"track","messageId":"9116b734-7e6b-4497-ab51-c16744d4487e","originalTimestamp":"2020-06-24T12:05:19.394Z","anonymousId":"38e169a1-3234-46f7-9ceb-c1a6a69005fe","userId":"123","event":"Checkout Started","properties":{"order_id":"5241735","value":31.98,"revenue":31.98,"shipping":4,"coupon":"APPARELSALE","currency":"GBP","products":[{"id":"product-bacon-jam","sku":"sku-1","category":"Merch","name":"Food/Drink","brand":"","variant":"Extra topped","price":3,"quantity":2,"currency":"GBP","position":1,"value":6,"typeOfProduct":"Food","url":"https://www.example.com/product/bacon-jam","image_url":"https://www.example.com/product/bacon-jam.jpg"},{"id":"product-t-shirt","sku":"sku-2","category":"Merch","name":"T-Shirt","brand":"Levis","variant":"White","price":12.99,"quantity":1,"currency":"GBP","position":2,"value":12.99,"typeOfProduct":"Shirt","url":"https://www.example.com/product/t-shirt","image_url":"https://www.example.com/product/t-shirt.jpg"},{"id":"offer-t-shirt","sku":"sku-3","category":"Merch","name":"T-Shirt-on-offer","brand":"Levis","variant":"Black","price":12.99,"quantity":1,"currency":"GBP","value":12.99,"coupon":"APPARELSALE","typeOfProduct":"Shirt","url":"https://www.example.com/product/offer-t-shirt","image_url":"https://www.example.com/product/offer-t-shirt.jpg"}]},"integrations":{"All":true},"sentAt":"2020-06-24T12:05:19.395Z"}', + Detail: JSON.stringify({ + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.1.2', + }, + traits: { abc: '1234' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.2' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36', + locale: 'en-GB', + os: { name: '', version: '' }, + screen: { density: 2 }, + page: { + path: '/tests/html/ecomm_test.html', + referrer: 'http://0.0.0.0:1112/tests/html/', + search: '', + title: 'GA Ecommerce Test', + url: 'http://0.0.0.0:1112/tests/html/ecomm_test.html', + }, + }, + type: 'track', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + originalTimestamp: '2020-06-24T12:05:19.394Z', + anonymousId: '38e169a1-3234-46f7-9ceb-c1a6a69005fe', + userId: '123', + event: 'Checkout Started', + properties: { + order_id: '5241735', + value: 31.98, + revenue: 31.98, + shipping: 4, + coupon: 'APPARELSALE', + currency: 'GBP', + products: [ + { + id: 'product-bacon-jam', + sku: 'sku-1', + category: 'Merch', + name: 'Food/Drink', + brand: '', + variant: 'Extra topped', + price: 3, + quantity: 2, + currency: 'GBP', + position: 1, + value: 6, + typeOfProduct: 'Food', + url: 'https://www.example.com/product/bacon-jam', + image_url: 'https://www.example.com/product/bacon-jam.jpg', + }, + { + id: 'product-t-shirt', + sku: 'sku-2', + category: 'Merch', + name: 'T-Shirt', + brand: 'Levis', + variant: 'White', + price: 12.99, + quantity: 1, + currency: 'GBP', + position: 2, + value: 12.99, + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/t-shirt', + image_url: 'https://www.example.com/product/t-shirt.jpg', + }, + { + id: 'offer-t-shirt', + sku: 'sku-3', + category: 'Merch', + name: 'T-Shirt-on-offer', + brand: 'Levis', + variant: 'Black', + price: 12.99, + quantity: 1, + currency: 'GBP', + value: 12.99, + coupon: 'APPARELSALE', + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/offer-t-shirt', + image_url: 'https://www.example.com/product/offer-t-shirt.jpg', + }, + ], + }, + integrations: { All: true }, + sentAt: '2020-06-24T12:05:19.395Z', + }), EventBusName: 'rudder-test1', Resources: [ 'arn:aws:events:*****:*****:event-bus/rudder-test1', @@ -300,8 +389,96 @@ export const data = [ { output: { DetailType: 'newDetailType', - Detail: - '{"channel":"web","context":{"app":{"build":"1.0.0","name":"RudderLabs JavaScript SDK","namespace":"com.rudderlabs.javascript","version":"1.1.2"},"traits":{"abc":"1234"},"library":{"name":"RudderLabs JavaScript SDK","version":"1.1.2"},"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36","locale":"en-GB","os":{"name":"","version":""},"screen":{"density":2},"page":{"path":"/tests/html/ecomm_test.html","referrer":"http://0.0.0.0:1112/tests/html/","search":"","title":"GA Ecommerce Test","url":"http://0.0.0.0:1112/tests/html/ecomm_test.html"}},"type":"track","messageId":"9116b734-7e6b-4497-ab51-c16744d4487e","originalTimestamp":"2020-06-24T12:05:19.394Z","anonymousId":"38e169a1-3234-46f7-9ceb-c1a6a69005fe","event":"Checkout Started","properties":{"order_id":"5241735","value":31.98,"revenue":31.98,"shipping":4,"coupon":"APPARELSALE","currency":"GBP","products":[{"id":"product-bacon-jam","sku":"sku-1","category":"Merch","name":"Food/Drink","brand":"","variant":"Extra topped","price":3,"quantity":2,"currency":"GBP","position":1,"value":6,"typeOfProduct":"Food","url":"https://www.example.com/product/bacon-jam","image_url":"https://www.example.com/product/bacon-jam.jpg"},{"id":"product-t-shirt","sku":"sku-2","category":"Merch","name":"T-Shirt","brand":"Levis","variant":"White","price":12.99,"quantity":1,"currency":"GBP","position":2,"value":12.99,"typeOfProduct":"Shirt","url":"https://www.example.com/product/t-shirt","image_url":"https://www.example.com/product/t-shirt.jpg"},{"id":"offer-t-shirt","sku":"sku-3","category":"Merch","name":"T-Shirt-on-offer","brand":"Levis","variant":"Black","price":12.99,"quantity":1,"currency":"GBP","value":12.99,"coupon":"APPARELSALE","typeOfProduct":"Shirt","url":"https://www.example.com/product/offer-t-shirt","image_url":"https://www.example.com/product/offer-t-shirt.jpg"}]},"integrations":{"All":true},"sentAt":"2020-06-24T12:05:19.395Z"}', + Detail: JSON.stringify({ + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.1.2', + }, + traits: { abc: '1234' }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.2' }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36', + locale: 'en-GB', + os: { name: '', version: '' }, + screen: { density: 2 }, + page: { + path: '/tests/html/ecomm_test.html', + referrer: 'http://0.0.0.0:1112/tests/html/', + search: '', + title: 'GA Ecommerce Test', + url: 'http://0.0.0.0:1112/tests/html/ecomm_test.html', + }, + }, + type: 'track', + messageId: '9116b734-7e6b-4497-ab51-c16744d4487e', + originalTimestamp: '2020-06-24T12:05:19.394Z', + anonymousId: '38e169a1-3234-46f7-9ceb-c1a6a69005fe', + event: 'Checkout Started', + properties: { + order_id: '5241735', + value: 31.98, + revenue: 31.98, + shipping: 4, + coupon: 'APPARELSALE', + currency: 'GBP', + products: [ + { + id: 'product-bacon-jam', + sku: 'sku-1', + category: 'Merch', + name: 'Food/Drink', + brand: '', + variant: 'Extra topped', + price: 3, + quantity: 2, + currency: 'GBP', + position: 1, + value: 6, + typeOfProduct: 'Food', + url: 'https://www.example.com/product/bacon-jam', + image_url: 'https://www.example.com/product/bacon-jam.jpg', + }, + { + id: 'product-t-shirt', + sku: 'sku-2', + category: 'Merch', + name: 'T-Shirt', + brand: 'Levis', + variant: 'White', + price: 12.99, + quantity: 1, + currency: 'GBP', + position: 2, + value: 12.99, + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/t-shirt', + image_url: 'https://www.example.com/product/t-shirt.jpg', + }, + { + id: 'offer-t-shirt', + sku: 'sku-3', + category: 'Merch', + name: 'T-Shirt-on-offer', + brand: 'Levis', + variant: 'Black', + price: 12.99, + quantity: 1, + currency: 'GBP', + value: 12.99, + coupon: 'APPARELSALE', + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/offer-t-shirt', + image_url: 'https://www.example.com/product/offer-t-shirt.jpg', + }, + ], + }, + integrations: { All: true }, + sentAt: '2020-06-24T12:05:19.395Z', + }), EventBusName: 'rudder-test1', Resources: [ 'arn:aws:events:*****:*****:event-bus/rudder-test1', diff --git a/test/integrations/destinations/examples/processor/data.ts b/test/integrations/destinations/examples/processor/data.ts new file mode 100644 index 00000000000..bd108005a78 --- /dev/null +++ b/test/integrations/destinations/examples/processor/data.ts @@ -0,0 +1,24 @@ +import { TestCaseData } from '../../../testTypes'; +export const skip = true; +export const data: TestCaseData[] = [ + { + name: 'test', + module: 'test', + description: 'test', + feature: 'test', + input: { + request: { + method: 'GET', + body: { + test: 'test', + }, + }, + }, + output: { + response: { + status: 200, + body: 'test', + }, + }, + }, +]; diff --git a/test/integrations/destinations/examples/router/data.ts b/test/integrations/destinations/examples/router/data.ts new file mode 100644 index 00000000000..601fedd66e0 --- /dev/null +++ b/test/integrations/destinations/examples/router/data.ts @@ -0,0 +1,24 @@ +import { TestCaseData } from '../../../testTypes'; +export const data: TestCaseData[] = [ + { + name: 'test', + module: 'test', + description: 'test', + feature: 'test', + skip: true, + input: { + request: { + method: 'GET', + body: { + test: 'test', + }, + }, + }, + output: { + response: { + status: 200, + body: 'test', + }, + }, + }, +]; diff --git a/test/integrations/destinations/facebook_conversions/processor/data.ts b/test/integrations/destinations/facebook_conversions/processor/data.ts index 49d2416726c..7832962f7ed 100644 --- a/test/integrations/destinations/facebook_conversions/processor/data.ts +++ b/test/integrations/destinations/facebook_conversions/processor/data.ts @@ -314,7 +314,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -323,7 +323,21 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"spin_result","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"value":400,"currency":"USD"}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'spin_result', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + value: 400, + currency: 'USD', + }, + }), ], }, }, @@ -433,7 +447,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -442,7 +456,24 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"Search","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"content_ids":[],"contents":[],"content_type":"product","currency":"USD","value":400}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'Search', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + content_ids: [], + contents: [], + content_type: 'product', + currency: 'USD', + value: 400, + }, + }), ], }, }, @@ -552,7 +583,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -561,7 +592,24 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"AddToCart","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"content_ids":[],"contents":[],"content_type":"product","currency":"USD","value":400}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'AddToCart', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + content_ids: [], + contents: [], + content_type: 'product', + currency: 'USD', + value: 400, + }, + }), ], }, }, @@ -671,7 +719,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -680,7 +728,24 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"ViewContent","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"content_ids":[],"contents":[],"content_type":"product","currency":"USD","value":400}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'ViewContent', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + content_ids: [], + contents: [], + content_type: 'product', + currency: 'USD', + value: 400, + }, + }), ], }, }, @@ -797,7 +862,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -806,7 +871,25 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"ViewContent","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"products":[{"product_id":1234,"quantity":5,"price":55}],"content_ids":[1234],"contents":[{"id":1234,"quantity":5,"item_price":55}],"content_type":"product","currency":"USD","value":400}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'ViewContent', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + products: [{ product_id: 1234, quantity: 5, price: 55 }], + content_ids: [1234], + contents: [{ id: 1234, quantity: 5, item_price: 55 }], + content_type: 'product', + currency: 'USD', + value: 400, + }, + }), ], }, }, @@ -917,7 +1000,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -926,7 +1009,26 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"ViewContent","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"category":"randomCategory","content_ids":["randomCategory"],"contents":[{"id":"randomCategory","quantity":1}],"content_type":"product_group","content_category":"randomCategory","currency":"USD","value":400}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'ViewContent', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + category: 'randomCategory', + content_ids: ['randomCategory'], + contents: [{ id: 'randomCategory', quantity: 1 }], + content_type: 'product_group', + content_category: 'randomCategory', + currency: 'USD', + value: 400, + }, + }), ], }, }, @@ -1036,7 +1138,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -1045,7 +1147,24 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"AddToWishlist","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"content_ids":[],"contents":[],"currency":"USD","value":400,"num_items":0}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'AddToWishlist', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + content_ids: [], + contents: [], + currency: 'USD', + value: 400, + num_items: 0, + }, + }), ], }, }, @@ -1165,7 +1284,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -1174,7 +1293,27 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"AddPaymentInfo","event_time":1699784211,"action_source":"website","custom_data":{"application_tracking_enabled":1,"content_name":"Checkout","content_type":"product","num_items":1,"products":[{"id":"12809","price":80,"quantity":1}],"revenue":93.99,"content_ids":["12809"],"contents":[{"id":"12809","quantity":1,"item_price":80}],"currency":"USD","value":93.99}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'AddPaymentInfo', + event_time: 1699784211, + action_source: 'website', + custom_data: { + application_tracking_enabled: 1, + content_name: 'Checkout', + content_type: 'product', + num_items: 1, + products: [{ id: '12809', price: 80, quantity: 1 }], + revenue: 93.99, + content_ids: ['12809'], + contents: [{ id: '12809', quantity: 1, item_price: 80 }], + currency: 'USD', + value: 93.99, + }, + }), ], }, }, @@ -1290,7 +1429,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -1299,7 +1438,29 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"AddPaymentInfo","event_time":1699784211,"action_source":"website","custom_data":{"application_tracking_enabled":1,"content_name":"Checkout","content_type":"product","num_items":1,"id":"12809","price":80,"quantity":1,"revenue":93.99,"content_ids":["12809"],"contents":[{"id":"12809","quantity":1,"item_price":80}],"currency":"USD","value":93.99}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'AddPaymentInfo', + event_time: 1699784211, + action_source: 'website', + custom_data: { + application_tracking_enabled: 1, + content_name: 'Checkout', + content_type: 'product', + num_items: 1, + id: '12809', + price: 80, + quantity: 1, + revenue: 93.99, + content_ids: ['12809'], + contents: [{ id: '12809', quantity: 1, item_price: 80 }], + currency: 'USD', + value: 93.99, + }, + }), ], }, }, @@ -1418,7 +1579,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -1427,7 +1588,40 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"Purchase","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"products":[{"product_id":1234,"quantity":5,"price":55,"delivery_category":"home_delivery"}],"content_ids":[1234],"contents":[{"id":1234,"quantity":5,"item_price":55,"delivery_category":"home_delivery"}],"content_type":"product","currency":"USD","value":400,"num_items":1}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'Purchase', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + products: [ + { + product_id: 1234, + quantity: 5, + price: 55, + delivery_category: 'home_delivery', + }, + ], + content_ids: [1234], + contents: [ + { + id: 1234, + quantity: 5, + item_price: 55, + delivery_category: 'home_delivery', + }, + ], + content_type: 'product', + currency: 'USD', + value: 400, + num_items: 1, + }, + }), ], }, }, @@ -1546,7 +1740,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -1555,7 +1749,34 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"Purchase","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"delivery_category":"home_delivery","products":[{"product_id":1234,"quantity":5,"price":55}],"content_ids":[1234],"contents":[{"id":1234,"quantity":5,"item_price":55,"delivery_category":"home_delivery"}],"content_type":"product","currency":"USD","value":400,"num_items":1}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'Purchase', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + delivery_category: 'home_delivery', + products: [{ product_id: 1234, quantity: 5, price: 55 }], + content_ids: [1234], + contents: [ + { + id: 1234, + quantity: 5, + item_price: 55, + delivery_category: 'home_delivery', + }, + ], + content_type: 'product', + currency: 'USD', + value: 400, + num_items: 1, + }, + }), ], }, }, @@ -1646,7 +1867,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -1655,7 +1876,26 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"Purchase","event_time":1699784211,"action_source":"website","custom_data":{"content_type":"product_group","revenue":400,"additional_bet_index":0,"products":[{"product_id":1234,"quantity":5,"price":55}],"content_ids":[1234],"contents":[{"id":1234,"quantity":5,"item_price":55}],"currency":"USD","value":400,"num_items":1}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'Purchase', + event_time: 1699784211, + action_source: 'website', + custom_data: { + content_type: 'product_group', + revenue: 400, + additional_bet_index: 0, + products: [{ product_id: 1234, quantity: 5, price: 55 }], + content_ids: [1234], + contents: [{ id: 1234, quantity: 5, item_price: 55 }], + currency: 'USD', + value: 400, + num_items: 1, + }, + }), ], }, }, @@ -1767,7 +2007,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -1776,7 +2016,26 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"AddToCart","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"id":"452345234","quantity":5,"content_ids":"452345234","contents":[{"id":"452345234","quantity":5}],"content_type":"product","currency":"USD","value":400}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'AddToCart', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + id: '452345234', + quantity: 5, + content_ids: '452345234', + contents: [{ id: '452345234', quantity: 5 }], + content_type: 'product', + currency: 'USD', + value: 400, + }, + }), ], }, }, diff --git a/test/integrations/destinations/facebook_conversions/router/data.ts b/test/integrations/destinations/facebook_conversions/router/data.ts index 5a9c0c513fe..2a9bed98f75 100644 --- a/test/integrations/destinations/facebook_conversions/router/data.ts +++ b/test/integrations/destinations/facebook_conversions/router/data.ts @@ -112,7 +112,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -121,7 +121,21 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"spin_result","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"value":400,"currency":"USD"}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'spin_result', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + value: 400, + currency: 'USD', + }, + }), ], }, }, @@ -150,7 +164,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyID/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyID/events?access_token=09876', headers: {}, params: {}, body: { @@ -159,7 +173,24 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","zp":"03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"},"event_name":"Search","event_time":1699784211,"action_source":"website","custom_data":{"revenue":400,"additional_bet_index":0,"content_ids":[],"contents":[],"content_type":"product","currency":"USD","value":400}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + zp: '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4', + }, + event_name: 'Search', + event_time: 1699784211, + action_source: 'website', + custom_data: { + revenue: 400, + additional_bet_index: 0, + content_ids: [], + contents: [], + content_type: 'product', + currency: 'USD', + value: 400, + }, + }), ], }, }, diff --git a/test/integrations/destinations/facebook_pixel/dataDelivery/business.ts b/test/integrations/destinations/facebook_pixel/dataDelivery/business.ts index 2b4af61ac3e..60f382e5661 100644 --- a/test/integrations/destinations/facebook_pixel/dataDelivery/business.ts +++ b/test/integrations/destinations/facebook_pixel/dataDelivery/business.ts @@ -4,7 +4,19 @@ import { VERSION } from '../../../../../src/v0/destinations/facebook_pixel/confi export const testFormData = { data: [ - '{"user_data":{"external_id":"c58f05b5e3cc4796f3181cf07349d306547c00b20841a175b179c6860e6a34ab","client_ip_address":"32.122.223.26","client_user_agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Mobile/15E148 Safari/604.1"},"event_name":"Checkout Step Viewed","event_time":1654772112,"event_source_url":"https://www.my.kaiser.com/checkout","event_id":"4f002656-a7b2-4c17-b9bd-8caa5a29190a","custom_data":{"checkout_id":"26SF29B","site":"www.my.kaiser.com","step":1}}', + JSON.stringify({ + user_data: { + external_id: 'c58f05b5e3cc4796f3181cf07349d306547c00b20841a175b179c6860e6a34ab', + client_ip_address: '32.122.223.26', + client_user_agent: + 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Mobile/15E148 Safari/604.1', + }, + event_name: 'Checkout Step Viewed', + event_time: 1654772112, + event_source_url: 'https://www.my.kaiser.com/checkout', + event_id: '4f002656-a7b2-4c17-b9bd-8caa5a29190a', + custom_data: { checkout_id: '26SF29B', site: 'www.my.kaiser.com', step: 1 }, + }), ], }; export const statTags = { @@ -91,7 +103,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request Processed Successfully', response: [ { - error: '{"events_received":1,"fbtrace_id":"facebook_trace_id"}', + error: JSON.stringify({ events_received: 1, fbtrace_id: 'facebook_trace_id' }), statusCode: 200, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/facebook_pixel/dataDelivery/data.ts b/test/integrations/destinations/facebook_pixel/dataDelivery/data.ts index 0e004c11832..9e38548834a 100644 --- a/test/integrations/destinations/facebook_pixel/dataDelivery/data.ts +++ b/test/integrations/destinations/facebook_pixel/dataDelivery/data.ts @@ -467,8 +467,13 @@ export const v0TestData = [ body: { output: { status: 500, - message: - '{"message":"Unhandled random error","type":"RandomException","code":5,"error_subcode":12,"fbtrace_id":"facebook_px_trace_id_10"}', + message: JSON.stringify({ + message: 'Unhandled random error', + type: 'RandomException', + code: 5, + error_subcode: 12, + fbtrace_id: 'facebook_px_trace_id_10', + }), destinationResponse: { error: { message: 'Unhandled random error', diff --git a/test/integrations/destinations/facebook_pixel/dataDelivery/other.ts b/test/integrations/destinations/facebook_pixel/dataDelivery/other.ts index 154c6f75ad9..a327bd782f2 100644 --- a/test/integrations/destinations/facebook_pixel/dataDelivery/other.ts +++ b/test/integrations/destinations/facebook_pixel/dataDelivery/other.ts @@ -72,8 +72,13 @@ export const otherScenariosV1: ProxyV1TestData[] = [ body: { output: { status: 500, - message: - '{"message":"Unhandled random error","type":"RandomException","code":5,"error_subcode":12,"fbtrace_id":"facebook_px_trace_id_10"}', + message: JSON.stringify({ + message: 'Unhandled random error', + type: 'RandomException', + code: 5, + error_subcode: 12, + fbtrace_id: 'facebook_px_trace_id_10', + }), statTags: { ...statTags, errorType: 'retryable', @@ -81,8 +86,13 @@ export const otherScenariosV1: ProxyV1TestData[] = [ }, response: [ { - error: - '{"message":"Unhandled random error","type":"RandomException","code":5,"error_subcode":12,"fbtrace_id":"facebook_px_trace_id_10"}', + error: JSON.stringify({ + message: 'Unhandled random error', + type: 'RandomException', + code: 5, + error_subcode: 12, + fbtrace_id: 'facebook_px_trace_id_10', + }), statusCode: 500, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/facebook_pixel/processor/configLevelFeaturesTestData.ts b/test/integrations/destinations/facebook_pixel/processor/configLevelFeaturesTestData.ts index 5a7beb41740..a8baee05863 100644 --- a/test/integrations/destinations/facebook_pixel/processor/configLevelFeaturesTestData.ts +++ b/test/integrations/destinations/facebook_pixel/processor/configLevelFeaturesTestData.ts @@ -116,6 +116,7 @@ export const configLevelFeaturesTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -203,6 +204,7 @@ export const configLevelFeaturesTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -294,6 +296,7 @@ export const configLevelFeaturesTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -397,6 +400,7 @@ export const configLevelFeaturesTestData: ProcessorTestData[] = [ }), }, ], + method: 'POST', }, }, output: { @@ -500,6 +504,7 @@ export const configLevelFeaturesTestData: ProcessorTestData[] = [ }), }, ], + method: 'POST', }, }, output: { @@ -611,6 +616,7 @@ export const configLevelFeaturesTestData: ProcessorTestData[] = [ }), }, ], + method: 'POST', }, }, output: { @@ -702,6 +708,7 @@ export const configLevelFeaturesTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/facebook_pixel/processor/ecommTestData.ts b/test/integrations/destinations/facebook_pixel/processor/ecommTestData.ts index 8e7f50ec2d2..a08469f5531 100644 --- a/test/integrations/destinations/facebook_pixel/processor/ecommTestData.ts +++ b/test/integrations/destinations/facebook_pixel/processor/ecommTestData.ts @@ -124,6 +124,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -207,6 +208,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -218,7 +220,7 @@ export const ecommTestData: ProcessorTestData[] = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyPixelId/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyPixelId/events?access_token=09876', headers: {}, params: {}, FORM: { @@ -314,6 +316,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -398,6 +401,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -482,6 +486,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -561,6 +566,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -572,7 +578,7 @@ export const ecommTestData: ProcessorTestData[] = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyPixelId/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyPixelId/events?access_token=09876', headers: {}, params: {}, FORM: { @@ -669,6 +675,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -754,6 +761,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -800,6 +808,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -879,6 +888,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -890,7 +900,7 @@ export const ecommTestData: ProcessorTestData[] = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyPixelId/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyPixelId/events?access_token=09876', headers: {}, params: {}, FORM: { @@ -988,6 +998,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -1097,6 +1108,7 @@ export const ecommTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/facebook_pixel/processor/identifyTestData.ts b/test/integrations/destinations/facebook_pixel/processor/identifyTestData.ts index d315b03cead..70419f7a0b0 100644 --- a/test/integrations/destinations/facebook_pixel/processor/identifyTestData.ts +++ b/test/integrations/destinations/facebook_pixel/processor/identifyTestData.ts @@ -1,5 +1,5 @@ import { VERSION } from '../../../../../src/v0/destinations/facebook_pixel/config'; -import { Destination } from '../../../../../src/types'; +import { Destination, RudderMessage } from '../../../../../src/types'; import { generateMetadata, transformResultBuilder, overrideDestination } from '../../../testUtils'; import { ProcessorTestData } from '../../../testTypes'; @@ -81,7 +81,7 @@ const commonMessage = { plan: 'standard plan', name: 'rudder test', }, - type: 'identify', + type: 'identify' as const, messageId: '84e26acc-56a5-4835-8233-591137fca468', originalTimestamp: '2023-10-14T15:46:51.693229+05:30', anonymousId: '00000000000000000000000000', @@ -120,6 +120,7 @@ export const identifyTestData: ProcessorTestData[] = [ destination: overrideDestination(commonDestination, { advancedMapping: false }), }, ], + method: 'POST', }, }, output: { @@ -160,6 +161,7 @@ export const identifyTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/facebook_pixel/processor/pageScreenTestData.ts b/test/integrations/destinations/facebook_pixel/processor/pageScreenTestData.ts index dee772522ab..443c9e25be6 100644 --- a/test/integrations/destinations/facebook_pixel/processor/pageScreenTestData.ts +++ b/test/integrations/destinations/facebook_pixel/processor/pageScreenTestData.ts @@ -148,6 +148,7 @@ export const pageScreenTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -228,6 +229,7 @@ export const pageScreenTestData: ProcessorTestData[] = [ destination: overrideDestination(commonDestination, { standardPageCall: true }), }, ], + method: 'POST', }, }, output: { @@ -288,6 +290,7 @@ export const pageScreenTestData: ProcessorTestData[] = [ destination: overrideDestination(commonDestination, { standardPageCall: true }), }, ], + method: 'POST', }, }, output: { @@ -371,6 +374,7 @@ export const pageScreenTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -455,6 +459,7 @@ export const pageScreenTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -532,6 +537,7 @@ export const pageScreenTestData: ProcessorTestData[] = [ destination: overrideDestination(commonDestination, { standardPageCall: true }), }, ], + method: 'POST', }, }, output: { @@ -590,6 +596,7 @@ export const pageScreenTestData: ProcessorTestData[] = [ destination: overrideDestination(commonDestination, { standardPageCall: true }), }, ], + method: 'POST', }, }, output: { @@ -673,6 +680,7 @@ export const pageScreenTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/facebook_pixel/processor/trackTestData.ts b/test/integrations/destinations/facebook_pixel/processor/trackTestData.ts index 9fd65945c4d..a3f2ff0ed41 100644 --- a/test/integrations/destinations/facebook_pixel/processor/trackTestData.ts +++ b/test/integrations/destinations/facebook_pixel/processor/trackTestData.ts @@ -86,6 +86,7 @@ export const trackTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -159,6 +160,7 @@ export const trackTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/facebook_pixel/processor/validationTestData.ts b/test/integrations/destinations/facebook_pixel/processor/validationTestData.ts index d242ac990d1..eca683e2bbe 100644 --- a/test/integrations/destinations/facebook_pixel/processor/validationTestData.ts +++ b/test/integrations/destinations/facebook_pixel/processor/validationTestData.ts @@ -444,7 +444,7 @@ export const validationTestData = [ JSON_ARRAY: {}, XML: {}, }, - endpoint: 'https://graph.facebook.com/v20.0/dummyPixelId/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyPixelId/events?access_token=09876', files: {}, headers: {}, method: 'POST', diff --git a/test/integrations/destinations/facebook_pixel/router/data.ts b/test/integrations/destinations/facebook_pixel/router/data.ts index f3df4506a5a..e711ba103f1 100644 --- a/test/integrations/destinations/facebook_pixel/router/data.ts +++ b/test/integrations/destinations/facebook_pixel/router/data.ts @@ -126,7 +126,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyPixelId/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyPixelId/events?access_token=09876', headers: {}, params: {}, body: { @@ -135,7 +135,15 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08"},"event_name":"spin_result","event_time":1697278611,"action_source":"other","custom_data":{"additional_bet_index":0,"value":400}}', + JSON.stringify({ + user_data: { + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + }, + event_name: 'spin_result', + event_time: 1697278611, + action_source: 'other', + custom_data: { additional_bet_index: 0, value: 400 }, + }), ], }, }, @@ -165,7 +173,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/dummyPixelId/events?access_token=09876', + endpoint: 'https://graph.facebook.com/v22.0/dummyPixelId/events?access_token=09876', headers: {}, params: {}, body: { @@ -174,7 +182,24 @@ export const data = [ JSON_ARRAY: {}, FORM: { data: [ - '{"user_data":{"external_id":"8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92","em":"48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08","ph":"593a6d58f34eb5c3de4f47e38d1faaa7d389fafe332a85400b1e54498391c579","ge":"252f10c83610ebca1a059c0bae8255eba2f95be4d1d7bcfa89d7248a82d9f111","ln":"532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25","fn":"2c2ccf28d806f6f9a34b67aa874d2113b7ac1444f1a4092541b8b75b84771747","client_ip_address":"0.0.0.0","client_user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"},"event_name":"identify","event_time":1697221800,"event_id":"84e26acc-56a5-4835-8233-591137fca468","action_source":"website"}', + JSON.stringify({ + user_data: { + external_id: + '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', + em: '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', + ph: '593a6d58f34eb5c3de4f47e38d1faaa7d389fafe332a85400b1e54498391c579', + ge: '252f10c83610ebca1a059c0bae8255eba2f95be4d1d7bcfa89d7248a82d9f111', + ln: '532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25', + fn: '2c2ccf28d806f6f9a34b67aa874d2113b7ac1444f1a4092541b8b75b84771747', + client_ip_address: '0.0.0.0', + client_user_agent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', + }, + event_name: 'identify', + event_time: 1697221800, + event_id: '84e26acc-56a5-4835-8233-591137fca468', + action_source: 'website', + }), ], }, }, diff --git a/test/integrations/destinations/factorsai/data.ts b/test/integrations/destinations/factorsai/data.ts index be13c291f42..cf1286140d6 100644 --- a/test/integrations/destinations/factorsai/data.ts +++ b/test/integrations/destinations/factorsai/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from './maskedSecrets'; export const data = [ { name: 'factorsai', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - factorsAIApiKey: 'sdgerghsdfhsdhsdh432141dfgdfsg', + factorsAIApiKey: secret1, }, }, message: { @@ -87,7 +88,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic c2RnZXJnaHNkZmhzZGhzZGg0MzIxNDFkZmdkZnNnOg==', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.factors.ai/integrations/rudderstack_platform', @@ -110,7 +111,7 @@ export const data = [ { destination: { Config: { - factorsAIApiKey: 'sdgerghsdfhsdhsdh432141dfgdfsg', + factorsAIApiKey: secret1, }, }, message: { @@ -175,7 +176,7 @@ export const data = [ { destination: { Config: { - factorsAIApiKey: 'sdgerghsdfhsdhsdh432141dfgdfsg', + factorsAIApiKey: secret1, }, }, message: { @@ -251,7 +252,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic c2RnZXJnaHNkZmhzZGhzZGg0MzIxNDFkZmdkZnNnOg==', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.factors.ai/integrations/rudderstack_platform', @@ -274,7 +275,7 @@ export const data = [ { destination: { Config: { - factorsAIApiKey: 'sdgerghsdfhsdhsdh432141dfgdfsg', + factorsAIApiKey: secret1, }, }, message: { @@ -332,7 +333,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic c2RnZXJnaHNkZmhzZGhzZGg0MzIxNDFkZmdkZnNnOg==', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.factors.ai/integrations/rudderstack_platform', @@ -355,7 +356,7 @@ export const data = [ { destination: { Config: { - factorsAIApiKey: 'sdgerghsdfhsdhsdh432141dfgdfsg', + factorsAIApiKey: secret1, }, }, message: { @@ -403,7 +404,7 @@ export const data = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic c2RnZXJnaHNkZmhzZGhzZGg0MzIxNDFkZmdkZnNnOg==', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.factors.ai/integrations/rudderstack_platform', @@ -426,7 +427,7 @@ export const data = [ { destination: { Config: { - factorsAIApiKey: 'sdgerghsdfhsdhsdh432141dfgdfsg', + factorsAIApiKey: secret1, }, }, message: { @@ -532,7 +533,7 @@ export const data = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic c2RnZXJnaHNkZmhzZGhzZGg0MzIxNDFkZmdkZnNnOg==', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.factors.ai/integrations/rudderstack_platform', @@ -555,7 +556,7 @@ export const data = [ { destination: { Config: { - factorsAIApiKey: 'sdgerghsdfhsdhsdh432141dfgdfsg', + factorsAIApiKey: secret1, }, }, message: { @@ -631,7 +632,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic c2RnZXJnaHNkZmhzZGhzZGg0MzIxNDFkZmdkZnNnOg==', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.factors.ai/integrations/rudderstack_platform', @@ -654,7 +655,7 @@ export const data = [ { destination: { Config: { - factorsAIApiKey: 'sdgerghsdfhsdhsdh432141dfgdfsg', + factorsAIApiKey: secret1, }, }, message: { @@ -726,7 +727,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic c2RnZXJnaHNkZmhzZGhzZGg0MzIxNDFkZmdkZnNnOg==', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.factors.ai/integrations/rudderstack_platform', @@ -749,7 +750,7 @@ export const data = [ { destination: { Config: { - factorsAIApiKey: 'sdgerghsdfhsdhsdh432141dfgdfsg', + factorsAIApiKey: secret1, }, }, message: { @@ -799,7 +800,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic c2RnZXJnaHNkZmhzZGhzZGg0MzIxNDFkZmdkZnNnOg==', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.factors.ai/integrations/rudderstack_platform', diff --git a/test/integrations/destinations/factorsai/maskedSecrets.ts b/test/integrations/destinations/factorsai/maskedSecrets.ts new file mode 100644 index 00000000000..ba0b28ba8a1 --- /dev/null +++ b/test/integrations/destinations/factorsai/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + '')}`; diff --git a/test/integrations/destinations/fb/dataDelivery/business.ts b/test/integrations/destinations/fb/dataDelivery/business.ts index 156dc265725..57e4f3447b2 100644 --- a/test/integrations/destinations/fb/dataDelivery/business.ts +++ b/test/integrations/destinations/fb/dataDelivery/business.ts @@ -10,19 +10,96 @@ export const testData1 = { 'ud[ge]': '62c66a7a5dd70c3146618063c344e531e6d4b59e379808443ce962b3abd63c5a', 'ud[ln]': '3547cb112ac4489af2310c0626cdba6f3097a2ad5a3b42ddd3b59c76c7a079a3', 'ud[ph]': '588211a01b10feacbf7988d97a06e86c18af5259a7f457fd8759b7f7409a7d1f', - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",640,480,"1.23",0,0,0,"Europe/Berlin"]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 640, + 480, + '1.23', + 0, + 0, + 0, + 'Europe/Berlin', + ]), app_user_id: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"spin_result","_valueToSum":400,"fb_currency":"GBP","additional_bet_index":0,"battle_id":"N/A","bet_amount":9,"bet_level":1,"bet_multiplier":1,"coin_balance":9466052,"current_module_name":"CasinoGameModule","days_in_game":0,"extra_param":"N/A","fb_profile":"0","featureGameType":"N/A","game_fps":30,"game_id":"fireEagleBase","game_name":"FireEagleSlots","gem_balance":0,"graphicsQuality":"HD","idfa":"2bf99787-33d2-4ae2-a76a-c49672f97252","internetReachability":"ReachableViaLocalAreaNetwork","isLowEndDevice":"False","is_auto_spin":"False","is_turbo":"False","isf":"False","ishighroller":"False","jackpot_win_amount":90,"jackpot_win_type":"Silver","level":6,"lifetime_gem_balance":0,"no_of_spin":1,"player_total_battles":0,"player_total_shields":0,"start_date":"2019-08-01","total_payments":0,"tournament_id":"T1561970819","userId":"c82cbdff-e5be-4009-ac78-cdeea09ab4b1","versionSessionCount":2,"win_amount":0,"fb_content_id":["123","345","567"]}]', + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'spin_result', + _valueToSum: 400, + fb_currency: 'GBP', + additional_bet_index: 0, + battle_id: 'N/A', + bet_amount: 9, + bet_level: 1, + bet_multiplier: 1, + coin_balance: 9466052, + current_module_name: 'CasinoGameModule', + days_in_game: 0, + extra_param: 'N/A', + fb_profile: '0', + featureGameType: 'N/A', + game_fps: 30, + game_id: 'fireEagleBase', + game_name: 'FireEagleSlots', + gem_balance: 0, + graphicsQuality: 'HD', + idfa: '2bf99787-33d2-4ae2-a76a-c49672f97252', + internetReachability: 'ReachableViaLocalAreaNetwork', + isLowEndDevice: 'False', + is_auto_spin: 'False', + is_turbo: 'False', + isf: 'False', + ishighroller: 'False', + jackpot_win_amount: 90, + jackpot_win_type: 'Silver', + level: 6, + lifetime_gem_balance: 0, + no_of_spin: 1, + player_total_battles: 0, + player_total_shields: 0, + start_date: '2019-08-01', + total_payments: 0, + tournament_id: 'T1561970819', + userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + versionSessionCount: 2, + win_amount: 0, + fb_content_id: ['123', '345', '567'], + }, + ]), advertiser_tracking_enabled: '0', application_tracking_enabled: '0', }; export const testData2 = { - extinfo: '["a2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"Viewed Screen","fb_description":"Main.1233"}]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { _logTime: 1567333011693, _eventName: 'Viewed Screen', fb_description: 'Main.1233' }, + ]), 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', advertiser_tracking_enabled: '0', application_tracking_enabled: '0', @@ -123,7 +200,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request Processed Successfully', response: [ { - error: '{"events_received":1,"fbtrace_id":"facebook_trace_id"}', + error: JSON.stringify({ events_received: 1, fbtrace_id: 'facebook_trace_id' }), statusCode: 200, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/fb/dataDelivery/data.ts b/test/integrations/destinations/fb/dataDelivery/data.ts index dfa5dbc65e3..1fb4e394168 100644 --- a/test/integrations/destinations/fb/dataDelivery/data.ts +++ b/test/integrations/destinations/fb/dataDelivery/data.ts @@ -23,11 +23,70 @@ export const existingTestData = [ 'ud[ge]': '62c66a7a5dd70c3146618063c344e531e6d4b59e379808443ce962b3abd63c5a', 'ud[ln]': '3547cb112ac4489af2310c0626cdba6f3097a2ad5a3b42ddd3b59c76c7a079a3', 'ud[ph]': '588211a01b10feacbf7988d97a06e86c18af5259a7f457fd8759b7f7409a7d1f', - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",640,480,"1.23",0,0,0,"Europe/Berlin"]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 640, + 480, + '1.23', + 0, + 0, + 0, + 'Europe/Berlin', + ]), app_user_id: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"spin_result","_valueToSum":400,"fb_currency":"GBP","additional_bet_index":0,"battle_id":"N/A","bet_amount":9,"bet_level":1,"bet_multiplier":1,"coin_balance":9466052,"current_module_name":"CasinoGameModule","days_in_game":0,"extra_param":"N/A","fb_profile":"0","featureGameType":"N/A","game_fps":30,"game_id":"fireEagleBase","game_name":"FireEagleSlots","gem_balance":0,"graphicsQuality":"HD","idfa":"2bf99787-33d2-4ae2-a76a-c49672f97252","internetReachability":"ReachableViaLocalAreaNetwork","isLowEndDevice":"False","is_auto_spin":"False","is_turbo":"False","isf":"False","ishighroller":"False","jackpot_win_amount":90,"jackpot_win_type":"Silver","level":6,"lifetime_gem_balance":0,"no_of_spin":1,"player_total_battles":0,"player_total_shields":0,"start_date":"2019-08-01","total_payments":0,"tournament_id":"T1561970819","userId":"c82cbdff-e5be-4009-ac78-cdeea09ab4b1","versionSessionCount":2,"win_amount":0,"fb_content_id":["123","345","567"]}]', + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'spin_result', + _valueToSum: 400, + fb_currency: 'GBP', + additional_bet_index: 0, + battle_id: 'N/A', + bet_amount: 9, + bet_level: 1, + bet_multiplier: 1, + coin_balance: 9466052, + current_module_name: 'CasinoGameModule', + days_in_game: 0, + extra_param: 'N/A', + fb_profile: '0', + featureGameType: 'N/A', + game_fps: 30, + game_id: 'fireEagleBase', + game_name: 'FireEagleSlots', + gem_balance: 0, + graphicsQuality: 'HD', + idfa: '2bf99787-33d2-4ae2-a76a-c49672f97252', + internetReachability: 'ReachableViaLocalAreaNetwork', + isLowEndDevice: 'False', + is_auto_spin: 'False', + is_turbo: 'False', + isf: 'False', + ishighroller: 'False', + jackpot_win_amount: 90, + jackpot_win_type: 'Silver', + level: 6, + lifetime_gem_balance: 0, + no_of_spin: 1, + player_total_battles: 0, + player_total_shields: 0, + start_date: '2019-08-01', + total_payments: 0, + tournament_id: 'T1561970819', + userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + versionSessionCount: 2, + win_amount: 0, + fb_content_id: ['123', '345', '567'], + }, + ]), advertiser_tracking_enabled: '0', application_tracking_enabled: '0', }, @@ -103,11 +162,70 @@ export const existingTestData = [ 'ud[ge]': '62c66a7a5dd70c3146618063c344e531e6d4b59e379808443ce962b3abd63c5a', 'ud[ln]': '3547cb112ac4489af2310c0626cdba6f3097a2ad5a3b42ddd3b59c76c7a079a3', 'ud[ph]': '588211a01b10feacbf7988d97a06e86c18af5259a7f457fd8759b7f7409a7d1f', - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",640,480,"1.23",0,0,0,"Europe/Berlin"]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 640, + 480, + '1.23', + 0, + 0, + 0, + 'Europe/Berlin', + ]), app_user_id: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"spin_result","_valueToSum":400,"fb_currency":"GBP","additional_bet_index":0,"battle_id":"N/A","bet_amount":9,"bet_level":1,"bet_multiplier":1,"coin_balance":9466052,"current_module_name":"CasinoGameModule","days_in_game":0,"extra_param":"N/A","fb_profile":"0","featureGameType":"N/A","game_fps":30,"game_id":"fireEagleBase","game_name":"FireEagleSlots","gem_balance":0,"graphicsQuality":"HD","idfa":"2bf99787-33d2-4ae2-a76a-c49672f97252","internetReachability":"ReachableViaLocalAreaNetwork","isLowEndDevice":"False","is_auto_spin":"False","is_turbo":"False","isf":"False","ishighroller":"False","jackpot_win_amount":90,"jackpot_win_type":"Silver","level":6,"lifetime_gem_balance":0,"no_of_spin":1,"player_total_battles":0,"player_total_shields":0,"start_date":"2019-08-01","total_payments":0,"tournament_id":"T1561970819","userId":"c82cbdff-e5be-4009-ac78-cdeea09ab4b1","versionSessionCount":2,"win_amount":0,"fb_content_id":["123","345","567"]}]', + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'spin_result', + _valueToSum: 400, + fb_currency: 'GBP', + additional_bet_index: 0, + battle_id: 'N/A', + bet_amount: 9, + bet_level: 1, + bet_multiplier: 1, + coin_balance: 9466052, + current_module_name: 'CasinoGameModule', + days_in_game: 0, + extra_param: 'N/A', + fb_profile: '0', + featureGameType: 'N/A', + game_fps: 30, + game_id: 'fireEagleBase', + game_name: 'FireEagleSlots', + gem_balance: 0, + graphicsQuality: 'HD', + idfa: '2bf99787-33d2-4ae2-a76a-c49672f97252', + internetReachability: 'ReachableViaLocalAreaNetwork', + isLowEndDevice: 'False', + is_auto_spin: 'False', + is_turbo: 'False', + isf: 'False', + ishighroller: 'False', + jackpot_win_amount: 90, + jackpot_win_type: 'Silver', + level: 6, + lifetime_gem_balance: 0, + no_of_spin: 1, + player_total_battles: 0, + player_total_shields: 0, + start_date: '2019-08-01', + total_payments: 0, + tournament_id: 'T1561970819', + userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + versionSessionCount: 2, + win_amount: 0, + fb_content_id: ['123', '345', '567'], + }, + ]), advertiser_tracking_enabled: '0', application_tracking_enabled: '0', }, @@ -167,11 +285,70 @@ export const existingTestData = [ 'ud[ge]': '62c66a7a5dd70c3146618063c344e531e6d4b59e379808443ce962b3abd63c5a', 'ud[ln]': '3547cb112ac4489af2310c0626cdba6f3097a2ad5a3b42ddd3b59c76c7a079a3', 'ud[ph]': '588211a01b10feacbf7988d97a06e86c18af5259a7f457fd8759b7f7409a7d1f', - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",640,480,"1.23",0,0,0,"Europe/Berlin"]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 640, + 480, + '1.23', + 0, + 0, + 0, + 'Europe/Berlin', + ]), app_user_id: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"spin_result","_valueToSum":400,"fb_currency":"GBP","additional_bet_index":0,"battle_id":"N/A","bet_amount":9,"bet_level":1,"bet_multiplier":1,"coin_balance":9466052,"current_module_name":"CasinoGameModule","days_in_game":0,"extra_param":"N/A","fb_profile":"0","featureGameType":"N/A","game_fps":30,"game_id":"fireEagleBase","game_name":"FireEagleSlots","gem_balance":0,"graphicsQuality":"HD","idfa":"2bf99787-33d2-4ae2-a76a-c49672f97252","internetReachability":"ReachableViaLocalAreaNetwork","isLowEndDevice":"False","is_auto_spin":"False","is_turbo":"False","isf":"False","ishighroller":"False","jackpot_win_amount":90,"jackpot_win_type":"Silver","level":6,"lifetime_gem_balance":0,"no_of_spin":1,"player_total_battles":0,"player_total_shields":0,"start_date":"2019-08-01","total_payments":0,"tournament_id":"T1561970819","userId":"c82cbdff-e5be-4009-ac78-cdeea09ab4b1","versionSessionCount":2,"win_amount":0,"fb_content_id":["123","345","567"]}]', + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'spin_result', + _valueToSum: 400, + fb_currency: 'GBP', + additional_bet_index: 0, + battle_id: 'N/A', + bet_amount: 9, + bet_level: 1, + bet_multiplier: 1, + coin_balance: 9466052, + current_module_name: 'CasinoGameModule', + days_in_game: 0, + extra_param: 'N/A', + fb_profile: '0', + featureGameType: 'N/A', + game_fps: 30, + game_id: 'fireEagleBase', + game_name: 'FireEagleSlots', + gem_balance: 0, + graphicsQuality: 'HD', + idfa: '2bf99787-33d2-4ae2-a76a-c49672f97252', + internetReachability: 'ReachableViaLocalAreaNetwork', + isLowEndDevice: 'False', + is_auto_spin: 'False', + is_turbo: 'False', + isf: 'False', + ishighroller: 'False', + jackpot_win_amount: 90, + jackpot_win_type: 'Silver', + level: 6, + lifetime_gem_balance: 0, + no_of_spin: 1, + player_total_battles: 0, + player_total_shields: 0, + start_date: '2019-08-01', + total_payments: 0, + tournament_id: 'T1561970819', + userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + versionSessionCount: 2, + win_amount: 0, + fb_content_id: ['123', '345', '567'], + }, + ]), advertiser_tracking_enabled: '0', application_tracking_enabled: '0', }, @@ -249,10 +426,31 @@ export const existingTestData = [ XML: {}, JSON_ARRAY: {}, FORM: { - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"Viewed Screen","fb_description":"Main.1233"}]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'Viewed Screen', + fb_description: 'Main.1233', + }, + ]), 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', advertiser_tracking_enabled: '0', application_tracking_enabled: '0', @@ -319,10 +517,31 @@ export const existingTestData = [ XML: {}, JSON_ARRAY: {}, FORM: { - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"Viewed Screen","fb_description":"Main.1233"}]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'Viewed Screen', + fb_description: 'Main.1233', + }, + ]), 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', advertiser_tracking_enabled: '0', application_tracking_enabled: '0', diff --git a/test/integrations/destinations/fb/processor/data.ts b/test/integrations/destinations/fb/processor/data.ts index b0b4ba9ecf8..049e1728057 100644 --- a/test/integrations/destinations/fb/processor/data.ts +++ b/test/integrations/destinations/fb/processor/data.ts @@ -610,11 +610,70 @@ export const data = [ 'ud[fn]': '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', 'ud[ln]': '3547cb112ac4489af2310c0626cdba6f3097a2ad5a3b42ddd3b59c76c7a079a3', 'ud[ph]': '588211a01b10feacbf7988d97a06e86c18af5259a7f457fd8759b7f7409a7d1f', - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",640,480,"1.23",0,0,0,"Europe/Berlin"]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 640, + 480, + '1.23', + 0, + 0, + 0, + 'Europe/Berlin', + ]), app_user_id: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"spin_result","_valueToSum":400,"fb_currency":"GBP","additional_bet_index":0,"battle_id":"N/A","bet_amount":9,"bet_level":1,"bet_multiplier":1,"coin_balance":9466052,"current_module_name":"CasinoGameModule","days_in_game":0,"extra_param":"N/A","fb_profile":"0","featureGameType":"N/A","game_fps":30,"game_id":"fireEagleBase","game_name":"FireEagleSlots","gem_balance":0,"graphicsQuality":"HD","idfa":"2bf99787-33d2-4ae2-a76a-c49672f97252","internetReachability":"ReachableViaLocalAreaNetwork","isLowEndDevice":"False","is_auto_spin":"False","is_turbo":"False","isf":"False","ishighroller":"False","jackpot_win_amount":90,"jackpot_win_type":"Silver","level":6,"lifetime_gem_balance":0,"no_of_spin":1,"player_total_battles":0,"player_total_shields":0,"start_date":"2019-08-01","total_payments":0,"tournament_id":"T1561970819","userId":"c82cbdff-e5be-4009-ac78-cdeea09ab4b1","versionSessionCount":2,"win_amount":0,"fb_content_id":["123","345","567"]}]', + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'spin_result', + _valueToSum: 400, + fb_currency: 'GBP', + additional_bet_index: 0, + battle_id: 'N/A', + bet_amount: 9, + bet_level: 1, + bet_multiplier: 1, + coin_balance: 9466052, + current_module_name: 'CasinoGameModule', + days_in_game: 0, + extra_param: 'N/A', + fb_profile: '0', + featureGameType: 'N/A', + game_fps: 30, + game_id: 'fireEagleBase', + game_name: 'FireEagleSlots', + gem_balance: 0, + graphicsQuality: 'HD', + idfa: '2bf99787-33d2-4ae2-a76a-c49672f97252', + internetReachability: 'ReachableViaLocalAreaNetwork', + isLowEndDevice: 'False', + is_auto_spin: 'False', + is_turbo: 'False', + isf: 'False', + ishighroller: 'False', + jackpot_win_amount: 90, + jackpot_win_type: 'Silver', + level: 6, + lifetime_gem_balance: 0, + no_of_spin: 1, + player_total_battles: 0, + player_total_shields: 0, + start_date: '2019-08-01', + total_payments: 0, + tournament_id: 'T1561970819', + userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + versionSessionCount: 2, + win_amount: 0, + fb_content_id: ['123', '345', '567'], + }, + ]), advertiser_tracking_enabled: '0', application_tracking_enabled: '0', }, @@ -795,11 +854,70 @@ export const data = [ 'ud[ge]': '62c66a7a5dd70c3146618063c344e531e6d4b59e379808443ce962b3abd63c5a', 'ud[ln]': '3547cb112ac4489af2310c0626cdba6f3097a2ad5a3b42ddd3b59c76c7a079a3', 'ud[ph]': '588211a01b10feacbf7988d97a06e86c18af5259a7f457fd8759b7f7409a7d1f', - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",640,480,"1.23",0,0,0,"Europe/Berlin"]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 640, + 480, + '1.23', + 0, + 0, + 0, + 'Europe/Berlin', + ]), app_user_id: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"spin_result","_valueToSum":400,"fb_currency":"GBP","additional_bet_index":0,"battle_id":"N/A","bet_amount":9,"bet_level":1,"bet_multiplier":1,"coin_balance":9466052,"current_module_name":"CasinoGameModule","days_in_game":0,"extra_param":"N/A","fb_profile":"0","featureGameType":"N/A","game_fps":30,"game_id":"fireEagleBase","game_name":"FireEagleSlots","gem_balance":0,"graphicsQuality":"HD","idfa":"2bf99787-33d2-4ae2-a76a-c49672f97252","internetReachability":"ReachableViaLocalAreaNetwork","isLowEndDevice":"False","is_auto_spin":"False","is_turbo":"False","isf":"False","ishighroller":"False","jackpot_win_amount":90,"jackpot_win_type":"Silver","level":6,"lifetime_gem_balance":0,"no_of_spin":1,"player_total_battles":0,"player_total_shields":0,"start_date":"2019-08-01","total_payments":0,"tournament_id":"T1561970819","userId":"c82cbdff-e5be-4009-ac78-cdeea09ab4b1","versionSessionCount":2,"win_amount":0,"fb_content_id":["123","345","567"]}]', + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'spin_result', + _valueToSum: 400, + fb_currency: 'GBP', + additional_bet_index: 0, + battle_id: 'N/A', + bet_amount: 9, + bet_level: 1, + bet_multiplier: 1, + coin_balance: 9466052, + current_module_name: 'CasinoGameModule', + days_in_game: 0, + extra_param: 'N/A', + fb_profile: '0', + featureGameType: 'N/A', + game_fps: 30, + game_id: 'fireEagleBase', + game_name: 'FireEagleSlots', + gem_balance: 0, + graphicsQuality: 'HD', + idfa: '2bf99787-33d2-4ae2-a76a-c49672f97252', + internetReachability: 'ReachableViaLocalAreaNetwork', + isLowEndDevice: 'False', + is_auto_spin: 'False', + is_turbo: 'False', + isf: 'False', + ishighroller: 'False', + jackpot_win_amount: 90, + jackpot_win_type: 'Silver', + level: 6, + lifetime_gem_balance: 0, + no_of_spin: 1, + player_total_battles: 0, + player_total_shields: 0, + start_date: '2019-08-01', + total_payments: 0, + tournament_id: 'T1561970819', + userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + versionSessionCount: 2, + win_amount: 0, + fb_content_id: ['123', '345', '567'], + }, + ]), advertiser_tracking_enabled: '0', application_tracking_enabled: '0', }, @@ -903,10 +1021,31 @@ export const data = [ XML: {}, JSON_ARRAY: {}, FORM: { - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"Viewed Screen","fb_description":"Main.1233"}]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'Viewed Screen', + fb_description: 'Main.1233', + }, + ]), 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', advertiser_tracking_enabled: '0', application_tracking_enabled: '0', @@ -1003,10 +1142,31 @@ export const data = [ XML: {}, JSON_ARRAY: {}, FORM: { - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"Viewed Main Screen","fb_description":"Main"}]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'Viewed Main Screen', + fb_description: 'Main', + }, + ]), 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', advertiser_tracking_enabled: '0', application_tracking_enabled: '0', @@ -1187,10 +1347,31 @@ export const data = [ XML: {}, JSON_ARRAY: {}, FORM: { - extinfo: - '["i2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"Viewed Screen","fb_description":"Viewed Main Screen1 by expicit call Screen"}]', + extinfo: JSON.stringify([ + 'i2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'Viewed Screen', + fb_description: 'Viewed Main Screen1 by expicit call Screen', + }, + ]), 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', advertiser_tracking_enabled: '0', application_tracking_enabled: '0', @@ -1287,10 +1468,31 @@ export const data = [ XML: {}, JSON_ARRAY: {}, FORM: { - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"Viewed Screen","fb_description":"Viewed Main Screen1 by expicit call Screen"}]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'Viewed Screen', + fb_description: 'Viewed Main Screen1 by expicit call Screen', + }, + ]), 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', advertiser_tracking_enabled: '0', application_tracking_enabled: '0', @@ -1387,10 +1589,31 @@ export const data = [ XML: {}, JSON_ARRAY: {}, FORM: { - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"Viewed Screen","fb_description":"Viewed Main Screen1 by expicit call Screen"}]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'Viewed Screen', + fb_description: 'Viewed Main Screen1 by expicit call Screen', + }, + ]), 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', advertiser_tracking_enabled: '0', application_tracking_enabled: '0', @@ -1561,10 +1784,69 @@ export const data = [ XML: {}, JSON_ARRAY: {}, FORM: { - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"spin_result","_valueToSum":400,"fb_currency":"GBP","additional_bet_index":0,"battle_id":"N/A","bet_amount":9,"bet_level":1,"bet_multiplier":1,"coin_balance":9466052,"current_module_name":"CasinoGameModule","days_in_game":0,"extra_param":"N/A","fb_profile":"0","featureGameType":"N/A","game_fps":30,"game_id":"fireEagleBase","game_name":"FireEagleSlots","gem_balance":0,"graphicsQuality":"HD","idfa":"2bf99787-33d2-4ae2-a76a-c49672f97252","internetReachability":"ReachableViaLocalAreaNetwork","isLowEndDevice":"False","is_auto_spin":"False","is_turbo":"False","isf":"False","ishighroller":"False","jackpot_win_amount":90,"jackpot_win_type":"Silver","level":6,"lifetime_gem_balance":0,"no_of_spin":1,"player_total_battles":0,"player_total_shields":0,"start_date":"2019-08-01","total_payments":0,"tournament_id":"T1561970819","userId":"c82cbdff-e5be-4009-ac78-cdeea09ab4b1","versionSessionCount":2,"win_amount":0,"fb_content_id":["123","345","567"]}]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'spin_result', + _valueToSum: 400, + fb_currency: 'GBP', + additional_bet_index: 0, + battle_id: 'N/A', + bet_amount: 9, + bet_level: 1, + bet_multiplier: 1, + coin_balance: 9466052, + current_module_name: 'CasinoGameModule', + days_in_game: 0, + extra_param: 'N/A', + fb_profile: '0', + featureGameType: 'N/A', + game_fps: 30, + game_id: 'fireEagleBase', + game_name: 'FireEagleSlots', + gem_balance: 0, + graphicsQuality: 'HD', + idfa: '2bf99787-33d2-4ae2-a76a-c49672f97252', + internetReachability: 'ReachableViaLocalAreaNetwork', + isLowEndDevice: 'False', + is_auto_spin: 'False', + is_turbo: 'False', + isf: 'False', + ishighroller: 'False', + jackpot_win_amount: 90, + jackpot_win_type: 'Silver', + level: 6, + lifetime_gem_balance: 0, + no_of_spin: 1, + player_total_battles: 0, + player_total_shields: 0, + start_date: '2019-08-01', + total_payments: 0, + tournament_id: 'T1561970819', + userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + versionSessionCount: 2, + win_amount: 0, + fb_content_id: ['123', '345', '567'], + }, + ]), app_user_id: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', advertiser_id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', @@ -1741,10 +2023,69 @@ export const data = [ XML: {}, JSON_ARRAY: {}, FORM: { - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"spin_result","_valueToSum":400,"fb_currency":"GBP","additional_bet_index":0,"battle_id":"N/A","bet_amount":9,"bet_level":1,"bet_multiplier":1,"coin_balance":9466052,"current_module_name":"CasinoGameModule","days_in_game":0,"extra_param":"N/A","fb_profile":"0","featureGameType":"N/A","game_fps":30,"game_id":"fireEagleBase","game_name":"FireEagleSlots","gem_balance":0,"graphicsQuality":"HD","idfa":"2bf99787-33d2-4ae2-a76a-c49672f97252","internetReachability":"ReachableViaLocalAreaNetwork","isLowEndDevice":"False","is_auto_spin":"False","is_turbo":"False","isf":"False","ishighroller":"False","jackpot_win_amount":90,"jackpot_win_type":"Silver","level":6,"lifetime_gem_balance":0,"no_of_spin":1,"player_total_battles":0,"player_total_shields":0,"start_date":"2019-08-01","total_payments":0,"tournament_id":"T1561970819","userId":"c82cbdff-e5be-4009-ac78-cdeea09ab4b1","versionSessionCount":2,"win_amount":0,"fb_content_id":["123","345","567"]}]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'spin_result', + _valueToSum: 400, + fb_currency: 'GBP', + additional_bet_index: 0, + battle_id: 'N/A', + bet_amount: 9, + bet_level: 1, + bet_multiplier: 1, + coin_balance: 9466052, + current_module_name: 'CasinoGameModule', + days_in_game: 0, + extra_param: 'N/A', + fb_profile: '0', + featureGameType: 'N/A', + game_fps: 30, + game_id: 'fireEagleBase', + game_name: 'FireEagleSlots', + gem_balance: 0, + graphicsQuality: 'HD', + idfa: '2bf99787-33d2-4ae2-a76a-c49672f97252', + internetReachability: 'ReachableViaLocalAreaNetwork', + isLowEndDevice: 'False', + is_auto_spin: 'False', + is_turbo: 'False', + isf: 'False', + ishighroller: 'False', + jackpot_win_amount: 90, + jackpot_win_type: 'Silver', + level: 6, + lifetime_gem_balance: 0, + no_of_spin: 1, + player_total_battles: 0, + player_total_shields: 0, + start_date: '2019-08-01', + total_payments: 0, + tournament_id: 'T1561970819', + userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + versionSessionCount: 2, + win_amount: 0, + fb_content_id: ['123', '345', '567'], + }, + ]), app_user_id: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', advertiser_id: 'df16bffa-5c3d-4fbb-9bce-3bab098129a7R', 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', @@ -1843,9 +2184,31 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - extinfo: '["i2","","","","","","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"Viewed Screen","fb_description":"Viewed Main Screen1 by expicit call Screen"}]', + extinfo: JSON.stringify([ + 'i2', + '', + '', + '', + '', + '', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'Viewed Screen', + fb_description: 'Viewed Main Screen1 by expicit call Screen', + }, + ]), 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', advertiser_tracking_enabled: '0', application_tracking_enabled: '0', @@ -2163,10 +2526,69 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - extinfo: - '["a2","","","","8.1.0","Redmi 6","","","Banglalink",0,100,"50.00",0,0,0,""]', - custom_events: - '[{"_logTime":1567333011693,"_eventName":"spin_result","_valueToSum":0,"fb_currency":"INR","additional_bet_index":0,"battle_id":"N/A","bet_amount":9,"bet_level":1,"bet_multiplier":1,"coin_balance":9466052,"current_module_name":"CasinoGameModule","days_in_game":0,"extra_param":"N/A","fb_profile":"0","featureGameType":"N/A","game_fps":30,"game_id":"fireEagleBase","game_name":"FireEagleSlots","gem_balance":0,"graphicsQuality":"HD","idfa":"2bf99787-33d2-4ae2-a76a-c49672f97252","internetReachability":"ReachableViaLocalAreaNetwork","isLowEndDevice":"False","is_auto_spin":"False","is_turbo":"False","isf":"False","ishighroller":"False","jackpot_win_amount":90,"jackpot_win_type":"Silver","level":6,"lifetime_gem_balance":0,"no_of_spin":1,"player_total_battles":0,"player_total_shields":0,"start_date":"2019-08-01","total_payments":0,"tournament_id":"T1561970819","userId":"c82cbdff-e5be-4009-ac78-cdeea09ab4b1","versionSessionCount":2,"win_amount":0,"fb_content_id":["123","345"]}]', + extinfo: JSON.stringify([ + 'a2', + '', + '', + '', + '8.1.0', + 'Redmi 6', + '', + '', + 'Banglalink', + 0, + 100, + '50.00', + 0, + 0, + 0, + '', + ]), + custom_events: JSON.stringify([ + { + _logTime: 1567333011693, + _eventName: 'spin_result', + _valueToSum: 0, + fb_currency: 'INR', + additional_bet_index: 0, + battle_id: 'N/A', + bet_amount: 9, + bet_level: 1, + bet_multiplier: 1, + coin_balance: 9466052, + current_module_name: 'CasinoGameModule', + days_in_game: 0, + extra_param: 'N/A', + fb_profile: '0', + featureGameType: 'N/A', + game_fps: 30, + game_id: 'fireEagleBase', + game_name: 'FireEagleSlots', + gem_balance: 0, + graphicsQuality: 'HD', + idfa: '2bf99787-33d2-4ae2-a76a-c49672f97252', + internetReachability: 'ReachableViaLocalAreaNetwork', + isLowEndDevice: 'False', + is_auto_spin: 'False', + is_turbo: 'False', + isf: 'False', + ishighroller: 'False', + jackpot_win_amount: 90, + jackpot_win_type: 'Silver', + level: 6, + lifetime_gem_balance: 0, + no_of_spin: 1, + player_total_battles: 0, + player_total_shields: 0, + start_date: '2019-08-01', + total_payments: 0, + tournament_id: 'T1561970819', + userId: 'c82cbdff-e5be-4009-ac78-cdeea09ab4b1', + versionSessionCount: 2, + win_amount: 0, + fb_content_id: ['123', '345'], + }, + ]), 'ud[em]': '48ddb93f0b30c475423fe177832912c5bcdce3cc72872f8051627967ef278e08', advertiser_tracking_enabled: '0', application_tracking_enabled: '0', diff --git a/test/integrations/destinations/fb_custom_audience/dataDelivery/business.ts b/test/integrations/destinations/fb_custom_audience/dataDelivery/business.ts index 6334094b3a9..1b81fc46cb2 100644 --- a/test/integrations/destinations/fb_custom_audience/dataDelivery/business.ts +++ b/test/integrations/destinations/fb_custom_audience/dataDelivery/business.ts @@ -107,8 +107,13 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request Processed Successfully', response: [ { - error: - '{"audience_id":"aud1","session_id":"123","num_received":4,"num_invalid_entries":0,"invalid_entry_samples":{}}', + error: JSON.stringify({ + audience_id: 'aud1', + session_id: '123', + num_received: 4, + num_invalid_entries: 0, + invalid_entry_samples: {}, + }), statusCode: 200, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/fb_custom_audience/dataDelivery/data.ts b/test/integrations/destinations/fb_custom_audience/dataDelivery/data.ts index cd440aaa37c..ed057427e61 100644 --- a/test/integrations/destinations/fb_custom_audience/dataDelivery/data.ts +++ b/test/integrations/destinations/fb_custom_audience/dataDelivery/data.ts @@ -648,6 +648,74 @@ export const existingTestData = [ }, }, }, + { + name: 'fb_custom_audience', + description: 'User not accepted TOS for messaging API', + feature: 'dataDelivery', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + version: '1', + type: 'REST', + method: 'DELETE', + endpoint: getEndPoint('aud1'), + headers: { + 'test-dest-response-key': 'messagingTOSNotAccepted', + }, + params: { + access_token: 'ABC', + payload: { + is_raw: true, + data_source: { + sub_type: 'ANYTHING', + }, + schema: ['DOBY', 'PHONE', 'GEN', 'FI', 'MADID', 'ZIP', 'ST', 'COUNTRY'], + data: [['2013', '@09432457768', 'f', 'Ms.', 'ABC', 'ZIP ', '123abc ', 'IN']], + }, + }, + body: { + JSON: {}, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + }, + }, + }, + output: { + response: { + status: 400, + body: { + output: { + destinationResponse: { + error: { + code: 2655, + fbtrace_id: 'fbtrace_id', + message: '(#2655) Marketing Messaging TOS not accepted', + type: 'OAuthException', + }, + status: 400, + }, + message: 'Marketing Messaging TOS not accepted.', + statTags: { + destType: 'FB_CUSTOM_AUDIENCE', + destinationId: 'Non-determininable', + errorCategory: 'network', + errorType: 'aborted', + feature: 'dataDelivery', + implementation: 'native', + module: 'destination', + workspaceId: 'Non-determininable', + }, + status: 400, + }, + }, + }, + }, + }, ]; export const data = [...existingTestData, ...testScenariosForV1API, ...otherScenariosV1]; diff --git a/test/integrations/destinations/fb_custom_audience/network.ts b/test/integrations/destinations/fb_custom_audience/network.ts index ba14d537ad6..f7546cc95a7 100644 --- a/test/integrations/destinations/fb_custom_audience/network.ts +++ b/test/integrations/destinations/fb_custom_audience/network.ts @@ -626,4 +626,45 @@ export const networkCallsData = [ status: 400, }, }, + { + httpReq: { + version: '1', + type: 'REST', + method: 'DELETE', + endpoint: getEndPoint('aud-new'), + headers: { + 'test-dest-response-key': 'messagingTOSNotAccepted', + }, + params: { + access_token: 'XYZ', + payload: { + is_raw: true, + data_source: { + sub_type: 'ANYTHING', + }, + schema: ['DOBY', 'PHONE', 'GEN', 'FI', 'MADID', 'ZIP', 'ST', 'COUNTRY'], + data: [['2013', '@09432457768', 'f', 'Ms.', 'ABC', 'ZIP ', '123abc ', 'IN']], + }, + }, + userId: '', + body: { + JSON: {}, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + }, + httpRes: { + data: { + error: { + message: '(#2655) Marketing Messaging TOS not accepted', + type: 'OAuthException', + code: 2655, + fbtrace_id: 'fbtrace_id', + }, + }, + status: 400, + }, + }, ]; diff --git a/test/integrations/destinations/fb_custom_audience/processor/data.ts b/test/integrations/destinations/fb_custom_audience/processor/data.ts index 44d4ecaa71e..b5592394319 100644 --- a/test/integrations/destinations/fb_custom_audience/processor/data.ts +++ b/test/integrations/destinations/fb_custom_audience/processor/data.ts @@ -2327,7 +2327,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/aud1/users', + endpoint: 'https://graph.facebook.com/v22.0/aud1/users', headers: {}, params: { access_token: 'ABC', @@ -2395,7 +2395,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/aud1/users', + endpoint: 'https://graph.facebook.com/v22.0/aud1/users', headers: {}, params: { access_token: 'ABC', diff --git a/test/integrations/destinations/fb_custom_audience/router/data.ts b/test/integrations/destinations/fb_custom_audience/router/data.ts index 834b6315f6a..d4cf4f5b89b 100644 --- a/test/integrations/destinations/fb_custom_audience/router/data.ts +++ b/test/integrations/destinations/fb_custom_audience/router/data.ts @@ -10,7 +10,7 @@ import { rETLRecordV2RouterInvalidRequest, } from './rETL'; import { mockFns } from '../mocks'; - +import { defaultAccessToken } from '../../../common/secrets'; export const data = [ { name: 'fb_custom_audience', @@ -36,7 +36,7 @@ export const data = [ version: '1', type: 'REST', method: 'DELETE', - endpoint: 'https://graph.facebook.com/v20.0/aud1/users', + endpoint: 'https://graph.facebook.com/v22.0/aud1/users', headers: {}, params: { access_token: 'ABC', @@ -87,7 +87,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/aud1/users', + endpoint: 'https://graph.facebook.com/v22.0/aud1/users', headers: {}, params: { access_token: 'ABC', @@ -142,7 +142,7 @@ export const data = [ dontBatch: false, jobId: 1, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -159,7 +159,7 @@ export const data = [ version: '1', type: 'REST', method: 'DELETE', - endpoint: 'https://graph.facebook.com/v20.0/aud1/users', + endpoint: 'https://graph.facebook.com/v22.0/aud1/users', headers: {}, params: { access_token: 'ABC', @@ -210,7 +210,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/aud1/users', + endpoint: 'https://graph.facebook.com/v22.0/aud1/users', headers: {}, params: { access_token: 'ABC', @@ -265,7 +265,7 @@ export const data = [ dontBatch: false, jobId: 2, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -305,7 +305,7 @@ export const data = [ version: '1', type: 'REST', method: 'DELETE', - endpoint: 'https://graph.facebook.com/v20.0/23848494844100489/users', + endpoint: 'https://graph.facebook.com/v22.0/23848494844100489/users', headers: {}, params: { access_token: 'ABC', @@ -339,7 +339,7 @@ export const data = [ dontBatch: false, jobId: 1, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -351,7 +351,7 @@ export const data = [ dontBatch: false, jobId: 2, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -368,7 +368,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/23848494844100489/users', + endpoint: 'https://graph.facebook.com/v22.0/23848494844100489/users', headers: {}, params: { access_token: 'ABC', @@ -398,7 +398,7 @@ export const data = [ dontBatch: false, jobId: 3, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -415,7 +415,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/23848494844100489/users', + endpoint: 'https://graph.facebook.com/v22.0/23848494844100489/users', headers: {}, params: { access_token: 'ABC', @@ -453,7 +453,7 @@ export const data = [ dontBatch: false, jobId: 4, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -465,7 +465,7 @@ export const data = [ dontBatch: false, jobId: 5, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -477,7 +477,7 @@ export const data = [ dontBatch: false, jobId: 6, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -496,7 +496,7 @@ export const data = [ dontBatch: false, jobId: 7, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -546,7 +546,7 @@ export const data = [ version: '1', type: 'REST', method: 'DELETE', - endpoint: 'https://graph.facebook.com/v20.0/23848494844100489/users', + endpoint: 'https://graph.facebook.com/v22.0/23848494844100489/users', headers: {}, params: { access_token: 'ABC', @@ -583,7 +583,7 @@ export const data = [ dontBatch: false, jobId: 1, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -595,7 +595,7 @@ export const data = [ dontBatch: false, jobId: 2, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -637,7 +637,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/23848494844100489/users', + endpoint: 'https://graph.facebook.com/v22.0/23848494844100489/users', headers: {}, params: { access_token: 'ABC', @@ -670,7 +670,7 @@ export const data = [ dontBatch: false, jobId: 3, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -712,7 +712,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/23848494844100489/users', + endpoint: 'https://graph.facebook.com/v22.0/23848494844100489/users', headers: {}, params: { access_token: 'ABC', @@ -753,7 +753,7 @@ export const data = [ dontBatch: false, jobId: 4, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -765,7 +765,7 @@ export const data = [ dontBatch: false, jobId: 5, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -777,7 +777,7 @@ export const data = [ dontBatch: false, jobId: 6, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -821,7 +821,7 @@ export const data = [ dontBatch: false, jobId: 7, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -849,9 +849,10 @@ export const data = [ }, { name: 'fb_custom_audience', - description: 'rETL record V2 tests', + description: 'rETL record V2 tests with null values', scenario: 'Framework', - successCriteria: 'all record events should be transformed correctly based on their operation', + successCriteria: + 'all record events should be transformed correctly including records with null values', feature: 'router', module: 'destination', version: 'v0', @@ -871,7 +872,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://graph.facebook.com/v20.0/23848494844100489/users', + endpoint: 'https://graph.facebook.com/v22.0/23848494844100489/users', headers: {}, params: { access_token: 'ABC', @@ -890,6 +891,7 @@ export const data = [ 'b100c2ec0718fe6b4805b623aeec6710719d042ceea55f5c8135b010ec1c7b36', '1e14a2f476f7611a8b22bc85d14237fdc88aac828737e739416c32c5bce3bd16', ], + ['', ''], ], }, }, @@ -909,7 +911,7 @@ export const data = [ dontBatch: false, jobId: 1, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -921,7 +923,7 @@ export const data = [ dontBatch: false, jobId: 2, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -933,7 +935,19 @@ export const data = [ dontBatch: false, jobId: 3, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, + }, + sourceId: 'default-sourceId', + userId: 'default-userId', + workspaceId: 'default-workspaceId', + }, + { + attemptNum: 1, + destinationId: 'default-destinationId', + dontBatch: false, + jobId: 4, + secret: { + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -1000,7 +1014,7 @@ export const data = [ destinationId: 'default-destinationId', workspaceId: 'default-workspaceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, diff --git a/test/integrations/destinations/fb_custom_audience/router/rETL.ts b/test/integrations/destinations/fb_custom_audience/router/rETL.ts index f8d5fc89a03..5182b5380df 100644 --- a/test/integrations/destinations/fb_custom_audience/router/rETL.ts +++ b/test/integrations/destinations/fb_custom_audience/router/rETL.ts @@ -116,8 +116,8 @@ export const rETLRecordV2RouterRequest: RouterTransformationRequest = { version: '895/merge', }, }, - recordId: '2', - rudderId: '2', + recordId: '3', + rudderId: '3', identifiers: { EMAIL: 'subscribed@eewrfrd.com', FI: 'ghui', @@ -126,6 +126,29 @@ export const rETLRecordV2RouterRequest: RouterTransformationRequest = { }, metadata: generateMetadata(3), }, + { + destination: destinationV2, + connection: connection, + message: { + action: 'insert', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '4', + rudderId: '4', + identifiers: { + EMAIL: null, + FI: null, + }, + type: 'record', + }, + metadata: generateMetadata(4), + }, ], destType: 'fb_custom_audience', }; diff --git a/test/integrations/destinations/freshmarketer/maskedSecrets.ts b/test/integrations/destinations/freshmarketer/maskedSecrets.ts new file mode 100644 index 00000000000..30889820e0e --- /dev/null +++ b/test/integrations/destinations/freshmarketer/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Token token=${secret1}`; diff --git a/test/integrations/destinations/freshmarketer/processor/data.ts b/test/integrations/destinations/freshmarketer/processor/data.ts index 07112d762f9..825d59fb91d 100644 --- a/test/integrations/destinations/freshmarketer/processor/data.ts +++ b/test/integrations/destinations/freshmarketer/processor/data.ts @@ -1,3 +1,5 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; + export const data = [ { name: 'freshmarketer', @@ -11,7 +13,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -97,7 +99,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: @@ -122,7 +124,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -208,7 +210,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: @@ -233,7 +235,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -318,7 +320,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -402,7 +404,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -509,7 +511,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/contacts/upsert', @@ -533,7 +535,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -621,7 +623,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -708,7 +710,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -796,7 +798,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -884,7 +886,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: @@ -951,7 +953,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1054,7 +1056,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1158,7 +1160,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1270,7 +1272,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1309,7 +1311,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/sales_activities', @@ -1400,7 +1402,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1419,7 +1421,7 @@ export const data = [ method: 'POST', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/contacts/upsert', headers: { - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1523,7 +1525,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1630,7 +1632,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1741,7 +1743,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1852,7 +1854,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1963,7 +1965,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2001,7 +2003,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/sales_activities', @@ -2095,7 +2097,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2133,7 +2135,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/sales_activities', @@ -2177,7 +2179,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2227,7 +2229,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2283,7 +2285,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2369,7 +2371,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2397,7 +2399,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: @@ -2436,7 +2438,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2494,7 +2496,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2580,7 +2582,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2608,7 +2610,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: @@ -2705,7 +2707,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2812,7 +2814,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2845,7 +2847,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/contacts/upsert', @@ -2936,7 +2938,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -3050,7 +3052,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', rudderEventsToFreshmarketerEvents: [ { @@ -3104,7 +3106,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/sales_activities', @@ -3132,7 +3134,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', diff --git a/test/integrations/destinations/freshmarketer/router/data.ts b/test/integrations/destinations/freshmarketer/router/data.ts index 03690b6e276..4d88409265c 100644 --- a/test/integrations/destinations/freshmarketer/router/data.ts +++ b/test/integrations/destinations/freshmarketer/router/data.ts @@ -1,3 +1,5 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; + export const data = [ { name: 'freshmarketer', @@ -12,7 +14,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -58,7 +60,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -103,7 +105,7 @@ export const data = [ }, { destination: { - Config: { apiKey: 'dummyApiKey', domain: 'domain-rudder.myfreshworks.com' }, + Config: { apiKey: secret1, domain: 'domain-rudder.myfreshworks.com' }, }, metadata: { jobId: 3, userId: 'u1' }, message: { @@ -165,7 +167,7 @@ export const data = [ endpoint: 'https://rudderstack-476952domain3105.myfreshworks.com/crm/sales/api/contacts/upsert', headers: { - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -195,7 +197,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -208,7 +210,7 @@ export const data = [ endpoint: 'https://rudderstack-476952domain3105.myfreshworks.com/crm/sales/api/contacts/upsert', headers: { - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -238,7 +240,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -284,7 +286,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/contacts/upsert', @@ -293,7 +295,7 @@ export const data = [ batched: false, statusCode: 200, destination: { - Config: { apiKey: 'dummyApiKey', domain: 'domain-rudder.myfreshworks.com' }, + Config: { apiKey: secret1, domain: 'domain-rudder.myfreshworks.com' }, }, }, ], diff --git a/test/integrations/destinations/freshsales/maskedSecrets.ts b/test/integrations/destinations/freshsales/maskedSecrets.ts new file mode 100644 index 00000000000..30889820e0e --- /dev/null +++ b/test/integrations/destinations/freshsales/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Token token=${secret1}`; diff --git a/test/integrations/destinations/freshsales/processor/data.ts b/test/integrations/destinations/freshsales/processor/data.ts index 7c0eca0926c..f7fc525cddc 100644 --- a/test/integrations/destinations/freshsales/processor/data.ts +++ b/test/integrations/destinations/freshsales/processor/data.ts @@ -1,3 +1,5 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; + export const data = [ { name: 'freshsales', @@ -76,7 +78,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -116,7 +118,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -202,7 +204,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: @@ -227,7 +229,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -313,7 +315,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: @@ -338,7 +340,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -403,7 +405,7 @@ export const data = [ endpoint: 'https://rudderstack-476952domain3105.myfreshworks.com/crm/sales/api/contacts/upsert', headers: { - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -448,7 +450,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'rudderstack-476952domain3105.myfreshworks.com', }, }, @@ -532,7 +534,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -639,7 +641,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/contacts/upsert', @@ -663,7 +665,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -751,7 +753,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -838,7 +840,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -926,7 +928,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -993,7 +995,7 @@ export const data = [ endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/sales_accounts/upsert', headers: { - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1081,7 +1083,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1184,7 +1186,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1288,7 +1290,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1400,7 +1402,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', rudderEventsToFreshsalesEvents: [ { @@ -1446,7 +1448,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/sales_activities', @@ -1536,7 +1538,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1555,7 +1557,7 @@ export const data = [ method: 'POST', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/contacts/upsert', headers: { - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1659,7 +1661,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1766,7 +1768,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1877,7 +1879,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -1988,7 +1990,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2099,7 +2101,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2137,7 +2139,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/sales_activities', @@ -2231,7 +2233,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2269,7 +2271,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/sales_activities', @@ -2313,7 +2315,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2425,7 +2427,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2532,7 +2534,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, @@ -2565,7 +2567,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Token token=dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://domain-rudder.myfreshworks.com/crm/sales/api/contacts/upsert', @@ -2656,7 +2658,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, domain: 'domain-rudder.myfreshworks.com', }, }, diff --git a/test/integrations/destinations/freshsales/router/data.ts b/test/integrations/destinations/freshsales/router/data.ts index 8548d337b31..7e8f05cc8dd 100644 --- a/test/integrations/destinations/freshsales/router/data.ts +++ b/test/integrations/destinations/freshsales/router/data.ts @@ -1,3 +1,5 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; + export const data = [ { name: 'freshsales', @@ -68,7 +70,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'hrkjfergeferf', + apiKey: secret1, domain: 'rudderstack-479541159204968909.myfreshworks.com', }, Enabled: true, @@ -97,7 +99,7 @@ export const data = [ endpoint: 'https://rudderstack-479541159204968909.myfreshworks.com/crm/sales/api/contacts/upsert', headers: { - Authorization: 'Token token=hrkjfergeferf', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -158,7 +160,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'hrkjfergeferf', + apiKey: secret1, domain: 'rudderstack-479541159204968909.myfreshworks.com', }, Enabled: true, diff --git a/test/integrations/destinations/fullstory/maskedSecrets.ts b/test/integrations/destinations/fullstory/maskedSecrets.ts new file mode 100644 index 00000000000..aaf5a0cbb37 --- /dev/null +++ b/test/integrations/destinations/fullstory/maskedSecrets.ts @@ -0,0 +1,7 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${secret1}`; +export const authHeader2 = `Basic ${secret2}`; diff --git a/test/integrations/destinations/fullstory/processor/data.ts b/test/integrations/destinations/fullstory/processor/data.ts index 9c8d29c7e80..6f9e6a425e9 100644 --- a/test/integrations/destinations/fullstory/processor/data.ts +++ b/test/integrations/destinations/fullstory/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, authHeader2, secret2 } from '../maskedSecrets'; export const data = [ { name: 'fullstory', @@ -85,7 +86,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyfullstoryAPIKey', + apiKey: secret1, }, Enabled: true, Transformations: [], @@ -161,7 +162,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.fullstory.com/v2/events', headers: { - authorization: 'Basic dummyfullstoryAPIKey', + authorization: authHeader1, 'content-type': 'application/json', }, params: {}, @@ -222,7 +223,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyfullstoryAPIKey', + apiKey: secret1, }, Enabled: true, Transformations: [], @@ -309,7 +310,7 @@ export const data = [ }, }, Config: { - apiKey: 'fullstoryAPIKey', + apiKey: secret2, }, Enabled: true, Transformations: [], @@ -354,7 +355,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.fullstory.com/v2/users', headers: { - authorization: 'Basic fullstoryAPIKey', + authorization: authHeader2, 'content-type': 'application/json', }, params: {}, @@ -403,7 +404,7 @@ export const data = [ }, }, Config: { - apiKey: 'fullstoryAPIKey', + apiKey: secret2, }, Enabled: true, Transformations: [], @@ -442,7 +443,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.fullstory.com/v2/users', headers: { - authorization: 'Basic fullstoryAPIKey', + authorization: authHeader2, 'content-type': 'application/json', }, params: {}, diff --git a/test/integrations/destinations/ga/deleteUsers/data.ts b/test/integrations/destinations/ga/deleteUsers/data.ts index 6cbc5d5cfe4..7ef001382c4 100644 --- a/test/integrations/destinations/ga/deleteUsers/data.ts +++ b/test/integrations/destinations/ga/deleteUsers/data.ts @@ -1,4 +1,5 @@ import { AUTH_STATUS_INACTIVE } from '../../../../../src/adapters/networkhandler/authConstants'; +import { secret1, secret2, secret3 } from '../maskedSecrets'; export const data = [ { @@ -10,7 +11,7 @@ export const data = [ input: { request: { headers: { - 'x-rudder-dest-info': '{"secret": { "access_token": "valid_token" }}', + 'x-rudder-dest-info': JSON.stringify({ secret: { access_token: secret1 } }), }, body: [ { @@ -52,7 +53,7 @@ export const data = [ input: { request: { headers: { - 'x-rudder-dest-info': '{"secret": { "access_token": "expired_token" }}', + 'x-rudder-dest-info': JSON.stringify({ secret: { access_token: secret2 } }), }, body: [ { @@ -95,7 +96,7 @@ export const data = [ input: { request: { headers: { - 'x-rudder-dest-info': '{"secret": { "access_token": "valid_token_1" }}', + 'x-rudder-dest-info': JSON.stringify({ secret: { access_token: secret1 } }), }, body: [ { @@ -147,7 +148,7 @@ export const data = [ input: { request: { headers: { - 'x-rudder-dest-info': '{"secret": { "access_token": "no_permissions_token" }}', + 'x-rudder-dest-info': JSON.stringify({ secret: { access_token: secret3 } }), }, body: [ { diff --git a/test/integrations/destinations/ga/maskedSecrets.ts b/test/integrations/destinations/ga/maskedSecrets.ts new file mode 100644 index 00000000000..3ab9722af98 --- /dev/null +++ b/test/integrations/destinations/ga/maskedSecrets.ts @@ -0,0 +1,8 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; +export const authHeader3 = `Bearer ${secret3}`; diff --git a/test/integrations/destinations/ga/network.ts b/test/integrations/destinations/ga/network.ts index acfe5db4305..7d9f0c326de 100644 --- a/test/integrations/destinations/ga/network.ts +++ b/test/integrations/destinations/ga/network.ts @@ -1,3 +1,5 @@ +import { authHeader1, authHeader2, authHeader3 } from './maskedSecrets'; + const deleteNwData = [ { httpReq: { @@ -12,7 +14,7 @@ const deleteNwData = [ webPropertyId: 'UA-123456789-5', }, headers: { - Authorization: 'Bearer valid_token', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', }, @@ -44,7 +46,7 @@ const deleteNwData = [ webPropertyId: 'UA-123456789-5', }, headers: { - Authorization: 'Bearer valid_token', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', }, @@ -76,7 +78,7 @@ const deleteNwData = [ webPropertyId: 'UA-123456789-6', }, headers: { - Authorization: 'Bearer expired_token', + Authorization: authHeader2, Accept: 'application/json', 'Content-Type': 'application/json', }, @@ -107,7 +109,7 @@ const deleteNwData = [ webPropertyId: 'UA-123456789-6', }, headers: { - Authorization: 'Bearer expired_token', + Authorization: authHeader2, Accept: 'application/json', 'Content-Type': 'application/json', }, @@ -138,7 +140,7 @@ const deleteNwData = [ webPropertyId: 'UA-123456789-7', }, headers: { - Authorization: 'Bearer valid_token_1', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', }, @@ -170,7 +172,7 @@ const deleteNwData = [ webPropertyId: 'UA-123456789-7', }, headers: { - Authorization: 'Bearer valid_token_1', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', }, @@ -202,7 +204,7 @@ const deleteNwData = [ webPropertyId: 'UA-123456789-7', }, headers: { - Authorization: 'Bearer valid_token_1', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', }, @@ -238,7 +240,7 @@ const deleteNwData = [ webPropertyId: 'UA-123456789-7', }, headers: { - Authorization: 'Bearer valid_token_1', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', }, @@ -270,7 +272,7 @@ const deleteNwData = [ webPropertyId: 'UA-123456789-7', }, headers: { - Authorization: 'Bearer valid_token_1', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', }, @@ -302,7 +304,7 @@ const deleteNwData = [ webPropertyId: 'UA-123456789-7', }, headers: { - Authorization: 'Bearer no_permissions_token', + Authorization: authHeader3, Accept: 'application/json', 'Content-Type': 'application/json', }, diff --git a/test/integrations/destinations/ga4/dataDelivery/business.ts b/test/integrations/destinations/ga4/dataDelivery/business.ts index 80271abbdbb..2f1f76c60c0 100644 --- a/test/integrations/destinations/ga4/dataDelivery/business.ts +++ b/test/integrations/destinations/ga4/dataDelivery/business.ts @@ -248,7 +248,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: '[GA4 Response Handler] - Request Processed Successfully', response: [ { - error: '{"validationMessages":[]}', + error: JSON.stringify({ validationMessages: [] }), metadata: generateMetadata(1), statusCode: 200, }, diff --git a/test/integrations/destinations/ga4/processor/ecomTestData.ts b/test/integrations/destinations/ga4/processor/ecomTestData.ts index 238e44222b9..3a6f1972700 100644 --- a/test/integrations/destinations/ga4/processor/ecomTestData.ts +++ b/test/integrations/destinations/ga4/processor/ecomTestData.ts @@ -292,6 +292,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -362,6 +363,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -434,6 +436,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -504,6 +507,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -574,6 +578,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -647,6 +652,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -721,6 +727,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -794,6 +801,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -869,6 +877,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -943,6 +952,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1017,6 +1027,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1093,6 +1104,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1170,6 +1182,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1244,6 +1257,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1315,6 +1329,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1385,6 +1400,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1456,6 +1472,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1525,6 +1542,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1591,6 +1609,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1657,6 +1676,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1723,6 +1743,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1800,6 +1821,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1873,6 +1895,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1943,6 +1966,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2014,6 +2038,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2087,6 +2112,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2164,6 +2190,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2247,6 +2274,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2321,6 +2349,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2410,6 +2439,7 @@ export const ecommTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/ga4/processor/groupTestData.ts b/test/integrations/destinations/ga4/processor/groupTestData.ts index 68daad3a8ec..9e97ac33cd7 100644 --- a/test/integrations/destinations/ga4/processor/groupTestData.ts +++ b/test/integrations/destinations/ga4/processor/groupTestData.ts @@ -113,6 +113,7 @@ export const groupTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -184,6 +185,7 @@ export const groupTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -265,6 +267,7 @@ export const groupTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/ga4/processor/pageTestData.ts b/test/integrations/destinations/ga4/processor/pageTestData.ts index 672f7e8f634..3f5d357e6e2 100644 --- a/test/integrations/destinations/ga4/processor/pageTestData.ts +++ b/test/integrations/destinations/ga4/processor/pageTestData.ts @@ -122,6 +122,7 @@ export const pageTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -191,6 +192,7 @@ export const pageTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -263,6 +265,7 @@ export const pageTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -448,6 +451,7 @@ export const pageTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/ga4/processor/trackTestData.ts b/test/integrations/destinations/ga4/processor/trackTestData.ts index ce991ff8453..d99cc24bdf0 100644 --- a/test/integrations/destinations/ga4/processor/trackTestData.ts +++ b/test/integrations/destinations/ga4/processor/trackTestData.ts @@ -158,6 +158,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -225,6 +226,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -294,6 +296,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -365,6 +368,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -432,6 +436,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -502,6 +507,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -569,6 +575,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -637,6 +644,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -703,6 +711,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -773,6 +782,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -844,6 +854,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -914,6 +925,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -981,6 +993,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1049,6 +1062,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1115,6 +1129,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1185,6 +1200,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1253,6 +1269,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1318,6 +1335,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1383,6 +1401,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1451,6 +1470,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1523,6 +1543,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1598,6 +1619,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1673,6 +1695,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1749,6 +1772,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1815,6 +1839,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1879,6 +1904,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -1944,6 +1970,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2010,6 +2037,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2076,6 +2104,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2142,6 +2171,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2215,6 +2245,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2292,6 +2323,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2379,6 +2411,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2458,6 +2491,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2542,6 +2576,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2667,6 +2702,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2752,6 +2788,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2829,6 +2866,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -2909,6 +2947,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/ga4/processor/validationTestData.ts b/test/integrations/destinations/ga4/processor/validationTestData.ts index 0030ee178ec..28c71c8e864 100644 --- a/test/integrations/destinations/ga4/processor/validationTestData.ts +++ b/test/integrations/destinations/ga4/processor/validationTestData.ts @@ -1,5 +1,5 @@ import { defaultMockFns } from '../mocks'; -import { Destination } from '../../../../../src/types'; +import { Destination, RudderMessage } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { generateMetadata, generateSimplifiedTrackPayload } from '../../../testUtils'; @@ -136,6 +136,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -194,6 +195,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -250,6 +252,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -301,6 +304,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -352,6 +356,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -402,6 +407,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -452,6 +458,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -497,6 +504,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -542,6 +550,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -594,6 +603,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -647,6 +657,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -700,6 +711,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -746,6 +758,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -796,6 +809,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -834,9 +848,8 @@ export const validationTestData: ProcessorTestData[] = [ destination, message: { type: 'track', - event: { - name: 'promotion_viewed', - }, + // intentional to test event name as number + event: 122 as unknown as string, properties: { products: commonProductInfo, }, @@ -851,6 +864,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -898,6 +912,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -942,6 +957,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/gainsight_px/processor/data.ts b/test/integrations/destinations/gainsight_px/processor/data.ts index 3dfe86aa985..0b2c2bf9b9b 100644 --- a/test/integrations/destinations/gainsight_px/processor/data.ts +++ b/test/integrations/destinations/gainsight_px/processor/data.ts @@ -1068,7 +1068,7 @@ export const data = [ JSON: { attributes: { description: 'Stringify test for object values', - nested: '{"a":[1,2,3],"b":{"c":1}}', + nested: JSON.stringify({ a: [1, 2, 3], b: { c: 1 } }), arr: '[1,2,3]', }, propertyKey: 'AP-XABC-123', @@ -1205,7 +1205,7 @@ export const data = [ JSON: { attributes: { description: 'Stringify test for object values', - nested: '{"a":[1,2,3],"b":{"c":1}}', + nested: JSON.stringify({ a: [1, 2, 3], b: { c: 1 } }), arr: '[1,2,3]', }, propertyKey: 'AP-XABC-123', diff --git a/test/integrations/destinations/gainsight_px/router/data.ts b/test/integrations/destinations/gainsight_px/router/data.ts index 3a5255f7d2c..8ccbc868621 100644 --- a/test/integrations/destinations/gainsight_px/router/data.ts +++ b/test/integrations/destinations/gainsight_px/router/data.ts @@ -448,10 +448,13 @@ export const data = [ date: 1624704082335, attributes: { array: '[1,2,3]', - nested: '{"json":"test"}', + nested: JSON.stringify({ json: 'test' }), status: 'testing', description: 'Example track call', - fullyNested: '[{"a":1,"b":2},{"a":1,"b":[1,2,3]}]', + fullyNested: JSON.stringify([ + { a: 1, b: 2 }, + { a: 1, b: [1, 2, 3] }, + ]), }, url: 'file:///Users/anurajguha/workspace/simple-html-test/index.html', referrer: '$direct', @@ -595,8 +598,12 @@ export const data = [ body: { output: [ { - error: - '{"message":"error while fetching user: \\"403403 Forbidden\\"","destinationResponse":"403403 Forbidden"}', + error: JSON.stringify({ + message: + 'error while fetching user: "403403 Forbidden"', + destinationResponse: + '403403 Forbidden', + }), statTags: { destType: 'GAINSIGHT_PX', destinationId: destination2.ID, diff --git a/test/integrations/destinations/gladly/maskedSecrets.ts b/test/integrations/destinations/gladly/maskedSecrets.ts new file mode 100644 index 00000000000..156e87fe1e6 --- /dev/null +++ b/test/integrations/destinations/gladly/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; diff --git a/test/integrations/destinations/gladly/network.ts b/test/integrations/destinations/gladly/network.ts index 8c1c2287387..8507ae1ccc9 100644 --- a/test/integrations/destinations/gladly/network.ts +++ b/test/integrations/destinations/gladly/network.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from './maskedSecrets'; const deleteNwData = [ { httpReq: { @@ -5,7 +6,7 @@ const deleteNwData = [ url: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles?email=test%40rudderlabs.com', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, }, }, httpRes: { @@ -19,7 +20,7 @@ const deleteNwData = [ url: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles?email=test%2B2%40rudderlabs.com', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, }, }, httpRes: { @@ -46,7 +47,7 @@ const deleteNwData = [ url: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles?phoneNumber=%2B91%209999999988', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, }, }, httpRes: { @@ -85,7 +86,7 @@ const deleteNwData = [ url: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles?email=test6%40rudderlabs.com', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, }, }, httpRes: { @@ -99,7 +100,7 @@ const deleteNwData = [ url: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles?email=abc', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, }, }, httpRes: { diff --git a/test/integrations/destinations/gladly/processor/data.ts b/test/integrations/destinations/gladly/processor/data.ts index e81af999fbc..f04e1706538 100644 --- a/test/integrations/destinations/gladly/processor/data.ts +++ b/test/integrations/destinations/gladly/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; export const data = [ { name: 'gladly', @@ -29,8 +30,8 @@ export const data = [ }, }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -98,8 +99,8 @@ export const data = [ }, }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -166,7 +167,7 @@ export const data = [ }, }, Config: { - apiToken: 'testApiToken', + apiToken: secret2, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -242,8 +243,8 @@ export const data = [ }, }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -276,7 +277,7 @@ export const data = [ }, endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles', headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, userId: '', @@ -333,8 +334,8 @@ export const data = [ }, }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -366,7 +367,7 @@ export const data = [ }, endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles/user@2', headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, userId: '', @@ -421,8 +422,8 @@ export const data = [ }, }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -452,7 +453,7 @@ export const data = [ }, endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles/user@3', headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, userId: '', @@ -500,8 +501,8 @@ export const data = [ }, }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -581,8 +582,8 @@ export const data = [ }, }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -619,7 +620,7 @@ export const data = [ }, endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles', headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, userId: '', @@ -673,8 +674,8 @@ export const data = [ }, }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -704,7 +705,7 @@ export const data = [ }, endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles', headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, userId: '', @@ -758,8 +759,8 @@ export const data = [ }, }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -789,7 +790,7 @@ export const data = [ }, endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles', headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, userId: '', diff --git a/test/integrations/destinations/gladly/router/data.ts b/test/integrations/destinations/gladly/router/data.ts index 462edd9772b..5af08edb707 100644 --- a/test/integrations/destinations/gladly/router/data.ts +++ b/test/integrations/destinations/gladly/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; export const data = [ { name: 'gladly', @@ -31,8 +32,8 @@ export const data = [ destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -60,8 +61,8 @@ export const data = [ destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -87,8 +88,8 @@ export const data = [ destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -124,7 +125,7 @@ export const data = [ endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles', files: {}, headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -134,9 +135,9 @@ export const data = [ }, destination: { Config: { - apiToken: 'testApiToken', + apiToken: secret2, domain: 'rudderlabs.us-uat.gladly.qa', - userName: 'testUserName', + userName: secret1, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, }, @@ -161,7 +162,7 @@ export const data = [ endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles/user@2', files: {}, headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'PATCH', @@ -171,9 +172,9 @@ export const data = [ }, destination: { Config: { - apiToken: 'testApiToken', + apiToken: secret2, domain: 'rudderlabs.us-uat.gladly.qa', - userName: 'testUserName', + userName: secret1, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, }, @@ -196,7 +197,7 @@ export const data = [ endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles/user@3', files: {}, headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'PATCH', @@ -206,9 +207,9 @@ export const data = [ }, destination: { Config: { - apiToken: 'testApiToken', + apiToken: secret2, domain: 'rudderlabs.us-uat.gladly.qa', - userName: 'testUserName', + userName: secret1, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, }, @@ -253,8 +254,8 @@ export const data = [ destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -283,8 +284,8 @@ export const data = [ destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -312,8 +313,8 @@ export const data = [ destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, Config: { - apiToken: 'testApiToken', - userName: 'testUserName', + apiToken: secret2, + userName: secret1, domain: 'rudderlabs.us-uat.gladly.qa', }, }, @@ -348,7 +349,7 @@ export const data = [ endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles', files: {}, headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -358,9 +359,9 @@ export const data = [ }, destination: { Config: { - apiToken: 'testApiToken', + apiToken: secret2, domain: 'rudderlabs.us-uat.gladly.qa', - userName: 'testUserName', + userName: secret1, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, }, @@ -384,7 +385,7 @@ export const data = [ endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles/user@2', files: {}, headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'PATCH', @@ -394,9 +395,9 @@ export const data = [ }, destination: { Config: { - apiToken: 'testApiToken', + apiToken: secret2, domain: 'rudderlabs.us-uat.gladly.qa', - userName: 'testUserName', + userName: secret1, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, }, @@ -419,7 +420,7 @@ export const data = [ endpoint: 'https://rudderlabs.us-uat.gladly.qa/api/v1/customer-profiles/user@3', files: {}, headers: { - Authorization: 'Basic dGVzdFVzZXJOYW1lOnRlc3RBcGlUb2tlbg==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'PATCH', @@ -429,9 +430,9 @@ export const data = [ }, destination: { Config: { - apiToken: 'testApiToken', + apiToken: secret2, domain: 'rudderlabs.us-uat.gladly.qa', - userName: 'testUserName', + userName: secret1, }, DestinationDefinition: { Config: { cdkV2Enabled: true } }, }, diff --git a/test/integrations/destinations/google_adwords_enhanced_conversions/dataDelivery/business.ts b/test/integrations/destinations/google_adwords_enhanced_conversions/dataDelivery/business.ts index d318066e7d4..3a5d3d684b9 100644 --- a/test/integrations/destinations/google_adwords_enhanced_conversions/dataDelivery/business.ts +++ b/test/integrations/destinations/google_adwords_enhanced_conversions/dataDelivery/business.ts @@ -1,13 +1,15 @@ +import { authHeader1 } from '../maskedSecrets'; import { generateMetadata, generateProxyV0Payload, generateProxyV1Payload, } from '../../../testUtils'; import { ProxyV1TestData } from '../../../testTypes'; -import { API_VERSION } from '../../../../../src/v0/destinations/google_adwords_enhanced_conversions/config'; + +const API_VERSION = 'v18'; const headers = { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', @@ -175,8 +177,26 @@ export const testScenariosForV0API = [ message: 'Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again., at conversion_adjustments[0]', }, - message: - '{"code":3,"message":"Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again., at conversion_adjustments[0]","details":[{"@type":"type.googleapis.com/google.ads.googleads.v15.errors.GoogleAdsFailure","errors":[{"errorCode":{"conversionAdjustmentUploadError":"CONVERSION_ALREADY_ENHANCED"},"message":"Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again.","location":{"fieldPathElements":[{"fieldName":"conversion_adjustments","index":0}]}}]}]}', + message: JSON.stringify({ + code: 3, + message: + 'Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again., at conversion_adjustments[0]', + details: [ + { + '@type': 'type.googleapis.com/google.ads.googleads.v15.errors.GoogleAdsFailure', + errors: [ + { + errorCode: { conversionAdjustmentUploadError: 'CONVERSION_ALREADY_ENHANCED' }, + message: + 'Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again.', + location: { + fieldPathElements: [{ fieldName: 'conversion_adjustments', index: 0 }], + }, + }, + ], + }, + ], + }), statTags: expectedStatTags, status: 400, }, @@ -217,8 +237,22 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request Processed Successfully', response: [ { - error: - '[{"results":[{"adjustmentType":"ENHANCEMENT","conversionAction":"customers/7693729833/conversionActions/874224905","adjustmentDateTime":"2021-01-01 12:32:45-08:00","gclidDateTimePair":{"gclid":"1234","conversionDateTime":"2021-01-01 12:32:45-08:00"},"orderId":"12345"}]}]', + error: JSON.stringify([ + { + results: [ + { + adjustmentType: 'ENHANCEMENT', + conversionAction: 'customers/7693729833/conversionActions/874224905', + adjustmentDateTime: '2021-01-01 12:32:45-08:00', + gclidDateTimePair: { + gclid: '1234', + conversionDateTime: '2021-01-01 12:32:45-08:00', + }, + orderId: '12345', + }, + ], + }, + ]), metadata: generateMetadata(1), statusCode: 200, }, @@ -261,12 +295,51 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ status: 200, body: { output: { - message: - '{"code":3,"message":"Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again., at conversion_adjustments[0]","details":[{"@type":"type.googleapis.com/google.ads.googleads.v15.errors.GoogleAdsFailure","errors":[{"errorCode":{"conversionAdjustmentUploadError":"CONVERSION_ALREADY_ENHANCED"},"message":"Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again.","location":{"fieldPathElements":[{"fieldName":"conversion_adjustments","index":0}]}}]}]}', + message: JSON.stringify({ + code: 3, + message: + 'Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again., at conversion_adjustments[0]', + details: [ + { + '@type': 'type.googleapis.com/google.ads.googleads.v15.errors.GoogleAdsFailure', + errors: [ + { + errorCode: { conversionAdjustmentUploadError: 'CONVERSION_ALREADY_ENHANCED' }, + message: + 'Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again.', + location: { + fieldPathElements: [{ fieldName: 'conversion_adjustments', index: 0 }], + }, + }, + ], + }, + ], + }), response: [ { - error: - '{"code":3,"message":"Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again., at conversion_adjustments[0]","details":[{"@type":"type.googleapis.com/google.ads.googleads.v15.errors.GoogleAdsFailure","errors":[{"errorCode":{"conversionAdjustmentUploadError":"CONVERSION_ALREADY_ENHANCED"},"message":"Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again.","location":{"fieldPathElements":[{"fieldName":"conversion_adjustments","index":0}]}}]}]}', + error: JSON.stringify({ + code: 3, + message: + 'Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again., at conversion_adjustments[0]', + details: [ + { + '@type': + 'type.googleapis.com/google.ads.googleads.v15.errors.GoogleAdsFailure', + errors: [ + { + errorCode: { + conversionAdjustmentUploadError: 'CONVERSION_ALREADY_ENHANCED', + }, + message: + 'Conversion already has enhancements with the same Order ID and conversion action. Make sure your data is correctly configured and try again.', + location: { + fieldPathElements: [{ fieldName: 'conversion_adjustments', index: 0 }], + }, + }, + ], + }, + ], + }), metadata: generateMetadata(1), statusCode: 400, }, diff --git a/test/integrations/destinations/google_adwords_enhanced_conversions/dataDelivery/oauth.ts b/test/integrations/destinations/google_adwords_enhanced_conversions/dataDelivery/oauth.ts index c6e29925dd8..1a8e3a8a096 100644 --- a/test/integrations/destinations/google_adwords_enhanced_conversions/dataDelivery/oauth.ts +++ b/test/integrations/destinations/google_adwords_enhanced_conversions/dataDelivery/oauth.ts @@ -1,4 +1,6 @@ -import { API_VERSION } from '../../../../../src/v0/destinations/google_adwords_enhanced_conversions/config'; +import { authHeader1 } from '../maskedSecrets'; +const API_VERSION = 'v18'; + import { generateProxyV1Payload, generateProxyV0Payload, @@ -38,7 +40,7 @@ const requestPayload = { }; const headers = { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', diff --git a/test/integrations/destinations/google_adwords_enhanced_conversions/maskedSecrets.ts b/test/integrations/destinations/google_adwords_enhanced_conversions/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/google_adwords_enhanced_conversions/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/google_adwords_enhanced_conversions/network.ts b/test/integrations/destinations/google_adwords_enhanced_conversions/network.ts index 270ec2dc77e..8fb8a9aabbd 100644 --- a/test/integrations/destinations/google_adwords_enhanced_conversions/network.ts +++ b/test/integrations/destinations/google_adwords_enhanced_conversions/network.ts @@ -1,4 +1,6 @@ -import { API_VERSION } from '../../../../src/v0/destinations/google_adwords_enhanced_conversions/config'; +import { authHeader1 } from './maskedSecrets'; +const API_VERSION = 'v18'; + export const networkCallsData = [ { httpReq: { @@ -7,7 +9,7 @@ export const networkCallsData = [ query: `SELECT conversion_action.id FROM conversion_action WHERE conversion_action.name = 'Product Added'`, }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', @@ -36,7 +38,7 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_enhanced_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', @@ -95,7 +97,7 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_enhanced_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', @@ -130,7 +132,7 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_enhanced_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', @@ -191,7 +193,7 @@ export const networkCallsData = [ destination: 'google_adwords_enhanced_conversion', }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', @@ -252,7 +254,7 @@ export const networkCallsData = [ destination: 'google_adwords_enhanced_conversion', }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', @@ -282,7 +284,7 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_enhanced_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', @@ -341,7 +343,7 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_enhanced_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', @@ -389,7 +391,7 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_enhanced_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '0987654321', diff --git a/test/integrations/destinations/google_adwords_enhanced_conversions/processor/data.ts b/test/integrations/destinations/google_adwords_enhanced_conversions/processor/data.ts index 1d20e887e98..5128db634d7 100644 --- a/test/integrations/destinations/google_adwords_enhanced_conversions/processor/data.ts +++ b/test/integrations/destinations/google_adwords_enhanced_conversions/processor/data.ts @@ -1,4 +1,5 @@ -import { API_VERSION } from '../../../../../src/v0/destinations/google_adwords_enhanced_conversions/config'; +import { authHeader1, secret1 } from '../maskedSecrets'; +const API_VERSION = 'v18'; export const data = [ { name: 'google_adwords_enhanced_conversions', @@ -12,7 +13,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -131,7 +132,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567890:uploadConversionAdjustments`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '1234567890', @@ -189,7 +190,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -212,7 +213,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -326,7 +327,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -359,7 +360,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -465,7 +466,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -498,7 +499,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -618,7 +619,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567890:uploadConversionAdjustments`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '11', @@ -672,7 +673,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -695,7 +696,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -808,7 +809,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -840,7 +841,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -902,7 +903,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1072,7 +1073,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1187,7 +1188,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1220,7 +1221,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1329,7 +1330,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567890:uploadConversionAdjustments`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '1234567890', @@ -1387,7 +1388,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1410,7 +1411,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1519,7 +1520,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567890:uploadConversionAdjustments`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '1234567890', @@ -1573,7 +1574,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1596,7 +1597,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -1700,7 +1701,7 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, diff --git a/test/integrations/destinations/google_adwords_enhanced_conversions/router/data.ts b/test/integrations/destinations/google_adwords_enhanced_conversions/router/data.ts index 5ac05b5a530..d96f716f21e 100644 --- a/test/integrations/destinations/google_adwords_enhanced_conversions/router/data.ts +++ b/test/integrations/destinations/google_adwords_enhanced_conversions/router/data.ts @@ -1,8 +1,11 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; +const API_VERSION = 'v18'; + const events = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -94,7 +97,7 @@ const events = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -226,7 +229,7 @@ const events = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -320,7 +323,7 @@ const events = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -414,7 +417,7 @@ const events = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -450,7 +453,7 @@ const events = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, @@ -542,11 +545,7 @@ const invalidRtTfCases = [ output: [ { error: 'Invalid event array', - metadata: [ - { - destType: undefined, - }, - ], + metadata: [{}], batched: false, statusCode: 400, }, @@ -575,11 +574,7 @@ const invalidRtTfCases = [ output: [ { error: 'Invalid event array', - metadata: [ - { - destType: undefined, - }, - ], + metadata: [{}], batched: false, statusCode: 400, }, @@ -657,11 +652,10 @@ export const data = [ JSON_ARRAY: {}, XML: {}, }, - endpoint: - 'https://googleads.googleapis.com/v17/customers/1234567890:uploadConversionAdjustments', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567890:uploadConversionAdjustments`, files: {}, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '11', @@ -695,7 +689,7 @@ export const data = [ { jobId: 1, secret: { - access_token: 'abcd1234', + access_token: secret1, developer_token: 'ijkl91011', refresh_token: 'efgh5678', }, @@ -728,7 +722,7 @@ export const data = [ { jobId: 2, secret: { - access_token: 'abcd1234', + access_token: secret1, developer_token: 'ijkl91011', refresh_token: 'efgh5678', }, @@ -828,11 +822,10 @@ export const data = [ JSON_ARRAY: {}, XML: {}, }, - endpoint: - 'https://googleads.googleapis.com/v17/customers/1234567890:uploadConversionAdjustments', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567890:uploadConversionAdjustments`, files: {}, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'ijkl91011', 'login-customer-id': '11', @@ -866,7 +859,7 @@ export const data = [ { jobId: 4, secret: { - access_token: 'abcd1234', + access_token: secret1, developer_token: 'ijkl91011', refresh_token: 'efgh5678', }, @@ -899,7 +892,7 @@ export const data = [ { jobId: 5, secret: { - access_token: 'abcd1234', + access_token: secret1, developer_token: 'ijkl91011', refresh_token: 'efgh5678', }, @@ -941,7 +934,7 @@ export const data = [ { jobId: 7, secret: { - access_token: 'abcd1234', + access_token: secret1, developer_token: 'ijkl91011', refresh_token: 'efgh5678', }, @@ -973,7 +966,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', developer_token: 'ijkl91011', }, diff --git a/test/integrations/destinations/google_adwords_offline_conversions/dataDelivery/business.ts b/test/integrations/destinations/google_adwords_offline_conversions/dataDelivery/business.ts index 87aafea0afa..7478355ce15 100644 --- a/test/integrations/destinations/google_adwords_offline_conversions/dataDelivery/business.ts +++ b/test/integrations/destinations/google_adwords_offline_conversions/dataDelivery/business.ts @@ -1,9 +1,12 @@ +import { authHeader1, secret3 } from '../maskedSecrets'; import { generateMetadata, generateProxyV0Payload, generateProxyV1Payload, } from '../../../testUtils'; +const API_VERSION = 'v18'; + const transactionAttribute = { CUSTOM_KEY: 'CUSTOM_VALUE', currency_code: 'INR', @@ -42,15 +45,15 @@ const products = [ const headers = { header1: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, header2: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, }; @@ -234,8 +237,7 @@ export const testScenariosForV0API = [ headers: headers.header1, params: params.param1, JSON: invalidArgumentRequestPayload, - endpoint: - 'https://googleads.googleapis.com/v16/customers/11122233331/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/11122233331/offlineUserDataJobs`, }), method: 'POST', }, @@ -309,7 +311,7 @@ export const testScenariosForV0API = [ headers: headers.header1, params: params.param1, JSON: validRequestPayload1, - endpoint: 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs`, }), method: 'POST', }, @@ -349,8 +351,7 @@ export const testScenariosForV0API = [ headers: headers.header2, params: params.param2, JSON: validRequestPayload2, - endpoint: - 'https://googleads.googleapis.com/v16/customers/1234567891:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567891:uploadClickConversions`, }), method: 'POST', }, @@ -399,8 +400,7 @@ export const testScenariosForV0API = [ headers: headers.header2, params: params.param3, JSON: validRequestPayload2, - endpoint: - 'https://googleads.googleapis.com/v16/customers/1234567891:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567891:uploadClickConversions`, }), method: 'POST', }, @@ -452,8 +452,7 @@ export const testScenariosForV1API = [ headers: headers.header1, params: params.param1, JSON: invalidArgumentRequestPayload, - endpoint: - 'https://googleads.googleapis.com/v16/customers/11122233331/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/11122233331/offlineUserDataJobs`, }, metadataArray, ), @@ -499,8 +498,7 @@ export const testScenariosForV1API = [ headers: headers.header1, params: params.param1, JSON: validRequestPayload1, - endpoint: - 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs`, }, metadataArray, ), @@ -516,7 +514,7 @@ export const testScenariosForV1API = [ '[Google Ads Offline Conversions Response Handler] - Request processed successfully', response: [ { - error: '{"name":"customers/111-222-3333/operations/abcd="}', + error: JSON.stringify({ name: 'customers/111-222-3333/operations/abcd=' }), metadata: generateMetadata(1), statusCode: 200, }, @@ -544,8 +542,7 @@ export const testScenariosForV1API = [ headers: headers.header2, params: params.param2, JSON: validRequestPayload2, - endpoint: - 'https://googleads.googleapis.com/v16/customers/1234567891:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567891:uploadClickConversions`, }, metadataArray, ), @@ -561,8 +558,18 @@ export const testScenariosForV1API = [ '[Google Ads Offline Conversions Response Handler] - Request processed successfully', response: [ { - error: - '[{"adjustmentType":"ENHANCEMENT","conversionAction":"customers/1234567891/conversionActions/874224905","adjustmentDateTime":"2021-01-01 12:32:45-08:00","gclidDateTimePair":{"gclid":"1234","conversionDateTime":"2021-01-01 12:32:45-08:00"},"orderId":"12345"}]', + error: JSON.stringify([ + { + adjustmentType: 'ENHANCEMENT', + conversionAction: 'customers/1234567891/conversionActions/874224905', + adjustmentDateTime: '2021-01-01 12:32:45-08:00', + gclidDateTimePair: { + gclid: '1234', + conversionDateTime: '2021-01-01 12:32:45-08:00', + }, + orderId: '12345', + }, + ]), metadata: generateMetadata(1), statusCode: 200, }, @@ -590,8 +597,7 @@ export const testScenariosForV1API = [ headers: headers.header2, params: params.param3, JSON: validRequestPayload2, - endpoint: - 'https://googleads.googleapis.com/v16/customers/1234567891:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567891:uploadClickConversions`, }, metadataArray, ), @@ -607,8 +613,18 @@ export const testScenariosForV1API = [ '[Google Ads Offline Conversions Response Handler] - Request processed successfully', response: [ { - error: - '[{"adjustmentType":"ENHANCEMENT","conversionAction":"customers/1234567891/conversionActions/874224905","adjustmentDateTime":"2021-01-01 12:32:45-08:00","gclidDateTimePair":{"gclid":"1234","conversionDateTime":"2021-01-01 12:32:45-08:00"},"orderId":"12345"}]', + error: JSON.stringify([ + { + adjustmentType: 'ENHANCEMENT', + conversionAction: 'customers/1234567891/conversionActions/874224905', + adjustmentDateTime: '2021-01-01 12:32:45-08:00', + gclidDateTimePair: { + gclid: '1234', + conversionDateTime: '2021-01-01 12:32:45-08:00', + }, + orderId: '12345', + }, + ]), metadata: generateMetadata(1), statusCode: 200, }, @@ -636,8 +652,7 @@ export const testScenariosForV1API = [ headers: headers.header2, params: params.param4, JSON: notAllowedToAccessFeatureRequestPayload, - endpoint: - 'https://googleads.googleapis.com/v16/customers/1234567893:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567893:uploadClickConversions`, }, metadataArray, ), diff --git a/test/integrations/destinations/google_adwords_offline_conversions/dataDelivery/oauth.ts b/test/integrations/destinations/google_adwords_offline_conversions/dataDelivery/oauth.ts index 4437ebb912c..f71d5c143f6 100644 --- a/test/integrations/destinations/google_adwords_offline_conversions/dataDelivery/oauth.ts +++ b/test/integrations/destinations/google_adwords_offline_conversions/dataDelivery/oauth.ts @@ -1,13 +1,17 @@ +import { authHeader1, authHeader2, secret3 } from '../maskedSecrets'; import { generateMetadata, generateProxyV1Payload, generateProxyV0Payload, } from '../../../testUtils'; +import { defaultAccessToken } from '../../../common/secrets'; + +const API_VERSION = 'v18'; const commonHeaders = { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }; @@ -95,7 +99,7 @@ export const v0oauthScenarios = [ request: { body: generateProxyV0Payload({ ...commonRequestParameters, - endpoint: 'https://googleads.googleapis.com/v16/customers/customerid/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/customerid/offlineUserDataJobs`, }), method: 'POST', }, @@ -138,7 +142,7 @@ export const v0oauthScenarios = [ request: { body: generateProxyV0Payload({ ...commonRequestParameters, - endpoint: 'https://googleads.googleapis.com/v16/customers/1234/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234/offlineUserDataJobs`, }), method: 'POST', }, @@ -183,8 +187,7 @@ export const v1oauthScenarios = [ body: generateProxyV1Payload( { ...commonRequestParameters, - endpoint: - 'https://googleads.googleapis.com/v16/customers/customerid/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/customerid/offlineUserDataJobs`, }, metadataArray, ), @@ -230,7 +233,7 @@ export const v1oauthScenarios = [ body: generateProxyV1Payload( { ...commonRequestParameters, - endpoint: 'https://googleads.googleapis.com/v16/customers/1234/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234/offlineUserDataJobs`, }, metadataArray, ), @@ -276,13 +279,12 @@ export const v1oauthScenarios = [ { ...commonRequestParameters, headers: { - Authorization: 'Bearer invalidabcd1234', + Authorization: authHeader2, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, - endpoint: - 'https://googleads.googleapis.com/v16/customers/customerid/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/customerid/offlineUserDataJobs`, }, metadataArray, ), @@ -307,7 +309,7 @@ export const v1oauthScenarios = [ dontBatch: false, jobId: 1, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -348,13 +350,12 @@ export const v1oauthScenarios = [ { ...{ ...commonRequestParameters, JSON: { isStoreConversion: false } }, headers: { - Authorization: 'Bearer invalidabcd1234', + Authorization: authHeader2, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, - endpoint: - 'https://googleads.googleapis.com/v16/customers/customerid/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/customerid/offlineUserDataJobs`, }, metadataArray, ), @@ -379,7 +380,7 @@ export const v1oauthScenarios = [ dontBatch: false, jobId: 1, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', diff --git a/test/integrations/destinations/google_adwords_offline_conversions/maskedSecrets.ts b/test/integrations/destinations/google_adwords_offline_conversions/maskedSecrets.ts new file mode 100644 index 00000000000..6b725d44020 --- /dev/null +++ b/test/integrations/destinations/google_adwords_offline_conversions/maskedSecrets.ts @@ -0,0 +1,7 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; diff --git a/test/integrations/destinations/google_adwords_offline_conversions/network.ts b/test/integrations/destinations/google_adwords_offline_conversions/network.ts index 0ab6bef1db7..ad449076eca 100644 --- a/test/integrations/destinations/google_adwords_offline_conversions/network.ts +++ b/test/integrations/destinations/google_adwords_offline_conversions/network.ts @@ -1,3 +1,6 @@ +import { authHeader1, authHeader2, secret3 } from './maskedSecrets'; +const API_VERSION = 'v18'; + const commonResponse = { status: 401, data: [ @@ -30,7 +33,7 @@ const commonResponse = { export const networkCallsData = [ { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/11122233331/offlineUserDataJobs:create', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/11122233331/offlineUserDataJobs:create`, data: { job: { storeSalesMetadata: { @@ -42,9 +45,9 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, method: 'POST', @@ -59,15 +62,15 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1112223333/googleAds:searchStream', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/googleAds:searchStream`, data: { query: `SELECT conversion_action.id FROM conversion_action WHERE conversion_action.name = 'Sign-up - click'`, }, params: { destination: 'google_adwords_offline_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, method: 'POST', @@ -92,7 +95,7 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/11122233331/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID_FOR_ADD_FAILURE:addOperations', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/11122233331/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID_FOR_ADD_FAILURE:addOperations`, data: { enable_partial_failure: false, enable_warnings: false, @@ -121,9 +124,9 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_offline_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, method: 'POST', @@ -173,7 +176,7 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs:create', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs:create`, data: { job: { storeSalesMetadata: { @@ -186,9 +189,9 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_offline_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, method: 'POST', @@ -202,7 +205,7 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID:addOperations', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID:addOperations`, data: { enable_partial_failure: false, enable_warnings: false, @@ -231,9 +234,9 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_offline_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, method: 'POST', @@ -245,13 +248,13 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID:run', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs/OFFLINE_USER_DATA_JOB_ID:run`, data: { validate_only: false }, params: { destination: 'google_adwords_offline_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, method: 'POST', @@ -267,7 +270,7 @@ export const networkCallsData = [ description: 'Mock response from destination depicting a request with invalid authentication credentials', httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/customerid/offlineUserDataJobs:create', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/customerid/offlineUserDataJobs:create`, data: { job: { storeSalesMetadata: { @@ -280,9 +283,9 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_offline_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, method: 'POST', @@ -303,7 +306,7 @@ export const networkCallsData = [ description: 'Mock response from destination depicting a request with invalid authentication scopes', httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1234/offlineUserDataJobs:create', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1234/offlineUserDataJobs:create`, data: { job: { storeSalesMetadata: { @@ -316,9 +319,9 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_offline_conversion' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, method: 'POST', @@ -336,14 +339,14 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1234567890/googleAds:searchStream', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567890/googleAds:searchStream`, data: { query: `SELECT conversion_action.id FROM conversion_action WHERE conversion_action.name = 'Sign-up - click'`, }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, method: 'POST', params: { destination: 'google_adwords_offline_conversion' }, @@ -364,15 +367,15 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1234567891/googleAds:searchStream', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567891/googleAds:searchStream`, data: { query: "SELECT conversion_action.id FROM conversion_action WHERE conversion_action.name = 'Sign-up - click'", }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, method: 'POST', params: { destination: 'google_adwords_offline_conversion' }, @@ -397,12 +400,12 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1234567891/googleAds:searchStream', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567891/googleAds:searchStream`, data: { query: 'SELECT conversion_custom_variable.name FROM conversion_custom_variable' }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, method: 'POST', params: { destination: 'google_adwords_offline_conversion' }, @@ -431,7 +434,7 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1234567891:uploadClickConversions', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567891:uploadClickConversions`, data: { conversions: [ { @@ -473,9 +476,9 @@ export const networkCallsData = [ partialFailure: true, }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, method: 'POST', params: { destination: 'google_adwords_offline_conversion' }, @@ -498,7 +501,7 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1234567891:uploadClickConversions', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567891:uploadClickConversions`, data: { conversions: [ { @@ -534,9 +537,9 @@ export const networkCallsData = [ partialFailure: true, }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, method: 'POST', params: { destination: 'google_adwords_offline_conversion' }, @@ -559,15 +562,15 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1234567893/googleAds:searchStream', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567893/googleAds:searchStream`, data: { query: "SELECT conversion_action.id FROM conversion_action WHERE conversion_action.name = 'Sign-up - click'", }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, method: 'POST', params: { destination: 'google_adwords_offline_conversion' }, @@ -592,7 +595,7 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1234567893:uploadClickConversions', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1234567893:uploadClickConversions`, data: { conversions: [ { @@ -628,9 +631,9 @@ export const networkCallsData = [ partialFailure: true, }, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, method: 'POST', params: { destination: 'google_adwords_offline_conversion' }, @@ -678,7 +681,7 @@ export const networkCallsData = [ description: 'Mock response from destination depicting a request from user who has not enabled 2 factor authentication', httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/customerid/offlineUserDataJobs:create', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/customerid/offlineUserDataJobs:create`, data: { job: { storeSalesMetadata: { @@ -691,9 +694,9 @@ export const networkCallsData = [ }, params: { destination: 'google_adwords_offline_conversion' }, headers: { - Authorization: 'Bearer invalidabcd1234', + Authorization: authHeader2, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, method: 'POST', @@ -704,15 +707,15 @@ export const networkCallsData = [ description: 'Mock response from destination depicting a request from user who has not enabled 2 factor authentication', httpReq: { - url: 'https://googleads.googleapis.com/v16/customers/1112223333/googleAds:searchStream', + url: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/googleAds:searchStream`, data: { query: "SELECT conversion_action.id FROM conversion_action WHERE conversion_action.name = 'Sign-up - click'", }, headers: { - Authorization: 'Bearer invalidabcd1234', + Authorization: authHeader2, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, method: 'POST', diff --git a/test/integrations/destinations/google_adwords_offline_conversions/processor/data.ts b/test/integrations/destinations/google_adwords_offline_conversions/processor/data.ts index 3ecae2b92dd..492cc692fd7 100644 --- a/test/integrations/destinations/google_adwords_offline_conversions/processor/data.ts +++ b/test/integrations/destinations/google_adwords_offline_conversions/processor/data.ts @@ -1,4 +1,8 @@ +import { authHeader1, secret1, secret3 } from '../maskedSecrets'; import { timestampMock } from '../mocks'; + +const API_VERSION = 'v18'; + export const data = [ { name: 'google_adwords_offline_conversions', @@ -99,9 +103,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -175,12 +179,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'Sign-up - click', @@ -278,9 +281,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -390,9 +393,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -466,12 +469,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'Sign-up - click', @@ -569,9 +571,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -681,9 +683,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -757,12 +759,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'Sign-up - click', @@ -860,9 +861,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -972,9 +973,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -1048,12 +1049,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadCallConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadCallConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'search', @@ -1126,9 +1126,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -1402,9 +1402,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -1476,9 +1476,9 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 400, @@ -1575,9 +1575,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -1649,9 +1649,9 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 400, @@ -1749,9 +1749,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -1823,9 +1823,9 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 400, @@ -1942,9 +1942,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -2022,12 +2022,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'Page view', @@ -2116,9 +2115,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -2128,12 +2127,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadCallConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadCallConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'Page view', @@ -2206,9 +2204,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -2274,9 +2272,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -2352,12 +2350,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': '8617859087', }, params: { @@ -2409,9 +2406,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -2476,9 +2473,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -2552,12 +2549,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadCallConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadCallConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'search', @@ -2602,9 +2598,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -2712,9 +2708,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -2788,12 +2784,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadCallConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadCallConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'search', @@ -2865,9 +2860,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -2934,9 +2929,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -3011,12 +3006,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'Sign-up - click', @@ -3066,9 +3060,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -3135,9 +3129,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -3210,9 +3204,9 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 400, @@ -3288,9 +3282,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -3363,9 +3357,9 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 400, @@ -3442,9 +3436,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -3519,12 +3513,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': '8617859087', }, params: { @@ -3586,9 +3579,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -3654,9 +3647,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -3729,8 +3722,8 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', - developer_token: 'ijkl91011', + access_token: secret1, + developer_token: secret3, refresh_token: 'efgh5678', }, }, @@ -3762,13 +3755,12 @@ export const data = [ JSON_ARRAY: {}, XML: {}, }, - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, files: {}, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': '8617859087', }, method: 'POST', @@ -3859,9 +3851,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -3936,12 +3928,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': '8617859087', }, params: { @@ -3996,9 +3987,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -4051,9 +4042,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -4128,12 +4119,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, params: { @@ -4196,9 +4186,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -4251,9 +4241,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -4325,9 +4315,9 @@ export const data = [ { metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 400, @@ -4388,9 +4378,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -4465,12 +4455,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, params: { @@ -4532,9 +4521,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -4587,9 +4576,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -4664,12 +4653,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, params: { @@ -4732,9 +4720,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -4789,9 +4777,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -4866,12 +4854,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, params: { @@ -4931,9 +4918,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -4988,9 +4975,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -5030,12 +5017,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, params: { @@ -5095,9 +5081,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -5148,9 +5134,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -5190,12 +5176,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, params: { @@ -5255,9 +5240,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -5306,9 +5291,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -5348,12 +5333,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, params: { @@ -5408,9 +5392,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -5422,7 +5406,7 @@ export const data = [ }, { name: 'google_adwords_offline_conversions', - description: 'Test 26 : store conversion consent mapped from UI config', + description: 'Test 27 : store conversion consent mapped through integrations object', feature: 'processor', module: 'destination', version: 'v0', @@ -5452,177 +5436,55 @@ export const data = [ quantity: 123, }, integrations: { - All: true, - }, - name: 'ApplicationLoaded', - sentAt: '2019-10-14T11:15:53.296Z', - }, - metadata: { - secret: { - access_token: 'abcd1234', - refresh_token: 'efgh5678', - developer_token: 'ijkl91011', - }, - }, - destination: { - Config: { - isCustomerAllowed: false, - customerId: '111-222-3333', - subAccount: true, - loginCustomerId: 'login-customer-id', - userDataConsent: 'GRANTED', - personalizationConsent: 'DENIED', - eventsToOfflineConversionsTypeMapping: [ - { - from: 'Product Clicked', - to: 'store', - }, - ], - eventsToConversionsNamesMapping: [ - { - from: 'Product Clicked', - to: 'Sign-up - click', - }, - ], - hashUserIdentifier: true, - defaultUserIdentifier: 'phone', - validateOnly: false, - rudderAccountId: '2EOknn1JNH7WK1MfNkgr4t3u4fGYKkRK', - }, - }, - }, - ], - }, - }, - output: { - response: { - status: 200, - body: [ - { - output: { - version: '1', - type: 'REST', - method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', - headers: { - Authorization: 'Bearer abcd1234', - 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', - 'login-customer-id': 'logincustomerid', - }, - params: { - event: 'Sign-up - click', - customerId: '1112223333', - }, - body: { - JSON: { - event: '1112223333', - isStoreConversion: true, - createJobPayload: { - job: { - type: 'STORE_SALES_UPLOAD_FIRST_PARTY', - storeSalesMetadata: { - loyaltyFraction: '1', - transaction_upload_fraction: '1', + GOOGLE_ADWORDS_OFFLINE_CONVERSIONS: { + consents: { + adUserData: 'GRANTED', + adPersonalization: 'DENIED', + All: true, + }, + name: 'ApplicationLoaded', + sentAt: '2019-10-14T11:15:53.296Z', + }, + metadata: { + secret: { + access_token: secret1, + refresh_token: 'efgh5678', + developer_token: secret3, + }, + }, + destination: { + Config: { + isCustomerAllowed: false, + customerId: '111-222-3333', + subAccount: true, + loginCustomerId: 'login-customer-id', + userDataConsent: 'GRANTED', + personalizationConsent: 'DENIED', + eventsToOfflineConversionsTypeMapping: [ + { + from: 'Product Clicked', + to: 'store', }, - }, - }, - addConversionPayload: { - operations: { - create: { - consent: { - adPersonalization: 'DENIED', - adUserData: 'GRANTED', - }, - transaction_attribute: { - store_attribute: { - store_code: 'store code', - }, - transaction_amount_micros: '100000000', - currency_code: 'INR', - transaction_date_time: '2019-10-14 16:45:18+05:30', - }, - userIdentifiers: [{}], + ], + eventsToConversionsNamesMapping: [ + { + from: 'Product Clicked', + to: 'Sign-up - click', }, - }, - enable_partial_failure: false, - enable_warnings: false, - validate_only: false, - }, - executeJobPayload: { - validate_only: false, + ], + hashUserIdentifier: true, + defaultUserIdentifier: 'phone', + validateOnly: false, + rudderAccountId: '2EOknn1JNH7WK1MfNkgr4t3u4fGYKkRK', }, }, - JSON_ARRAY: {}, - XML: {}, - FORM: {}, }, - files: {}, - userId: '', }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', - }, - }, - statusCode: 200, - }, - ], - }, - }, - mockFns: timestampMock, - }, - { - name: 'google_adwords_offline_conversions', - description: - 'Test 27 : store conversion consent mapped from UI config even though integration object is present', - feature: 'processor', - module: 'destination', - version: 'v0', - input: { - request: { - body: [ - { - message: { - channel: 'web', - context: { - traits: {}, - }, - event: 'Product Clicked', - type: 'track', - messageId: '5e10d13a-bf9a-44bf-b884-43a9e591ea71', - anonymousId: '00000000000000000000000000', - userId: '12345', - properties: { - item_id: 'item id', - merchant_id: 'merchant id', - currency: 'INR', - revenue: '100', - store_code: 'store code', - gclid: 'gclid', - conversionDateTime: '2019-10-14T11:15:18.299Z', - product_id: '123445', - quantity: 123, - }, - integrations: { - google_adwords_offline_conversion: { - consent: { - adUserdata: 'UNSPECIFIED', - adPersonalization: 'GRANTED', - }, - }, - }, - name: 'ApplicationLoaded', - sentAt: '2019-10-14T11:15:53.296Z', - }, - metadata: { - secret: { - access_token: 'abcd1234', - refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -5631,8 +5493,6 @@ export const data = [ customerId: '111-222-3333', subAccount: true, loginCustomerId: 'login-customer-id', - userDataConsent: 'GRANTED', - personalizationConsent: 'DENIED', eventsToOfflineConversionsTypeMapping: [ { from: 'Product Clicked', @@ -5664,12 +5524,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/1112223333/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1112223333/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, 'login-customer-id': 'logincustomerid', }, params: { @@ -5724,9 +5583,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, statusCode: 200, @@ -5834,9 +5693,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, }, destination: { @@ -5909,8 +5768,116 @@ export const data = [ error: "You can't use both wbraid and gbraid.", metadata: { secret: { - access_token: 'abcd1234', - developer_token: 'ijkl91011', + access_token: secret1, + developer_token: secret3, + refresh_token: 'efgh5678', + }, + }, + statTags: { + destType: 'GOOGLE_ADWORDS_OFFLINE_CONVERSIONS', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + mockFns: timestampMock, + }, + { + name: 'google_adwords_offline_conversions', + description: 'Test 29 : store conversion which has value less than 0, should throw error', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + traits: {}, + }, + event: 'Product Clicked', + type: 'track', + messageId: '5e10d13a-bf9a-44bf-b884-43a9e591ea71', + anonymousId: '00000000000000000000000000', + userId: '12345', + properties: { + item_id: 'item id', + merchant_id: 'merchant id', + currency: 'INR', + revenue: '0', + store_code: 'store code', + gclid: 'gclid', + conversionDateTime: '2019-10-14T11:15:18.299Z', + product_id: '123445', + quantity: 123, + }, + integrations: { + google_adwords_offline_conversion: { + consent: { + adUserdata: 'UNSPECIFIED', + adPersonalization: 'GRANTED', + }, + }, + }, + name: 'ApplicationLoaded', + sentAt: '2019-10-14T11:15:53.296Z', + }, + metadata: { + secret: { + access_token: secret1, + refresh_token: 'efgh5678', + developer_token: secret3, + }, + }, + destination: { + Config: { + isCustomerAllowed: false, + customerId: '111-222-3333', + subAccount: true, + loginCustomerId: 'login-customer-id', + userDataConsent: 'GRANTED', + personalizationConsent: 'DENIED', + eventsToOfflineConversionsTypeMapping: [ + { + from: 'Product Clicked', + to: 'store', + }, + ], + eventsToConversionsNamesMapping: [ + { + from: 'Product Clicked', + to: 'Sign-up - click', + }, + ], + hashUserIdentifier: true, + defaultUserIdentifier: 'phone', + validateOnly: false, + rudderAccountId: '2EOknn1JNH7WK1MfNkgr4t3u4fGYKkRK', + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + error: + "The value '0' does not match the regex pattern, ^([1-9]\\d*(\\.\\d+)?|0\\.\\d+)$", + metadata: { + secret: { + access_token: secret1, + developer_token: secret3, refresh_token: 'efgh5678', }, }, diff --git a/test/integrations/destinations/google_adwords_offline_conversions/router/data.ts b/test/integrations/destinations/google_adwords_offline_conversions/router/data.ts index bcc718485b3..e984ee55784 100644 --- a/test/integrations/destinations/google_adwords_offline_conversions/router/data.ts +++ b/test/integrations/destinations/google_adwords_offline_conversions/router/data.ts @@ -1,5 +1,8 @@ +import { authHeader1, secret1, secret3 } from '../maskedSecrets'; import { timestampMock } from '../mocks'; +const API_VERSION = 'v18'; + export const data = [ { name: 'google_adwords_offline_conversions', @@ -92,9 +95,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 1, userId: 'u1', @@ -208,9 +211,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 2, userId: 'u1', @@ -272,9 +275,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 3, userId: 'u1', @@ -347,9 +350,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 4, userId: 'u1', @@ -422,9 +425,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 5, userId: 'u1', @@ -483,12 +486,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/7693729833/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'Store sales', customerId: '7693729833' }, body: { @@ -565,12 +567,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/7693729833:uploadCallConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833:uploadCallConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'Order Completed', @@ -617,18 +618,18 @@ export const data = [ metadata: [ { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 3, userId: 'u1', }, { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 4, userId: 'u1', @@ -680,12 +681,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadClickConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadClickConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'Sign-up - click', @@ -772,9 +772,9 @@ export const data = [ metadata: [ { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 1, userId: 'u1', @@ -815,12 +815,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/9625812972:uploadCallConversions', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/9625812972:uploadCallConversions`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'search', @@ -887,9 +886,9 @@ export const data = [ metadata: [ { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 2, userId: 'u1', @@ -929,9 +928,9 @@ export const data = [ metadata: [ { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 5, userId: 'u1', @@ -1117,9 +1116,9 @@ export const data = [ }, metadata: { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 1, userId: 'u1', @@ -1169,12 +1168,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: - 'https://googleads.googleapis.com/v16/customers/1234556775/offlineUserDataJobs', + endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/1234556775/offlineUserDataJobs`, headers: { - Authorization: 'Bearer abcd1234', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'developer-token': 'ijkl91011', + 'developer-token': secret3, }, params: { event: 'Store sales', customerId: '1234556775' }, body: { @@ -1228,9 +1226,9 @@ export const data = [ metadata: [ { secret: { - access_token: 'abcd1234', + access_token: secret1, refresh_token: 'efgh5678', - developer_token: 'ijkl91011', + developer_token: secret3, }, jobId: 1, userId: 'u1', diff --git a/test/integrations/destinations/google_adwords_remarketing_lists/dataDelivery/business.ts b/test/integrations/destinations/google_adwords_remarketing_lists/dataDelivery/business.ts index 9fea895a9f9..71cae86521d 100644 --- a/test/integrations/destinations/google_adwords_remarketing_lists/dataDelivery/business.ts +++ b/test/integrations/destinations/google_adwords_remarketing_lists/dataDelivery/business.ts @@ -1,13 +1,14 @@ +import { authHeader1, secret3 } from '../maskedSecrets'; import { generateGoogleOAuthMetadata, generateProxyV0Payload, generateProxyV1Payload, } from '../../../testUtils'; -import { API_VERSION } from '../../../../../src/v0/destinations/google_adwords_remarketing_lists/config'; +const API_VERSION = 'v18'; export const commonHeaders = { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }; @@ -414,7 +415,7 @@ export const testScenariosForV1API = [ dontBatch: false, jobId: 1, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', diff --git a/test/integrations/destinations/google_adwords_remarketing_lists/dataDelivery/oauth.ts b/test/integrations/destinations/google_adwords_remarketing_lists/dataDelivery/oauth.ts index e8a1cfc07e1..297ee8b9cf0 100644 --- a/test/integrations/destinations/google_adwords_remarketing_lists/dataDelivery/oauth.ts +++ b/test/integrations/destinations/google_adwords_remarketing_lists/dataDelivery/oauth.ts @@ -1,6 +1,8 @@ +import { authHeader2, secret2, secret1 } from '../maskedSecrets'; import { generateMetadata, generateProxyV1Payload } from '../../../testUtils'; import { commonHeaders, commonParams, validRequestPayload1 } from './business'; -import { API_VERSION } from '../../../../../src/v0/destinations/google_adwords_remarketing_lists/config'; + +const API_VERSION = 'v18'; const commonStatTags = { destType: 'GOOGLE_ADWORDS_REMARKETING_LISTS', @@ -31,7 +33,7 @@ export const oauthError = [ params: commonParams, JSON: validRequestPayload1, endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/customerid/offlineUserDataJobs`, - accessToken: 'dummy-access', + accessToken: secret1, }), method: 'POST', }, @@ -54,7 +56,7 @@ export const oauthError = [ dontBatch: false, jobId: 1, secret: { - accessToken: 'dummy-access', + accessToken: secret1, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -82,11 +84,11 @@ export const oauthError = [ input: { request: { body: generateProxyV1Payload({ - headers: { ...commonHeaders, Authorization: 'Bearer wrongCustomerID' }, - params: { ...commonParams, customerId: 'wrongCustomerID' }, + headers: { ...commonHeaders, Authorization: authHeader2 }, + params: { ...commonParams, customerId: secret2 }, JSON: validRequestPayload1, endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/customerid/offlineUserDataJobs`, - accessToken: 'wrongCustomerID', + accessToken: secret2, }), method: 'POST', }, @@ -103,7 +105,7 @@ export const oauthError = [ { error: '{"error":{"code":401,"message":"Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.","status":"UNAUTHENTICATED","details":[{"@type":"type.googleapis.com/google.ads.googleads.v16.errors.GoogleAdsFailure","errors":[{"errorCode":{"authenticationError":"CUSTOMER_NOT_FOUND"},"message":"No customer found for the provided customer id."}],"requestId":"lvB3KOjGHsgduHjt0wCglQ"}]}} during ga_audience response transformation', - metadata: { ...generateMetadata(1), secret: { accessToken: 'wrongCustomerID' } }, + metadata: { ...generateMetadata(1), secret: { accessToken: secret2 } }, statusCode: 401, }, ], diff --git a/test/integrations/destinations/google_adwords_remarketing_lists/maskedSecrets.ts b/test/integrations/destinations/google_adwords_remarketing_lists/maskedSecrets.ts new file mode 100644 index 00000000000..1ee175e1cb9 --- /dev/null +++ b/test/integrations/destinations/google_adwords_remarketing_lists/maskedSecrets.ts @@ -0,0 +1,10 @@ +import path from 'path'; + +import { defaultAccessToken } from '../../common/secrets'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = defaultAccessToken; +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; +export const authHeader3 = `Bearer ${secret3}`; diff --git a/test/integrations/destinations/google_adwords_remarketing_lists/network.ts b/test/integrations/destinations/google_adwords_remarketing_lists/network.ts index a367c18737c..a979bd0b6e0 100644 --- a/test/integrations/destinations/google_adwords_remarketing_lists/network.ts +++ b/test/integrations/destinations/google_adwords_remarketing_lists/network.ts @@ -1,4 +1,5 @@ -import { API_VERSION } from '../../../../src/v0/destinations/google_adwords_remarketing_lists/config'; +import { authHeader1, authHeader2, secret2 } from './maskedSecrets'; +const API_VERSION = 'v18'; export const networkCallsData = [ { @@ -14,7 +15,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -58,7 +59,7 @@ export const networkCallsData = [ ], }, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -73,7 +74,7 @@ export const networkCallsData = [ httpReq: { url: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs/18025019461:run`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -96,7 +97,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -117,7 +118,7 @@ export const networkCallsData = [ operations: [{ create: { userIdentifiers: [{ hashedEmail: 'abcd@testmail.com' }] } }], }, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -196,7 +197,7 @@ export const networkCallsData = [ ], }, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -223,7 +224,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -248,7 +249,7 @@ export const networkCallsData = [ job: { type: 'CUSTOMER_MATCH_USER_LIST', customerMatchUserListMetadata: { - userList: 'customers/wrongCustomerID/userLists/709078448', + userList: `customers/${secret2}/userLists/709078448`, consent: { adPersonalization: 'UNSPECIFIED', adUserData: 'UNSPECIFIED', @@ -257,7 +258,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Bearer wrongCustomerID', + Authorization: authHeader2, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -305,7 +306,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, diff --git a/test/integrations/destinations/google_adwords_remarketing_lists/processor/data.ts b/test/integrations/destinations/google_adwords_remarketing_lists/processor/data.ts index 4398bc14e16..c819e7ef106 100644 --- a/test/integrations/destinations/google_adwords_remarketing_lists/processor/data.ts +++ b/test/integrations/destinations/google_adwords_remarketing_lists/processor/data.ts @@ -1,4 +1,6 @@ -import { API_VERSION } from '../../../../../src/v0/destinations/google_adwords_remarketing_lists/config'; +import { authHeader1, secret1 } from '../maskedSecrets'; +const API_VERSION = 'v18'; + export const data = [ { name: 'google_adwords_remarketing_lists', @@ -12,7 +14,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -72,7 +74,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -120,7 +122,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -143,7 +145,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -204,7 +206,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', 'login-customer-id': '8704830944', @@ -238,7 +240,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -261,7 +263,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -323,7 +325,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -356,7 +358,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -379,7 +381,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -454,7 +456,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -487,7 +489,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -544,7 +546,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -577,7 +579,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -633,7 +635,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -665,7 +667,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -709,7 +711,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -741,7 +743,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -805,7 +807,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -837,7 +839,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -1424,7 +1426,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -2709,7 +2711,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -2732,7 +2734,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -2818,7 +2820,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -2883,7 +2885,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -2897,7 +2899,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -2962,7 +2964,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -2985,7 +2987,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -4109,7 +4111,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -5394,7 +5396,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -5408,7 +5410,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -6693,7 +6695,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -6716,7 +6718,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -6784,7 +6786,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -6849,7 +6851,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -6872,7 +6874,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -6936,7 +6938,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -6969,7 +6971,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -8093,7 +8095,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -9378,7 +9380,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -9392,7 +9394,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -10677,7 +10679,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -10700,7 +10702,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -10786,7 +10788,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -10851,7 +10853,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -10865,7 +10867,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -10930,7 +10932,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -10953,7 +10955,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11039,7 +11041,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -11102,7 +11104,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11116,7 +11118,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -11176,7 +11178,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11199,7 +11201,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11259,7 +11261,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -11301,7 +11303,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11404,7 +11406,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11464,7 +11466,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -11506,7 +11508,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11529,7 +11531,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11602,7 +11604,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -11643,7 +11645,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11666,7 +11668,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11739,7 +11741,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -11780,7 +11782,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11803,7 +11805,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11878,7 +11880,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -11922,7 +11924,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -11945,7 +11947,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, @@ -12020,7 +12022,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer dummy-access', + Authorization: authHeader1, 'Content-Type': 'application/json', 'developer-token': 'dummy-dev-token', }, @@ -12061,7 +12063,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummy-access', + access_token: secret1, refresh_token: 'dummy-refresh', developer_token: 'dummy-dev-token', }, diff --git a/test/integrations/destinations/google_adwords_remarketing_lists/router/data.ts b/test/integrations/destinations/google_adwords_remarketing_lists/router/data.ts index 12d5c65f8f1..0c64eab9513 100644 --- a/test/integrations/destinations/google_adwords_remarketing_lists/router/data.ts +++ b/test/integrations/destinations/google_adwords_remarketing_lists/router/data.ts @@ -1,10 +1,12 @@ +import { authHeader3, secret3 } from '../maskedSecrets'; import { rETLAudienceRouterRequest } from './audience'; import { rETLRecordRouterRequest, rETLRecordRouterRequestVDMv2General, rETLRecordRouterRequestVDMv2UserId, } from './record'; -import { API_VERSION } from '../../../../../src/v0/destinations/google_adwords_remarketing_lists/config'; + +const API_VERSION = 'v18'; export const data = [ { @@ -32,7 +34,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: { @@ -83,7 +85,7 @@ export const data = [ destinationId: 'default-destinationId', dontBatch: false, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -127,7 +129,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: { @@ -178,7 +180,7 @@ export const data = [ destinationId: 'default-destinationId', dontBatch: false, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -222,7 +224,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: { @@ -272,7 +274,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: { @@ -323,7 +325,7 @@ export const data = [ destinationId: 'default-destinationId', dontBatch: false, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -389,7 +391,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: { @@ -442,7 +444,7 @@ export const data = [ destinationId: 'default-destinationId', dontBatch: false, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -486,7 +488,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: { @@ -557,7 +559,7 @@ export const data = [ destinationId: 'default-destinationId', dontBatch: false, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -570,7 +572,7 @@ export const data = [ dontBatch: false, jobId: 3, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -613,7 +615,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: { @@ -666,7 +668,7 @@ export const data = [ destinationId: 'default-destinationId', dontBatch: false, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -709,7 +711,7 @@ export const data = [ destinationId: 'default-destinationId', dontBatch: false, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -761,7 +763,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: { @@ -814,7 +816,7 @@ export const data = [ destinationId: 'default-destinationId', dontBatch: false, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -877,7 +879,7 @@ export const data = [ method: 'POST', endpoint: `https://googleads.googleapis.com/${API_VERSION}/customers/7693729833/offlineUserDataJobs`, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: { @@ -915,7 +917,7 @@ export const data = [ destinationId: 'default-destinationId', dontBatch: false, secret: { - access_token: 'default-accessToken', + access_token: secret3, }, sourceId: 'default-sourceId', userId: 'default-userId', diff --git a/test/integrations/destinations/hs/dataDelivery/business.ts b/test/integrations/destinations/hs/dataDelivery/business.ts index 2239abfb951..44748de0a10 100644 --- a/test/integrations/destinations/hs/dataDelivery/business.ts +++ b/test/integrations/destinations/hs/dataDelivery/business.ts @@ -1,3 +1,4 @@ +import { authHeader1, authHeader2 } from '../maskedSecrets'; import { generateMetadata, generateProxyV1Payload } from '../../../testUtils'; const commonStatTags = { @@ -24,11 +25,32 @@ export const businessData = [ { endpoint: 'https://api.hubapi.com/contacts/v1/contact/batch/', JSON_ARRAY: { - batch: - '[{"email":"identify111051@test.com","properties":[{"property":"firstname","value":"John1051"},{"property":"lastname","value":"Sparrow1051"}]},{"email":"identify111052@test.com","properties":[{"property":"firstname","value":"John1052"},{"property":"lastname","value":"Sparrow1052"}]},{"email":"identify111053@test.com","properties":[{"property":"firstname","value":"John1053"},{"property":"lastname","value":"Sparrow1053"}]}]', + batch: JSON.stringify([ + { + email: 'identify111051@test.com', + properties: [ + { property: 'firstname', value: 'John1051' }, + { property: 'lastname', value: 'Sparrow1051' }, + ], + }, + { + email: 'identify111052@test.com', + properties: [ + { property: 'firstname', value: 'John1052' }, + { property: 'lastname', value: 'Sparrow1052' }, + ], + }, + { + email: 'identify111053@test.com', + properties: [ + { property: 'firstname', value: 'John1053' }, + { property: 'lastname', value: 'Sparrow1053' }, + ], + }, + ]), }, headers: { - Authorization: 'Bearer validApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, }, @@ -76,11 +98,32 @@ export const businessData = [ { endpoint: 'https://api.hubapi.com/contacts/v1/contact/batch/', JSON_ARRAY: { - batch: - '[{"email":"identify111051@test.com","properties":[{"property":"firstname","value":"John1051"},{"property":"lastname","value":"Sparrow1051"}]},{"email":"identify111052@test.con","properties":[{"property":"firstname","value":"John1052"},{"property":"lastname","value":"Sparrow1052"}]},{"email":"identify111053@test.com","properties":[{"property":"firstname","value":"John1053"},{"property":"lastname","value":"Sparrow1053"}]}]', + batch: JSON.stringify([ + { + email: 'identify111051@test.com', + properties: [ + { property: 'firstname', value: 'John1051' }, + { property: 'lastname', value: 'Sparrow1051' }, + ], + }, + { + email: 'identify111052@test.con', + properties: [ + { property: 'firstname', value: 'John1052' }, + { property: 'lastname', value: 'Sparrow1052' }, + ], + }, + { + email: 'identify111053@test.com', + properties: [ + { property: 'firstname', value: 'John1053' }, + { property: 'lastname', value: 'Sparrow1053' }, + ], + }, + ]), }, headers: { - Authorization: 'Bearer inValidApiKey', + Authorization: authHeader2, 'Content-Type': 'application/json', }, }, @@ -181,7 +224,7 @@ export const businessData = [ { headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer validAccessToken', + Authorization: authHeader1, }, method: 'POST', endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts/batch/create', @@ -460,7 +503,7 @@ export const businessData = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, JSON: { email: 'osvaldocostaferreira98@gmail.com', @@ -508,7 +551,7 @@ export const businessData = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer invalid-dummy-access-token', + Authorization: authHeader2, }, JSON: { email: 'osvaldocostaferreira98@gmail.com', @@ -560,7 +603,7 @@ export const businessData = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, JSON: { inputs: [{ to: { id: 1 }, from: { id: 9405415215 }, type: 'contact_to_company' }], diff --git a/test/integrations/destinations/hs/dataDelivery/other.ts b/test/integrations/destinations/hs/dataDelivery/other.ts index 202b665a51e..0aab89465d6 100644 --- a/test/integrations/destinations/hs/dataDelivery/other.ts +++ b/test/integrations/destinations/hs/dataDelivery/other.ts @@ -1,4 +1,5 @@ import { generateMetadata } from '../../../testUtils'; +import { authHeader1 } from '../maskedSecrets'; const commonStatTags = { destType: 'HS', @@ -17,7 +18,7 @@ const commonBody = { method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, }, params: {}, files: {}, @@ -188,7 +189,7 @@ export const otherData = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, }, params: {}, files: {}, diff --git a/test/integrations/destinations/hs/maskedSecrets.ts b/test/integrations/destinations/hs/maskedSecrets.ts new file mode 100644 index 00000000000..935d0e6d37e --- /dev/null +++ b/test/integrations/destinations/hs/maskedSecrets.ts @@ -0,0 +1,10 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const secret4 = path.basename(__dirname) + 4; +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; +export const authHeader3 = `Bearer ${secret3}`; +export const authHeader4 = `Bearer ${secret4}`; diff --git a/test/integrations/destinations/hs/network.ts b/test/integrations/destinations/hs/network.ts index 9d8658ff6b0..1b3658dc254 100644 --- a/test/integrations/destinations/hs/network.ts +++ b/test/integrations/destinations/hs/network.ts @@ -1,3 +1,4 @@ +import { authHeader1, authHeader2, authHeader3, authHeader4 } from './maskedSecrets'; export const networkCallsData = [ { httpReq: { @@ -424,7 +425,7 @@ export const networkCallsData = [ url: 'https://api.hubapi.com/crm/v3/objects/contacts/search', method: 'POST', headers: { - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, }, httpRes: { @@ -436,7 +437,7 @@ export const networkCallsData = [ url: 'https://api.hubapi.com/crm/v3/objects/contacts/search', method: 'POST', headers: { - Authorization: 'Bearer dummy-access-tokensuccess', + Authorization: authHeader2, }, }, httpRes: { @@ -466,7 +467,7 @@ export const networkCallsData = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token-hs-additonal-email', + Authorization: authHeader3, }, }, httpRes: { @@ -496,7 +497,7 @@ export const networkCallsData = [ url: 'https://api.hubapi.com/crm/v3/objects/contacts/search', method: 'POST', headers: { - Authorization: 'Bearer dummy-access-tokenmultiple', + Authorization: authHeader4, }, }, httpRes: { @@ -865,7 +866,7 @@ export const networkCallsData = [ url: 'https://api.hubapi.com/crm/v3/objects/contacts/search', method: 'POST', headers: { - Authorization: 'Bearer dontbatchtrueaccesstoken', + Authorization: authHeader1, }, }, httpRes: { @@ -883,7 +884,7 @@ export const networkCallsData = [ headers: { 'User-Agent': 'RudderLabs', 'Content-Type': 'application/json', - Authorization: 'Bearer validApiKey', + Authorization: authHeader1, }, }, httpRes: { @@ -897,7 +898,7 @@ export const networkCallsData = [ headers: { 'User-Agent': 'RudderLabs', 'Content-Type': 'application/json', - Authorization: 'Bearer inValidApiKey', + Authorization: authHeader2, }, }, httpRes: { @@ -942,7 +943,7 @@ export const networkCallsData = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer validAccessToken', + Authorization: authHeader1, }, }, httpRes: { @@ -1010,7 +1011,7 @@ export const networkCallsData = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, }, httpRes: { @@ -1024,7 +1025,7 @@ export const networkCallsData = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer invalid-dummy-access-token', + Authorization: authHeader2, }, }, httpRes: { @@ -1044,7 +1045,7 @@ export const networkCallsData = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, }, httpRes: { diff --git a/test/integrations/destinations/hs/processor/data.ts b/test/integrations/destinations/hs/processor/data.ts index f503ae92acc..b80a81ad5c4 100644 --- a/test/integrations/destinations/hs/processor/data.ts +++ b/test/integrations/destinations/hs/processor/data.ts @@ -1,15 +1,16 @@ +import { authHeader1, secret1, authHeader2, secret2, secret3, secret4 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { generateMetadata, generateSimplifiedIdentifyPayload } from '../../../testUtils'; const commonOutputHeaders = { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }; const destination: Destination = { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1356,7 +1357,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', hubspotEvents: [], @@ -1392,7 +1393,7 @@ export const data = [ source: 'rETL', operation: 'createObject', headers: { - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1488,7 +1489,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', hubspotEvents: [], @@ -1524,7 +1525,7 @@ export const data = [ source: 'rETL', operation: 'updateObject', headers: { - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1917,7 +1918,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: 'dummy-hubId', apiKey: 'dummy-apikey', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'legacyApi', lookupField: '', blacklistedEvents: [ @@ -1951,7 +1952,7 @@ export const data = [ 'https://api.hubapi.com/contacts/v1/contact/createOrUpdate/email/testhubspot2@email.com', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -2042,7 +2043,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-tokensuccess', + accessToken: secret2, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -2075,11 +2076,11 @@ export const data = [ version: '1', type: 'REST', userId: '', - method: 'POST', + method: 'PATCH', endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts/103604', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-tokensuccess', + Authorization: authHeader2, }, params: {}, operation: 'updateContacts', @@ -2165,7 +2166,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -2202,7 +2203,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, operation: 'createContacts', @@ -2287,7 +2288,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-tokenmultiple', + accessToken: secret4, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -2391,7 +2392,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '1', apiKey: '1', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', hubspotEvents: [ @@ -2455,7 +2456,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/events/v3/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -2814,7 +2815,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', hubspotEvents: [ @@ -2913,7 +2914,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', hubspotEvents: [ @@ -2977,7 +2978,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -3030,7 +3031,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', hubspotEvents: [ @@ -3094,7 +3095,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -3142,7 +3143,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', hubspotEvents: [ @@ -3247,7 +3248,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', hubspotEvents: [ @@ -3310,7 +3311,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/events/v3/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -3887,7 +3888,7 @@ export const data = [ destination: { Config: { authorizationType: 'legacyApiKey', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikeysuccess', apiVersion: 'newApi', @@ -3980,7 +3981,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', hubspotEvents: [ @@ -4180,7 +4181,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', hubspotEvents: [ @@ -4533,7 +4534,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'legacyApi', lookupField: 'lookupField', hubspotEvents: [ @@ -4663,7 +4664,7 @@ export const data = [ apiKey: 'dummy-apikey', hubID: 'dummy-hubId', authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'legacyApi', }, Enabled: true, @@ -4685,7 +4686,7 @@ export const data = [ endpoint: 'https://track.hubspot.com/v1/event', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: { _a: 'dummy-hubId', @@ -5269,7 +5270,7 @@ export const data = [ authorizationType: 'newPrivateAppApi', hubID: '', apiKey: '', - accessToken: 'dummy-access-token', + accessToken: secret1, apiVersion: 'newApi', lookupField: 'lookupField', eventFilteringOption: 'disable', @@ -5425,4 +5426,86 @@ export const data = [ }, }, }, + { + name: 'hs', + description: + '[HS] (New API v3) - throw error if invalid email is provided in traits for identify call', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + description: + '[HS] (New API v3) - throw error if invalid email is provided in traits for identify call', + message: { + channel: 'web', + context: { + traits: { + email: 'incorrect-email', + firstname: 'Test Hubspot', + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, + }, + type: 'identify', + messageId: 'e8585d9a-7137-4223-b295-68ab1b17dad7', + originalTimestamp: '2025-01-01T09:35:31.289Z', + anonymousId: '00000000000000000000000000', + userId: '12345', + properties: '', + integrations: { + All: true, + }, + sentAt: '2019-10-14T11:15:53.296Z', + }, + destination: { + Config: { + authorizationType: 'newPrivateAppApi', + hubID: '', + apiKey: '', + accessToken: secret1, + apiVersion: 'newApi', + lookupField: 'lookupField', + eventFilteringOption: 'disable', + blacklistedEvents: [ + { + eventName: '', + }, + ], + whitelistedEvents: [ + { + eventName: '', + }, + ], + }, + Enabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Email "incorrect-email" is invalid', + statTags: { + destType: 'HS', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, ]; diff --git a/test/integrations/destinations/hs/router/config.ts b/test/integrations/destinations/hs/router/config.ts index 89a0c13d1a8..6d14fd80e32 100644 --- a/test/integrations/destinations/hs/router/config.ts +++ b/test/integrations/destinations/hs/router/config.ts @@ -1,6 +1,7 @@ +import { secret1 } from '../maskedSecrets'; export const destination = { Config: { - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', authorizationType: 'newPrivateAppApi', apiVersion: 'newApi', diff --git a/test/integrations/destinations/hs/router/data.ts b/test/integrations/destinations/hs/router/data.ts index 2f0879528bf..c72393de790 100644 --- a/test/integrations/destinations/hs/router/data.ts +++ b/test/integrations/destinations/hs/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, authHeader2, authHeader3, secret3, secret2 } from '../maskedSecrets'; import { destination } from './config'; export const data = [ { @@ -15,7 +16,7 @@ export const data = [ ID: '123', Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'pat-123', + accessToken: secret1, apiVersion: 'newApi', }, }, @@ -74,7 +75,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.hubapi.com/crm/v3/associations/companies/contacts/batch/create', - headers: { 'Content-Type': 'application/json', Authorization: 'Bearer pat-123' }, + headers: { 'Content-Type': 'application/json', Authorization: authHeader1 }, params: {}, body: { JSON: { inputs: [{ to: { id: 1 }, from: { id: 9405415215 }, type: 'engineer' }] }, @@ -91,7 +92,7 @@ export const data = [ ID: '123', Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'pat-123', + accessToken: secret1, apiVersion: 'newApi', }, }, @@ -572,8 +573,12 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"email":"testhubspot1@email.com","properties":[{"property":"firstname","value":"Test Hubspot1"}]}]', + batch: JSON.stringify([ + { + email: 'testhubspot1@email.com', + properties: [{ property: 'firstname', value: 'Test Hubspot1' }], + }, + ]), }, XML: {}, FORM: {}, @@ -657,8 +662,12 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"email":"testhubspot3@email.com","properties":[{"property":"firstname","value":"Test Hubspot3"}]}]', + batch: JSON.stringify([ + { + email: 'testhubspot3@email.com', + properties: [{ property: 'firstname', value: 'Test Hubspot3' }], + }, + ]), }, XML: {}, FORM: {}, @@ -701,8 +710,12 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"email":"testhubspot4@email.com","properties":[{"property":"firstname","value":"Test Hubspot4"}]}]', + batch: JSON.stringify([ + { + email: 'testhubspot4@email.com', + properties: [{ property: 'firstname', value: 'Test Hubspot4' }], + }, + ]), }, XML: {}, FORM: {}, @@ -778,7 +791,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -855,7 +868,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -943,7 +956,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1010,7 +1023,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/lead/batch/create', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -1052,7 +1065,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1107,7 +1120,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/lead/batch/update', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -1135,7 +1148,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1233,7 +1246,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1316,7 +1329,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1399,7 +1412,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1482,7 +1495,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1549,7 +1562,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1615,7 +1628,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts/batch/create', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -1644,7 +1657,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1699,7 +1712,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/events/v3/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -1720,7 +1733,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token', + accessToken: secret1, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1811,7 +1824,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token-hs-additonal-email', + accessToken: secret3, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1857,7 +1870,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts/batch/update', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token-hs-additonal-email', + Authorization: authHeader3, }, params: {}, body: { @@ -1881,7 +1894,7 @@ export const data = [ destination: { Config: { authorizationType: 'newPrivateAppApi', - accessToken: 'dummy-access-token-hs-additonal-email', + accessToken: secret3, hubID: 'dummy-hubId', apiKey: 'dummy-apikey', apiVersion: 'newApi', @@ -1961,7 +1974,7 @@ export const data = [ ID: '2RnSBhn4zPTOF8NdqAIrnVPPnfr', Name: 'hs-1', Config: { - accessToken: 'dontbatchtrueaccesstoken', + accessToken: secret1, apiKey: '', apiVersion: 'newApi', authorizationType: 'newPrivateAppApi', @@ -2037,7 +2050,7 @@ export const data = [ ID: '2RnSBhn4zPTOF8NdqAIrnVPPnfr', Name: 'hs-1', Config: { - accessToken: 'dontbatchtrueaccesstoken', + accessToken: secret1, apiKey: '', apiVersion: 'newApi', authorizationType: 'newPrivateAppApi', @@ -2111,7 +2124,7 @@ export const data = [ ID: '2RnSBhn4zPTOF8NdqAIrnVPPnfr', Name: 'hs-1', Config: { - accessToken: 'dontbatchtrueaccesstoken', + accessToken: secret1, apiKey: '', apiVersion: 'newApi', authorizationType: 'newPrivateAppApi', @@ -2186,7 +2199,7 @@ export const data = [ ID: '2RnSBhn4zPTOF8NdqAIrnVPPnfr', Name: 'hs-1', Config: { - accessToken: 'dontbatchtrueaccesstoken', + accessToken: secret1, apiKey: '', apiVersion: 'newApi', authorizationType: 'newPrivateAppApi', @@ -2269,7 +2282,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts/batch/create', files: {}, headers: { - Authorization: 'Bearer dontbatchtrueaccesstoken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -2279,7 +2292,7 @@ export const data = [ }, destination: { Config: { - accessToken: 'dontbatchtrueaccesstoken', + accessToken: secret1, apiKey: '', apiVersion: 'newApi', authorizationType: 'newPrivateAppApi', @@ -2358,7 +2371,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts', files: {}, headers: { - Authorization: 'Bearer dontbatchtrueaccesstoken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -2368,7 +2381,7 @@ export const data = [ }, destination: { Config: { - accessToken: 'dontbatchtrueaccesstoken', + accessToken: secret1, apiKey: '', apiVersion: 'newApi', authorizationType: 'newPrivateAppApi', @@ -2438,7 +2451,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts', files: {}, headers: { - Authorization: 'Bearer dontbatchtrueaccesstoken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -2448,7 +2461,7 @@ export const data = [ }, destination: { Config: { - accessToken: 'dontbatchtrueaccesstoken', + accessToken: secret1, apiKey: '', apiVersion: 'newApi', authorizationType: 'newPrivateAppApi', @@ -2552,7 +2565,7 @@ export const data = [ ID: '2RnSBhn4zPTOF8NdqAIrnVPPnfr', Name: 'hs-1', Config: { - accessToken: 'dontbatchtrueaccesstoken', + accessToken: secret1, apiKey: '', apiVersion: 'newApi', authorizationType: 'newPrivateAppApi', @@ -2627,7 +2640,7 @@ export const data = [ ID: '2RnSBhn4zPTOF8NdqAIrnVPPnfr', Name: 'hs-1', Config: { - accessToken: 'dontbatchtrueaccesstoken', + accessToken: secret1, apiKey: '', apiVersion: 'newApi', authorizationType: 'newPrivateAppApi', @@ -2710,7 +2723,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts/batch/create', files: {}, headers: { - Authorization: 'Bearer dontbatchtrueaccesstoken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -2720,7 +2733,7 @@ export const data = [ }, destination: { Config: { - accessToken: 'dontbatchtrueaccesstoken', + accessToken: secret1, apiKey: '', apiVersion: 'newApi', authorizationType: 'newPrivateAppApi', @@ -3056,7 +3069,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts/batch/create', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -3104,7 +3117,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/events/v3/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -3137,7 +3150,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/events/v3/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -3170,7 +3183,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/events/v3/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -3203,7 +3216,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/events/v3/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -3236,7 +3249,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/events/v3/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -3269,7 +3282,7 @@ export const data = [ endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts/batch/create', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy-access-token', + Authorization: authHeader1, }, params: {}, body: { @@ -3480,8 +3493,23 @@ export const data = [ updatedAt: '2021-02-03T16:22:31.374Z', workspaceId: '1TSN08muJTZwH8iCDmnnRt1pmLd', }, - error: - '{"message":"Failed to get hubspot properties: {\\"status\\":\\"error\\",\\"message\\":\\"The API key provided is invalid. View or manage your API key here: https://app.hubspot.com/l/api-key/\\",\\"correlationId\\":\\"4d39ff11-e121-4514-bcd8-132a9dd1ff50\\",\\"category\\":\\"INVALID_AUTHENTICATION\\",\\"links\\":{\\"api key\\":\\"https://app.hubspot.com/l/api-key/\\"}}","destinationResponse":{"response":{"status":"error","message":"The API key provided is invalid. View or manage your API key here: https://app.hubspot.com/l/api-key/","correlationId":"4d39ff11-e121-4514-bcd8-132a9dd1ff50","category":"INVALID_AUTHENTICATION","links":{"api key":"https://app.hubspot.com/l/api-key/"}},"status":401}}', + error: JSON.stringify({ + message: + 'Failed to get hubspot properties: {"status":"error","message":"The API key provided is invalid. View or manage your API key here: https://app.hubspot.com/l/api-key/","correlationId":"4d39ff11-e121-4514-bcd8-132a9dd1ff50","category":"INVALID_AUTHENTICATION","links":{"api key":"https://app.hubspot.com/l/api-key/"}}', + destinationResponse: { + response: { + status: 'error', + message: + 'The API key provided is invalid. View or manage your API key here: https://app.hubspot.com/l/api-key/', + correlationId: '4d39ff11-e121-4514-bcd8-132a9dd1ff50', + category: 'INVALID_AUTHENTICATION', + links: { + 'api key': 'https://app.hubspot.com/l/api-key/', + }, + }, + status: 401, + }, + }), metadata: [ { jobId: 2, @@ -3524,8 +3552,23 @@ export const data = [ updatedAt: '2021-02-03T16:22:31.374Z', workspaceId: '1TSN08muJTZwH8iCDmnnRt1pmLd', }, - error: - '{"message":"Failed to get hubspot properties: {\\"status\\":\\"error\\",\\"message\\":\\"The API key provided is invalid. View or manage your API key here: https://app.hubspot.com/l/api-key/\\",\\"correlationId\\":\\"4d39ff11-e121-4514-bcd8-132a9dd1ff50\\",\\"category\\":\\"INVALID_AUTHENTICATION\\",\\"links\\":{\\"api key\\":\\"https://app.hubspot.com/l/api-key/\\"}}","destinationResponse":{"response":{"status":"error","message":"The API key provided is invalid. View or manage your API key here: https://app.hubspot.com/l/api-key/","correlationId":"4d39ff11-e121-4514-bcd8-132a9dd1ff50","category":"INVALID_AUTHENTICATION","links":{"api key":"https://app.hubspot.com/l/api-key/"}},"status":401}}', + error: JSON.stringify({ + message: + 'Failed to get hubspot properties: {"status":"error","message":"The API key provided is invalid. View or manage your API key here: https://app.hubspot.com/l/api-key/","correlationId":"4d39ff11-e121-4514-bcd8-132a9dd1ff50","category":"INVALID_AUTHENTICATION","links":{"api key":"https://app.hubspot.com/l/api-key/"}}', + destinationResponse: { + response: { + status: 'error', + message: + 'The API key provided is invalid. View or manage your API key here: https://app.hubspot.com/l/api-key/', + correlationId: '4d39ff11-e121-4514-bcd8-132a9dd1ff50', + category: 'INVALID_AUTHENTICATION', + links: { + 'api key': 'https://app.hubspot.com/l/api-key/', + }, + }, + status: 401, + }, + }), metadata: [ { jobId: 3, @@ -3547,4 +3590,321 @@ export const data = [ }, }, }, + { + name: 'hs', + description: 'test when email is of wrong format', + feature: 'router', + module: 'destination', + id: 'emailfailsValidation', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + channel: 'web', + context: { + traits: { + email: 'incorrect-email', + firstname: 'Test Hubspot', + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, + }, + type: 'identify', + messageId: 'e8585d9a-7137-4223-b295-68ab1b17dad7', + originalTimestamp: '2025-01-01T09:35:31.289Z', + anonymousId: '00000000000000000000000000', + userId: '12345', + properties: '', + integrations: { + All: true, + }, + sentAt: '2019-10-14T11:15:53.296Z', + }, + destination: { + Config: { + authorizationType: 'newPrivateAppApi', + hubID: '', + apiKey: '', + accessToken: secret1, + apiVersion: 'newApi', + lookupField: 'lookupField', + eventFilteringOption: 'disable', + blacklistedEvents: [ + { + eventName: '', + }, + ], + whitelistedEvents: [ + { + eventName: '', + }, + ], + }, + Enabled: true, + }, + metadata: { jobId: 3, userId: 'u1' }, + }, + ], + destType: 'hs', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batched: false, + destination: { + Config: { + accessToken: secret1, + apiKey: '', + apiVersion: 'newApi', + authorizationType: 'newPrivateAppApi', + blacklistedEvents: [ + { + eventName: '', + }, + ], + eventFilteringOption: 'disable', + hubID: '', + lookupField: 'lookupField', + whitelistedEvents: [ + { + eventName: '', + }, + ], + }, + Enabled: true, + }, + error: 'Email "incorrect-email" is invalid', + metadata: [ + { + jobId: 3, + userId: 'u1', + }, + ], + statTags: { + destType: 'HS', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'router', + implementation: 'native', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + }, + { + name: 'hs', + description: 'if dontBatch is true we should use patch request method for update for retl flow', + feature: 'router', + module: 'destination', + version: 'v0', + scenario: 'buisness', + id: 'dontbatchtrueid', + successCriteria: + 'should not create a batch with the events if that events contains dontBatch true', + input: { + request: { + body: { + input: [ + { + message: { + type: 'identify', + sentAt: '2024-05-23T16:49:57.461+05:30', + userId: 'identify425@test.com', + channel: 'mobile', + context: { + traits: { + age: '30', + name: 'John Sparrow', + email: 'identify425@test.com', + phone: '9112340425', + lastname: 'Sparrow', + firstname: 'John', + }, + context: { + sources: { + job_id: '2qY238MjR41Cn1pnO5kSK0Metno', + version: 'v1.60.8', + job_run_id: 'cus0gkdes5sukm8iqqh0', + task_run_id: 'cus0gkdes5sukm8iqqig', + }, + externalId: [ + { + id: 'identify425@test.com', + type: 'HS-contacts', + identifierType: 'email', + }, + ], + mappedToDestination: 'true', + }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', + }, + timestamp: '2024-05-23T16:49:57.070+05:30', + receivedAt: '2024-05-23T16:49:57.071+05:30', + anonymousId: '8d872292709c6fbe', + }, + metadata: { + jobId: 1, + sourceId: '2RnN36pc7p5lzoApxZnDfRnYFx0', + destinationId: '2RnSBhn4zPTOF8NdqAIrnVPPnfr', + transformAt: 'router', + workspaceId: '2QapBTEvZYwuf6O9KB5AEvvBt8j', + dontBatch: true, + }, + destination: { + ID: '2RnSBhn4zPTOF8NdqAIrnVPPnfr', + Name: 'hs-1', + Config: { + accessToken: secret2, + apiKey: '', + apiVersion: 'newApi', + authorizationType: 'newPrivateAppApi', + blacklistedEvents: [], + connectionMode: 'cloud', + doAssociation: false, + eventDelivery: false, + eventDeliveryTS: 1687884567403, + eventFilteringOption: 'disable', + hubID: '25092171', + hubspotEvents: [ + { + eventProperties: [ + { + from: 'first_name', + to: 'first_name', + }, + { + from: 'last_name', + to: 'last_name', + }, + ], + hubspotEventName: 'pedummy-hubId_rs_hub_chair', + rsEventName: 'Order Complete', + }, + ], + lookupField: 'email', + useNativeSDK: false, + whitelistedEvents: [], + }, + Enabled: true, + WorkspaceID: '2QapBTEvZYwuf6O9KB5AEvvBt8j', + Transformations: [], + IsProcessorEnabled: true, + RevisionID: '2gqf7Mc7WEwqQtQy3G105O22s3D', + }, + request: { + query: {}, + }, + }, + ], + destType: 'hs', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batched: false, + batchedRequest: { + body: { + FORM: {}, + JSON: { + properties: { + email: 'identify425@test.com', + firstname: 'John', + lastname: 'Sparrow', + phone: '9112340425', + }, + }, + JSON_ARRAY: {}, + XML: {}, + }, + endpoint: 'https://api.hubapi.com/crm/v3/objects/contacts/103604', + files: {}, + headers: { + Authorization: authHeader2, + 'Content-Type': 'application/json', + }, + method: 'PATCH', + params: {}, + type: 'REST', + version: '1', + }, + destination: { + Config: { + accessToken: secret2, + apiKey: '', + apiVersion: 'newApi', + authorizationType: 'newPrivateAppApi', + blacklistedEvents: [], + connectionMode: 'cloud', + doAssociation: false, + eventDelivery: false, + eventDeliveryTS: 1687884567403, + eventFilteringOption: 'disable', + hubID: '25092171', + hubspotEvents: [ + { + eventProperties: [ + { + from: 'first_name', + to: 'first_name', + }, + { + from: 'last_name', + to: 'last_name', + }, + ], + hubspotEventName: 'pedummy-hubId_rs_hub_chair', + rsEventName: 'Order Complete', + }, + ], + lookupField: 'email', + useNativeSDK: false, + whitelistedEvents: [], + }, + Enabled: true, + ID: '2RnSBhn4zPTOF8NdqAIrnVPPnfr', + IsProcessorEnabled: true, + Name: 'hs-1', + RevisionID: '2gqf7Mc7WEwqQtQy3G105O22s3D', + Transformations: [], + WorkspaceID: '2QapBTEvZYwuf6O9KB5AEvvBt8j', + }, + metadata: [ + { + destinationId: '2RnSBhn4zPTOF8NdqAIrnVPPnfr', + dontBatch: true, + jobId: 1, + sourceId: '2RnN36pc7p5lzoApxZnDfRnYFx0', + transformAt: 'router', + workspaceId: '2QapBTEvZYwuf6O9KB5AEvvBt8j', + }, + ], + statusCode: 200, + }, + ], + }, + }, + }, + }, ]; diff --git a/test/integrations/destinations/http/common.ts b/test/integrations/destinations/http/common.ts index f0c8bc8a337..914704d6c2a 100644 --- a/test/integrations/destinations/http/common.ts +++ b/test/integrations/destinations/http/common.ts @@ -1,3 +1,4 @@ +import { secret1, secret2 } from './maskedSecrets'; import { Destination } from '../../../../src/types'; const destType = 'http'; @@ -43,7 +44,7 @@ const destinations: Destination[] = [ Config: { apiUrl: 'http://abc.com/contacts', auth: 'basicAuth', - username: 'test-user', + username: secret1, password: '', method: 'GET', format: 'JSON', @@ -92,13 +93,18 @@ const destinations: Destination[] = [ }, { Config: { - apiUrl: 'http://abc.com/contacts/{{$.traits.email}}/', + apiUrl: 'http://abc.com/contacts/', auth: 'apiKeyAuth', apiKeyName: 'x-api-key', apiKeyValue: 'test-api-key', method: 'DELETE', isBatchingEnabled: true, maxBatchSize: 4, + pathParams: [ + { + path: '$.traits.email', + }, + ], }, DestinationDefinition: { DisplayName: displayName, @@ -114,13 +120,18 @@ const destinations: Destination[] = [ }, { Config: { - apiUrl: 'http://abc.com/contacts/{{$.traits.email}}/', + apiUrl: 'http://abc.com/contacts/', auth: 'apiKeyAuth', apiKeyName: 'x-api-key', apiKeyValue: 'test-api-key', method: 'GET', isBatchingEnabled: true, maxBatchSize: 4, + pathParams: [ + { + path: '$.traits.email', + }, + ], }, DestinationDefinition: { DisplayName: displayName, @@ -138,9 +149,10 @@ const destinations: Destination[] = [ Config: { apiUrl: 'http://abc.com/events', auth: 'bearerTokenAuth', - bearerToken: 'test-token', + bearerToken: secret2, method: 'POST', format: 'XML', + xmlRootKey: 'body', headers: [ { to: '$.h1', @@ -249,7 +261,7 @@ const destinations: Destination[] = [ }, { Config: { - apiUrl: 'http://abc.com/contacts/{{$.traits.phone}}', + apiUrl: 'http://abc.com/contacts/', auth: 'noAuth', method: 'POST', format: 'JSON', @@ -262,9 +274,366 @@ const destinations: Destination[] = [ }, { to: '$.key', - from: '.traits.key', + from: '$.traits.key', + }, + ], + pathParams: [ + { + path: '$.traits.phone', + }, + ], + }, + DestinationDefinition: { + DisplayName: displayName, + ID: '123', + Name: destTypeInUpperCase, + Config: { cdkV2Enabled: true }, + }, + Enabled: true, + ID: '123', + Name: destTypeInUpperCase, + Transformations: [], + WorkspaceID: 'test-workspace-id', + }, + { + Config: { + apiUrl: 'http://abc.com/contacts', + auth: 'basicAuth', + username: secret1, + password: '', + method: 'GET', + format: 'JSON', + isBatchingEnabled: true, + maxBatchSize: 2, + headers: [ + { + to: '$.h1', + from: "'val1'", + }, + { + to: '$.h2', + from: '2', + }, + { + to: "$.'content-type'", + from: "'application/json'", + }, + { + to: '$.h3', + from: '$.traits.firstName', + }, + ], + queryParams: [ + { + to: "$['q1']", + from: "'val1'", + }, + { + to: '$.q2', + from: '$.traits.email', + }, + ], + pathParams: [ + { + path: '$.userId', + }, + { + path: 'c1', + }, + ], + }, + DestinationDefinition: { + DisplayName: displayName, + ID: '123', + Name: destTypeInUpperCase, + Config: { cdkV2Enabled: true }, + }, + Enabled: true, + ID: '123', + Name: destTypeInUpperCase, + Transformations: [], + WorkspaceID: 'test-workspace-id', + }, + { + Config: { + apiUrl: 'http://abc.com/contacts', + auth: 'basicAuth', + username: secret1, + password: '', + method: 'GET', + format: 'JSON', + isBatchingEnabled: true, + maxBatchSize: 2, + headers: [ + { + to: '$.h1', + from: "'val1'", + }, + { + to: '$.h2', + from: '2', + }, + { + to: "$.'content-type'", + from: "'application/json'", + }, + { + to: '$.h3', + from: '$.traits.firstName', }, ], + queryParams: [ + { + to: 'user name', + from: "'val1'", + }, + { + to: '$.q2', + from: '$.traits.email', + }, + ], + pathParams: [ + { + path: '$.userId', + }, + { + path: 'c1', + }, + ], + }, + DestinationDefinition: { + DisplayName: displayName, + ID: '123', + Name: destTypeInUpperCase, + Config: { cdkV2Enabled: true }, + }, + Enabled: true, + ID: '123', + Name: destTypeInUpperCase, + Transformations: [], + WorkspaceID: 'test-workspace-id', + }, + { + Config: { + apiUrl: 'http://abc.com/events', + auth: 'bearerTokenAuth', + bearerToken: secret2, + method: 'POST', + format: 'XML', + headers: [ + { + to: '$.h1', + from: "'val1'", + }, + { + to: '$.h2', + from: '$.key1', + }, + { + to: "$.'content-type'", + from: "'application/json'", + }, + ], + propertiesMapping: [ + { + from: '$.properties', + to: '$', + }, + ], + }, + DestinationDefinition: { + DisplayName: displayName, + ID: '123', + Name: destTypeInUpperCase, + Config: { cdkV2Enabled: true }, + }, + Enabled: true, + ID: '123', + Name: destTypeInUpperCase, + Transformations: [], + WorkspaceID: 'test-workspace-id', + }, + { + Config: { + apiUrl: 'http://abc.com/events', + auth: 'bearerTokenAuth', + bearerToken: secret2, + method: 'POST', + format: 'FORM', + headers: [ + { + to: '$.h1', + from: "'val1'", + }, + { + to: '$.h2', + from: '$.key1', + }, + { + to: "$.'content-type'", + from: "'application/json'", + }, + ], + propertiesMapping: [ + { + from: '$.event', + to: '$.event', + }, + { + from: '$.properties.currency', + to: '$.currency', + }, + { + from: '$.userId', + to: '$.userId', + }, + ], + }, + DestinationDefinition: { + DisplayName: displayName, + ID: '123', + Name: destTypeInUpperCase, + Config: { cdkV2Enabled: true }, + }, + Enabled: true, + ID: '123', + Name: destTypeInUpperCase, + Transformations: [], + WorkspaceID: 'test-workspace-id', + }, + { + Config: { + apiUrl: 'http://abc.com/events', + auth: 'bearerTokenAuth', + bearerToken: secret2, + method: 'POST', + format: 'FORM', + headers: [ + { + to: '$.h1', + from: "'val1'", + }, + { + to: '$.h2', + from: '$.key1', + }, + ], + propertiesMapping: [ + { + from: '$.event', + to: '$.event', + }, + { + from: '$.properties.currency', + to: '$.currency', + }, + { + from: '$.userId', + to: '$.userId', + }, + ], + }, + DestinationDefinition: { + DisplayName: displayName, + ID: '123', + Name: destTypeInUpperCase, + Config: { cdkV2Enabled: true }, + }, + Enabled: true, + ID: '123', + Name: destTypeInUpperCase, + Transformations: [], + WorkspaceID: 'test-workspace-id', + }, + { + Config: { + apiUrl: 'http://abc.com/events', + auth: 'bearerTokenAuth', + bearerToken: secret2, + method: 'POST', + format: 'FORM', + headers: [ + { + to: '$.h1', + from: "'val1'", + }, + { + to: '$.h2', + from: '$.key1', + }, + ], + propertiesMapping: [ + { + from: '$.event', + to: '$.event', + }, + { + from: '$.properties.currency', + to: '$.currency', + }, + { + from: '$.userId', + to: '$.userId', + }, + ], + }, + DestinationDefinition: { + DisplayName: displayName, + ID: '123', + Name: destTypeInUpperCase, + Config: { cdkV2Enabled: true }, + }, + Enabled: true, + ID: '123', + Name: destTypeInUpperCase, + Transformations: [], + WorkspaceID: 'test-workspace-id', + }, + { + Config: { + apiUrl: 'http://abc.com/contacts', + auth: 'noAuth', + method: 'POST', + format: 'FORM', + isBatchingEnabled: true, + maxBatchSize: '2', + propertiesMapping: [ + { + from: '$.traits.firstName', + to: '$.contacts.first_name', + }, + { + from: '$.traits.email', + to: '$.contacts.email', + }, + { + from: '$.traits.address.pinCode', + to: '$.contacts.address.pin_code', + }, + ], + }, + DestinationDefinition: { + DisplayName: displayName, + ID: '123', + Name: destTypeInUpperCase, + Config: { cdkV2Enabled: true }, + }, + Enabled: true, + ID: '123', + Name: destTypeInUpperCase, + Transformations: [], + WorkspaceID: 'test-workspace-id', + }, + { + Config: { + apiUrl: 'http://abc.com/contacts', + auth: 'noAuth', + method: 'POST', + format: 'JSON', + isBatchingEnabled: true, + maxBatchSize: '2', + isDefaultMapping: true, + propertiesMapping: [], }, DestinationDefinition: { DisplayName: displayName, @@ -329,7 +698,7 @@ const properties = { const processorInstrumentationErrorStatTags = { destType: destTypeInUpperCase, errorCategory: 'dataValidation', - errorType: 'instrumentation', + errorType: 'configuration', feature: 'processor', implementation: 'cdkV2', module: 'destination', diff --git a/test/integrations/destinations/http/maskedSecrets.ts b/test/integrations/destinations/http/maskedSecrets.ts new file mode 100644 index 00000000000..1e9bca66163 --- /dev/null +++ b/test/integrations/destinations/http/maskedSecrets.ts @@ -0,0 +1,7 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + '')}`; +export const authHeader2 = `Bearer ${secret2}`; diff --git a/test/integrations/destinations/http/processor/configuration.ts b/test/integrations/destinations/http/processor/configuration.ts index b493a236ee0..9baa64bd75c 100644 --- a/test/integrations/destinations/http/processor/configuration.ts +++ b/test/integrations/destinations/http/processor/configuration.ts @@ -1,6 +1,13 @@ +import { authHeader1, authHeader2 } from '../maskedSecrets'; import { ProcessorTestData } from '../../../testTypes'; import { generateMetadata, transformResultBuilder } from '../../../testUtils'; -import { destType, destinations, properties, traits } from '../common'; +import { + destType, + destinations, + properties, + traits, + processorInstrumentationErrorStatTags, +} from '../common'; export const configuration: ProcessorTestData[] = [ { @@ -26,6 +33,7 @@ export const configuration: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -37,6 +45,9 @@ export const configuration: ProcessorTestData[] = [ method: 'POST', userId: '', endpoint: destinations[0].Config.apiUrl, + headers: { + 'Content-Type': 'application/json', + }, JSON: { contacts: { first_name: 'John', @@ -77,6 +88,7 @@ export const configuration: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -87,8 +99,9 @@ export const configuration: ProcessorTestData[] = [ output: transformResultBuilder({ method: 'DELETE', userId: '', - endpoint: 'http://abc.com/contacts/john.doe@example.com/', + endpoint: 'http://abc.com/contacts/john.doe%40example.com', headers: { + 'Content-Type': 'application/json', 'x-api-key': 'test-api-key', }, }), @@ -122,6 +135,7 @@ export const configuration: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -134,9 +148,10 @@ export const configuration: ProcessorTestData[] = [ userId: '', endpoint: destinations[1].Config.apiUrl, headers: { - Authorization: 'Basic dGVzdC11c2VyOg==', + 'Content-Type': 'application/json', + Authorization: authHeader1, h1: 'val1', - h2: 2, + h2: '2', 'content-type': 'application/json', }, params: { @@ -175,6 +190,7 @@ export const configuration: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -187,13 +203,378 @@ export const configuration: ProcessorTestData[] = [ userId: '', endpoint: destinations[4].Config.apiUrl, headers: { - Authorization: 'Bearer test-token', + 'Content-Type': 'application/xml', + Authorization: authHeader2, h1: 'val1', 'content-type': 'application/json', }, XML: { payload: - 'Order CompletedUSDuserId123622c6f5d5cf86a4c77358033Cones of Dunshire40577c6f5d5cf86a4c7735ba03Five Crowns5', + 'Order CompletedUSDuserId123622c6f5d5cf86a4c77358033Cones of Dunshire40577c6f5d5cf86a4c7735ba03Five Crowns5', + }, + }), + statusCode: 200, + metadata: generateMetadata(1), + }, + ], + }, + }, + }, + { + id: 'http-configuration-test-5', + name: destType, + description: 'Track call with pathParams mapping', + scenario: 'Business', + successCriteria: 'Response should have the give paths added in the endpoint', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: destinations[7], + message: { + type: 'track', + userId: 'userId123', + event: 'Order Completed', + properties, + }, + metadata: generateMetadata(1), + }, + ], + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: transformResultBuilder({ + method: 'GET', + userId: '', + endpoint: 'http://abc.com/contacts/userId123/c1', + headers: { + 'Content-Type': 'application/json', + Authorization: authHeader1, + h1: 'val1', + h2: '2', + 'content-type': 'application/json', + }, + params: { + q1: 'val1', + }, + }), + statusCode: 200, + metadata: generateMetadata(1), + }, + ], + }, + }, + }, + { + id: 'http-configuration-test-6', + name: destType, + description: 'Track call with query params keys containing space', + scenario: 'Business', + successCriteria: 'Response should contain query params with URI encoded keys', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: destinations[8], + message: { + type: 'track', + userId: 'userId123', + event: 'Order Completed', + properties, + }, + metadata: generateMetadata(1), + }, + ], + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: transformResultBuilder({ + method: 'GET', + userId: '', + endpoint: 'http://abc.com/contacts/userId123/c1', + headers: { + 'Content-Type': 'application/json', + Authorization: authHeader1, + h1: 'val1', + h2: '2', + 'content-type': 'application/json', + }, + params: { + 'user%20name': 'val1', + }, + }), + statusCode: 200, + metadata: generateMetadata(1), + }, + ], + }, + }, + }, + { + id: 'http-configuration-test-7', + name: destType, + description: 'Identify call with properties mapping and form format with nested objects', + scenario: 'Business', + successCriteria: 'Response should be in form format with nested objects stringified', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: destinations[13], + message: { + type: 'identify', + userId: 'userId123', + anonymousId: 'anonId123', + traits, + }, + metadata: generateMetadata(1), + }, + ], + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: transformResultBuilder({ + method: 'POST', + userId: '', + endpoint: destinations[13].Config.apiUrl, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + FORM: { + contacts: JSON.stringify({ + first_name: 'John', + email: 'john.doe@example.com', + address: { pin_code: '123456' }, + }), + }, + }), + statusCode: 200, + metadata: generateMetadata(1), + }, + ], + }, + }, + }, + { + id: 'http-configuration-test-8', + name: destType, + description: + 'Track call with bearer token, form format, post method, additional headers and properties mapping', + scenario: 'Business', + successCriteria: + 'Response should be in form format with post method, headers and properties mapping', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + destination: destinations[10], + message: { + type: 'track', + userId: 'userId123', + event: 'Order Completed', + properties, + }, + metadata: generateMetadata(1), + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: transformResultBuilder({ + method: 'POST', + userId: '', + endpoint: destinations[10].Config.apiUrl, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: authHeader2, + h1: 'val1', + 'content-type': 'application/json', + }, + FORM: { + currency: 'USD', + event: 'Order Completed', + userId: 'userId123', + }, + }), + statusCode: 200, + metadata: generateMetadata(1), + }, + ], + }, + }, + }, + { + id: 'http-configuration-test-9', + name: destType, + description: 'Track call with bearer token, form url encoded format', + scenario: 'Business', + successCriteria: + 'Response should be in form format with post method, headers and properties mapping', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + destination: destinations[11], + message: { + type: 'track', + userId: 'userId123', + event: 'Order Completed', + properties, + }, + metadata: generateMetadata(1), + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: transformResultBuilder({ + method: 'POST', + userId: '', + endpoint: destinations[11].Config.apiUrl, + headers: { + Authorization: authHeader2, + h1: 'val1', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + FORM: { + currency: 'USD', + event: 'Order Completed', + userId: 'userId123', + }, + }), + statusCode: 200, + metadata: generateMetadata(1), + }, + ], + }, + }, + }, + { + id: 'http-configuration-test-10', + name: destType, + description: 'empty body', + scenario: 'Business', + successCriteria: + 'Response should be in form format with post method, headers and properties mapping', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + destination: destinations[12], + message: {}, + metadata: generateMetadata(1), + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: transformResultBuilder({ + method: 'POST', + userId: '', + endpoint: destinations[12].Config.apiUrl, + headers: { + Authorization: authHeader2, + h1: 'val1', + 'Content-Type': 'application/x-www-form-urlencoded', + }, + FORM: {}, + }), + statusCode: 200, + metadata: generateMetadata(1), + }, + ], + }, + }, + }, + { + id: 'http-configuration-test-11', + name: destType, + description: 'Identify call with default properties mapping', + scenario: 'Business', + successCriteria: 'Response should be in json format with default properties mapping', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: destinations[14], + message: { + type: 'identify', + userId: 'userId123', + anonymousId: 'anonId123', + }, + metadata: generateMetadata(1), + }, + ], + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: transformResultBuilder({ + method: 'POST', + userId: '', + endpoint: destinations[14].Config.apiUrl, + headers: { + 'Content-Type': 'application/json', + }, + JSON: { + type: 'identify', + userId: 'userId123', + anonymousId: 'anonId123', }, }), statusCode: 200, diff --git a/test/integrations/destinations/http/router/data.ts b/test/integrations/destinations/http/router/data.ts index ea14ec73418..1a762e84f13 100644 --- a/test/integrations/destinations/http/router/data.ts +++ b/test/integrations/destinations/http/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; import { generateMetadata } from '../../../testUtils'; import { destType, destinations, traits, properties } from '../common'; @@ -182,9 +183,10 @@ export const data = [ version: '1', type: 'REST', method: 'GET', - endpoint: 'http://abc.com/contacts/john.doe@example.com/', + endpoint: 'http://abc.com/contacts/john.doe%40example.com', headers: { 'x-api-key': 'test-api-key', + 'Content-Type': 'application/json', }, params: {}, body: { @@ -233,15 +235,16 @@ export const data = [ method: 'GET', endpoint: 'http://abc.com/contacts', headers: { - Authorization: 'Basic dGVzdC11c2VyOg==', + 'Content-Type': 'application/json', + Authorization: authHeader1, 'content-type': 'application/json', h1: 'val1', - h2: 2, + h2: '2', h3: 'John', }, params: { q1: 'val1', - q2: 'john.doe@example.com', + q2: 'john.doe%40example.com', }, body: { JSON: {}, @@ -265,15 +268,16 @@ export const data = [ method: 'GET', endpoint: 'http://abc.com/contacts', headers: { - Authorization: 'Basic dGVzdC11c2VyOg==', + 'Content-Type': 'application/json', + Authorization: authHeader1, 'content-type': 'application/json', h1: 'val1', - h2: 2, + h2: '2', h3: 'John', }, params: { q1: 'val1', - q2: 'john.doe@example.com', + q2: 'john.doe%40example.com', }, body: { JSON: {}, @@ -297,15 +301,16 @@ export const data = [ method: 'GET', endpoint: 'http://abc.com/contacts', headers: { - Authorization: 'Basic dGVzdC11c2VyOg==', + 'Content-Type': 'application/json', + Authorization: authHeader1, 'content-type': 'application/json', h1: 'val1', - h2: 2, + h2: '2', h3: 'Alex', }, params: { q1: 'val1', - q2: 'alex.t@example.com', + q2: 'alex.t%40example.com', }, body: { JSON: {}, @@ -355,13 +360,45 @@ export const data = [ endpoint: 'http://abc.com/events', params: {}, headers: { + 'Content-Type': 'application/json', 'content-type': 'application/json', }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Product Viewed","userId":"userId1","properties":{"items":[]}},{"event":"Order Completed","currency":"USD","userId":"userId2","properties":{"items":[{"item_id":"622c6f5d5cf86a4c77358033","name":"Cones of Dunshire","price":40},{"item_id":"577c6f5d5cf86a4c7735ba03","name":"Five Crowns","price":5}]}},{"event":"Product Added","currency":"USD","userId":"userId3","properties":{"items":[{"item_id":"622c6f5d5cf86a4c77358033","name":"Cones of Dunshire","price":40},{"item_id":"577c6f5d5cf86a4c7735ba03","name":"Five Crowns","price":5}]}}]', + batch: JSON.stringify([ + { event: 'Product Viewed', userId: 'userId1', properties: { items: [] } }, + { + event: 'Order Completed', + currency: 'USD', + userId: 'userId2', + properties: { + items: [ + { + item_id: '622c6f5d5cf86a4c77358033', + name: 'Cones of Dunshire', + price: 40, + }, + { item_id: '577c6f5d5cf86a4c7735ba03', name: 'Five Crowns', price: 5 }, + ], + }, + }, + { + event: 'Product Added', + currency: 'USD', + userId: 'userId3', + properties: { + items: [ + { + item_id: '622c6f5d5cf86a4c77358033', + name: 'Cones of Dunshire', + price: 40, + }, + { item_id: '577c6f5d5cf86a4c7735ba03', name: 'Five Crowns', price: 5 }, + ], + }, + }, + ]), }, XML: {}, FORM: {}, @@ -409,6 +446,7 @@ export const data = [ method: 'POST', endpoint: 'http://abc.com/contacts/1234567890', headers: { + 'Content-Type': 'application/json', 'content-type': 'application/json', key: 'value1', }, @@ -433,6 +471,7 @@ export const data = [ method: 'POST', endpoint: 'http://abc.com/contacts/1234567890', headers: { + 'Content-Type': 'application/json', 'content-type': 'application/json', }, params: {}, @@ -456,6 +495,7 @@ export const data = [ method: 'POST', endpoint: 'http://abc.com/contacts/2234567890', headers: { + 'Content-Type': 'application/json', 'content-type': 'application/json', }, params: {}, diff --git a/test/integrations/destinations/impact/maskedSecrets.ts b/test/integrations/destinations/impact/maskedSecrets.ts new file mode 100644 index 00000000000..156e87fe1e6 --- /dev/null +++ b/test/integrations/destinations/impact/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; diff --git a/test/integrations/destinations/impact/processor/data.ts b/test/integrations/destinations/impact/processor/data.ts index 0841f44c623..a33f38e4792 100644 --- a/test/integrations/destinations/impact/processor/data.ts +++ b/test/integrations/destinations/impact/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; export const data = [ { name: 'impact', @@ -50,8 +51,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -122,7 +123,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', endpoint: 'https://trkapi.impact.com/PageLoad', @@ -185,8 +186,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -294,7 +295,7 @@ export const data = [ destination: { Config: { accountSID: '', - apiKey: 'fghsdfgegvcergfvfdfsag', + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -627,8 +628,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -704,10 +705,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api.impact.com/Advertisers/dfsgertrtff3erfc34rfwf/Conversions', + endpoint: `https://api.impact.com/Advertisers/${secret1}/Conversions`, userId: '', }, statusCode: 200, @@ -777,8 +778,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -850,10 +851,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api.impact.com/Advertisers/dfsgertrtff3erfc34rfwf/Conversions', + endpoint: `https://api.impact.com/Advertisers/${secret1}/Conversions`, userId: '', }, statusCode: 200, @@ -925,8 +926,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -1008,10 +1009,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api.impact.com/Advertisers/dfsgertrtff3erfc34rfwf/Conversions', + endpoint: `https://api.impact.com/Advertisers/${secret1}/Conversions`, userId: '', }, statusCode: 200, @@ -1083,8 +1084,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -1162,10 +1163,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api.impact.com/Advertisers/dfsgertrtff3erfc34rfwf/Conversions', + endpoint: `https://api.impact.com/Advertisers/${secret1}/Conversions`, userId: '', }, statusCode: 200, @@ -1240,8 +1241,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -1323,10 +1324,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api.impact.com/Advertisers/dfsgertrtff3erfc34rfwf/Conversions', + endpoint: `https://api.impact.com/Advertisers/${secret1}/Conversions`, userId: '', }, statusCode: 200, @@ -1401,8 +1402,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -1484,10 +1485,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api.impact.com/Advertisers/dfsgertrtff3erfc34rfwf/Conversions', + endpoint: `https://api.impact.com/Advertisers/${secret1}/Conversions`, userId: '', }, statusCode: 200, @@ -1547,8 +1548,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -1619,7 +1620,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', endpoint: 'https://trkapi.impact.com/PageLoad', @@ -1682,8 +1683,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -1754,7 +1755,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', endpoint: 'https://trkapi.impact.com/PageLoad', @@ -1827,8 +1828,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -1945,8 +1946,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -2059,8 +2060,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -2138,10 +2139,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api.impact.com/Advertisers/dfsgertrtff3erfc34rfwf/Conversions', + endpoint: `https://api.impact.com/Advertisers/${secret1}/Conversions`, userId: '', }, statusCode: 200, @@ -2216,8 +2217,8 @@ export const data = [ }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -2298,10 +2299,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api.impact.com/Advertisers/dfsgertrtff3erfc34rfwf/Conversions', + endpoint: `https://api.impact.com/Advertisers/${secret1}/Conversions`, userId: '', }, statusCode: 200, @@ -2348,10 +2349,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api.impact.com/Advertisers/dfsgertrtff3erfc34rfwf/Conversions', + endpoint: `https://api.impact.com/Advertisers/${secret1}/Conversions`, userId: '', }, statusCode: 200, diff --git a/test/integrations/destinations/impact/router/data.ts b/test/integrations/destinations/impact/router/data.ts index e9120ae03dd..894c62f4f30 100644 --- a/test/integrations/destinations/impact/router/data.ts +++ b/test/integrations/destinations/impact/router/data.ts @@ -1,6 +1,7 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; export const data = [ { - name: 'fb', + name: 'impact', description: 'Test 0', feature: 'router', module: 'destination', @@ -12,8 +13,8 @@ export const data = [ { destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -99,8 +100,8 @@ export const data = [ metadata: { jobId: 2, userId: 'u1' }, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -156,8 +157,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', endpoint: 'https://trkapi.impact.com/PageLoad', @@ -167,8 +167,8 @@ export const data = [ statusCode: 200, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', @@ -220,11 +220,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Basic ZGZzZ2VydHJ0ZmYzZXJmYzM0cmZ3ZjpmZ2hzZGZnZWd2Y2VyZ2Z2ZmRmc2Fn', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api.impact.com/Advertisers/dfsgertrtff3erfc34rfwf/Conversions', + endpoint: `https://api.impact.com/Advertisers/${secret1}/Conversions`, }, ], metadata: [{ jobId: 2, userId: 'u1' }], @@ -232,8 +231,8 @@ export const data = [ statusCode: 200, destination: { Config: { - accountSID: 'dfsgertrtff3erfc34rfwf', - apiKey: 'fghsdfgegvcergfvfdfsag', + accountSID: secret1, + apiKey: secret2, campaignId: '23224', impactAppId: '2323', eventTypeId: '56446', diff --git a/test/integrations/destinations/intercom/dataDelivery/business.ts b/test/integrations/destinations/intercom/dataDelivery/business.ts index 05ac63147d1..8a4591ca776 100644 --- a/test/integrations/destinations/intercom/dataDelivery/business.ts +++ b/test/integrations/destinations/intercom/dataDelivery/business.ts @@ -1,3 +1,4 @@ +import { authHeader1, authHeader2 } from '../maskedSecrets'; import { generateMetadata, generateProxyV0Payload, @@ -6,7 +7,7 @@ import { const commonHeaders = { 'Content-Type': 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -14,7 +15,7 @@ const commonHeaders = { const unauthorizedResponseHeaders = { 'Content-Type': 'application/json', - Authorization: 'Bearer invalidApiKey', + Authorization: authHeader2, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -387,8 +388,11 @@ export const testScenariosForV1API = [ message: 'Request Processed Successfully', response: [ { - error: - '{"type":"error.list","request_id":"request123","errors":[{"code":"unauthorized","message":"Access Token Invalid"}]}', + error: JSON.stringify({ + type: 'error.list', + request_id: 'request123', + errors: [{ code: 'unauthorized', message: 'Access Token Invalid' }], + }), metadata: generateMetadata(1), statusCode: 401, }, @@ -471,8 +475,11 @@ export const testScenariosForV1API = [ message: 'Request Processed Successfully', response: [ { - error: - '{"type":"error.list","request_id":"request124","errors":[{"code":"api_plan_restricted","message":"Active subscription needed."}]}', + error: JSON.stringify({ + type: 'error.list', + request_id: 'request124', + errors: [{ code: 'api_plan_restricted', message: 'Active subscription needed.' }], + }), metadata: generateMetadata(1), statusCode: 403, }, @@ -512,8 +519,16 @@ export const testScenariosForV1API = [ message: 'Request Processed Successfully', response: [ { - error: - '{"type":"error.list","request_id":"request125","errors":[{"code":"rate_limit_exceeded","message":"The rate limit for the App has been exceeded"}]}', + error: JSON.stringify({ + type: 'error.list', + request_id: 'request125', + errors: [ + { + code: 'rate_limit_exceeded', + message: 'The rate limit for the App has been exceeded', + }, + ], + }), metadata: generateMetadata(1), statusCode: 429, }, @@ -557,8 +572,16 @@ export const testScenariosForV1API = [ message: 'Request Processed Successfully', response: [ { - error: - '{"type":"error.list","request_id":"request126","errors":[{"code":"conflict","message":"A contact matching those details already exists with id=test1"}]}', + error: JSON.stringify({ + type: 'error.list', + request_id: 'request126', + errors: [ + { + code: 'conflict', + message: 'A contact matching those details already exists with id=test1', + }, + ], + }), metadata: generateMetadata(1), statusCode: 409, }, @@ -602,8 +625,15 @@ export const testScenariosForV1API = [ message: 'Request Processed Successfully', response: [ { - error: - '{"errors":[{"code":"media_type_not_acceptable","message":"The Accept header should send a media type of application/json"}],"type":"error.list"}', + error: JSON.stringify({ + errors: [ + { + code: 'media_type_not_acceptable', + message: 'The Accept header should send a media type of application/json', + }, + ], + type: 'error.list', + }), metadata: generateMetadata(1), statusCode: 406, }, diff --git a/test/integrations/destinations/intercom/dataDelivery/other.ts b/test/integrations/destinations/intercom/dataDelivery/other.ts index 47690776278..4c77bd0ce30 100644 --- a/test/integrations/destinations/intercom/dataDelivery/other.ts +++ b/test/integrations/destinations/intercom/dataDelivery/other.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; import { ProxyV1TestData } from '../../../testTypes'; import { generateMetadata, @@ -7,7 +8,7 @@ import { const commonHeaders = { 'Content-Type': 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -245,8 +246,16 @@ export const otherScenariosV1: ProxyV1TestData[] = [ '[Intercom Response Handler] Request failed for destination intercom with status: 408', response: [ { - error: - '{"type":"error.list","request_id":"000on04msi4jpk7d3u60","errors":[{"code":"Request Timeout","message":"The server would not wait any longer for the client"}]}', + error: JSON.stringify({ + type: 'error.list', + request_id: '000on04msi4jpk7d3u60', + errors: [ + { + code: 'Request Timeout', + message: 'The server would not wait any longer for the client', + }, + ], + }), metadata: generateMetadata(1), statusCode: 500, }, @@ -288,8 +297,16 @@ export const otherScenariosV1: ProxyV1TestData[] = [ message: 'Request Processed Successfully', response: [ { - error: - '{"type":"error.list","request_id":"request127","errors":[{"code":"service_unavailable","message":"Sorry, the API service is temporarily unavailable"}]}', + error: JSON.stringify({ + type: 'error.list', + request_id: 'request127', + errors: [ + { + code: 'service_unavailable', + message: 'Sorry, the API service is temporarily unavailable', + }, + ], + }), metadata: generateMetadata(1), statusCode: 503, }, @@ -329,8 +346,11 @@ export const otherScenariosV1: ProxyV1TestData[] = [ message: 'Request Processed Successfully', response: [ { - error: - '{"type":"error.list","request_id":"request128","errors":[{"code":"client_error","message":"Unknown server error"}]}', + error: JSON.stringify({ + type: 'error.list', + request_id: 'request128', + errors: [{ code: 'client_error', message: 'Unknown server error' }], + }), metadata: generateMetadata(1), statusCode: 500, }, @@ -370,8 +390,13 @@ export const otherScenariosV1: ProxyV1TestData[] = [ message: 'Request Processed Successfully', response: [ { - error: - '{"type":"error.list","request_id":"request129","errors":[{"code":"server_timeout","message":"Server timed out when making request"}]}', + error: JSON.stringify({ + type: 'error.list', + request_id: 'request129', + errors: [ + { code: 'server_timeout', message: 'Server timed out when making request' }, + ], + }), metadata: generateMetadata(1), statusCode: 504, }, diff --git a/test/integrations/destinations/intercom/deleteUsers/data.ts b/test/integrations/destinations/intercom/deleteUsers/data.ts index 58285ee683e..2fe1c785dd5 100644 --- a/test/integrations/destinations/intercom/deleteUsers/data.ts +++ b/test/integrations/destinations/intercom/deleteUsers/data.ts @@ -1,3 +1,4 @@ +import { secret1 } from '../maskedSecrets'; export const data = [ { name: 'intercom', @@ -19,7 +20,7 @@ export const data = [ }, ], config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, ], @@ -57,7 +58,7 @@ export const data = [ }, ], config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, ], diff --git a/test/integrations/destinations/intercom/maskedSecrets.ts b/test/integrations/destinations/intercom/maskedSecrets.ts new file mode 100644 index 00000000000..935d0e6d37e --- /dev/null +++ b/test/integrations/destinations/intercom/maskedSecrets.ts @@ -0,0 +1,10 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const secret4 = path.basename(__dirname) + 4; +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; +export const authHeader3 = `Bearer ${secret3}`; +export const authHeader4 = `Bearer ${secret4}`; diff --git a/test/integrations/destinations/intercom/network.ts b/test/integrations/destinations/intercom/network.ts index 0a86ce3c897..c2e6ae80f2d 100644 --- a/test/integrations/destinations/intercom/network.ts +++ b/test/integrations/destinations/intercom/network.ts @@ -1,12 +1,13 @@ +import { authHeader1, authHeader2, authHeader3 } from './maskedSecrets'; const commonHeaders = { Accept: 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }; const v0VersionHeaders = { 'Content-Type': 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -14,7 +15,7 @@ const v0VersionHeaders = { const v1VersionHeaders = { 'Content-Type': 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Intercom-Version': '2.10', 'User-Agent': 'RudderStack', @@ -45,7 +46,7 @@ const companyPayload = { const v1Headers = { 'Content-Type': 'application/json', - Authorization: 'Bearer abcd=', + Authorization: authHeader3, Accept: 'application/json', 'Intercom-Version': '1.4', }; @@ -434,7 +435,7 @@ const deliveryCallsData = [ }, headers: { Accept: 'application/json', - Authorization: 'Bearer invalidApiKey', + Authorization: authHeader2, 'Content-Type': 'application/json', }, }, @@ -529,7 +530,7 @@ const deliveryCallsData = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer invalidApiKey', + Authorization: authHeader2, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', diff --git a/test/integrations/destinations/intercom/processor/groupTestData.ts b/test/integrations/destinations/intercom/processor/groupTestData.ts index f87da349650..dd282a14cda 100644 --- a/test/integrations/destinations/intercom/processor/groupTestData.ts +++ b/test/integrations/destinations/intercom/processor/groupTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, authHeader3, secret3 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { generateMetadata, @@ -6,14 +7,14 @@ import { } from '../../../testUtils'; const v1Config = { - apiKey: 'abcd=', + apiKey: secret3, appId: 'asdasdasd', apiVersion: 'v1', collectContext: false, }; const v2Config = { - apiKey: 'testApiKey', + apiKey: secret1, apiVersion: 'v2', apiServer: 'standard', sendAnonymousId: false, @@ -21,7 +22,7 @@ const v2Config = { const v1Headers = { 'Content-Type': 'application/json', - Authorization: 'Bearer abcd=', + Authorization: authHeader3, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -29,7 +30,7 @@ const v1Headers = { const v2Headers = { Accept: 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', 'Intercom-Version': '2.10', 'User-Agent': 'RudderStack', diff --git a/test/integrations/destinations/intercom/processor/identifyTestData.ts b/test/integrations/destinations/intercom/processor/identifyTestData.ts index f078536b30a..24666b42a19 100644 --- a/test/integrations/destinations/intercom/processor/identifyTestData.ts +++ b/test/integrations/destinations/intercom/processor/identifyTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, authHeader4, secret4 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { generateMetadata, @@ -6,14 +7,14 @@ import { } from '../../../testUtils'; const v1Config = { - apiKey: 'intercomApiKey', + apiKey: secret4, apiVersion: 'v1', appId: '9e9cdea1-78fa-4829-a9b2-5d7f7e96d1a0', collectContext: false, }; const v2Config = { - apiKey: 'testApiKey', + apiKey: secret1, apiVersion: 'v2', apiServer: 'standard', sendAnonymousId: false, @@ -21,7 +22,7 @@ const v2Config = { const v2Headers = { Accept: 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', 'Intercom-Version': '2.10', 'User-Agent': 'RudderStack', @@ -29,7 +30,7 @@ const v2Headers = { const v1Headers = { 'Content-Type': 'application/json', - Authorization: 'Bearer intercomApiKey', + Authorization: authHeader4, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -234,7 +235,7 @@ const expectedUser6Traits = { company_id: 'company_id', custom_attributes: { key1: 'value1', - key2: '{"a":"a"}', + key2: JSON.stringify({ a: 'a' }), key3: '[1,2,3]', }, }, @@ -711,8 +712,8 @@ export const identifyTestData = [ ...expectedUser6Traits.companies[0], custom_attributes: { key1: 'value1', - key3: '["value1","value2"]', - key4: '{"foo":"bar"}', + key3: JSON.stringify(['value1', 'value2']), + key4: JSON.stringify({ foo: 'bar' }), }, company_id: 'c0277b5c814453e5135f515f943d085a', }, diff --git a/test/integrations/destinations/intercom/processor/trackTestData.ts b/test/integrations/destinations/intercom/processor/trackTestData.ts index b0878cc79d5..639a551c8ac 100644 --- a/test/integrations/destinations/intercom/processor/trackTestData.ts +++ b/test/integrations/destinations/intercom/processor/trackTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, authHeader4, secret4 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { generateMetadata, @@ -6,14 +7,14 @@ import { } from '../../../testUtils'; const v1Config = { - apiKey: 'intercomApiKey', + apiKey: secret4, apiVersion: 'v1', appId: '9e9cdea1-78fa-4829-a9b2-5d7f7e96d1a0', collectContext: false, }; const v2Config = { - apiKey: 'testApiKey', + apiKey: secret1, apiVersion: 'v2', apiServer: 'standard', sendAnonymousId: false, @@ -21,7 +22,7 @@ const v2Config = { const v1Headers = { 'Content-Type': 'application/json', - Authorization: 'Bearer intercomApiKey', + Authorization: authHeader4, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -29,7 +30,7 @@ const v1Headers = { const v2Headers = { Accept: 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', 'Intercom-Version': '2.10', 'User-Agent': 'RudderStack', diff --git a/test/integrations/destinations/intercom/processor/validationTestData.ts b/test/integrations/destinations/intercom/processor/validationTestData.ts index 45fe3c1b9ec..573b04dfce7 100644 --- a/test/integrations/destinations/intercom/processor/validationTestData.ts +++ b/test/integrations/destinations/intercom/processor/validationTestData.ts @@ -1,16 +1,17 @@ +import { secret1, secret2, secret4 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { generateMetadata } from '../../../testUtils'; const v1Config = { - apiKey: 'intercomApiKey', + apiKey: secret4, apiVersion: 'v1', appId: '9e9cdea1-78fa-4829-a9b2-5d7f7e96d1a0', collectContext: false, }; const v2Config = { - apiKey: 'testApiKey', + apiKey: secret1, apiVersion: 'v2', apiServer: 'standard', sendAnonymousId: false, @@ -28,7 +29,7 @@ const destination: Destination = { }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, apiVersion: 'v2', apiServer: 'standard', sendAnonymousId: false, @@ -108,6 +109,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -151,6 +153,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -197,6 +200,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -245,6 +249,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -293,6 +298,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -327,7 +333,7 @@ export const validationTestData: ProcessorTestData[] = [ { destination: { ...v2Destination, - Config: { ...v2Destination.Config, apiKey: 'invalidApiKey' }, + Config: { ...v2Destination.Config, apiKey: secret2 }, }, message: { userId: 'user@3', @@ -353,6 +359,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -360,8 +367,38 @@ export const validationTestData: ProcessorTestData[] = [ status: 200, body: [ { - error: - '{"message":"{\\"message\\":\\"Unable to search contact due to : [{\\\\\\"code\\\\\\":\\\\\\"unauthorized\\\\\\",\\\\\\"message\\\\\\":\\\\\\"Access Token Invalid\\\\\\"}]: Workflow: procWorkflow, Step: searchContact, ChildStep: undefined, OriginalError: Unable to search contact due to : [{\\\\\\"code\\\\\\":\\\\\\"unauthorized\\\\\\",\\\\\\"message\\\\\\":\\\\\\"Access Token Invalid\\\\\\"}]\\",\\"destinationResponse\\":{\\"response\\":{\\"type\\":\\"error.list\\",\\"request_id\\":\\"request_1\\",\\"errors\\":[{\\"code\\":\\"unauthorized\\",\\"message\\":\\"Access Token Invalid\\"}]},\\"status\\":401}}","destinationResponse":{"response":{"type":"error.list","request_id":"request_1","errors":[{"code":"unauthorized","message":"Access Token Invalid"}]},"status":401}}', + error: JSON.stringify({ + message: JSON.stringify({ + message: + 'Unable to search contact due to : [{"code":"unauthorized","message":"Access Token Invalid"}]: Workflow: procWorkflow, Step: searchContact, ChildStep: undefined, OriginalError: Unable to search contact due to : [{"code":"unauthorized","message":"Access Token Invalid"}]', + destinationResponse: { + response: { + type: 'error.list', + request_id: 'request_1', + errors: [ + { + code: 'unauthorized', + message: 'Access Token Invalid', + }, + ], + }, + status: 401, + }, + }), + destinationResponse: { + response: { + type: 'error.list', + request_id: 'request_1', + errors: [ + { + code: 'unauthorized', + message: 'Access Token Invalid', + }, + ], + }, + status: 401, + }, + }), statTags: { ...expectedStatTags, errorCategory: 'network', errorType: 'aborted' }, statusCode: 401, metadata: generateMetadata(1), @@ -397,6 +434,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -447,6 +485,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -490,6 +529,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -534,6 +574,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/intercom/router/data.ts b/test/integrations/destinations/intercom/router/data.ts index cc89d3f1e2d..e5bc766c76d 100644 --- a/test/integrations/destinations/intercom/router/data.ts +++ b/test/integrations/destinations/intercom/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { Destination, RouterTransformationRequest } from '../../../../../src/types'; import { RouterTestData } from '../../../testTypes'; import { generateMetadata } from '../../../testUtils'; @@ -14,7 +15,7 @@ const destination1: Destination = { }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, apiServer: 'standard', apiVersion: 'v2', sendAnonymousId: false, @@ -37,7 +38,7 @@ const destination2: Destination = { }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, apiServer: 'standard', apiVersion: 'v2', sendAnonymousId: false, @@ -60,7 +61,7 @@ const destination3: Destination = { }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, apiVersion: 'v2', apiServer: 'eu', sendAnonymousId: false, @@ -82,7 +83,7 @@ const destination4: Destination = { }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, apiVersion: 'v1', sendAnonymousId: false, updateLastRequestAt: false, @@ -105,7 +106,7 @@ const destination5: Destination = { }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, apiVersion: 'v1', sendAnonymousId: false, collectContext: false, @@ -125,7 +126,7 @@ const destination6: Destination = { Config: {}, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, apiVersion: 'v1', sendAnonymousId: false, updateLastRequestAt: false, @@ -146,7 +147,7 @@ const destination7: Destination = { Config: {}, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, apiVersion: 'v1', sendAnonymousId: false, collectContext: false, @@ -812,6 +813,7 @@ export const data: RouterTestData[] = [ input: { request: { body: routerRequest1, + method: 'POST', }, }, output: { @@ -841,7 +843,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.intercom.io/contacts', files: {}, headers: { - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', 'Intercom-Version': '2.10', @@ -884,7 +886,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.intercom.io/events', files: {}, headers: { - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', 'Intercom-Version': '2.10', @@ -913,7 +915,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.eu.intercom.io/contacts/70701240741e45d040/companies', files: {}, headers: { - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', 'Intercom-Version': '2.10', @@ -942,7 +944,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.eu.intercom.io/contacts/70701240741e45d040/companies', files: {}, headers: { - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', 'Intercom-Version': '2.10', @@ -993,6 +995,7 @@ export const data: RouterTestData[] = [ input: { request: { body: routerRequest2, + method: 'POST', }, }, output: { @@ -1008,7 +1011,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.intercom.io/users', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -1048,7 +1051,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.intercom.io/users', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -1100,7 +1103,7 @@ export const data: RouterTestData[] = [ files: {}, headers: { Accept: 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -1130,7 +1133,7 @@ export const data: RouterTestData[] = [ files: {}, headers: { Accept: 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -1153,7 +1156,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.intercom.io/users', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Intercom-Version': '1.4', 'User-Agent': 'RudderStack', @@ -1212,6 +1215,7 @@ export const data: RouterTestData[] = [ input: { request: { body: routerRequest4, + method: 'POST', }, }, output: { @@ -1241,7 +1245,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.eu.intercom.io/contacts/70701240741e45d040', files: {}, headers: { - Authorization: 'Bearer testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', 'Intercom-Version': '2.10', diff --git a/test/integrations/destinations/intercom_v2/common.ts b/test/integrations/destinations/intercom_v2/common.ts index 60c7e02b330..e396d381e47 100644 --- a/test/integrations/destinations/intercom_v2/common.ts +++ b/test/integrations/destinations/intercom_v2/common.ts @@ -1,4 +1,6 @@ +import { authHeader1 } from './maskedSecrets'; import { Destination } from '../../../../src/types'; +import { defaultAccessToken } from '../../common/secrets'; const destTypeInUpperCase = 'INTERCOM_V2'; const channel = 'web'; @@ -103,7 +105,7 @@ const properties = { }; const headers = { - Authorization: 'Bearer default-accessToken', + Authorization: `Bearer ${defaultAccessToken}`, Accept: 'application/json', 'Content-Type': 'application/json', 'Intercom-Version': '2.10', @@ -111,7 +113,7 @@ const headers = { const headersWithRevokedAccessToken = { ...headers, - Authorization: 'Bearer revoked-accessToken', + Authorization: authHeader1, }; const RouterInstrumentationErrorStatTags = { diff --git a/test/integrations/destinations/intercom_v2/dataDelivery/business.ts b/test/integrations/destinations/intercom_v2/dataDelivery/business.ts index c75993bc7a7..0870839e9d9 100644 --- a/test/integrations/destinations/intercom_v2/dataDelivery/business.ts +++ b/test/integrations/destinations/intercom_v2/dataDelivery/business.ts @@ -360,8 +360,16 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"errors":[{"code":"rate_limit_exceeded","message":"The rate limit for the App has been exceeded"}],"request_id":"request125","type":"error.list"}', + error: JSON.stringify({ + errors: [ + { + code: 'rate_limit_exceeded', + message: 'The rate limit for the App has been exceeded', + }, + ], + request_id: 'request125', + type: 'error.list', + }), statusCode: 429, metadata: generateMetadata(1), }, @@ -404,8 +412,16 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"errors":[{"code":"conflict","message":"A contact matching those details already exists with id=test"}],"request_id":"request126","type":"error.list"}', + error: JSON.stringify({ + errors: [ + { + code: 'conflict', + message: 'A contact matching those details already exists with id=test', + }, + ], + request_id: 'request126', + type: 'error.list', + }), statusCode: 409, metadata: generateMetadata(1), }, @@ -452,8 +468,15 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"errors":[{"code":"media_type_not_acceptable","message":"The Accept header should send a media type of application/json"}],"type":"error.list"}', + error: JSON.stringify({ + errors: [ + { + code: 'media_type_not_acceptable', + message: 'The Accept header should send a media type of application/json', + }, + ], + type: 'error.list', + }), statusCode: 406, metadata: generateMetadata(1), }, @@ -501,8 +524,16 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ '[Intercom V2 Response Handler] Request failed for destination intercom_v2 with status: 408', response: [ { - error: - '{"type":"error.list","request_id":"req-123","errors":[{"code":"Request Timeout","message":"The server would not wait any longer for the client"}]}', + error: JSON.stringify({ + type: 'error.list', + request_id: 'req-123', + errors: [ + { + code: 'Request Timeout', + message: 'The server would not wait any longer for the client', + }, + ], + }), metadata: generateMetadata(1), statusCode: 500, }, diff --git a/test/integrations/destinations/intercom_v2/dataDelivery/oauth.ts b/test/integrations/destinations/intercom_v2/dataDelivery/oauth.ts index 8f36a4bd55f..963d2d061d8 100644 --- a/test/integrations/destinations/intercom_v2/dataDelivery/oauth.ts +++ b/test/integrations/destinations/intercom_v2/dataDelivery/oauth.ts @@ -1,3 +1,4 @@ +import { secret1 } from '../maskedSecrets'; import { ProxyV1TestData } from '../../../testTypes'; import { generateMetadata, generateProxyV1Payload } from '../../../testUtils'; import { headers, headersWithRevokedAccessToken, RouterNetworkErrorStatTags } from '../common'; @@ -38,7 +39,7 @@ export const oauthScenariosV0 = [ body: generateProxyV1Payload({ ...commonRequestParameters, headers: headersWithRevokedAccessToken, - accessToken: 'revoked-accessToken', + accessToken: secret1, }), method: 'POST', }, @@ -122,7 +123,7 @@ export const oauthScenariosV1: ProxyV1TestData[] = [ body: generateProxyV1Payload({ ...commonRequestParameters, headers: headersWithRevokedAccessToken, - accessToken: 'revoked-accessToken', + accessToken: secret1, }), method: 'POST', }, @@ -134,12 +135,15 @@ export const oauthScenariosV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"type":"error.list","request_id":"request_id-1","errors":[{"code":"unauthorized","message":"Access Token Invalid"}]}', + error: JSON.stringify({ + type: 'error.list', + request_id: 'request_id-1', + errors: [{ code: 'unauthorized', message: 'Access Token Invalid' }], + }), statusCode: 400, metadata: { ...generateMetadata(1), - secret: { accessToken: 'revoked-accessToken' }, + secret: { accessToken: secret1 }, }, }, ], diff --git a/test/integrations/destinations/intercom_v2/maskedSecrets.ts b/test/integrations/destinations/intercom_v2/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/intercom_v2/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/intercom_v2/router/data.ts b/test/integrations/destinations/intercom_v2/router/data.ts index 75f5ba6ae7b..3a871ca1588 100644 --- a/test/integrations/destinations/intercom_v2/router/data.ts +++ b/test/integrations/destinations/intercom_v2/router/data.ts @@ -1,4 +1,5 @@ -import { RouterTransformationRequest } from '../../../../../src/types'; +import { secret1 } from '../maskedSecrets'; +import { MessageType, RouterTransformationRequest, RudderMessage } from '../../../../../src/types'; import { generateMetadata } from '../../../testUtils'; import { anonymousId, @@ -112,7 +113,7 @@ const routerRequest1: RouterTransformationRequest = { metadata: { ...generateMetadata(5), secret: { - accessToken: 'revoked-accessToken', + accessToken: secret1, }, }, }, @@ -399,7 +400,7 @@ const routerRequest5: RouterTransformationRequest = { ...companyTraits, }, }, - type: 'dummyGroupType', + type: 'dummyGroupType' as MessageType, integrations: { All: true }, originalTimestamp, timestamp, @@ -424,6 +425,7 @@ export const data: RouterTestData[] = [ input: { request: { body: routerRequest1, + method: 'POST', }, }, output: { @@ -542,8 +544,19 @@ export const data: RouterTestData[] = [ }, { batched: false, - error: - '{"message":"Unable to search contact due to","destinationResponse":"{\\"type\\":\\"error.list\\",\\"request_id\\":\\"request_id-1\\",\\"errors\\":[{\\"code\\":\\"unauthorized\\",\\"message\\":\\"Access Token Invalid\\"}]}"}', + error: JSON.stringify({ + message: 'Unable to search contact due to', + destinationResponse: JSON.stringify({ + type: 'error.list', + request_id: 'request_id-1', + errors: [ + { + code: 'unauthorized', + message: 'Access Token Invalid', + }, + ], + }), + }), statTags: { ...RouterNetworkErrorStatTags, errorType: 'retryable', @@ -554,7 +567,7 @@ export const data: RouterTestData[] = [ { ...generateMetadata(5), secret: { - accessToken: 'revoked-accessToken', + accessToken: secret1, }, }, ], @@ -589,6 +602,7 @@ export const data: RouterTestData[] = [ input: { request: { body: routerRequest2, + method: 'POST', }, }, output: { @@ -682,6 +696,7 @@ export const data: RouterTestData[] = [ input: { request: { body: routerRequest3, + method: 'POST', }, }, output: { @@ -807,6 +822,7 @@ export const data: RouterTestData[] = [ input: { request: { body: routerRequest4, + method: 'POST', }, }, output: { @@ -881,6 +897,7 @@ export const data: RouterTestData[] = [ input: { request: { body: routerRequest5, + method: 'POST', }, }, output: { @@ -945,6 +962,7 @@ export const data: RouterTestData[] = [ input: { request: { body: rETLRecordV2RouterRequest, + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/iterable/dataDelivery/business.ts b/test/integrations/destinations/iterable/dataDelivery/business.ts new file mode 100644 index 00000000000..5e62b164fc4 --- /dev/null +++ b/test/integrations/destinations/iterable/dataDelivery/business.ts @@ -0,0 +1,838 @@ +import { ProxyV1TestData } from '../../../testTypes'; +import { generateMetadata, generateProxyV1Payload } from '../../../testUtils'; +import { + correctIdentifyData, + correctTrackData, + headerBlockWithCorrectAccessToken, + partiallyCorrectIdentifyData, + partiallyCorrectTrackData, + wrongIdentifyData, + wrongTrackData, +} from './network'; +import { defaultAccessToken } from '../../../common/secrets'; + +export const statTags = { + destType: 'ITERABLE', + errorCategory: 'network', + destinationId: 'default-destinationId', + workspaceId: 'default-workspaceId', + errorType: 'aborted', + feature: 'dataDelivery', + implementation: 'native', + module: 'destination', +}; + +export const metadata = [generateMetadata(1), generateMetadata(2)]; + +export const singleMetadata = [ + { + jobId: 1, + attemptNum: 1, + userId: 'default-userId', + destinationId: 'default-destinationId', + workspaceId: 'default-workspaceId', + sourceId: 'default-sourceId', + secret: { + accessToken: defaultAccessToken, + }, + dontBatch: false, + }, +]; + +export const singleTrackPayload = { + email: 'sayan@gmail.com', + userId: 'abcdeeeeeeeexxxx102', + eventName: 'Email Opened', + id: '1234', + createdAt: 1598631966468, + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + campaignId: 0, + templateId: 0, + createNewFields: true, +}; + +export const updateEmailData = { + currentEmail: 'sayan', + currentUserId: 'abcdeeeeeeeexxxx102', + newEmail: 'sayan@gmail.com', +}; + +export const testScenariosForV1API: ProxyV1TestData[] = [ + { + id: 'ITERABLE_v1_other_scenario_1', + name: 'iterable', + description: + '[Proxy API] :: Scenario to test correct Payload Response Handling from Destination', + successCriteria: 'Should return 200 status code with success', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: correctTrackData, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/events/trackBulk', + }, + metadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 200, + message: '[ITERABLE Response Handler] - Request Processed Successfully', + destinationResponse: { + status: 200, + response: { + createdFields: [], + disallowedEventNames: [], + failCount: 0, + failedUpdates: { + forgottenEmails: [], + forgottenUserIds: [], + invalidEmails: [], + invalidUserIds: [], + notFoundEmails: [], + notFoundUserIds: [], + }, + filteredOutFields: [], + invalidEmails: [], + invalidUserIds: [], + successCount: 2, + }, + }, + response: [ + { + statusCode: 200, + metadata: generateMetadata(1), + error: 'success', + }, + { + statusCode: 200, + metadata: generateMetadata(2), + error: 'success', + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_2', + name: 'iterable', + description: + '[Proxy API] :: Scenario to test Malformed Payload Response Handling from Destination', + successCriteria: 'Should return 400 status code with error message', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: wrongTrackData, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/events/trackBulk', + }, + metadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 400, + statTags, + message: + 'ITERABLE: Error transformer proxy during ITERABLE response transformation. {"obj.events[1].createdAt":"Number value expected"}', + response: [ + { + statusCode: 400, + metadata: generateMetadata(1), + error: JSON.stringify({ + msg: '[/api/events/trackBulk] Invalid JSON body', + code: 'BadJsonBody', + params: { 'obj.events[1].createdAt': 'Number value expected' }, + }), + }, + { + statusCode: 400, + metadata: generateMetadata(2), + error: JSON.stringify({ + msg: '[/api/events/trackBulk] Invalid JSON body', + code: 'BadJsonBody', + params: { 'obj.events[1].createdAt': 'Number value expected' }, + }), + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_3', + name: 'iterable', + description: + '[Proxy API] :: Scenario to test partially successful Response Handling from Destination', + successCriteria: 'Should return 400 status code with error message', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: partiallyCorrectTrackData, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/events/trackBulk', + }, + metadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 200, + message: '[ITERABLE Response Handler] - Request Processed Successfully', + destinationResponse: { + status: 200, + response: { + successCount: 1, + failCount: 1, + invalidEmails: ['sayan'], + invalidUserIds: [], + disallowedEventNames: [], + filteredOutFields: [], + createdFields: [], + failedUpdates: { + invalidEmails: ['sayan'], + invalidUserIds: [], + notFoundEmails: [], + notFoundUserIds: [], + forgottenEmails: [], + forgottenUserIds: [], + }, + + status: 200, + }, + }, + response: [ + { + statusCode: 400, + metadata: generateMetadata(1), + error: 'email error:"sayan" in "invalidEmails,failedUpdates.invalidEmails".', + }, + { + statusCode: 200, + metadata: generateMetadata(2), + error: 'success', + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_4', + name: 'iterable', + description: + '[Proxy API] :: Scenario to test correct identify Payload Response Handling from Destination', + successCriteria: 'Should return 200 status code with success', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: correctIdentifyData, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/users/bulkUpdate', + }, + metadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 200, + message: '[ITERABLE Response Handler] - Request Processed Successfully', + destinationResponse: { + status: 200, + response: { + createdFields: [], + noOpEmails: [], + noOpUserIds: [], + failCount: 0, + failedUpdates: { + conflictEmails: [], + conflictUserIds: [], + forgottenEmails: [], + forgottenUserIds: [], + invalidEmails: [], + invalidUserIds: [], + notFoundEmails: [], + notFoundUserIds: [], + invalidDataEmails: [], + invalidDataUserIds: [], + }, + filteredOutFields: [], + invalidEmails: [], + invalidUserIds: [], + successCount: 2, + }, + }, + response: [ + { + statusCode: 200, + metadata: generateMetadata(1), + error: 'success', + }, + { + statusCode: 200, + metadata: generateMetadata(2), + error: 'success', + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_5', + name: 'iterable', + description: + '[Proxy API] :: Scenario to test Malformed identify Payload Response Handling from Destination', + successCriteria: 'Should return 400 status code with error message', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: wrongIdentifyData, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/users/bulkUpdate', + }, + metadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 400, + statTags, + message: + 'ITERABLE: Error transformer proxy during ITERABLE response transformation. {"obj.users[1].preferUserId":"Boolean value expected"}', + response: [ + { + statusCode: 400, + metadata: generateMetadata(1), + error: JSON.stringify({ + msg: '[/api/users/bulkUpdate] Invalid JSON body', + code: 'BadJsonBody', + params: { 'obj.users[1].preferUserId': 'Boolean value expected' }, + }), + }, + { + statusCode: 400, + metadata: generateMetadata(2), + error: JSON.stringify({ + msg: '[/api/users/bulkUpdate] Invalid JSON body', + code: 'BadJsonBody', + params: { 'obj.users[1].preferUserId': 'Boolean value expected' }, + }), + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_6', + name: 'iterable', + description: + '[Proxy API] :: Scenario to test partially successful identify Response Handling from Destination', + successCriteria: 'Should return 400 status code with error message', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: partiallyCorrectIdentifyData, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/users/bulkUpdate', + }, + metadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 200, + message: '[ITERABLE Response Handler] - Request Processed Successfully', + destinationResponse: { + status: 200, + response: { + successCount: 1, + failCount: 1, + invalidEmails: ['shrouti'], + invalidUserIds: [], + noOpEmails: [], + noOpUserIds: [], + filteredOutFields: [], + createdFields: [], + failedUpdates: { + invalidEmails: ['shrouti'], + conflictEmails: [], + conflictUserIds: [], + invalidUserIds: [], + notFoundEmails: [], + notFoundUserIds: [], + forgottenEmails: [], + forgottenUserIds: [], + invalidDataEmails: [], + invalidDataUserIds: [], + }, + }, + }, + response: [ + { + statusCode: 200, + metadata: generateMetadata(1), + error: 'success', + }, + { + statusCode: 400, + metadata: generateMetadata(2), + error: 'email error:"shrouti" in "invalidEmails,failedUpdates.invalidEmails".', + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_7', + name: 'iterable', + description: + '[Proxy API] :: Scenario to test partially unsuccessful updateEmail Response Handling from Destination', + successCriteria: 'Should return 400 status code with error message', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: updateEmailData, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/users/updateEmail', + }, + singleMetadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 400, + statTags, + message: + 'ITERABLE: Error transformer proxy during ITERABLE response transformation. "Invalid currentEmail sayan"', + response: [ + { + statusCode: 400, + metadata: generateMetadata(1), + error: JSON.stringify({ + msg: 'Invalid currentEmail sayan', + code: 'InvalidEmailAddressError', + params: null, + }), + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_8', + name: 'iterable', + description: + '[Proxy API] :: Scenario to test single track correct Payload Response Handling from Destination', + successCriteria: 'Should return 200 status code with success', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: singleTrackPayload, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/events/track', + }, + singleMetadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 200, + message: '[ITERABLE Response Handler] - Request Processed Successfully', + destinationResponse: { + status: 200, + response: { + msg: 'Event with id: 1234 tracked.', + code: 'Success', + params: { + id: '1234', + }, + }, + }, + response: [ + { + statusCode: 200, + metadata: generateMetadata(1), + error: 'success', + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_9', + name: 'iterable', + description: + '[Proxy API] :: Scenario to wrong sinle track event Response Handling from Destination', + successCriteria: 'Should return 400 status code with error message', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: { ...singleTrackPayload, email: 'sayan' }, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/events/track', + }, + singleMetadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 400, + statTags, + message: + 'ITERABLE: Error transformer proxy during ITERABLE response transformation. "Invalid email: sayan"', + response: [ + { + statusCode: 400, + metadata: generateMetadata(1), + error: JSON.stringify({ + msg: 'Invalid email: sayan', + code: 'InvalidEmailAddressError', + params: null, + }), + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_10', + name: 'iterable', + description: + '[Proxy API] :: Scenario to wrong single track event for catalogs Response Handling from Destination', + successCriteria: 'Should return 400 status code with error message', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: { + documents: { + Tiffany: { ruchira: 'donaldbaker@ellis.com', new_field2: 'GB' }, + ABC: { ruchira: 'abc@ellis.com', new_field2: 'GB1' }, + }, + replaceUploadedFieldsOnly: true, + }, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/catalogs/rudder-test/items', + }, + singleMetadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 404, + statTags, + message: + 'ITERABLE: Error transformer proxy during ITERABLE response transformation. "Catalog not found: rudder-test"', + response: [ + { + statusCode: 404, + metadata: generateMetadata(1), + error: JSON.stringify({ + error: 'NotFound', + message: 'Catalog not found: rudder-test', + code: 'error.catalogs.notFound', + data: { args: ['rudder-test'] }, + }), + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_11', + name: 'iterable', + description: + '[Proxy API] :: Scenario to test catalog track correct Payload Response Handling from Destination', + successCriteria: 'Should return 200 status code with success', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: { + documents: { + Tiffany: { ruchira: 'donaldbaker@ellis.com', new_field2: 'GB' }, + ABC: { ruchira: 'abc@ellis.com', new_field2: 'GB1' }, + }, + replaceUploadedFieldsOnly: true, + }, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/catalogs/test-ruchira/items', + }, + singleMetadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 200, + message: '[ITERABLE Response Handler] - Request Processed Successfully', + destinationResponse: { + status: 200, + response: { + code: 'Success', + msg: 'Request to bulk-upload documents into test-ruchira processed successfully', + params: null, + }, + }, + response: [ + { + statusCode: 200, + metadata: generateMetadata(1), + error: 'success', + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_12', + name: 'iterable', + description: + '[Proxy API] :: Scenario to correct device token registration event Response Handling from Destination with wrong permission', + successCriteria: 'Should return 400 status code with error message', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: { + email: 'sayan@gmail.com', + device: { + token: '1234', + platform: 'APNS', + applicationName: 'rudder', + dataFields: {}, + }, + userId: 'abcdeeeeeeeexxxx102', + preferUserId: true, + }, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/users/registerDeviceToken', + }, + singleMetadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 401, + statTags, + message: + 'ITERABLE: Error transformer proxy during ITERABLE response transformation. {"ip":"103.189.130.133","endpoint":"/api/users/registerDeviceToken","apiKeyIdentifier":"af831922","apiKeyType":"ServerSide"}', + response: [ + { + statusCode: 401, + metadata: generateMetadata(1), + error: JSON.stringify({ + msg: 'Disabled API key or insufficient privileges', + code: 'BadApiKey', + params: { + ip: '103.189.130.133', + endpoint: '/api/users/registerDeviceToken', + apiKeyIdentifier: 'af831922', + apiKeyType: 'ServerSide', + }, + }), + }, + ], + }, + }, + }, + }, + }, + { + id: 'ITERABLE_v1_other_scenario_13', + name: 'iterable', + description: + '[Proxy API] :: Scenario to correct browser token registration event Response Handling from Destination with wrong permission', + successCriteria: 'Should return 400 status code with error message', + scenario: 'Business', + feature: 'dataDelivery', + module: 'destination', + version: 'v1', + input: { + request: { + body: generateProxyV1Payload( + { + JSON: { + email: 'sayan@gmail.com', + browserToken: '1234567', + userId: 'abcdeeeeeeeexxxx102', + }, + headers: headerBlockWithCorrectAccessToken, + endpoint: 'https://api.iterable.com/api/users/registerBrowserToken', + }, + singleMetadata, + ), + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 401, + statTags, + message: + 'ITERABLE: Error transformer proxy during ITERABLE response transformation. {"ip":"103.189.130.129","endpoint":"/api/users/registerBrowserToken","apiKeyIdentifier":"af831922","apiKeyType":"ServerSide"}', + response: [ + { + statusCode: 401, + metadata: generateMetadata(1), + error: JSON.stringify({ + msg: 'Disabled API key or insufficient privileges', + code: 'BadApiKey', + params: { + ip: '103.189.130.129', + endpoint: '/api/users/registerBrowserToken', + apiKeyIdentifier: 'af831922', + apiKeyType: 'ServerSide', + }, + }), + }, + ], + }, + }, + }, + }, + }, +]; diff --git a/test/integrations/destinations/iterable/dataDelivery/data.ts b/test/integrations/destinations/iterable/dataDelivery/data.ts new file mode 100644 index 00000000000..fc969bb8e1a --- /dev/null +++ b/test/integrations/destinations/iterable/dataDelivery/data.ts @@ -0,0 +1,3 @@ +import { testScenariosForV1API } from './business'; + +export const data = [...testScenariosForV1API]; diff --git a/test/integrations/destinations/iterable/dataDelivery/network.ts b/test/integrations/destinations/iterable/dataDelivery/network.ts new file mode 100644 index 00000000000..72189581be9 --- /dev/null +++ b/test/integrations/destinations/iterable/dataDelivery/network.ts @@ -0,0 +1,575 @@ +export const headerBlockWithCorrectAccessToken = { + 'Content-Type': 'application/json', + api_key: 'DUMMY_API_KEY', +}; + +export const headerBlockWithWrongAccessToken = { + 'Content-Type': 'application/json', + api_key: 'DUMMY_WRONG_API_KEY', +}; +export const correctTrackData = { + events: [ + { + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + email: 'sayan@gmail.com', + userId: 'abcdeeeeeeeexxxx102', + eventName: 'Email Opened', + createdAt: 1598631966468, + }, + { + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'pradip@gmail.com', + }, + email: 'pradip@gmail.com', + userId: 'abcdeeeeeeeexxxx102', + eventName: 'Email Opened', + createdAt: 1598631966468, + }, + ], +}; + +export const wrongTrackData = { + events: [ + { + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + email: 'sayan', + userId: 'abcdeeeeeeeexxxx102', + eventName: 'Email Opened', + createdAt: 'abc', + }, + { + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'pradip@gmail.com', + }, + email: 'pradip@gmail.com', + userId: 'abcdeeeeeeeexxxx102', + eventName: 'Email Opened', + createdAt: 1598631966468, + }, + ], +}; + +export const partiallyCorrectTrackData = { + events: [ + { + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + email: 'sayan', + userId: 'abcdeeeeeeeexxxx102', + eventName: 'Email Opened', + createdAt: 1598631966468, + }, + { + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'pradip@gmail.com', + }, + email: 'pradip@gmail.com', + userId: 'abcdeeeeeeeexxxx102', + eventName: 'Email Opened', + createdAt: 1598631966468, + }, + ], +}; + +export const correctIdentifyData = { + users: [ + { + email: 'manashi@website.com', + dataFields: { + city: 'Bangalore', + name: 'manashi', + email: 'manashi@website.com', + country: 'India', + }, + userId: 'abcdeeeeeeeexxxx102', + preferUserId: true, + mergeNestedObjects: true, + }, + { + email: 'shrouti@website.com', + dataFields: { + city: 'Bangalore', + name: 'shrouti', + email: 'shrouti@website.com', + country: 'India', + }, + userId: 'abcdeeeegggggxxxx102', + preferUserId: true, + mergeNestedObjects: true, + }, + ], +}; + +export const wrongIdentifyData = { + users: [ + { + email: 'manashi@website.com', + dataFields: { + city: 'Bangalore', + name: 'manashi', + email: 'manashi@website.com', + country: 'India', + }, + userId: 'abcdeeeeeeeexxxx102', + preferUserId: true, + mergeNestedObjects: true, + }, + { + email: 'shrouti@website.com', + dataFields: { + city: 'Bangalore', + name: 'shrouti', + email: 'shrouti@website.com', + country: 'India', + }, + userId: 'abcdeeeegggggxxxx102', + preferUserId: 'abc', + mergeNestedObjects: true, + }, + ], +}; + +export const partiallyCorrectIdentifyData = { + users: [ + { + email: 'manashi@website.com', + dataFields: { + city: 'Bangalore', + name: 'manashi', + email: 'manashi@website.com', + country: 'India', + }, + userId: 'abcdeeeeeeeexxxx102', + preferUserId: true, + mergeNestedObjects: true, + }, + { + email: 'shrouti', + dataFields: { + city: 'Bangalore', + name: 'shrouti', + email: 'shrouti@website.com', + country: 'India', + }, + userId: 'abcdeeeegggggxxxx102', + preferUserId: true, + mergeNestedObjects: true, + }, + ], +}; + +// MOCK DATA +const businessMockData = [ + { + description: 'Mock response from destination depicting request with a correct track payload', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/events/trackBulk', + headers: headerBlockWithCorrectAccessToken, + data: correctTrackData, + }, + httpRes: { + data: { + successCount: 2, + failCount: 0, + invalidEmails: [], + invalidUserIds: [], + disallowedEventNames: [], + filteredOutFields: [], + createdFields: [], + failedUpdates: { + invalidEmails: [], + invalidUserIds: [], + notFoundEmails: [], + notFoundUserIds: [], + forgottenEmails: [], + forgottenUserIds: [], + }, + }, + status: 200, + statusText: 'OK', + }, + }, + { + description: + 'Mock response from destination depicting request with a partially wrong track payload', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/events/trackBulk', + headers: headerBlockWithCorrectAccessToken, + data: partiallyCorrectTrackData, + }, + httpRes: { + data: { + successCount: 1, + failCount: 1, + invalidEmails: ['sayan'], + invalidUserIds: [], + disallowedEventNames: [], + filteredOutFields: [], + createdFields: [], + failedUpdates: { + invalidEmails: ['sayan'], + invalidUserIds: [], + notFoundEmails: [], + notFoundUserIds: [], + forgottenEmails: [], + forgottenUserIds: [], + }, + + status: 200, + }, + status: 200, + statusText: 'OK', + }, + }, + { + description: 'Mock response from destination depicting request with a wrong data', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/events/trackBulk', + headers: headerBlockWithCorrectAccessToken, + data: wrongTrackData, + }, + httpRes: { + data: { + msg: '[/api/events/trackBulk] Invalid JSON body', + code: 'BadJsonBody', + params: { + 'obj.events[1].createdAt': 'Number value expected', + }, + }, + status: 400, + }, + }, + { + description: + 'Mock response from destination depicting request with a correct track payload but wrong API key', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/events/trackBulk', + headers: { ...headerBlockWithCorrectAccessToken, api_key: 'WRONG_API_KEY' }, + data: correctTrackData, + }, + httpRes: { + data: { + msg: 'Invalid API key', + code: 'BadApiKey', + params: { + ip: '152.58.182.124', + endpoint: '/api/events/trackBulk', + }, + }, + status: 401, + }, + }, + { + description: 'Mock response from destination depicting request with a correct Identify payload', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/users/bulkUpdate', + headers: headerBlockWithCorrectAccessToken, + data: correctIdentifyData, + }, + httpRes: { + data: { + successCount: 2, + failCount: 0, + invalidEmails: [], + invalidUserIds: [], + filteredOutFields: [], + createdFields: [], + noOpEmails: [], + noOpUserIds: [], + failedUpdates: { + invalidEmails: [], + invalidUserIds: [], + notFoundEmails: [], + notFoundUserIds: [], + invalidDataEmails: [], + invalidDataUserIds: [], + conflictEmails: [], + conflictUserIds: [], + forgottenEmails: [], + forgottenUserIds: [], + }, + }, + status: 200, + statusText: 'OK', + }, + }, + { + description: + 'Mock response from destination depicting identify request with a partially wrong track payload', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/users/bulkUpdate', + headers: headerBlockWithCorrectAccessToken, + data: partiallyCorrectIdentifyData, + }, + httpRes: { + data: { + successCount: 1, + failCount: 1, + invalidEmails: ['shrouti'], + invalidUserIds: [], + filteredOutFields: [], + createdFields: [], + noOpEmails: [], + noOpUserIds: [], + failedUpdates: { + invalidEmails: ['shrouti'], + invalidUserIds: [], + notFoundEmails: [], + notFoundUserIds: [], + invalidDataEmails: [], + invalidDataUserIds: [], + conflictEmails: [], + conflictUserIds: [], + forgottenEmails: [], + forgottenUserIds: [], + }, + }, + status: 200, + statusText: 'OK', + }, + }, + { + description: 'Mock response from destination depicting identify request with a wrong data', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/users/bulkUpdate', + headers: headerBlockWithCorrectAccessToken, + data: wrongIdentifyData, + }, + httpRes: { + data: { + msg: '[/api/users/bulkUpdate] Invalid JSON body', + code: 'BadJsonBody', + params: { + 'obj.users[1].preferUserId': 'Boolean value expected', + }, + }, + status: 400, + }, + }, + { + description: 'Mock response from destination depicting update email request with a wrong data', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/users/updateEmail', + headers: headerBlockWithCorrectAccessToken, + data: { + currentEmail: 'sayan', + currentUserId: 'abcdeeeeeeeexxxx102', + newEmail: 'sayan@gmail.com', + }, + }, + httpRes: { + data: { + msg: 'Invalid currentEmail sayan', + code: 'InvalidEmailAddressError', + params: null, + }, + status: 400, + }, + }, + { + description: + 'Mock response from destination depicting request with a correct single track payload', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/events/track', + headers: headerBlockWithCorrectAccessToken, + data: { + email: 'sayan@gmail.com', + userId: 'abcdeeeeeeeexxxx102', + eventName: 'Email Opened', + id: '1234', + createdAt: 1598631966468, + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + campaignId: 0, + templateId: 0, + createNewFields: true, + }, + }, + httpRes: { + data: { + msg: 'Event with id: 1234 tracked.', + code: 'Success', + params: { + id: '1234', + }, + }, + status: 200, + statusText: 'OK', + }, + }, + { + description: + 'Mock response from destination depicting request with a wrong email single track payload', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/events/track', + headers: headerBlockWithCorrectAccessToken, + data: { + email: 'sayan', + userId: 'abcdeeeeeeeexxxx102', + eventName: 'Email Opened', + id: '1234', + createdAt: 1598631966468, + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + campaignId: 0, + templateId: 0, + createNewFields: true, + }, + }, + httpRes: { + data: { + msg: 'Invalid email: sayan', + code: 'InvalidEmailAddressError', + params: null, + }, + status: 400, + }, + }, + { + description: + 'Mock response from destination depicting request with a correct catalog bulk payload', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/catalogs/rudder-test/items', + headers: headerBlockWithCorrectAccessToken, + data: { + documents: { + Tiffany: { ruchira: 'donaldbaker@ellis.com', new_field2: 'GB' }, + ABC: { ruchira: 'abc@ellis.com', new_field2: 'GB1' }, + }, + replaceUploadedFieldsOnly: true, + }, + }, + httpRes: { + data: { + error: 'NotFound', + message: 'Catalog not found: rudder-test', + code: 'error.catalogs.notFound', + data: { + args: ['rudder-test'], + }, + }, + status: 404, + }, + }, + { + description: + 'Mock response from destination depicting request with a correct catalog track payload', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/catalogs/test-ruchira/items', + headers: headerBlockWithCorrectAccessToken, + data: { + documents: { + Tiffany: { ruchira: 'donaldbaker@ellis.com', new_field2: 'GB' }, + ABC: { ruchira: 'abc@ellis.com', new_field2: 'GB1' }, + }, + replaceUploadedFieldsOnly: true, + }, + }, + httpRes: { + data: { + msg: 'Request to bulk-upload documents into test-ruchira processed successfully', + code: 'Success', + params: null, + }, + status: 200, + statusText: 'OK', + }, + }, + { + description: + 'Mock response from destination depicting request with a correct register device token payload with insufficient permission', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/users/registerDeviceToken', + headers: headerBlockWithCorrectAccessToken, + data: { + email: 'sayan@gmail.com', + device: { + token: '1234', + platform: 'APNS', + applicationName: 'rudder', + dataFields: {}, + }, + userId: 'abcdeeeeeeeexxxx102', + preferUserId: true, + }, + }, + httpRes: { + data: { + msg: 'Disabled API key or insufficient privileges', + code: 'BadApiKey', + params: { + ip: '103.189.130.133', + endpoint: '/api/users/registerDeviceToken', + apiKeyIdentifier: 'af831922', + apiKeyType: 'ServerSide', + }, + }, + status: 401, + }, + }, + { + description: + 'Mock response from destination depicting request with a correct registerbrowswer token payload with insufficient permission', + httpReq: { + method: 'POST', + url: 'https://api.iterable.com/api/users/registerBrowserToken', + headers: headerBlockWithCorrectAccessToken, + data: { + email: 'sayan@gmail.com', + browserToken: '1234567', + userId: 'abcdeeeeeeeexxxx102', + }, + }, + httpRes: { + data: { + msg: 'Disabled API key or insufficient privileges', + code: 'BadApiKey', + params: { + ip: '103.189.130.129', + endpoint: '/api/users/registerBrowserToken', + apiKeyIdentifier: 'af831922', + apiKeyType: 'ServerSide', + }, + }, + status: 401, + }, + }, +]; + +export const networkCallsData = [...businessMockData]; diff --git a/test/integrations/destinations/iterable/deleteUsers/data.ts b/test/integrations/destinations/iterable/deleteUsers/data.ts index 9e7eab1ee13..b20708134d8 100644 --- a/test/integrations/destinations/iterable/deleteUsers/data.ts +++ b/test/integrations/destinations/iterable/deleteUsers/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + const destType = 'iterable'; export const data = [ @@ -50,7 +52,7 @@ export const data = [ }, ], config: { - apiToken: 'dummyApiKey', + apiToken: defaultApiKey, }, }, ], @@ -88,7 +90,7 @@ export const data = [ }, ], config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, }, }, ], @@ -165,7 +167,7 @@ export const data = [ }, ], config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, }, }, ], @@ -200,7 +202,7 @@ export const data = [ }, ], config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, dataCenter: 'EUDC', }, }, diff --git a/test/integrations/destinations/iterable/network.ts b/test/integrations/destinations/iterable/network.ts index 1cf26dfd4f4..06f7167ee27 100644 --- a/test/integrations/destinations/iterable/network.ts +++ b/test/integrations/destinations/iterable/network.ts @@ -1,10 +1,12 @@ +import { defaultApiKey } from '../../common/secrets'; + const deleteNwData = [ { httpReq: { method: 'delete', url: 'https://api.iterable.com/api/users/byUserId/rudder1', headers: { - api_key: 'dummyApiKey', + api_key: defaultApiKey, }, }, httpRes: { @@ -21,7 +23,7 @@ const deleteNwData = [ method: 'delete', url: 'https://api.iterable.com/api/users/byUserId/rudder2', headers: { - api_key: 'dummyApiKey', + api_key: defaultApiKey, }, }, httpRes: { @@ -76,7 +78,7 @@ const deleteNwData = [ method: 'delete', url: 'https://api.iterable.com/api/users/byUserId/rudder5', headers: { - api_key: 'dummyApiKey', + api_key: defaultApiKey, }, }, httpRes: { @@ -93,7 +95,7 @@ const deleteNwData = [ method: 'delete', url: 'https://api.iterable.com/api/users/byUserId/rudder6', headers: { - api_key: 'dummyApiKey', + api_key: defaultApiKey, }, }, httpRes: { @@ -110,7 +112,7 @@ const deleteNwData = [ method: 'delete', url: 'https://api.eu.iterable.com/api/users/byUserId/rudder7', headers: { - api_key: 'dummyApiKey', + api_key: defaultApiKey, }, }, httpRes: { diff --git a/test/integrations/destinations/iterable/processor/aliasTestData.ts b/test/integrations/destinations/iterable/processor/aliasTestData.ts index 1ee41348596..e99870adea7 100644 --- a/test/integrations/destinations/iterable/processor/aliasTestData.ts +++ b/test/integrations/destinations/iterable/processor/aliasTestData.ts @@ -1,10 +1,40 @@ -import { - generateMetadata, - overrideDestination, - transformResultBuilder, -} from './../../../testUtils'; -import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; +import { Destination, Metadata } from '../../../../../src/types'; +import { overrideDestination } from '../../../testUtils'; + +const baseMetadata: Partial = { + sourceId: 'default-sourceId', + workspaceId: 'default-workspaceId', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destinationId', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2025-01-06T04:12:38.713Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, +}; const destination: Destination = { ID: '123', @@ -29,23 +59,6 @@ const destination: Destination = { Enabled: true, }; -const headers = { - api_key: 'testApiKey', - 'Content-Type': 'application/json', -}; - -const properties = { - path: '/abc', - referrer: '', - search: '', - title: '', - url: '', - category: 'test-category', -}; - -const sentAt = '2020-08-28T16:26:16.473Z'; -const originalTimestamp = '2020-08-28T16:26:06.468Z'; - export const aliasTestData: ProcessorTestData[] = [ { id: 'iterable-alias-test-1', @@ -59,21 +72,29 @@ export const aliasTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { anonymousId: 'anonId', userId: 'new@email.com', previousId: 'old@email.com', name: 'ApplicationLoaded', context: {}, - properties, + properties: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, type: 'alias', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', }, - metadata: generateMetadata(1), + metadata: baseMetadata, + destination, }, ], }, @@ -83,17 +104,30 @@ export const aliasTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, + method: 'POST', endpoint: 'https://api.iterable.com/api/users/updateEmail', - JSON: { - currentEmail: 'old@email.com', - newEmail: 'new@email.com', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + currentEmail: 'old@email.com', + newEmail: 'new@email.com', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, }, - }), + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -111,21 +145,29 @@ export const aliasTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: overrideDestination(destination, { dataCenter: 'EUDC' }), message: { anonymousId: 'anonId', userId: 'new@email.com', previousId: 'old@email.com', name: 'ApplicationLoaded', context: {}, - properties, + properties: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, type: 'alias', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', }, - metadata: generateMetadata(1), + metadata: baseMetadata, + destination: overrideDestination(destination, { dataCenter: 'EUDC' }), }, ], }, @@ -135,17 +177,30 @@ export const aliasTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, + method: 'POST', endpoint: 'https://api.eu.iterable.com/api/users/updateEmail', - JSON: { - currentEmail: 'old@email.com', - newEmail: 'new@email.com', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', }, - }), + params: {}, + body: { + JSON: { + currentEmail: 'old@email.com', + newEmail: 'new@email.com', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, diff --git a/test/integrations/destinations/iterable/processor/identifyTestData.ts b/test/integrations/destinations/iterable/processor/identifyTestData.ts index 21d294e2322..078df56c5ee 100644 --- a/test/integrations/destinations/iterable/processor/identifyTestData.ts +++ b/test/integrations/destinations/iterable/processor/identifyTestData.ts @@ -1,65 +1,415 @@ -import { - generateMetadata, - transformResultBuilder, - generateIndentifyPayload, - overrideDestination, -} from './../../../testUtils'; -import { Destination } from '../../../../../src/types'; +import { Metadata } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; -const destination: Destination = { - ID: '123', - Name: 'iterable', - DestinationDefinition: { - ID: '123', - Name: 'iterable', - DisplayName: 'Iterable', - Config: {}, - }, - WorkspaceID: '123', - Transformations: [], - Config: { - apiKey: 'testApiKey', - dataCenter: 'USDC', - preferUserId: false, - trackAllPages: true, - trackNamedPages: false, - mapToSingleEvent: false, - trackCategorisedPages: false, - }, - Enabled: true, -}; - -const headers = { - api_key: 'testApiKey', - 'Content-Type': 'application/json', -}; - -const user1Traits = { - name: 'manashi', - country: 'India', - city: 'Bangalore', - email: 'manashi@website.com', -}; - -const user2Traits = { - am_pm: 'AM', - pPower: 'AM', - boolean: true, - userId: 'Jacqueline', - firstname: 'Jacqueline', - administrative_unit: 'Minnesota', +const baseMetadata: Partial = { + sourceId: 'default-sourceId', + workspaceId: 'default-workspaceId', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destinationId', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2025-01-06T03:57:13.523Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, }; -const userId = 'userId'; -const anonymousId = 'anonId'; -const sentAt = '2020-08-28T16:26:16.473Z'; -const originalTimestamp = '2020-08-28T16:26:06.468Z'; - -const updateUserEndpoint = 'https://api.iterable.com/api/users/update'; -const updateUserEndpointEUDC = 'https://api.eu.iterable.com/api/users/update'; - export const identifyTestData: ProcessorTestData[] = [ + { + id: 'iterable-identify-test-has-multiple-responses', + name: 'iterable', + description: 'Indentify call to verify hasMultipleResponses', + scenario: 'Business', + successCriteria: + 'Response should contain status code 200 and it should contain update user payload with new email sent in payload', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + type: 'identify', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', + context: { + os: { + name: '', + version: '1.12.3', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + traits: { + email: 'ruchira@rudderlabs.com', + }, + locale: 'en-US', + device: { + token: 'token', + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', + }, + rudderId: '62amo6xzksaeyupr4y0pfaucwj0upzs6g7yx', + messageId: 'hk02avz2xijdkid4i0mvncbm478g9lybdpgc', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + registerDeviceOrBrowserApiKey: 'randomApiKey', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + userId: '', + method: 'POST', + endpoint: 'https://api.iterable.com/api/users/update', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + email: 'ruchira@rudderlabs.com', + userId: 'userId', + dataFields: { + email: 'ruchira@rudderlabs.com', + }, + preferUserId: false, + mergeNestedObjects: true, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, + statusCode: 200, + }, + { + output: { + body: { + FORM: {}, + JSON: { + device: { + platform: 'APNS', + token: 'token', + }, + email: 'ruchira@rudderlabs.com', + preferUserId: false, + userId: 'userId', + }, + JSON_ARRAY: {}, + XML: {}, + }, + endpoint: 'https://api.iterable.com/api/users/registerDeviceToken', + files: {}, + headers: { + 'Content-Type': 'application/json', + api_key: 'randomApiKey', + }, + method: 'POST', + params: {}, + type: 'REST', + userId: '', + version: '1', + }, + metadata: baseMetadata, + statusCode: 200, + }, + ], + }, + }, + }, + { + id: 'iterable-identify-test-has-multiple-responses', + name: 'iterable', + description: 'Indentify call to verify hasMultipleResponses', + scenario: 'Business', + successCriteria: + 'Response should contain status code 200 and it should contain update user payload with new email sent in payload', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + type: 'identify', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', + context: { + os: { + name: '', + version: '1.12.3', + token: 'randomBrowserToken', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + traits: { + email: 'ruchira@rudderlabs.com', + }, + locale: 'en-US', + device: { + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', + }, + rudderId: '62amo6xzksaeyupr4y0pfaucwj0upzs6g7yx', + messageId: 'hk02avz2xijdkid4i0mvncbm478g9lybdpgc', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + registerDeviceOrBrowserApiKey: 'randomApiKey', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: { + destinationDefinitionId: 'default-dest-def', + destinationId: 'default-destinationId', + destinationType: 'default-destination-type', + dontBatch: false, + eventName: 'default-event', + eventType: 'default-type', + instanceId: 'default-instance', + jobId: 1, + jobRunId: 'default-job-run', + mergedTpConfig: {}, + messageId: 'default-message-id', + messageIds: ['default-message-id'], + namespace: 'default-namespace', + oauthAccessToken: 'default-token', + receivedAt: '2025-01-06T03:57:13.523Z', + recordId: {}, + rudderId: 'default-rudder-id', + sourceBatchId: 'default-batch', + sourceCategory: 'default-category', + sourceDefinitionId: 'default-source-def', + sourceId: 'default-sourceId', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + sourceTpConfig: {}, + sourceType: 'default-source-type', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + transformationId: 'default-transform', + workspaceId: 'default-workspaceId', + }, + output: { + body: { + FORM: {}, + JSON: { + dataFields: { + email: 'ruchira@rudderlabs.com', + }, + email: 'ruchira@rudderlabs.com', + mergeNestedObjects: true, + preferUserId: false, + userId: 'userId', + }, + JSON_ARRAY: {}, + XML: {}, + }, + endpoint: 'https://api.iterable.com/api/users/update', + files: {}, + headers: { + 'Content-Type': 'application/json', + api_key: 'testApiKey', + }, + method: 'POST', + params: {}, + type: 'REST', + userId: '', + version: '1', + }, + statusCode: 200, + }, + { + metadata: { + destinationDefinitionId: 'default-dest-def', + destinationId: 'default-destinationId', + destinationType: 'default-destination-type', + dontBatch: false, + eventName: 'default-event', + eventType: 'default-type', + instanceId: 'default-instance', + jobId: 1, + jobRunId: 'default-job-run', + mergedTpConfig: {}, + messageId: 'default-message-id', + messageIds: ['default-message-id'], + namespace: 'default-namespace', + oauthAccessToken: 'default-token', + receivedAt: '2025-01-06T03:57:13.523Z', + recordId: {}, + rudderId: 'default-rudder-id', + sourceBatchId: 'default-batch', + sourceCategory: 'default-category', + sourceDefinitionId: 'default-source-def', + sourceId: 'default-sourceId', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + sourceTpConfig: {}, + sourceType: 'default-source-type', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + transformationId: 'default-transform', + workspaceId: 'default-workspaceId', + }, + output: { + body: { + FORM: {}, + JSON: { + browserToken: 'randomBrowserToken', + email: 'ruchira@rudderlabs.com', + userId: 'userId', + }, + JSON_ARRAY: {}, + XML: {}, + }, + endpoint: 'https://api.iterable.com/api/users/registerBrowserToken', + files: {}, + headers: { + 'Content-Type': 'application/json', + api_key: 'randomApiKey', + }, + method: 'POST', + params: {}, + type: 'REST', + userId: '', + version: '1', + }, + statusCode: 200, + }, + ], + }, + }, + }, { id: 'iterable-identify-test-1', name: 'iterable', @@ -72,20 +422,55 @@ export const identifyTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { - anonymousId, + anonymousId: 'anonId', context: { - traits: user1Traits, + traits: { + name: 'manashi', + country: 'India', + city: 'Bangalore', + email: 'manashi@website.com', + }, + }, + traits: { + name: 'manashi', + country: 'India', + city: 'Bangalore', + email: 'manashi@website.com', }, - traits: user1Traits, type: 'identify', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -95,20 +480,38 @@ export const identifyTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: updateUserEndpoint, - JSON: { - email: user1Traits.email, - userId: anonymousId, - dataFields: user1Traits, - preferUserId: false, - mergeNestedObjects: true, + method: 'POST', + endpoint: 'https://api.iterable.com/api/users/update', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + email: 'manashi@website.com', + userId: 'anonId', + dataFields: { + name: 'manashi', + country: 'India', + city: 'Bangalore', + email: 'manashi@website.com', + }, + preferUserId: false, + mergeNestedObjects: true, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, }, - }), + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -126,20 +529,76 @@ export const identifyTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, - message: generateIndentifyPayload({ - userId, - anonymousId, + message: { + type: 'identify', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', context: { - traits: { email: 'ruchira@rudderlabs.com' }, + os: { + name: '', + version: '1.12.3', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + traits: { + email: 'ruchira@rudderlabs.com', + }, + locale: 'en-US', + device: { + token: 'token', + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', }, - type: 'identify', - sentAt, - originalTimestamp, - }), - metadata: generateMetadata(1), + rudderId: '62amo6xzksaeyupr4y0pfaucwj0upzs6g7yx', + messageId: 'hk02avz2xijdkid4i0mvncbm478g9lybdpgc', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], }, @@ -149,22 +608,35 @@ export const identifyTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: updateUserEndpoint, - JSON: { - email: 'ruchira@rudderlabs.com', - userId, - dataFields: { + method: 'POST', + endpoint: 'https://api.iterable.com/api/users/update', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { email: 'ruchira@rudderlabs.com', + userId: 'userId', + dataFields: { + email: 'ruchira@rudderlabs.com', + }, + preferUserId: false, + mergeNestedObjects: true, }, - preferUserId: false, - mergeNestedObjects: true, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, }, - }), + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -182,20 +654,76 @@ export const identifyTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { ...destination, Config: { ...destination.Config, preferUserId: true } }, - message: generateIndentifyPayload({ - userId, - anonymousId, + message: { + type: 'identify', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', context: { - traits: { email: 'ruchira@rudderlabs.com' }, + os: { + name: '', + version: '1.12.3', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, + traits: { + email: 'ruchira@rudderlabs.com', + }, + locale: 'en-US', + device: { + token: 'token', + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', }, - type: 'identify', - sentAt, - originalTimestamp, - }), - metadata: generateMetadata(1), + rudderId: '1bbuv14fd7e8ogmsx7prcmw6ob37aq1zj6mo', + messageId: '1y56axyob5fp3lg3b1y1pij50kp15pyc2ubj', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: true, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], }, @@ -205,22 +733,35 @@ export const identifyTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: updateUserEndpoint, - JSON: { - email: 'ruchira@rudderlabs.com', - userId, - dataFields: { + method: 'POST', + endpoint: 'https://api.iterable.com/api/users/update', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { email: 'ruchira@rudderlabs.com', + userId: 'userId', + dataFields: { + email: 'ruchira@rudderlabs.com', + }, + preferUserId: true, + mergeNestedObjects: true, }, - preferUserId: true, - mergeNestedObjects: true, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, }, - }), + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -239,21 +780,77 @@ export const identifyTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { ...destination, Config: { ...destination.Config, preferUserId: true } }, - message: generateIndentifyPayload({ - userId, - anonymousId, + message: { + type: 'identify', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', context: { + os: { + name: '', + version: '1.12.3', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, traits: {}, + locale: 'en-US', + device: { + token: 'token', + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', }, - traits: { email: 'ruchira@rudderlabs.com' }, - type: 'identify', - sentAt, - originalTimestamp, - }), - metadata: generateMetadata(1), + traits: { + email: 'ruchira@rudderlabs.com', + }, + rudderId: 'iakido48935yw0kmw2swvjldsqoaophjzlhe', + messageId: 'hzycemnjaxr9cuqyyh003x9zlwfqnvbgzv4n', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: true, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], }, @@ -263,22 +860,35 @@ export const identifyTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: updateUserEndpoint, - JSON: { - email: 'ruchira@rudderlabs.com', - userId, - dataFields: { + method: 'POST', + endpoint: 'https://api.iterable.com/api/users/update', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { email: 'ruchira@rudderlabs.com', + userId: 'userId', + dataFields: { + email: 'ruchira@rudderlabs.com', + }, + preferUserId: true, + mergeNestedObjects: true, }, - preferUserId: true, - mergeNestedObjects: true, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, }, - }), + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -296,12 +906,12 @@ export const identifyTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { ...destination, Config: { ...destination.Config, preferUserId: true } }, message: { - userId, - anonymousId, + userId: 'userId', + anonymousId: 'anonId', context: { externalId: [ { @@ -312,12 +922,44 @@ export const identifyTestData: ProcessorTestData[] = [ ], mappedToDestination: 'true', }, - traits: user2Traits, + traits: { + am_pm: 'AM', + pPower: 'AM', + boolean: true, + userId: 'Jacqueline', + firstname: 'Jacqueline', + administrative_unit: 'Minnesota', + }, type: 'identify', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: true, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -327,20 +969,41 @@ export const identifyTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: updateUserEndpoint, - JSON: { - email: 'lynnanderson@smith.net', - userId, - dataFields: { ...user2Traits, email: 'lynnanderson@smith.net' }, - preferUserId: true, - mergeNestedObjects: true, + method: 'POST', + endpoint: 'https://api.iterable.com/api/users/update', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', }, - }), + params: {}, + body: { + JSON: { + email: 'lynnanderson@smith.net', + userId: 'userId', + dataFields: { + am_pm: 'AM', + pPower: 'AM', + boolean: true, + userId: 'Jacqueline', + firstname: 'Jacqueline', + administrative_unit: 'Minnesota', + email: 'lynnanderson@smith.net', + }, + preferUserId: true, + mergeNestedObjects: true, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -358,12 +1021,12 @@ export const identifyTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { userId: 'Matthew', - anonymousId, + anonymousId: 'anonId', context: { externalId: [ { @@ -374,12 +1037,44 @@ export const identifyTestData: ProcessorTestData[] = [ ], mappedToDestination: 'true', }, - traits: user2Traits, + traits: { + am_pm: 'AM', + pPower: 'AM', + boolean: true, + userId: 'Jacqueline', + firstname: 'Jacqueline', + administrative_unit: 'Minnesota', + }, type: 'identify', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -389,19 +1084,39 @@ export const identifyTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: updateUserEndpoint, - JSON: { - userId: 'Matthew', - dataFields: { ...user2Traits, userId: 'Matthew' }, - preferUserId: false, - mergeNestedObjects: true, + method: 'POST', + endpoint: 'https://api.iterable.com/api/users/update', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', }, - }), + params: {}, + body: { + JSON: { + userId: 'Matthew', + dataFields: { + am_pm: 'AM', + pPower: 'AM', + boolean: true, + userId: 'Matthew', + firstname: 'Jacqueline', + administrative_unit: 'Minnesota', + }, + preferUserId: false, + mergeNestedObjects: true, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -419,20 +1134,55 @@ export const identifyTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: overrideDestination(destination, { dataCenter: 'EUDC' }), message: { - anonymousId, + anonymousId: 'anonId', context: { - traits: user1Traits, + traits: { + name: 'manashi', + country: 'India', + city: 'Bangalore', + email: 'manashi@website.com', + }, + }, + traits: { + name: 'manashi', + country: 'India', + city: 'Bangalore', + email: 'manashi@website.com', }, - traits: user1Traits, type: 'identify', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'EUDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -442,20 +1192,38 @@ export const identifyTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: updateUserEndpointEUDC, - JSON: { - email: user1Traits.email, - userId: anonymousId, - dataFields: user1Traits, - preferUserId: false, - mergeNestedObjects: true, + method: 'POST', + endpoint: 'https://api.eu.iterable.com/api/users/update', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', }, - }), + params: {}, + body: { + JSON: { + email: 'manashi@website.com', + userId: 'anonId', + dataFields: { + name: 'manashi', + country: 'India', + city: 'Bangalore', + email: 'manashi@website.com', + }, + preferUserId: false, + mergeNestedObjects: true, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, diff --git a/test/integrations/destinations/iterable/processor/pageScreenTestData.ts b/test/integrations/destinations/iterable/processor/pageScreenTestData.ts index a27cf9fe3b8..6bf6465068c 100644 --- a/test/integrations/destinations/iterable/processor/pageScreenTestData.ts +++ b/test/integrations/destinations/iterable/processor/pageScreenTestData.ts @@ -1,55 +1,40 @@ -import { - generateMetadata, - overrideDestination, - transformResultBuilder, -} from './../../../testUtils'; -import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; +import { Metadata } from '../../../../../src/types'; -const destination: Destination = { - ID: '123', - Name: 'iterable', - DestinationDefinition: { - ID: '123', - Name: 'iterable', - DisplayName: 'Iterable', - Config: {}, - }, - WorkspaceID: '123', - Transformations: [], - Config: { - apiKey: 'testApiKey', - dataCenter: 'USDC', - preferUserId: false, - trackAllPages: true, - trackNamedPages: false, - mapToSingleEvent: false, - trackCategorisedPages: false, - }, - Enabled: true, -}; - -const headers = { - api_key: 'testApiKey', - 'Content-Type': 'application/json', -}; - -const properties = { - path: '/abc', - referrer: '', - search: '', - title: '', - url: '', - category: 'test-category', +const baseMetadata: Partial = { + sourceId: 'default-sourceId', + workspaceId: 'default-workspaceId', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destinationId', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2025-01-06T04:03:53.932Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, }; -const anonymousId = 'anonId'; -const sentAt = '2020-08-28T16:26:16.473Z'; -const originalTimestamp = '2020-08-28T16:26:06.468Z'; - -const pageEndpoint = 'https://api.iterable.com/api/events/track'; -const pageEndpointEUDC = 'https://api.eu.iterable.com/api/events/track'; - export const pageScreenTestData: ProcessorTestData[] = [ { id: 'iterable-page-test-1', @@ -63,23 +48,55 @@ export const pageScreenTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { - anonymousId, + anonymousId: 'anonId', name: 'ApplicationLoaded', context: { traits: { email: 'sayan@gmail.com', }, }, - properties, + properties: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, type: 'page', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -89,20 +106,40 @@ export const pageScreenTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: pageEndpoint, - JSON: { - userId: anonymousId, - dataFields: properties, - email: 'sayan@gmail.com', - createdAt: 1598631966468, - eventName: 'ApplicationLoaded page', - }, - }), + method: 'POST', + endpoint: 'https://api.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + userId: 'anonId', + dataFields: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, + email: 'sayan@gmail.com', + createdAt: 1598631966468, + eventName: 'ApplicationLoaded page', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -120,26 +157,57 @@ export const pageScreenTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - ...destination, - Config: { ...destination.Config, mapToSingleEvent: true }, - }, message: { - anonymousId, + anonymousId: 'anonId', name: 'ApplicationLoaded', context: { traits: { email: 'sayan@gmail.com', }, }, - properties: { ...properties, campaignId: '123456', templateId: '1213458' }, + properties: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + campaignId: '123456', + templateId: '1213458', + }, type: 'page', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: true, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -149,22 +217,44 @@ export const pageScreenTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: pageEndpoint, - JSON: { - campaignId: 123456, - templateId: 1213458, - userId: anonymousId, - email: 'sayan@gmail.com', - createdAt: 1598631966468, - eventName: 'Loaded a Page', - dataFields: { ...properties, campaignId: '123456', templateId: '1213458' }, - }, - }), + method: 'POST', + endpoint: 'https://api.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + campaignId: 123456, + templateId: 1213458, + userId: 'anonId', + email: 'sayan@gmail.com', + createdAt: 1598631966468, + eventName: 'Loaded a Page', + dataFields: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + campaignId: '123456', + templateId: '1213458', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -182,26 +272,55 @@ export const pageScreenTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - ...destination, - Config: { ...destination.Config, trackNamedPages: true, trackAllPages: false }, - }, message: { - anonymousId, + anonymousId: 'anonId', name: 'ApplicationLoaded', context: { traits: { email: 'sayan@gmail.com', }, }, - properties, + properties: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, type: 'page', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: false, + trackNamedPages: true, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -211,20 +330,40 @@ export const pageScreenTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: pageEndpoint, - JSON: { - userId: anonymousId, - email: 'sayan@gmail.com', - createdAt: 1598631966468, - eventName: 'ApplicationLoaded page', - dataFields: properties, - }, - }), + method: 'POST', + endpoint: 'https://api.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + userId: 'anonId', + email: 'sayan@gmail.com', + createdAt: 1598631966468, + eventName: 'ApplicationLoaded page', + dataFields: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -242,26 +381,55 @@ export const pageScreenTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - ...destination, - Config: { ...destination.Config, trackCategorisedPages: true, trackAllPages: false }, - }, message: { - anonymousId, + anonymousId: 'anonId', name: 'ApplicationLoaded', context: { traits: { email: 'sayan@gmail.com', }, }, - properties, + properties: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, type: 'screen', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: false, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: true, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -271,20 +439,40 @@ export const pageScreenTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: pageEndpoint, - JSON: { - userId: anonymousId, - dataFields: properties, - email: 'sayan@gmail.com', - createdAt: 1598631966468, - eventName: 'ApplicationLoaded screen', - }, - }), + method: 'POST', + endpoint: 'https://api.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + userId: 'anonId', + dataFields: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, + email: 'sayan@gmail.com', + createdAt: 1598631966468, + eventName: 'ApplicationLoaded screen', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -302,26 +490,57 @@ export const pageScreenTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - ...destination, - Config: { ...destination.Config, mapToSingleEvent: true }, - }, message: { - anonymousId, + anonymousId: 'anonId', name: 'ApplicationLoaded', context: { traits: { email: 'sayan@gmail.com', }, }, - properties: { ...properties, campaignId: '123456', templateId: '1213458' }, + properties: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + campaignId: '123456', + templateId: '1213458', + }, type: 'screen', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: true, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -331,22 +550,44 @@ export const pageScreenTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: pageEndpoint, - JSON: { - campaignId: 123456, - templateId: 1213458, - userId: anonymousId, - email: 'sayan@gmail.com', - createdAt: 1598631966468, - eventName: 'Loaded a Screen', - dataFields: { ...properties, campaignId: '123456', templateId: '1213458' }, - }, - }), + method: 'POST', + endpoint: 'https://api.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + campaignId: 123456, + templateId: 1213458, + userId: 'anonId', + email: 'sayan@gmail.com', + createdAt: 1598631966468, + eventName: 'Loaded a Screen', + dataFields: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + campaignId: '123456', + templateId: '1213458', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -364,26 +605,55 @@ export const pageScreenTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: { - ...destination, - Config: { ...destination.Config, trackNamedPages: true, trackAllPages: false }, - }, message: { - anonymousId, + anonymousId: 'anonId', name: 'ApplicationLoaded', context: { traits: { email: 'sayan@gmail.com', }, }, - properties, + properties: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, type: 'screen', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: false, + trackNamedPages: true, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -393,20 +663,40 @@ export const pageScreenTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: pageEndpoint, - JSON: { - userId: anonymousId, - email: 'sayan@gmail.com', - createdAt: 1598631966468, - eventName: 'ApplicationLoaded screen', - dataFields: properties, - }, - }), + method: 'POST', + endpoint: 'https://api.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + userId: 'anonId', + email: 'sayan@gmail.com', + createdAt: 1598631966468, + eventName: 'ApplicationLoaded screen', + dataFields: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -424,23 +714,55 @@ export const pageScreenTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: overrideDestination(destination, { dataCenter: 'EUDC' }), message: { - anonymousId, + anonymousId: 'anonId', name: 'ApplicationLoaded', context: { traits: { email: 'sayan@gmail.com', }, }, - properties, + properties: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, type: 'page', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'EUDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -450,20 +772,40 @@ export const pageScreenTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: pageEndpointEUDC, - JSON: { - userId: anonymousId, - dataFields: properties, - email: 'sayan@gmail.com', - createdAt: 1598631966468, - eventName: 'ApplicationLoaded page', - }, - }), + method: 'POST', + endpoint: 'https://api.eu.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + userId: 'anonId', + dataFields: { + path: '/abc', + referrer: '', + search: '', + title: '', + url: '', + category: 'test-category', + }, + email: 'sayan@gmail.com', + createdAt: 1598631966468, + eventName: 'ApplicationLoaded page', + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, diff --git a/test/integrations/destinations/iterable/processor/trackTestData.ts b/test/integrations/destinations/iterable/processor/trackTestData.ts index 2b7d2a9c47a..1945d2c7a9a 100644 --- a/test/integrations/destinations/iterable/processor/trackTestData.ts +++ b/test/integrations/destinations/iterable/processor/trackTestData.ts @@ -1,137 +1,40 @@ -import { - generateMetadata, - generateTrackPayload, - overrideDestination, - transformResultBuilder, -} from './../../../testUtils'; -import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; +import { Metadata } from '../../../../../src/types'; -const destination: Destination = { - ID: '123', - Name: 'iterable', - DestinationDefinition: { - ID: '123', - Name: 'iterable', - DisplayName: 'Iterable', - Config: {}, - }, - WorkspaceID: '123', - Transformations: [], - Config: { - apiKey: 'testApiKey', - dataCenter: 'USDC', - preferUserId: false, - trackAllPages: true, - trackNamedPages: false, - mapToSingleEvent: false, - trackCategorisedPages: false, - }, - Enabled: true, -}; - -const headers = { - api_key: 'testApiKey', - 'Content-Type': 'application/json', -}; - -const properties = { - subject: 'resume validate', - sendtime: '2020-01-01', - sendlocation: 'akashdeep@gmail.com', -}; - -const customEventProperties = { - campaignId: '1', - templateId: '0', - user_actual_id: 12345, - category: 'test-category', - email: 'ruchira@rudderlabs.com', - user_actual_role: 'system_admin, system_user', -}; - -const productInfo = { - price: 797, - variant: 'Oak', - quantity: 1, - quickship: true, - full_price: 1328, - product_id: 10606, - non_interaction: 1, - sku: 'JB24691400-W05', - name: 'Vira Console Cabinet', - cart_id: 'bd9b8dbf4ef8ee01d4206b04fe2ee6ae', +const baseMetadata: Partial = { + sourceId: 'default-sourceId', + workspaceId: 'default-workspaceId', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destinationId', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2025-01-06T04:00:49.698Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, }; -const orderCompletedProductInfo = { - price: 45, - quantity: 1, - total: '1000', - name: 'Shoes', - orderId: 10000, - product_id: 1234, - campaignId: '123456', - templateId: '1213458', -}; - -const products = [ - { - product_id: '507f1f77bcf86cd799439011', - sku: '45790-32', - name: 'Monopoly: 3rd Edition', - price: '19', - position: '1', - category: 'cars', - url: 'https://www.example.com/product/path', - image_url: 'https://www.example.com/product/path.jpg', - quantity: '2', - }, - { - product_id: '507f1f77bcf86cd7994390112', - sku: '45790-322', - name: 'Monopoly: 3rd Edition2', - price: '192', - quantity: 22, - position: '12', - category: 'Cars2', - url: 'https://www.example.com/product/path2', - image_url: 'https://www.example.com/product/path.jpg2', - }, -]; - -const items = [ - { - id: '507f1f77bcf86cd799439011', - sku: '45790-32', - name: 'Monopoly: 3rd Edition', - categories: ['cars'], - price: 19, - quantity: 2, - imageUrl: 'https://www.example.com/product/path.jpg', - url: 'https://www.example.com/product/path', - }, - { - id: '507f1f77bcf86cd7994390112', - sku: '45790-322', - name: 'Monopoly: 3rd Edition2', - categories: ['Cars2'], - price: 192, - quantity: 22, - imageUrl: 'https://www.example.com/product/path.jpg2', - url: 'https://www.example.com/product/path2', - }, -]; - -const userId = 'userId'; -const anonymousId = 'anonId'; -const sentAt = '2020-08-28T16:26:16.473Z'; -const originalTimestamp = '2020-08-28T16:26:06.468Z'; - -const endpoint = 'https://api.iterable.com/api/events/track'; -const endpointEUDC = 'https://api.eu.iterable.com/api/events/track'; -const updateCartEndpoint = 'https://api.iterable.com/api/commerce/updateCart'; -const trackPurchaseEndpoint = 'https://api.iterable.com/api/commerce/trackPurchase'; - export const trackTestData: ProcessorTestData[] = [ { id: 'iterable-track-test-1', @@ -145,19 +48,48 @@ export const trackTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { - anonymousId, + anonymousId: 'anonId', event: 'Email Opened', type: 'track', context: {}, - properties, - sentAt, - originalTimestamp, + properties: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -167,19 +99,36 @@ export const trackTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint, - JSON: { - userId: 'anonId', - createdAt: 1598631966468, - eventName: 'Email Opened', - dataFields: properties, - }, - }), + method: 'POST', + endpoint: 'https://api.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + userId: 'anonId', + createdAt: 1598631966468, + eventName: 'Email Opened', + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -197,29 +146,107 @@ export const trackTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, - message: generateTrackPayload({ - userId, - anonymousId, - event: 'product added', + message: { + type: 'track', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', context: { + os: { + name: '', + version: '1.12.3', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, traits: { email: 'sayan@gmail.com', }, + locale: 'en-US', + device: { + token: 'token', + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', }, + rudderId: '227egb53wnacyz7f5hopt3jwriuwwk8n2y8i', + messageId: '40q64xrajd4kqt5174iy8889da8kjij55u85', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + event: 'product added', properties: { campaignId: '1', templateId: '0', orderId: 10000, total: 1000, - products, + products: [ + { + product_id: '507f1f77bcf86cd799439011', + sku: '45790-32', + name: 'Monopoly: 3rd Edition', + price: '19', + position: '1', + category: 'cars', + url: 'https://www.example.com/product/path', + image_url: 'https://www.example.com/product/path.jpg', + quantity: '2', + }, + { + product_id: '507f1f77bcf86cd7994390112', + sku: '45790-322', + name: 'Monopoly: 3rd Edition2', + price: '192', + quantity: 22, + position: '12', + category: 'Cars2', + url: 'https://www.example.com/product/path2', + image_url: 'https://www.example.com/product/path.jpg2', + }, + ], + }, + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, }, - sentAt, - originalTimestamp, - }), - metadata: generateMetadata(1), + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], }, @@ -229,25 +256,59 @@ export const trackTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: updateCartEndpoint, - JSON: { - user: { - email: 'sayan@gmail.com', - dataFields: { + method: 'POST', + endpoint: 'https://api.iterable.com/api/commerce/updateCart', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + user: { email: 'sayan@gmail.com', + dataFields: { + email: 'sayan@gmail.com', + }, + userId: 'userId', + preferUserId: false, + mergeNestedObjects: true, }, - userId, - preferUserId: false, - mergeNestedObjects: true, + items: [ + { + id: '507f1f77bcf86cd799439011', + sku: '45790-32', + name: 'Monopoly: 3rd Edition', + categories: ['cars'], + price: 19, + quantity: 2, + imageUrl: 'https://www.example.com/product/path.jpg', + url: 'https://www.example.com/product/path', + }, + { + id: '507f1f77bcf86cd7994390112', + sku: '45790-322', + name: 'Monopoly: 3rd Edition2', + categories: ['Cars2'], + price: 192, + quantity: 22, + imageUrl: 'https://www.example.com/product/path.jpg2', + url: 'https://www.example.com/product/path2', + }, + ], }, - items, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, }, - }), + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -265,29 +326,107 @@ export const trackTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, - message: generateTrackPayload({ - userId, - anonymousId, - event: 'order completed', + message: { + type: 'track', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', context: { + os: { + name: '', + version: '1.12.3', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, traits: { email: 'sayan@gmail.com', }, + locale: 'en-US', + device: { + token: 'token', + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', }, + rudderId: 'npe99e7yc7apntgd9roobt2n8i7262rsg6vr', + messageId: '68ygodw5mj88lmjm5sm765tatvscrucqo6kx', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + event: 'order completed', properties: { orderId: 10000, total: '1000', campaignId: '123456', templateId: '1213458', - products, + products: [ + { + product_id: '507f1f77bcf86cd799439011', + sku: '45790-32', + name: 'Monopoly: 3rd Edition', + price: '19', + position: '1', + category: 'cars', + url: 'https://www.example.com/product/path', + image_url: 'https://www.example.com/product/path.jpg', + quantity: '2', + }, + { + product_id: '507f1f77bcf86cd7994390112', + sku: '45790-322', + name: 'Monopoly: 3rd Edition2', + price: '192', + quantity: 22, + position: '12', + category: 'Cars2', + url: 'https://www.example.com/product/path2', + image_url: 'https://www.example.com/product/path.jpg2', + }, + ], }, - sentAt, - originalTimestamp, - }), - metadata: generateMetadata(1), + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], }, @@ -297,37 +436,94 @@ export const trackTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: trackPurchaseEndpoint, - JSON: { - dataFields: { - orderId: 10000, - total: '1000', - campaignId: '123456', - templateId: '1213458', - products, - }, - id: '10000', - createdAt: 1598631966468, - campaignId: 123456, - templateId: 1213458, - total: 1000, - user: { - email: 'sayan@gmail.com', + method: 'POST', + endpoint: 'https://api.iterable.com/api/commerce/trackPurchase', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { dataFields: { + orderId: 10000, + total: '1000', + campaignId: '123456', + templateId: '1213458', + products: [ + { + product_id: '507f1f77bcf86cd799439011', + sku: '45790-32', + name: 'Monopoly: 3rd Edition', + price: '19', + position: '1', + category: 'cars', + url: 'https://www.example.com/product/path', + image_url: 'https://www.example.com/product/path.jpg', + quantity: '2', + }, + { + product_id: '507f1f77bcf86cd7994390112', + sku: '45790-322', + name: 'Monopoly: 3rd Edition2', + price: '192', + quantity: 22, + position: '12', + category: 'Cars2', + url: 'https://www.example.com/product/path2', + image_url: 'https://www.example.com/product/path.jpg2', + }, + ], + }, + id: '10000', + createdAt: 1598631966468, + campaignId: 123456, + templateId: 1213458, + total: 1000, + user: { email: 'sayan@gmail.com', + dataFields: { + email: 'sayan@gmail.com', + }, + userId: 'userId', + preferUserId: false, + mergeNestedObjects: true, }, - userId, - preferUserId: false, - mergeNestedObjects: true, + items: [ + { + id: '507f1f77bcf86cd799439011', + sku: '45790-32', + name: 'Monopoly: 3rd Edition', + categories: ['cars'], + price: 19, + quantity: 2, + imageUrl: 'https://www.example.com/product/path.jpg', + url: 'https://www.example.com/product/path', + }, + { + id: '507f1f77bcf86cd7994390112', + sku: '45790-322', + name: 'Monopoly: 3rd Edition2', + categories: ['Cars2'], + price: 192, + quantity: 22, + imageUrl: 'https://www.example.com/product/path.jpg2', + url: 'https://www.example.com/product/path2', + }, + ], }, - items, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, }, - }), + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -345,23 +541,85 @@ export const trackTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, - message: generateTrackPayload({ - userId, - anonymousId, - event: 'test track event GA3', + message: { + type: 'track', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', context: { + os: { + name: '', + version: '1.12.3', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, traits: { email: 'sayan@gmail.com', }, + locale: 'en-US', + device: { + token: 'token', + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', + }, + rudderId: 'id2nbnto38rw1v5wiqyc81xe61c7t420zpjb', + messageId: '28pdlaljhp7i1woa7b0fhj47rlz3g4z2pvdw', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + event: 'test track event GA3', + properties: { + campaignId: '1', + templateId: '0', + user_actual_id: 12345, + category: 'test-category', + email: 'ruchira@rudderlabs.com', + user_actual_role: 'system_admin, system_user', + }, + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, }, - properties: customEventProperties, - sentAt, - originalTimestamp, - }), - metadata: generateMetadata(1), + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], }, @@ -371,22 +629,42 @@ export const trackTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint, - JSON: { - email: 'ruchira@rudderlabs.com', - dataFields: customEventProperties, - userId, - eventName: 'test track event GA3', - createdAt: 1598631966468, - campaignId: 1, - templateId: 0, - }, - }), + method: 'POST', + endpoint: 'https://api.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + email: 'ruchira@rudderlabs.com', + dataFields: { + campaignId: '1', + templateId: '0', + user_actual_id: 12345, + category: 'test-category', + email: 'ruchira@rudderlabs.com', + user_actual_role: 'system_admin, system_user', + }, + userId: 'userId', + eventName: 'test track event GA3', + createdAt: 1598631966468, + campaignId: 1, + templateId: 0, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -404,23 +682,89 @@ export const trackTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, - message: generateTrackPayload({ - userId, - anonymousId, - event: 'product added', + message: { + type: 'track', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', context: { + os: { + name: '', + version: '1.12.3', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, traits: { email: 'jessica@jlpdesign.net', }, + locale: 'en-US', + device: { + token: 'token', + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', + }, + rudderId: 'gm8wm4385x4kfzl464h7tjtob474i17anotc', + messageId: 'jslc0490479rziix9h0ya6z6qpn2taqmryro', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + event: 'product added', + properties: { + price: 797, + variant: 'Oak', + quantity: 1, + quickship: true, + full_price: 1328, + product_id: 10606, + non_interaction: 1, + sku: 'JB24691400-W05', + name: 'Vira Console Cabinet', + cart_id: 'bd9b8dbf4ef8ee01d4206b04fe2ee6ae', }, - properties: productInfo, - sentAt, - originalTimestamp, - }), - metadata: generateMetadata(1), + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], }, @@ -430,33 +774,46 @@ export const trackTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: updateCartEndpoint, - JSON: { - user: { - email: 'jessica@jlpdesign.net', - dataFields: { + method: 'POST', + endpoint: 'https://api.iterable.com/api/commerce/updateCart', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + user: { email: 'jessica@jlpdesign.net', + dataFields: { + email: 'jessica@jlpdesign.net', + }, + userId: 'userId', + preferUserId: false, + mergeNestedObjects: true, }, - userId, - preferUserId: false, - mergeNestedObjects: true, + items: [ + { + id: 10606, + sku: 'JB24691400-W05', + name: 'Vira Console Cabinet', + price: 797, + quantity: 1, + }, + ], }, - items: [ - { - id: productInfo.product_id, - sku: productInfo.sku, - name: productInfo.name, - price: productInfo.price, - quantity: productInfo.quantity, - }, - ], + JSON_ARRAY: {}, + XML: {}, + FORM: {}, }, - }), + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -474,29 +831,92 @@ export const trackTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, - message: generateTrackPayload({ - userId, - anonymousId, - event: 'product added', + message: { + type: 'track', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', context: { + os: { + name: '', + version: '1.12.3', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, traits: { email: 'jessica@jlpdesign.net', }, + locale: 'en-US', + device: { + token: 'token', + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', }, + rudderId: '4osg2zcrsrh2accmbijxm0zqixtxyrsun8uc', + messageId: 'x901bx7paxtr7ktja5mhd1mi8q4lr5vlrl2x', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + event: 'product added', properties: { campaignId: '1', templateId: '0', orderId: 10000, total: 1000, - ...products[1], + product_id: '507f1f77bcf86cd7994390112', + sku: '45790-322', + name: 'Monopoly: 3rd Edition2', + price: '192', + quantity: 22, + position: '12', + category: 'Cars2', + url: 'https://www.example.com/product/path2', + image_url: 'https://www.example.com/product/path.jpg2', }, - sentAt, - originalTimestamp, - }), - metadata: generateMetadata(1), + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], }, @@ -506,36 +926,49 @@ export const trackTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: updateCartEndpoint, - JSON: { - user: { - email: 'jessica@jlpdesign.net', - dataFields: { + method: 'POST', + endpoint: 'https://api.iterable.com/api/commerce/updateCart', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + user: { email: 'jessica@jlpdesign.net', + dataFields: { + email: 'jessica@jlpdesign.net', + }, + userId: 'userId', + preferUserId: false, + mergeNestedObjects: true, }, - userId, - preferUserId: false, - mergeNestedObjects: true, + items: [ + { + price: 192, + url: 'https://www.example.com/product/path2', + sku: '45790-322', + name: 'Monopoly: 3rd Edition2', + id: '507f1f77bcf86cd7994390112', + quantity: 22, + imageUrl: 'https://www.example.com/product/path.jpg2', + categories: ['Cars2'], + }, + ], }, - items: [ - { - price: 192, - url: products[1].url, - sku: products[1].sku, - name: products[1].name, - id: products[1].product_id, - quantity: products[1].quantity, - imageUrl: products[1].image_url, - categories: [products[1].category], - }, - ], + JSON_ARRAY: {}, + XML: {}, + FORM: {}, }, - }), + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -553,23 +986,87 @@ export const trackTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, - message: generateTrackPayload({ - userId, - anonymousId, - event: 'order completed', + message: { + type: 'track', + sentAt: '2020-08-28T16:26:16.473Z', + userId: 'userId', + channel: 'web', context: { + os: { + name: '', + version: '1.12.3', + }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.11', + namespace: 'com.rudderlabs.javascript', + }, traits: { email: 'jessica@jlpdesign.net', }, + locale: 'en-US', + device: { + token: 'token', + id: 'id', + type: 'ios', + }, + screen: { + density: 2, + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.11', + }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:84.0) Gecko/20100101 Firefox/84.0', }, - properties: orderCompletedProductInfo, - sentAt, - originalTimestamp, - }), - metadata: generateMetadata(1), + rudderId: '9ovlz4kuew0wjcbwymj3vlhkngzixp9evf19', + messageId: 'ev0qyvsclinoh4z4e1uz4d8pdhrnf17q0rjd', + anonymousId: 'anonId', + originalTimestamp: '2020-08-28T16:26:06.468Z', + event: 'order completed', + properties: { + price: 45, + quantity: 1, + total: '1000', + name: 'Shoes', + orderId: 10000, + product_id: 1234, + campaignId: '123456', + templateId: '1213458', + }, + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, }, ], }, @@ -579,38 +1076,60 @@ export const trackTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: trackPurchaseEndpoint, - JSON: { - dataFields: orderCompletedProductInfo, - user: { - email: 'jessica@jlpdesign.net', + method: 'POST', + endpoint: 'https://api.iterable.com/api/commerce/trackPurchase', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { dataFields: { + price: 45, + quantity: 1, + total: '1000', + name: 'Shoes', + orderId: 10000, + product_id: 1234, + campaignId: '123456', + templateId: '1213458', + }, + user: { email: 'jessica@jlpdesign.net', + dataFields: { + email: 'jessica@jlpdesign.net', + }, + userId: 'userId', + preferUserId: false, + mergeNestedObjects: true, }, - userId, - preferUserId: false, - mergeNestedObjects: true, + id: '10000', + total: 1000, + campaignId: 123456, + templateId: 1213458, + createdAt: 1598631966468, + items: [ + { + id: 1234, + name: 'Shoes', + price: 45, + quantity: 1, + }, + ], }, - id: '10000', - total: 1000, - campaignId: 123456, - templateId: 1213458, - createdAt: 1598631966468, - items: [ - { - id: orderCompletedProductInfo.product_id, - name: orderCompletedProductInfo.name, - price: orderCompletedProductInfo.price, - quantity: orderCompletedProductInfo.quantity, - }, - ], + JSON_ARRAY: {}, + XML: {}, + FORM: {}, }, - }), + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -628,18 +1147,47 @@ export const trackTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { - anonymousId, + anonymousId: 'anonId', type: 'track', context: {}, - properties, - sentAt, - originalTimestamp, + properties: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -649,18 +1197,35 @@ export const trackTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint, - JSON: { - userId: anonymousId, - createdAt: 1598631966468, - dataFields: properties, - }, - }), + method: 'POST', + endpoint: 'https://api.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + userId: 'anonId', + createdAt: 1598631966468, + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -678,19 +1243,48 @@ export const trackTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { - userId, - anonymousId, + userId: 'userId', + anonymousId: 'anonId', type: 'track', context: {}, - properties, - sentAt, - originalTimestamp, + properties: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'USDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -700,18 +1294,35 @@ export const trackTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint, - JSON: { - userId, - createdAt: 1598631966468, - dataFields: properties, - }, - }), + method: 'POST', + endpoint: 'https://api.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + userId: 'userId', + createdAt: 1598631966468, + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, @@ -729,19 +1340,48 @@ export const trackTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination: overrideDestination(destination, { dataCenter: 'EUDC' }), message: { - anonymousId, + anonymousId: 'anonId', event: 'Email Opened', type: 'track', context: {}, - properties, - sentAt, - originalTimestamp, + properties: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: { + ID: '123', + Name: 'iterable', + DestinationDefinition: { + ID: '123', + Name: 'iterable', + DisplayName: 'Iterable', + Config: {}, + }, + Config: { + apiKey: 'testApiKey', + dataCenter: 'EUDC', + preferUserId: false, + trackAllPages: true, + trackNamedPages: false, + mapToSingleEvent: false, + trackCategorisedPages: false, + }, + Enabled: true, + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - metadata: generateMetadata(1), }, ], }, @@ -751,19 +1391,36 @@ export const trackTestData: ProcessorTestData[] = [ status: 200, body: [ { - output: transformResultBuilder({ + output: { + version: '1', + type: 'REST', userId: '', - headers, - endpoint: endpointEUDC, - JSON: { - userId: 'anonId', - createdAt: 1598631966468, - eventName: 'Email Opened', - dataFields: properties, - }, - }), + method: 'POST', + endpoint: 'https://api.eu.iterable.com/api/events/track', + headers: { + api_key: 'testApiKey', + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + userId: 'anonId', + createdAt: 1598631966468, + eventName: 'Email Opened', + dataFields: { + subject: 'resume validate', + sendtime: '2020-01-01', + sendlocation: 'akashdeep@gmail.com', + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: baseMetadata, statusCode: 200, - metadata: generateMetadata(1), }, ], }, diff --git a/test/integrations/destinations/iterable/processor/validationTestData.ts b/test/integrations/destinations/iterable/processor/validationTestData.ts index 86728a868b6..8251982b56f 100644 --- a/test/integrations/destinations/iterable/processor/validationTestData.ts +++ b/test/integrations/destinations/iterable/processor/validationTestData.ts @@ -1,8 +1,41 @@ -import { generateMetadata } from './../../../testUtils'; -import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; +import { Metadata, Destination, RudderMessage } from '../../../../../src/types'; -const destination: Destination = { +const baseMetadata: Partial = { + sourceId: 'default-sourceId', + workspaceId: 'default-workspaceId', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destinationId', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: '2025-01-06T04:14:40.785Z', + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, +}; + +const baseDestination: Destination = { ID: '123', Name: 'iterable', DestinationDefinition: { @@ -11,8 +44,6 @@ const destination: Destination = { DisplayName: 'Iterable', Config: {}, }, - WorkspaceID: '123', - Transformations: [], Config: { apiKey: 'testApiKey', mapToSingleEvent: false, @@ -21,26 +52,11 @@ const destination: Destination = { trackNamedPages: false, }, Enabled: true, -}; - -const properties = { - url: 'https://dominos.com', - title: 'Pizza', - referrer: 'https://google.com', -}; - -const sentAt = '2020-08-28T16:26:16.473Z'; -const originalTimestamp = '2020-08-28T16:26:06.468Z'; - -const expectedStatTags = { - destType: 'ITERABLE', - errorCategory: 'dataValidation', - errorType: 'instrumentation', - feature: 'processor', - implementation: 'native', - module: 'destination', - destinationId: 'default-destinationId', - workspaceId: 'default-workspaceId', + WorkspaceID: '123', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }; export const validationTestData: ProcessorTestData[] = [ @@ -56,9 +72,9 @@ export const validationTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { userId: 'sajal12', anonymousId: 'abcdeeeeeeeexxxx102', @@ -67,12 +83,17 @@ export const validationTestData: ProcessorTestData[] = [ email: 'abc@example.com', }, }, - properties, + properties: { + url: 'https://dominos.com', + title: 'Pizza', + referrer: 'https://google.com', + }, type: 'page', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', }, - metadata: generateMetadata(1), + metadata: baseMetadata, + destination: baseDestination, }, ], }, @@ -82,10 +103,19 @@ export const validationTestData: ProcessorTestData[] = [ status: 200, body: [ { + metadata: baseMetadata, statusCode: 400, error: 'Invalid page call', - statTags: { ...expectedStatTags, errorType: 'configuration' }, - metadata: generateMetadata(1), + statTags: { + destType: 'ITERABLE', + errorCategory: 'dataValidation', + errorType: 'configuration', + feature: 'processor', + implementation: 'native', + module: 'destination', + destinationId: 'default-destinationId', + workspaceId: 'default-workspaceId', + }, }, ], }, @@ -103,16 +133,17 @@ export const validationTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { context: {}, type: 'identify', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', }, - metadata: generateMetadata(1), + metadata: baseMetadata, + destination: baseDestination, }, ], }, @@ -122,10 +153,19 @@ export const validationTestData: ProcessorTestData[] = [ status: 200, body: [ { + metadata: baseMetadata, statusCode: 400, error: 'userId or email is mandatory for this request', - statTags: expectedStatTags, - metadata: generateMetadata(1), + statTags: { + destType: 'ITERABLE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + destinationId: 'default-destinationId', + workspaceId: 'default-workspaceId', + }, }, ], }, @@ -143,16 +183,17 @@ export const validationTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { context: {}, type: 'group', - sentAt, - originalTimestamp, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', }, - metadata: generateMetadata(1), + metadata: baseMetadata, + destination: baseDestination, }, ], }, @@ -162,10 +203,19 @@ export const validationTestData: ProcessorTestData[] = [ status: 200, body: [ { + metadata: baseMetadata, statusCode: 400, error: 'Message type group not supported', - statTags: expectedStatTags, - metadata: generateMetadata(1), + statTags: { + destType: 'ITERABLE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + destinationId: 'default-destinationId', + workspaceId: 'default-workspaceId', + }, }, ], }, @@ -183,17 +233,22 @@ export const validationTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { context: {}, type: 'alias', - properties, - sentAt, - originalTimestamp, + properties: { + url: 'https://dominos.com', + title: 'Pizza', + referrer: 'https://google.com', + }, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', }, - metadata: generateMetadata(1), + metadata: baseMetadata, + destination: baseDestination, }, ], }, @@ -203,10 +258,19 @@ export const validationTestData: ProcessorTestData[] = [ status: 200, body: [ { + metadata: baseMetadata, statusCode: 400, error: 'Missing required value from "previousId"', - statTags: expectedStatTags, - metadata: generateMetadata(1), + statTags: { + destType: 'ITERABLE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + destinationId: 'default-destinationId', + workspaceId: 'default-workspaceId', + }, }, ], }, @@ -224,19 +288,24 @@ export const validationTestData: ProcessorTestData[] = [ version: 'v0', input: { request: { + method: 'POST', body: [ { - destination, message: { context: {}, type: 'alias', previousId: 'old@email.com', anonymousId: 'anonId', - properties, - sentAt, - originalTimestamp, + properties: { + url: 'https://dominos.com', + title: 'Pizza', + referrer: 'https://google.com', + }, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', }, - metadata: generateMetadata(1), + metadata: baseMetadata, + destination: baseDestination, }, ], }, @@ -246,10 +315,74 @@ export const validationTestData: ProcessorTestData[] = [ status: 200, body: [ { + metadata: baseMetadata, statusCode: 400, error: 'Missing required value from "userId"', - statTags: expectedStatTags, - metadata: generateMetadata(1), + statTags: { + destType: 'ITERABLE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + destinationId: 'default-destinationId', + workspaceId: 'default-workspaceId', + }, + }, + ], + }, + }, + }, + { + id: 'iterable-validation-test-6', + name: 'iterable', + description: '[Error]: Missing message type', + scenario: 'Framework', + successCriteria: + 'Response should contain status code 400 and it should throw instrumentation error with respective message type', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + method: 'POST', + body: [ + { + message: { + context: {}, + event: 'testEvent', + properties: { + url: 'https://nodominoes.com', + title: 'Pizza', + referrer: 'https://google.com', + }, + sentAt: '2020-08-28T16:26:16.473Z', + originalTimestamp: '2020-08-28T16:26:06.468Z', + }, + metadata: baseMetadata, + destination: baseDestination, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + metadata: baseMetadata, + statusCode: 400, + error: 'Event type is required', + statTags: { + destType: 'ITERABLE', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + destinationId: 'default-destinationId', + workspaceId: 'default-workspaceId', + }, }, ], }, diff --git a/test/integrations/destinations/iterable/router/data.ts b/test/integrations/destinations/iterable/router/data.ts index 1917c078ebd..4d0385d99a8 100644 --- a/test/integrations/destinations/iterable/router/data.ts +++ b/test/integrations/destinations/iterable/router/data.ts @@ -1,7 +1,14 @@ -export const data = [ +import { RouterTestData } from '../../../testTypes'; +import { MessageType, RudderMessage } from '../../../../../src/types'; +import { generateMetadata } from '../../../testUtils'; + +export const data: RouterTestData[] = [ { + id: 'router-1736135082961', name: 'iterable', description: 'Test 0', + scenario: 'Default router scenario', + successCriteria: 'Router test should pass successfully', feature: 'router', module: 'destination', version: 'v0', @@ -15,7 +22,10 @@ export const data = [ sentAt: '2022-09-27T11:13:03.777Z', messageId: '9ad41366-8060-4c9f-b181-f6bea67d5469', originalTimestamp: '2022-09-27T11:13:03.777Z', - traits: { ruchira: 'donaldbaker@ellis.com', new_field2: 'GB' }, + traits: { + ruchira: 'donaldbaker@ellis.com', + new_field2: 'GB', + }, channel: 'sources', rudderId: '3d51640c-ab09-42c1-b7b2-db6ab433b35e', context: { @@ -29,7 +39,11 @@ export const data = [ }, mappedToDestination: 'true', externalId: [ - { id: 'Tiffany', type: 'ITERABLE-test-ruchira', identifierType: 'itemId' }, + { + id: 'Tiffany', + type: 'ITERABLE-test-ruchira', + identifierType: 'itemId', + }, ], }, timestamp: '2022-09-27T11:12:59.079Z', @@ -38,10 +52,26 @@ export const data = [ recordId: '10', request_ip: '10.1.86.248', }, - metadata: { jobId: 2, userId: 'u1' }, + metadata: generateMetadata(1), destination: { - Config: { apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', hubID: '22066036' }, + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', + hubID: '22066036', + }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, { @@ -50,7 +80,10 @@ export const data = [ sentAt: '2022-09-27T11:13:03.777Z', messageId: '9ad41366-8060-4c9f-b181-f6bea67d5469', originalTimestamp: '2022-09-27T11:13:03.777Z', - traits: { ruchira: 'abc@ellis.com', new_field2: 'GB1' }, + traits: { + ruchira: 'abc@ellis.com', + new_field2: 'GB1', + }, channel: 'sources', rudderId: '3d51640c-ab09-42c1-b7b2-db6ab433b35e', context: { @@ -64,7 +97,11 @@ export const data = [ }, mappedToDestination: 'true', externalId: [ - { id: 'ABC', type: 'ITERABLE-test-ruchira', identifierType: 'itemId' }, + { + id: 'ABC', + type: 'ITERABLE-test-ruchira', + identifierType: 'itemId', + }, ], }, timestamp: '2022-09-27T11:12:59.079Z', @@ -73,15 +110,32 @@ export const data = [ recordId: '10', request_ip: '10.1.86.248', }, - metadata: { jobId: 2, userId: 'u1' }, + metadata: generateMetadata(2), destination: { - Config: { apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', hubID: '22066036' }, + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', + hubID: '22066036', + }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, ], destType: 'iterable', }, + method: 'POST', }, }, output: { @@ -103,8 +157,14 @@ export const data = [ body: { JSON: { documents: { - Tiffany: { ruchira: 'donaldbaker@ellis.com', new_field2: 'GB' }, - ABC: { ruchira: 'abc@ellis.com', new_field2: 'GB1' }, + Tiffany: { + ruchira: 'donaldbaker@ellis.com', + new_field2: 'GB', + }, + ABC: { + ruchira: 'abc@ellis.com', + new_field2: 'GB1', + }, }, replaceUploadedFieldsOnly: true, }, @@ -114,16 +174,29 @@ export const data = [ }, files: {}, }, - metadata: [ - { jobId: 2, userId: 'u1' }, - { jobId: 2, userId: 'u1' }, - ], - batched: true, + metadata: [generateMetadata(1), generateMetadata(2)], statusCode: 200, destination: { - Config: { apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', hubID: '22066036' }, + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', + hubID: '22066036', + }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: true, }, ], }, @@ -131,8 +204,11 @@ export const data = [ }, }, { + id: 'router-1736135082962', name: 'iterable', description: 'routerTest 1', + scenario: 'Default router scenario', + successCriteria: 'Router test should pass successfully', feature: 'router', module: 'destination', version: 'v0', @@ -145,8 +221,15 @@ export const data = [ type: 'track', event: 'Email Opened', sentAt: '2020-08-28T16:26:16.473Z', - context: { library: { name: 'analytics-node', version: '0.0.3' } }, - _metadata: { nodeVersion: '10.22.0' }, + context: { + library: { + name: 'analytics-node', + version: '0.0.3', + }, + }, + _metadata: { + nodeVersion: '10.22.0', + }, messageId: 'node-570110489d3e99b234b18af9a9eca9d4-6009779e-82d7-469d-aaeb-5ccf162b0453', properties: { @@ -157,8 +240,16 @@ export const data = [ anonymousId: 'abcdeeeeeeeexxxx102', originalTimestamp: '2020-08-28T16:26:06.468Z', }, - metadata: { jobId: 2, userId: 'u1' }, + metadata: generateMetadata(2), destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '62d12498c37c4fd8a1a546c2d35c2f60', mapToSingleEvent: false, @@ -167,6 +258,11 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, { @@ -187,16 +283,29 @@ export const data = [ email: 'manashi@website.com', country: 'India', }, - library: { name: 'analytics-node', version: '0.0.3' }, + library: { + name: 'analytics-node', + version: '0.0.3', + }, + }, + _metadata: { + nodeVersion: '10.22.0', }, - _metadata: { nodeVersion: '10.22.0' }, messageId: 'node-cc3ef811f686139ee527b806ee0129ef-163a3a88-266f-447e-8cce-34a8f42f8dcd', anonymousId: 'abcdeeeeeeeexxxx102', originalTimestamp: '2020-08-28T16:26:06.462Z', }, - metadata: { jobId: 3, userId: 'u1' }, + metadata: generateMetadata(3), destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '62d12498c37c4fd8a1a546c2d35c2f60', mapToSingleEvent: false, @@ -205,6 +314,11 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, { @@ -217,14 +331,24 @@ export const data = [ namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - traits: { email: 'sayan@gmail.com' }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + traits: { + email: 'sayan@gmail.com', + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', locale: 'en-US', ip: '0.0.0.0', - os: { name: '', version: '' }, - screen: { density: 2 }, + os: { + name: '', + version: '', + }, + screen: { + density: 2, + }, }, type: 'page', messageId: '5e10d13a-bf9a-44bf-b884-43a9e591ea71', @@ -239,12 +363,22 @@ export const data = [ url: '', category: 'test-category', }, - integrations: { All: true }, + integrations: { + All: true, + }, name: 'ApplicationLoaded', sentAt: '2019-10-14T11:15:53.296Z', }, - metadata: { jobId: 4, userId: 'u1' }, + metadata: generateMetadata(4), destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '12345', dataCenter: 'USDC', @@ -254,6 +388,11 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, { @@ -276,7 +415,9 @@ export const data = [ task_run_id: 'c5tar6cqgmgmcjvupdi0', version: 'release.v1.6.8', }, - device: { token: 54321 }, + device: { + token: 54321, + }, }, messageId: '2f052f7c-f694-4849-a7ed-a432f7ffa0a4', originalTimestamp: '2021-10-28T14:03:50.503Z', @@ -297,7 +438,7 @@ export const data = [ type: 'identify', userId: 'lynnanderson@smith.net', }, - metadata: { jobId: 5, userId: 'u1' }, + metadata: generateMetadata(5), destination: { ID: '1zia9wKshXt80YksLmUdJnr7IHI', Name: 'test_iterable', @@ -337,7 +478,6 @@ export const data = [ transformAt: 'processor', transformAtV1: 'processor', }, - ResponseRules: null, }, Config: { apiKey: '12345', @@ -348,11 +488,12 @@ export const data = [ trackNamedPages: true, }, Enabled: true, + WorkspaceID: 'default-workspace', Transformations: [], + RevisionID: 'default-revision', IsProcessorEnabled: true, + IsConnectionEnabled: true, }, - libraries: [], - request: { query: {} }, }, { message: { @@ -364,14 +505,24 @@ export const data = [ namespace: 'com.rudderlabs.javascript', version: '1.0.0', }, - traits: { email: 'sayan@gmail.com' }, - library: { name: 'RudderLabs JavaScript SDK', version: '1.0.0' }, + traits: { + email: 'sayan@gmail.com', + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.0.0', + }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', locale: 'en-US', ip: '0.0.0.0', - os: { name: '', version: '' }, - screen: { density: 2 }, + os: { + name: '', + version: '', + }, + screen: { + density: 2, + }, }, event: 'product added', type: 'track', @@ -409,12 +560,22 @@ export const data = [ }, ], }, - integrations: { All: true }, + integrations: { + All: true, + }, name: 'ApplicationLoaded', sentAt: '2019-10-14T11:15:53.296Z', }, - metadata: { jobId: 6, userId: 'u1' }, + metadata: generateMetadata(6), destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '62d12498c37c4fd8a1a546c2d35c2f60', dataCenter: 'USDC', @@ -424,14 +585,26 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, { message: { type: 'page', sentAt: '2020-08-28T16:26:16.473Z', - context: { library: { name: 'analytics-node', version: '0.0.3' } }, - _metadata: { nodeVersion: '10.22.0' }, + context: { + library: { + name: 'analytics-node', + version: '0.0.3', + }, + }, + _metadata: { + nodeVersion: '10.22.0', + }, messageId: 'node-6f62b91e789a636929ca38aed01c5f6e-103c720d-81bd-4742-98d6-d45a65aed23e', properties: { @@ -442,8 +615,16 @@ export const data = [ anonymousId: 'abcdeeeeeeeexxxx102', originalTimestamp: '2020-08-28T16:26:06.468Z', }, - metadata: { jobId: 7, userId: 'u1' }, + metadata: generateMetadata(7), destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '62d12498c37c4fd8a1a546c2d35c2f60', dataCenter: 'USDC', @@ -453,14 +634,26 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, { message: { type: 'alias', sentAt: '2020-08-28T16:26:16.473Z', - context: { library: { name: 'analytics-node', version: '0.0.3' } }, - _metadata: { nodeVersion: '10.22.0' }, + context: { + library: { + name: 'analytics-node', + version: '0.0.3', + }, + }, + _metadata: { + nodeVersion: '10.22.0', + }, messageId: 'node-6f62b91e789a636929ca38aed01c5f6e-103c720d-81bd-4742-98d6-d45a65aed23e', properties: { @@ -473,8 +666,16 @@ export const data = [ anonymousId: 'abcdeeeeeeeexxxx102', originalTimestamp: '2020-08-28T16:26:06.468Z', }, - metadata: { jobId: 8, userId: 'u1' }, + metadata: generateMetadata(8), destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '62d12498c37c4fd8a1a546c2d35c2f60', dataCenter: 'USDC', @@ -484,11 +685,17 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, ], destType: 'iterable', }, + method: 'POST', }, }, output: { @@ -528,10 +735,17 @@ export const data = [ }, files: {}, }, - metadata: [{ jobId: 2, userId: 'u1' }], - batched: true, + metadata: [generateMetadata(2)], statusCode: 200, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '62d12498c37c4fd8a1a546c2d35c2f60', mapToSingleEvent: false, @@ -540,7 +754,13 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: true, }, { batchedRequest: { @@ -576,10 +796,17 @@ export const data = [ }, files: {}, }, - metadata: [{ jobId: 3, userId: 'u1' }], - batched: true, + metadata: [generateMetadata(3)], statusCode: 200, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '62d12498c37c4fd8a1a546c2d35c2f60', mapToSingleEvent: false, @@ -588,7 +815,13 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: true, }, { batchedRequest: { @@ -596,7 +829,10 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.iterable.com/api/events/trackBulk', - headers: { 'Content-Type': 'application/json', api_key: '12345' }, + headers: { + 'Content-Type': 'application/json', + api_key: '12345', + }, params: {}, body: { JSON: { @@ -623,10 +859,17 @@ export const data = [ }, files: {}, }, - metadata: [{ jobId: 4, userId: 'u1' }], - batched: true, + metadata: [generateMetadata(4)], statusCode: 200, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '12345', dataCenter: 'USDC', @@ -636,7 +879,13 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: true, }, { batchedRequest: { @@ -653,7 +902,9 @@ export const data = [ JSON: { user: { email: 'sayan@gmail.com', - dataFields: { email: 'sayan@gmail.com' }, + dataFields: { + email: 'sayan@gmail.com', + }, userId: '12345', preferUserId: true, mergeNestedObjects: true, @@ -687,10 +938,17 @@ export const data = [ }, files: {}, }, - metadata: [{ jobId: 6, userId: 'u1' }], - batched: false, + metadata: [generateMetadata(6)], statusCode: 200, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '62d12498c37c4fd8a1a546c2d35c2f60', dataCenter: 'USDC', @@ -700,7 +958,13 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: false, }, { batchedRequest: { @@ -734,10 +998,17 @@ export const data = [ }, files: {}, }, - metadata: [{ jobId: 7, userId: 'u1' }], - batched: true, + metadata: [generateMetadata(7)], statusCode: 200, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '62d12498c37c4fd8a1a546c2d35c2f60', dataCenter: 'USDC', @@ -747,7 +1018,13 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: true, }, { batchedRequest: { @@ -761,17 +1038,27 @@ export const data = [ }, params: {}, body: { - JSON: { currentEmail: 'old@email.com', newEmail: 'new@email.com' }, + JSON: { + currentEmail: 'old@email.com', + newEmail: 'new@email.com', + }, JSON_ARRAY: {}, XML: {}, FORM: {}, }, files: {}, }, - metadata: [{ jobId: 8, userId: 'u1' }], - batched: false, + metadata: [generateMetadata(8)], statusCode: 200, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '62d12498c37c4fd8a1a546c2d35c2f60', dataCenter: 'USDC', @@ -781,7 +1068,13 @@ export const data = [ trackNamedPages: false, }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: false, }, { batchedRequest: { @@ -789,7 +1082,10 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.iterable.com/api/users/bulkUpdate', - headers: { 'Content-Type': 'application/json', api_key: '12345' }, + headers: { + 'Content-Type': 'application/json', + api_key: '12345', + }, params: {}, body: { JSON: { @@ -817,8 +1113,7 @@ export const data = [ }, files: {}, }, - metadata: [{ jobId: 5, userId: 'u1' }], - batched: true, + metadata: [generateMetadata(5)], statusCode: 200, destination: { ID: '1zia9wKshXt80YksLmUdJnr7IHI', @@ -859,7 +1154,6 @@ export const data = [ transformAt: 'processor', transformAtV1: 'processor', }, - ResponseRules: null, }, Config: { apiKey: '12345', @@ -870,9 +1164,13 @@ export const data = [ trackNamedPages: true, }, Enabled: true, + WorkspaceID: 'default-workspace', Transformations: [], + RevisionID: 'default-revision', IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: true, }, ], }, @@ -880,8 +1178,11 @@ export const data = [ }, }, { + id: 'router-1736135082962', name: 'iterable', description: 'Simple identify call with EUDC dataCenter', + scenario: 'Default router scenario', + successCriteria: 'Router test should pass successfully', feature: 'router', module: 'destination', version: 'v0', @@ -895,7 +1196,10 @@ export const data = [ sentAt: '2022-09-27T11:13:03.777Z', messageId: '9ad41366-8060-4c9f-b181-f6bea67d5469', originalTimestamp: '2022-09-27T11:13:03.777Z', - traits: { ruchira: 'donaldbaker@ellis.com', new_field2: 'GB' }, + traits: { + ruchira: 'donaldbaker@ellis.com', + new_field2: 'GB', + }, channel: 'sources', rudderId: '3d51640c-ab09-42c1-b7b2-db6ab433b35e', context: { @@ -909,7 +1213,11 @@ export const data = [ }, mappedToDestination: 'true', externalId: [ - { id: 'Tiffany', type: 'ITERABLE-test-ruchira', identifierType: 'itemId' }, + { + id: 'Tiffany', + type: 'ITERABLE-test-ruchira', + identifierType: 'itemId', + }, ], }, timestamp: '2022-09-27T11:12:59.079Z', @@ -918,14 +1226,27 @@ export const data = [ recordId: '10', request_ip: '10.1.86.248', }, - metadata: { jobId: 2, userId: 'u1' }, + metadata: generateMetadata(1), destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', dataCenter: 'EUDC', hubID: '22066036', }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, { @@ -934,7 +1255,10 @@ export const data = [ sentAt: '2022-09-27T11:13:03.777Z', messageId: '9ad41366-8060-4c9f-b181-f6bea67d5469', originalTimestamp: '2022-09-27T11:13:03.777Z', - traits: { ruchira: 'abc@ellis.com', new_field2: 'GB1' }, + traits: { + ruchira: 'abc@ellis.com', + new_field2: 'GB1', + }, channel: 'sources', rudderId: '3d51640c-ab09-42c1-b7b2-db6ab433b35e', context: { @@ -948,7 +1272,11 @@ export const data = [ }, mappedToDestination: 'true', externalId: [ - { id: 'ABC', type: 'ITERABLE-test-ruchira', identifierType: 'itemId' }, + { + id: 'ABC', + type: 'ITERABLE-test-ruchira', + identifierType: 'itemId', + }, ], }, timestamp: '2022-09-27T11:12:59.079Z', @@ -957,19 +1285,33 @@ export const data = [ recordId: '10', request_ip: '10.1.86.248', }, - metadata: { jobId: 2, userId: 'u1' }, + metadata: generateMetadata(2), destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', dataCenter: 'EUDC', hubID: '22066036', }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, }, ], destType: 'iterable', }, + method: 'POST', }, }, output: { @@ -991,8 +1333,14 @@ export const data = [ body: { JSON: { documents: { - Tiffany: { ruchira: 'donaldbaker@ellis.com', new_field2: 'GB' }, - ABC: { ruchira: 'abc@ellis.com', new_field2: 'GB1' }, + Tiffany: { + ruchira: 'donaldbaker@ellis.com', + new_field2: 'GB', + }, + ABC: { + ruchira: 'abc@ellis.com', + new_field2: 'GB1', + }, }, replaceUploadedFieldsOnly: true, }, @@ -1002,20 +1350,159 @@ export const data = [ }, files: {}, }, - metadata: [ - { jobId: 2, userId: 'u1' }, - { jobId: 2, userId: 'u1' }, - ], - batched: true, + metadata: [generateMetadata(1), generateMetadata(2)], statusCode: 200, destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, Config: { apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', dataCenter: 'EUDC', hubID: '22066036', }, Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, }, + batched: true, + }, + ], + }, + }, + }, + }, + { + id: 'router-1736135082963', + name: 'iterable', + description: 'Already transformed event sent in the message body', + scenario: 'Default router scenario', + successCriteria: 'Router test should pass successfully', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + statusCode: 200, + version: '1', + type: 'REST' as MessageType, + method: 'POST', + endpoint: 'https://api.eu.iterable.com/api/catalogs/test-ruchira/items', + headers: { + 'Content-Type': 'application/json', + api_key: '583af2f8-15ba-49c0-8511-76383e7de07e', + }, + params: {}, + body: { + JSON: { + documents: { + Tiffany: { + ruchira: 'donaldbaker@ellis.com', + new_field2: 'GB', + }, + ABC: { + ruchira: 'abc@ellis.com', + new_field2: 'GB1', + }, + }, + replaceUploadedFieldsOnly: true, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: generateMetadata(4), + destination: { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: { + apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', + hubID: '22066036', + }, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, + }, + }, + ], + destType: 'iterable', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batched: true, + batchedRequest: { + body: { + FORM: {}, + JSON: { + documents: {}, + replaceUploadedFieldsOnly: true, + }, + JSON_ARRAY: {}, + XML: {}, + }, + endpoint: 'https://api.eu.iterable.com/api/catalogs/test-ruchira/items', + files: {}, + headers: { + 'Content-Type': 'application/json', + api_key: '583af2f8-15ba-49c0-8511-76383e7de07e', + }, + method: 'POST', + params: {}, + type: 'REST', + version: '1', + }, + destination: { + Config: { + apiKey: '583af2f8-15ba-49c0-8511-76383e7de07e', + hubID: '22066036', + }, + DestinationDefinition: { + Config: {}, + DisplayName: 'Default Display Name', + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + }, + Enabled: true, + ID: 'default-destination-id', + IsConnectionEnabled: true, + IsProcessorEnabled: true, + Name: 'Default Destination', + RevisionID: 'default-revision', + Transformations: [], + WorkspaceID: 'default-workspace', + }, + metadata: [generateMetadata(4)], + statusCode: 200, }, ], }, diff --git a/test/integrations/destinations/june/maskedSecrets.ts b/test/integrations/destinations/june/maskedSecrets.ts new file mode 100644 index 00000000000..c5a4dc839e8 --- /dev/null +++ b/test/integrations/destinations/june/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${secret1}`; diff --git a/test/integrations/destinations/june/processor/data.ts b/test/integrations/destinations/june/processor/data.ts index dfe35ed0a34..1f7772d5aaa 100644 --- a/test/integrations/destinations/june/processor/data.ts +++ b/test/integrations/destinations/june/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'june', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -64,7 +65,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -100,7 +101,7 @@ export const data = [ endpoint: 'https://api.june.so/api/identify', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic 93EMyDLvfpbRxxYn', + Authorization: authHeader1, }, params: {}, body: { @@ -139,7 +140,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -194,7 +195,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -229,7 +230,7 @@ export const data = [ endpoint: 'https://api.june.so/api/track', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic 93EMyDLvfpbRxxYn', + Authorization: authHeader1, }, params: {}, body: { @@ -270,7 +271,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -299,7 +300,7 @@ export const data = [ endpoint: 'https://api.june.so/api/track', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic 93EMyDLvfpbRxxYn', + Authorization: authHeader1, }, params: {}, body: { @@ -334,7 +335,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -370,7 +371,7 @@ export const data = [ endpoint: 'https://api.june.so/api/track', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic 93EMyDLvfpbRxxYn', + Authorization: authHeader1, }, params: {}, body: { @@ -414,7 +415,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -457,7 +458,7 @@ export const data = [ endpoint: 'https://api.june.so/api/track', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic 93EMyDLvfpbRxxYn', + Authorization: authHeader1, }, params: {}, body: { @@ -501,7 +502,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -538,7 +539,7 @@ export const data = [ endpoint: 'https://api.june.so/api/group', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic 93EMyDLvfpbRxxYn', + Authorization: authHeader1, }, params: {}, body: { @@ -581,7 +582,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -635,7 +636,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -690,7 +691,7 @@ export const data = [ { destination: { Config: { - apiKey: '93EMyDLvfpbRxxYn', + apiKey: secret1, }, ID: 'june123', }, @@ -725,7 +726,7 @@ export const data = [ endpoint: 'https://api.june.so/api/page', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic 93EMyDLvfpbRxxYn', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/june/router/data.ts b/test/integrations/destinations/june/router/data.ts index 81e5c6eb5aa..275ecd2bd62 100644 --- a/test/integrations/destinations/june/router/data.ts +++ b/test/integrations/destinations/june/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'fb', @@ -10,7 +11,7 @@ export const data = [ body: { input: [ { - destination: { Config: { apiKey: '93EMyDLvfpbRxxYn' }, ID: 'june123' }, + destination: { Config: { apiKey: secret1 }, ID: 'june123' }, metadata: { jobId: 1, userId: 'u1' }, message: { type: 'identify', @@ -24,7 +25,7 @@ export const data = [ }, }, { - destination: { Config: { apiKey: '93EMyDLvfpbRxxYn' }, ID: 'june123' }, + destination: { Config: { apiKey: secret1 }, ID: 'june123' }, metadata: { jobId: 2, userId: 'u1' }, message: { type: 'track', @@ -69,7 +70,7 @@ export const data = [ endpoint: 'https://api.june.so/api/identify', files: {}, headers: { - Authorization: 'Basic 93EMyDLvfpbRxxYn', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -77,12 +78,12 @@ export const data = [ type: 'REST', version: '1', }, - destination: { Config: { apiKey: '93EMyDLvfpbRxxYn' }, ID: 'june123' }, + destination: { Config: { apiKey: secret1 }, ID: 'june123' }, metadata: [{ jobId: 1, userId: 'u1' }], statusCode: 200, }, { - destination: { Config: { apiKey: '93EMyDLvfpbRxxYn' }, ID: 'june123' }, + destination: { Config: { apiKey: secret1 }, ID: 'june123' }, batched: false, error: 'Missing required value from "userIdOnly"', metadata: [{ jobId: 2, userId: 'u1' }], diff --git a/test/integrations/destinations/klaviyo/maskedSecrets.ts b/test/integrations/destinations/klaviyo/maskedSecrets.ts new file mode 100644 index 00000000000..333e6fa6b79 --- /dev/null +++ b/test/integrations/destinations/klaviyo/maskedSecrets.ts @@ -0,0 +1,7 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secretBadApiKey = path.basename(__dirname) + 2; + +export const authHeader1 = `Klaviyo-API-Key ${secret1}`; +export const authHeaderBadApiKey = `Klaviyo-API-Key ${secretBadApiKey}`; diff --git a/test/integrations/destinations/klaviyo/network.ts b/test/integrations/destinations/klaviyo/network.ts index d76d235c6f3..0b19ad781ed 100644 --- a/test/integrations/destinations/klaviyo/network.ts +++ b/test/integrations/destinations/klaviyo/network.ts @@ -1,3 +1,5 @@ +import { authHeaderBadApiKey } from './maskedSecrets'; + export const networkCallsData = [ { httpReq: { @@ -51,7 +53,7 @@ export const networkCallsData = [ httpReq: { url: 'https://a.klaviyo.com/api/profiles', method: 'POST', - headers: { Authorization: 'Klaviyo-API-Key dummyPrivateApiKeyforfailure' }, + headers: { Authorization: authHeaderBadApiKey }, }, httpRes: {}, }, diff --git a/test/integrations/destinations/klaviyo/processor/ecomTestData.ts b/test/integrations/destinations/klaviyo/processor/ecomTestData.ts index 34eff45232a..7b1d7b802e3 100644 --- a/test/integrations/destinations/klaviyo/processor/ecomTestData.ts +++ b/test/integrations/destinations/klaviyo/processor/ecomTestData.ts @@ -1,6 +1,7 @@ import { overrideDestination, transformResultBuilder, generateMetadata } from '../../../testUtils'; import { ProcessorTestData } from '../../../testTypes'; import { Destination } from '../../../../../src/types'; +import { secret1, authHeader1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', @@ -13,7 +14,7 @@ const destination: Destination = { }, Config: { publicApiKey: 'dummyPublicApiKey', - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, }, Enabled: true, WorkspaceID: '123', @@ -33,7 +34,7 @@ const commonTraits = { const eventsEndpoint = 'https://a.klaviyo.com/api/events'; const commonOutputHeaders = { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2023-02-22', @@ -80,6 +81,7 @@ export const ecomTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -188,6 +190,7 @@ export const ecomTestData: ProcessorTestData[] = [ metadata: generateMetadata(2), }, ], + method: 'POST', }, }, output: { @@ -300,6 +303,7 @@ export const ecomTestData: ProcessorTestData[] = [ metadata: generateMetadata(3), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/klaviyo/processor/groupTestData.ts b/test/integrations/destinations/klaviyo/processor/groupTestData.ts index 0002f7ce90e..92ddd163402 100644 --- a/test/integrations/destinations/klaviyo/processor/groupTestData.ts +++ b/test/integrations/destinations/klaviyo/processor/groupTestData.ts @@ -5,7 +5,7 @@ import { generateSimplifiedGroupPayload, transformResultBuilder, } from '../../../testUtils'; - +import { secret1, authHeader1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', Name: 'klaviyo', @@ -17,7 +17,7 @@ const destination: Destination = { }, Config: { publicApiKey: 'dummyPublicApiKey', - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, }, Enabled: true, WorkspaceID: '123', @@ -26,7 +26,7 @@ const destination: Destination = { const headers = { Accept: 'application/json', - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', revision: '2023-02-22', }; @@ -67,6 +67,7 @@ export const groupTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -131,6 +132,7 @@ export const groupTestData: ProcessorTestData[] = [ metadata: generateMetadata(2), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/klaviyo/processor/groupTestDataV2.ts b/test/integrations/destinations/klaviyo/processor/groupTestDataV2.ts index da7769b1105..bc99a19b53d 100644 --- a/test/integrations/destinations/klaviyo/processor/groupTestDataV2.ts +++ b/test/integrations/destinations/klaviyo/processor/groupTestDataV2.ts @@ -5,6 +5,7 @@ import { generateSimplifiedGroupPayload, transformResultBuilder, } from '../../../testUtils'; +import { secret1, authHeader1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', @@ -17,7 +18,7 @@ const destination: Destination = { }, Config: { apiVersion: 'v2', - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, consent: ['email'], }, Enabled: true, @@ -26,7 +27,7 @@ const destination: Destination = { }; const headers = { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2024-06-15', @@ -108,6 +109,7 @@ export const groupTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -168,6 +170,7 @@ export const groupTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -228,6 +231,7 @@ export const groupTestData: ProcessorTestData[] = [ metadata: generateMetadata(2), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/klaviyo/processor/identifyTestData.ts b/test/integrations/destinations/klaviyo/processor/identifyTestData.ts index 0dd47511330..3b099f76e32 100644 --- a/test/integrations/destinations/klaviyo/processor/identifyTestData.ts +++ b/test/integrations/destinations/klaviyo/processor/identifyTestData.ts @@ -7,6 +7,7 @@ import { } from '../../../testUtils'; import { ProcessorTestData } from '../../../testTypes'; import { Destination } from '../../../../../src/types'; +import { secret1, authHeader1, secretBadApiKey } from '../maskedSecrets'; const destination: Destination = { ID: '123', @@ -19,7 +20,7 @@ const destination: Destination = { }, Config: { publicApiKey: 'dummyPublicApiKey', - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, }, Enabled: true, WorkspaceID: '123', @@ -90,7 +91,7 @@ const commonOutputSubscriptionProps = { }; const commonOutputHeaders = { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2023-02-22', @@ -133,6 +134,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -212,6 +214,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(2), }, ], + method: 'POST', }, }, output: { @@ -279,7 +282,7 @@ export const identifyData: ProcessorTestData[] = [ { destination: overrideDestination(destination, { publicApiKey: 'dummyPublicApiKey', - privateApiKey: 'dummyPrivateApiKeyforfailure', + privateApiKey: secretBadApiKey, }), message: generateSimplifiedIdentifyPayload({ sentAt, @@ -296,6 +299,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(3), }, ], + method: 'POST', }, }, output: { @@ -303,8 +307,10 @@ export const identifyData: ProcessorTestData[] = [ status: 200, body: [ { - error: - '{"message":"Failed to create user due to \\"\\"","destinationResponse":"\\"\\""}', + error: JSON.stringify({ + message: 'Failed to create user due to ""', + destinationResponse: '""', + }), statTags: { destType: 'KLAVIYO', errorCategory: 'network', @@ -352,6 +358,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(4), }, ], + method: 'POST', }, }, output: { @@ -406,6 +413,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(5), }, ], + method: 'POST', }, }, output: { @@ -488,6 +496,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(6), }, ], + method: 'POST', }, }, output: { @@ -565,6 +574,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(7), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/klaviyo/processor/identifyTestDataV2.ts b/test/integrations/destinations/klaviyo/processor/identifyTestDataV2.ts index 612bfe88f89..a5e3ae7ee16 100644 --- a/test/integrations/destinations/klaviyo/processor/identifyTestDataV2.ts +++ b/test/integrations/destinations/klaviyo/processor/identifyTestDataV2.ts @@ -7,6 +7,7 @@ import { } from '../../../testUtils'; import { ProcessorTestData } from '../../../testTypes'; import { Destination } from '../../../../../src/types'; +import { secret1, authHeader1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', @@ -19,7 +20,7 @@ const destination: Destination = { }, Config: { apiVersion: 'v2', - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, }, Enabled: true, WorkspaceID: '123', @@ -110,7 +111,7 @@ const subscriptionRelations = { }; const commonOutputHeaders = { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2024-06-15', @@ -162,6 +163,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(2), }, ], + method: 'POST', }, }, output: { @@ -254,6 +256,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(2), }, ], + method: 'POST', }, }, output: { @@ -357,6 +360,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(4), }, ], + method: 'POST', }, }, output: { @@ -424,6 +428,7 @@ export const identifyData: ProcessorTestData[] = [ metadata: generateMetadata(5), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/klaviyo/processor/screenTestData.ts b/test/integrations/destinations/klaviyo/processor/screenTestData.ts index 0a20110236b..24b3695eba9 100644 --- a/test/integrations/destinations/klaviyo/processor/screenTestData.ts +++ b/test/integrations/destinations/klaviyo/processor/screenTestData.ts @@ -5,6 +5,7 @@ import { generateSimplifiedPageOrScreenPayload, transformResultBuilder, } from '../../../testUtils'; +import { secret1, authHeader1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', @@ -17,7 +18,7 @@ const destination: Destination = { }, Config: { publicApiKey: 'dummyPublicApiKey', - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, }, Enabled: true, WorkspaceID: '123', @@ -67,6 +68,7 @@ export const screenTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -79,7 +81,7 @@ export const screenTestData: ProcessorTestData[] = [ endpoint: 'https://a.klaviyo.com/api/events', headers: { Accept: 'application/json', - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', revision: '2023-02-22', }, diff --git a/test/integrations/destinations/klaviyo/processor/screenTestDataV2.ts b/test/integrations/destinations/klaviyo/processor/screenTestDataV2.ts index 5ccbed600c1..7195c4836aa 100644 --- a/test/integrations/destinations/klaviyo/processor/screenTestDataV2.ts +++ b/test/integrations/destinations/klaviyo/processor/screenTestDataV2.ts @@ -5,7 +5,7 @@ import { generateSimplifiedPageOrScreenPayload, transformResultBuilder, } from '../../../testUtils'; - +import { secret1, authHeader1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', Name: 'klaviyo', @@ -17,7 +17,7 @@ const destination: Destination = { }, Config: { apiVersion: 'v2', - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, }, Enabled: true, WorkspaceID: '123', @@ -55,7 +55,7 @@ export const screenTestData: ProcessorTestData[] = [ id: 'user@1', age: '22', email: 'test@rudderstack.com', - phone: '9112340375', + phone: '+9112340375', anonymousId: '9c6bd77ea9da3e68', append1: 'value1', }, @@ -75,6 +75,7 @@ export const screenTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -87,7 +88,7 @@ export const screenTestData: ProcessorTestData[] = [ endpoint: 'https://a.klaviyo.com/api/events', headers: { Accept: 'application/json', - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', revision: '2024-06-15', }, @@ -124,7 +125,7 @@ export const screenTestData: ProcessorTestData[] = [ }, }, }, - phone_number: '9112340375', + phone_number: '+9112340375', properties: { id: 'user@1', age: '22', diff --git a/test/integrations/destinations/klaviyo/processor/trackTestData.ts b/test/integrations/destinations/klaviyo/processor/trackTestData.ts index 3bc2b1747ad..50a76f3144b 100644 --- a/test/integrations/destinations/klaviyo/processor/trackTestData.ts +++ b/test/integrations/destinations/klaviyo/processor/trackTestData.ts @@ -7,6 +7,7 @@ import { overrideDestination, transformResultBuilder, } from '../../../testUtils'; +import { secret1, authHeader1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', @@ -19,7 +20,7 @@ const destination: Destination = { }, Config: { publicApiKey: 'dummyPublicApiKey', - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, }, Enabled: true, WorkspaceID: '123', @@ -40,7 +41,7 @@ const commonProps = { const commonOutputHeaders = { Accept: 'application/json', - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', revision: '2023-02-22', }; @@ -88,6 +89,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -170,6 +172,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(2), }, ], + method: 'POST', }, }, output: { @@ -244,6 +247,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(3), }, ], + method: 'POST', }, }, output: { @@ -312,6 +316,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(4), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/klaviyo/processor/trackTestDataV2.ts b/test/integrations/destinations/klaviyo/processor/trackTestDataV2.ts index ecea141d386..8fb6ec84785 100644 --- a/test/integrations/destinations/klaviyo/processor/trackTestDataV2.ts +++ b/test/integrations/destinations/klaviyo/processor/trackTestDataV2.ts @@ -7,7 +7,7 @@ import { overrideDestination, transformResultBuilder, } from '../../../testUtils'; - +import { secret1, authHeader1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', Name: 'klaviyo', @@ -18,7 +18,7 @@ const destination: Destination = { Config: {}, }, Config: { - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, apiVersion: 'v2', }, Enabled: true, @@ -40,13 +40,13 @@ const commonProps = { const commonOutputHeaders = { Accept: 'application/json', - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', revision: '2024-06-15', }; const profileAttributes = { email: 'test@rudderstack.com', - phone_number: '9112340375', + phone_number: '+9112340375', anonymous_id: '9c6bd77ea9da3e68', properties: { age: '22', @@ -86,7 +86,7 @@ export const trackTestData: ProcessorTestData[] = [ ...commonTraits, name: 'Test', email: 'test@rudderstack.com', - phone: '9112340375', + phone: '+9112340375', description: 'Sample description', }, }, @@ -101,6 +101,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(2), }, ], + method: 'POST', }, }, output: { @@ -173,7 +174,7 @@ export const trackTestData: ProcessorTestData[] = [ description: 'Sample description', name: 'Test', email: 'test@rudderstack.com', - phone: '9112340375', + phone: '+9112340375', }, }, properties: commonProps, @@ -183,6 +184,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(3), }, ], + method: 'POST', }, }, output: { @@ -255,7 +257,7 @@ export const trackTestData: ProcessorTestData[] = [ description: 'Sample description', name: 'Test', email: 'test@rudderstack.com', - phone: '9112340375', + phone: '+9112340375', }, }, properties: { ...commonProps, value: { price: 9.99 } }, @@ -265,6 +267,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -290,4 +293,65 @@ export const trackTestData: ProcessorTestData[] = [ }, }, }, + { + id: 'klaviyo-track-150624-test-4', + name: 'klaviyo', + description: '150624 -> Track event call, with phone not in E.164 format', + scenario: 'Business', + successCriteria: + 'Response should an error message and status code should be 400, as Phone number is not in E.164 format.', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: overrideDestination(destination, { enforceEmailAsPrimary: true }), + message: generateSimplifiedTrackPayload({ + type: 'track', + event: 'TestEven001', + sentAt: '2025-01-01T11:11:11.111Z', + userId: 'invalidPhoneUser', + context: { + traits: { + ...commonTraits, + description: 'Sample description', + name: 'Test', + email: 'test@rudderstack.com', + phone: '9112340375', + }, + }, + properties: commonProps, + originalTimestamp: '2025-01-01T11:11:11.111Z', + }), + metadata: generateMetadata(4), + }, + ], + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: [ + { + error: 'Phone number is not in E.164 format.', + statTags: { + destType: 'KLAVIYO', + destinationId: 'default-destinationId', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'processor', + implementation: 'native', + module: 'destination', + workspaceId: 'default-workspaceId', + }, + statusCode: 400, + metadata: generateMetadata(4), + }, + ], + }, + }, + }, ]; diff --git a/test/integrations/destinations/klaviyo/processor/validationTestData.ts b/test/integrations/destinations/klaviyo/processor/validationTestData.ts index 801e03d5417..868ca760eb5 100644 --- a/test/integrations/destinations/klaviyo/processor/validationTestData.ts +++ b/test/integrations/destinations/klaviyo/processor/validationTestData.ts @@ -1,6 +1,7 @@ -import { Destination } from '../../../../../src/types'; +import { Destination, MessageType } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { generateMetadata } from '../../../testUtils'; +import { secret1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', @@ -13,7 +14,7 @@ const destination: Destination = { }, Config: { publicApiKey: 'dummyPublicApiKey', - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, }, Enabled: true, WorkspaceID: '123', @@ -38,7 +39,7 @@ export const validationTestData: ProcessorTestData[] = [ destination, message: { userId: 'user123', - type: 'random', + type: 'random' as MessageType, groupId: 'XUepkK', traits: { subscribe: true, @@ -55,6 +56,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/klaviyo/processor/validationTestDataV2.ts b/test/integrations/destinations/klaviyo/processor/validationTestDataV2.ts index 10e2d15db0d..762861a3500 100644 --- a/test/integrations/destinations/klaviyo/processor/validationTestDataV2.ts +++ b/test/integrations/destinations/klaviyo/processor/validationTestDataV2.ts @@ -1,7 +1,7 @@ -import { Destination } from '../../../../../src/types'; +import { Destination, MessageType } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { generateMetadata } from '../../../testUtils'; - +import { secret1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', Name: 'klaviyo', @@ -12,7 +12,7 @@ const destination: Destination = { Config: {}, }, Config: { - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, apiVersion: 'v2', }, Enabled: true, @@ -38,7 +38,7 @@ export const validationTestData: ProcessorTestData[] = [ destination, message: { userId: 'user123', - type: 'random', + type: 'random' as MessageType, groupId: 'XUepkK', traits: { subscribe: true, @@ -55,6 +55,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/klaviyo/router/commonConfig.ts b/test/integrations/destinations/klaviyo/router/commonConfig.ts index a1297635eb9..f2ccfbf11a8 100644 --- a/test/integrations/destinations/klaviyo/router/commonConfig.ts +++ b/test/integrations/destinations/klaviyo/router/commonConfig.ts @@ -1,5 +1,11 @@ import { generateMetadata } from '../../../testUtils'; -import { Destination, RouterTransformationRequest } from '../../../../../src/types'; +import { + Destination, + RouterTransformationRequest, + RouterTransformationRequestData, +} from '../../../../../src/types'; +import { secret1 } from '../maskedSecrets'; + const destination: Destination = { ID: '123', Name: 'klaviyo', @@ -10,7 +16,7 @@ const destination: Destination = { Config: {}, }, Config: { - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, }, Enabled: true, WorkspaceID: '123', @@ -26,7 +32,7 @@ const destinationV2: Destination = { Config: {}, }, Config: { - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, apiVersion: 'v2', }, Enabled: true, @@ -190,10 +196,10 @@ const getRequest = (apiVersion) => { ]; }; export const routerRequest: RouterTransformationRequest = { - input: getRequest('v1'), + input: getRequest('v1') as unknown as RouterTransformationRequestData[], destType: 'klaviyo', }; export const routerRequestV2: RouterTransformationRequest = { - input: getRequest('v2'), + input: getRequest('v2') as unknown as RouterTransformationRequestData[], destType: 'klaviyo', }; diff --git a/test/integrations/destinations/klaviyo/router/data.ts b/test/integrations/destinations/klaviyo/router/data.ts index 1b3f7f39ada..937c49983c5 100644 --- a/test/integrations/destinations/klaviyo/router/data.ts +++ b/test/integrations/destinations/klaviyo/router/data.ts @@ -3,6 +3,7 @@ import { RouterTestData } from '../../../testTypes'; import { routerRequest } from './commonConfig'; import { generateMetadata } from '../../../testUtils'; import { dataV2 } from './dataV2'; +import { secret1, authHeader1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', @@ -14,7 +15,7 @@ const destination: Destination = { Config: {}, }, Config: { - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, }, Enabled: true, WorkspaceID: '123', @@ -34,6 +35,7 @@ export const data: RouterTestData[] = [ input: { request: { body: routerRequest, + method: 'POST', }, }, output: { @@ -49,7 +51,7 @@ export const data: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-subscription-bulk-create-jobs', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2023-02-22', @@ -87,7 +89,7 @@ export const data: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-subscription-bulk-create-jobs', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2023-02-22', @@ -121,7 +123,7 @@ export const data: RouterTestData[] = [ method: 'PATCH', endpoint: 'https://a.klaviyo.com/api/profiles/01GW3PHVY0MTCDGS0A1612HARX', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2023-02-22', @@ -169,7 +171,7 @@ export const data: RouterTestData[] = [ method: 'PATCH', endpoint: 'https://a.klaviyo.com/api/profiles/01GW3PHVY0MTCDGS0A1612HARX', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2023-02-22', diff --git a/test/integrations/destinations/klaviyo/router/dataV2.ts b/test/integrations/destinations/klaviyo/router/dataV2.ts index 5a0a06fad10..70371f2d421 100644 --- a/test/integrations/destinations/klaviyo/router/dataV2.ts +++ b/test/integrations/destinations/klaviyo/router/dataV2.ts @@ -1,7 +1,8 @@ -import { Destination } from '../../../../../src/types'; +import { Destination, RouterTransformationRequestData } from '../../../../../src/types'; import { RouterTestData } from '../../../testTypes'; import { routerRequestV2 } from './commonConfig'; import { generateMetadata, transformResultBuilder } from '../../../testUtils'; +import { secret1, authHeader1 } from '../maskedSecrets'; const destination: Destination = { ID: '123', @@ -13,7 +14,7 @@ const destination: Destination = { Config: {}, }, Config: { - privateApiKey: 'dummyPrivateApiKey', + privateApiKey: secret1, apiVersion: 'v2', }, Enabled: true, @@ -23,7 +24,7 @@ const destination: Destination = { const userProfileCommonEndpoint = 'https://a.klaviyo.com/api/profile-import'; const headers = { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2024-06-15', @@ -73,7 +74,7 @@ const alreadyTransformedEvent = { }, metadata: generateMetadata(10), destination, -}; +} as unknown as RouterTransformationRequestData; export const dataV2: RouterTestData[] = [ { @@ -89,6 +90,7 @@ export const dataV2: RouterTestData[] = [ input: { request: { body: routerRequestV2, + method: 'POST', }, }, output: { @@ -422,6 +424,7 @@ export const dataV2: RouterTestData[] = [ ], destType: 'klaviyo', }, + method: 'POST', }, }, output: { @@ -694,6 +697,7 @@ export const dataV2: RouterTestData[] = [ ], destType: 'klaviyo', }, + method: 'POST', }, }, output: { @@ -728,7 +732,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/events', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -787,7 +791,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/events', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -844,7 +848,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-import', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -878,7 +882,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-import', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -911,7 +915,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-subscription-bulk-create-jobs', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2024-06-15', @@ -982,7 +986,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/events', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -1113,6 +1117,7 @@ export const dataV2: RouterTestData[] = [ ], destType: 'klaviyo', }, + method: 'POST', }, }, output: { @@ -1128,7 +1133,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-import', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -1162,7 +1167,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-subscription-bulk-create-jobs', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2024-06-15', @@ -1221,7 +1226,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-import', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -1371,6 +1376,7 @@ export const dataV2: RouterTestData[] = [ ], destType: 'klaviyo', }, + method: 'POST', }, }, output: { @@ -1734,6 +1740,7 @@ export const dataV2: RouterTestData[] = [ ], destType: 'klaviyo', }, + method: 'POST', }, }, output: { @@ -1749,7 +1756,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/events', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -1808,7 +1815,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/events', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -1865,7 +1872,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-import', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -1899,7 +1906,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-import', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -1932,7 +1939,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/profile-subscription-bulk-delete-jobs', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', Accept: 'application/json', revision: '2024-06-15', @@ -1989,7 +1996,7 @@ export const dataV2: RouterTestData[] = [ method: 'POST', endpoint: 'https://a.klaviyo.com/api/events', headers: { - Authorization: 'Klaviyo-API-Key dummyPrivateApiKey', + Authorization: authHeader1, Accept: 'application/json', 'Content-Type': 'application/json', revision: '2024-06-15', @@ -2044,4 +2051,108 @@ export const dataV2: RouterTestData[] = [ }, }, }, + { + id: 'klaviyo-router-150624-test-7', + name: 'klaviyo', + description: + '150624 -> Router tests to check for invalid phone number format in identify and track calls and should throw error', + scenario: 'Framework', + successCriteria: 'Should throw invalid phone number error for identify and track calls', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + userId: 'user123', + type: 'identify', + traits: { subscribe: true }, + context: { + traits: { + email: 'test@rudderstack.com', + phone: '123321000', + consent: 'email', + }, + ip: '14.5.67.21', + library: { name: 'http' }, + }, + timestamp: '2020-01-21T00:21:34.208Z', + }, + destination, + metadata: generateMetadata(1), + }, + { + message: { + type: 'track', + event: 'TestEven001', + sentAt: '2025-01-01T11:11:11.111Z', + userId: 'invalidPhoneUser', + context: { + traits: { + name: 'Test', + email: 'test@rudderstack.com', + phone: '9112340375', + }, + }, + properties: { + price: 120, + }, + originalTimestamp: '2025-01-01T11:11:11.111Z', + }, + metadata: generateMetadata(2), + destination, + }, + ], + destType: 'klaviyo', + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + error: 'Phone number is not in E.164 format.', + statTags: { + destType: 'KLAVIYO', + destinationId: 'default-destinationId', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'router', + implementation: 'native', + module: 'destination', + workspaceId: 'default-workspaceId', + }, + metadata: [generateMetadata(1)], + batched: false, + statusCode: 400, + destination, + }, + { + error: 'Phone number is not in E.164 format.', + statTags: { + destType: 'KLAVIYO', + destinationId: 'default-destinationId', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'router', + implementation: 'native', + module: 'destination', + workspaceId: 'default-workspaceId', + }, + metadata: [generateMetadata(2)], + batched: false, + statusCode: 400, + destination, + }, + ], + }, + }, + }, + }, ]; diff --git a/test/integrations/destinations/koddi/processor/clicks.ts b/test/integrations/destinations/koddi/processor/clicks.ts index 6101e9bafef..0b27c424425 100644 --- a/test/integrations/destinations/koddi/processor/clicks.ts +++ b/test/integrations/destinations/koddi/processor/clicks.ts @@ -40,6 +40,7 @@ export const clicks: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/koddi/processor/conversions.ts b/test/integrations/destinations/koddi/processor/conversions.ts index 1647ffed7db..f4516bfb984 100644 --- a/test/integrations/destinations/koddi/processor/conversions.ts +++ b/test/integrations/destinations/koddi/processor/conversions.ts @@ -52,6 +52,7 @@ export const conversions: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -122,6 +123,7 @@ export const conversions: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/koddi/processor/impressions.ts b/test/integrations/destinations/koddi/processor/impressions.ts index 840ed9139fc..90c1d6b6ae7 100644 --- a/test/integrations/destinations/koddi/processor/impressions.ts +++ b/test/integrations/destinations/koddi/processor/impressions.ts @@ -40,6 +40,7 @@ export const impressions: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/kustomer/maskedSecrets.ts b/test/integrations/destinations/kustomer/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/kustomer/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/kustomer/processor/data.ts b/test/integrations/destinations/kustomer/processor/data.ts index ba8407baaff..5ba9964f6a8 100644 --- a/test/integrations/destinations/kustomer/processor/data.ts +++ b/test/integrations/destinations/kustomer/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'kustomer', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, message: { @@ -105,7 +106,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/customers', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -188,7 +189,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, message: { @@ -248,7 +249,7 @@ export const data = [ 'https://api.kustomerapp.com/v1/customers/58210c3db0f09110006b7953?replace=false', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -289,7 +290,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, message: { @@ -365,7 +366,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -407,7 +408,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, message: { @@ -486,7 +487,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -533,7 +534,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, message: { @@ -612,7 +613,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -660,7 +661,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, message: { @@ -730,7 +731,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -773,7 +774,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, message: { @@ -842,7 +843,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -885,7 +886,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, genericPage: true, }, }, @@ -958,7 +959,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1004,7 +1005,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, genericScreen: true, }, }, @@ -1081,7 +1082,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1123,7 +1124,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, message: { @@ -1218,7 +1219,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/customers', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1301,7 +1302,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, message: { @@ -1401,7 +1402,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/customers', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1484,7 +1485,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, message: { @@ -1590,7 +1591,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/customers/abcd1234?replace=false', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1673,7 +1674,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, genericScreen: true, }, }, @@ -1749,7 +1750,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1791,7 +1792,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, baseEndpoint: 'https://api.prod2.kustomerapp.com', genericScreen: true, }, @@ -1868,7 +1869,7 @@ export const data = [ endpoint: 'https://api.prod2.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/kustomer/router/data.ts b/test/integrations/destinations/kustomer/router/data.ts index 06f6243cf20..e5fdc384b08 100644 --- a/test/integrations/destinations/kustomer/router/data.ts +++ b/test/integrations/destinations/kustomer/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'kustomer', @@ -77,7 +78,7 @@ export const data = [ }, metadata: { jobId: 1, userId: 'u1' }, destination: { - Config: { apiKey: 'dummyApiKey', genericPage: false, genericScreen: false }, + Config: { apiKey: secret1, genericPage: false, genericScreen: false }, }, }, { @@ -124,7 +125,7 @@ export const data = [ }, metadata: { jobId: 2, userId: 'u1' }, destination: { - Config: { apiKey: 'dummyApiKey', genericPage: false, genericScreen: false }, + Config: { apiKey: secret1, genericPage: false, genericScreen: false }, }, }, { @@ -173,7 +174,7 @@ export const data = [ destination: { Config: { baseEndpoint: 'https://api.prod2.kustomerapp.com', - apiKey: 'dummyApiKey', + apiKey: secret1, genericPage: false, genericScreen: false, }, @@ -197,7 +198,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/customers', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -246,7 +247,7 @@ export const data = [ batched: false, statusCode: 200, destination: { - Config: { apiKey: 'dummyApiKey', genericPage: false, genericScreen: false }, + Config: { apiKey: secret1, genericPage: false, genericScreen: false }, }, }, { @@ -257,7 +258,7 @@ export const data = [ endpoint: 'https://api.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -280,7 +281,7 @@ export const data = [ batched: false, statusCode: 200, destination: { - Config: { apiKey: 'dummyApiKey', genericPage: false, genericScreen: false }, + Config: { apiKey: secret1, genericPage: false, genericScreen: false }, }, }, { @@ -291,7 +292,7 @@ export const data = [ endpoint: 'https://api.prod2.kustomerapp.com/v1/tracking/identityEvent', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -316,7 +317,7 @@ export const data = [ destination: { Config: { baseEndpoint: 'https://api.prod2.kustomerapp.com', - apiKey: 'dummyApiKey', + apiKey: secret1, genericPage: false, genericScreen: false, }, diff --git a/test/integrations/destinations/lambda/processor/data.ts b/test/integrations/destinations/lambda/processor/data.ts index 540de25417d..b6149139964 100644 --- a/test/integrations/destinations/lambda/processor/data.ts +++ b/test/integrations/destinations/lambda/processor/data.ts @@ -238,8 +238,22 @@ export const data = [ resultSetID: 10, }, output: { - payload: - '{"type":"identify","sentAt":"2022-08-03T10:44:55.382+05:30","userId":"user113","context":{"os":{"name":"android"},"device":{"name":"Mi","token":"qwertyuioprtyuiop"},"traits":{"name":"User2","email":"user112@mail.com"}},"rudderId":"ed33ef22-569d-44b1-a6cb-063c69dca8f0","messageId":"29beef33-2771-45fd-adb4-4376aa6d72d9","timestamp":"2022-08-03T10:44:54.942+05:30","receivedAt":"2022-08-03T10:44:54.943+05:30","request_ip":"[::1]","originalTimestamp":"2022-08-03T10:44:55.382+05:30"}', + payload: JSON.stringify({ + type: 'identify', + sentAt: '2022-08-03T10:44:55.382+05:30', + userId: 'user113', + context: { + os: { name: 'android' }, + device: { name: 'Mi', token: 'qwertyuioprtyuiop' }, + traits: { name: 'User2', email: 'user112@mail.com' }, + }, + rudderId: 'ed33ef22-569d-44b1-a6cb-063c69dca8f0', + messageId: '29beef33-2771-45fd-adb4-4376aa6d72d9', + timestamp: '2022-08-03T10:44:54.942+05:30', + receivedAt: '2022-08-03T10:44:54.943+05:30', + request_ip: '[::1]', + originalTimestamp: '2022-08-03T10:44:55.382+05:30', + }), destConfig: { clientContext: '', invocationType: 'Event', lambda: 'testFunction' }, userId: '', }, diff --git a/test/integrations/destinations/lambda/router/data.ts b/test/integrations/destinations/lambda/router/data.ts index cba30e09747..ba580f0d335 100644 --- a/test/integrations/destinations/lambda/router/data.ts +++ b/test/integrations/destinations/lambda/router/data.ts @@ -29834,8 +29834,41 @@ export const data = [ }, { batchedRequest: { - payload: - '[{"name":"Screen View","type":"screen","sentAt":"2022-08-18T08:43:15.539+05:30","userId":"identified user id","context":{"ip":"14.5.67.21","library":{"name":"http"}},"rudderId":"daf823fb-e8d3-413a-8313-d34cd756f968","messageId":"1b8ee4c3-ffad-4457-b453-31b32da1dfea","timestamp":"2020-02-02T00:23:09.544Z","properties":{"prop1":"5"},"receivedAt":"2022-08-18T08:43:13.521+05:30","request_ip":"[::1]","anonymousId":"anon-id-new","originalTimestamp":"2022-08-18T08:43:15.539+05:30"},{"type":"group","sentAt":"2022-08-18T08:43:15.539+05:30","traits":{"name":"Company","industry":"Industry","employees":123},"userId":"user123","context":{"ip":"14.5.67.21","traits":{"trait1":"new-val"},"library":{"name":"http"}},"groupId":"group1","rudderId":"bda76e3e-87eb-4153-9d1e-e9c2ed48b7a5","messageId":"2c59b527-3235-4fc2-9680-f41ec52ebb51","timestamp":"2020-01-21T00:21:34.208Z","receivedAt":"2022-08-18T08:43:13.521+05:30","request_ip":"[::1]","originalTimestamp":"2022-08-18T08:43:15.539+05:30"}]', + payload: JSON.stringify([ + { + name: 'Screen View', + type: 'screen', + sentAt: '2022-08-18T08:43:15.539+05:30', + userId: 'identified user id', + context: { ip: '14.5.67.21', library: { name: 'http' } }, + rudderId: 'daf823fb-e8d3-413a-8313-d34cd756f968', + messageId: '1b8ee4c3-ffad-4457-b453-31b32da1dfea', + timestamp: '2020-02-02T00:23:09.544Z', + properties: { prop1: '5' }, + receivedAt: '2022-08-18T08:43:13.521+05:30', + request_ip: '[::1]', + anonymousId: 'anon-id-new', + originalTimestamp: '2022-08-18T08:43:15.539+05:30', + }, + { + type: 'group', + sentAt: '2022-08-18T08:43:15.539+05:30', + traits: { name: 'Company', industry: 'Industry', employees: 123 }, + userId: 'user123', + context: { + ip: '14.5.67.21', + traits: { trait1: 'new-val' }, + library: { name: 'http' }, + }, + groupId: 'group1', + rudderId: 'bda76e3e-87eb-4153-9d1e-e9c2ed48b7a5', + messageId: '2c59b527-3235-4fc2-9680-f41ec52ebb51', + timestamp: '2020-01-21T00:21:34.208Z', + receivedAt: '2022-08-18T08:43:13.521+05:30', + request_ip: '[::1]', + originalTimestamp: '2022-08-18T08:43:15.539+05:30', + }, + ]), destConfig: { clientContext: '', lambda: 'testFunction', invocationType: 'Event' }, }, metadata: [ @@ -29990,8 +30023,25 @@ export const data = [ }, { batchedRequest: { - payload: - '[{"type":"alias","sentAt":"2022-08-18T08:43:15.539+05:30","userId":"user123","context":{"ip":"14.5.67.21","traits":{"trait1":"new-val"},"library":{"name":"http"}},"rudderId":"bda76e3e-87eb-4153-9d1e-e9c2ed48b7a5","messageId":"3ff8d400-b6d4-43a4-a0ff-1bc7ae8b5f7d","timestamp":"2020-01-21T00:21:34.208Z","previousId":"previd1","receivedAt":"2022-08-18T08:43:13.521+05:30","request_ip":"[::1]","originalTimestamp":"2022-08-18T08:43:15.539+05:30"}]', + payload: JSON.stringify([ + { + type: 'alias', + sentAt: '2022-08-18T08:43:15.539+05:30', + userId: 'user123', + context: { + ip: '14.5.67.21', + traits: { trait1: 'new-val' }, + library: { name: 'http' }, + }, + rudderId: 'bda76e3e-87eb-4153-9d1e-e9c2ed48b7a5', + messageId: '3ff8d400-b6d4-43a4-a0ff-1bc7ae8b5f7d', + timestamp: '2020-01-21T00:21:34.208Z', + previousId: 'previd1', + receivedAt: '2022-08-18T08:43:13.521+05:30', + request_ip: '[::1]', + originalTimestamp: '2022-08-18T08:43:15.539+05:30', + }, + ]), destConfig: { clientContext: '', lambda: 'testFunction', invocationType: 'Event' }, }, metadata: [ diff --git a/test/integrations/destinations/linkedin_ads/dataDelivery/business.ts b/test/integrations/destinations/linkedin_ads/dataDelivery/business.ts index ff4fa4455f6..04db1628d59 100644 --- a/test/integrations/destinations/linkedin_ads/dataDelivery/business.ts +++ b/test/integrations/destinations/linkedin_ads/dataDelivery/business.ts @@ -1,5 +1,6 @@ import { generateProxyV1Payload } from '../../../testUtils'; import { ProxyV1TestData } from '../../../testTypes'; +import { defaultAccessToken, defaultAccessTokenAuthHeader } from '../../../common/secrets'; export const element = { conversion: 'urn:lla:llaPartnerConversion:23456', @@ -75,14 +76,14 @@ export const metadata = { workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }; export const headerBlockWithCorrectAccessToken = { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', - 'LinkedIn-Version': '202402', + 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', 'X-Restli-Protocol-Version': '2.0.0', }; diff --git a/test/integrations/destinations/linkedin_ads/dataDelivery/oauth.ts b/test/integrations/destinations/linkedin_ads/dataDelivery/oauth.ts index 5cc643d9723..432161cf199 100644 --- a/test/integrations/destinations/linkedin_ads/dataDelivery/oauth.ts +++ b/test/integrations/destinations/linkedin_ads/dataDelivery/oauth.ts @@ -1,5 +1,7 @@ +import { secret1, authHeader2, secret2, authHeader1 } from '../maskedSecrets'; import { generateMetadata, generateProxyV1Payload } from '../../../testUtils'; import { ProxyV1TestData } from '../../../testTypes'; +import { defaultAccessTokenAuthHeader } from '../../../common/secrets'; export const testJSONData = { elements: [ @@ -41,15 +43,15 @@ export const metadata = { workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: secret1, }, dontBatch: false, }; export const headerBlockWithCorrectAccessToken = { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', - 'LinkedIn-Version': '202402', + 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', 'X-Restli-Protocol-Version': '2.0.0', }; @@ -58,16 +60,17 @@ const commonRequestParameters = { headers: headerBlockWithCorrectAccessToken, JSON: testJSONData, }; -const commonRequestParametersWithInvalidAccess = { - headers: { ...headerBlockWithCorrectAccessToken, Authorization: 'Bearer invalidToken' }, + +const commonRequestParametersWithRevokedAccess = { + headers: { ...headerBlockWithCorrectAccessToken, Authorization: authHeader1 }, JSON: testJSONData, - accessToken: 'invalidToken', + accessToken: secret1, }; -const commonRequestParametersWithRevokedAccess = { - headers: { ...headerBlockWithCorrectAccessToken, Authorization: 'Bearer revokedToken' }, +const commonRequestParametersWithInvalidAccess = { + headers: { ...headerBlockWithCorrectAccessToken, Authorization: authHeader2 }, JSON: testJSONData, - accessToken: 'revokedToken', + accessToken: secret2, }; export const oauthScenariosV1: ProxyV1TestData[] = [ @@ -96,10 +99,14 @@ export const oauthScenariosV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"status":401,"serviceErrorCode":65601,"code":"REVOKED_ACCESS_TOKEN","message":"The token used in the request has been revoked by the user"}', + error: JSON.stringify({ + status: 401, + serviceErrorCode: 65601, + code: 'REVOKED_ACCESS_TOKEN', + message: 'The token used in the request has been revoked by the user', + }), statusCode: 400, - metadata: { ...metadata, secret: { accessToken: 'revokedToken' } }, + metadata: { ...metadata, secret: { accessToken: secret1 } }, }, ], statTags, @@ -137,10 +144,14 @@ export const oauthScenariosV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"status":401,"serviceErrorCode":65600,"code":"INVALID_ACCESS_TOKEN","message":"Invalid access token"}', + error: JSON.stringify({ + status: 401, + serviceErrorCode: 65600, + code: 'INVALID_ACCESS_TOKEN', + message: 'Invalid access token', + }), statusCode: 500, - metadata: { ...metadata, secret: { accessToken: 'invalidToken' } }, + metadata: { ...metadata, secret: { accessToken: secret2 } }, }, ], statTags: { ...statTags, errorType: 'retryable' }, diff --git a/test/integrations/destinations/linkedin_ads/maskedSecrets.ts b/test/integrations/destinations/linkedin_ads/maskedSecrets.ts new file mode 100644 index 00000000000..61db9ef38a9 --- /dev/null +++ b/test/integrations/destinations/linkedin_ads/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; diff --git a/test/integrations/destinations/linkedin_ads/network.ts b/test/integrations/destinations/linkedin_ads/network.ts index 890ad485895..d653f22395b 100644 --- a/test/integrations/destinations/linkedin_ads/network.ts +++ b/test/integrations/destinations/linkedin_ads/network.ts @@ -1,7 +1,10 @@ +import { defaultAccessTokenAuthHeader } from '../../common/secrets'; +import { authHeader1, authHeader2 } from './maskedSecrets'; + export const headerBlockWithCorrectAccessToken = { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', - 'LinkedIn-Version': '202402', + 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', 'X-Restli-Protocol-Version': '2.0.0', }; @@ -67,7 +70,10 @@ const businessMockData = [ httpReq: { method: 'post', url: 'https://api.linkedin.com/rest/conversionEvents', - headers: { ...headerBlockWithCorrectAccessToken, Authorization: 'Bearer revokedToken' }, + headers: { + ...headerBlockWithCorrectAccessToken, + Authorization: authHeader1, + }, data: testJSONData, }, httpRes: { @@ -86,7 +92,10 @@ const businessMockData = [ httpReq: { method: 'post', url: 'https://api.linkedin.com/rest/conversionEvents', - headers: { ...headerBlockWithCorrectAccessToken, Authorization: 'Bearer invalidToken' }, + headers: { + ...headerBlockWithCorrectAccessToken, + Authorization: authHeader2, + }, data: testJSONData, }, httpRes: { diff --git a/test/integrations/destinations/linkedin_ads/processor/configLevelFeaturesTestData.ts b/test/integrations/destinations/linkedin_ads/processor/configLevelFeaturesTestData.ts index 29ff1f10a8c..d5e7b691230 100644 --- a/test/integrations/destinations/linkedin_ads/processor/configLevelFeaturesTestData.ts +++ b/test/integrations/destinations/linkedin_ads/processor/configLevelFeaturesTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; import { generateMetadata, generateTrackPayload, @@ -6,6 +7,7 @@ import { } from '../../../testUtils'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; +import { defaultAccessTokenAuthHeader } from '../../../common/secrets'; const commonDestination: Destination = { ID: '12335', @@ -55,9 +57,9 @@ const commonUserProperties = { const commonTimestamp = new Date('2023-10-14'); const commonHeader = { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', - 'LinkedIn-Version': '202402', + 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', 'X-Restli-Protocol-Version': '2.0.0', }; @@ -89,6 +91,7 @@ export const configLevelFeaturesTestData: ProcessorTestData[] = [ destination: overrideDestination(commonDestination, { hashData: false }), }, ], + method: 'POST', }, }, output: { @@ -164,6 +167,7 @@ export const configLevelFeaturesTestData: ProcessorTestData[] = [ }), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/linkedin_ads/processor/trackTestData.ts b/test/integrations/destinations/linkedin_ads/processor/trackTestData.ts index 53272e73bff..f2ad44cef8f 100644 --- a/test/integrations/destinations/linkedin_ads/processor/trackTestData.ts +++ b/test/integrations/destinations/linkedin_ads/processor/trackTestData.ts @@ -1,6 +1,7 @@ import { generateMetadata, generateTrackPayload, transformResultBuilder } from '../../../testUtils'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; +import { defaultAccessTokenAuthHeader } from '../../../common/secrets'; const commonDestination: Destination = { ID: '12335', @@ -113,9 +114,9 @@ const commonStatTags = { }; const commonHeader = { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', - 'LinkedIn-Version': '202402', + 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', 'X-Restli-Protocol-Version': '2.0.0', }; @@ -148,6 +149,7 @@ export const trackTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -221,6 +223,7 @@ export const trackTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -327,6 +330,7 @@ export const trackTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -414,6 +418,7 @@ export const trackTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -472,6 +477,7 @@ export const trackTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -558,6 +564,7 @@ export const trackTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { @@ -651,6 +658,7 @@ export const trackTestData: ProcessorTestData[] = [ destination: commonDestination, }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/linkedin_ads/processor/validationTestData.ts b/test/integrations/destinations/linkedin_ads/processor/validationTestData.ts index 653ad320565..ec206a47c25 100644 --- a/test/integrations/destinations/linkedin_ads/processor/validationTestData.ts +++ b/test/integrations/destinations/linkedin_ads/processor/validationTestData.ts @@ -6,6 +6,7 @@ import { } from '../../../testUtils'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; +import { defaultAccessTokenAuthHeader } from '../../../common/secrets'; const commonDestination: Destination = { ID: '12335', @@ -76,9 +77,9 @@ const commonStats = { }; const commonHeader = { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', - 'LinkedIn-Version': '202402', + 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', 'X-Restli-Protocol-Version': '2.0.0', }; @@ -113,6 +114,7 @@ export const validationTestData: ProcessorTestData[] = [ destination: overrideDestination(commonDestination, { hashData: false }), }, ], + method: 'POST', }, }, output: { @@ -168,6 +170,7 @@ export const validationTestData: ProcessorTestData[] = [ }), }, ], + method: 'POST', }, }, output: { @@ -219,6 +222,7 @@ export const validationTestData: ProcessorTestData[] = [ }, }, ], + method: 'POST', }, }, output: { @@ -265,6 +269,7 @@ export const validationTestData: ProcessorTestData[] = [ }), }, ], + method: 'POST', }, }, output: { @@ -351,6 +356,7 @@ export const validationTestData: ProcessorTestData[] = [ }), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/linkedin_ads/router/data.ts b/test/integrations/destinations/linkedin_ads/router/data.ts index 16abc0cd060..c1240b6ae53 100644 --- a/test/integrations/destinations/linkedin_ads/router/data.ts +++ b/test/integrations/destinations/linkedin_ads/router/data.ts @@ -1,3 +1,5 @@ +import { defaultAccessToken, defaultAccessTokenAuthHeader } from '../../../common/secrets'; + export const mockFns = (_) => { // @ts-ignore jest.useFakeTimers().setSystemTime(new Date('2023-10-15')); @@ -118,7 +120,7 @@ export const data = [ namespace: '', jobId: 1, secret: { - accessToken: 'dummyToken', + accessToken: defaultAccessToken, }, }, destination: commonDestination, @@ -187,7 +189,7 @@ export const data = [ namespace: '', jobId: 2, secret: { - accessToken: 'dummyToken', + accessToken: defaultAccessToken, }, }, destination: commonDestination, @@ -255,7 +257,7 @@ export const data = [ namespace: '', jobId: 3, secret: { - accessToken: 'dummyToken', + accessToken: defaultAccessToken, }, }, destination: commonDestination, @@ -279,7 +281,7 @@ export const data = [ namespace: '', jobId: 3, secret: { - accessToken: 'dummyToken', + accessToken: defaultAccessToken, }, }, ], @@ -419,8 +421,8 @@ export const data = [ 'Content-Type': 'application/json', 'X-RestLi-Method': 'BATCH_CREATE', 'X-Restli-Protocol-Version': '2.0.0', - 'LinkedIn-Version': '202402', - Authorization: 'Bearer dummyToken', + 'LinkedIn-Version': '202409', + Authorization: defaultAccessTokenAuthHeader, }, params: {}, files: {}, @@ -432,7 +434,7 @@ export const data = [ namespace: '', jobId: 1, secret: { - accessToken: 'dummyToken', + accessToken: defaultAccessToken, }, }, { @@ -441,7 +443,7 @@ export const data = [ namespace: '', jobId: 2, secret: { - accessToken: 'dummyToken', + accessToken: defaultAccessToken, }, }, ], diff --git a/test/integrations/destinations/linkedin_audience/processor/business.ts b/test/integrations/destinations/linkedin_audience/processor/business.ts index 28cb6a9a97b..4bed9db7600 100644 --- a/test/integrations/destinations/linkedin_audience/processor/business.ts +++ b/test/integrations/destinations/linkedin_audience/processor/business.ts @@ -1,5 +1,6 @@ import { ProcessorTestData } from '../../../testTypes'; import { generateMetadata, generateRecordPayload } from '../../../testUtils'; +import { defaultAccessTokenAuthHeader } from '../../../common/secrets'; export const businessTestData: ProcessorTestData[] = [ { @@ -85,6 +86,7 @@ export const businessTestData: ProcessorTestData[] = [ }, }, ], + method: 'POST', }, }, output: { @@ -188,6 +190,7 @@ export const businessTestData: ProcessorTestData[] = [ }, }, ], + method: 'POST', }, }, output: { @@ -219,7 +222,7 @@ export const businessTestData: ProcessorTestData[] = [ endpoint: 'https://api.linkedin.com/rest/dmpSegments/32589526/users', files: {}, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', @@ -317,6 +320,7 @@ export const businessTestData: ProcessorTestData[] = [ }, }, ], + method: 'POST', }, }, output: { @@ -353,7 +357,7 @@ export const businessTestData: ProcessorTestData[] = [ endpoint: 'https://api.linkedin.com/rest/dmpSegments/32589526/users', files: {}, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', @@ -468,6 +472,7 @@ export const businessTestData: ProcessorTestData[] = [ }, }, ], + method: 'POST', }, }, output: { @@ -499,7 +504,7 @@ export const businessTestData: ProcessorTestData[] = [ endpoint: 'https://api.linkedin.com/rest/dmpSegments/32589526/companies', files: {}, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', diff --git a/test/integrations/destinations/linkedin_audience/processor/validation.ts b/test/integrations/destinations/linkedin_audience/processor/validation.ts index 3ad37b2f4de..738627ba678 100644 --- a/test/integrations/destinations/linkedin_audience/processor/validation.ts +++ b/test/integrations/destinations/linkedin_audience/processor/validation.ts @@ -1,3 +1,4 @@ +import { defaultAccessTokenAuthHeader } from '../../../common/secrets'; import { ProcessorTestData } from '../../../testTypes'; import { generateMetadata, generateRecordPayload } from '../../../testUtils'; @@ -86,6 +87,7 @@ export const validationTestData: ProcessorTestData[] = [ }, }, ], + method: 'POST', }, }, output: { @@ -126,7 +128,7 @@ export const validationTestData: ProcessorTestData[] = [ endpoint: 'https://api.linkedin.com/rest/dmpSegments/32589526/users', files: {}, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', @@ -227,6 +229,7 @@ export const validationTestData: ProcessorTestData[] = [ }, }, ], + method: 'POST', }, }, output: { @@ -337,6 +340,7 @@ export const validationTestData: ProcessorTestData[] = [ }, }, ], + method: 'POST', }, }, output: { @@ -375,7 +379,7 @@ export const validationTestData: ProcessorTestData[] = [ endpoint: 'https://api.linkedin.com/rest/dmpSegments/1234/users', files: {}, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', diff --git a/test/integrations/destinations/linkedin_audience/router/data.ts b/test/integrations/destinations/linkedin_audience/router/data.ts index c76d3e84c6f..25d6a65caf8 100644 --- a/test/integrations/destinations/linkedin_audience/router/data.ts +++ b/test/integrations/destinations/linkedin_audience/router/data.ts @@ -1,3 +1,4 @@ +import { defaultAccessToken, defaultAccessTokenAuthHeader } from '../../../common/secrets'; import { generateMetadata, generateRecordPayload } from '../../../testUtils'; export const data = [ @@ -271,7 +272,7 @@ export const data = [ endpoint: 'https://api.linkedin.com/rest/dmpSegments/32589526/users', files: {}, headers: { - Authorization: 'Bearer default-accessToken', + Authorization: defaultAccessTokenAuthHeader, 'Content-Type': 'application/json', 'LinkedIn-Version': '202409', 'X-RestLi-Method': 'BATCH_CREATE', @@ -308,7 +309,7 @@ export const data = [ dontBatch: false, jobId: 1, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -320,7 +321,7 @@ export const data = [ dontBatch: false, jobId: 2, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', @@ -358,7 +359,7 @@ export const data = [ dontBatch: false, jobId: 3, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, sourceId: 'default-sourceId', userId: 'default-userId', diff --git a/test/integrations/destinations/lytics/processor/data.ts b/test/integrations/destinations/lytics/processor/data.ts index dd5511140aa..3fc30d20c20 100644 --- a/test/integrations/destinations/lytics/processor/data.ts +++ b/test/integrations/destinations/lytics/processor/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'lytics', @@ -113,7 +115,7 @@ export const data = [ }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -137,7 +139,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -266,7 +268,7 @@ export const data = [ }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -290,7 +292,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -381,7 +383,7 @@ export const data = [ }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -405,7 +407,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -489,7 +491,7 @@ export const data = [ destination: { ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -513,7 +515,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -596,7 +598,7 @@ export const data = [ }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -620,7 +622,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -703,7 +705,7 @@ export const data = [ }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -727,7 +729,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -810,7 +812,7 @@ export const data = [ metadata: { destinationID: 'ewksfdgDFSdvzsdmwsdfvcxj' }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -897,7 +899,7 @@ export const data = [ metadata: { destinationID: 'ewksfdgDFSdvzsdmwsdfvcxj' }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -1043,7 +1045,7 @@ export const data = [ }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -1067,7 +1069,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -1187,7 +1189,7 @@ export const data = [ }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -1211,7 +1213,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -1287,7 +1289,7 @@ export const data = [ }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -1311,7 +1313,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -1397,7 +1399,7 @@ export const data = [ }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -1421,7 +1423,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -1507,7 +1509,7 @@ export const data = [ }, destination: { DestinationDefinition: { Config: { cdkV2Enabled: true } }, - Config: { apiKey: 'dummyApiKey', stream: 'default' }, + Config: { apiKey: defaultApiKey, stream: 'default' }, Enabled: true, Transformations: [], IsProcessorEnabled: true, @@ -1531,7 +1533,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api.lytics.io/collect/json/default?access_token=dummyApiKey', + endpoint: `https://api.lytics.io/collect/json/default?access_token=${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { diff --git a/test/integrations/destinations/mailchimp/maskedSecrets.ts b/test/integrations/destinations/mailchimp/maskedSecrets.ts new file mode 100644 index 00000000000..3225565a0f0 --- /dev/null +++ b/test/integrations/destinations/mailchimp/maskedSecrets.ts @@ -0,0 +1,9 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const authHeader1 = `Basic ${base64Convertor('apiKey' + ':' + secret1)}`; +export const authHeader2 = `Basic ${base64Convertor('apiKey' + ':' + secret2)}`; +export const authHeader3 = `Basic ${base64Convertor('apiKey' + ':' + secret3)}`; diff --git a/test/integrations/destinations/mailchimp/network.ts b/test/integrations/destinations/mailchimp/network.ts index a29712ce9a0..0d2f6018914 100644 --- a/test/integrations/destinations/mailchimp/network.ts +++ b/test/integrations/destinations/mailchimp/network.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from './maskedSecrets'; export const networkCallsData = [ { httpReq: { @@ -82,7 +83,7 @@ export const networkCallsData = [ url: 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/5587981bdf09024971ff9ddfb2590a6d', method: 'GET', headers: { - Authorization: 'Basic YXBpS2V5OmFwaUtleS1kdW1teUFwaUtleQ==', + Authorization: authHeader1, }, }, httpRes: { @@ -101,7 +102,7 @@ export const networkCallsData = [ url: 'https://usXX.api.mailchimp.com/3.0/lists/aud111', method: 'GET', headers: { - Authorization: 'Basic YXBpS2V5OmFwaUtleS1kdW1teUFwaUtleQ==', + Authorization: authHeader1, }, }, httpRes: { diff --git a/test/integrations/destinations/mailchimp/processor/data.ts b/test/integrations/destinations/mailchimp/processor/data.ts index bf3cb6ad064..9e34fe8be33 100644 --- a/test/integrations/destinations/mailchimp/processor/data.ts +++ b/test/integrations/destinations/mailchimp/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader2, secret2, secret1 } from '../maskedSecrets'; export const data = [ { name: 'mailchimp', @@ -18,7 +19,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -93,7 +94,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, params: {}, body: { @@ -146,7 +147,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -216,7 +217,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, params: {}, body: { @@ -260,7 +261,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apiKey-dummyApiKey', + apiKey: secret1, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -370,7 +371,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -486,7 +487,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -563,7 +564,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, params: {}, body: { @@ -607,7 +608,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -687,7 +688,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -777,7 +778,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud112', datacenterId: 'usXX', }, @@ -851,7 +852,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, audienceId: 'aud112', version: '1', @@ -884,7 +885,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -959,7 +960,7 @@ export const data = [ audienceId: 'aud111', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, version: '1', endpoint: @@ -991,7 +992,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -1060,7 +1061,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, params: {}, body: { @@ -1196,7 +1197,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, datacenterId: 'usXX', }, Enabled: true, @@ -1290,7 +1291,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: '', }, @@ -1385,7 +1386,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -1480,7 +1481,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -1527,7 +1528,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, params: {}, body: { @@ -1572,7 +1573,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -1620,7 +1621,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, params: {}, body: { @@ -1666,7 +1667,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -1734,7 +1735,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -1807,7 +1808,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -1850,7 +1851,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, params: {}, body: { @@ -1891,7 +1892,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -1950,7 +1951,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, params: {}, body: { @@ -1961,7 +1962,10 @@ export const data = [ properties: { brand: 'Aster', product: 'Garments', - products: '[{"product_id":"123","price":"14"},{"product_id":"123","price":14}]', + products: JSON.stringify([ + { product_id: '123', price: '14' }, + { product_id: '123', price: 14 }, + ]), purchased: 'false', }, }, @@ -1998,7 +2002,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -2057,7 +2061,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmR1bW15QXBpS2V5', + Authorization: authHeader2, }, params: {}, body: { @@ -2068,7 +2072,10 @@ export const data = [ properties: { brand: 'Aster', product: 'Garments', - products: '[{"product_id":"123","price":"14"},{"product_id":"123","price":14}]', + products: JSON.stringify([ + { product_id: '123', price: '14' }, + { product_id: '123', price: 14 }, + ]), purchased: 'false', }, }, @@ -2105,7 +2112,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, @@ -2190,7 +2197,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret2, audienceId: 'aud111', datacenterId: 'usXX', }, diff --git a/test/integrations/destinations/mailchimp/router/data.ts b/test/integrations/destinations/mailchimp/router/data.ts index 93635e53692..86dce69c3d5 100644 --- a/test/integrations/destinations/mailchimp/router/data.ts +++ b/test/integrations/destinations/mailchimp/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, authHeader3, secret3 } from '../maskedSecrets'; export const data = [ { name: 'mailchimp', @@ -19,7 +20,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -74,7 +75,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -124,7 +125,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -174,7 +175,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -209,7 +210,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -243,7 +244,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -296,7 +297,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111?skip_merge_validation=true&skip_duplicate_check=false', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmFwaWtleQ==', + Authorization: authHeader3, }, params: {}, body: { @@ -336,7 +337,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -354,7 +355,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmFwaWtleQ==', + Authorization: authHeader3, }, params: {}, body: { @@ -382,7 +383,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -400,7 +401,7 @@ export const data = [ 'https://usXX.api.mailchimp.com/3.0/lists/aud111/members/48cd6232dc124497369f59c33d3eb4ab/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmFwaWtleQ==', + Authorization: authHeader3, }, params: {}, body: { @@ -411,8 +412,10 @@ export const data = [ properties: { brand: 'Aster', product: 'Garments', - products: - '[{"product_id":"123","price":"14"},{"product_id":"123","price":14}]', + products: JSON.stringify([ + { product_id: '123', price: '14' }, + { product_id: '123', price: 14 }, + ]), purchased: 'false', }, }, @@ -435,7 +438,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -454,7 +457,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -485,7 +488,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apikey', + apiKey: secret3, audienceId: 'aud111', datacenterId: 'usXX', enableMergeFields: true, @@ -532,7 +535,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apiKey-dummyApiKey', + apiKey: secret1, audienceId: '1232yyqw22', datacenterId: 'us20', }, @@ -589,7 +592,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apiKey-dummyApiKey', + apiKey: secret1, audienceId: '1232yyqw22', datacenterId: 'us20', }, @@ -635,7 +638,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apiKey-dummyApiKey', + apiKey: secret1, audienceId: '1232yyqw22', datacenterId: 'us20', }, @@ -681,7 +684,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apiKey-dummyApiKey', + apiKey: secret1, audienceId: '1232yyqw22', datacenterId: 'us20', }, @@ -736,7 +739,7 @@ export const data = [ 'https://us20.api.mailchimp.com/3.0/lists/1232yyqw22?skip_merge_validation=false&skip_duplicate_check=false', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YXBpS2V5OmFwaUtleS1kdW1teUFwaUtleQ==', + Authorization: authHeader1, }, params: {}, body: { @@ -774,7 +777,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apiKey-dummyApiKey', + apiKey: secret1, audienceId: '1232yyqw22', datacenterId: 'us20', }, @@ -792,7 +795,7 @@ export const data = [ DisplayName: 'MailChimp', }, Config: { - apiKey: 'apiKey-dummyApiKey', + apiKey: secret1, audienceId: '1232yyqw22', datacenterId: 'us20', }, diff --git a/test/integrations/destinations/mailjet/maskedSecrets.ts b/test/integrations/destinations/mailjet/maskedSecrets.ts new file mode 100644 index 00000000000..156e87fe1e6 --- /dev/null +++ b/test/integrations/destinations/mailjet/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; diff --git a/test/integrations/destinations/mailjet/processor/data.ts b/test/integrations/destinations/mailjet/processor/data.ts index 03c3232e723..881080726ff 100644 --- a/test/integrations/destinations/mailjet/processor/data.ts +++ b/test/integrations/destinations/mailjet/processor/data.ts @@ -1,3 +1,4 @@ +import { secret1, secret2 } from '../maskedSecrets'; export const data = [ { name: 'mailjet', @@ -20,7 +21,7 @@ export const data = [ }, integrations: { All: true, 'user.com': { lookup: 'email' } }, }, - destination: { Config: { apiKey: 'dummyApiKey', apiSecret: 'dummyApiSecret' } }, + destination: { Config: { apiKey: secret1, apiSecret: secret2 } }, }, ], method: 'POST', @@ -75,7 +76,7 @@ export const data = [ }, }, }, - destination: { Config: { apiKey: 'dummyApiKey', apiSecret: 'dummyApiSecret' } }, + destination: { Config: { apiKey: secret1, apiSecret: secret2 } }, }, ], method: 'POST', @@ -129,7 +130,7 @@ export const data = [ }, }, }, - destination: { Config: { apiKey: 'dummyApiKey', apiSecret: 'dummyApiSecret' } }, + destination: { Config: { apiKey: secret1, apiSecret: secret2 } }, }, ], method: 'POST', @@ -185,8 +186,8 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, diff --git a/test/integrations/destinations/mailjet/router/data.ts b/test/integrations/destinations/mailjet/router/data.ts index 689e73ef2a6..7cb6edf5f64 100644 --- a/test/integrations/destinations/mailjet/router/data.ts +++ b/test/integrations/destinations/mailjet/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; export const data = [ { name: 'mailjet', @@ -12,8 +13,8 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, @@ -56,7 +57,7 @@ export const data = [ endpoint: 'https://api.mailjet.com/v3/REST/contactslist/58578/managemanycontacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic ZHVtbXlBcGlLZXk6ZHVtbXlBcGlTZWNyZXQ=', + Authorization: authHeader1, }, params: {}, body: { @@ -75,8 +76,8 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, @@ -100,8 +101,8 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, @@ -147,7 +148,7 @@ export const data = [ endpoint: 'https://api.mailjet.com/v3/REST/contactslist/58578/managemanycontacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic ZHVtbXlBcGlLZXk6ZHVtbXlBcGlTZWNyZXQ=', + Authorization: authHeader1, }, params: {}, body: { @@ -176,8 +177,8 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [ { @@ -206,8 +207,8 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, @@ -237,8 +238,8 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, @@ -280,8 +281,8 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, @@ -323,8 +324,8 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, @@ -366,8 +367,8 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, @@ -409,8 +410,8 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, @@ -446,8 +447,8 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [{ from: 'userCountry', to: 'country' }], }, @@ -493,7 +494,7 @@ export const data = [ endpoint: 'https://api.mailjet.com/v3/REST/contactslist/58578/managemanycontacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic ZHVtbXlBcGlLZXk6ZHVtbXlBcGlTZWNyZXQ=', + Authorization: authHeader1, }, params: {}, body: { @@ -528,8 +529,8 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [ { @@ -548,7 +549,7 @@ export const data = [ endpoint: 'https://api.mailjet.com/v3/REST/contactslist/58570/managemanycontacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic ZHVtbXlBcGlLZXk6ZHVtbXlBcGlTZWNyZXQ=', + Authorization: authHeader1, }, params: {}, body: { @@ -574,8 +575,8 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [ { @@ -594,7 +595,7 @@ export const data = [ endpoint: 'https://api.mailjet.com/v3/REST/contactslist/58576/managemanycontacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic ZHVtbXlBcGlLZXk6ZHVtbXlBcGlTZWNyZXQ=', + Authorization: authHeader1, }, params: {}, body: { @@ -620,8 +621,8 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [ { @@ -640,7 +641,7 @@ export const data = [ endpoint: 'https://api.mailjet.com/v3/REST/contactslist/58576/managemanycontacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic ZHVtbXlBcGlLZXk6ZHVtbXlBcGlTZWNyZXQ=', + Authorization: authHeader1, }, params: {}, body: { @@ -666,8 +667,8 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [ { @@ -686,7 +687,7 @@ export const data = [ endpoint: 'https://api.mailjet.com/v3/REST/contactslist/585896/managemanycontacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic ZHVtbXlBcGlLZXk6ZHVtbXlBcGlTZWNyZXQ=', + Authorization: authHeader1, }, params: {}, body: { @@ -712,8 +713,8 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [ { @@ -732,7 +733,7 @@ export const data = [ endpoint: 'https://api.mailjet.com/v3/REST/contactslist/584896/managemanycontacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic ZHVtbXlBcGlLZXk6ZHVtbXlBcGlTZWNyZXQ=', + Authorization: authHeader1, }, params: {}, body: { @@ -758,8 +759,8 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'dummyApiSecret', + apiKey: secret1, + apiSecret: secret2, listId: '58578', contactPropertiesMapping: [ { diff --git a/test/integrations/destinations/mailmodo/processor/data.ts b/test/integrations/destinations/mailmodo/processor/data.ts index 45a14e2a52e..70e21f816c9 100644 --- a/test/integrations/destinations/mailmodo/processor/data.ts +++ b/test/integrations/destinations/mailmodo/processor/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'mailmodo', @@ -9,7 +11,7 @@ export const data = [ request: { body: [ { - destination: { Config: { apiKey: 'dummyApiKey' } }, + destination: { Config: { apiKey: defaultApiKey } }, message: { event: 'trackevent', type: 'track', @@ -72,7 +74,7 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.mailmodo.com/api/v1/addEvent', - headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + headers: { mmApiKey: defaultApiKey, 'Content-Type': 'application/json' }, params: {}, body: { JSON: { email: 'firstUser@testmail.com', event_name: 'trackevent' }, @@ -264,7 +266,7 @@ export const data = [ request: { body: [ { - destination: { Config: { apiKey: 'dummyApiKey', listName: 'abcdef' } }, + destination: { Config: { apiKey: defaultApiKey, listName: 'abcdef' } }, message: { type: 'page', event: 'Email Opened', @@ -317,7 +319,7 @@ export const data = [ request: { body: [ { - destination: { Config: { apiKey: 'dummyApiKey', listName: '' } }, + destination: { Config: { apiKey: defaultApiKey, listName: '' } }, message: { type: 'identify', event: 'Email Opened', @@ -351,7 +353,7 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.mailmodo.com/api/v1/addToList/batch', - headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + headers: { mmApiKey: defaultApiKey, 'Content-Type': 'application/json' }, params: {}, body: { JSON: { listName: 'Rudderstack', values: [{ email: 'test3@abc.com' }] }, @@ -378,7 +380,7 @@ export const data = [ request: { body: [ { - destination: { Config: { apiKey: 'dummyApiKey', listName: 'abcdef' } }, + destination: { Config: { apiKey: defaultApiKey, listName: 'abcdef' } }, message: { type: 'identify', event: 'Email Opened', @@ -412,7 +414,7 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.mailmodo.com/api/v1/addToList/batch', - headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + headers: { mmApiKey: defaultApiKey, 'Content-Type': 'application/json' }, params: {}, body: { JSON: { listName: 'abcdef', values: [{ email: 'test3@abc.com' }] }, @@ -439,7 +441,7 @@ export const data = [ request: { body: [ { - destination: { Config: { apiKey: 'dummyApiKey', listName: 'abcdef' } }, + destination: { Config: { apiKey: defaultApiKey, listName: 'abcdef' } }, message: { type: 'identify', event: 'Email Opened', @@ -493,7 +495,7 @@ export const data = [ request: { body: [ { - destination: { Config: { apiKey: 'dummyApiKey', listName: 'abcdef' } }, + destination: { Config: { apiKey: defaultApiKey, listName: 'abcdef' } }, message: { type: 'identify', userId: 'identified user id', @@ -530,7 +532,7 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.mailmodo.com/api/v1/addToList/batch', - headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + headers: { mmApiKey: defaultApiKey, 'Content-Type': 'application/json' }, params: {}, body: { JSON: { @@ -575,7 +577,7 @@ export const data = [ request: { body: [ { - destination: { Config: { apiKey: 'dummyApiKey', listName: 'abcdef' } }, + destination: { Config: { apiKey: defaultApiKey, listName: 'abcdef' } }, message: { type: 'identify', userId: 'identified user id', @@ -612,7 +614,7 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.mailmodo.com/api/v1/addToList/batch', - headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + headers: { mmApiKey: defaultApiKey, 'Content-Type': 'application/json' }, params: {}, body: { JSON: { diff --git a/test/integrations/destinations/mailmodo/router/data.ts b/test/integrations/destinations/mailmodo/router/data.ts index 3b492b0a827..36f25c8e384 100644 --- a/test/integrations/destinations/mailmodo/router/data.ts +++ b/test/integrations/destinations/mailmodo/router/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'mailmodo', @@ -28,7 +30,7 @@ export const data = [ originalTimestamp: '2020-08-28T16:26:06.468Z', }, metadata: { jobId: 2, userId: 'u1' }, - destination: { Config: { apiKey: 'dummyApiKey', listName: 'abc' }, Enabled: true }, + destination: { Config: { apiKey: defaultApiKey, listName: 'abc' }, Enabled: true }, }, { message: { @@ -49,7 +51,7 @@ export const data = [ originalTimestamp: '2020-08-28T16:26:06.468Z', }, metadata: { jobId: 3, userId: 'u1' }, - destination: { Config: { apiKey: 'dummyApiKey', listName: 'abc' }, Enabled: true }, + destination: { Config: { apiKey: defaultApiKey, listName: 'abc' }, Enabled: true }, }, { message: { @@ -72,7 +74,7 @@ export const data = [ timestamp: '2020-02-02T00:23:09.544Z', }, metadata: { jobId: 4, userId: 'u1' }, - destination: { Config: { apiKey: 'dummyApiKey', listName: 'abc' }, Enabled: true }, + destination: { Config: { apiKey: defaultApiKey, listName: 'abc' }, Enabled: true }, }, { message: { @@ -92,7 +94,7 @@ export const data = [ originalTimestamp: '2020-08-28T16:26:06.468Z', }, metadata: { jobId: 5, userId: 'u1' }, - destination: { Config: { apiKey: 'dummyApiKey', listName: '' }, Enabled: true }, + destination: { Config: { apiKey: defaultApiKey, listName: '' }, Enabled: true }, }, ], destType: 'mailmodo', @@ -133,7 +135,7 @@ export const data = [ files: {}, method: 'POST', params: {}, - headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + headers: { mmApiKey: defaultApiKey, 'Content-Type': 'application/json' }, version: '1', endpoint: 'https://api.mailmodo.com/api/v1/addToList/batch', }, @@ -143,7 +145,7 @@ export const data = [ ], batched: true, statusCode: 200, - destination: { Config: { apiKey: 'dummyApiKey', listName: 'abc' }, Enabled: true }, + destination: { Config: { apiKey: defaultApiKey, listName: 'abc' }, Enabled: true }, }, { batchedRequest: { @@ -166,14 +168,14 @@ export const data = [ files: {}, method: 'POST', params: {}, - headers: { mmApiKey: 'dummyApiKey', 'Content-Type': 'application/json' }, + headers: { mmApiKey: defaultApiKey, 'Content-Type': 'application/json' }, version: '1', endpoint: 'https://api.mailmodo.com/api/v1/addEvent', }, metadata: [{ jobId: 3, userId: 'u1' }], batched: false, statusCode: 200, - destination: { Config: { apiKey: 'dummyApiKey', listName: 'abc' }, Enabled: true }, + destination: { Config: { apiKey: defaultApiKey, listName: 'abc' }, Enabled: true }, }, { batched: false, @@ -189,7 +191,7 @@ export const data = [ module: 'destination', }, statusCode: 400, - destination: { Config: { apiKey: 'dummyApiKey', listName: '' }, Enabled: true }, + destination: { Config: { apiKey: defaultApiKey, listName: '' }, Enabled: true }, }, ], }, diff --git a/test/integrations/destinations/marketo/dataDelivery/business.ts b/test/integrations/destinations/marketo/dataDelivery/business.ts index ca4e05afa99..2404ae12d89 100644 --- a/test/integrations/destinations/marketo/dataDelivery/business.ts +++ b/test/integrations/destinations/marketo/dataDelivery/business.ts @@ -1,6 +1,7 @@ import { ProxyMetdata } from '../../../../../src/types'; import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV1Payload } from '../../../testUtils'; +import { authHeader1 } from '../maskedSecrets'; const statTags = { aborted: { @@ -86,7 +87,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { ...commonRequestParameters, headers: { - Authorization: 'Bearer test_token_1', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -106,8 +107,11 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request Processed Successfully', response: [ { - error: - '{"requestId":"664#17dae8c3d48","result":[{"id":1328328,"status":"updated"}],"success":true}', + error: JSON.stringify({ + requestId: '664#17dae8c3d48', + result: [{ id: 1328328, status: 'updated' }], + success: true, + }), metadata: proxyMetdata, statusCode: 200, }, @@ -132,7 +136,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { ...commonRequestParameters, headers: { - Authorization: 'Bearer test_token_2', + Authorization: authHeader1, 'Content-Type': 'application/json', }, endpoint: 'https://mktId.mktorest.com/rest/v1/leads.json/test2', @@ -153,8 +157,11 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Request Failed for marketo, Access token invalid (Retryable).during Marketo Response Handling', response: [ { - error: - '{"requestId":"a61c#17daea5968a","success":false,"errors":[{"code":"601","message":"Access token invalid"}]}', + error: JSON.stringify({ + requestId: 'a61c#17daea5968a', + success: false, + errors: [{ code: '601', message: 'Access token invalid' }], + }), metadata: proxyMetdata, statusCode: 500, }, @@ -179,7 +186,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { ...commonRequestParameters, headers: { - Authorization: 'Bearer test_token_3', + Authorization: authHeader1, 'Content-Type': 'application/json', }, endpoint: 'https://mktId.mktorest.com/rest/v1/leads.json/test3', @@ -200,8 +207,11 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Request Failed for marketo, Requested resource not found (Aborted).during Marketo Response Handling', response: [ { - error: - '{"requestId":"a61c#17daea5968a","success":false,"errors":[{"code":"610","message":"Requested resource not found"}]}', + error: JSON.stringify({ + requestId: 'a61c#17daea5968a', + success: false, + errors: [{ code: '610', message: 'Requested resource not found' }], + }), metadata: proxyMetdata, statusCode: 400, }, @@ -226,7 +236,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { ...commonRequestParameters, headers: { - Authorization: 'Bearer test_token_4', + Authorization: authHeader1, 'Content-Type': 'application/json', }, endpoint: 'https://mktId.mktorest.com/rest/v1/leads.json/test4', @@ -270,7 +280,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ body: generateProxyV1Payload( { headers: { - Authorization: 'Bearer test_token_6', + Authorization: authHeader1, 'Content-Type': 'invalid', 'User-Agent': 'RudderLabs', }, @@ -292,8 +302,10 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Request Failed for marketo, Invalid Content Type (Aborted).during Marketo Response Handling', response: [ { - error: - '{"success":false,"errors":[{"code":"612","message":"Invalid Content Type"}]}', + error: JSON.stringify({ + success: false, + errors: [{ code: '612', message: 'Invalid Content Type' }], + }), metadata: proxyMetdata, statusCode: 400, }, @@ -317,7 +329,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ body: generateProxyV1Payload( { headers: { - Authorization: 'Bearer test_token_6', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -338,8 +350,10 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request failed with status: 400', response: [ { - error: - '{"success":false,"errors":[{"code":"1077","message":"Value for field exceeds max length"}]}', + error: JSON.stringify({ + success: false, + errors: [{ code: '1077', message: 'Value for field exceeds max length' }], + }), metadata: proxyMetdata, statusCode: 400, }, diff --git a/test/integrations/destinations/marketo/dataDelivery/data.ts b/test/integrations/destinations/marketo/dataDelivery/data.ts index db379c9e956..30b223b8639 100644 --- a/test/integrations/destinations/marketo/dataDelivery/data.ts +++ b/test/integrations/destinations/marketo/dataDelivery/data.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; import { testScenariosForV1API } from './business'; import { otheMarketoScenariosV1 } from './other'; @@ -16,7 +17,7 @@ const legacyTests = [ method: 'POST', userId: '', headers: { - Authorization: 'Bearer test_token_1', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -81,7 +82,7 @@ const legacyTests = [ method: 'POST', userId: '', headers: { - Authorization: 'Bearer test_token_2', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -157,7 +158,7 @@ const legacyTests = [ method: 'POST', userId: '', headers: { - Authorization: 'Bearer test_token_3', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -233,7 +234,7 @@ const legacyTests = [ method: 'POST', userId: '', headers: { - Authorization: 'Bearer test_token_4', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -299,7 +300,7 @@ const legacyTests = [ method: 'POST', userId: '', headers: { - Authorization: 'Bearer test_token_5', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -365,7 +366,7 @@ const legacyTests = [ method: 'POST', userId: '', headers: { - Authorization: 'Bearer test_token_6', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -432,7 +433,7 @@ const legacyTests = [ endpoint: 'https://unhandled_exception_in_proxy_req.mktorest.com/rest/v1/leads.json', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, }, body: { JSON: { diff --git a/test/integrations/destinations/marketo/dataDelivery/other.ts b/test/integrations/destinations/marketo/dataDelivery/other.ts index 5d4e3b1f177..72faf5248af 100644 --- a/test/integrations/destinations/marketo/dataDelivery/other.ts +++ b/test/integrations/destinations/marketo/dataDelivery/other.ts @@ -1,5 +1,6 @@ import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV1Payload } from '../../../testUtils'; +import { defaultAccessToken } from '../../../common/secrets'; const statTags = { aborted: { @@ -27,7 +28,7 @@ const statTags = { const metadata = { jobId: 1, secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, attemptNum: 1, userId: 'default-userId', @@ -63,8 +64,13 @@ export const otheMarketoScenariosV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"message":"Service Unavailable","description":"The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later."}}', + error: JSON.stringify({ + error: { + message: 'Service Unavailable', + description: + 'The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later.', + }, + }), statusCode: 503, metadata, }, diff --git a/test/integrations/destinations/marketo/maskedSecrets.ts b/test/integrations/destinations/marketo/maskedSecrets.ts new file mode 100644 index 00000000000..c3e36ab909c --- /dev/null +++ b/test/integrations/destinations/marketo/maskedSecrets.ts @@ -0,0 +1,7 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secretAccessToken = path.basename(__dirname) + 2; +export const expiredAccessToken = path.basename(__dirname) + 3; + +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/marketo/network.ts b/test/integrations/destinations/marketo/network.ts index 1606e78c516..e2f90643c9e 100644 --- a/test/integrations/destinations/marketo/network.ts +++ b/test/integrations/destinations/marketo/network.ts @@ -1,3 +1,4 @@ +import { authHeader1, expiredAccessToken, secret1, secretAccessToken } from './maskedSecrets'; const userObject = { City: 'Tokyo', Country: 'JP', @@ -9,7 +10,7 @@ const userObject = { }; const headerObject = { - Authorization: 'Bearer test_token_2', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }; @@ -24,7 +25,7 @@ const tfProxyMocksData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer test_token_1', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -80,7 +81,7 @@ const tfProxyMocksData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer test_token_3', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -110,7 +111,7 @@ const tfProxyMocksData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer test_token_4', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -127,7 +128,7 @@ const tfProxyMocksData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer test_token_5', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -144,7 +145,7 @@ const tfProxyMocksData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer test_token_6', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -172,7 +173,7 @@ const tfProxyMocksData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -200,7 +201,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secretAccessToken, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -216,7 +217,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'access_token_expired', + access_token: expiredAccessToken, expires_in: 0, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -306,7 +307,7 @@ const tfProxyMocksData = [ }, { httpReq: { - url: 'https://munchkinId.mktorest.com/identity/oauth/token?client_id=b&client_secret=clientSecret&grant_type=client_credentials', + url: `https://munchkinId.mktorest.com/identity/oauth/token?client_id=b&client_secret=${secret1}&grant_type=client_credentials`, method: 'GET', }, httpRes: { @@ -319,12 +320,12 @@ const tfProxyMocksData = [ }, { httpReq: { - url: 'https://munchkinId.mktorest.com/identity/oauth/token?client_id=wrongClientId&client_secret=clientSecret&grant_type=client_credentials', + url: `https://munchkinId.mktorest.com/identity/oauth/token?client_id=wrongClientId&client_secret=${secret1}&grant_type=client_credentials`, method: 'GET', }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -388,7 +389,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -401,7 +402,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -444,7 +445,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -475,7 +476,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -488,7 +489,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -541,7 +542,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -605,7 +606,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -765,7 +766,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -816,7 +817,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -867,7 +868,7 @@ const tfProxyMocksData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -934,7 +935,7 @@ const businessMockData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer test_token_1', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -992,7 +993,7 @@ const businessMockData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer test_token_3', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -1023,7 +1024,7 @@ const businessMockData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer test_token_4', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -1041,7 +1042,7 @@ const businessMockData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer test_token_5', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -1059,7 +1060,7 @@ const businessMockData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer test_token_6', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -1081,7 +1082,7 @@ const businessMockData = [ lookupField: 'id', }, headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -1110,7 +1111,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -1127,7 +1128,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'access_token_expired', + access_token: expiredAccessToken, expires_in: 0, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -1236,12 +1237,12 @@ const businessMockData = [ { description: 'Mock response for a failed access token request due to invalid client id', httpReq: { - url: 'https://munchkinId.mktorest.com/identity/oauth/token?client_id=wrongClientId&client_secret=clientSecret&grant_type=client_credentials', + url: `https://munchkinId.mktorest.com/identity/oauth/token?client_id=wrongClientId&client_secret=${secret1}&grant_type=client_credentials`, method: 'GET', }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -1308,7 +1309,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -1322,7 +1323,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -1367,7 +1368,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -1400,7 +1401,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -1414,7 +1415,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'test_access_token', + access_token: secret1, }, status: 200, statusText: 'OK', @@ -1471,7 +1472,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -1538,7 +1539,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -1705,7 +1706,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -1760,7 +1761,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -1815,7 +1816,7 @@ const businessMockData = [ }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secret1, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', @@ -1878,7 +1879,7 @@ const businessMockData = [ httpReq: { url: 'https://mktId.mktorest.com/rest/v1/leads.json/test_invalid_header', headers: { - Authorization: 'Bearer test_token_6', + Authorization: authHeader1, 'Content-Type': 'invalid', 'User-Agent': 'RudderLabs', }, @@ -1903,7 +1904,7 @@ const businessMockData = [ httpReq: { url: 'https://mktId.mktorest.com/rest/v1/leads.json/test_exceeded_length', headers: { - Authorization: 'Bearer test_token_6', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, diff --git a/test/integrations/destinations/marketo/processor/data.ts b/test/integrations/destinations/marketo/processor/data.ts index 38201bd60df..f7c6e7fb6de 100644 --- a/test/integrations/destinations/marketo/processor/data.ts +++ b/test/integrations/destinations/marketo/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, expiredAccessToken, secret1 } from '../maskedSecrets'; export const data = [ { name: 'marketo', @@ -50,7 +51,7 @@ export const data = [ userId: 'lynnanderson@smith.net', }, destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoYksLmUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -85,7 +86,7 @@ export const data = [ }, Config: { clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, accountId: 'marketo_acct_id_success', rudderEventsMapping: [], }, @@ -114,7 +115,7 @@ export const data = [ endpoint: 'https://marketo_acct_id_success.mktorest.com/rest/v1/customobjects/new_user.json', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -217,7 +218,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_success', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [ { @@ -264,7 +265,7 @@ export const data = [ 'https://marketo_acct_id_success.mktorest.com/rest/v1/activities/external.json', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, }, params: {}, body: { @@ -363,7 +364,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_success', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [ { @@ -409,7 +410,7 @@ export const data = [ 'https://marketo_acct_id_success.mktorest.com/rest/v1/activities/external.json', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, }, params: {}, body: { @@ -513,7 +514,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_success', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: false, customActivityPropertyMap: [ { @@ -555,7 +556,7 @@ export const data = [ 'https://marketo_acct_id_success.mktorest.com/rest/v1/activities/external.json', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, }, params: {}, body: { @@ -654,8 +655,16 @@ export const data = [ body: [ { statusCode: 500, - error: - '{"message":"Request Failed for marketo, Access Token Expired (Retryable).During fetching auth token","destinationResponse":{"access_token":"access_token_expired","expires_in":0,"scope":"integrations@rudderstack.com","token_type":"bearer"}}', + error: JSON.stringify({ + message: + 'Request Failed for marketo, Access Token Expired (Retryable).During fetching auth token', + destinationResponse: { + access_token: expiredAccessToken, + expires_in: 0, + scope: 'integrations@rudderstack.com', + token_type: 'bearer', + }, + }), statTags: { errorCategory: 'network', errorType: 'retryable', @@ -741,7 +750,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_failed', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: false, customActivityPropertyMap: [ { @@ -775,8 +784,17 @@ export const data = [ body: [ { statusCode: 500, - error: - '{"message":"Request Failed for marketo, Access Token Expired (Retryable).During fetching auth token","destinationResponse":{"response":{"success":false,"errors":[{"code":"601","message":"Access Token Expired"}]},"status":200}}', + error: JSON.stringify({ + message: + 'Request Failed for marketo, Access Token Expired (Retryable).During fetching auth token', + destinationResponse: { + response: { + success: false, + errors: [{ code: '601', message: 'Access Token Expired' }], + }, + status: 200, + }, + }), statTags: { errorCategory: 'network', errorType: 'retryable', @@ -839,7 +857,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_success', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [ { @@ -962,7 +980,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_success', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: false, customActivityPropertyMap: [ { @@ -1081,7 +1099,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_success', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [ { @@ -1200,7 +1218,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_success', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [ { @@ -1318,7 +1336,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_success', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [ { @@ -1437,7 +1455,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_success', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [ { @@ -1537,7 +1555,7 @@ export const data = [ Config: { accountId: 'marketo_acct_id_success', clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [ { @@ -1580,7 +1598,7 @@ export const data = [ method: 'POST', endpoint: 'https://marketo_acct_id_success.mktorest.com/rest/v1/leads.json', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1657,7 +1675,7 @@ export const data = [ userId: 'dummyMail@dummyDomain.com', }, destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoYksLmUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -1692,7 +1710,7 @@ export const data = [ }, Config: { clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientSecret: secret1, accountId: 'marketo_acct_id_success', rudderEventsMapping: [], }, @@ -1720,7 +1738,7 @@ export const data = [ method: 'POST', endpoint: 'https://marketo_acct_id_success.mktorest.com/rest/v1/leads.json', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, diff --git a/test/integrations/destinations/marketo/router/data.ts b/test/integrations/destinations/marketo/router/data.ts index d187792ea80..e71e1f1fc6c 100644 --- a/test/integrations/destinations/marketo/router/data.ts +++ b/test/integrations/destinations/marketo/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'marketo', @@ -49,8 +50,8 @@ export const data = [ destination: { Config: { accountId: 'marketo_acct_id_success', - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [{ from: 'name', to: 'productName' }], leadTraitMapping: [{ from: 'leadScore', to: 'customLeadScore' }], @@ -169,8 +170,8 @@ export const data = [ destination: { Config: { accountId: 'marketo_acct_id_success', - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [{ from: 'name', to: 'productName' }], leadTraitMapping: [{ from: 'leadScore', to: 'customLeadScore' }], @@ -316,8 +317,8 @@ export const data = [ destination: { Config: { accountId: 'valid_account_broken_event', - clientId: '504300cd-76b2-a7l4-bhle-90a07420nx73', - clientSecret: '3l3gJpzRsZagD6gu7tnTeKXz0bomLGnd', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: false, createIfNotExist: true, rudderEventsMapping: [ @@ -469,8 +470,8 @@ export const data = [ destination: { Config: { accountId: 'unhandled_status_code', - clientId: '504300cd-76b2-a7l4-bhle-90a07420nx73', - clientSecret: '3l3gJpzRsZagD6gu7tnTeKXz0bomLGnd', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: false, createIfNotExist: true, rudderEventsMapping: [ @@ -622,8 +623,8 @@ export const data = [ destination: { Config: { accountId: 'successful_identify_transformation', - clientId: '504300cd-76b2-a7l4-bhle-90a07420nx73', - clientSecret: '3l3gJpzRsZagD6gu7tnTeKXz0bomLGnd', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: false, createIfNotExist: true, rudderEventsMapping: [ @@ -728,7 +729,7 @@ export const data = [ 'https://marketo_acct_id_success.mktorest.com/rest/v1/activities/external.json', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, }, params: {}, body: { @@ -757,8 +758,8 @@ export const data = [ destination: { Config: { accountId: 'marketo_acct_id_success', - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [{ from: 'name', to: 'productName' }], leadTraitMapping: [{ from: 'leadScore', to: 'customLeadScore' }], @@ -846,7 +847,7 @@ export const data = [ 'https://marketo_acct_id_success.mktorest.com/rest/v1/activities/external.json', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, }, params: {}, body: { @@ -875,8 +876,8 @@ export const data = [ destination: { Config: { accountId: 'marketo_acct_id_success', - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [{ from: 'name', to: 'productName' }], leadTraitMapping: [{ from: 'leadScore', to: 'customLeadScore' }], @@ -967,8 +968,8 @@ export const data = [ destination: { Config: { accountId: 'valid_account_broken_event', - clientId: '504300cd-76b2-a7l4-bhle-90a07420nx73', - clientSecret: '3l3gJpzRsZagD6gu7tnTeKXz0bomLGnd', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: false, createIfNotExist: true, rudderEventsMapping: [ @@ -1055,8 +1056,18 @@ export const data = [ { batched: false, statusCode: 400, - error: - '{"message":"Error occurred [Marketo Transformer]: During lead look up using email -> some other problem","destinationResponse":{"response":{"requestId":"142e4#1835b117b76","success":false,"errors":[{"code":"random_marketo_code","message":"some other problem"}]},"status":200}}', + error: JSON.stringify({ + message: + 'Error occurred [Marketo Transformer]: During lead look up using email -> some other problem', + destinationResponse: { + response: { + requestId: '142e4#1835b117b76', + success: false, + errors: [{ code: 'random_marketo_code', message: 'some other problem' }], + }, + status: 200, + }, + }), statTags: { errorCategory: 'network', errorType: 'aborted', @@ -1065,8 +1076,8 @@ export const data = [ destination: { Config: { accountId: 'unhandled_status_code', - clientId: '504300cd-76b2-a7l4-bhle-90a07420nx73', - clientSecret: '3l3gJpzRsZagD6gu7tnTeKXz0bomLGnd', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: false, createIfNotExist: true, rudderEventsMapping: [ @@ -1162,7 +1173,7 @@ export const data = [ 'https://successful_identify_transformation.mktorest.com/rest/v1/leads.json', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, }, params: {}, body: { @@ -1193,8 +1204,8 @@ export const data = [ destination: { Config: { accountId: 'successful_identify_transformation', - clientId: '504300cd-76b2-a7l4-bhle-90a07420nx73', - clientSecret: '3l3gJpzRsZagD6gu7tnTeKXz0bomLGnd', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: false, createIfNotExist: true, rudderEventsMapping: [ @@ -1333,8 +1344,8 @@ export const data = [ ID: '1mMy5cqbtfuaKZv1IhVQKnBdVwe', Config: { accountId: 'marketo_acct_id_success', - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [ { from: 'name', to: 'productName' }, @@ -1374,7 +1385,7 @@ export const data = [ endpoint: 'https://marketo_acct_id_success.mktorest.com/rest/v1/activities/external.json', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1403,8 +1414,8 @@ export const data = [ ID: '1mMy5cqbtfuaKZv1IhVQKnBdVwe', Config: { accountId: 'marketo_acct_id_success', - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', + clientId: 'marketo_client_id', + clientSecret: secret1, trackAnonymousEvents: true, customActivityPropertyMap: [ { from: 'name', to: 'productName' }, diff --git a/test/integrations/destinations/marketo_static_list/dataDelivery/business.ts b/test/integrations/destinations/marketo_static_list/dataDelivery/business.ts index 08be877ba84..c00a46613f8 100644 --- a/test/integrations/destinations/marketo_static_list/dataDelivery/business.ts +++ b/test/integrations/destinations/marketo_static_list/dataDelivery/business.ts @@ -1,7 +1,7 @@ import { ProxyMetdata } from '../../../../../src/types'; import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV1Payload } from '../../../testUtils'; - +import { authHeader1, authHeaderAccessToken } from '../maskedSecrets'; export const statTags = { aborted: { destType: 'MARKETO_STATIC_LIST', @@ -79,11 +79,11 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { ...commonRequestParameters, headers: { - Authorization: 'Bearer Incorrect_token', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=110&id=111&id=112', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=110&id=111&id=112', }, reqMetadataArray, ), @@ -99,8 +99,19 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request Processed Successfully', response: [ { - error: - '{"requestId":"b6d1#18a8d2c10e7","result":[{"id":110,"status":"skipped","reasons":[{"code":"1015","message":"Lead not in list"}]},{"id":111,"status":"removed"},{"id":112,"status":"removed"}],"success":true}', + error: JSON.stringify({ + requestId: 'b6d1#18a8d2c10e7', + result: [ + { + id: 110, + status: 'skipped', + reasons: [{ code: '1015', message: 'Lead not in list' }], + }, + { id: 111, status: 'removed' }, + { id: 112, status: 'removed' }, + ], + success: true, + }), metadata: proxyMetdata, statusCode: 200, }, @@ -125,11 +136,11 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { ...commonRequestParameters, headers: { - Authorization: 'Bearer Incorrect_token', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', }, reqMetadataArray, ), @@ -147,8 +158,11 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Request Failed for Marketo Static List, Access token invalid (Retryable).during Marketo Static List Response Handling', response: [ { - error: - '{"requestId":"68d8#1846058ee27","success":false,"errors":[{"code":"601","message":"Access token invalid"}]}', + error: JSON.stringify({ + requestId: '68d8#1846058ee27', + success: false, + errors: [{ code: '601', message: 'Access token invalid' }], + }), metadata: proxyMetdata, statusCode: 500, }, @@ -174,12 +188,12 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { ...commonRequestParameters, headers: { - Authorization: 'Bearer token', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2', }, reqMetadataArray, ), @@ -195,8 +209,14 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request Processed Successfully', response: [ { - error: - '{"requestId":"12d3c#1846057dce2","result":[{"id":1,"status":"added"},{"id":2,"status":"added"}],"success":true}', + error: JSON.stringify({ + requestId: '12d3c#1846057dce2', + result: [ + { id: 1, status: 'added' }, + { id: 2, status: 'added' }, + ], + success: true, + }), metadata: proxyMetdata, statusCode: 200, }, @@ -221,7 +241,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { ...commonRequestParameters, headers: { - Authorization: 'Bearer test_token_6', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, diff --git a/test/integrations/destinations/marketo_static_list/dataDelivery/data.ts b/test/integrations/destinations/marketo_static_list/dataDelivery/data.ts index c0398f6d2b8..8cb4e2854e2 100644 --- a/test/integrations/destinations/marketo_static_list/dataDelivery/data.ts +++ b/test/integrations/destinations/marketo_static_list/dataDelivery/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, authHeaderAccessToken } from '../maskedSecrets'; import { testScenariosForV1API } from './business'; import { otherScenariosV1 } from './other'; @@ -13,11 +14,11 @@ const legacyTests = [ body: { type: 'REST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=110&id=111&id=112', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=110&id=111&id=112', method: 'POST', userId: '', headers: { - Authorization: 'Bearer Incorrect_token', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, body: { @@ -84,11 +85,11 @@ const legacyTests = [ body: { type: 'REST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', method: 'POST', userId: '', headers: { - Authorization: 'Bearer Incorrect_token', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, body: { @@ -152,11 +153,11 @@ const legacyTests = [ body: { type: 'REST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2', method: 'POST', userId: '', headers: { - Authorization: 'Bearer token', + Authorization: authHeader1, 'Content-Type': 'application/json', }, body: { @@ -213,11 +214,11 @@ const legacyTests = [ body: { type: 'REST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=3&id=4', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=3&id=4', method: 'POST', userId: '', headers: { - Authorization: 'Bearer token', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -267,11 +268,11 @@ const legacyTests = [ body: { type: 'REST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=5&id=6', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=5&id=6', method: 'POST', userId: '', headers: { - Authorization: 'Bearer token', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, diff --git a/test/integrations/destinations/marketo_static_list/dataDelivery/other.ts b/test/integrations/destinations/marketo_static_list/dataDelivery/other.ts index b1f3403fa6f..b2dc97de115 100644 --- a/test/integrations/destinations/marketo_static_list/dataDelivery/other.ts +++ b/test/integrations/destinations/marketo_static_list/dataDelivery/other.ts @@ -1,6 +1,6 @@ import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV1Payload, generateMetadata } from '../../../testUtils'; -import { reqMetadataArray, statTags } from './business'; +import { statTags } from './business'; export const otherScenariosV1: ProxyV1TestData[] = [ { @@ -28,8 +28,13 @@ export const otherScenariosV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"message":"Service Unavailable","description":"The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later."}}', + error: JSON.stringify({ + error: { + message: 'Service Unavailable', + description: + 'The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later.', + }, + }), statusCode: 503, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/marketo_static_list/maskedSecrets.ts b/test/integrations/destinations/marketo_static_list/maskedSecrets.ts new file mode 100644 index 00000000000..2c99d64d815 --- /dev/null +++ b/test/integrations/destinations/marketo_static_list/maskedSecrets.ts @@ -0,0 +1,9 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secretAccessToken = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; + +export const authHeader1 = `Bearer ${secret1}`; +export const authHeaderAccessToken = `Bearer ${secretAccessToken}`; +export const authHeader3 = `Bearer ${secret3}`; diff --git a/test/integrations/destinations/marketo_static_list/network.ts b/test/integrations/destinations/marketo_static_list/network.ts index f165291c15a..d9da4b3996f 100644 --- a/test/integrations/destinations/marketo_static_list/network.ts +++ b/test/integrations/destinations/marketo_static_list/network.ts @@ -1,10 +1,11 @@ +import { authHeader1, authHeaderAccessToken, secret1, secretAccessToken } from './maskedSecrets'; const deliveryCallsData = [ { httpReq: { - url: 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=110&id=111&id=112', + url: 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=110&id=111&id=112', params: { destination: 'marketo_static_list' }, headers: { - Authorization: 'Bearer Incorrect_token', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -25,10 +26,10 @@ const deliveryCallsData = [ }, { httpReq: { - url: 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', + url: 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', params: { destination: 'marketo_static_list' }, headers: { - Authorization: 'Bearer Incorrect_token', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -45,10 +46,10 @@ const deliveryCallsData = [ }, { httpReq: { - url: 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2', + url: 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2', params: { destination: 'marketo_static_list' }, headers: { - Authorization: 'Bearer token', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -68,10 +69,10 @@ const deliveryCallsData = [ }, { httpReq: { - url: 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=3&id=4', + url: 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=3&id=4', params: {}, headers: { - Authorization: 'Bearer token', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -91,10 +92,10 @@ const deliveryCallsData = [ }, { httpReq: { - url: 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=5&id=6', + url: 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=5&id=6', params: {}, headers: { - Authorization: 'Bearer token', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -119,15 +120,15 @@ export const networkCallsData = [ httpReq: { method: 'GET', params: { - client_id: 'marketo_client_id_success', - client_secret: 'marketo_client_secret_success', + client_id: 'marketo_static_list_client_id_success', + client_secret: secret1, grant_type: 'client_credentials', }, - url: 'https://marketo_acct_id_success.mktorest.com/identity/oauth/token', + url: 'https://marketo_static_list_acct_id_success.mktorest.com/identity/oauth/token', }, httpRes: { data: { - access_token: 'access_token_success', + access_token: secretAccessToken, expires_in: 3599, scope: 'integrations@rudderstack.com', token_type: 'bearer', diff --git a/test/integrations/destinations/marketo_static_list/processor/data.ts b/test/integrations/destinations/marketo_static_list/processor/data.ts index 05fba54f6a5..944858908d1 100644 --- a/test/integrations/destinations/marketo_static_list/processor/data.ts +++ b/test/integrations/destinations/marketo_static_list/processor/data.ts @@ -1,3 +1,5 @@ +import { authHeaderAccessToken, secret1 } from '../maskedSecrets'; + export const data = [ { name: 'marketo_static_list', @@ -10,7 +12,7 @@ export const data = [ body: [ { destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -20,9 +22,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 3421, }, Enabled: true, @@ -64,9 +66,9 @@ export const data = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=4&id=5&id=6', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=4&id=5&id=6', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -82,9 +84,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -109,7 +111,7 @@ export const data = [ body: [ { destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -119,9 +121,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -510,9 +512,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -528,9 +530,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=300&id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=300&id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -555,7 +557,7 @@ export const data = [ body: [ { destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -565,9 +567,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -956,9 +958,9 @@ export const data = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -974,9 +976,9 @@ export const data = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=300&id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=300&id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1001,7 +1003,7 @@ export const data = [ body: [ { destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -1011,9 +1013,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -1066,7 +1068,7 @@ export const data = [ body: [ { destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -1076,9 +1078,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -1131,7 +1133,7 @@ export const data = [ body: [ { destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -1141,9 +1143,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -1175,9 +1177,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, diff --git a/test/integrations/destinations/marketo_static_list/router/data.ts b/test/integrations/destinations/marketo_static_list/router/data.ts index 6525f7419d9..474925e4b82 100644 --- a/test/integrations/destinations/marketo_static_list/router/data.ts +++ b/test/integrations/destinations/marketo_static_list/router/data.ts @@ -1,3 +1,5 @@ +import { authHeaderAccessToken, secret1 } from '../maskedSecrets'; + export const data = [ { name: 'marketo_static_list', @@ -12,7 +14,7 @@ export const data = [ input: [ { destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -22,9 +24,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -50,7 +52,7 @@ export const data = [ }, { destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -60,9 +62,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -455,9 +457,9 @@ export const data = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=4&id=5&id=6', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=4&id=5&id=6', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -469,9 +471,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=1&id=2&id=3', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -480,12 +482,12 @@ export const data = [ }, ], metadata: [ - { destInfo: { authKey: '1zia9wKshXt80YksLmUdJnr7IHI' }, jobId: 1, userId: 'u1' }, + { destInfo: { authKey: 'marketoStaticListUdJnr7IHI' }, jobId: 1, userId: 'u1' }, ], batched: false, statusCode: 200, destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -495,9 +497,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -512,9 +514,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -526,9 +528,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=300&id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=300&id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -537,12 +539,12 @@ export const data = [ }, ], metadata: [ - { destInfo: { authKey: '1zia9wKshXt80YksLmUdJnr7IHI' }, jobId: 2, userId: 'u1' }, + { destInfo: { authKey: 'marketoStaticListUdJnr7IHI' }, jobId: 2, userId: 'u1' }, ], batched: false, statusCode: 200, destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -552,9 +554,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -589,9 +591,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -630,9 +632,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -671,9 +673,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -712,9 +714,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -753,9 +755,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -794,9 +796,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -825,7 +827,7 @@ export const data = [ }, { destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo_al', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -835,9 +837,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -863,7 +865,7 @@ export const data = [ }, { destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo_al', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -873,9 +875,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -1268,9 +1270,9 @@ export const data = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=2001&id=2002&id=2003', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=2001&id=2002&id=2003', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1296,9 +1298,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1313,9 +1315,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=1001&id=1002&id=1003', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1122/leads.json?id=1001&id=1002&id=1003', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1341,9 +1343,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1358,9 +1360,9 @@ export const data = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=4&id=5&id=6', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=4&id=5&id=6', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1372,9 +1374,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=101&id=102&id=103', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=101&id=102&id=103', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1383,12 +1385,12 @@ export const data = [ }, ], metadata: [ - { jobId: 7, destInfo: { authKey: '1zia9wKshXt80YksLmUdJnr7IHI' }, userId: 'u1' }, + { jobId: 7, destInfo: { authKey: 'marketoStaticListUdJnr7IHI' }, userId: 'u1' }, ], batched: false, statusCode: 200, destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo_al', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -1398,9 +1400,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -1415,9 +1417,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=0&id=1&id=2&id=3&id=4&id=5&id=6&id=7&id=8&id=9&id=10&id=11&id=12&id=13&id=14&id=15&id=16&id=17&id=18&id=19&id=20&id=21&id=22&id=23&id=24&id=25&id=26&id=27&id=28&id=29&id=30&id=31&id=32&id=33&id=34&id=35&id=36&id=37&id=38&id=39&id=40&id=41&id=42&id=43&id=44&id=45&id=46&id=47&id=48&id=49&id=50&id=51&id=52&id=53&id=54&id=55&id=56&id=57&id=58&id=59&id=60&id=61&id=62&id=63&id=64&id=65&id=66&id=67&id=68&id=69&id=70&id=71&id=72&id=73&id=74&id=75&id=76&id=77&id=78&id=79&id=80&id=81&id=82&id=83&id=84&id=85&id=86&id=87&id=88&id=89&id=90&id=91&id=92&id=93&id=94&id=95&id=96&id=97&id=98&id=99&id=100&id=101&id=102&id=103&id=104&id=105&id=106&id=107&id=108&id=109&id=110&id=111&id=112&id=113&id=114&id=115&id=116&id=117&id=118&id=119&id=120&id=121&id=122&id=123&id=124&id=125&id=126&id=127&id=128&id=129&id=130&id=131&id=132&id=133&id=134&id=135&id=136&id=137&id=138&id=139&id=140&id=141&id=142&id=143&id=144&id=145&id=146&id=147&id=148&id=149&id=150&id=151&id=152&id=153&id=154&id=155&id=156&id=157&id=158&id=159&id=160&id=161&id=162&id=163&id=164&id=165&id=166&id=167&id=168&id=169&id=170&id=171&id=172&id=173&id=174&id=175&id=176&id=177&id=178&id=179&id=180&id=181&id=182&id=183&id=184&id=185&id=186&id=187&id=188&id=189&id=190&id=191&id=192&id=193&id=194&id=195&id=196&id=197&id=198&id=199&id=200&id=201&id=202&id=203&id=204&id=205&id=206&id=207&id=208&id=209&id=210&id=211&id=212&id=213&id=214&id=215&id=216&id=217&id=218&id=219&id=220&id=221&id=222&id=223&id=224&id=225&id=226&id=227&id=228&id=229&id=230&id=231&id=232&id=233&id=234&id=235&id=236&id=237&id=238&id=239&id=240&id=241&id=242&id=243&id=244&id=245&id=246&id=247&id=248&id=249&id=250&id=251&id=252&id=253&id=254&id=255&id=256&id=257&id=258&id=259&id=260&id=261&id=262&id=263&id=264&id=265&id=266&id=267&id=268&id=269&id=270&id=271&id=272&id=273&id=274&id=275&id=276&id=277&id=278&id=279&id=280&id=281&id=282&id=283&id=284&id=285&id=286&id=287&id=288&id=289&id=290&id=291&id=292&id=293&id=294&id=295&id=296&id=297&id=298&id=299', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1429,9 +1431,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=300&id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/1234/leads.json?id=300&id=301&id=302&id=303&id=304&id=305&id=306&id=307&id=308&id=309&id=310&id=311&id=312&id=313&id=314&id=315&id=316&id=317&id=318&id=319&id=320&id=321&id=322&id=323&id=324&id=325&id=326&id=327&id=328&id=329&id=330&id=331&id=332&id=333&id=334&id=335&id=336&id=337&id=338&id=339&id=340&id=341&id=342&id=343&id=344&id=345&id=346&id=347&id=348&id=349&id=350', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1440,12 +1442,12 @@ export const data = [ }, ], metadata: [ - { jobId: 8, destInfo: { authKey: '1zia9wKshXt80YksLmUdJnr7IHI' }, userId: 'u1' }, + { jobId: 8, destInfo: { authKey: 'marketoStaticListUdJnr7IHI' }, userId: 'u1' }, ], batched: false, statusCode: 200, destination: { - ID: '1zia9wKshXt80YksLmUdJnr7IHI', + ID: 'marketoStaticListUdJnr7IHI', Name: 'test_marketo_al', DestinationDefinition: { ID: '1iVQvTRMsPPyJzwol0ifH93QTQ6', @@ -1455,9 +1457,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1234, }, Enabled: true, @@ -1493,9 +1495,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1534,9 +1536,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1575,9 +1577,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1616,9 +1618,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1657,9 +1659,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1698,9 +1700,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1744,9 +1746,9 @@ export const data = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/id001/leads.json?id=2002', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/id001/leads.json?id=2002', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1770,9 +1772,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1787,9 +1789,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/id001/leads.json?id=1001&id=1003', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/id001/leads.json?id=1001&id=1003', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1814,9 +1816,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1831,9 +1833,9 @@ export const data = [ type: 'REST', method: 'DELETE', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/id002/leads.json?id=2001&id=2003', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/id002/leads.json?id=2001&id=2003', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1858,9 +1860,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, @@ -1875,9 +1877,9 @@ export const data = [ type: 'REST', method: 'POST', endpoint: - 'https://marketo_acct_id_success.mktorest.com/rest/v1/lists/id002/leads.json?id=1002', + 'https://marketo_static_list_acct_id_success.mktorest.com/rest/v1/lists/id002/leads.json?id=1002', headers: { - Authorization: 'Bearer access_token_success', + Authorization: authHeaderAccessToken, 'Content-Type': 'application/json', }, params: {}, @@ -1901,9 +1903,9 @@ export const data = [ transformAtV1: 'processor', }, Config: { - clientId: 'marketo_client_id_success', - clientSecret: 'marketo_client_secret_success', - accountId: 'marketo_acct_id_success', + clientId: 'marketo_static_list_client_id_success', + clientSecret: secret1, + accountId: 'marketo_static_list_acct_id_success', staticListId: 1122, }, Enabled: true, diff --git a/test/integrations/destinations/mautic/maskedSecrets.ts b/test/integrations/destinations/mautic/maskedSecrets.ts new file mode 100644 index 00000000000..36a02e326f6 --- /dev/null +++ b/test/integrations/destinations/mautic/maskedSecrets.ts @@ -0,0 +1,10 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const secret4 = path.basename(__dirname) + 4; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; +export const authHeader2 = `Basic ${base64Convertor(secret3 + ':' + secret2)}`; +export const authHeader3 = `Basic ${base64Convertor(secret4 + ':' + secret2)}`; diff --git a/test/integrations/destinations/mautic/network.ts b/test/integrations/destinations/mautic/network.ts index 593a6306412..c2ee4faa08b 100644 --- a/test/integrations/destinations/mautic/network.ts +++ b/test/integrations/destinations/mautic/network.ts @@ -1,8 +1,9 @@ +import { authHeader1, authHeader2 } from './maskedSecrets'; export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic VGVzdFJ1ZGRlcmxhYnM0NTgyM0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -13,7 +14,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic VGVzdFJ1ZGRlcmxhYnM0NTgyM0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -24,7 +25,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic VGVzdFJ1ZGRlcmxhYnM0NTgyM0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -674,7 +675,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic VGVzdDQ1ODIzUnVkZGVybGFic0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader2, 'Content-Type': 'application/json', }, method: 'GET', @@ -1324,7 +1325,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic VGVzdDQ1ODIzUnVkZGVybGFic0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader2, 'Content-Type': 'application/json', }, method: 'GET', @@ -3221,7 +3222,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic VGVzdDQ1ODIzUnVkZGVybGFic0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader2, 'Content-Type': 'application/json', }, method: 'GET', diff --git a/test/integrations/destinations/mautic/processor/data.ts b/test/integrations/destinations/mautic/processor/data.ts index fe1dc6c41af..d4d93aacb8e 100644 --- a/test/integrations/destinations/mautic/processor/data.ts +++ b/test/integrations/destinations/mautic/processor/data.ts @@ -1,3 +1,12 @@ +import { + authHeader1, + secret1, + secret2, + authHeader2, + secret3, + authHeader3, + secret4, +} from '../maskedSecrets'; export const data = [ { name: 'mautic', @@ -32,11 +41,11 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: '', domainMethod: 'domainNameOption', domainName: 'https://testmautic.com', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -56,7 +65,7 @@ export const data = [ endpoint: 'https://testmautic.com/api/contacts/new', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmQGdtYWlsLmNvbTpkdW1teVBhc3N3b3Jk', + Authorization: authHeader3, }, params: {}, body: { @@ -113,11 +122,11 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'test', domainMethod: 'subDomainNameOption', domainName: 'https://testmautic.com/', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -137,7 +146,7 @@ export const data = [ endpoint: 'https://test.mautic.net/api/contacts/new', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmQGdtYWlsLmNvbTpkdW1teVBhc3N3b3Jk', + Authorization: authHeader3, }, params: {}, body: { @@ -193,11 +202,11 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'test', domainMethod: 'domainNameOption', domainName: 'https://testmautic.com', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -217,7 +226,7 @@ export const data = [ endpoint: 'https://testmautic.com/api/contacts/new', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmQGdtYWlsLmNvbTpkdW1teVBhc3N3b3Jk', + Authorization: authHeader3, }, params: {}, body: { @@ -277,7 +286,7 @@ export const data = [ lookUpField: 'email', password: '', subDomainName: 'testapi3', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -340,7 +349,7 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: '', domainName: '', userName: 'opiogfuebj', @@ -416,9 +425,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'ruddertest2', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, }, @@ -438,7 +447,7 @@ export const data = [ endpoint: 'https://ruddertest2.mautic.net/api/contacts/new', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic VGVzdFJ1ZGRlcmxhYnM0NTgyM0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader1, }, params: {}, body: { @@ -519,9 +528,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'ruddertest2', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, }, @@ -541,7 +550,7 @@ export const data = [ endpoint: 'https://ruddertest2.mautic.net/api/contacts/247/edit', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic VGVzdFJ1ZGRlcmxhYnM0NTgyM0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader1, }, params: {}, body: { @@ -622,7 +631,7 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', userName: '', }, @@ -684,7 +693,7 @@ export const data = [ lookUpField: 'email', password: '', subDomainName: 'testapi3', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -757,9 +766,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: '', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -816,9 +825,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -876,9 +885,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, }, @@ -932,9 +941,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -988,9 +997,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -1048,9 +1057,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -1104,9 +1113,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, }, @@ -1164,9 +1173,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, }, @@ -1212,9 +1221,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, }, @@ -1272,9 +1281,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, }, @@ -1328,9 +1337,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -1350,7 +1359,7 @@ export const data = [ endpoint: 'https://testapi3.mautic.net/api/contacts/new', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmQGdtYWlsLmNvbTpkdW1teVBhc3N3b3Jk', + Authorization: authHeader3, }, params: {}, body: { @@ -1406,9 +1415,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi3', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -1428,7 +1437,7 @@ export const data = [ endpoint: 'https://testapi3.mautic.net/api/contacts/new', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmQGdtYWlsLmNvbTpkdW1teVBhc3N3b3Jk', + Authorization: authHeader3, }, params: {}, body: { @@ -1478,9 +1487,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi5', - userName: 'Test45823Rudderlabs@gmail.com', + userName: secret3, }, }, }, @@ -1500,7 +1509,7 @@ export const data = [ endpoint: 'https://testapi5.mautic.net/api/contacts/246/edit', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic VGVzdDQ1ODIzUnVkZGVybGFic0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader2, }, params: {}, body: { @@ -1541,9 +1550,9 @@ export const data = [ destination: { Config: { lookUpField: 'lastName', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi5', - userName: 'Test45823Rudderlabs@gmail.com', + userName: secret3, }, }, }, @@ -1592,9 +1601,9 @@ export const data = [ destination: { Config: { lookUpField: 'lastName', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi5', - userName: 'Test45823Rudderlabs@gmail.com', + userName: secret3, }, }, }, @@ -1614,7 +1623,7 @@ export const data = [ endpoint: 'https://testapi5.mautic.net/api/segments/17/contact/246/remove', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic VGVzdDQ1ODIzUnVkZGVybGFic0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader2, }, params: {}, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, @@ -1648,9 +1657,9 @@ export const data = [ destination: { Config: { lookUpField: 'lastName', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi5', - userName: 'Test45823Rudderlabs@gmail.com', + userName: secret3, }, }, }, @@ -1670,7 +1679,7 @@ export const data = [ endpoint: 'https://testapi5.mautic.net/api/segments/17/contact/246/add', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic VGVzdDQ1ODIzUnVkZGVybGFic0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader2, }, params: {}, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, @@ -1702,9 +1711,9 @@ export const data = [ destination: { Config: { lookUpField: 'lastName', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi5', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -1752,9 +1761,9 @@ export const data = [ destination: { Config: { lookUpField: 'lastName', - password: 'dummyPassword', + password: secret2, subDomainName: 'testapi5', - userName: 'abcdef@gmail.com', + userName: secret4, }, }, }, @@ -1803,9 +1812,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'ruddertest2', - userName: 'Test45823Rudderlabs@gmail.com', + userName: secret3, }, }, }, @@ -1825,7 +1834,7 @@ export const data = [ endpoint: 'https://ruddertest2.mautic.net/api/companies/20/contact/247/add', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic VGVzdDQ1ODIzUnVkZGVybGFic0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader2, }, params: {}, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, @@ -1858,9 +1867,9 @@ export const data = [ destination: { Config: { lookUpField: 'lastName', - password: 'dummyPassword', + password: secret2, subDomainName: 'ruddertest2', - userName: 'Test45823Rudderlabs@gmail.com', + userName: secret3, }, }, }, @@ -1907,9 +1916,9 @@ export const data = [ destination: { Config: { lookUpField: 'lastName', - password: 'dummyPassword', + password: secret2, subDomainName: 'ruddertest2', - userName: 'Test45823Rudderlabs@gmail.com', + userName: secret3, }, }, }, diff --git a/test/integrations/destinations/mautic/router/data.ts b/test/integrations/destinations/mautic/router/data.ts index e0924053f8a..13c98378f55 100644 --- a/test/integrations/destinations/mautic/router/data.ts +++ b/test/integrations/destinations/mautic/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; export const data = [ { name: 'mautic', @@ -45,9 +46,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'ruddertest2', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, metadata: { jobId: 1, userId: 'u1' }, @@ -71,8 +72,7 @@ export const data = [ endpoint: 'https://ruddertest2.mautic.net/api/contacts/new', headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic VGVzdFJ1ZGRlcmxhYnM0NTgyM0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader1, }, params: {}, body: { @@ -107,9 +107,9 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: 'ruddertest2', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, }, @@ -164,7 +164,7 @@ export const data = [ destination: { Config: { lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: '', domainName: '', userName: 'abcdef', @@ -197,7 +197,7 @@ export const data = [ Config: { domainName: '', lookUpField: 'email', - password: 'dummyPassword', + password: secret2, subDomainName: '', userName: 'abcdef', }, @@ -232,9 +232,9 @@ export const data = [ destination: { Config: { lookUpField: 'lastName', - password: 'dummyPassword', + password: secret2, subDomainName: 'ruddertest2', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, metadata: { jobId: 3, userId: 'u1' }, @@ -258,8 +258,7 @@ export const data = [ endpoint: 'https://ruddertest2.mautic.net/api/segments/17/contact/246/add', headers: { 'Content-Type': 'application/json', - Authorization: - 'Basic VGVzdFJ1ZGRlcmxhYnM0NTgyM0BnbWFpbC5jb206ZHVtbXlQYXNzd29yZA==', + Authorization: authHeader1, }, params: {}, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, @@ -271,9 +270,9 @@ export const data = [ destination: { Config: { lookUpField: 'lastName', - password: 'dummyPassword', + password: secret2, subDomainName: 'ruddertest2', - userName: 'TestRudderlabs45823@gmail.com', + userName: secret1, }, }, }, diff --git a/test/integrations/destinations/moengage/maskedSecrets.ts b/test/integrations/destinations/moengage/maskedSecrets.ts new file mode 100644 index 00000000000..156e87fe1e6 --- /dev/null +++ b/test/integrations/destinations/moengage/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; diff --git a/test/integrations/destinations/moengage/processor/data.ts b/test/integrations/destinations/moengage/processor/data.ts index df6e1226b6d..f7572185621 100644 --- a/test/integrations/destinations/moengage/processor/data.ts +++ b/test/integrations/destinations/moengage/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; const mockFns = (_) => { jest.spyOn(Date, 'now').mockReturnValueOnce(new Date('2023-10-14T00:00:00.000Z').valueOf()); }; @@ -5,7 +6,7 @@ const mockFns = (_) => { export const data = [ { name: 'moengage', - description: 'Test 0', + description: 'Test 0: Track event with nested arrays and product properties', feature: 'processor', module: 'destination', version: 'v0', @@ -151,8 +152,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -176,11 +177,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api-01.moengage.com/v1/event/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/event/${secret1}`, headers: { 'Content-Type': 'application/json', - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + 'MOE-APPKEY': secret1, + Authorization: authHeader1, }, params: {}, body: { @@ -292,7 +293,7 @@ export const data = [ FORM: {}, }, files: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', }, statusCode: 200, }, @@ -303,7 +304,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 1', + description: 'Test 1: Identify call with user traits', feature: 'processor', module: 'destination', version: 'v0', @@ -375,8 +376,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -418,14 +419,14 @@ export const data = [ files: {}, method: 'POST', params: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', headers: { - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'MOE-APPKEY': secret1, 'Content-Type': 'application/json', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/customer/${secret1}`, }, statusCode: 200, }, @@ -435,7 +436,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 2', + description: 'Test 2: Identify call with custom traits', feature: 'processor', module: 'destination', version: 'v0', @@ -505,8 +506,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -548,12 +549,12 @@ export const data = [ params: {}, userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', headers: { - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'MOE-APPKEY': secret1, 'Content-Type': 'application/json', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/customer/${secret1}`, }, statusCode: 200, }, @@ -563,7 +564,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 3', + description: 'Test 3: Identify call with device information for Android', feature: 'processor', module: 'destination', version: 'v0', @@ -643,8 +644,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -686,14 +687,14 @@ export const data = [ files: {}, method: 'POST', params: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', headers: { - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'MOE-APPKEY': secret1, 'Content-Type': 'application/json', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/customer/${secret1}`, }, statusCode: 200, }, @@ -719,14 +720,14 @@ export const data = [ files: {}, method: 'POST', params: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', headers: { - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'MOE-APPKEY': secret1, 'Content-Type': 'application/json', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api-01.moengage.com/v1/device/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/device/${secret1}`, }, statusCode: 200, }, @@ -736,7 +737,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 4', + description: 'Test 4: Identify call with EU region configuration', feature: 'processor', module: 'destination', version: 'v0', @@ -808,8 +809,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'EU', @@ -851,14 +852,216 @@ export const data = [ files: {}, method: 'POST', params: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', + headers: { + 'MOE-APPKEY': secret1, + 'Content-Type': 'application/json', + Authorization: authHeader1, + }, + version: '1', + endpoint: `https://api-02.moengage.com/v1/customer/${secret1}`, + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'moengage', + description: 'Test 5: Pass traits as object with nested properties', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + properties: { + key1: { + key1_1: 'value1', + key1_2: 'value2', + data: 'hello', + }, + data: { + key2: 'value2', + }, + key2: 'value2', + }, + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.1.6', + }, + device: { + id: '7e32188a4dab669f', + manufacturer: 'Google', + model: 'Android SDK built for x86', + name: 'generic_x86', + token: 'desuhere', + type: 'android', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.6' }, + locale: 'en-GB', + os: { name: '', version: '' }, + page: { + path: '/testing/script-test.html', + referrer: '', + search: '', + title: '', + url: 'http://localhost:3243/testing/script-test.html', + }, + screen: { density: 2 }, + traits: { + company: { id: 'abc123' }, + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + address: { + city: 'San Francisco', + country: 'USA', + }, + }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36', + }, + integrations: { All: true }, + messageId: '531e3507-1ef5-4a06-b83c-cb521ff34f0c', + originalTimestamp: '2020-10-16T08:53:29.386Z', + receivedAt: '2020-10-16T14:23:29.402+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T08:53:29.387Z', + timestamp: '2020-10-16T14:23:29.401+05:30', + type: 'identify', + userId: 'rudder123', + }, + destination: { + ID: '1iuTZs6eEZVMm6GjRBe6bNShaL3', + Name: 'MoEngage Testing', + DestinationDefinition: { + ID: '1iu4802Tx27kNC4KNYYou6D8jzL', + Name: 'MOENGAGE', + DisplayName: 'MoEngage', + Config: { + destConfig: { defaultConfig: ['apiId', 'apiKey', 'region'] }, + excludeKeys: [], + includeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + }, + }, + Config: { + apiId: secret1, + apiKey: secret2, + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + useObjectData: true, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + JSON: { + type: 'customer', + attributes: { + name: 'Rudder Test', + plan: 'Enterprise', + email: 'rudderTest@gmail.com', + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + company: { id: 'abc123' }, + address: { + city: 'San Francisco', + country: 'USA', + }, + created_time: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + }, + customer_id: 'rudder123', + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + userId: 'rudder123', headers: { - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'MOE-APPKEY': secret1, 'Content-Type': 'application/json', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api-02.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/customer/${secret1}`, + }, + statusCode: 200, + }, + { + output: { + body: { + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + JSON: { + type: 'device', + device_id: '7e32188a4dab669f', + attributes: { + model: 'Android SDK built for x86', + push_id: 'desuhere', + platform: 'android', + app_version: '1.1.6', + key1: { + key1_1: 'value1', + key1_2: 'value2', + data: 'hello', + }, + data: { + key2: 'value2', + }, + key2: 'value2', + }, + customer_id: 'rudder123', + }, + }, + type: 'REST', + files: {}, + method: 'POST', + params: {}, + userId: 'rudder123', + headers: { + 'MOE-APPKEY': secret1, + 'Content-Type': 'application/json', + Authorization: authHeader1, + }, + version: '1', + endpoint: `https://api-01.moengage.com/v1/device/${secret1}`, }, statusCode: 200, }, @@ -868,7 +1071,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 5', + description: 'Test 6: Identify call with IND region configuration', feature: 'processor', module: 'destination', version: 'v0', @@ -940,8 +1143,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'IND', @@ -983,14 +1186,14 @@ export const data = [ files: {}, method: 'POST', params: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', headers: { - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'MOE-APPKEY': secret1, 'Content-Type': 'application/json', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api-03.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-03.moengage.com/v1/customer/${secret1}`, }, statusCode: 200, }, @@ -1000,7 +1203,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 6', + description: 'Test 7: Invalid region configuration', feature: 'processor', module: 'destination', version: 'v0', @@ -1072,8 +1275,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'AMA', @@ -1110,7 +1313,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 7', + description: 'Test 8: Missing event type validation', feature: 'processor', module: 'destination', version: 'v0', @@ -1181,8 +1384,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'IND', @@ -1219,7 +1422,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 8', + description: 'Test 9: Unsupported event type validation', feature: 'processor', module: 'destination', version: 'v0', @@ -1291,8 +1494,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'IND', @@ -1329,7 +1532,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 9', + description: 'Test 10: Track event with timezone offset', feature: 'processor', module: 'destination', version: 'v0', @@ -1480,8 +1683,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -1505,11 +1708,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api-01.moengage.com/v1/event/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/event/${secret1}`, headers: { 'Content-Type': 'application/json', - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + 'MOE-APPKEY': secret1, + Authorization: authHeader1, }, params: {}, body: { @@ -1638,7 +1841,299 @@ export const data = [ }, { name: 'moengage', - description: 'Test 10', + description: 'Test 11: Track event with object data enabled', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + channel: 'web', + context: { + timezone: 'Asia/Kolkata', + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.1.6', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.6' }, + locale: 'en-GB', + os: { name: '', version: '' }, + page: { + path: '/testing/script-test.html', + referrer: '', + search: '', + title: '', + url: 'http://localhost:3243/testing/script-test.html', + }, + screen: { density: 2 }, + traits: { + company: { id: 'abc123' }, + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36', + }, + event: 'Order Completed', + integrations: { All: true }, + messageId: 'a0adfab9-baf7-4e09-a2ce-bbe2844c324a', + originalTimestamp: '2020-10-16T08:10:12.782Z', + properties: { + category: 'some category', + originalArray: [ + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3', 'tag_1', 'tag_2', 'tag_3'], + }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3', 'tag_1', 'tag_2', 'tag_3'], + }, + ], + checkout_id: 'what is checkout id here??', + coupon: 'APPARELSALE', + currency: 'GBP', + order_id: 'transactionId', + products: [ + { + brand: '', + category: 'Merch', + currency: 'GBP', + image_url: 'https://www.example.com/product/bacon-jam.jpg', + name: 'Food/Drink', + position: 1, + price: 3, + product_id: 'product-bacon-jam', + quantity: 2, + sku: 'sku-1', + typeOfProduct: 'Food', + url: 'https://www.example.com/product/bacon-jam', + value: 6, + variant: 'Extra topped', + }, + { + brand: 'Levis', + category: 'Merch', + currency: 'GBP', + image_url: 'https://www.example.com/product/t-shirt.jpg', + name: 'T-Shirt', + position: 2, + price: 12.99, + product_id: 'product-t-shirt', + quantity: 1, + sku: 'sku-2', + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/t-shirt', + value: 12.99, + variant: 'White', + }, + { + brand: 'Levis', + category: 'Merch', + coupon: 'APPARELSALE', + currency: 'GBP', + image_url: 'https://www.example.com/product/offer-t-shirt.jpg', + name: 'T-Shirt-on-offer', + position: 1, + price: 12.99, + product_id: 'offer-t-shirt', + quantity: 1, + sku: 'sku-3', + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/offer-t-shirt', + value: 12.99, + variant: 'Black', + }, + ], + revenue: 31.98, + shipping: 4, + value: 31.98, + }, + receivedAt: '2020-10-16T13:40:12.792+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T08:10:12.783Z', + timestamp: '2020-10-16T13:40:12.791+05:30', + type: 'track', + userId: 'rudder123', + }, + destination: { + ID: '1iuTZs6eEZVMm6GjRBe6bNShaL3', + Name: 'MoEngage Testing', + DestinationDefinition: { + ID: '1iu4802Tx27kNC4KNYYou6D8jzL', + Name: 'MOENGAGE', + DisplayName: 'MoEngage', + Config: { + destConfig: { defaultConfig: ['apiId', 'apiKey', 'region'] }, + excludeKeys: [], + includeKeys: [], + supportedSourceTypes: [ + 'android', + 'ios', + 'web', + 'unity', + 'amp', + 'cloud', + 'reactnative', + ], + }, + }, + Config: { + apiId: secret1, + apiKey: secret2, + eventDelivery: false, + eventDeliveryTS: 1602757086384, + region: 'US', + useObjectData: true, + }, + Enabled: true, + Transformations: [], + IsProcessorEnabled: true, + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: `https://api-01.moengage.com/v1/event/${secret1}`, + headers: { + 'Content-Type': 'application/json', + 'MOE-APPKEY': secret1, + Authorization: authHeader1, + }, + params: {}, + body: { + JSON: { + customer_id: 'rudder123', + type: 'event', + actions: [ + { + action: 'Order Completed', + attributes: { + checkout_id: 'what is checkout id here??', + coupon: 'APPARELSALE', + currency: 'GBP', + order_id: 'transactionId', + category: 'some category', + originalArray: [ + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { nested_field: 'nested value', tags: ['tag_1', 'tag_2', 'tag_3'] }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3', 'tag_1', 'tag_2', 'tag_3'], + }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3', 'tag_1', 'tag_2', 'tag_3'], + }, + ], + products: [ + { + brand: '', + category: 'Merch', + currency: 'GBP', + image_url: 'https://www.example.com/product/bacon-jam.jpg', + name: 'Food/Drink', + position: 1, + price: 3, + product_id: 'product-bacon-jam', + quantity: 2, + sku: 'sku-1', + typeOfProduct: 'Food', + url: 'https://www.example.com/product/bacon-jam', + value: 6, + variant: 'Extra topped', + }, + { + brand: 'Levis', + category: 'Merch', + currency: 'GBP', + image_url: 'https://www.example.com/product/t-shirt.jpg', + name: 'T-Shirt', + position: 2, + price: 12.99, + product_id: 'product-t-shirt', + quantity: 1, + sku: 'sku-2', + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/t-shirt', + value: 12.99, + variant: 'White', + }, + { + brand: 'Levis', + category: 'Merch', + coupon: 'APPARELSALE', + currency: 'GBP', + image_url: 'https://www.example.com/product/offer-t-shirt.jpg', + name: 'T-Shirt-on-offer', + position: 1, + price: 12.99, + product_id: 'offer-t-shirt', + quantity: 1, + sku: 'sku-3', + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/offer-t-shirt', + value: 12.99, + variant: 'Black', + }, + ], + revenue: 31.98, + shipping: 4, + value: 31.98, + }, + app_version: '1.1.6', + current_time: '2020-10-16T13:40:12.791+05:30', + user_timezone_offset: 19800, + platform: 'web', + }, + ], + }, + XML: {}, + JSON_ARRAY: {}, + FORM: {}, + }, + files: {}, + userId: 'rudder123', + }, + statusCode: 200, + }, + ], + }, + }, + mockFns, + }, + { + name: 'moengage', + description: 'Test 12: Track event with invalid timezone', feature: 'processor', module: 'destination', version: 'v0', @@ -1772,8 +2267,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -1797,11 +2292,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api-01.moengage.com/v1/event/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/event/${secret1}`, headers: { 'Content-Type': 'application/json', - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + 'MOE-APPKEY': secret1, + Authorization: authHeader1, }, params: {}, body: { @@ -1875,7 +2370,7 @@ export const data = [ FORM: {}, }, files: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', }, statusCode: 200, }, @@ -1885,7 +2380,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 11', + description: 'Test 13: Identify call with iOS device information', feature: 'processor', module: 'destination', version: 'v0', @@ -1965,8 +2460,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -2008,14 +2503,14 @@ export const data = [ files: {}, method: 'POST', params: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', headers: { - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'MOE-APPKEY': secret1, 'Content-Type': 'application/json', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/customer/${secret1}`, }, statusCode: 200, }, @@ -2041,14 +2536,14 @@ export const data = [ files: {}, method: 'POST', params: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', headers: { - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'MOE-APPKEY': secret1, 'Content-Type': 'application/json', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + Authorization: authHeader1, }, version: '1', - endpoint: 'https://api-01.moengage.com/v1/device/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/device/${secret1}`, }, statusCode: 200, }, @@ -2058,7 +2553,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 12', + description: 'Test 14: Track event with iOS device information and invalid timezone', feature: 'processor', module: 'destination', version: 'v0', @@ -2206,8 +2701,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -2231,11 +2726,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api-01.moengage.com/v1/event/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/event/${secret1}`, headers: { 'Content-Type': 'application/json', - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + 'MOE-APPKEY': secret1, + Authorization: authHeader1, }, params: {}, body: { @@ -2318,7 +2813,7 @@ export const data = [ FORM: {}, }, files: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', }, statusCode: 200, }, @@ -2328,7 +2823,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 13', + description: 'Test 15: Track event with nested object properties and invalid timezone', feature: 'processor', module: 'destination', version: 'v0', @@ -2483,8 +2978,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -2508,11 +3003,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api-01.moengage.com/v1/event/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/event/${secret1}`, headers: { 'Content-Type': 'application/json', - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + 'MOE-APPKEY': secret1, + Authorization: authHeader1, }, params: {}, body: { @@ -2599,7 +3094,7 @@ export const data = [ FORM: {}, }, files: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', }, statusCode: 200, }, @@ -2609,7 +3104,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 14', + description: 'Test 16: Alias call for user merging', feature: 'processor', module: 'destination', version: 'v0', @@ -2652,8 +3147,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -2691,11 +3186,10 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + Authorization: authHeader1, }, version: '1', - endpoint: - 'https://api-01.moengage.com/v1/customer/merge?app_id=W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/customer/merge?app_id=${secret1}`, }, statusCode: 200, }, @@ -2705,7 +3199,7 @@ export const data = [ }, { name: 'moengage', - description: 'Test 15', + description: 'Test 17: Alias call without previousId validation', feature: 'processor', module: 'destination', version: 'v0', @@ -2747,8 +3241,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -2785,8 +3279,7 @@ export const data = [ }, { name: 'moengage', - description: - 'when identify is sent without context, the event should not throw internal server error', + description: 'Test 18: Identify call without context', feature: 'processor', module: 'destination', version: 'v0', @@ -2833,8 +3326,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -2865,17 +3358,17 @@ export const data = [ JSON_ARRAY: {}, XML: {}, }, - endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/customer/${secret1}`, files: {}, headers: { - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + Authorization: authHeader1, 'Content-Type': 'application/json', - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', + 'MOE-APPKEY': secret1, }, method: 'POST', params: {}, type: 'REST', - userId: 'anon-dummyId-1', + userId: 'userId16', version: '1', }, statusCode: 200, diff --git a/test/integrations/destinations/moengage/router/data.ts b/test/integrations/destinations/moengage/router/data.ts index b24453fd348..01fe949bce9 100644 --- a/test/integrations/destinations/moengage/router/data.ts +++ b/test/integrations/destinations/moengage/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; const mockFns = (_) => { jest.spyOn(Date, 'now').mockReturnValueOnce(new Date('2023-10-14T00:00:00.000Z').valueOf()); }; @@ -141,8 +142,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -218,8 +219,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -245,11 +246,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api-01.moengage.com/v1/event/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/event/${secret1}`, headers: { 'Content-Type': 'application/json', - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + 'MOE-APPKEY': secret1, + Authorization: authHeader1, }, params: {}, body: { @@ -324,7 +325,7 @@ export const data = [ FORM: {}, }, files: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', }, metadata: [{ jobId: 1, userId: 'u1' }], batched: false, @@ -352,8 +353,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', @@ -368,11 +369,11 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://api-01.moengage.com/v1/customer/W0ZHNMPI2O4KHJ48ZILZACRA', + endpoint: `https://api-01.moengage.com/v1/customer/${secret1}`, headers: { 'Content-Type': 'application/json', - 'MOE-APPKEY': 'W0ZHNMPI2O4KHJ48ZILZACRA', - Authorization: 'Basic VzBaSE5NUEkyTzRLSEo0OFpJTFpBQ1JBOmR1bW15QXBpS2V5', + 'MOE-APPKEY': secret1, + Authorization: authHeader1, }, params: {}, body: { @@ -393,7 +394,7 @@ export const data = [ FORM: {}, }, files: {}, - userId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + userId: 'rudder123', }, metadata: [{ jobId: 2, userId: 'u1' }], batched: false, @@ -421,8 +422,8 @@ export const data = [ }, }, Config: { - apiId: 'W0ZHNMPI2O4KHJ48ZILZACRA', - apiKey: 'dummyApiKey', + apiId: secret1, + apiKey: secret2, eventDelivery: false, eventDeliveryTS: 1602757086384, region: 'US', diff --git a/test/integrations/destinations/monday/dataDelivery/data.ts b/test/integrations/destinations/monday/dataDelivery/data.ts index 16d20470952..1012b866104 100644 --- a/test/integrations/destinations/monday/dataDelivery/data.ts +++ b/test/integrations/destinations/monday/dataDelivery/data.ts @@ -113,7 +113,7 @@ export const data: ProxyV1TestData[] = [ output: { response: [ { - error: '{"error_message":"Rate Limit Exceeded.","status_code":429}', + error: JSON.stringify({ error_message: 'Rate Limit Exceeded.', status_code: 429 }), statusCode: 429, metadata: generateMetadata(1), }, @@ -163,7 +163,7 @@ export const data: ProxyV1TestData[] = [ output: { response: [ { - error: '{"error_message":"Internal server error","status_code":500}', + error: JSON.stringify({ error_message: 'Internal server error', status_code: 500 }), statusCode: 500, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/monday/maskedSecrets.ts b/test/integrations/destinations/monday/maskedSecrets.ts new file mode 100644 index 00000000000..f27971f42a6 --- /dev/null +++ b/test/integrations/destinations/monday/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secretApiToken = path.basename(__dirname) + 1; +export const secretFailedApiToken = path.basename(__dirname) + 2; diff --git a/test/integrations/destinations/monday/network.ts b/test/integrations/destinations/monday/network.ts index f91952069aa..25096b0401a 100644 --- a/test/integrations/destinations/monday/network.ts +++ b/test/integrations/destinations/monday/network.ts @@ -1,3 +1,5 @@ +import { secretFailedApiToken, secretApiToken } from './maskedSecrets'; + export const networkCallsData = [ { httpReq: { @@ -26,8 +28,12 @@ export const networkCallsData = [ title: 'Subitems', type: 'subtasks', description: null, - settings_str: - '{"allowMultipleItems":true,"itemTypeName":"column.subtasks.title","displayType":"BOARD_INLINE","boardIds":[3160974974]}', + settings_str: JSON.stringify({ + allowMultipleItems: true, + itemTypeName: 'column.subtasks.title', + displayType: 'BOARD_INLINE', + boardIds: [3160974974], + }), }, { id: 'person', @@ -41,8 +47,15 @@ export const networkCallsData = [ title: 'Status', type: 'color', description: null, - settings_str: - '{"labels":{"0":"Working on it","1":"Done","2":"Stuck"},"labels_positions_v2":{"0":0,"1":2,"2":1,"5":3},"labels_colors":{"0":{"color":"#fdab3d","border":"#E99729","var_name":"orange"},"1":{"color":"#00c875","border":"#00B461","var_name":"green-shadow"},"2":{"color":"#e2445c","border":"#CE3048","var_name":"red-shadow"}}}', + settings_str: JSON.stringify({ + labels: { '0': 'Working on it', '1': 'Done', '2': 'Stuck' }, + labels_positions_v2: { '0': 0, '1': 2, '2': 1, '5': 3 }, + labels_colors: { + '0': { color: '#fdab3d', border: '#E99729', var_name: 'orange' }, + '1': { color: '#00c875', border: '#00B461', var_name: 'green-shadow' }, + '2': { color: '#e2445c', border: '#CE3048', var_name: 'red-shadow' }, + }, + }), }, { id: 'date4', @@ -63,30 +76,42 @@ export const networkCallsData = [ title: 'Connect boards', type: 'board-relation', description: null, - settings_str: '{"allowCreateReflectionColumn":false}', + settings_str: JSON.stringify({ allowCreateReflectionColumn: false }), }, { id: 'status_1', title: 'Other', type: 'color', description: null, - settings_str: - '{"labels":{"0":"Working on it","1":"Done","2":"Stuck"},"labels_colors":{"0":{"color":"#fdab3d","border":"#E99729","var_name":"orange"},"1":{"color":"#00c875","border":"#00B461","var_name":"green-shadow"},"2":{"color":"#e2445c","border":"#CE3048","var_name":"red-shadow"}}}', + settings_str: JSON.stringify({ + labels: { '0': 'Working on it', '1': 'Done', '2': 'Stuck' }, + labels_colors: { + '0': { color: '#fdab3d', border: '#E99729', var_name: 'orange' }, + '1': { color: '#00c875', border: '#00B461', var_name: 'green-shadow' }, + '2': { color: '#e2445c', border: '#CE3048', var_name: 'red-shadow' }, + }, + }), }, { id: 'date_1', title: 'Date 1', type: 'date', description: null, - settings_str: '{"hide_footer":false}', + settings_str: JSON.stringify({ hide_footer: false }), }, { id: 'status_12', title: 'new status', type: 'color', description: null, - settings_str: - '{"labels":{"0":"Working on it","1":"Done","2":"Stuck"},"labels_colors":{"0":{"color":"#fdab3d","border":"#E99729","var_name":"orange"},"1":{"color":"#00c875","border":"#00B461","var_name":"green-shadow"},"2":{"color":"#e2445c","border":"#CE3048","var_name":"red-shadow"}}}', + settings_str: JSON.stringify({ + labels: { '0': 'Working on it', '1': 'Done', '2': 'Stuck' }, + labels_colors: { + '0': { color: '#fdab3d', border: '#E99729', var_name: 'orange' }, + '1': { color: '#00c875', border: '#00B461', var_name: 'green-shadow' }, + '2': { color: '#e2445c', border: '#CE3048', var_name: 'red-shadow' }, + }, + }), }, { id: 'numbers', @@ -114,8 +139,13 @@ export const networkCallsData = [ title: 'Dropdown', type: 'dropdown', description: null, - settings_str: - '{"hide_footer":false,"labels":[{"id":1,"name":"dropdown"},{"id":2,"name":"dropup"}]}', + settings_str: JSON.stringify({ + hide_footer: false, + labels: [ + { id: 1, name: 'dropdown' }, + { id: 2, name: 'dropup' }, + ], + }), }, { id: 'email', @@ -150,7 +180,7 @@ export const networkCallsData = [ title: 'Timeline', type: 'timerange', description: null, - settings_str: '{"hide_footer":false}', + settings_str: JSON.stringify({ hide_footer: false }), }, { id: 'dependent_on', @@ -158,8 +188,11 @@ export const networkCallsData = [ type: 'dependency', description: 'Choose the item your task will be dependent on. If the “dependent on” item’s date is changing, the other dates will adjust automatically', - settings_str: - '{"boardIds":[3142482015],"dependencyNewInfra":true,"allowMultipleItems":true}', + settings_str: JSON.stringify({ + boardIds: [3142482015], + dependencyNewInfra: true, + allowMultipleItems: true, + }), }, { id: 'long_text', @@ -180,15 +213,23 @@ export const networkCallsData = [ title: 'Tags', type: 'tag', description: null, - settings_str: '{"hide_footer":false}', + settings_str: JSON.stringify({ hide_footer: false }), }, { id: 'label', title: 'Label', type: 'color', description: '', - settings_str: - '{"done_colors":[1],"labels":{"3":"Label 2","105":"Label 1","156":"Label 3"},"labels_positions_v2":{"3":1,"5":3,"105":0,"156":2},"labels_colors":{"3":{"color":"#0086c0","border":"#3DB0DF","var_name":"blue-links"},"105":{"color":"#9AADBD","border":"#9AADBD","var_name":"winter"},"156":{"color":"#9D99B9","border":"#9D99B9","var_name":"purple_gray"}}}', + settings_str: JSON.stringify({ + done_colors: [1], + labels: { '3': 'Label 2', '105': 'Label 1', '156': 'Label 3' }, + labels_positions_v2: { '3': 1, '5': 3, '105': 0, '156': 2 }, + labels_colors: { + '3': { color: '#0086c0', border: '#3DB0DF', var_name: 'blue-links' }, + '105': { color: '#9AADBD', border: '#9AADBD', var_name: 'winter' }, + '156': { color: '#9D99B9', border: '#9D99B9', var_name: 'purple_gray' }, + }, + }), }, { id: 'world_clock', @@ -287,8 +328,7 @@ export const networkCallsData = [ url: 'https://api.monday.com/v2', method: 'POST', headers: { - Authorization: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + Authorization: secretApiToken, }, }, httpRes: { @@ -310,8 +350,12 @@ export const networkCallsData = [ title: 'Subitems', type: 'subtasks', description: null, - settings_str: - '{"allowMultipleItems":true,"itemTypeName":"column.subtasks.title","displayType":"BOARD_INLINE","boardIds":[3160974974]}', + settings_str: JSON.stringify({ + allowMultipleItems: true, + itemTypeName: 'column.subtasks.title', + displayType: 'BOARD_INLINE', + boardIds: [3160974974], + }), }, { id: 'person', @@ -325,8 +369,15 @@ export const networkCallsData = [ title: 'Status', type: 'color', description: null, - settings_str: - '{"labels":{"0":"Working on it","1":"Done","2":"Stuck"},"labels_positions_v2":{"0":0,"1":2,"2":1,"5":3},"labels_colors":{"0":{"color":"#fdab3d","border":"#E99729","var_name":"orange"},"1":{"color":"#00c875","border":"#00B461","var_name":"green-shadow"},"2":{"color":"#e2445c","border":"#CE3048","var_name":"red-shadow"}}}', + settings_str: JSON.stringify({ + labels: { '0': 'Working on it', '1': 'Done', '2': 'Stuck' }, + labels_positions_v2: { '0': 0, '1': 2, '2': 1, '5': 3 }, + labels_colors: { + '0': { color: '#fdab3d', border: '#E99729', var_name: 'orange' }, + '1': { color: '#00c875', border: '#00B461', var_name: 'green-shadow' }, + '2': { color: '#e2445c', border: '#CE3048', var_name: 'red-shadow' }, + }, + }), }, { id: 'date4', @@ -347,30 +398,42 @@ export const networkCallsData = [ title: 'Connect boards', type: 'board-relation', description: null, - settings_str: '{"allowCreateReflectionColumn":false}', + settings_str: JSON.stringify({ allowCreateReflectionColumn: false }), }, { id: 'status_1', title: 'Other', type: 'color', description: null, - settings_str: - '{"labels":{"0":"Working on it","1":"Done","2":"Stuck"},"labels_colors":{"0":{"color":"#fdab3d","border":"#E99729","var_name":"orange"},"1":{"color":"#00c875","border":"#00B461","var_name":"green-shadow"},"2":{"color":"#e2445c","border":"#CE3048","var_name":"red-shadow"}}}', + settings_str: JSON.stringify({ + labels: { '0': 'Working on it', '1': 'Done', '2': 'Stuck' }, + labels_colors: { + '0': { color: '#fdab3d', border: '#E99729', var_name: 'orange' }, + '1': { color: '#00c875', border: '#00B461', var_name: 'green-shadow' }, + '2': { color: '#e2445c', border: '#CE3048', var_name: 'red-shadow' }, + }, + }), }, { id: 'date_1', title: 'Date 1', type: 'date', description: null, - settings_str: '{"hide_footer":false}', + settings_str: JSON.stringify({ hide_footer: false }), }, { id: 'status_12', title: 'new status', type: 'color', description: null, - settings_str: - '{"labels":{"0":"Working on it","1":"Done","2":"Stuck"},"labels_colors":{"0":{"color":"#fdab3d","border":"#E99729","var_name":"orange"},"1":{"color":"#00c875","border":"#00B461","var_name":"green-shadow"},"2":{"color":"#e2445c","border":"#CE3048","var_name":"red-shadow"}}}', + settings_str: JSON.stringify({ + labels: { '0': 'Working on it', '1': 'Done', '2': 'Stuck' }, + labels_colors: { + '0': { color: '#fdab3d', border: '#E99729', var_name: 'orange' }, + '1': { color: '#00c875', border: '#00B461', var_name: 'green-shadow' }, + '2': { color: '#e2445c', border: '#CE3048', var_name: 'red-shadow' }, + }, + }), }, { id: 'numbers', @@ -398,8 +461,13 @@ export const networkCallsData = [ title: 'Dropdown', type: 'dropdown', description: null, - settings_str: - '{"hide_footer":false,"labels":[{"id":1,"name":"dropdown"},{"id":2,"name":"dropup"}]}', + settings_str: JSON.stringify({ + hide_footer: false, + labels: [ + { id: 1, name: 'dropdown' }, + { id: 2, name: 'dropup' }, + ], + }), }, { id: 'email', @@ -434,7 +502,7 @@ export const networkCallsData = [ title: 'Timeline', type: 'timerange', description: null, - settings_str: '{"hide_footer":false}', + settings_str: JSON.stringify({ hide_footer: false }), }, { id: 'dependent_on', @@ -442,8 +510,11 @@ export const networkCallsData = [ type: 'dependency', description: 'Choose the item your task will be dependent on. If the “dependent on” item’s date is changing, the other dates will adjust automatically', - settings_str: - '{"boardIds":[3142482015],"dependencyNewInfra":true,"allowMultipleItems":true}', + settings_str: JSON.stringify({ + boardIds: [3142482015], + dependencyNewInfra: true, + allowMultipleItems: true, + }), }, { id: 'long_text', @@ -464,15 +535,23 @@ export const networkCallsData = [ title: 'Tags', type: 'tag', description: null, - settings_str: '{"hide_footer":false}', + settings_str: JSON.stringify({ hide_footer: false }), }, { id: 'label', title: 'Label', type: 'color', description: '', - settings_str: - '{"done_colors":[1],"labels":{"3":"Label 2","105":"Label 1","156":"Label 3"},"labels_positions_v2":{"3":1,"5":3,"105":0,"156":2},"labels_colors":{"3":{"color":"#0086c0","border":"#3DB0DF","var_name":"blue-links"},"105":{"color":"#9AADBD","border":"#9AADBD","var_name":"winter"},"156":{"color":"#9D99B9","border":"#9D99B9","var_name":"purple_gray"}}}', + settings_str: JSON.stringify({ + done_colors: [1], + labels: { '3': 'Label 2', '105': 'Label 1', '156': 'Label 3' }, + labels_positions_v2: { '3': 1, '5': 3, '105': 0, '156': 2 }, + labels_colors: { + '3': { color: '#0086c0', border: '#3DB0DF', var_name: 'blue-links' }, + '105': { color: '#9AADBD', border: '#9AADBD', var_name: 'winter' }, + '156': { color: '#9D99B9', border: '#9D99B9', var_name: 'purple_gray' }, + }, + }), }, { id: 'world_clock', @@ -512,7 +591,7 @@ export const networkCallsData = [ url: 'https://api.monday.com/v2', method: 'POST', headers: { - Authorization: 'failedApiToken', + Authorization: secretFailedApiToken, }, }, httpRes: { diff --git a/test/integrations/destinations/monday/processor/data.ts b/test/integrations/destinations/monday/processor/data.ts index 082ff822fd5..8423d188a12 100644 --- a/test/integrations/destinations/monday/processor/data.ts +++ b/test/integrations/destinations/monday/processor/data.ts @@ -1,3 +1,5 @@ +import { secretFailedApiToken, secretApiToken } from '../maskedSecrets'; + export const data = [ { name: 'monday', @@ -11,8 +13,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: '', columnToPropertyMapping: [], @@ -82,8 +83,7 @@ export const data = [ endpoint: 'https://api.monday.com/v2', files: {}, headers: { - Authorization: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + Authorization: secretApiToken, 'Content-Type': 'application/json', }, method: 'POST', @@ -110,8 +110,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: '', whitelistedEvents: [ @@ -180,8 +179,7 @@ export const data = [ endpoint: 'https://api.monday.com/v2', files: {}, headers: { - Authorization: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + Authorization: secretApiToken, 'Content-Type': 'application/json', }, method: 'POST', @@ -208,8 +206,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: '', columnToPropertyMapping: [], @@ -293,8 +290,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: '', columnToPropertyMapping: [], @@ -462,8 +458,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '', groupTitle: '', columnToPropertyMapping: [], @@ -547,8 +542,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: '', columnToPropertyMapping: [], @@ -632,8 +626,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: '', columnToPropertyMapping: [ @@ -709,8 +702,7 @@ export const data = [ endpoint: 'https://api.monday.com/v2', headers: { 'Content-Type': 'application/json', - Authorization: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + Authorization: secretApiToken, }, params: {}, body: { @@ -743,8 +735,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: 'Next month', columnToPropertyMapping: [ @@ -820,8 +811,7 @@ export const data = [ endpoint: 'https://api.monday.com/v2', headers: { 'Content-Type': 'application/json', - Authorization: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + Authorization: secretApiToken, }, params: {}, body: { @@ -854,8 +844,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: 'Next year', columnToPropertyMapping: [ @@ -951,8 +940,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: 'Next month', columnToPropertyMapping: [ @@ -1049,8 +1037,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: 'Next month', columnToPropertyMapping: [ @@ -1181,8 +1168,7 @@ export const data = [ endpoint: 'https://api.monday.com/v2', headers: { 'Content-Type': 'application/json', - Authorization: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + Authorization: secretApiToken, }, params: {}, body: { @@ -1215,8 +1201,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: 'Next month', columnToPropertyMapping: [ @@ -1301,6 +1286,7 @@ export const data = [ }, }, { + only: true, name: 'monday', description: 'check for deleted boards (configured boards are deleted)', feature: 'processor', @@ -1312,7 +1298,7 @@ export const data = [ { destination: { Config: { - apiToken: 'failedApiToken', + apiToken: secretFailedApiToken, boardId: '339283934', groupTitle: 'Next year', columnToPropertyMapping: [ diff --git a/test/integrations/destinations/monday/router/data.ts b/test/integrations/destinations/monday/router/data.ts index abd649d805c..0228690878b 100644 --- a/test/integrations/destinations/monday/router/data.ts +++ b/test/integrations/destinations/monday/router/data.ts @@ -1,3 +1,5 @@ +import { secretApiToken } from '../maskedSecrets'; + export const data = [ { name: 'monday', @@ -12,8 +14,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: '', columnToPropertyMapping: [], @@ -52,8 +53,7 @@ export const data = [ { destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: 'Next month', columnToPropertyMapping: [ @@ -121,8 +121,7 @@ export const data = [ endpoint: 'https://api.monday.com/v2', files: {}, headers: { - Authorization: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + Authorization: secretApiToken, 'Content-Type': 'application/json', }, method: 'POST', @@ -135,8 +134,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: '', columnToPropertyMapping: [], @@ -152,8 +150,7 @@ export const data = [ endpoint: 'https://api.monday.com/v2', headers: { 'Content-Type': 'application/json', - Authorization: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + Authorization: secretApiToken, }, params: {}, body: { @@ -172,8 +169,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiToken: - 'eywwakzdjiksjhriherniSFsjhnskdojsSDFhsdns.sSRSSREWdnfnsjshfjsjskshfiskskdS__Fskilhih', + apiToken: secretApiToken, boardId: '339283933', groupTitle: 'Next month', columnToPropertyMapping: [ diff --git a/test/integrations/destinations/movable_ink/common.ts b/test/integrations/destinations/movable_ink/common.ts index 29fe76852cb..2cb83e99af7 100644 --- a/test/integrations/destinations/movable_ink/common.ts +++ b/test/integrations/destinations/movable_ink/common.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from './maskedSecrets'; import { Destination } from '../../../../src/types'; const destType = 'movable_ink'; @@ -7,8 +8,8 @@ const channel = 'web'; const destination: Destination = { Config: { endpoint: 'https://collector.movableink-dmz.com/behavioral/abc123', - accessKey: 'test-access-key', - accessSecret: 'test_access_secret', + accessKey: secret1, + accessSecret: secret2, }, DestinationDefinition: { DisplayName: displayName, @@ -48,7 +49,7 @@ const traits = { const headers = { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdC1hY2Nlc3Mta2V5OnRlc3RfYWNjZXNzX3NlY3JldA==', + Authorization: authHeader1, }; const commonProperties = { diff --git a/test/integrations/destinations/movable_ink/maskedSecrets.ts b/test/integrations/destinations/movable_ink/maskedSecrets.ts new file mode 100644 index 00000000000..156e87fe1e6 --- /dev/null +++ b/test/integrations/destinations/movable_ink/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + secret2)}`; diff --git a/test/integrations/destinations/movable_ink/processor/identify.ts b/test/integrations/destinations/movable_ink/processor/identify.ts index 0fe806df4ae..60c9b39d76b 100644 --- a/test/integrations/destinations/movable_ink/processor/identify.ts +++ b/test/integrations/destinations/movable_ink/processor/identify.ts @@ -31,6 +31,7 @@ export const identify: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/movable_ink/processor/track.ts b/test/integrations/destinations/movable_ink/processor/track.ts index 890de11a0cf..e34e1799e59 100644 --- a/test/integrations/destinations/movable_ink/processor/track.ts +++ b/test/integrations/destinations/movable_ink/processor/track.ts @@ -33,6 +33,7 @@ export const track: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -96,6 +97,7 @@ export const track: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -159,6 +161,7 @@ export const track: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/movable_ink/processor/validation.ts b/test/integrations/destinations/movable_ink/processor/validation.ts index 6aafb5e2c07..575337a20fb 100644 --- a/test/integrations/destinations/movable_ink/processor/validation.ts +++ b/test/integrations/destinations/movable_ink/processor/validation.ts @@ -27,6 +27,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -71,6 +72,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -111,6 +113,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -154,6 +157,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -197,6 +201,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -241,6 +246,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/mp/common.ts b/test/integrations/destinations/mp/common.ts index f8aae817808..56baf27d0f4 100644 --- a/test/integrations/destinations/mp/common.ts +++ b/test/integrations/destinations/mp/common.ts @@ -1,13 +1,13 @@ import { Destination } from '../../../../src/types'; - +import { secret1, secret2 } from './maskedSecrets'; const defaultMockFns = () => { jest.spyOn(Date, 'now').mockReturnValue(new Date(Date.UTC(2020, 0, 25)).valueOf()); }; const sampleDestination: Destination = { Config: { - apiKey: 'dummyApiKey', - token: 'test_api_token', + apiKey: secret1, + token: secret2, prefixProperties: true, useNativeSDK: false, }, @@ -15,7 +15,7 @@ const sampleDestination: Destination = { DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', - Config: undefined, + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', @@ -26,7 +26,7 @@ const sampleDestination: Destination = { const destinationWithSetOnceProperty = { Config: { - apiSecret: 'dummySecret', + apiSecret: secret1, dataResidency: 'us', identityMergeApi: 'simplified', setOnceProperties: [ @@ -45,7 +45,7 @@ const destinationWithSetOnceProperty = { property: 'random', }, ], - token: 'dummyToken', + token: secret2, useNativeSDK: false, useNewMapping: false, userDeletionApi: 'engage', diff --git a/test/integrations/destinations/mp/deleteUsers/data.ts b/test/integrations/destinations/mp/deleteUsers/data.ts index 0f469b508fa..fdd0413e097 100644 --- a/test/integrations/destinations/mp/deleteUsers/data.ts +++ b/test/integrations/destinations/mp/deleteUsers/data.ts @@ -1,3 +1,6 @@ +import { defaultApiKey } from '../../../common/secrets'; +import { secret4 } from '../maskedSecrets'; + export const data = [ { name: 'mp', @@ -3099,7 +3102,7 @@ export const data = [ }, ], config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, prefixProperties: true, useNativeSDK: false, }, @@ -3179,11 +3182,11 @@ export const data = [ }, ], config: { - token: 'test_token', + token: secret4, prefixProperties: true, useNativeSDK: false, userDeletionApi: 'task', - gdprApiToken: 'test_gdpr_token', + gdprApiToken: secret4, }, }, ], @@ -3218,7 +3221,7 @@ export const data = [ }, ], config: { - token: 'test_token', + token: secret4, prefixProperties: true, useNativeSDK: false, userDeletionApi: 'task', @@ -3257,7 +3260,7 @@ export const data = [ }, ], config: { - token: 'test_token', + token: secret4, prefixProperties: true, useNativeSDK: false, dataResidency: 'eu', diff --git a/test/integrations/destinations/mp/maskedSecrets.ts b/test/integrations/destinations/mp/maskedSecrets.ts new file mode 100644 index 00000000000..e78fce5e754 --- /dev/null +++ b/test/integrations/destinations/mp/maskedSecrets.ts @@ -0,0 +1,9 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const secret4 = path.basename(__dirname) + 4; +export const authHeader2 = `Basic ${base64Convertor(secret2 + ':')}`; +export const authHeader4 = `Bearer ${secret4}`; diff --git a/test/integrations/destinations/mp/network.ts b/test/integrations/destinations/mp/network.ts index cc5e265f43f..446bdc4d775 100644 --- a/test/integrations/destinations/mp/network.ts +++ b/test/integrations/destinations/mp/network.ts @@ -1,3 +1,5 @@ +import { authHeader4, secret4 } from './maskedSecrets'; + const deleteNwData = [ { httpReq: { @@ -1077,16 +1079,14 @@ const deleteNwData = [ { httpReq: { method: 'post', - - url: 'https://mixpanel.com/api/app/data-deletions/v3.0/?token=test_token', + url: `https://mixpanel.com/api/app/data-deletions/v3.0/?token=${secret4}`, data: { distinct_ids: ['rudder1', 'rudder2', 'rudder3'], compliance_type: 'CCPA', }, headers: { 'Content-Type': 'application/json', - - Authorization: 'Bearer test_gdpr_token', + Authorization: authHeader4, }, }, httpRes: { @@ -1101,7 +1101,7 @@ const deleteNwData = [ httpReq: { method: 'post', - url: 'https://mixpanel.com/api/app/data-deletions/v3.0/?token=test_token', + url: `https://mixpanel.com/api/app/data-deletions/v3.0/?token=${secret4}`, data: { distinct_ids: ['rudder2'], compliance_type: 'GDPR', @@ -1109,7 +1109,7 @@ const deleteNwData = [ headers: { 'Content-Type': 'application/json', Accept: 'text/plain', - Authorization: 'Bearer test_gdpr_token', + Authorization: authHeader4, }, }, httpRes: { @@ -1150,7 +1150,7 @@ const deleteNwData = [ httpReq: { method: 'post', url: 'https://api-eu.mixpanel.com/engage', - data: [{ $distinct_id: 'rudder1', $token: 'test_token', $delete: null, $ignore_alias: true }], + data: [{ $distinct_id: 'rudder1', $token: secret4, $delete: null, $ignore_alias: true }], headers: { 'Content-Type': 'application/json', Accept: 'text/plain', diff --git a/test/integrations/destinations/mp/processor/data.ts b/test/integrations/destinations/mp/processor/data.ts index d13cf64cae2..1ed97577d66 100644 --- a/test/integrations/destinations/mp/processor/data.ts +++ b/test/integrations/destinations/mp/processor/data.ts @@ -1,5 +1,6 @@ import { overrideDestination } from '../../../testUtils'; import { sampleDestination, defaultMockFns, destinationWithSetOnceProperty } from '../common'; +import { authHeader2, secret2, secret3 } from '../maskedSecrets'; export const data = [ { @@ -12,7 +13,7 @@ export const data = [ request: { body: [ { - destination: overrideDestination(sampleDestination, { token: 'test_api_token' }), + destination: overrideDestination(sampleDestination, { token: secret2 }), message: { anonymousId: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', channel: 'web', @@ -89,15 +90,44 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Loaded a Page","properties":{"ip":"0.0.0.0","campaign_id":"test_name","$user_id":"hjikl","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"dd266c67-9199-4a52-ba32-f46ddde67312","token":"test_api_token","distinct_id":"hjikl","time":1579847342402,"utm_campaign":"test_name","utm_source":"rudder","utm_medium":"test_medium","utm_term":"test_tem","utm_content":"test_content","utm_test":"test","utm_keyword":"test_keyword","name":"Contact Us","$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: 'Loaded a Page', + properties: { + ip: '0.0.0.0', + campaign_id: 'test_name', + $user_id: 'hjikl', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'dd266c67-9199-4a52-ba32-f46ddde67312', + token: secret2, + distinct_id: 'hjikl', + time: 1579847342402, + utm_campaign: 'test_name', + utm_source: 'rudder', + utm_medium: 'test_medium', + utm_term: 'test_tem', + utm_content: 'test_content', + utm_test: 'test', + utm_keyword: 'test_keyword', + name: 'Contact Us', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -196,15 +226,37 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Viewed a Contact Us page","properties":{"ip":"0.0.0.0","$user_id":"hjikl","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"dd266c67-9199-4a52-ba32-f46ddde67312","token":"test_api_token","distinct_id":"hjikl","time":1579847342402,"name":"Contact Us","category":"Contact","$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: 'Viewed a Contact Us page', + properties: { + ip: '0.0.0.0', + $user_id: 'hjikl', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'dd266c67-9199-4a52-ba32-f46ddde67312', + token: secret2, + distinct_id: 'hjikl', + time: 1579847342402, + name: 'Contact Us', + category: 'Contact', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -280,15 +332,32 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Loaded a Screen","properties":{"category":"communication","ip":"0.0.0.0","$user_id":"hjikl","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"dd266c67-9199-4a52-ba32-f46ddde67312","token":"test_api_token","distinct_id":"hjikl","time":1579847342402,"name":"Contact Us"}}]', + batch: JSON.stringify([ + { + event: 'Loaded a Screen', + properties: { + category: 'communication', + ip: '0.0.0.0', + $user_id: 'hjikl', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'dd266c67-9199-4a52-ba32-f46ddde67312', + token: secret2, + distinct_id: 'hjikl', + time: 1579847342402, + name: 'Contact Us', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -371,15 +440,37 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Loaded a Screen","properties":{"path":"/tests/html/index2.html","referrer":"","search":"","title":"","url":"http://localhost/tests/html/index2.html","ip":"0.0.0.0","$user_id":"hjiklmk","$screen_dpi":2,"mp_lib":"RudderLabs Android SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"dd266c67-9199-4a52-ba32-f46ddde67312","token":"test_api_token","distinct_id":"hjiklmk","time":1579847342402,"name":"Contact Us","category":"Contact"}}]', + batch: JSON.stringify([ + { + event: 'Loaded a Screen', + properties: { + path: '/tests/html/index2.html', + referrer: '', + search: '', + title: '', + url: 'http://localhost/tests/html/index2.html', + ip: '0.0.0.0', + $user_id: 'hjiklmk', + $screen_dpi: 2, + mp_lib: 'RudderLabs Android SDK', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'dd266c67-9199-4a52-ba32-f46ddde67312', + token: secret2, + distinct_id: 'hjiklmk', + time: 1579847342402, + name: 'Contact Us', + category: 'Contact', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -454,15 +545,31 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Loaded a Screen","properties":{"ip":"0.0.0.0","$user_id":"hjikl","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"dd266c67-9199-4a52-ba32-f46ddde67312","token":"test_api_token","distinct_id":"hjikl","time":1579847342402,"name":"Contact Us"}}]', + batch: JSON.stringify([ + { + event: 'Loaded a Screen', + properties: { + ip: '0.0.0.0', + $user_id: 'hjikl', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'dd266c67-9199-4a52-ba32-f46ddde67312', + token: secret2, + distinct_id: 'hjikl', + time: 1579847342402, + name: 'Contact Us', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -564,8 +671,27 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$created":"2020-01-23T08:54:02.362Z","$email":"mickey@disney.com","$first_name":"Mickey","$last_name":"Mouse","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $created: '2020-01-23T08:54:02.362Z', + $email: 'mickey@disney.com', + $first_name: 'Mickey', + $last_name: 'Mouse', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -678,8 +804,15 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$append":{"$transactions":{"$time":"2020-01-24T06:29:02.403Z","$amount":45.89}},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca"}]', + batch: JSON.stringify([ + { + $append: { + $transactions: { $time: '2020-01-24T06:29:02.403Z', $amount: 45.89 }, + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + }, + ]), }, XML: {}, FORM: {}, @@ -700,8 +833,13 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$add":{"counter":1,"item_purchased":"2"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca"}]', + batch: JSON.stringify([ + { + $add: { counter: 1, item_purchased: '2' }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + }, + ]), }, XML: {}, FORM: {}, @@ -718,15 +856,51 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"test revenue MIXPANEL","properties":{"currency":"USD","revenue":45.89,"counter":1,"item_purchased":"2","number_of_logins":"","city":"Disney","country":"USA","email":"mickey@disney.com","firstName":"Mickey","ip":"0.0.0.0","campaign_id":"test_name","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"a6a0ad5a-bd26-4f19-8f75-38484e580fc7","token":"test_api_token","distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","time":1579847342403,"utm_campaign":"test_name","utm_source":"rudder","utm_medium":"test_medium","utm_term":"test_tem","utm_content":"test_content","utm_test":"test","utm_keyword":"test_keyword","$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: 'test revenue MIXPANEL', + properties: { + currency: 'USD', + revenue: 45.89, + counter: 1, + item_purchased: '2', + number_of_logins: '', + city: 'Disney', + country: 'USA', + email: 'mickey@disney.com', + firstName: 'Mickey', + ip: '0.0.0.0', + campaign_id: 'test_name', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'a6a0ad5a-bd26-4f19-8f75-38484e580fc7', + token: secret2, + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + time: 1579847342403, + utm_campaign: 'test_name', + utm_source: 'rudder', + utm_medium: 'test_medium', + utm_term: 'test_tem', + utm_content: 'test_content', + utm_test: 'test', + utm_keyword: 'test_keyword', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -816,15 +990,23 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"$create_alias","properties":{"distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","alias":"1234abc","token":"test_api_token"}}]', + batch: JSON.stringify([ + { + event: '$create_alias', + properties: { + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + alias: '1234abc', + token: secret2, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -953,8 +1135,15 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$append":{"$transactions":{"$time":"2020-01-24T06:29:02.402Z","$amount":25}},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca"}]', + batch: JSON.stringify([ + { + $append: { + $transactions: { $time: '2020-01-24T06:29:02.402Z', $amount: 25 }, + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + }, + ]), }, XML: {}, FORM: {}, @@ -971,15 +1160,69 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"KM Order Completed","properties":{"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f","coupon":"hasbros","currency":"USD","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"category":"Games","image_url":"https:///www.example.com/product/path.jpg","name":"Monopoly: 3rd Edition","price":19,"product_id":"507f1f77bcf86cd799439011","quantity":1,"sku":"45790-32","url":"https://www.example.com/product/path"},{"category":"Games","name":"Uno Card Game","price":3,"product_id":"505bd76785ebb509fc183733","quantity":2,"sku":"46493-32"}],"revenue":25,"shipping":3,"subtotal":22.5,"tax":2,"total":27.5,"city":"Disney","country":"USA","email":"mickey@disney.com","firstName":"Mickey","ip":"0.0.0.0","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"aa5f5e44-8756-40ad-ad1e-b0d3b9fa710a","token":"test_api_token","distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","time":1579847342402,"$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: 'KM Order Completed', + properties: { + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + coupon: 'hasbros', + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + category: 'Games', + image_url: 'https:///www.example.com/product/path.jpg', + name: 'Monopoly: 3rd Edition', + price: 19, + product_id: '507f1f77bcf86cd799439011', + quantity: 1, + sku: '45790-32', + url: 'https://www.example.com/product/path', + }, + { + category: 'Games', + name: 'Uno Card Game', + price: 3, + product_id: '505bd76785ebb509fc183733', + quantity: 2, + sku: '46493-32', + }, + ], + revenue: 25, + shipping: 3, + subtotal: 22.5, + tax: 2, + total: 27.5, + city: 'Disney', + country: 'USA', + email: 'mickey@disney.com', + firstName: 'Mickey', + ip: '0.0.0.0', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'aa5f5e44-8756-40ad-ad1e-b0d3b9fa710a', + token: secret2, + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + time: 1579847342402, + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -1112,8 +1355,15 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$append":{"$transactions":{"$time":"2020-01-24T06:29:02.402Z","$amount":34}},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca"}]', + batch: JSON.stringify([ + { + $append: { + $transactions: { $time: '2020-01-24T06:29:02.402Z', $amount: 34 }, + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + }, + ]), }, XML: {}, FORM: {}, @@ -1130,15 +1380,78 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"KM Order Completed","properties":{"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f","coupon":"hasbros","currency":"USD","discount":2.5,"order_id":"50314b8e9bcf000000000000","revenue":34,"key_1":{"child_key1":"child_value1","child_key2":{"child_key21":"child_value21","child_key22":"child_value22"}},"products":[{"category":"Games","image_url":"https:///www.example.com/product/path.jpg","name":"Monopoly: 3rd Edition","price":19,"product_id":"507f1f77bcf86cd799439011","quantity":1,"sku":"45790-32","url":"https://www.example.com/product/path"},{"category":"Games","name":"Uno Card Game","price":3,"product_id":"505bd76785ebb509fc183733","quantity":2,"sku":"46493-32"}],"shipping":3,"subtotal":22.5,"tax":2,"total":27.5,"city":"Disney","country":"USA","email":"mickey@disney.com","first_name":"Mickey","lastName":"Mouse","name":"Mickey Mouse","ip":"0.0.0.0","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"aa5f5e44-8756-40ad-ad1e-b0d3b9fa710a","token":"test_api_token","distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","time":1579847342402,"$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: 'KM Order Completed', + properties: { + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + coupon: 'hasbros', + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + revenue: 34, + key_1: { + child_key1: 'child_value1', + child_key2: { + child_key21: 'child_value21', + child_key22: 'child_value22', + }, + }, + products: [ + { + category: 'Games', + image_url: 'https:///www.example.com/product/path.jpg', + name: 'Monopoly: 3rd Edition', + price: 19, + product_id: '507f1f77bcf86cd799439011', + quantity: 1, + sku: '45790-32', + url: 'https://www.example.com/product/path', + }, + { + category: 'Games', + name: 'Uno Card Game', + price: 3, + product_id: '505bd76785ebb509fc183733', + quantity: 2, + sku: '46493-32', + }, + ], + shipping: 3, + subtotal: 22.5, + tax: 2, + total: 27.5, + city: 'Disney', + country: 'USA', + email: 'mickey@disney.com', + first_name: 'Mickey', + lastName: 'Mouse', + name: 'Mickey Mouse', + ip: '0.0.0.0', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'aa5f5e44-8756-40ad-ad1e-b0d3b9fa710a', + token: secret2, + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + time: 1579847342402, + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -1264,15 +1577,75 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":" new Order Completed totally","properties":{"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f","coupon":"hasbros","currency":"USD","discount":2.5,"total":23,"order_id":"50314b8e9bcf000000000000","key_1":{"child_key1":"child_value1","child_key2":{"child_key21":"child_value21","child_key22":"child_value22"}},"products":[{"category":"Games","image_url":"https:///www.example.com/product/path.jpg","name":"Monopoly: 3rd Edition","price":19,"product_id":"507f1f77bcf86cd799439011","quantity":1,"sku":"45790-32","url":"https://www.example.com/product/path"},{"category":"Games","name":"Uno Card Game","price":3,"product_id":"505bd76785ebb509fc183733","quantity":2,"sku":"46493-32"}],"shipping":3,"subtotal":22.5,"tax":2,"city":"Disney","country":"USA","email":"mickey@disney.com","firstName":"Mickey","ip":"0.0.0.0","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"aa5f5e44-8756-40ad-ad1e-b0d3b9fa710a","token":"test_api_token","distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","time":1579847342402,"$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: ' new Order Completed totally', + properties: { + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + coupon: 'hasbros', + currency: 'USD', + discount: 2.5, + total: 23, + order_id: '50314b8e9bcf000000000000', + key_1: { + child_key1: 'child_value1', + child_key2: { + child_key21: 'child_value21', + child_key22: 'child_value22', + }, + }, + products: [ + { + category: 'Games', + image_url: 'https:///www.example.com/product/path.jpg', + name: 'Monopoly: 3rd Edition', + price: 19, + product_id: '507f1f77bcf86cd799439011', + quantity: 1, + sku: '45790-32', + url: 'https://www.example.com/product/path', + }, + { + category: 'Games', + name: 'Uno Card Game', + price: 3, + product_id: '505bd76785ebb509fc183733', + quantity: 2, + sku: '46493-32', + }, + ], + shipping: 3, + subtotal: 22.5, + tax: 2, + city: 'Disney', + country: 'USA', + email: 'mickey@disney.com', + firstName: 'Mickey', + ip: '0.0.0.0', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'aa5f5e44-8756-40ad-ad1e-b0d3b9fa710a', + token: secret2, + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + time: 1579847342402, + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -1398,15 +1771,76 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":" Order Completed ","properties":{"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f","coupon":"hasbros","currency":"USD","discount":2.5,"total":23,"order_id":"50314b8e9bcf000000000000","key_1":{"child_key1":"child_value1","child_key2":{"child_key21":"child_value21","child_key22":"child_value22"}},"products":[{"category":"Games","image_url":"https:///www.example.com/product/path.jpg","name":"Monopoly: 3rd Edition","price":19,"product_id":"507f1f77bcf86cd799439011","quantity":1,"sku":"45790-32","url":"https://www.example.com/product/path"},{"category":"Games","name":"Uno Card Game","price":3,"product_id":"505bd76785ebb509fc183733","quantity":2,"sku":"46493-32"}],"shipping":3,"subtotal":22.5,"tax":2,"Billing Amount":"77","city":"Disney","country":"USA","email":"mickey@disney.com","firstName":"Mickey","ip":"0.0.0.0","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"aa5f5e44-8756-40ad-ad1e-b0d3b9fa710a","token":"test_api_token","distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","time":1579847342402,"$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: ' Order Completed ', + properties: { + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + coupon: 'hasbros', + currency: 'USD', + discount: 2.5, + total: 23, + order_id: '50314b8e9bcf000000000000', + key_1: { + child_key1: 'child_value1', + child_key2: { + child_key21: 'child_value21', + child_key22: 'child_value22', + }, + }, + products: [ + { + category: 'Games', + image_url: 'https:///www.example.com/product/path.jpg', + name: 'Monopoly: 3rd Edition', + price: 19, + product_id: '507f1f77bcf86cd799439011', + quantity: 1, + sku: '45790-32', + url: 'https://www.example.com/product/path', + }, + { + category: 'Games', + name: 'Uno Card Game', + price: 3, + product_id: '505bd76785ebb509fc183733', + quantity: 2, + sku: '46493-32', + }, + ], + shipping: 3, + subtotal: 22.5, + tax: 2, + 'Billing Amount': '77', + city: 'Disney', + country: 'USA', + email: 'mickey@disney.com', + firstName: 'Mickey', + ip: '0.0.0.0', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'aa5f5e44-8756-40ad-ad1e-b0d3b9fa710a', + token: secret2, + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + time: 1579847342402, + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -1573,8 +2007,24 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$firstName":"Mickey","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $firstName: 'Mickey', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -1660,8 +2110,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$distinct_id":"hjikl","$set":{"company":["testComp"]},"$ip":"0.0.0.0"}]', + batch: JSON.stringify([ + { + $token: secret2, + $distinct_id: 'hjikl', + $set: { company: ['testComp'] }, + $ip: '0.0.0.0', + }, + ]), }, XML: {}, FORM: {}, @@ -1682,8 +2138,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$group_key":"company","$group_id":"testComp","$set":{"company":"testComp"}}]', + batch: JSON.stringify([ + { + $token: secret2, + $group_key: 'company', + $group_id: 'testComp', + $set: { company: 'testComp' }, + }, + ]), }, XML: {}, FORM: {}, @@ -1769,8 +2231,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$distinct_id":"hjikl","$set":{"company":["testComp","testComp1"]},"$ip":"0.0.0.0"}]', + batch: JSON.stringify([ + { + $token: secret2, + $distinct_id: 'hjikl', + $set: { company: ['testComp', 'testComp1'] }, + $ip: '0.0.0.0', + }, + ]), }, XML: {}, FORM: {}, @@ -1791,8 +2259,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$group_key":"company","$group_id":"testComp","$set":{"company":["testComp","testComp1"]}}]', + batch: JSON.stringify([ + { + $token: secret2, + $group_key: 'company', + $group_id: 'testComp', + $set: { company: ['testComp', 'testComp1'] }, + }, + ]), }, XML: {}, FORM: {}, @@ -1813,8 +2287,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$group_key":"company","$group_id":"testComp1","$set":{"company":["testComp","testComp1"]}}]', + batch: JSON.stringify([ + { + $token: secret2, + $group_key: 'company', + $group_id: 'testComp1', + $set: { company: ['testComp', 'testComp1'] }, + }, + ]), }, XML: {}, FORM: {}, @@ -1901,8 +2381,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$distinct_id":"hjikl","$set":{"company":["testComp"]},"$ip":"0.0.0.0"}]', + batch: JSON.stringify([ + { + $token: secret2, + $distinct_id: 'hjikl', + $set: { company: ['testComp'] }, + $ip: '0.0.0.0', + }, + ]), }, XML: {}, FORM: {}, @@ -1923,8 +2409,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$group_key":"company","$group_id":"testComp","$set":{"company":"testComp"}}]', + batch: JSON.stringify([ + { + $token: secret2, + $group_key: 'company', + $group_id: 'testComp', + $set: { company: 'testComp' }, + }, + ]), }, XML: {}, FORM: {}, @@ -2051,8 +2543,15 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$append":{"$transactions":{"$time":"2020-01-24T06:29:02.402Z","$amount":25}},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca"}]', + batch: JSON.stringify([ + { + $append: { + $transactions: { $time: '2020-01-24T06:29:02.402Z', $amount: 25 }, + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + }, + ]), }, XML: {}, FORM: {}, @@ -2069,15 +2568,70 @@ export const data = [ method: 'POST', endpoint: 'https://api-eu.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"KM Order Completed","properties":{"affiliation":"Google Store","checkout_id":"fksdjfsdjfisjf9sdfjsd9f","coupon":"hasbros","currency":"USD","discount":2.5,"order_id":"50314b8e9bcf000000000000","products":[{"category":"Games","image_url":"https:///www.example.com/product/path.jpg","name":"Monopoly: 3rd Edition","price":19,"product_id":"507f1f77bcf86cd799439011","quantity":1,"sku":"45790-32","url":"https://www.example.com/product/path"},{"category":"Games","name":"Uno Card Game","price":3,"product_id":"505bd76785ebb509fc183733","quantity":2,"sku":"46493-32"}],"revenue":25,"shipping":3,"subtotal":22.5,"tax":2,"total":27.5,"city":"Disney","country":"USA","email":"mickey@disney.com","firstname":"Mickey","lastname":"Mouse","ip":"0.0.0.0","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"aa5f5e44-8756-40ad-ad1e-b0d3b9fa710a","token":"test_api_token","distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","time":1579847342402,"$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: 'KM Order Completed', + properties: { + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + coupon: 'hasbros', + currency: 'USD', + discount: 2.5, + order_id: '50314b8e9bcf000000000000', + products: [ + { + category: 'Games', + image_url: 'https:///www.example.com/product/path.jpg', + name: 'Monopoly: 3rd Edition', + price: 19, + product_id: '507f1f77bcf86cd799439011', + quantity: 1, + sku: '45790-32', + url: 'https://www.example.com/product/path', + }, + { + category: 'Games', + name: 'Uno Card Game', + price: 3, + product_id: '505bd76785ebb509fc183733', + quantity: 2, + sku: '46493-32', + }, + ], + revenue: 25, + shipping: 3, + subtotal: 22.5, + tax: 2, + total: 27.5, + city: 'Disney', + country: 'USA', + email: 'mickey@disney.com', + firstname: 'Mickey', + lastname: 'Mouse', + ip: '0.0.0.0', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'aa5f5e44-8756-40ad-ad1e-b0d3b9fa710a', + token: secret2, + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + time: 1579847342402, + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -2164,8 +2718,30 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$carrier":"Android","$manufacturer":"Google","$model":"Android SDK built for x86","$screen_height":1794,"$screen_width":1080,"$wifi":true,"anonymousId":"5094f5704b9cf2b3","$android_devices":["test_device_token"],"$os":"Android","$android_model":"Android SDK built for x86","$android_os_version":"8.1.0","$android_manufacturer":"Google","$android_app_version":"1.0","$android_app_version_code":"1.0","$android_brand":"Google"},"$token":"test_api_token","$distinct_id":"5094f5704b9cf2b3","$time":1584003903421}]', + batch: JSON.stringify([ + { + $set: { + $carrier: 'Android', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + $screen_height: 1794, + $screen_width: 1080, + $wifi: true, + anonymousId: '5094f5704b9cf2b3', + $android_devices: ['test_device_token'], + $os: 'Android', + $android_model: 'Android SDK built for x86', + $android_os_version: '8.1.0', + $android_manufacturer: 'Google', + $android_app_version: '1.0', + $android_app_version_code: '1.0', + $android_brand: 'Google', + }, + $token: secret2, + $distinct_id: '5094f5704b9cf2b3', + $time: 1584003903421, + }, + ]), }, XML: {}, FORM: {}, @@ -2251,8 +2827,29 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$carrier":"Android","$manufacturer":"Google","$model":"Android SDK built for x86","$screen_height":1794,"$screen_width":1080,"$wifi":true,"anonymousId":"5094f5704b9cf2b3","userId":"test_user_id","$ios_devices":["test_device_token"],"$os":"iOS","$ios_device_model":"Android SDK built for x86","$ios_version":"8.1.0","$ios_app_release":"1","$ios_app_version":"1.0"},"$token":"test_api_token","$distinct_id":"test_user_id","$time":1584003903421}]', + batch: JSON.stringify([ + { + $set: { + $carrier: 'Android', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + $screen_height: 1794, + $screen_width: 1080, + $wifi: true, + anonymousId: '5094f5704b9cf2b3', + userId: 'test_user_id', + $ios_devices: ['test_device_token'], + $os: 'iOS', + $ios_device_model: 'Android SDK built for x86', + $ios_version: '8.1.0', + $ios_app_release: '1.0', + $ios_app_version: '1', + }, + $token: secret2, + $distinct_id: 'test_user_id', + $time: 1584003903421, + }, + ]), }, XML: {}, FORM: {}, @@ -2269,15 +2866,22 @@ export const data = [ method: 'POST', endpoint: 'https://api-eu.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"$merge","properties":{"$distinct_ids":["test_user_id","5094f5704b9cf2b3"],"token":"test_api_token"}}]', + batch: JSON.stringify([ + { + event: '$merge', + properties: { + $distinct_ids: ['test_user_id', '5094f5704b9cf2b3'], + token: secret2, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -2366,15 +2970,41 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Loaded a Page","properties":{"path":"/tests/html/index2.html","referrer":"","search":"","title":"","url":"http://localhost/tests/html/index2.html","category":"communication","ip":"0.0.0.0","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"dd266c67-9199-4a52-ba32-f46ddde67312","token":"test_api_token","distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","time":1579847342402,"name":"Contact Us","$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: 'Loaded a Page', + properties: { + path: '/tests/html/index2.html', + referrer: '', + search: '', + title: '', + url: 'http://localhost/tests/html/index2.html', + category: 'communication', + ip: '0.0.0.0', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'dd266c67-9199-4a52-ba32-f46ddde67312', + token: secret2, + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + time: 1579847342402, + name: 'Contact Us', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -2464,15 +3094,23 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"$create_alias","properties":{"distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","alias":"1234abc","token":"test_api_token"}}]', + batch: JSON.stringify([ + { + event: '$create_alias', + properties: { + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + alias: '1234abc', + token: secret2, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -2564,8 +3202,28 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$carrier":"Android","$manufacturer":"Google","$model":"Android SDK built for x86","$screen_height":1794,"$screen_width":1080,"$wifi":true,"anonymousId":"5094f5704b9cf2b3","userId":"test_user_id","createdat":"2020-01-23T08:54:02.362Z","$ios_devices":["test_device_token"],"$ios_device_model":"Android SDK built for x86","$ios_app_release":"1","$ios_app_version":"1.0"},"$token":"test_api_token","$distinct_id":"test_user_id","$time":1584003903421}]', + batch: JSON.stringify([ + { + $set: { + $carrier: 'Android', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + $screen_height: 1794, + $screen_width: 1080, + $wifi: true, + anonymousId: '5094f5704b9cf2b3', + userId: 'test_user_id', + createdat: '2020-01-23T08:54:02.362Z', + $ios_devices: ['test_device_token'], + $ios_device_model: 'Android SDK built for x86', + $ios_app_release: '1.0', + $ios_app_version: '1', + }, + $token: secret2, + $distinct_id: 'test_user_id', + $time: 1584003903421, + }, + ]), }, XML: {}, FORM: {}, @@ -2582,15 +3240,22 @@ export const data = [ method: 'POST', endpoint: 'https://api-eu.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"$merge","properties":{"$distinct_ids":["test_user_id","5094f5704b9cf2b3"],"token":"test_api_token"}}]', + batch: JSON.stringify([ + { + event: '$merge', + properties: { + $distinct_ids: ['test_user_id', '5094f5704b9cf2b3'], + token: secret2, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -2682,8 +3347,26 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$firstName":"Mickey","$lastName":"Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $firstName: 'Mickey', + $lastName: 'Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -2774,8 +3457,24 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$firstName":"Mickey","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $firstName: 'Mickey', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -2867,8 +3566,27 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$name":"Mickey Mouse","$country_code":"USA","$city":"Disney","$region":"US","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$firstName":"Mickey","$lastName":"Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $name: 'Mickey Mouse', + $country_code: 'USA', + $city: 'Disney', + $region: 'US', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $firstName: 'Mickey', + $lastName: 'Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -2965,8 +3683,26 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$firstName":"Mickey","$lastName":"Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $firstName: 'Mickey', + $lastName: 'Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -3061,8 +3797,26 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$name":"Mouse","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$firstName":"Mickey","$lastName":"Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $name: 'Mouse', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $firstName: 'Mickey', + $lastName: 'Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -3156,8 +3910,26 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$first_name":"Mickey","$last_name":"Mouse","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $first_name: 'Mickey', + $last_name: 'Mouse', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -3250,8 +4022,24 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$first_name":"Mickey","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $first_name: 'Mickey', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -3345,8 +4133,27 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$first_name":"Mickey","$last_name":"Mouse","$name":"Mickey Mouse","$country_code":"USA","$city":"Disney","$region":"US","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $first_name: 'Mickey', + $last_name: 'Mouse', + $name: 'Mickey Mouse', + $country_code: 'USA', + $city: 'Disney', + $region: 'US', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -3446,8 +4253,26 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$first_name":"Mickey","$last_name":"Mouse","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $first_name: 'Mickey', + $last_name: 'Mouse', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -3550,15 +4375,57 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"FirstTrackCall12","properties":{"foo":"bar","$deviceId":"nkasdnkasd","anonymousId":"ea776ad0-3136-44fb-9216-5b1578609a2b","userId":"as09sufa09usaf09as0f9uasf","id":"as09sufa09usaf09as0f9uasf","firstName":"Bob","lastName":"Marley","name":"Bob Marley","age":43,"email":"bob@marleymail.com","phone":"+447748544123","birthday":"1987-01-01T20:08:59+0000","createdAt":"2022-01-21T14:10:12+0000","address":"51,B.L.T road, Kolkata-700060","description":"I am great","gender":"male","title":"Founder","username":"bobm","website":"https://bobm.com","randomProperty":"randomValue","$user_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$current_url":"http://127.0.0.1:7307/Testing/App_for_testingTool/","$referrer":"http://127.0.0.1:7307/Testing/","$screen_height":900,"$screen_width":1440,"$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.1.18","$insert_id":"0d5c1a4a-27e4-41da-a246-4d01f44e74bd","token":"test_api_token","distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","time":1632986123523,"$browser":"Chrome","$browser_version":"93.0.4577.82"}}]', + batch: JSON.stringify([ + { + event: 'FirstTrackCall12', + properties: { + foo: 'bar', + $deviceId: 'nkasdnkasd', + anonymousId: 'ea776ad0-3136-44fb-9216-5b1578609a2b', + userId: 'as09sufa09usaf09as0f9uasf', + id: 'as09sufa09usaf09as0f9uasf', + firstName: 'Bob', + lastName: 'Marley', + name: 'Bob Marley', + age: 43, + email: 'bob@marleymail.com', + phone: '+447748544123', + birthday: '1987-01-01T20:08:59+0000', + createdAt: '2022-01-21T14:10:12+0000', + address: '51,B.L.T road, Kolkata-700060', + description: 'I am great', + gender: 'male', + title: 'Founder', + username: 'bobm', + website: 'https://bobm.com', + randomProperty: 'randomValue', + $user_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $current_url: 'http://127.0.0.1:7307/Testing/App_for_testingTool/', + $referrer: 'http://127.0.0.1:7307/Testing/', + $screen_height: 900, + $screen_width: 1440, + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'http://127.0.0.1:7307/Testing/', + $initial_referring_domain: '127.0.0.1:7307', + $app_build_number: '1.0.0', + $app_version_string: '1.1.18', + $insert_id: '0d5c1a4a-27e4-41da-a246-4d01f44e74bd', + token: secret2, + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + time: 1632986123523, + $browser: 'Chrome', + $browser_version: '93.0.4577.82', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -3743,15 +4610,44 @@ export const data = [ method: 'POST', endpoint: 'https://api-eu.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"MainActivity","properties":{"name":"MainActivity","automatic":true,"anonymousId":"5094f5704b9cf2b3","userId":"test_user_id","$user_id":"test_user_id","$os":"iOS","$screen_height":1794,"$screen_width":1080,"$screen_dpi":420,"$carrier":"Android","$os_version":"8.1.0","$device":"generic_x86","$manufacturer":"Google","$model":"Android SDK built for x86","mp_device_model":"Android SDK built for x86","$wifi":true,"$bluetooth_enabled":false,"mp_lib":"com.rudderstack.android.sdk.core","$app_build_number":"1","$app_version_string":"1.0","$insert_id":"id2","token":"test_api_token","distinct_id":"test_user_id","time":1520845503421}}]', + batch: JSON.stringify([ + { + event: 'MainActivity', + properties: { + name: 'MainActivity', + automatic: true, + anonymousId: '5094f5704b9cf2b3', + userId: 'test_user_id', + $user_id: 'test_user_id', + $os: 'iOS', + $screen_height: 1794, + $screen_width: 1080, + $screen_dpi: 420, + $carrier: 'Android', + $os_version: '8.1.0', + $device: 'generic_x86', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + mp_device_model: 'Android SDK built for x86', + $wifi: true, + $bluetooth_enabled: false, + mp_lib: 'com.rudderstack.android.sdk.core', + $app_build_number: '1', + $app_version_string: '1.0', + $insert_id: 'id2', + token: secret2, + distinct_id: 'test_user_id', + time: 1520845503421, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -4021,8 +4917,28 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$created":"2020-01-23T08:54:02.362Z","$email":"mickey@disney.com","$first_name":"Mickey","$last_name":"Mouse","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402,"$ignore_time":true}]', + batch: JSON.stringify([ + { + $set: { + $created: '2020-01-23T08:54:02.362Z', + $email: 'mickey@disney.com', + $first_name: 'Mickey', + $last_name: 'Mouse', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + $ignore_time: true, + }, + ]), }, XML: {}, FORM: {}, @@ -4127,8 +5043,27 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$created":"2020-01-23T08:54:02.362Z","$email":"mickey@disney.com","$first_name":"Mickey","$last_name":"Mouse","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $created: '2020-01-23T08:54:02.362Z', + $email: 'mickey@disney.com', + $first_name: 'Mickey', + $last_name: 'Mouse', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -4332,8 +5267,27 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$created":"2020-01-23T08:54:02.362Z","$email":"mickey@disney.com","$first_name":"Mickey","$last_name":"Mouse","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"user1234","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $created: '2020-01-23T08:54:02.362Z', + $email: 'mickey@disney.com', + $first_name: 'Mickey', + $last_name: 'Mouse', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'user1234', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -4351,14 +5305,21 @@ export const data = [ endpoint: 'https://api.mixpanel.com/import/', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"$merge","properties":{"$distinct_ids":["user1234","e6ab2c5e-2cda-44a9-a962-e2f67df78bca"],"token":"test_api_token"}}]', + batch: JSON.stringify([ + { + event: '$merge', + properties: { + $distinct_ids: ['user1234', 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca'], + token: secret2, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -4423,7 +5384,7 @@ export const data = [ originalTimestamp: '2022-09-05T07:46:20.290Z', }, destination: overrideDestination(sampleDestination, { - apiSecret: 'dummyApiKey', + apiSecret: secret3, useNewMapping: true, }), }, @@ -4443,15 +5404,43 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Application Installed","properties":{"build":4,"version":"1.0","anonymousId":"39da706ec83d0e90","$os":"Android","$screen_height":2984,"$screen_width":1440,"$screen_dpi":560,"$carrier":"T-Mobile","$os_version":"12","$device":"emu64a","$manufacturer":"Google","$model":"sdk_gphone64_arm64","mp_device_model":"sdk_gphone64_arm64","$wifi":true,"$bluetooth_enabled":true,"mp_lib":"com.rudderstack.android.sdk.core","$app_build_number":"4","$app_version_string":"1.0","$insert_id":"168cf720-6227-4b56-a98e-c49bdc7279e9","$session_id":"1662363980","token":"test_api_token","distinct_id":"39da706ec83d0e90","time":1662363980290}}]', + batch: JSON.stringify([ + { + event: 'Application Installed', + properties: { + build: 4, + version: '1.0', + anonymousId: '39da706ec83d0e90', + $os: 'Android', + $screen_height: 2984, + $screen_width: 1440, + $screen_dpi: 560, + $carrier: 'T-Mobile', + $os_version: '12', + $device: 'emu64a', + $manufacturer: 'Google', + $model: 'sdk_gphone64_arm64', + mp_device_model: 'sdk_gphone64_arm64', + $wifi: true, + $bluetooth_enabled: true, + mp_lib: 'com.rudderstack.android.sdk.core', + $app_build_number: '4', + $app_version_string: '1.0', + $insert_id: '168cf720-6227-4b56-a98e-c49bdc7279e9', + $session_id: '1662363980', + token: secret2, + distinct_id: '39da706ec83d0e90', + time: 1662363980290, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -4513,7 +5502,7 @@ export const data = [ originalTimestamp: '2022-09-05T07:46:20.290Z', }, destination: overrideDestination(sampleDestination, { - apiSecret: 'dummyApiKey', + apiSecret: secret3, useNewMapping: true, }), }, @@ -4533,15 +5522,43 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Application Opened","properties":{"build":4,"version":"1.0","anonymousId":"39da706ec83d0e90","$os":"Android","$screen_height":2984,"$screen_width":1440,"$screen_dpi":560,"$carrier":"T-Mobile","$os_version":"12","$device":"emu64a","$manufacturer":"Google","$model":"sdk_gphone64_arm64","mp_device_model":"sdk_gphone64_arm64","$wifi":true,"$bluetooth_enabled":true,"mp_lib":"com.rudderstack.android.sdk.core","$app_build_number":"4","$app_version_string":"1.0","$insert_id":"168cf720-6227-4b56-a98e-c49bdc7279e9","$session_id":"1662363980","token":"test_api_token","distinct_id":"39da706ec83d0e90","time":1662363980290}}]', + batch: JSON.stringify([ + { + event: 'Application Opened', + properties: { + build: 4, + version: '1.0', + anonymousId: '39da706ec83d0e90', + $os: 'Android', + $screen_height: 2984, + $screen_width: 1440, + $screen_dpi: 560, + $carrier: 'T-Mobile', + $os_version: '12', + $device: 'emu64a', + $manufacturer: 'Google', + $model: 'sdk_gphone64_arm64', + mp_device_model: 'sdk_gphone64_arm64', + $wifi: true, + $bluetooth_enabled: true, + mp_lib: 'com.rudderstack.android.sdk.core', + $app_build_number: '4', + $app_version_string: '1.0', + $insert_id: '168cf720-6227-4b56-a98e-c49bdc7279e9', + $session_id: '1662363980', + token: secret2, + distinct_id: '39da706ec83d0e90', + time: 1662363980290, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -4628,8 +5645,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$distinct_id":"hjikl","$set":{"groupId":["testGroupId"]},"$ip":"0.0.0.0"}]', + batch: JSON.stringify([ + { + $token: secret2, + $distinct_id: 'hjikl', + $set: { groupId: ['testGroupId'] }, + $ip: '0.0.0.0', + }, + ]), }, XML: {}, FORM: {}, @@ -4650,8 +5673,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$group_key":"groupId","$group_id":"testGroupId","$set":{"company":"testComp","groupId":"groupIdInTraits"}}]', + batch: JSON.stringify([ + { + $token: secret2, + $group_key: 'groupId', + $group_id: 'testGroupId', + $set: { company: 'testComp', groupId: 'groupIdInTraits' }, + }, + ]), }, XML: {}, FORM: {}, @@ -4678,7 +5707,7 @@ export const data = [ description: 'Track: set device id and user id when simplified id merge api is selected', destination: overrideDestination(sampleDestination, { - token: 'test_api_token', + token: secret2, identityMergeApi: 'simplified', }), message: { @@ -4736,15 +5765,42 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Product Viewed","properties":{"name":"T-Shirt","$user_id":"userId01","$os":"iOS","$screen_height":1794,"$screen_width":1080,"$screen_dpi":420,"$carrier":"Android","$os_version":"8.1.0","$device":"generic_x86","$manufacturer":"Google","$model":"Android SDK built for x86","mp_device_model":"Android SDK built for x86","$wifi":true,"$bluetooth_enabled":false,"mp_lib":"com.rudderstack.android.sdk.core","$app_build_number":"1","$app_version_string":"1.0","$insert_id":"id2","token":"test_api_token","distinct_id":"userId01","time":1579847342402,"$device_id":"anonId01"}}]', + batch: JSON.stringify([ + { + event: 'Product Viewed', + properties: { + name: 'T-Shirt', + $user_id: 'userId01', + $os: 'iOS', + $screen_height: 1794, + $screen_width: 1080, + $screen_dpi: 420, + $carrier: 'Android', + $os_version: '8.1.0', + $device: 'generic_x86', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + mp_device_model: 'Android SDK built for x86', + $wifi: true, + $bluetooth_enabled: false, + mp_lib: 'com.rudderstack.android.sdk.core', + $app_build_number: '1', + $app_version_string: '1.0', + $insert_id: 'id2', + token: secret2, + distinct_id: 'userId01', + time: 1579847342402, + $device_id: 'anonId01', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -4773,7 +5829,7 @@ export const data = [ { description: 'Identify: skip merge event when simplified id merge api is selected', destination: overrideDestination(sampleDestination, { - token: 'test_api_token', + token: secret2, identityMergeApi: 'simplified', }), message: { @@ -4853,8 +5909,27 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$created":"2020-01-23T08:54:02.362Z","$email":"mickey@disney.com","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$firstName":"Mickey","$lastName":"Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"userId01","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $created: '2020-01-23T08:54:02.362Z', + $email: 'mickey@disney.com', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $firstName: 'Mickey', + $lastName: 'Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'userId01', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -4882,7 +5957,7 @@ export const data = [ 'Identify: append $device: to deviceId while creating the user when simplified id merge api is selected', destination: overrideDestination(sampleDestination, { apiKey: 'apiKey123', - token: 'test_api_token', + token: secret2, identityMergeApi: 'simplified', }), message: { @@ -4961,8 +6036,27 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$created":"2020-01-23T08:54:02.362Z","$email":"mickey@disney.com","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$firstName":"Mickey","$lastName":"Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"$device:anonId01","$ip":"0.0.0.0","$time":1579847342402}]', + batch: JSON.stringify([ + { + $set: { + $created: '2020-01-23T08:54:02.362Z', + $email: 'mickey@disney.com', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $firstName: 'Mickey', + $lastName: 'Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: '$device:anonId01', + $ip: '0.0.0.0', + $time: 1579847342402, + }, + ]), }, XML: {}, FORM: {}, @@ -4989,7 +6083,7 @@ export const data = [ description: 'Unsupported alias call when simplified id merge api is selected', destination: overrideDestination(sampleDestination, { apiKey: 'apiKey123', - token: 'test_api_token', + token: secret2, identityMergeApi: 'simplified', }), message: { @@ -5078,7 +6172,7 @@ export const data = [ 'Track revenue event: set device id and user id when simplified id merge api is selected', destination: overrideDestination(sampleDestination, { apiKey: 'apiKey123', - token: 'test_api_token', + token: secret2, identityMergeApi: 'simplified', }), message: { @@ -5148,8 +6242,15 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$append":{"$transactions":{"$time":"2020-01-24T06:29:02.403Z","$amount":18.9}},"$token":"test_api_token","$distinct_id":"userId01"}]', + batch: JSON.stringify([ + { + $append: { + $transactions: { $time: '2020-01-24T06:29:02.403Z', $amount: 18.9 }, + }, + $token: secret2, + $distinct_id: 'userId01', + }, + ]), }, XML: {}, FORM: {}, @@ -5166,15 +6267,42 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"test revenue MIXPANEL","properties":{"currency":"USD","revenue":18.9,"city":"Disney","country":"USA","email":"mickey@disney.com","firstName":"Mickey","ip":"0.0.0.0","$user_id":"userId01","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"a6a0ad5a-bd26-4f19-8f75-38484e580fc7","token":"test_api_token","distinct_id":"userId01","time":1579847342403,"$device_id":"anonId01","$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: 'test revenue MIXPANEL', + properties: { + currency: 'USD', + revenue: 18.9, + city: 'Disney', + country: 'USA', + email: 'mickey@disney.com', + firstName: 'Mickey', + ip: '0.0.0.0', + $user_id: 'userId01', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'a6a0ad5a-bd26-4f19-8f75-38484e580fc7', + token: secret2, + distinct_id: 'userId01', + time: 1579847342403, + $device_id: 'anonId01', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -5204,7 +6332,7 @@ export const data = [ description: 'Page with anonymous user when simplified api is selected', destination: overrideDestination(sampleDestination, { apiKey: 'apiKey123', - token: 'test_api_token', + token: secret2, identityMergeApi: 'simplified', }), message: { @@ -5273,15 +6401,36 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Loaded a Page","properties":{"ip":"0.0.0.0","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"dd266c67-9199-4a52-ba32-f46ddde67312","token":"test_api_token","distinct_id":"$device:anonId01","time":1579847342402,"$device_id":"anonId01","name":"Contact Us","$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: 'Loaded a Page', + properties: { + ip: '0.0.0.0', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'dd266c67-9199-4a52-ba32-f46ddde67312', + token: secret2, + distinct_id: '$device:anonId01', + time: 1579847342402, + $device_id: 'anonId01', + name: 'Contact Us', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -5311,7 +6460,7 @@ export const data = [ description: 'Group call with anonymous user when simplified api is selected', destination: overrideDestination(sampleDestination, { apiKey: 'apiKey123', - token: 'test_api_token', + token: secret2, identityMergeApi: 'simplified', groupKeySettings: [{ groupKey: 'company' }], }), @@ -5373,8 +6522,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$distinct_id":"$device:anonId01","$set":{"company":["testComp"]},"$ip":"0.0.0.0"}]', + batch: JSON.stringify([ + { + $token: secret2, + $distinct_id: '$device:anonId01', + $set: { company: ['testComp'] }, + $ip: '0.0.0.0', + }, + ]), }, XML: {}, FORM: {}, @@ -5395,8 +6550,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$group_key":"company","$group_id":"testComp","$set":{"company":"testComp"}}]', + batch: JSON.stringify([ + { + $token: secret2, + $group_key: 'company', + $group_id: 'testComp', + $set: { company: 'testComp' }, + }, + ]), }, XML: {}, FORM: {}, @@ -5422,7 +6583,7 @@ export const data = [ { destination: overrideDestination(sampleDestination, { apiKey: 'apiKey123', - token: 'test_api_token', + token: secret2, identityMergeApi: 'simplified', groupKeySettings: [{ groupKey: 'company' }], }), @@ -5540,9 +6701,9 @@ export const data = [ originalTimestamp: '2022-09-05T07:46:20.290Z', }, destination: overrideDestination(sampleDestination, { - apiKey: 'dummyApiKey', - token: 'test_api_token', - apiSecret: 'dummyApiKey', + apiKey: secret3, + token: secret2, + apiSecret: secret3, useNewMapping: true, }), }, @@ -5566,8 +6727,15 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$append":{"$transactions":{"$time":"2022-09-05T07:46:20.290Z","$amount":12.13}},"$token":"test_api_token","$distinct_id":"39da706ec83d0e90"}]', + batch: JSON.stringify([ + { + $append: { + $transactions: { $time: '2022-09-05T07:46:20.290Z', $amount: 12.13 }, + }, + $token: secret2, + $distinct_id: '39da706ec83d0e90', + }, + ]), }, XML: {}, FORM: {}, @@ -5584,15 +6752,44 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Application Installed","properties":{"build":4,"version":"1.0","revenue":12.13,"anonymousId":"39da706ec83d0e90","$os":"Android","$screen_height":2984,"$screen_width":1440,"$screen_dpi":560,"$carrier":"T-Mobile","$os_version":"12","$device":"emu64a","$manufacturer":"Google","$model":"sdk_gphone64_arm64","mp_device_model":"sdk_gphone64_arm64","$wifi":true,"$bluetooth_enabled":true,"mp_lib":"com.rudderstack.android.sdk.core","$app_build_number":"4","$app_version_string":"1.0","$insert_id":"168cf720-6227-4b56-a98e-c49bdc7279e9","$session_id":"1662363980","token":"test_api_token","distinct_id":"39da706ec83d0e90","time":1662363980290}}]', + batch: JSON.stringify([ + { + event: 'Application Installed', + properties: { + build: 4, + version: '1.0', + revenue: 12.13, + anonymousId: '39da706ec83d0e90', + $os: 'Android', + $screen_height: 2984, + $screen_width: 1440, + $screen_dpi: 560, + $carrier: 'T-Mobile', + $os_version: '12', + $device: 'emu64a', + $manufacturer: 'Google', + $model: 'sdk_gphone64_arm64', + mp_device_model: 'sdk_gphone64_arm64', + $wifi: true, + $bluetooth_enabled: true, + mp_lib: 'com.rudderstack.android.sdk.core', + $app_build_number: '4', + $app_version_string: '1.0', + $insert_id: '168cf720-6227-4b56-a98e-c49bdc7279e9', + $session_id: '1662363980', + token: secret2, + distinct_id: '39da706ec83d0e90', + time: 1662363980290, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -5655,9 +6852,9 @@ export const data = [ originalTimestamp: '2022-09-05T07:46:20.290Z', }, destination: overrideDestination(sampleDestination, { - apiKey: 'dummyApiKey', - token: 'test_api_token', - apiSecret: 'dummyApiKey', + apiKey: secret3, + token: secret2, + apiSecret: secret3, useNewMapping: true, }), }, @@ -5681,8 +6878,15 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$append":{"$transactions":{"$time":"2022-09-05T07:46:20.290Z","$amount":23.45}},"$token":"test_api_token","$distinct_id":"39da706ec83d0e90"}]', + batch: JSON.stringify([ + { + $append: { + $transactions: { $time: '2022-09-05T07:46:20.290Z', $amount: 23.45 }, + }, + $token: secret2, + $distinct_id: '39da706ec83d0e90', + }, + ]), }, XML: {}, FORM: {}, @@ -5699,15 +6903,44 @@ export const data = [ method: 'POST', endpoint: 'https://api.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 0 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Application Installed","properties":{"build":4,"version":"1.0","revenue":23.45,"anonymousId":"39da706ec83d0e90","$os":"Android","$screen_height":2984,"$screen_width":1440,"$screen_dpi":560,"$carrier":"T-Mobile","$os_version":"12","$device":"emu64a","$manufacturer":"Google","$model":"sdk_gphone64_arm64","mp_device_model":"sdk_gphone64_arm64","$wifi":true,"$bluetooth_enabled":true,"mp_lib":"com.rudderstack.android.sdk.core","$app_build_number":"4","$app_version_string":"1.0","$insert_id":"168cf720-6227-4b56-a98e-c49bdc7279e9","$session_id":"1662363980","token":"test_api_token","distinct_id":"39da706ec83d0e90","time":null}}]', + batch: JSON.stringify([ + { + event: 'Application Installed', + properties: { + build: 4, + version: '1.0', + revenue: 23.45, + anonymousId: '39da706ec83d0e90', + $os: 'Android', + $screen_height: 2984, + $screen_width: 1440, + $screen_dpi: 560, + $carrier: 'T-Mobile', + $os_version: '12', + $device: 'emu64a', + $manufacturer: 'Google', + $model: 'sdk_gphone64_arm64', + mp_device_model: 'sdk_gphone64_arm64', + $wifi: true, + $bluetooth_enabled: true, + mp_lib: 'com.rudderstack.android.sdk.core', + $app_build_number: '4', + $app_version_string: '1.0', + $insert_id: '168cf720-6227-4b56-a98e-c49bdc7279e9', + $session_id: '1662363980', + token: secret2, + distinct_id: '39da706ec83d0e90', + time: null, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -5733,8 +6966,8 @@ export const data = [ { description: 'Track: with strict mode enabled', destination: overrideDestination(sampleDestination, { - apiKey: 'dummyApiKey', - token: 'test_api_token', + apiKey: secret3, + token: secret2, apiSecret: 'some_api_secret', dataResidency: 'eu', strictMode: true, @@ -5797,8 +7030,29 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$carrier":"Android","$manufacturer":"Google","$model":"Android SDK built for x86","$screen_height":1794,"$screen_width":1080,"$wifi":true,"anonymousId":"5094f5704b9cf2b3","userId":"test_user_id","$ios_devices":["test_device_token"],"$os":"iOS","$ios_device_model":"Android SDK built for x86","$ios_version":"8.1.0","$ios_app_release":"1","$ios_app_version":"1.0"},"$token":"test_api_token","$distinct_id":"test_user_id","$time":1584003903421}]', + batch: JSON.stringify([ + { + $set: { + $carrier: 'Android', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + $screen_height: 1794, + $screen_width: 1080, + $wifi: true, + anonymousId: '5094f5704b9cf2b3', + userId: 'test_user_id', + $ios_devices: ['test_device_token'], + $os: 'iOS', + $ios_device_model: 'Android SDK built for x86', + $ios_version: '8.1.0', + $ios_app_release: '1.0', + $ios_app_version: '1', + }, + $token: secret2, + $distinct_id: 'test_user_id', + $time: 1584003903421, + }, + ]), }, XML: {}, FORM: {}, @@ -5815,15 +7069,22 @@ export const data = [ method: 'POST', endpoint: 'https://api-eu.mixpanel.com/import/', headers: { - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: { strict: 1 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"$merge","properties":{"$distinct_ids":["test_user_id","5094f5704b9cf2b3"],"token":"test_api_token"}}]', + batch: JSON.stringify([ + { + event: '$merge', + properties: { + $distinct_ids: ['test_user_id', '5094f5704b9cf2b3'], + token: secret2, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -6019,8 +7280,17 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set_once":{"$first_name":"Mickey test","$city":"Disney","nationality":"USA"},"$token":"dummyToken","$distinct_id":"Santiy"}]', + batch: JSON.stringify([ + { + $set_once: { + $first_name: 'Mickey test', + $city: 'Disney', + nationality: 'USA', + }, + $token: secret2, + $distinct_id: 'Santiy', + }, + ]), }, XML: {}, FORM: {}, @@ -6041,8 +7311,25 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$created":"2020-01-23T08:54:02.362Z","$email":"TestSanity@disney.com","$country_code":"USA","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","random":"superProp","$lastName":"VarChange","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"dummyToken","$distinct_id":"Santiy","$ip":"0.0.0.0","$time":null}]', + batch: JSON.stringify([ + { + $set: { + $created: '2020-01-23T08:54:02.362Z', + $email: 'TestSanity@disney.com', + $country_code: 'USA', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + random: 'superProp', + $lastName: 'VarChange', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'Santiy', + $ip: '0.0.0.0', + $time: null, + }, + ]), }, XML: {}, FORM: {}, @@ -6153,8 +7440,17 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set_once":{"$first_name":"Mickey test","$city":"Disney","nationality":"USA"},"$token":"dummyToken","$distinct_id":"$device:dummyAnnonymousId"}]', + batch: JSON.stringify([ + { + $set_once: { + $first_name: 'Mickey test', + $city: 'Disney', + nationality: 'USA', + }, + $token: secret2, + $distinct_id: '$device:dummyAnnonymousId', + }, + ]), }, XML: {}, FORM: {}, @@ -6175,8 +7471,25 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$created":"2020-01-23T08:54:02.362Z","$email":"TestSanity@disney.com","$country_code":"USA","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","random":"superProp","$lastName":"VarChange","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"dummyToken","$distinct_id":"$device:dummyAnnonymousId","$ip":"0.0.0.0","$time":null}]', + batch: JSON.stringify([ + { + $set: { + $created: '2020-01-23T08:54:02.362Z', + $email: 'TestSanity@disney.com', + $country_code: 'USA', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + random: 'superProp', + $lastName: 'VarChange', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: '$device:dummyAnnonymousId', + $ip: '0.0.0.0', + $time: null, + }, + ]), }, XML: {}, FORM: {}, @@ -6190,4 +7503,215 @@ export const data = [ }, }, }, + { + name: 'mp', + description: 'Track event test when dropTraitsInTrackEvent is true', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: overrideDestination(sampleDestination, { + dropTraitsInTrackEvent: true, + }), + message: { + type: 'track', + event: 'FirstTrackCall12', + sentAt: '2021-09-30T07:15:23.523Z', + channel: 'web', + context: { + os: { name: '', version: '' }, + app: { + name: 'RudderLabs JavaScript SDK', + build: '1.0.0', + version: '1.1.18', + namespace: 'com.rudderlabs.javascript', + }, + page: { + url: 'http://127.0.0.1:7307/Testing/App_for_testingTool/', + path: '/Testing/App_for_testingTool/', + title: 'Document', + search: '', + tab_url: 'http://127.0.0.1:7307/Testing/App_for_testingTool/', + referrer: 'http://127.0.0.1:7307/Testing/', + initial_referrer: 'http://127.0.0.1:7307/Testing/', + referring_domain: '127.0.0.1:7307', + initial_referring_domain: '127.0.0.1:7307', + }, + locale: 'en-US', + screen: { width: 1440, height: 900, density: 2, innerWidth: 590, innerHeight: 665 }, + traits: { + anonymousId: 'ea776ad0-3136-44fb-9216-5b1578609a2b', + userId: 'as09sufa09usaf09as0f9uasf', + id: 'as09sufa09usaf09as0f9uasf', + firstName: 'Bob', + lastName: 'Marley', + name: 'Bob Marley', + age: 43, + email: 'bob@marleymail.com', + phone: '+447748544123', + birthday: '1987-01-01T20:08:59+0000', + createdAt: '2022-01-21T14:10:12+0000', + address: '51,B.L.T road, Kolkata-700060', + description: 'I am great', + gender: 'male', + title: 'Founder', + username: 'bobm', + website: 'https://bobm.com', + randomProperty: 'randomValue', + }, + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.18' }, + campaign: {}, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36', + }, + rudderId: '294702c7-8732-4fb3-b39f-f3bdffe1aa88', + messageId: '0d5c1a4a-27e4-41da-a246-4d01f44e74bd', + userId: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + properties: { foo: 'bar', $deviceId: 'nkasdnkasd' }, + anonymousId: '1dbb5784-b8e2-4074-8644-9920145b7ae5', + integrations: { All: true }, + originalTimestamp: '2021-09-30T07:15:23.523Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.mixpanel.com/import/', + headers: { + Authorization: authHeader2, + 'Content-Type': 'application/json', + }, + params: { strict: 0 }, + body: { + JSON: {}, + JSON_ARRAY: { + batch: JSON.stringify([ + { + event: 'FirstTrackCall12', + properties: { + foo: 'bar', + $deviceId: 'nkasdnkasd', + $user_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $current_url: 'http://127.0.0.1:7307/Testing/App_for_testingTool/', + $referrer: 'http://127.0.0.1:7307/Testing/', + $screen_height: 900, + $screen_width: 1440, + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'http://127.0.0.1:7307/Testing/', + $initial_referring_domain: '127.0.0.1:7307', + $app_build_number: '1.0.0', + $app_version_string: '1.1.18', + $insert_id: '0d5c1a4a-27e4-41da-a246-4d01f44e74bd', + token: secret2, + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + time: 1632986123523, + $browser: 'Chrome', + $browser_version: '93.0.4577.82', + }, + }, + ]), + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'mp', + description: + 'Track event test when dropTraitsInTrackEvent is false/undefined and context.traits is undefined', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: overrideDestination(sampleDestination, {}), + message: { + type: 'track', + event: 'FirstTrackCall12', + sentAt: '2021-09-30T07:15:23.523Z', + channel: 'web', + rudderId: '294702c7-8732-4fb3-b39f-f3bdffe1aa88', + messageId: '0d5c1a4a-27e4-41da-a246-4d01f44e74bd', + userId: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + properties: { foo: 'bar', $deviceId: 'nkasdnkasd' }, + anonymousId: '1dbb5784-b8e2-4074-8644-9920145b7ae5', + integrations: { All: true }, + originalTimestamp: '2021-09-30T07:15:23.523Z', + }, + }, + ], + method: 'POST', + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://api.mixpanel.com/import/', + headers: { + Authorization: authHeader2, + 'Content-Type': 'application/json', + }, + params: { strict: 0 }, + body: { + JSON: {}, + JSON_ARRAY: { + batch: JSON.stringify([ + { + event: 'FirstTrackCall12', + properties: { + foo: 'bar', + $deviceId: 'nkasdnkasd', + $user_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $insert_id: '0d5c1a4a-27e4-41da-a246-4d01f44e74bd', + token: secret2, + distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + time: 1632986123523, + }, + }, + ]), + }, + XML: {}, + FORM: {}, + }, + files: {}, + userId: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + }, + statusCode: 200, + }, + ], + }, + }, + }, ]; diff --git a/test/integrations/destinations/mp/router/data.ts b/test/integrations/destinations/mp/router/data.ts index 8716c9daa09..e6fa145eab5 100644 --- a/test/integrations/destinations/mp/router/data.ts +++ b/test/integrations/destinations/mp/router/data.ts @@ -1,5 +1,6 @@ import { overrideDestination } from '../../../testUtils'; import { sampleDestination } from '../common'; +import { authHeader2, secret1, secret2, secret3 } from '../maskedSecrets'; export const data = [ { @@ -15,8 +16,8 @@ export const data = [ { description: 'Page call', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, useOldMapping: true, strictMode: true, }), @@ -76,8 +77,8 @@ export const data = [ description: 'Track: set device id and user id when simplified id merge api is selected', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, identityMergeApi: 'simplified', strictMode: true, }), @@ -124,8 +125,8 @@ export const data = [ { description: 'Identify call to create anonymous user profile', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, useOldMapping: true, strictMode: true, }), @@ -189,8 +190,8 @@ export const data = [ description: 'Identify: append $device: to deviceId while creating the user when simplified id merge api is selected', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, identityMergeApi: 'simplified', strictMode: true, }), @@ -254,8 +255,8 @@ export const data = [ { description: 'Merge call with strict mode enabled', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, strictMode: true, }), metadata: { jobId: 5, additionalProp: 5, userId: 'u1' }, @@ -300,8 +301,8 @@ export const data = [ { description: 'Group call', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, groupKeySettings: [ { groupKey: 'company', @@ -363,8 +364,8 @@ export const data = [ { description: 'Group key not present in traits', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, groupKeySettings: [ { groupKey: 'company', @@ -442,15 +443,36 @@ export const data = [ endpoint: 'https://api.mixpanel.com/import/', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, }, params: { strict: 1 }, body: { JSON: {}, JSON_ARRAY: {}, GZIP: { - payload: - '[{"event":"Loaded a Page","properties":{"ip":"0.0.0.0","$user_id":"hjikl","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"dd266c67-9199-4a52-ba32-f46ddde67312","token":"test_api_token","distinct_id":"hjikl","time":1688624942402,"name":"Contact Us","$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + payload: JSON.stringify([ + { + event: 'Loaded a Page', + properties: { + ip: '0.0.0.0', + $user_id: 'hjikl', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'dd266c67-9199-4a52-ba32-f46ddde67312', + token: secret2, + distinct_id: 'hjikl', + time: 1688624942402, + name: 'Contact Us', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -462,9 +484,9 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiKey: secret1, + apiSecret: secret3, + token: secret2, prefixProperties: true, useNativeSDK: false, useOldMapping: true, @@ -474,6 +496,7 @@ export const data = [ DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', @@ -494,8 +517,15 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$append":{"$transactions":{"$time":"2023-07-06T06:29:02.402Z","$amount":18.9}},"$token":"test_api_token","$distinct_id":"userId01"}]', + batch: JSON.stringify([ + { + $append: { + $transactions: { $time: '2023-07-06T06:29:02.402Z', $amount: 18.9 }, + }, + $token: secret2, + $distinct_id: 'userId01', + }, + ]), }, XML: {}, FORM: {}, @@ -509,15 +539,43 @@ export const data = [ endpoint: 'https://api.mixpanel.com/import/', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, }, params: { strict: 1 }, body: { JSON: {}, JSON_ARRAY: {}, GZIP: { - payload: - '[{"event":"Product Viewed","properties":{"name":"T-Shirt","revenue":18.9,"$user_id":"userId01","$os":"iOS","$screen_height":1794,"$screen_width":1080,"$screen_dpi":420,"$carrier":"Android","$os_version":"8.1.0","$device":"generic_x86","$manufacturer":"Google","$model":"Android SDK built for x86","mp_device_model":"Android SDK built for x86","$wifi":true,"$bluetooth_enabled":false,"mp_lib":"com.rudderstack.android.sdk.core","$app_build_number":"1","$app_version_string":"1.0","$insert_id":"id2","token":"test_api_token","distinct_id":"userId01","time":1688624942402,"$device_id":"anonId01"}}]', + payload: JSON.stringify([ + { + event: 'Product Viewed', + properties: { + name: 'T-Shirt', + revenue: 18.9, + $user_id: 'userId01', + $os: 'iOS', + $screen_height: 1794, + $screen_width: 1080, + $screen_dpi: 420, + $carrier: 'Android', + $os_version: '8.1.0', + $device: 'generic_x86', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + mp_device_model: 'Android SDK built for x86', + $wifi: true, + $bluetooth_enabled: false, + mp_lib: 'com.rudderstack.android.sdk.core', + $app_build_number: '1', + $app_version_string: '1.0', + $insert_id: 'id2', + token: secret2, + distinct_id: 'userId01', + time: 1688624942402, + $device_id: 'anonId01', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -530,9 +588,9 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiKey: secret1, + apiSecret: secret3, + token: secret2, prefixProperties: true, identityMergeApi: 'simplified', strictMode: true, @@ -542,6 +600,7 @@ export const data = [ DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', @@ -562,8 +621,64 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$firstName":"Mickey","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1688624942402},{"$set":{"$created":"2020-01-23T08:54:02.362Z","$email":"mickey@disney.com","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$firstName":"Mickey","$lastName":"Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"$device:anonId01","$ip":"0.0.0.0","$time":1688624942402},{"$set":{"$carrier":"Android","$manufacturer":"Google","$model":"Android SDK built for x86","$screen_height":1794,"$screen_width":1080,"$wifi":true,"anonymousId":"5094f5704b9cf2b3","userId":"test_user_id","$ios_devices":["test_device_token"],"$os":"iOS","$ios_device_model":"Android SDK built for x86","$ios_version":"8.1.0","$ios_app_release":"1","$ios_app_version":"1.0"},"$token":"test_api_token","$distinct_id":"test_user_id","$time":1584003903421}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $firstName: 'Mickey', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1688624942402, + }, + { + $set: { + $created: '2020-01-23T08:54:02.362Z', + $email: 'mickey@disney.com', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $firstName: 'Mickey', + $lastName: 'Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: '$device:anonId01', + $ip: '0.0.0.0', + $time: 1688624942402, + }, + { + $set: { + $carrier: 'Android', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + $screen_height: 1794, + $screen_width: 1080, + $wifi: true, + anonymousId: '5094f5704b9cf2b3', + userId: 'test_user_id', + $ios_devices: ['test_device_token'], + $os: 'iOS', + $ios_device_model: 'Android SDK built for x86', + $ios_version: '8.1.0', + $ios_app_release: '1.0', + $ios_app_version: '1', + }, + $token: secret2, + $distinct_id: 'test_user_id', + $time: 1584003903421, + }, + ]), }, XML: {}, FORM: {}, @@ -577,15 +692,22 @@ export const data = [ endpoint: 'https://api.mixpanel.com/import/', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, }, params: { strict: 1 }, body: { JSON: {}, JSON_ARRAY: {}, GZIP: { - payload: - '[{"event":"$merge","properties":{"$distinct_ids":["test_user_id","5094f5704b9cf2b3"],"token":"test_api_token"}}]', + payload: JSON.stringify([ + { + event: '$merge', + properties: { + $distinct_ids: ['test_user_id', '5094f5704b9cf2b3'], + token: secret2, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -602,9 +724,9 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiKey: secret1, + apiSecret: secret3, + token: secret2, prefixProperties: true, useNativeSDK: false, useOldMapping: true, @@ -614,6 +736,7 @@ export const data = [ DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', @@ -634,8 +757,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$distinct_id":"userId06","$set":{"company":["testComp"]},"$ip":"0.0.0.0"}]', + batch: JSON.stringify([ + { + $token: secret2, + $distinct_id: 'userId06', + $set: { company: ['testComp'] }, + $ip: '0.0.0.0', + }, + ]), }, XML: {}, FORM: {}, @@ -652,8 +781,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$group_key":"company","$group_id":"testComp","$set":{"company":"testComp"}}]', + batch: JSON.stringify([ + { + $token: secret2, + $group_key: 'company', + $group_id: 'testComp', + $set: { company: 'testComp' }, + }, + ]), }, XML: {}, FORM: {}, @@ -666,9 +801,9 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiKey: secret1, + apiSecret: secret3, + token: secret2, prefixProperties: true, groupKeySettings: [{ groupKey: 'company' }], strictMode: true, @@ -678,6 +813,7 @@ export const data = [ DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', @@ -702,9 +838,9 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiKey: secret1, + apiSecret: secret3, + token: secret2, prefixProperties: true, useNativeSDK: false, groupKeySettings: [{ groupKey: 'company' }], @@ -714,6 +850,7 @@ export const data = [ DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', @@ -740,8 +877,7 @@ export const data = [ { description: 'Page call', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, useOldMapping: true, strictMode: true, }), @@ -801,8 +937,8 @@ export const data = [ description: 'Track: set device id and user id when simplified id merge api is selected', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, identityMergeApi: 'simplified', strictMode: true, }), @@ -849,8 +985,8 @@ export const data = [ { description: 'Identify call to create anonymous user profile', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, useOldMapping: true, strictMode: true, }), @@ -914,8 +1050,8 @@ export const data = [ description: 'Identify: append $device: to deviceId while creating the user when simplified id merge api is selected', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, identityMergeApi: 'simplified', strictMode: true, }), @@ -979,8 +1115,8 @@ export const data = [ { description: 'Merge call with strict mode enabled', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, strictMode: true, }), metadata: { jobId: 5, additionalProp: 5, userId: 'u1' }, @@ -1025,8 +1161,8 @@ export const data = [ { description: 'Group call', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, groupKeySettings: [ { groupKey: 'company', @@ -1088,8 +1224,8 @@ export const data = [ { description: 'Group key not present in traits', destination: overrideDestination(sampleDestination, { - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiSecret: secret3, + token: secret2, groupKeySettings: [ { groupKey: 'company', @@ -1166,14 +1302,35 @@ export const data = [ endpoint: 'https://api.mixpanel.com/import/', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, }, params: { strict: 1 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Loaded a Page","properties":{"ip":"0.0.0.0","$user_id":"hjikl","$current_url":"https://docs.rudderstack.com/destinations/mixpanel","$screen_dpi":2,"mp_lib":"RudderLabs JavaScript SDK","$app_build_number":"1.0.0","$app_version_string":"1.0.5","$insert_id":"dd266c67-9199-4a52-ba32-f46ddde67312","token":"test_api_token","distinct_id":"hjikl","time":1688624942402,"name":"Contact Us","$browser":"Chrome","$browser_version":"79.0.3945.117"}}]', + batch: JSON.stringify([ + { + event: 'Loaded a Page', + properties: { + ip: '0.0.0.0', + $user_id: 'hjikl', + $current_url: 'https://docs.rudderstack.com/destinations/mixpanel', + $screen_dpi: 2, + mp_lib: 'RudderLabs JavaScript SDK', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $app_build_number: '1.0.0', + $app_version_string: '1.0.5', + $insert_id: 'dd266c67-9199-4a52-ba32-f46ddde67312', + token: secret2, + distinct_id: 'hjikl', + time: 1688624942402, + name: 'Contact Us', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -1185,9 +1342,9 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiKey: secret1, + apiSecret: secret3, + token: secret2, prefixProperties: true, useNativeSDK: false, useOldMapping: true, @@ -1197,6 +1354,7 @@ export const data = [ DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', @@ -1217,8 +1375,15 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$append":{"$transactions":{"$time":"2023-07-06T06:29:02.402Z","$amount":18.9}},"$token":"test_api_token","$distinct_id":"userId01"}]', + batch: JSON.stringify([ + { + $append: { + $transactions: { $time: '2023-07-06T06:29:02.402Z', $amount: 18.9 }, + }, + $token: secret2, + $distinct_id: 'userId01', + }, + ]), }, XML: {}, FORM: {}, @@ -1232,14 +1397,42 @@ export const data = [ endpoint: 'https://api.mixpanel.com/import/', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, }, params: { strict: 1 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"Product Viewed","properties":{"name":"T-Shirt","revenue":18.9,"$user_id":"userId01","$os":"iOS","$screen_height":1794,"$screen_width":1080,"$screen_dpi":420,"$carrier":"Android","$os_version":"8.1.0","$device":"generic_x86","$manufacturer":"Google","$model":"Android SDK built for x86","mp_device_model":"Android SDK built for x86","$wifi":true,"$bluetooth_enabled":false,"mp_lib":"com.rudderstack.android.sdk.core","$app_build_number":"1","$app_version_string":"1.0","$insert_id":"id2","token":"test_api_token","distinct_id":"userId01","time":1688624942402,"$device_id":"anonId01"}}]', + batch: JSON.stringify([ + { + event: 'Product Viewed', + properties: { + name: 'T-Shirt', + revenue: 18.9, + $user_id: 'userId01', + $os: 'iOS', + $screen_height: 1794, + $screen_width: 1080, + $screen_dpi: 420, + $carrier: 'Android', + $os_version: '8.1.0', + $device: 'generic_x86', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + mp_device_model: 'Android SDK built for x86', + $wifi: true, + $bluetooth_enabled: false, + mp_lib: 'com.rudderstack.android.sdk.core', + $app_build_number: '1', + $app_version_string: '1.0', + $insert_id: 'id2', + token: secret2, + distinct_id: 'userId01', + time: 1688624942402, + $device_id: 'anonId01', + }, + }, + ]), }, XML: {}, FORM: {}, @@ -1252,9 +1445,9 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiKey: secret1, + apiSecret: secret3, + token: secret2, prefixProperties: true, identityMergeApi: 'simplified', strictMode: true, @@ -1264,6 +1457,7 @@ export const data = [ DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', @@ -1284,8 +1478,64 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$set":{"$email":"mickey@disney.com","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$firstName":"Mickey","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"e6ab2c5e-2cda-44a9-a962-e2f67df78bca","$ip":"0.0.0.0","$time":1688624942402},{"$set":{"$created":"2020-01-23T08:54:02.362Z","$email":"mickey@disney.com","$country_code":"USA","$city":"Disney","$initial_referrer":"https://docs.rudderstack.com","$initial_referring_domain":"docs.rudderstack.com","$name":"Mickey Mouse","$firstName":"Mickey","$lastName":"Mouse","$browser":"Chrome","$browser_version":"79.0.3945.117"},"$token":"test_api_token","$distinct_id":"$device:anonId01","$ip":"0.0.0.0","$time":1688624942402},{"$set":{"$carrier":"Android","$manufacturer":"Google","$model":"Android SDK built for x86","$screen_height":1794,"$screen_width":1080,"$wifi":true,"anonymousId":"5094f5704b9cf2b3","userId":"test_user_id","$ios_devices":["test_device_token"],"$os":"iOS","$ios_device_model":"Android SDK built for x86","$ios_version":"8.1.0","$ios_app_release":"1","$ios_app_version":"1.0"},"$token":"test_api_token","$distinct_id":"test_user_id","$time":1584003903421}]', + batch: JSON.stringify([ + { + $set: { + $email: 'mickey@disney.com', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $firstName: 'Mickey', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: 'e6ab2c5e-2cda-44a9-a962-e2f67df78bca', + $ip: '0.0.0.0', + $time: 1688624942402, + }, + { + $set: { + $created: '2020-01-23T08:54:02.362Z', + $email: 'mickey@disney.com', + $country_code: 'USA', + $city: 'Disney', + $initial_referrer: 'https://docs.rudderstack.com', + $initial_referring_domain: 'docs.rudderstack.com', + $name: 'Mickey Mouse', + $firstName: 'Mickey', + $lastName: 'Mouse', + $browser: 'Chrome', + $browser_version: '79.0.3945.117', + }, + $token: secret2, + $distinct_id: '$device:anonId01', + $ip: '0.0.0.0', + $time: 1688624942402, + }, + { + $set: { + $carrier: 'Android', + $manufacturer: 'Google', + $model: 'Android SDK built for x86', + $screen_height: 1794, + $screen_width: 1080, + $wifi: true, + anonymousId: '5094f5704b9cf2b3', + userId: 'test_user_id', + $ios_devices: ['test_device_token'], + $os: 'iOS', + $ios_device_model: 'Android SDK built for x86', + $ios_version: '8.1.0', + $ios_app_release: '1.0', + $ios_app_version: '1', + }, + $token: secret2, + $distinct_id: 'test_user_id', + $time: 1584003903421, + }, + ]), }, XML: {}, FORM: {}, @@ -1299,14 +1549,21 @@ export const data = [ endpoint: 'https://api.mixpanel.com/import/', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dGVzdF9hcGlfdG9rZW46', + Authorization: authHeader2, }, params: { strict: 1 }, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"event":"$merge","properties":{"$distinct_ids":["test_user_id","5094f5704b9cf2b3"],"token":"test_api_token"}}]', + batch: JSON.stringify([ + { + event: '$merge', + properties: { + $distinct_ids: ['test_user_id', '5094f5704b9cf2b3'], + token: secret2, + }, + }, + ]), }, XML: {}, FORM: {}, @@ -1323,9 +1580,9 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiKey: secret1, + apiSecret: secret3, + token: secret2, prefixProperties: true, useNativeSDK: false, useOldMapping: true, @@ -1335,6 +1592,7 @@ export const data = [ DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', @@ -1355,8 +1613,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$distinct_id":"userId06","$set":{"company":["testComp"]},"$ip":"0.0.0.0"}]', + batch: JSON.stringify([ + { + $token: secret2, + $distinct_id: 'userId06', + $set: { company: ['testComp'] }, + $ip: '0.0.0.0', + }, + ]), }, XML: {}, FORM: {}, @@ -1373,8 +1637,14 @@ export const data = [ body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"$token":"test_api_token","$group_key":"company","$group_id":"testComp","$set":{"company":"testComp"}}]', + batch: JSON.stringify([ + { + $token: secret2, + $group_key: 'company', + $group_id: 'testComp', + $set: { company: 'testComp' }, + }, + ]), }, XML: {}, FORM: {}, @@ -1387,9 +1657,9 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiKey: secret1, + apiSecret: secret3, + token: secret2, prefixProperties: true, groupKeySettings: [{ groupKey: 'company' }], strictMode: true, @@ -1399,6 +1669,7 @@ export const data = [ DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', @@ -1423,9 +1694,9 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', - apiSecret: 'test_api_secret', - token: 'test_api_token', + apiKey: secret1, + apiSecret: secret3, + token: secret2, prefixProperties: true, useNativeSDK: false, groupKeySettings: [{ groupKey: 'company' }], @@ -1435,6 +1706,7 @@ export const data = [ DisplayName: 'Mixpanel', ID: '1WhbSZ6uA3H5ChVifHpfL2H6sie', Name: 'MP', + Config: {}, }, Enabled: true, ID: '1WhcOCGgj9asZu850HvugU2C3Aq', diff --git a/test/integrations/destinations/ometria/processor/data.ts b/test/integrations/destinations/ometria/processor/data.ts index c28854c9fd9..6f70c37efad 100644 --- a/test/integrations/destinations/ometria/processor/data.ts +++ b/test/integrations/destinations/ometria/processor/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'ometria', @@ -55,7 +57,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, allowMarketing: false, allowTransactional: false, marketingOptin: 'EXPLICITLY_OPTEDOUT', @@ -77,13 +79,24 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"email":"testone@gmail.com","id":"test1","customer_id":"userId1","firstname":"test","lastname":"one","@type":"contact","properties":{"field1":"val1","ip":"0.0.0.0"},"marketing_optin":"EXPLICITLY_OPTEDOUT","channels":{"sms":{"allow_marketing":false,"allow_transactional":false}}}]', + batch: JSON.stringify([ + { + email: 'testone@gmail.com', + id: 'test1', + customer_id: 'userId1', + firstname: 'test', + lastname: 'one', + '@type': 'contact', + properties: { field1: 'val1', ip: '0.0.0.0' }, + marketing_optin: 'EXPLICITLY_OPTEDOUT', + channels: { sms: { allow_marketing: false, allow_transactional: false } }, + }, + ]), }, XML: {}, FORM: {}, @@ -153,7 +166,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, allowMarketing: false, allowTransactional: false, marketingOptin: 'EXPLICITLY_OPTEDOUT', @@ -175,13 +188,24 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"email":"testone@gmail.com","id":"updatedId1","customer_id":"userId1","firstname":"test","lastname":"one","@type":"contact","properties":{"field1":"val1","ip":"0.0.0.0"},"marketing_optin":"EXPLICITLY_OPTEDOUT","channels":{"sms":{"allow_marketing":true,"allow_transactional":false}}}]', + batch: JSON.stringify([ + { + email: 'testone@gmail.com', + id: 'updatedId1', + customer_id: 'userId1', + firstname: 'test', + lastname: 'one', + '@type': 'contact', + properties: { field1: 'val1', ip: '0.0.0.0' }, + marketing_optin: 'EXPLICITLY_OPTEDOUT', + channels: { sms: { allow_marketing: true, allow_transactional: false } }, + }, + ]), }, XML: {}, FORM: {}, @@ -250,7 +274,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, allowMarketing: false, allowTransactional: false, marketingOptin: 'EXPLICITLY_OPTEDOUT', @@ -272,13 +296,25 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"email":"testone@gmail.com","id":"test1","customer_id":"userId1","@type":"contact","properties":{"field1":"val1","ip":"0.0.0.0"},"marketing_optin":"EXPLICITLY_OPTEDOUT","channels":{"sms":{"allow_marketing":false,"allow_transactional":false}},"firstname":"test","middlename":"one","lastname":"two"}]', + batch: JSON.stringify([ + { + email: 'testone@gmail.com', + id: 'test1', + customer_id: 'userId1', + '@type': 'contact', + properties: { field1: 'val1', ip: '0.0.0.0' }, + marketing_optin: 'EXPLICITLY_OPTEDOUT', + channels: { sms: { allow_marketing: false, allow_transactional: false } }, + firstname: 'test', + middlename: 'one', + lastname: 'two', + }, + ]), }, XML: {}, FORM: {}, @@ -349,7 +385,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, allowMarketing: false, allowTransactional: false, marketingOptin: 'NOT_SPECIFIED', @@ -371,13 +407,25 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"email":"testone@gmail.com","id":"test1","phone_number":"+911234567890","customer_id":"userId1","@type":"contact","properties":{"field1":"val1"},"marketing_optin":"NOT_SPECIFIED","channels":{"sms":{"allow_marketing":false,"allow_transactional":false}},"firstname":"test","lastname":"one"}]', + batch: JSON.stringify([ + { + email: 'testone@gmail.com', + id: 'test1', + phone_number: '+911234567890', + customer_id: 'userId1', + '@type': 'contact', + properties: { field1: 'val1' }, + marketing_optin: 'NOT_SPECIFIED', + channels: { sms: { allow_marketing: false, allow_transactional: false } }, + firstname: 'test', + lastname: 'one', + }, + ]), }, XML: {}, FORM: {}, @@ -450,7 +498,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, allowMarketing: false, allowTransactional: false, marketingOptin: 'NOT_SPECIFIED', @@ -472,13 +520,25 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"email":"testone@gmail.com","id":"test1","phone_number":"+911234567890","customer_id":"userId1","@type":"contact","properties":{"field1":"val1"},"marketing_optin":"NOT_SPECIFIED","channels":{"sms":{"allow_marketing":true,"allow_transactional":true}},"firstname":"test","lastname":"one"}]', + batch: JSON.stringify([ + { + email: 'testone@gmail.com', + id: 'test1', + phone_number: '+911234567890', + customer_id: 'userId1', + '@type': 'contact', + properties: { field1: 'val1' }, + marketing_optin: 'NOT_SPECIFIED', + channels: { sms: { allow_marketing: true, allow_transactional: true } }, + firstname: 'test', + lastname: 'one', + }, + ]), }, XML: {}, FORM: {}, @@ -545,7 +605,7 @@ export const data = [ integrations: { All: true }, sentAt: '2019-10-14T09:03:22.563Z', }, - destination: { Config: { apiKey: 'dummyApiKey' } }, + destination: { Config: { apiKey: defaultApiKey } }, }, ], method: 'POST', @@ -562,13 +622,22 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"id":"eventId1","timestamp":"2017-05-01T14:00:00Z","identity_email":"testone@gmail.com","identity_account_id":"userId1","@type":"custom_event","event_type":"event name","properties":{"field1":"val1"}}]', + batch: JSON.stringify([ + { + id: 'eventId1', + timestamp: '2017-05-01T14:00:00Z', + identity_email: 'testone@gmail.com', + identity_account_id: 'userId1', + '@type': 'custom_event', + event_type: 'event name', + properties: { field1: 'val1' }, + }, + ]), }, XML: {}, FORM: {}, @@ -637,7 +706,7 @@ export const data = [ integrations: { All: true }, sentAt: '2019-10-14T09:03:22.563Z', }, - destination: { Config: { apiKey: 'dummyApiKey' } }, + destination: { Config: { apiKey: defaultApiKey } }, }, ], method: 'POST', @@ -654,13 +723,30 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"id":"orderId1","timestamp":"2017-05-01T14:00:00Z","grand_total":1000,"currency":"INR","ip_address":"0.0.0.0","customer":{"id":"userId1","email":"testone@gmail.com","firstname":"test","lastname":"one"},"@type":"order","status":"complete","is_valid":true,"properties":{"field1":"val1"}}]', + batch: JSON.stringify([ + { + id: 'orderId1', + timestamp: '2017-05-01T14:00:00Z', + grand_total: 1000, + currency: 'INR', + ip_address: '0.0.0.0', + customer: { + id: 'userId1', + email: 'testone@gmail.com', + firstname: 'test', + lastname: 'one', + }, + '@type': 'order', + status: 'complete', + is_valid: true, + properties: { field1: 'val1' }, + }, + ]), }, XML: {}, FORM: {}, @@ -730,7 +816,7 @@ export const data = [ integrations: { All: true }, sentAt: '2019-10-14T09:03:22.563Z', }, - destination: { Config: { apiKey: 'dummyApiKey' } }, + destination: { Config: { apiKey: defaultApiKey } }, }, ], method: 'POST', @@ -747,13 +833,31 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"id":"orderId1","timestamp":"2017-05-01T14:00:00Z","grand_total":1000,"currency":"INR","ip_address":"0.0.0.0","customer":{"id":"userId1","email":"testone@gmail.com","firstname":"test","lastname":"one"},"@type":"order","status":"complete","is_valid":true,"properties":{"field1":"val1"},"lineitems":[{"product_id":"prod123","quantity":4,"subtotal":10}]}]', + batch: JSON.stringify([ + { + id: 'orderId1', + timestamp: '2017-05-01T14:00:00Z', + grand_total: 1000, + currency: 'INR', + ip_address: '0.0.0.0', + customer: { + id: 'userId1', + email: 'testone@gmail.com', + firstname: 'test', + lastname: 'one', + }, + '@type': 'order', + status: 'complete', + is_valid: true, + properties: { field1: 'val1' }, + lineitems: [{ product_id: 'prod123', quantity: 4, subtotal: 10 }], + }, + ]), }, XML: {}, FORM: {}, @@ -830,7 +934,7 @@ export const data = [ integrations: { All: true }, sentAt: '2019-10-14T09:03:22.563Z', }, - destination: { Config: { apiKey: 'dummyApiKey' } }, + destination: { Config: { apiKey: defaultApiKey } }, }, ], method: 'POST', @@ -847,13 +951,38 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"id":"orderId1","timestamp":"2017-05-01T14:00:00Z","grand_total":1000,"currency":"INR","ip_address":"0.0.0.0","customer":{"id":"userId1","email":"testone@gmail.com","firstname":"test","lastname":"one"},"@type":"order","status":"complete","is_valid":true,"properties":{"field1":"val1"},"lineitems":[{"product_id":"prod123","quantity":4,"subtotal":10,"variant_options":[{"id":"newid","type":"size","label":"5"}]}]}]', + batch: JSON.stringify([ + { + id: 'orderId1', + timestamp: '2017-05-01T14:00:00Z', + grand_total: 1000, + currency: 'INR', + ip_address: '0.0.0.0', + customer: { + id: 'userId1', + email: 'testone@gmail.com', + firstname: 'test', + lastname: 'one', + }, + '@type': 'order', + status: 'complete', + is_valid: true, + properties: { field1: 'val1' }, + lineitems: [ + { + product_id: 'prod123', + quantity: 4, + subtotal: 10, + variant_options: [{ id: 'newid', type: 'size', label: '5' }], + }, + ], + }, + ]), }, XML: {}, FORM: {}, @@ -932,7 +1061,7 @@ export const data = [ integrations: { All: true }, sentAt: '2019-10-14T09:03:22.563Z', }, - destination: { Config: { apiKey: 'dummyApiKey' } }, + destination: { Config: { apiKey: defaultApiKey } }, }, ], method: 'POST', @@ -949,13 +1078,38 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"id":"orderId1","timestamp":"2017-05-01T14:00:00Z","grand_total":1000,"currency":"INR","ip_address":"0.0.0.0","customer":{"id":"userId1","email":"testone@gmail.com","firstname":"test","lastname":"one"},"@type":"order","status":"complete","is_valid":true,"properties":{"field1":"val1"},"lineitems":[{"product_id":"prod123","quantity":4,"subtotal":10,"variant_options":[{"id":"newid","type":"size","label":"5"}]}]}]', + batch: JSON.stringify([ + { + id: 'orderId1', + timestamp: '2017-05-01T14:00:00Z', + grand_total: 1000, + currency: 'INR', + ip_address: '0.0.0.0', + customer: { + id: 'userId1', + email: 'testone@gmail.com', + firstname: 'test', + lastname: 'one', + }, + '@type': 'order', + status: 'complete', + is_valid: true, + properties: { field1: 'val1' }, + lineitems: [ + { + product_id: 'prod123', + quantity: 4, + subtotal: 10, + variant_options: [{ id: 'newid', type: 'size', label: '5' }], + }, + ], + }, + ]), }, XML: {}, FORM: {}, @@ -1038,7 +1192,7 @@ export const data = [ integrations: { All: true }, sentAt: '2019-10-14T09:03:22.563Z', }, - destination: { Config: { apiKey: 'dummyApiKey' } }, + destination: { Config: { apiKey: defaultApiKey } }, }, ], method: 'POST', @@ -1055,13 +1209,44 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"id":"orderId1","timestamp":"2017-05-01T14:00:00Z","grand_total":1000,"currency":"INR","ip_address":"0.0.0.0","shipping_address":{"city":"Kolkata","state":"West Bengal","country_code":"IN","postcode":"700001"},"customer":{"id":"userId1","email":"testone@gmail.com","firstname":"test","lastname":"one"},"@type":"order","status":"complete","is_valid":true,"properties":{"field1":"val1"},"lineitems":[{"product_id":"prod123","quantity":4,"subtotal":10,"variant_options":[{"id":"newid","type":"size","label":"5"}]}]}]', + batch: JSON.stringify([ + { + id: 'orderId1', + timestamp: '2017-05-01T14:00:00Z', + grand_total: 1000, + currency: 'INR', + ip_address: '0.0.0.0', + shipping_address: { + city: 'Kolkata', + state: 'West Bengal', + country_code: 'IN', + postcode: '700001', + }, + customer: { + id: 'userId1', + email: 'testone@gmail.com', + firstname: 'test', + lastname: 'one', + }, + '@type': 'order', + status: 'complete', + is_valid: true, + properties: { field1: 'val1' }, + lineitems: [ + { + product_id: 'prod123', + quantity: 4, + subtotal: 10, + variant_options: [{ id: 'newid', type: 'size', label: '5' }], + }, + ], + }, + ]), }, XML: {}, FORM: {}, diff --git a/test/integrations/destinations/ometria/router/data.ts b/test/integrations/destinations/ometria/router/data.ts index 58f3a91d877..246a23c5d5f 100644 --- a/test/integrations/destinations/ometria/router/data.ts +++ b/test/integrations/destinations/ometria/router/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'ometria', @@ -103,7 +105,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, allowMarketing: false, allowTransactional: false, marketingOptin: 'EXPLICITLY_OPTEDOUT', @@ -207,7 +209,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, allowMarketing: false, allowTransactional: false, marketingOptin: 'EXPLICITLY_OPTEDOUT', @@ -234,13 +236,35 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://api.ometria.com/v2/push', - headers: { 'X-Ometria-Auth': 'dummyApiKey' }, + headers: { 'X-Ometria-Auth': defaultApiKey }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"email":"testone@gmail.com","id":"test1","customer_id":"userId1","firstname":"test","lastname":"one","@type":"contact","properties":{"field1":"val1","ip":"0.0.0.0"},"marketing_optin":"EXPLICITLY_OPTEDOUT","channels":{"sms":{"allow_marketing":false,"allow_transactional":false}}},{"email":"testone@gmail.com","id":"updatedId1","customer_id":"userId1","firstname":"test","lastname":"one","@type":"contact","properties":{"field1":"val1","ip":"0.0.0.0"},"marketing_optin":"EXPLICITLY_OPTEDOUT","channels":{"sms":{"allow_marketing":true,"allow_transactional":false}}}]', + batch: JSON.stringify([ + { + email: 'testone@gmail.com', + id: 'test1', + customer_id: 'userId1', + firstname: 'test', + lastname: 'one', + '@type': 'contact', + properties: { field1: 'val1', ip: '0.0.0.0' }, + marketing_optin: 'EXPLICITLY_OPTEDOUT', + channels: { sms: { allow_marketing: false, allow_transactional: false } }, + }, + { + email: 'testone@gmail.com', + id: 'updatedId1', + customer_id: 'userId1', + firstname: 'test', + lastname: 'one', + '@type': 'contact', + properties: { field1: 'val1', ip: '0.0.0.0' }, + marketing_optin: 'EXPLICITLY_OPTEDOUT', + channels: { sms: { allow_marketing: true, allow_transactional: false } }, + }, + ]), }, XML: {}, FORM: {}, @@ -291,7 +315,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, allowMarketing: false, allowTransactional: false, marketingOptin: 'EXPLICITLY_OPTEDOUT', diff --git a/test/integrations/destinations/optimizely_fullstack/network.ts b/test/integrations/destinations/optimizely_fullstack/network.ts index e6a1101ab90..a894449ae4d 100644 --- a/test/integrations/destinations/optimizely_fullstack/network.ts +++ b/test/integrations/destinations/optimizely_fullstack/network.ts @@ -37,8 +37,15 @@ const deleteNwData = [ { id: '$opt_test_audience', name: 'Optimizely-Generated Audience for Backwards Compatibility', - conditions: - '["or", {"match": "exact", "name": "$opt_test_attribute", "type": "custom_attribute", "value": "$opt_test_value"}]', + conditions: JSON.stringify([ + 'or', + { + match: 'exact', + name: '$opt_test_attribute', + type: 'custom_attribute', + value: '$opt_test_value', + }, + ]), }, ], version: '4', diff --git a/test/integrations/destinations/optimizely_fullstack/processor/data.ts b/test/integrations/destinations/optimizely_fullstack/processor/data.ts index fb514bc6b8a..56bd93490e3 100644 --- a/test/integrations/destinations/optimizely_fullstack/processor/data.ts +++ b/test/integrations/destinations/optimizely_fullstack/processor/data.ts @@ -598,8 +598,17 @@ export const data = [ status: 200, body: [ { - error: - '{"message":"{\\"message\\":\\"Data File Lookup Failed due to {\\\\\\"code\\\\\\":\\\\\\"document_not_found\\\\\\",\\\\\\"message\\\\\\":\\\\\\"document_not_found\\\\\\"}: Workflow: procWorkflow, Step: dataFile, ChildStep: undefined, OriginalError: Data File Lookup Failed due to {\\\\\\"code\\\\\\":\\\\\\"document_not_found\\\\\\",\\\\\\"message\\\\\\":\\\\\\"document_not_found\\\\\\"}\\",\\"destinationResponse\\":{\\"code\\":\\"document_not_found\\",\\"message\\":\\"document_not_found\\"}}","destinationResponse":{"code":"document_not_found","message":"document_not_found"}}', + error: JSON.stringify({ + message: JSON.stringify({ + message: + 'Data File Lookup Failed due to {"code":"document_not_found","message":"document_not_found"}: Workflow: procWorkflow, Step: dataFile, ChildStep: undefined, OriginalError: Data File Lookup Failed due to {"code":"document_not_found","message":"document_not_found"}', + destinationResponse: { code: 'document_not_found', message: 'document_not_found' }, + }), + destinationResponse: { + code: 'document_not_found', + message: 'document_not_found', + }, + }), statTags: { destType: 'OPTIMIZELY_FULLSTACK', errorCategory: 'network', diff --git a/test/integrations/destinations/ortto/processor/data.ts b/test/integrations/destinations/ortto/processor/data.ts index ff84f5dbbd1..903765a94b5 100644 --- a/test/integrations/destinations/ortto/processor/data.ts +++ b/test/integrations/destinations/ortto/processor/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'ortto', @@ -18,7 +20,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, instanceRegion: 'other', orttoEventsMapping: [ { @@ -149,7 +151,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.ap3api.com/v1/person/merge', headers: { - 'X-Api-Key': 'dummyApiKey', + 'X-Api-Key': defaultApiKey, 'Content-Type': 'application/json', }, params: {}, @@ -219,7 +221,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, instanceRegion: 'other', orttoEventsMapping: [ { @@ -383,7 +385,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, instanceRegion: 'other', orttoEventsMapping: [ { @@ -542,7 +544,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, orttoEventsMapping: [ { rsEventName: 'RudderEvent', @@ -868,7 +870,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, instanceRegion: 'other', orttoEventsMapping: [ { @@ -1006,7 +1008,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.ap3api.com/v1/activities/create', headers: { - 'X-Api-Key': 'dummyApiKey', + 'X-Api-Key': defaultApiKey, 'Content-Type': 'application/json', }, params: {}, @@ -1084,7 +1086,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, instanceRegion: 'other', orttoEventsMapping: [ { @@ -1221,7 +1223,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.ap3api.com/v1/activities/create', headers: { - 'X-Api-Key': 'dummyApiKey', + 'X-Api-Key': defaultApiKey, 'Content-Type': 'application/json', }, params: {}, @@ -1296,7 +1298,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, instanceRegion: 'other', orttoEventsMapping: [ { diff --git a/test/integrations/destinations/ortto/router/data.ts b/test/integrations/destinations/ortto/router/data.ts index 8999637a669..0e94045e544 100644 --- a/test/integrations/destinations/ortto/router/data.ts +++ b/test/integrations/destinations/ortto/router/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'ortto', @@ -19,7 +21,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, instanceRegion: 'other', orttoEventsMapping: [ { @@ -140,7 +142,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, instanceRegion: 'other', orttoEventsMapping: [ { @@ -314,7 +316,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.ap3api.com/v1/person/merge', headers: { - 'X-Api-Key': 'dummyApiKey', + 'X-Api-Key': defaultApiKey, 'Content-Type': 'application/json', }, params: {}, @@ -338,7 +340,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, instanceRegion: 'other', orttoEventsMapping: [ { @@ -424,7 +426,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.ap3api.com/v1/activities/create', headers: { - 'X-Api-Key': 'dummyApiKey', + 'X-Api-Key': defaultApiKey, 'Content-Type': 'application/json', }, params: {}, @@ -448,7 +450,7 @@ export const data = [ ID: '1pYpzzvcn7AQ2W9GGIAZSsN6Mfq', Name: 'ORTTO', Config: { - privateApiKey: 'dummyApiKey', + privateApiKey: defaultApiKey, instanceRegion: 'other', orttoEventsMapping: [ { diff --git a/test/integrations/destinations/pardot/dataDelivery/constant.ts b/test/integrations/destinations/pardot/dataDelivery/constant.ts index 97e456998e1..ff7a570a821 100644 --- a/test/integrations/destinations/pardot/dataDelivery/constant.ts +++ b/test/integrations/destinations/pardot/dataDelivery/constant.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; export const retryStatTags = { destType: 'PARDOT', errorCategory: 'network', @@ -9,7 +10,7 @@ export const retryStatTags = { module: 'destination', }; const commonHeaders = { - Authorization: 'Bearer myToken', + Authorization: authHeader1, 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8', 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', 'User-Agent': 'RudderLabs', diff --git a/test/integrations/destinations/pardot/maskedSecrets.ts b/test/integrations/destinations/pardot/maskedSecrets.ts new file mode 100644 index 00000000000..61db9ef38a9 --- /dev/null +++ b/test/integrations/destinations/pardot/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; diff --git a/test/integrations/destinations/pardot/network.ts b/test/integrations/destinations/pardot/network.ts index 9493aab01fb..bcff01361cd 100644 --- a/test/integrations/destinations/pardot/network.ts +++ b/test/integrations/destinations/pardot/network.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from './maskedSecrets'; import { getFormData } from '../../../../src/adapters/network'; export const networkCallsData = [ @@ -268,7 +269,7 @@ export const networkCallsData = [ }).toString(), params: { destination: 'pardot' }, headers: { - Authorization: 'Bearer myToken', + Authorization: authHeader1, 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8', 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', 'User-Agent': 'RudderLabs', diff --git a/test/integrations/destinations/pardot/router/data.ts b/test/integrations/destinations/pardot/router/data.ts index 0862666bbab..23ebb973fa2 100644 --- a/test/integrations/destinations/pardot/router/data.ts +++ b/test/integrations/destinations/pardot/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, authHeader2, secret2 } from '../maskedSecrets'; import { FEATURES, MODULES } from '../../../../../src/v0/util/tags'; export const data = [ @@ -56,7 +57,7 @@ export const data = [ }, metadata: { jobId: 1, - secret: { access_token: 'myToken', refresh_token: 'myRefreshToken' }, + secret: { access_token: secret1, refresh_token: 'myRefreshToken' }, userId: 'u1', }, message: { @@ -163,7 +164,7 @@ export const data = [ }, metadata: { jobId: 2, - secret: { access_token: 'myToken', refresh_token: 'myRefreshToken' }, + secret: { access_token: secret1, refresh_token: 'myRefreshToken' }, userId: 'u1', }, message: { @@ -269,7 +270,7 @@ export const data = [ }, metadata: { jobId: 3, - secret: { access_token: 'myToken', refresh_token: 'myRefreshToken' }, + secret: { access_token: secret1, refresh_token: 'myRefreshToken' }, userId: 'u1', }, message: { @@ -376,7 +377,7 @@ export const data = [ }, metadata: { jobId: 4, - secret: { access_token: 'myExpiredToken', refresh_token: 'myRefreshToken' }, + secret: { access_token: secret2, refresh_token: 'myRefreshToken' }, userId: 'u1', }, message: { @@ -557,7 +558,7 @@ export const data = [ method: 'POST', endpoint: 'https://pi.pardot.com/api/prospect/version/4/do/upsert/id/123435', headers: { - Authorization: 'Bearer myToken', + Authorization: authHeader1, 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', }, params: {}, @@ -578,7 +579,7 @@ export const data = [ metadata: [ { jobId: 1, - secret: { access_token: 'myToken', refresh_token: 'myRefreshToken' }, + secret: { access_token: secret1, refresh_token: 'myRefreshToken' }, userId: 'u1', }, ], @@ -635,7 +636,7 @@ export const data = [ endpoint: 'https://pi.pardot.com/api/prospect/version/4/do/upsert/email/Roger_12@waltair.io', headers: { - Authorization: 'Bearer myToken', + Authorization: authHeader1, 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', }, params: {}, @@ -656,7 +657,7 @@ export const data = [ metadata: [ { jobId: 2, - secret: { access_token: 'myToken', refresh_token: 'myRefreshToken' }, + secret: { access_token: secret1, refresh_token: 'myRefreshToken' }, userId: 'u1', }, ], @@ -713,7 +714,7 @@ export const data = [ endpoint: 'https://pi.pardot.com/api/prospect/version/4/do/upsert/fid/00Q6r000002LKhTPVR', headers: { - Authorization: 'Bearer myToken', + Authorization: authHeader1, 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', }, params: {}, @@ -734,7 +735,7 @@ export const data = [ metadata: [ { jobId: 3, - secret: { access_token: 'myToken', refresh_token: 'myRefreshToken' }, + secret: { access_token: secret1, refresh_token: 'myRefreshToken' }, userId: 'u1', }, ], @@ -791,7 +792,7 @@ export const data = [ endpoint: 'https://pi.pardot.com/api/prospect/version/4/do/upsert/email/rolex_waltair@mywebsite.io', headers: { - Authorization: 'Bearer myExpiredToken', + Authorization: authHeader2, 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', }, params: {}, @@ -812,7 +813,7 @@ export const data = [ metadata: [ { jobId: 4, - secret: { access_token: 'myExpiredToken', refresh_token: 'myRefreshToken' }, + secret: { access_token: secret2, refresh_token: 'myRefreshToken' }, userId: 'u1', }, ], @@ -936,7 +937,7 @@ export const data = [ method: 'POST', endpoint: 'https://pi.pardot.com/api/prospect/version/4/do/upsert/id/123435', headers: { - Authorization: 'Bearer myToken', + Authorization: authHeader1, 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', }, body: { @@ -1072,7 +1073,7 @@ export const data = [ endpoint: 'https://pi.pardot.com/api/prospect/version/4/do/upsert/email/Roger_12@waltair.io', headers: { - Authorization: 'Bearer myToken', + Authorization: authHeader1, 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', }, body: { @@ -1207,7 +1208,7 @@ export const data = [ method: 'POST', endpoint: 'https://pi.pardot.com/api/prospect/version/4/do/upsert/fid/00Q6r000002LKhTPVR', headers: { - Authorization: 'Bearer myToken', + Authorization: authHeader1, 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', }, body: { @@ -1343,7 +1344,7 @@ export const data = [ endpoint: 'https://pi.pardot.com/api/prospect/version/4/do/upsert/email/rolex_waltair@mywebsite.io', headers: { - Authorization: 'Bearer myExpiredToken', + Authorization: authHeader2, 'Pardot-Business-Unit-Id': '0Uv2v000000k9tHCAQ', }, body: { diff --git a/test/integrations/destinations/persistiq/processor/data.ts b/test/integrations/destinations/persistiq/processor/data.ts index 05bafe6123f..b4f07ea7cc9 100644 --- a/test/integrations/destinations/persistiq/processor/data.ts +++ b/test/integrations/destinations/persistiq/processor/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'persistiq', @@ -43,7 +45,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, persistIqAttributesMapping: [ { from: 'useroccupation', @@ -87,7 +89,7 @@ export const data = [ files: {}, userId: '', headers: { - 'x-api-key': 'dummyApiKey', + 'x-api-key': defaultApiKey, }, method: 'PATCH', params: {}, @@ -140,7 +142,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, persistIqAttributesMapping: [ { from: 'useroccupation', @@ -189,7 +191,7 @@ export const data = [ files: {}, userId: '', headers: { - 'x-api-key': 'dummyApiKey', + 'x-api-key': defaultApiKey, }, method: 'POST', params: {}, @@ -224,7 +226,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, }, }, }, @@ -285,7 +287,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, }, }, }, @@ -339,7 +341,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, }, }, }, @@ -400,7 +402,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, }, }, }, @@ -429,7 +431,7 @@ export const data = [ method: 'POST', params: {}, headers: { - 'x-api-key': 'dummyApiKey', + 'x-api-key': defaultApiKey, }, version: '1', endpoint: 'https://api.persistiq.com/v1/campaigns/testgroup1/leads', @@ -472,7 +474,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, }, }, }, @@ -498,7 +500,7 @@ export const data = [ method: 'DELETE', params: {}, headers: { - 'x-api-key': 'dummyApiKey', + 'x-api-key': defaultApiKey, }, version: '1', endpoint: 'https://api.persistiq.com/v1/campaigns/testgroup1/leads/lel1c5u1wuk8', @@ -547,7 +549,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, persistIqAttributesMapping: [ { from: 'useroccupation', diff --git a/test/integrations/destinations/persistiq/router/data.ts b/test/integrations/destinations/persistiq/router/data.ts index ddb39b90280..12208aaf411 100644 --- a/test/integrations/destinations/persistiq/router/data.ts +++ b/test/integrations/destinations/persistiq/router/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'persistiq', @@ -37,7 +39,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, persistIqAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], }, }, @@ -79,7 +81,7 @@ export const data = [ }, endpoint: 'https://api.persistiq.com/v1/leads/lel1c5u1wuk8', files: {}, - headers: { 'x-api-key': 'dummyApiKey' }, + headers: { 'x-api-key': defaultApiKey }, method: 'PATCH', params: {}, type: 'REST', @@ -87,7 +89,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, persistIqAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], }, }, diff --git a/test/integrations/destinations/pinterest_tag/maskedSecrets.ts b/test/integrations/destinations/pinterest_tag/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/pinterest_tag/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/pinterest_tag/processor/data.ts b/test/integrations/destinations/pinterest_tag/processor/data.ts index 4982444346c..a891ca1cc5f 100644 --- a/test/integrations/destinations/pinterest_tag/processor/data.ts +++ b/test/integrations/destinations/pinterest_tag/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'pinterest_tag', @@ -2791,7 +2792,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -2824,7 +2825,7 @@ export const data = [ endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer conversionToken123', + Authorization: authHeader1, }, params: {}, body: { @@ -2972,7 +2973,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -3005,7 +3006,7 @@ export const data = [ endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer conversionToken123', + Authorization: authHeader1, }, params: {}, body: { @@ -3156,7 +3157,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -3189,7 +3190,7 @@ export const data = [ endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer conversionToken123', + Authorization: authHeader1, }, params: {}, body: { @@ -3321,7 +3322,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: '', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -3510,7 +3511,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -3580,7 +3581,7 @@ export const data = [ endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer conversionToken123', + Authorization: authHeader1, }, params: {}, files: {}, @@ -3636,7 +3637,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -3761,7 +3762,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, diff --git a/test/integrations/destinations/pinterest_tag/router/data.ts b/test/integrations/destinations/pinterest_tag/router/data.ts index 4049f7663a8..7b2f04cb550 100644 --- a/test/integrations/destinations/pinterest_tag/router/data.ts +++ b/test/integrations/destinations/pinterest_tag/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { destType: 'pinterest_tag', @@ -1123,7 +1124,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', sendingUnHashedData: true, enableDeduplication: true, @@ -1217,7 +1218,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', sendingUnHashedData: true, enableDeduplication: true, @@ -1311,7 +1312,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', sendingUnHashedData: true, enableDeduplication: true, @@ -1352,7 +1353,7 @@ export const data = [ endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer conversionToken123', + Authorization: authHeader1, }, params: {}, body: { @@ -1568,7 +1569,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', sendingUnHashedData: true, enableDeduplication: true, diff --git a/test/integrations/destinations/pinterest_tag/step/data.ts b/test/integrations/destinations/pinterest_tag/step/data.ts index 71f12c735ca..af9a3ace4b5 100644 --- a/test/integrations/destinations/pinterest_tag/step/data.ts +++ b/test/integrations/destinations/pinterest_tag/step/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'pinterest_tag', @@ -2810,7 +2811,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -2845,7 +2846,7 @@ export const data = [ endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer conversionToken123', + Authorization: authHeader1, }, params: {}, body: { @@ -2993,7 +2994,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -3028,7 +3029,7 @@ export const data = [ endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer conversionToken123', + Authorization: authHeader1, }, params: {}, body: { @@ -3179,7 +3180,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -3214,7 +3215,7 @@ export const data = [ endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer conversionToken123', + Authorization: authHeader1, }, params: {}, body: { @@ -3346,7 +3347,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: '', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -3539,7 +3540,7 @@ export const data = [ tagId: '123456789', apiVersion: 'newApi', adAccountId: 'accountId123', - conversionToken: 'conversionToken123', + conversionToken: secret1, appId: '429047995', enhancedMatch: true, enableDeduplication: true, @@ -3574,7 +3575,7 @@ export const data = [ endpoint: 'https://api.pinterest.com/v5/ad_accounts/accountId123/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer conversionToken123', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/profitwell/maskedSecrets.ts b/test/integrations/destinations/profitwell/maskedSecrets.ts new file mode 100644 index 00000000000..fa268ef78c3 --- /dev/null +++ b/test/integrations/destinations/profitwell/maskedSecrets.ts @@ -0,0 +1,3 @@ +import path from 'path'; + +export const secretApiKey = path.basename(__dirname) + 1; diff --git a/test/integrations/destinations/profitwell/processor/data.ts b/test/integrations/destinations/profitwell/processor/data.ts index 58bd2ed35fb..57b2194f9ce 100644 --- a/test/integrations/destinations/profitwell/processor/data.ts +++ b/test/integrations/destinations/profitwell/processor/data.ts @@ -1,3 +1,5 @@ +import { secretApiKey } from '../maskedSecrets'; + export const data = [ { name: 'profitwell', @@ -11,7 +13,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -92,7 +94,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -179,7 +181,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -241,7 +243,7 @@ export const data = [ endpoint: 'https://api.profitwell.com/v2/subscriptions/', headers: { 'Content-Type': 'application/json', - Authorization: '9270161a8e5abaa0e56efddfd9dbcb62', + Authorization: secretApiKey, }, params: {}, body: { @@ -281,7 +283,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -362,7 +364,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -450,7 +452,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -518,7 +520,7 @@ export const data = [ endpoint: 'https://api.profitwell.com/v2/subscriptions/', headers: { 'Content-Type': 'application/json', - Authorization: '9270161a8e5abaa0e56efddfd9dbcb62', + Authorization: secretApiKey, }, params: {}, body: { @@ -559,7 +561,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -652,7 +654,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -725,7 +727,7 @@ export const data = [ endpoint: 'https://api.profitwell.com/v2/subscriptions/pws_FecTCEyo17rV/', headers: { 'Content-Type': 'application/json', - Authorization: '9270161a8e5abaa0e56efddfd9dbcb62', + Authorization: secretApiKey, }, params: {}, body: { @@ -761,7 +763,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -854,7 +856,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -927,7 +929,7 @@ export const data = [ endpoint: 'https://api.profitwell.com/v2/subscriptions/pws_FecTCEyo17rV/', headers: { 'Content-Type': 'application/json', - Authorization: '9270161a8e5abaa0e56efddfd9dbcb62', + Authorization: secretApiKey, }, params: {}, body: { @@ -1053,7 +1055,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -1147,7 +1149,7 @@ export const data = [ { destination: { Config: { - privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62', + privateApiKey: secretApiKey, }, }, message: { @@ -1210,7 +1212,7 @@ export const data = [ endpoint: 'https://api.profitwell.com/v2/subscriptions/', headers: { 'Content-Type': 'application/json', - Authorization: '9270161a8e5abaa0e56efddfd9dbcb62', + Authorization: secretApiKey, }, params: {}, body: { diff --git a/test/integrations/destinations/profitwell/router/data.ts b/test/integrations/destinations/profitwell/router/data.ts index b308155dae8..fbd82cfe392 100644 --- a/test/integrations/destinations/profitwell/router/data.ts +++ b/test/integrations/destinations/profitwell/router/data.ts @@ -1,3 +1,5 @@ +import { secretApiKey } from '../maskedSecrets'; + export const data = [ { name: 'profitwell', @@ -10,7 +12,7 @@ export const data = [ body: { input: [ { - destination: { Config: { privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62' } }, + destination: { Config: { privateApiKey: secretApiKey } }, metadata: { jobId: 2, userId: 'u1' }, message: { channel: 'web', @@ -81,7 +83,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: '9270161a8e5abaa0e56efddfd9dbcb62', + Authorization: secretApiKey, }, version: '1', endpoint: 'https://api.profitwell.com/v2/subscriptions/', @@ -89,7 +91,7 @@ export const data = [ metadata: [{ jobId: 2, userId: 'u1' }], batched: false, statusCode: 200, - destination: { Config: { privateApiKey: '9270161a8e5abaa0e56efddfd9dbcb62' } }, + destination: { Config: { privateApiKey: secretApiKey } }, }, ], }, diff --git a/test/integrations/destinations/reddit/dataDelivery/business.ts b/test/integrations/destinations/reddit/dataDelivery/business.ts index cc2feccffa2..73b40dd9953 100644 --- a/test/integrations/destinations/reddit/dataDelivery/business.ts +++ b/test/integrations/destinations/reddit/dataDelivery/business.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; import { generateMetadata, generateProxyV0Payload, @@ -105,7 +106,7 @@ const validRequestMultipleEventsInPayload = { }; const commonHeaders = { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }; @@ -233,8 +234,14 @@ export const testScenariosForV1API = [ { metadata: generateMetadata(1), statusCode: 403, - error: - '{"success":false,"error":{"reason":"UNAUTHORIZED","explanation":"JSON error unexpected type number on field events event_metadata value"}}', + error: JSON.stringify({ + success: false, + error: { + reason: 'UNAUTHORIZED', + explanation: + 'JSON error unexpected type number on field events event_metadata value', + }, + }), }, ], statTags: { @@ -286,14 +293,68 @@ export const testScenariosForV1API = [ { metadata: { ...generateMetadata(1), dontBatch: true }, statusCode: 500, - error: - '{"message":"There were 1 invalid conversion events. None were processed.","invalid_events":[{"error_message":"event_at timestamp must be less than 168h0m0s old","event":{"event_at":"2018-10-14T09:03:17.562Z","event_type":{"tracking_type":"Purchase"},"event_metadata":{"item_count":0,"products":[{}],"conversion_id":"c054005afd85a4de74638a776eb8348d44ee875184d7a401830705b7a06e7df1"},"user":{"aaid":"c12d34889302d3c656b5699fa9190b51c50d6f62fce57e13bd56b503d66c487a","email":"ac144532d9e4efeab19475d9253a879173ea12a3d2238d1cb8a332a7b3a105f2","external_id":"7b023241a3132b792a5a33915a5afb3133cbb1e13d72879689bf6504de3b036d","ip_address":"e80bd55a3834b7c2a34ade23c7ecb54d2a49838227080f50716151e765a619db","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36","screen_dimensions":{}}}}]}', + error: JSON.stringify({ + message: 'There were 1 invalid conversion events. None were processed.', + invalid_events: [ + { + error_message: 'event_at timestamp must be less than 168h0m0s old', + event: { + event_at: '2018-10-14T09:03:17.562Z', + event_type: { tracking_type: 'Purchase' }, + event_metadata: { + item_count: 0, + products: [{}], + conversion_id: + 'c054005afd85a4de74638a776eb8348d44ee875184d7a401830705b7a06e7df1', + }, + user: { + aaid: 'c12d34889302d3c656b5699fa9190b51c50d6f62fce57e13bd56b503d66c487a', + email: 'ac144532d9e4efeab19475d9253a879173ea12a3d2238d1cb8a332a7b3a105f2', + external_id: + '7b023241a3132b792a5a33915a5afb3133cbb1e13d72879689bf6504de3b036d', + ip_address: + 'e80bd55a3834b7c2a34ade23c7ecb54d2a49838227080f50716151e765a619db', + user_agent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', + screen_dimensions: {}, + }, + }, + }, + ], + }), }, { metadata: { ...generateMetadata(2), dontBatch: true }, statusCode: 500, - error: - '{"message":"There were 1 invalid conversion events. None were processed.","invalid_events":[{"error_message":"event_at timestamp must be less than 168h0m0s old","event":{"event_at":"2018-10-14T09:03:17.562Z","event_type":{"tracking_type":"Purchase"},"event_metadata":{"item_count":0,"products":[{}],"conversion_id":"c054005afd85a4de74638a776eb8348d44ee875184d7a401830705b7a06e7df1"},"user":{"aaid":"c12d34889302d3c656b5699fa9190b51c50d6f62fce57e13bd56b503d66c487a","email":"ac144532d9e4efeab19475d9253a879173ea12a3d2238d1cb8a332a7b3a105f2","external_id":"7b023241a3132b792a5a33915a5afb3133cbb1e13d72879689bf6504de3b036d","ip_address":"e80bd55a3834b7c2a34ade23c7ecb54d2a49838227080f50716151e765a619db","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36","screen_dimensions":{}}}}]}', + error: JSON.stringify({ + message: 'There were 1 invalid conversion events. None were processed.', + invalid_events: [ + { + error_message: 'event_at timestamp must be less than 168h0m0s old', + event: { + event_at: '2018-10-14T09:03:17.562Z', + event_type: { tracking_type: 'Purchase' }, + event_metadata: { + item_count: 0, + products: [{}], + conversion_id: + 'c054005afd85a4de74638a776eb8348d44ee875184d7a401830705b7a06e7df1', + }, + user: { + aaid: 'c12d34889302d3c656b5699fa9190b51c50d6f62fce57e13bd56b503d66c487a', + email: 'ac144532d9e4efeab19475d9253a879173ea12a3d2238d1cb8a332a7b3a105f2', + external_id: + '7b023241a3132b792a5a33915a5afb3133cbb1e13d72879689bf6504de3b036d', + ip_address: + 'e80bd55a3834b7c2a34ade23c7ecb54d2a49838227080f50716151e765a619db', + user_agent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', + screen_dimensions: {}, + }, + }, + }, + ], + }), }, ], statTags: { diff --git a/test/integrations/destinations/reddit/dataDelivery/oauth.ts b/test/integrations/destinations/reddit/dataDelivery/oauth.ts index e3c5875a062..1c39798c4ac 100644 --- a/test/integrations/destinations/reddit/dataDelivery/oauth.ts +++ b/test/integrations/destinations/reddit/dataDelivery/oauth.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; import { generateMetadata, generateProxyV1Payload, @@ -40,7 +41,7 @@ const authorizationRequiredRequestPayload = { }; const commonHeaders = { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }; @@ -217,8 +218,14 @@ export const v1oauthScenarios = [ 'This server could not verify that you are authorized to access the document you requested. during reddit response transformation', response: [ { - error: - '{"success":false,"error":{"reason":"UNAUTHORIZED","explanation":"This server could not verify that you are authorized to access the document you requested."}}', + error: JSON.stringify({ + success: false, + error: { + reason: 'UNAUTHORIZED', + explanation: + 'This server could not verify that you are authorized to access the document you requested.', + }, + }), metadata: generateMetadata(1), statusCode: 401, }, diff --git a/test/integrations/destinations/reddit/maskedSecrets.ts b/test/integrations/destinations/reddit/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/reddit/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/reddit/network.ts b/test/integrations/destinations/reddit/network.ts index 54d7a95b73e..aeafe967608 100644 --- a/test/integrations/destinations/reddit/network.ts +++ b/test/integrations/destinations/reddit/network.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from './maskedSecrets'; export const networkCallsData = [ { httpReq: { @@ -38,7 +39,7 @@ export const networkCallsData = [ }, params: { destination: 'reddit' }, headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -90,7 +91,7 @@ export const networkCallsData = [ }, params: { destination: 'reddit' }, headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -136,7 +137,7 @@ export const networkCallsData = [ }, params: { destination: 'reddit' }, headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -193,7 +194,7 @@ export const networkCallsData = [ }, params: { destination: 'reddit' }, headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -279,7 +280,7 @@ export const networkCallsData = [ }, params: { destination: 'reddit' }, headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', diff --git a/test/integrations/destinations/reddit/processor/data.ts b/test/integrations/destinations/reddit/processor/data.ts index e7b36f56ff8..529d2aa3a66 100644 --- a/test/integrations/destinations/reddit/processor/data.ts +++ b/test/integrations/destinations/reddit/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'reddit', @@ -84,7 +85,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -102,7 +103,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -157,7 +158,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, statusCode: 200, @@ -251,7 +252,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -269,7 +270,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -324,7 +325,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, statusCode: 200, @@ -403,7 +404,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -421,7 +422,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -472,7 +473,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, statusCode: 200, @@ -541,7 +542,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -559,7 +560,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -607,7 +608,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, statusCode: 200, @@ -676,7 +677,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -694,7 +695,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -740,7 +741,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, statusCode: 200, @@ -809,7 +810,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -827,7 +828,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -875,7 +876,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, statusCode: 200, @@ -954,7 +955,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -972,7 +973,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1023,7 +1024,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, statusCode: 200, @@ -1102,7 +1103,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -1120,7 +1121,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1172,7 +1173,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, statusCode: 200, @@ -1249,7 +1250,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -1277,7 +1278,7 @@ export const data = [ metadata: { destinationId: 'destId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, workspaceId: 'wspId', }, @@ -1355,7 +1356,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -1383,7 +1384,7 @@ export const data = [ metadata: { destinationId: 'destId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, workspaceId: 'wspId', }, @@ -1461,7 +1462,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -1489,7 +1490,7 @@ export const data = [ metadata: { destinationId: 'destId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, workspaceId: 'wspId', }, @@ -1566,7 +1567,7 @@ export const data = [ destinationId: 'destId', workspaceId: 'wspId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, }, }, @@ -1594,7 +1595,7 @@ export const data = [ metadata: { destinationId: 'destId', secret: { - accessToken: 'dummyAccessToken', + accessToken: secret1, }, workspaceId: 'wspId', }, diff --git a/test/integrations/destinations/reddit/router/data.ts b/test/integrations/destinations/reddit/router/data.ts index f2dd887b849..4118d46191e 100644 --- a/test/integrations/destinations/reddit/router/data.ts +++ b/test/integrations/destinations/reddit/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'reddit', @@ -69,7 +70,7 @@ export const data = [ metadata: { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 1, userId: 'u1', }, @@ -127,7 +128,7 @@ export const data = [ metadata: { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 2, userId: 'u1', }, @@ -173,7 +174,7 @@ export const data = [ metadata: { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 3, userId: 'u1', }, @@ -238,7 +239,7 @@ export const data = [ metadata: { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 4, userId: 'u1', dontBatch: true, @@ -297,7 +298,7 @@ export const data = [ metadata: { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 5, userId: 'u1', dontBatch: true, @@ -410,7 +411,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -420,21 +421,21 @@ export const data = [ { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 1, userId: 'u1', }, { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 2, userId: 'u1', }, { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 3, userId: 'u1', }, @@ -490,7 +491,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -500,7 +501,7 @@ export const data = [ { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 4, userId: 'u1', dontBatch: true, @@ -564,7 +565,7 @@ export const data = [ method: 'POST', endpoint: 'https://ads-api.reddit.com/api/v2.0/conversions/events/a2_fsddXXXfsfd', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -574,7 +575,7 @@ export const data = [ { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 5, userId: 'u1', dontBatch: true, @@ -657,7 +658,7 @@ export const data = [ metadata: { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 1, userId: 'u1', }, @@ -677,7 +678,7 @@ export const data = [ { destinationId: 'destId', workspaceId: 'wspId', - secret: { accessToken: 'dummyAccessToken' }, + secret: { accessToken: secret1 }, jobId: 1, userId: 'u1', }, diff --git a/test/integrations/destinations/redis/processor/data.ts b/test/integrations/destinations/redis/processor/data.ts index 999a954b59b..45846203d5f 100644 --- a/test/integrations/destinations/redis/processor/data.ts +++ b/test/integrations/destinations/redis/processor/data.ts @@ -320,7 +320,7 @@ export const data = [ Cízǔ: 'test', CamelCase123Key: 'test', '1CComega': 'test', - arrayProp: '[{"x":1,"y":2}]', + arrayProp: JSON.stringify([{ x: 1, y: 2 }]), 'nestedProp.innerProp1': 'innerPropVal1', 'nestedProp.innerProp2': 'innerPropVal2', }, @@ -449,7 +449,7 @@ export const data = [ Cízǔ: 'test', CamelCase123Key: 'test', '1CComega': 'test', - arrayProp: '[{"x":1,"y":2}]', + arrayProp: JSON.stringify([{ x: 1, y: 2 }]), 'nestedProp.innerProp1': 'innerPropVal1', 'nestedProp.innerProp2': 'innerPropVal2', }, @@ -560,7 +560,7 @@ export const data = [ fields: { country: 'USA', lastname: 'Mouse', - arrayProp: '[{"x":1,"y":2}]', + arrayProp: JSON.stringify([{ x: 1, y: 2 }]), 'nestedProp.innerProp1': 'innerPropVal1', 'nestedProp.innerProp2': 'innerPropVal2', firstname: 'Mickey', @@ -673,7 +673,7 @@ export const data = [ fields: { country: 'USA', lastname: 'Mouse', - arrayProp: '[{"x":1,"y":2}]', + arrayProp: JSON.stringify([{ x: 1, y: 2 }]), emptyKey: '', 'nestedProp.innerProp1': 'innerPropVal1', 'nestedProp.innerProp2': 'innerPropVal2', @@ -848,8 +848,13 @@ export const data = [ message: { hash: 'some-workspace-id:1WhcOCGgj9asZu850HvugU2C3Aq:some-entity:some-id-type:some-user-id', key: 'some-model', - value: - '{"MODEL_ID":"1691755780","VALID_AT":"2023-08-11T11:32:44.963062Z","USER_MAIN_ID":"rid5530313526204a95efe71d98cd17d5a1","CHURN_SCORE_7_DAYS":0.027986,"PERCENTILE_CHURN_SCORE_7_DAYS":0}', + value: JSON.stringify({ + MODEL_ID: '1691755780', + VALID_AT: '2023-08-11T11:32:44.963062Z', + USER_MAIN_ID: 'rid5530313526204a95efe71d98cd17d5a1', + CHURN_SCORE_7_DAYS: 0.027986, + PERCENTILE_CHURN_SCORE_7_DAYS: 0, + }), }, userId: 'some-user-id', }, diff --git a/test/integrations/destinations/refiner/maskedSecrets.ts b/test/integrations/destinations/refiner/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/refiner/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/refiner/processor/groupTestData.ts b/test/integrations/destinations/refiner/processor/groupTestData.ts index e3a05357f5a..d2abd03b148 100644 --- a/test/integrations/destinations/refiner/processor/groupTestData.ts +++ b/test/integrations/destinations/refiner/processor/groupTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { @@ -16,7 +17,7 @@ const destination: Destination = { Config: {}, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665474171943, @@ -29,7 +30,7 @@ const destination: Destination = { }; const headers = { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/x-www-form-urlencoded', }; @@ -62,6 +63,7 @@ export const groupTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/refiner/processor/identifyTestData.ts b/test/integrations/destinations/refiner/processor/identifyTestData.ts index cc3704bb451..41948215697 100644 --- a/test/integrations/destinations/refiner/processor/identifyTestData.ts +++ b/test/integrations/destinations/refiner/processor/identifyTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { @@ -16,7 +17,7 @@ const destination: Destination = { Config: {}, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665474171943, @@ -57,7 +58,7 @@ const expectedOutputUserTraits = { }; const headers = { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/x-www-form-urlencoded', }; @@ -88,6 +89,7 @@ export const identifyTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/refiner/processor/pageTestData.ts b/test/integrations/destinations/refiner/processor/pageTestData.ts index b6c782202eb..6249b65396e 100644 --- a/test/integrations/destinations/refiner/processor/pageTestData.ts +++ b/test/integrations/destinations/refiner/processor/pageTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { @@ -16,7 +17,7 @@ const destination: Destination = { Config: {}, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665474171943, @@ -41,7 +42,7 @@ const properties = { }; const headers = { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/x-www-form-urlencoded', }; @@ -75,6 +76,7 @@ export const pageTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/refiner/processor/trackTestData.ts b/test/integrations/destinations/refiner/processor/trackTestData.ts index e10ac6f0f58..aa21ad6f03a 100644 --- a/test/integrations/destinations/refiner/processor/trackTestData.ts +++ b/test/integrations/destinations/refiner/processor/trackTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { @@ -16,7 +17,7 @@ const destination: Destination = { Config: {}, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665474171943, @@ -53,7 +54,7 @@ const properties = { }; const headers = { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/x-www-form-urlencoded', }; @@ -85,6 +86,7 @@ export const trackTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/refiner/processor/validationTestData.ts b/test/integrations/destinations/refiner/processor/validationTestData.ts index 20a9694fdf6..4305626c1e8 100644 --- a/test/integrations/destinations/refiner/processor/validationTestData.ts +++ b/test/integrations/destinations/refiner/processor/validationTestData.ts @@ -1,3 +1,4 @@ +import { secret1 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { generateMetadata } from '../../../testUtils'; @@ -12,7 +13,7 @@ const destination: Destination = { Config: {}, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665474171943, @@ -83,6 +84,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -125,6 +127,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -166,6 +169,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { @@ -208,6 +212,7 @@ export const validationTestData: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/refiner/router/data.ts b/test/integrations/destinations/refiner/router/data.ts index 0ff75120d6d..9de7995f711 100644 --- a/test/integrations/destinations/refiner/router/data.ts +++ b/test/integrations/destinations/refiner/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'refiner', @@ -38,7 +39,7 @@ export const data = [ metadata: { jobId: 1, userId: 'u1' }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665475307930, @@ -82,7 +83,7 @@ export const data = [ endpoint: 'https://api.refiner.io/v1/identify-user', files: {}, headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/x-www-form-urlencoded', }, method: 'POST', @@ -92,7 +93,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665475307930, @@ -177,7 +178,7 @@ export const data = [ metadata: { jobId: 2, userId: 'u1' }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665475307930, @@ -210,7 +211,7 @@ export const data = [ endpoint: 'https://api.refiner.io/v1/track', files: {}, headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/x-www-form-urlencoded', }, method: 'POST', @@ -220,7 +221,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665475307930, @@ -269,7 +270,7 @@ export const data = [ destination: { Config: { accountAttributesMapping: [{ from: 'email', to: 'businessEmail' }], - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665476456112, @@ -307,7 +308,7 @@ export const data = [ endpoint: 'https://api.refiner.io/v1/identify-user', files: {}, headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/x-www-form-urlencoded', }, method: 'POST', @@ -318,7 +319,7 @@ export const data = [ destination: { Config: { accountAttributesMapping: [{ from: 'email', to: 'businessEmail' }], - apiKey: 'dummyApiKey', + apiKey: secret1, blacklistedEvents: [{ eventName: '' }], eventDelivery: true, eventDeliveryTS: 1665476456112, diff --git a/test/integrations/destinations/revenue_cat/maskedSecrets.ts b/test/integrations/destinations/revenue_cat/maskedSecrets.ts new file mode 100644 index 00000000000..e85cee2dd65 --- /dev/null +++ b/test/integrations/destinations/revenue_cat/maskedSecrets.ts @@ -0,0 +1,11 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const secret4 = path.basename(__dirname) + 4; +export const authHeader1 = `Basic ${secret1}`; +export const authHeader2 = `Basic ${secret2}`; +export const authHeader3 = `Basic ${secret3}`; +export const authHeader4 = `Basic ${secret4}`; diff --git a/test/integrations/destinations/revenue_cat/processor/data.ts b/test/integrations/destinations/revenue_cat/processor/data.ts index 84b7c5975f8..bd4a86b68b7 100644 --- a/test/integrations/destinations/revenue_cat/processor/data.ts +++ b/test/integrations/destinations/revenue_cat/processor/data.ts @@ -1,3 +1,13 @@ +import { + authHeader1, + secret1, + authHeader2, + secret2, + authHeader3, + secret3, + authHeader4, + secret4, +} from '../maskedSecrets'; export const data = [ { name: 'revenue_cat', @@ -11,7 +21,7 @@ export const data = [ { destination: { Config: { - apiKey: 'as9d920a5e75a18acb4a29abd9ec1e2e', + apiKey: secret1, xPlatform: 'stripe', }, }, @@ -89,7 +99,7 @@ export const data = [ method: 'GET', endpoint: 'https://api.revenuecat.com/v1/subscribers/rudder1235678', headers: { - Authorization: 'Basic as9d920a5e75a18acb4a29abd9ec1e2e', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -111,7 +121,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.revenuecat.com/v1/subscribers/rudder1235678/attributes', headers: { - Authorization: 'Basic as9d920a5e75a18acb4a29abd9ec1e2e', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -178,7 +188,7 @@ export const data = [ { destination: { Config: { - apiKey: 'a5e75dfda29abd920ec1ec8a18acb42e', + apiKey: secret2, xPlatform: 'stripe', }, }, @@ -256,7 +266,7 @@ export const data = [ method: 'GET', endpoint: 'https://api.revenuecat.com/v1/subscribers/rudder1235678', headers: { - Authorization: 'Basic a5e75dfda29abd920ec1ec8a18acb42e', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: {}, @@ -278,7 +288,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.revenuecat.com/v1/subscribers/rudder1235678/attributes', headers: { - Authorization: 'Basic a5e75dfda29abd920ec1ec8a18acb42e', + Authorization: authHeader2, 'Content-Type': 'application/json', }, params: {}, @@ -438,7 +448,7 @@ export const data = [ { destination: { Config: { - apiKey: 'a5e75d99c8a18acb4a29abd920ec1e2e', + apiKey: secret3, }, }, message: { @@ -510,7 +520,7 @@ export const data = [ method: 'GET', endpoint: 'https://api.revenuecat.com/v1/subscribers/rudder1235678', headers: { - Authorization: 'Basic a5e75d99c8a18acb4a29abd920ec1e2e', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: {}, @@ -532,7 +542,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.revenuecat.com/v1/subscribers/rudder1235678/attributes', headers: { - Authorization: 'Basic a5e75d99c8a18acb4a29abd920ec1e2e', + Authorization: authHeader3, 'Content-Type': 'application/json', }, params: {}, @@ -581,7 +591,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret4, }, }, message: { @@ -660,7 +670,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret4, xPlatform: 'stripe', }, }, @@ -719,7 +729,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.revenuecat.com/v1/receipts', headers: { - Authorization: 'Basic dummyApiKey', + Authorization: authHeader4, 'Content-Type': 'application/json', 'X-Platform': 'stripe', }, @@ -751,7 +761,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.revenuecat.com/v1/receipts', headers: { - Authorization: 'Basic dummyApiKey', + Authorization: authHeader4, 'Content-Type': 'application/json', 'X-Platform': 'stripe', }, @@ -792,7 +802,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret4, xPlatform: 'stripe', }, }, @@ -870,7 +880,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.revenuecat.com/v1/receipts', headers: { - Authorization: 'Basic dummyApiKey', + Authorization: authHeader4, 'Content-Type': 'application/json', 'X-Platform': 'stripe', }, @@ -902,7 +912,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.revenuecat.com/v1/receipts', headers: { - Authorization: 'Basic dummyApiKey', + Authorization: authHeader4, 'Content-Type': 'application/json', 'X-Platform': 'stripe', }, @@ -934,7 +944,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.revenuecat.com/v1/receipts', headers: { - Authorization: 'Basic dummyApiKey', + Authorization: authHeader4, 'Content-Type': 'application/json', 'X-Platform': 'stripe', }, @@ -966,7 +976,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.revenuecat.com/v1/receipts', headers: { - Authorization: 'Basic dummyApiKey', + Authorization: authHeader4, 'Content-Type': 'application/json', 'X-Platform': 'stripe', }, @@ -1007,7 +1017,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret4, xPlatform: 'stripe', }, }, @@ -1051,7 +1061,7 @@ export const data = [ method: 'POST', endpoint: 'https://api.revenuecat.com/v1/receipts', headers: { - Authorization: 'Basic dummyApiKey', + Authorization: authHeader4, 'Content-Type': 'application/json', 'X-Platform': 'stripe', }, diff --git a/test/integrations/destinations/salesforce/dataDelivery/business.ts b/test/integrations/destinations/salesforce/dataDelivery/business.ts index 5374e3fae22..76f00074492 100644 --- a/test/integrations/destinations/salesforce/dataDelivery/business.ts +++ b/test/integrations/destinations/salesforce/dataDelivery/business.ts @@ -1,9 +1,10 @@ import { ProxyMetdata } from '../../../../../src/types'; import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV1Payload } from '../../../testUtils'; +import { authHeader1 } from '../maskedSecrets'; const commonHeaders = { - Authorization: 'Bearer token', + Authorization: authHeader1, 'Content-Type': 'application/json', }; const params = { destination: 'salesforce' }; @@ -111,7 +112,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request for destination: salesforce Processed Successfully', response: [ { - error: '{"statusText":"No Content"}', + error: JSON.stringify({ statusText: 'No Content' }), metadata: proxyMetdata, statusCode: 200, }, @@ -153,8 +154,9 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Salesforce Request Failed: 500 - due to "Session expired or invalid", (Retryable) during Salesforce Response Handling', response: [ { - error: - '[{"message":"Session expired or invalid","errorCode":"INVALID_SESSION_ID"}]', + error: JSON.stringify([ + { message: 'Session expired or invalid', errorCode: 'INVALID_SESSION_ID' }, + ]), metadata: proxyMetdata, statusCode: 500, }, @@ -196,7 +198,9 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Salesforce Request Failed: "401" due to "INVALID_HEADER_TYPE", (Aborted) during Salesforce Response Handling', response: [ { - error: '[{"message":"INVALID_HEADER_TYPE","errorCode":"INVALID_AUTH_HEADER"}]', + error: JSON.stringify([ + { message: 'INVALID_HEADER_TYPE', errorCode: 'INVALID_AUTH_HEADER' }, + ]), metadata: proxyMetdata, statusCode: 400, }, @@ -237,8 +241,9 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Salesforce Request Failed - due to "REQUEST_LIMIT_EXCEEDED", (Throttled) during Salesforce Response Handling', response: [ { - error: - '[{"message":"Request limit exceeded","errorCode":"REQUEST_LIMIT_EXCEEDED"}]', + error: JSON.stringify([ + { message: 'Request limit exceeded', errorCode: 'REQUEST_LIMIT_EXCEEDED' }, + ]), metadata: proxyMetdata, statusCode: 429, }, @@ -280,7 +285,9 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Salesforce Request Failed: 503 - due to Server Unavailable, during Salesforce Response Handling', response: [ { - error: '[{"message":"Server Unavailable","errorCode":"SERVER_UNAVAILABLE"}]', + error: JSON.stringify([ + { message: 'Server Unavailable', errorCode: 'SERVER_UNAVAILABLE' }, + ]), metadata: proxyMetdata, statusCode: 429, }, @@ -323,7 +330,10 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Salesforce Request Failed: "400" due to "{"error":"invalid_grant","error_description":"authentication failure"}", (Aborted) during Salesforce Response Handling', response: [ { - error: '{"error":"invalid_grant","error_description":"authentication failure"}', + error: JSON.stringify({ + error: 'invalid_grant', + error_description: 'authentication failure', + }), metadata: proxyMetdata, statusCode: 400, }, @@ -365,8 +375,26 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request for destination: salesforce Processed Successfully', response: [ { - error: - '{"searchRecords":[{"attributes":{"type":"object_name","url":"/services/data/v50.0/sobjects/object_name/a0J75100002w97gEAA"},"Id":"a0J75100002w97gEAA","External_ID__c":"external_id"},{"attributes":{"type":"object_name","url":"/services/data/v50.0/sobjects/object_name/a0J75200002w9ZsEAI"},"Id":"a0J75200002w9ZsEAI","External_ID__c":"external_id TEST"}]}', + error: JSON.stringify({ + searchRecords: [ + { + attributes: { + type: 'object_name', + url: '/services/data/v50.0/sobjects/object_name/a0J75100002w97gEAA', + }, + Id: 'a0J75100002w97gEAA', + External_ID__c: 'external_id', + }, + { + attributes: { + type: 'object_name', + url: '/services/data/v50.0/sobjects/object_name/a0J75200002w9ZsEAI', + }, + Id: 'a0J75200002w9ZsEAI', + External_ID__c: 'external_id TEST', + }, + ], + }), metadata: proxyMetdata, statusCode: 200, }, diff --git a/test/integrations/destinations/salesforce/dataDelivery/data.ts b/test/integrations/destinations/salesforce/dataDelivery/data.ts index f157161751b..568a2564dd5 100644 --- a/test/integrations/destinations/salesforce/dataDelivery/data.ts +++ b/test/integrations/destinations/salesforce/dataDelivery/data.ts @@ -2,6 +2,7 @@ import { AxiosError } from 'axios'; import MockAdapter from 'axios-mock-adapter'; import { testScenariosForV1API } from './business'; import { otherSalesforceScenariosV1 } from './other'; +import { authHeader1, authHeader2 } from '../maskedSecrets'; const legacyDataValue = { Email: 'danis.archurav@sbermarket.ru', @@ -28,7 +29,7 @@ const legacyTests = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, version: '1', endpoint: 'https://rudderstack.my.salesforce.com/services/data/v50.0/sobjects/Lead/1', @@ -83,7 +84,7 @@ const legacyTests = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, version: '1', endpoint: 'https://rudderstack.my.salesforce.com/services/data/v50.0/sobjects/Lead/3', @@ -152,7 +153,7 @@ const legacyTests = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer Incorrect_token', + Authorization: authHeader2, }, version: '1', endpoint: 'https://rudderstack.my.salesforce.com/services/data/v50.0/sobjects/Lead/2', @@ -221,7 +222,7 @@ const legacyTests = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, version: '1', endpoint: 'https://rudderstack.my.salesforce.com/services/data/v50.0/sobjects/Lead/4', @@ -290,7 +291,7 @@ const legacyTests = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, version: '1', endpoint: 'https://rudderstack.my.salesforce.com/services/data/v50.0/sobjects/Lead/5', @@ -359,7 +360,7 @@ const legacyTests = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, version: '1', endpoint: 'https://rudderstack.my.salesforce.com/services/data/v50.0/sobjects/Lead/6', @@ -426,7 +427,7 @@ const legacyTests = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, version: '1', endpoint: 'https://rudderstack.my.salesforce.com/services/data/v50.0/sobjects/Lead/7', @@ -493,7 +494,7 @@ const legacyTests = [ 'https://rudderstack.my.salesforce.com/services/data/v50.0/parameterizedSearch/?q=123&sobject=object_name&in=External_ID__c&object_name.fields=id,External_ID__c', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, body: { JSON: { @@ -567,7 +568,7 @@ const legacyTests = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, version: '1', endpoint: 'https://rudderstack.my.salesforce.com/services/data/v50.0/sobjects/Lead/101', @@ -637,7 +638,7 @@ const legacyTests = [ }, { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', Accept: 'application/json, text/plain, */*', }, @@ -660,7 +661,7 @@ const legacyTests = [ userId: '', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, version: '1', endpoint: 'https://rudder.my.salesforce.com/services/data/v50.0/sobjects/Lead/102', @@ -730,7 +731,7 @@ const legacyTests = [ }, { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', Accept: 'application/json, text/plain, */*', }, diff --git a/test/integrations/destinations/salesforce/dataDelivery/other.ts b/test/integrations/destinations/salesforce/dataDelivery/other.ts index 8bf154de9b5..2a01ad6253c 100644 --- a/test/integrations/destinations/salesforce/dataDelivery/other.ts +++ b/test/integrations/destinations/salesforce/dataDelivery/other.ts @@ -1,5 +1,6 @@ import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV1Payload } from '../../../testUtils'; +import { defaultAccessToken } from '../../../common/secrets'; const statTags = { errorCategory: 'network', @@ -19,7 +20,7 @@ const metadata = { workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }; @@ -50,8 +51,13 @@ export const otherSalesforceScenariosV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"message":"Service Unavailable","description":"The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later."}}', + error: JSON.stringify({ + error: { + message: 'Service Unavailable', + description: + 'The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later.', + }, + }), statusCode: 500, metadata, }, diff --git a/test/integrations/destinations/salesforce/maskedSecrets.ts b/test/integrations/destinations/salesforce/maskedSecrets.ts new file mode 100644 index 00000000000..61db9ef38a9 --- /dev/null +++ b/test/integrations/destinations/salesforce/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; diff --git a/test/integrations/destinations/salesforce/network.ts b/test/integrations/destinations/salesforce/network.ts index b4cff85d7ba..32b9cf157a1 100644 --- a/test/integrations/destinations/salesforce/network.ts +++ b/test/integrations/destinations/salesforce/network.ts @@ -1,5 +1,6 @@ +import { authHeader1, authHeader2, secret1 } from './maskedSecrets'; const commonHeaders = { - Authorization: 'Bearer token', + Authorization: authHeader1, 'Content-Type': 'application/json', }; @@ -20,7 +21,7 @@ const tfProxyMocksData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -37,7 +38,7 @@ const tfProxyMocksData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -54,7 +55,7 @@ const tfProxyMocksData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, method: 'POST', }, @@ -70,7 +71,7 @@ const tfProxyMocksData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -87,7 +88,7 @@ const tfProxyMocksData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -104,7 +105,7 @@ const tfProxyMocksData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -121,7 +122,7 @@ const tfProxyMocksData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, }, method: 'POST', }, @@ -140,7 +141,7 @@ const tfProxyMocksData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -180,7 +181,7 @@ const transformationMocksData = [ httpRes: { status: 200, data: { - access_token: 'dummy.access.token', + access_token: secret1, instance_url: 'https://ap15.salesforce.com', id: 'https://login.salesforce.com/id/00D2v000002lXbXEAU/0052v00000ga9WqAAI', token_type: 'Bearer', @@ -197,7 +198,7 @@ const transformationMocksData = [ httpRes: { status: 200, data: { - access_token: 'dummy.access.token', + access_token: secret1, instance_url: 'https://ap15.salesforce.com', id: 'https://login.salesforce.com/id/00D2v000002lXbXEAU/0052v00000ga9WqAAI', token_type: 'Bearer', @@ -374,7 +375,7 @@ const businessMockData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer Incorrect_token', + Authorization: authHeader2, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -391,7 +392,7 @@ const businessMockData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -408,7 +409,7 @@ const businessMockData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -425,7 +426,7 @@ const businessMockData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -442,7 +443,7 @@ const businessMockData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', @@ -462,7 +463,7 @@ const businessMockData = [ params: { destination: 'salesforce' }, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer token', + Authorization: authHeader1, 'User-Agent': 'RudderLabs', }, method: 'POST', diff --git a/test/integrations/destinations/salesforce/processor/data.ts b/test/integrations/destinations/salesforce/processor/data.ts index b33b75b55bd..61d9a6f68db 100644 --- a/test/integrations/destinations/salesforce/processor/data.ts +++ b/test/integrations/destinations/salesforce/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, authHeader2, secret2 } from '../maskedSecrets'; export const data = [ { name: 'salesforce', @@ -97,7 +98,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -224,7 +225,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -352,7 +353,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -588,7 +589,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -717,7 +718,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -850,7 +851,7 @@ export const data = [ 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Contact/sf-contact-id?_HttpMethod=PATCH', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -983,7 +984,7 @@ export const data = [ 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead/sf-contact-id?_HttpMethod=PATCH', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, userId: '', @@ -1110,7 +1111,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -1236,7 +1237,7 @@ export const data = [ 'https://ap15.salesforce.com/services/data/v50.0/sobjects/custom_object__c/a005g0000383kmUAAQ?_HttpMethod=PATCH', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -1351,7 +1352,7 @@ export const data = [ 'https://ap15.salesforce.com/services/data/v50.0/sobjects/custom_object__c/a005g0000383kmUAAQ?_HttpMethod=PATCH', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -1400,7 +1401,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret2, instance_url: 'http://dummyurl.com', }, }, @@ -1467,7 +1468,7 @@ export const data = [ statusCode: 200, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret2, instance_url: 'http://dummyurl.com', }, }, @@ -1479,7 +1480,7 @@ export const data = [ 'http://dummyurl.com/services/data/v50.0/sobjects/custom_object__c/a005g0000383kmUAAQ?_HttpMethod=PATCH', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader2, }, params: {}, body: { diff --git a/test/integrations/destinations/salesforce/router/data.ts b/test/integrations/destinations/salesforce/router/data.ts index 9e26625188f..69da683573d 100644 --- a/test/integrations/destinations/salesforce/router/data.ts +++ b/test/integrations/destinations/salesforce/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; export const data = [ { name: 'salesforce', @@ -92,7 +93,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -238,7 +239,7 @@ export const data = [ 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead/leadId?_HttpMethod=PATCH', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -383,7 +384,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -453,7 +454,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -515,7 +516,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/Lead', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -668,7 +669,7 @@ export const data = [ endpoint: 'https://ap15.salesforce.com/services/data/v50.0/sobjects/customobject', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -826,7 +827,7 @@ export const data = [ 'https://ap15.salesforce.com/services/data/v50.0/sobjects/customobject2/id1101?_HttpMethod=PATCH', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { @@ -984,7 +985,7 @@ export const data = [ 'https://ap15.salesforce.com/services/data/v50.0/sobjects/customobject2/id1102?_HttpMethod=PATCH', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummy.access.token', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/salesforce_oauth/dataDelivery/oauth.ts b/test/integrations/destinations/salesforce_oauth/dataDelivery/oauth.ts index 55eaa9cca1e..7924571524b 100644 --- a/test/integrations/destinations/salesforce_oauth/dataDelivery/oauth.ts +++ b/test/integrations/destinations/salesforce_oauth/dataDelivery/oauth.ts @@ -1,14 +1,15 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { ProxyMetdata } from '../../../../../src/types'; import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV1Payload } from '../../../testUtils'; const commonHeadersForWrongToken = { - Authorization: 'Bearer expiredAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }; const commonHeadersForRightToken = { - Authorization: 'Bearer correctAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }; const params = { destination: 'salesforce_oauth' }; @@ -57,7 +58,7 @@ export const proxyMetdataWithSecretWithWrongAccessToken: ProxyMetdata = { destinationId: 'dummyDestinationId', workspaceId: 'dummyWorkspaceId', secret: { - access_token: 'expiredAccessToken', + access_token: secret1, instanceUrl: 'https://rudderstack.my.salesforce_oauth.com', }, destInfo: { authKey: 'dummyDestinationId' }, @@ -117,8 +118,9 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Salesforce Request Failed - due to "INVALID_SESSION_ID", (Retryable) during Salesforce Response Handling', response: [ { - error: - '[{"message":"Session expired or invalid","errorCode":"INVALID_SESSION_ID"}]', + error: JSON.stringify([ + { message: 'Session expired or invalid', errorCode: 'INVALID_SESSION_ID' }, + ]), metadata: proxyMetdataWithSecretWithWrongAccessToken, statusCode: 500, }, @@ -161,7 +163,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request for destination: salesforce Processed Successfully', response: [ { - error: '{"statusText":"No Content"}', + error: JSON.stringify({ statusText: 'No Content' }), metadata: proxyMetdataWithSecretWithRightAccessToken, statusCode: 200, }, diff --git a/test/integrations/destinations/salesforce_oauth/maskedSecrets.ts b/test/integrations/destinations/salesforce_oauth/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/salesforce_oauth/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/salesforce_oauth/network.ts b/test/integrations/destinations/salesforce_oauth/network.ts index ae5f9d3fe49..951fac1bb3c 100644 --- a/test/integrations/destinations/salesforce_oauth/network.ts +++ b/test/integrations/destinations/salesforce_oauth/network.ts @@ -1,10 +1,11 @@ +import { authHeader1 } from './maskedSecrets'; const headerWithWrongAccessToken = { - Authorization: 'Bearer expiredAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }; const headerWithRightAccessToken = { - Authorization: 'Bearer correctAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }; diff --git a/test/integrations/destinations/salesforce_oauth_sandbox/dataDelivery/oauth.ts b/test/integrations/destinations/salesforce_oauth_sandbox/dataDelivery/oauth.ts index 30ee516e724..f09548e7147 100644 --- a/test/integrations/destinations/salesforce_oauth_sandbox/dataDelivery/oauth.ts +++ b/test/integrations/destinations/salesforce_oauth_sandbox/dataDelivery/oauth.ts @@ -1,14 +1,15 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { ProxyMetdata } from '../../../../../src/types'; import { ProxyV1TestData } from '../../../testTypes'; import { generateProxyV1Payload } from '../../../testUtils'; const commonHeadersForWrongToken = { - Authorization: 'Bearer expiredAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }; const commonHeadersForRightToken = { - Authorization: 'Bearer correctAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }; const params = { destination: 'salesforce_oauth_sandbox' }; @@ -57,7 +58,7 @@ export const proxyMetdataWithSecretWithWrongAccessToken: ProxyMetdata = { destinationId: 'dummyDestinationId', workspaceId: 'dummyWorkspaceId', secret: { - access_token: 'expiredAccessToken', + access_token: secret1, instanceUrl: 'https://rudderstack.my.salesforce_oauth_sandbox.com', }, destInfo: { authKey: 'dummyDestinationId' }, @@ -117,8 +118,9 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ 'Salesforce Request Failed - due to "INVALID_SESSION_ID", (Retryable) during Salesforce Response Handling', response: [ { - error: - '[{"message":"Session expired or invalid","errorCode":"INVALID_SESSION_ID"}]', + error: JSON.stringify([ + { message: 'Session expired or invalid', errorCode: 'INVALID_SESSION_ID' }, + ]), metadata: proxyMetdataWithSecretWithWrongAccessToken, statusCode: 500, }, @@ -161,7 +163,7 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ message: 'Request for destination: salesforce Processed Successfully', response: [ { - error: '{"statusText":"No Content"}', + error: JSON.stringify({ statusText: 'No Content' }), metadata: proxyMetdataWithSecretWithRightAccessToken, statusCode: 200, }, diff --git a/test/integrations/destinations/salesforce_oauth_sandbox/maskedSecrets.ts b/test/integrations/destinations/salesforce_oauth_sandbox/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/salesforce_oauth_sandbox/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/salesforce_oauth_sandbox/network.ts b/test/integrations/destinations/salesforce_oauth_sandbox/network.ts index 09d2c759d2e..d917d80b8c8 100644 --- a/test/integrations/destinations/salesforce_oauth_sandbox/network.ts +++ b/test/integrations/destinations/salesforce_oauth_sandbox/network.ts @@ -1,10 +1,11 @@ +import { authHeader1 } from './maskedSecrets'; const headerWithWrongAccessToken = { - Authorization: 'Bearer expiredAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }; const headerWithRightAccessToken = { - Authorization: 'Bearer correctAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }; diff --git a/test/integrations/destinations/segment/maskedSecrets.ts b/test/integrations/destinations/segment/maskedSecrets.ts new file mode 100644 index 00000000000..ba0b28ba8a1 --- /dev/null +++ b/test/integrations/destinations/segment/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${base64Convertor(secret1 + ':' + '')}`; diff --git a/test/integrations/destinations/segment/processor/data.ts b/test/integrations/destinations/segment/processor/data.ts index 9ba9601d6ef..051c493877c 100644 --- a/test/integrations/destinations/segment/processor/data.ts +++ b/test/integrations/destinations/segment/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'segment', @@ -22,7 +23,7 @@ export const data = [ }, }, Config: { - writeKey: 'abcdefghijklmnopqrstuvwxyz', + writeKey: secret1, }, Enabled: true, Transformations: [], @@ -102,7 +103,7 @@ export const data = [ endpoint: 'https://api.segment.io/v1/batch', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6', + Authorization: authHeader1, }, params: {}, body: { @@ -164,7 +165,7 @@ export const data = [ }, }, Config: { - writeKey: 'abcdefghijklmnopqrstuvwxyz', + writeKey: secret1, }, Enabled: true, Transformations: [], @@ -236,7 +237,7 @@ export const data = [ endpoint: 'https://api.segment.io/v1/batch', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6', + Authorization: authHeader1, }, params: {}, body: { @@ -291,7 +292,7 @@ export const data = [ }, }, Config: { - writeKey: 'abcdefghijklmnopqrstuvwxyz', + writeKey: secret1, }, Enabled: true, Transformations: [], @@ -368,7 +369,7 @@ export const data = [ endpoint: 'https://api.segment.io/v1/batch', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6', + Authorization: authHeader1, }, params: {}, body: { @@ -428,7 +429,7 @@ export const data = [ }, }, Config: { - writeKey: 'abcdefghijklmnopqrstuvwxyz', + writeKey: secret1, }, Enabled: true, Transformations: [], @@ -506,7 +507,7 @@ export const data = [ endpoint: 'https://api.segment.io/v1/batch', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6', + Authorization: authHeader1, }, params: {}, body: { @@ -568,7 +569,7 @@ export const data = [ }, }, Config: { - writeKey: 'abcdefghijklmnopqrstuvwxyz', + writeKey: secret1, }, Enabled: true, Transformations: [], @@ -639,7 +640,7 @@ export const data = [ endpoint: 'https://api.segment.io/v1/batch', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo6', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/sendgrid/deleteUsers/data.ts b/test/integrations/destinations/sendgrid/deleteUsers/data.ts index 85c6e1275f1..c7846826dc0 100644 --- a/test/integrations/destinations/sendgrid/deleteUsers/data.ts +++ b/test/integrations/destinations/sendgrid/deleteUsers/data.ts @@ -1,3 +1,5 @@ +import { secret1 } from '../maskedSecrets'; + export const data = [ { name: 'sendgrid', @@ -581,7 +583,7 @@ export const data = [ }, ], config: { - apiKey: '1234', + apiKey: secret1, }, }, ], @@ -1185,7 +1187,7 @@ export const data = [ }, ], config: { - apiKey: '1234', + apiKey: secret1, }, }, ], @@ -1254,7 +1256,7 @@ export const data = [ userId: 'eab57ccf-6322-498e-9338-7761c6dc0656', }, config: { - apiKey: '1234', + apiKey: secret1, }, }, ], diff --git a/test/integrations/destinations/sendgrid/maskedSecrets.ts b/test/integrations/destinations/sendgrid/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/sendgrid/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/sendgrid/network.ts b/test/integrations/destinations/sendgrid/network.ts index 29cfbf84463..93c3a3a5244 100644 --- a/test/integrations/destinations/sendgrid/network.ts +++ b/test/integrations/destinations/sendgrid/network.ts @@ -1,10 +1,11 @@ +import { authHeader1 } from './maskedSecrets'; const deleteNwData = [ { httpReq: { method: 'delete', url: 'https://api.sendgrid.com/v3/marketing/contacts?ids=test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id', headers: { - Authorization: 'Bearer 1234', + Authorization: authHeader1, }, }, httpRes: { @@ -22,7 +23,7 @@ const deleteNwData = [ method: 'delete', url: 'https://api.sendgrid.com/v3/marketing/contacts?ids=user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2', headers: { - Authorization: 'Bearer 1234', + Authorization: authHeader1, }, }, httpRes: { @@ -39,7 +40,7 @@ const deleteNwData = [ method: 'delete', url: 'https://api.sendgrid.com/v3/marketing/contacts?ids=[user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2]', headers: { - Authorization: 'Bearer 1234', + Authorization: authHeader1, }, }, httpRes: { @@ -57,7 +58,7 @@ const deleteNwData = [ method: 'delete', url: 'https://api.sendgrid.com/v3/marketing/contacts?ids=[user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2]', headers: { - Authorization: 'Bearer 1234', + Authorization: authHeader1, }, }, httpRes: { @@ -75,7 +76,7 @@ const deleteNwData = [ method: 'delete', url: 'https://api.sendgrid.com/v3/marketing/contacts?ids=test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id', headers: { - Authorization: 'Bearer 1234', + Authorization: authHeader1, }, }, httpRes: { @@ -93,7 +94,7 @@ const deleteNwData = [ method: 'delete', url: 'https://api.sendgrid.com/v3/marketing/contacts?ids=user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2,test_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_idtest_user_id,user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2user_sdk2', headers: { - Authorization: 'Bearer 1234', + Authorization: authHeader1, }, }, httpRes: { @@ -111,7 +112,7 @@ const deleteNwData = [ method: 'get', url: 'https://api.sendgrid.com/v3/marketing/field_definitions', headers: { - Authorization: 'Bearer apikey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, }, diff --git a/test/integrations/destinations/sendgrid/processor/data.ts b/test/integrations/destinations/sendgrid/processor/data.ts index 4c5ca7f48f6..f1e208d15b6 100644 --- a/test/integrations/destinations/sendgrid/processor/data.ts +++ b/test/integrations/destinations/sendgrid/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'sendgrid', @@ -12,7 +13,7 @@ export const data = [ destination: { Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -114,7 +115,7 @@ export const data = [ destination: { Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -196,7 +197,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/marketing/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -237,7 +238,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -344,7 +345,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.sendgrid.com/v3/marketing/contacts', @@ -367,7 +368,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey', + apiKey: secret1, eventNamesSettings: [ { event: 'testing', @@ -466,7 +467,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/mail/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -521,7 +522,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey', + apiKey: secret1, eventNamesSettings: [ { event: 'testing', @@ -622,7 +623,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/mail/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -677,7 +678,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey', + apiKey: secret1, eventNamesSettings: [ { event: 'testing', @@ -790,7 +791,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/mail/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -849,7 +850,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey', + apiKey: secret1, eventNamesSettings: [ { event: 'testing', @@ -982,7 +983,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey', + apiKey: secret1, eventNamesSettings: [ { event: 'testing', @@ -1101,7 +1102,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/mail/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -1166,7 +1167,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey', + apiKey: secret1, eventNamesSettings: [ { event: 'testing', @@ -1288,7 +1289,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/mail/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -1353,7 +1354,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey', + apiKey: secret1, eventNamesSettings: [ { event: 'testing', @@ -1479,7 +1480,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/mail/send', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -1555,7 +1556,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -1663,7 +1664,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://api.sendgrid.com/v3/marketing/contacts', diff --git a/test/integrations/destinations/sendgrid/router/data.ts b/test/integrations/destinations/sendgrid/router/data.ts index e9ef6712267..9db23e885bb 100644 --- a/test/integrations/destinations/sendgrid/router/data.ts +++ b/test/integrations/destinations/sendgrid/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'sendgrid', @@ -12,7 +13,7 @@ export const data = [ { destination: { Config: { - apiKey: 'apikey', + apiKey: secret1, eventNamesSettings: [{ event: 'testing' }, { event: 'clicked' }], subject: 'A sample subject', replyToEmail: 'ankit@rudderstack.com', @@ -101,7 +102,7 @@ export const data = [ files: {}, method: 'POST', params: {}, - headers: { Authorization: 'Bearer apikey', 'Content-Type': 'application/json' }, + headers: { Authorization: authHeader1, 'Content-Type': 'application/json' }, version: '1', endpoint: 'https://api.sendgrid.com/v3/mail/send', }, @@ -110,7 +111,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'apikey', + apiKey: secret1, eventNamesSettings: [{ event: 'testing' }, { event: 'clicked' }], subject: 'A sample subject', replyToEmail: 'ankit@rudderstack.com', @@ -152,7 +153,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -226,7 +227,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -300,7 +301,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -375,7 +376,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -451,7 +452,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -518,7 +519,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -610,7 +611,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/marketing/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -640,7 +641,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -692,7 +693,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/marketing/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -721,7 +722,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -773,7 +774,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/marketing/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -805,7 +806,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -857,7 +858,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/marketing/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -890,7 +891,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -942,7 +943,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/marketing/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -971,7 +972,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', @@ -1023,7 +1024,7 @@ export const data = [ endpoint: 'https://api.sendgrid.com/v3/marketing/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer apikey', + Authorization: authHeader1, }, params: {}, body: { @@ -1058,7 +1059,7 @@ export const data = [ ID: '2HOQOO6wWKaKjeQrEABXgiH6cmU', Config: { IPPoolName: '', - apiKey: 'apikey', + apiKey: secret1, attachments: [ { content: '', diff --git a/test/integrations/destinations/sfmc/maskedSecrets.ts b/test/integrations/destinations/sfmc/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/sfmc/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/sfmc/network.ts b/test/integrations/destinations/sfmc/network.ts index 93854e36910..84b312206b3 100644 --- a/test/integrations/destinations/sfmc/network.ts +++ b/test/integrations/destinations/sfmc/network.ts @@ -1,3 +1,4 @@ +import { secret1 } from './maskedSecrets'; export const networkCallsData = [ { httpReq: { @@ -7,7 +8,7 @@ export const networkCallsData = [ httpRes: { status: 200, data: { - access_token: 'yourAuthToken', + access_token: secret1, }, }, }, diff --git a/test/integrations/destinations/sfmc/processor/data.ts b/test/integrations/destinations/sfmc/processor/data.ts index e8d9375e43c..c0f647c8ace 100644 --- a/test/integrations/destinations/sfmc/processor/data.ts +++ b/test/integrations/destinations/sfmc/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; export const data = [ { name: 'sfmc', @@ -210,7 +211,7 @@ export const data = [ 'https://vcn7AQ2W9GGIAZSsN6Mfq.rest.marketingcloudapis.com/contacts/v1/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, params: {}, body: { @@ -236,7 +237,7 @@ export const data = [ 'https://vcn7AQ2W9GGIAZSsN6Mfq.rest.marketingcloudapis.com/hub/v1/dataevents/key:f3ffa19b-e0b3-4967-829f-549b781080e6/rows/Contact Key:12345', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, params: {}, body: { @@ -710,7 +711,7 @@ export const data = [ 'https://vcn7AQ2W9GGIAZSsN6Mfq.rest.marketingcloudapis.com/contacts/v1/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, params: {}, body: { @@ -736,7 +737,7 @@ export const data = [ 'https://vcn7AQ2W9GGIAZSsN6Mfq.rest.marketingcloudapis.com/hub/v1/dataevents/key:f3ffa19b-e0b3-4967-829f-549b781080e6/rows/Contact Key:12345', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, params: {}, body: { @@ -902,7 +903,7 @@ export const data = [ 'https://vcn7AQ2W9GGIAZSsN6Mfq.rest.marketingcloudapis.com/hub/v1/dataevents/key:C500FD37-155C-49BD-A21B-AFCEF3D1A9CB/rows/Contact Key:12345', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, params: {}, body: { @@ -1106,7 +1107,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, version: '1', endpoint: @@ -1549,7 +1550,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, version: '1', endpoint: @@ -1719,7 +1720,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, version: '1', endpoint: @@ -1881,7 +1882,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, version: '1', endpoint: @@ -1986,8 +1987,15 @@ export const data = [ status: 200, body: [ { - error: - '{"message":"Could not retrieve access token","destinationResponse":{"error":"invalid_client","error_description":"Invalid client ID. Use the client ID in Marketing Cloud Installed Packages.","error_uri":"https://developer.salesforce.com/docs"}}', + error: JSON.stringify({ + message: 'Could not retrieve access token', + destinationResponse: { + error: 'invalid_client', + error_description: + 'Invalid client ID. Use the client ID in Marketing Cloud Installed Packages.', + error_uri: 'https://developer.salesforce.com/docs', + }, + }), statTags: { destType: 'SFMC', errorCategory: 'network', @@ -2058,8 +2066,15 @@ export const data = [ status: 200, body: [ { - error: - '{"message":"Could not retrieve access token","destinationResponse":{"message":"Your requests are temporarily blocked.","errorcode":50200,"documentation":"https://developer.salesforce.com/docs/atlas.en-us.mc-apis.meta/mc-apis/error-handling.htm"}}', + error: JSON.stringify({ + message: 'Could not retrieve access token', + destinationResponse: { + message: 'Your requests are temporarily blocked.', + errorcode: 50200, + documentation: + 'https://developer.salesforce.com/docs/atlas.en-us.mc-apis.meta/mc-apis/error-handling.htm', + }, + }), statTags: { destType: 'SFMC', errorCategory: 'network', @@ -2130,7 +2145,10 @@ export const data = [ status: 200, body: [ { - error: '{"message":"Could not retrieve access token","destinationResponse":{}}', + error: JSON.stringify({ + message: 'Could not retrieve access token', + destinationResponse: {}, + }), statTags: { destType: 'SFMC', errorCategory: 'network', @@ -2303,7 +2321,7 @@ export const data = [ 'https://vcn7AQ2W9GGIAZSsN6Mfq.rest.marketingcloudapis.com/hub/v1/dataevents/key:externalKey/rows/key1:someRandomEmail@test.com', files: {}, headers: { - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'PUT', diff --git a/test/integrations/destinations/sfmc/router/data.ts b/test/integrations/destinations/sfmc/router/data.ts index 7707e709f43..ac2fd1e6990 100644 --- a/test/integrations/destinations/sfmc/router/data.ts +++ b/test/integrations/destinations/sfmc/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1 } from '../maskedSecrets'; export const data = [ { name: 'sfmc', @@ -237,7 +238,7 @@ export const data = [ 'https://vcn7AQ2W9GGIAZSsN6Mfq.rest.marketingcloudapis.com/contacts/v1/contacts', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, params: {}, body: { @@ -259,7 +260,7 @@ export const data = [ 'https://vcn7AQ2W9GGIAZSsN6Mfq.rest.marketingcloudapis.com/hub/v1/dataevents/key:f3ffa19b-e0b3-4967-829f-549b781080e6/rows/Contact Key:12345', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer yourAuthToken', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/signl4/processor/data.ts b/test/integrations/destinations/signl4/processor/data.ts index 11dc6fbadb6..3a3105bdeca 100644 --- a/test/integrations/destinations/signl4/processor/data.ts +++ b/test/integrations/destinations/signl4/processor/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'signl4', @@ -37,7 +39,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: 'service', s4ServiceProperty: '', s4LocationValue: '67.3, 32.3', @@ -66,7 +68,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://connect.signl4.com/webhook/dummyApiKey', + endpoint: `https://connect.signl4.com/webhook/${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -132,7 +134,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: 'service', s4ServiceProperty: '', s4LocationValue: '67.3, 32.3', @@ -161,7 +163,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://connect.signl4.com/webhook/dummyApiKey', + endpoint: `https://connect.signl4.com/webhook/${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -236,7 +238,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: '', s4ServiceProperty: 's4Service', s4LocationValue: '', @@ -265,7 +267,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://connect.signl4.com/webhook/dummyApiKey', + endpoint: `https://connect.signl4.com/webhook/${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -340,7 +342,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: 'defaultServiceValue', s4ServiceProperty: 's4Service', s4LocationValue: 'defaultLocationValue', @@ -369,7 +371,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://connect.signl4.com/webhook/dummyApiKey', + endpoint: `https://connect.signl4.com/webhook/${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -435,7 +437,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: 'service', s4ServiceProperty: '', s4LocationValue: '67.3, 32.3', @@ -591,7 +593,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: 'service', s4ServiceProperty: '', s4LocationValue: '67.3, 32.3', @@ -669,7 +671,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: 'service', s4ServiceProperty: '', s4LocationValue: '67.3, 32.3', diff --git a/test/integrations/destinations/signl4/router/data.ts b/test/integrations/destinations/signl4/router/data.ts index 0fcf55d0465..af93571158e 100644 --- a/test/integrations/destinations/signl4/router/data.ts +++ b/test/integrations/destinations/signl4/router/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'signl4', @@ -12,7 +14,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: 'service', s4ServiceProperty: '', s4LocationValue: '67.3, 32.3', @@ -71,7 +73,7 @@ export const data = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://connect.signl4.com/webhook/dummyApiKey', + endpoint: `https://connect.signl4.com/webhook/${defaultApiKey}`, headers: { 'Content-Type': 'application/json' }, params: {}, body: { @@ -97,7 +99,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: 'service', s4ServiceProperty: '', s4LocationValue: '67.3, 32.3', @@ -131,7 +133,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: 'service', s4ServiceProperty: '', s4LocationValue: '67.3, 32.3', @@ -188,7 +190,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, s4ServiceValue: 'service', s4ServiceProperty: '', s4LocationValue: '67.3, 32.3', diff --git a/test/integrations/destinations/singular/processor/data.ts b/test/integrations/destinations/singular/processor/data.ts index 6e749dd0a01..7daac907101 100644 --- a/test/integrations/destinations/singular/processor/data.ts +++ b/test/integrations/destinations/singular/processor/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'singular', @@ -11,7 +13,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -135,7 +137,7 @@ export const data = [ install_time: 1630511211, update_time: 1630511211, ua: 'Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)', - a: 'dummyApiKey', + a: defaultApiKey, }, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, files: {}, @@ -159,7 +161,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -273,7 +275,7 @@ export const data = [ receipt_signature: '1234dfghnh', purchase_product_id: '789', c: 'wifi', - a: 'dummyApiKey', + a: defaultApiKey, e: { url: 'myapp%3A%2F%2Fhome%2Fpage%3Fqueryparam1%3Dvalue1', install: 'SM-G935F', @@ -320,7 +322,7 @@ export const data = [ amt: 6.9, asid: 'IISqwYJKoZIcNqts0jvcNvPc', receipt_signature: '1234dfghnh', - a: 'dummyApiKey', + a: defaultApiKey, c: 'wifi', e: { url: 'myapp%3A%2F%2Fhome%2Fpage%3Fqueryparam1%3Dvalue1', @@ -361,7 +363,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -470,7 +472,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -588,7 +590,7 @@ export const data = [ openuri: 'myapp%3A%2F%2Fhome%2Fpage%3Fqueryparam1%3Dvalue1', install_source: '', c: 'wifi', - a: 'dummyApiKey', + a: defaultApiKey, }, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, files: {}, @@ -612,7 +614,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -721,7 +723,7 @@ export const data = [ receipt_signature: '1234dfghnh', amt: 20, is_revenue_event: true, - a: 'dummyApiKey', + a: defaultApiKey, c: 'wifi', e: { url: 'myapp%3A%2F%2Fhome%2Fpage%3Fqueryparam1%3Dvalue1', @@ -763,7 +765,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -875,7 +877,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -988,7 +990,7 @@ export const data = [ install_time: 1630511211, update_time: 1630511211, ua: 'Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)', - a: 'dummyApiKey', + a: defaultApiKey, }, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, files: {}, @@ -1012,7 +1014,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -1125,7 +1127,7 @@ export const data = [ install_time: 1630511211, update_time: 1630511211, ua: 'Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)', - a: 'dummyApiKey', + a: defaultApiKey, }, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, files: {}, @@ -1149,7 +1151,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -1255,7 +1257,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -1376,7 +1378,7 @@ export const data = [ idfv: 'fc8d449516de0dfb', install_time: 1630511211, update_time: 1630511211, - a: 'dummyApiKey', + a: defaultApiKey, }, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, files: {}, @@ -1400,7 +1402,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -1509,7 +1511,7 @@ export const data = [ purchase_transaction_id: '2134dfg', idfa: '8ecd7512-2864-440c-93f3-a3cabe62525b', idfv: 'fc8d449516de0dfb', - a: 'dummyApiKey', + a: defaultApiKey, c: 'carrier', e: { asid: 'IISqwYJKoZIcNqts0jvcNvPc', @@ -1554,7 +1556,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -1669,7 +1671,7 @@ export const data = [ idfv: 'fc8d449516de0dfb', install_time: 1630511211, update_time: 1630511211, - a: 'dummyApiKey', + a: defaultApiKey, }, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, files: {}, @@ -1693,7 +1695,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -1804,7 +1806,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -1915,7 +1917,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -1992,7 +1994,7 @@ export const data = [ endpoint: 'https://s2s.singular.net/api/v1/launch', headers: {}, params: { - a: 'dummyApiKey', + a: defaultApiKey, av: '1.1.5.581823alpha', data_sharing_options: '%7B%22limit_data_sharing%22%3Atrue%7D', i: 'com.singular.game', @@ -2028,7 +2030,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -2137,7 +2139,7 @@ export const data = [ cur: 'USD', amt: 28, purchase_product_id: '789', - a: 'dummyApiKey', + a: defaultApiKey, install_source: 'selfdistributed', os: 'metaquest_pro', p: 'metaquest', @@ -2172,7 +2174,7 @@ export const data = [ amt: 6.9, os: 'metaquest_pro', p: 'metaquest', - a: 'dummyApiKey', + a: defaultApiKey, sdid: '49c2d3a6-326e-4ec5-a16b-0a47e34ed953', ua: 'Mozilla/5.0 (Nintendo Switch; WebApplet) AppleWebKit/613.0 (KHTML, like Gecko) NF/6.0.3.25.0 NintendoBrowser/5.1.0.32061', ve: 'qst2-2023h2', diff --git a/test/integrations/destinations/singular/router/data.ts b/test/integrations/destinations/singular/router/data.ts index 9074ef2fdc8..f3aba585780 100644 --- a/test/integrations/destinations/singular/router/data.ts +++ b/test/integrations/destinations/singular/router/data.ts @@ -1,3 +1,5 @@ +import { defaultApiKey } from '../../../common/secrets'; + export const data = [ { name: 'singular', @@ -12,7 +14,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -140,7 +142,7 @@ export const data = [ update_time: 1630511211, ua: 'Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)', c: 'wifi', - a: 'dummyApiKey', + a: defaultApiKey, }, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, files: {}, @@ -150,7 +152,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -177,7 +179,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -305,7 +307,7 @@ export const data = [ update_time: 1630511211, ua: 'Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)', c: 'wifi', - a: 'dummyApiKey', + a: defaultApiKey, }, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, files: {}, @@ -315,7 +317,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -342,7 +344,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, @@ -470,7 +472,7 @@ export const data = [ update_time: 1630511211, ua: 'Dalvik/2.1.0 (Linux; U; Android 9; Android SDK built for x86 Build/PSR1.180720.075)', c: 'wifi', - a: 'dummyApiKey', + a: defaultApiKey, }, body: { JSON: {}, JSON_ARRAY: {}, XML: {}, FORM: {} }, files: {}, @@ -480,7 +482,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: defaultApiKey, sessionEventList: [ { sessionEventName: 'mysessionevent' }, { sessionEventName: 'randomuser' }, diff --git a/test/integrations/destinations/slack/processor/data.ts b/test/integrations/destinations/slack/processor/data.ts index 1fcbb2ca03f..db72671a5e5 100644 --- a/test/integrations/destinations/slack/processor/data.ts +++ b/test/integrations/destinations/slack/processor/data.ts @@ -146,8 +146,11 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - payload: - '{"text":"Identified my-namehiji: hulala favorite color: black ","username":"RudderStack","icon_url":"https://cdn.rudderlabs.com/rudderstack.png"}', + payload: JSON.stringify({ + text: 'Identified my-namehiji: hulala favorite color: black ', + username: 'RudderStack', + icon_url: 'https://cdn.rudderlabs.com/rudderstack.png', + }), }, }, files: {}, @@ -474,8 +477,11 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - payload: - '{"text":"identified my-name-1 with hiji: hulala-1 ","username":"RudderStack","icon_url":"https://cdn.rudderlabs.com/rudderstack.png"}', + payload: JSON.stringify({ + text: 'identified my-name-1 with hiji: hulala-1 ', + username: 'RudderStack', + icon_url: 'https://cdn.rudderlabs.com/rudderstack.png', + }), }, }, files: {}, @@ -655,8 +661,9 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - payload: - '{"text":"my-name performed test_isent1 with test_val1 test_val2 and traits hulala"}', + payload: JSON.stringify({ + text: 'my-name performed test_isent1 with test_val1 test_val2 and traits hulala', + }), }, }, files: {}, @@ -839,8 +846,9 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - payload: - '{"text":"my-name performed test_eventing_testis with test_val1 test_val2"}', + payload: JSON.stringify({ + text: 'my-name performed test_eventing_testis with test_val1 test_val2', + }), }, }, files: {}, @@ -1023,7 +1031,7 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - payload: '{"text":"my-name did test_eventing_test"}', + payload: JSON.stringify({ text: 'my-name did test_eventing_test' }), }, }, files: {}, @@ -1204,8 +1212,11 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - payload: - '{"text":"my-name performed test_isent1 with test_val1 test_val2 and traits hulala","username":"RudderStack","icon_url":"https://cdn.rudderlabs.com/rudderstack.png"}', + payload: JSON.stringify({ + text: 'my-name performed test_isent1 with test_val1 test_val2 and traits hulala', + username: 'RudderStack', + icon_url: 'https://cdn.rudderlabs.com/rudderstack.png', + }), }, }, files: {}, @@ -1387,8 +1398,12 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - payload: - '{"channel":"example-of-legacy","text":"my-name performed test_eventing_testis with test_val1 test_val2","username":"RudderStack","icon_url":"https://cdn.rudderlabs.com/rudderstack.png"}', + payload: JSON.stringify({ + channel: 'example-of-legacy', + text: 'my-name performed test_eventing_testis with test_val1 test_val2', + username: 'RudderStack', + icon_url: 'https://cdn.rudderlabs.com/rudderstack.png', + }), }, }, files: {}, @@ -1995,8 +2010,11 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - payload: - '{"text":"User 12345 did black_event","username":"RudderStack","icon_url":"https://cdn.rudderlabs.com/rudderstack.png"}', + payload: JSON.stringify({ + text: 'User 12345 did black_event', + username: 'RudderStack', + icon_url: 'https://cdn.rudderlabs.com/rudderstack.png', + }), }, }, files: {}, @@ -2150,8 +2168,11 @@ export const data = [ JSON_ARRAY: {}, XML: {}, FORM: { - payload: - '{"text":"Identified User 12345","username":"RudderStack","icon_url":"https://cdn.rudderlabs.com/rudderstack.png"}', + payload: JSON.stringify({ + text: 'Identified User 12345', + username: 'RudderStack', + icon_url: 'https://cdn.rudderlabs.com/rudderstack.png', + }), }, }, files: {}, diff --git a/test/integrations/destinations/slack/router/data.ts b/test/integrations/destinations/slack/router/data.ts index 349b1a486f0..0eb0a723243 100644 --- a/test/integrations/destinations/slack/router/data.ts +++ b/test/integrations/destinations/slack/router/data.ts @@ -280,8 +280,11 @@ export const data = [ { body: { FORM: { - payload: - '{"text":"identified my-name-1 with hiji: hulala-1 ","username":"RudderStack","icon_url":"https://cdn.rudderlabs.com/rudderstack.png"}', + payload: JSON.stringify({ + text: 'identified my-name-1 with hiji: hulala-1 ', + username: 'RudderStack', + icon_url: 'https://cdn.rudderlabs.com/rudderstack.png', + }), }, JSON: {}, JSON_ARRAY: {}, diff --git a/test/integrations/destinations/snapchat_conversion/maskedSecrets.ts b/test/integrations/destinations/snapchat_conversion/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/snapchat_conversion/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/snapchat_conversion/processor/data.ts b/test/integrations/destinations/snapchat_conversion/processor/data.ts index b7fde67c4e7..b7cd6f2d5c6 100644 --- a/test/integrations/destinations/snapchat_conversion/processor/data.ts +++ b/test/integrations/destinations/snapchat_conversion/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'snapchat_conversion', @@ -72,7 +73,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', }, }, @@ -103,7 +104,7 @@ export const data = [ userId: '', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -217,7 +218,7 @@ export const data = [ }, Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, metadata: { @@ -246,7 +247,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -365,7 +366,7 @@ export const data = [ }, Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, metadata: { @@ -479,7 +480,7 @@ export const data = [ }, Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, metadata: { @@ -592,7 +593,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, metadata: { @@ -705,7 +706,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', }, }, @@ -735,7 +736,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -841,7 +842,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', }, }, @@ -955,7 +956,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', }, @@ -1072,7 +1073,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -1104,7 +1105,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1225,7 +1226,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -1257,7 +1258,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1377,7 +1378,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -1409,7 +1410,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1528,7 +1529,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -1560,7 +1561,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1671,7 +1672,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -1703,7 +1704,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1817,7 +1818,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -1849,7 +1850,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1962,7 +1963,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -1994,7 +1995,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -2103,7 +2104,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -2135,7 +2136,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -2243,7 +2244,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -2275,7 +2276,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -2385,7 +2386,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -2417,7 +2418,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -2527,7 +2528,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -2559,7 +2560,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -2669,7 +2670,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -2701,7 +2702,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -2812,7 +2813,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -2844,7 +2845,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -2956,7 +2957,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -2988,7 +2989,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -3097,7 +3098,7 @@ export const data = [ }, Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, metadata: { @@ -3126,7 +3127,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -3236,7 +3237,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -3268,7 +3269,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -3378,7 +3379,7 @@ export const data = [ }, Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, rudderEventsToSnapEvents: [ { from: 'ProdSearched', @@ -3414,7 +3415,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -3520,7 +3521,7 @@ export const data = [ }, Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, rudderEventsToSnapEvents: [], }, }, @@ -3629,7 +3630,7 @@ export const data = [ }, Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, rudderEventsToSnapEvents: [ { from: 'Product_Added_To_Cart', @@ -3664,7 +3665,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -3765,7 +3766,7 @@ export const data = [ }, Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, rudderEventsToSnapEvents: [ { from: 'Product Added To Cart', @@ -3801,7 +3802,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -3919,7 +3920,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', deduplicationKey: 'properties.custom_dedup_id', enableDeduplication: true, @@ -3953,7 +3954,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -4074,7 +4075,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -4106,7 +4107,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -4224,7 +4225,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -4256,7 +4257,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -4376,7 +4377,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -4408,7 +4409,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -4531,7 +4532,7 @@ export const data = [ }, }, Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, pixelId: 'dummyPixelId', appId: 'dhfeih44f', snapAppId: 'hfhdhfd', @@ -4563,7 +4564,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -4667,7 +4668,7 @@ export const data = [ }, Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, rudderEventsToSnapEvents: [ { from: 'Custom Event', @@ -4703,7 +4704,7 @@ export const data = [ method: 'POST', endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -4807,7 +4808,7 @@ export const data = [ }, Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, rudderEventsToSnapEvents: [], }, }, diff --git a/test/integrations/destinations/snapchat_conversion/router/data.ts b/test/integrations/destinations/snapchat_conversion/router/data.ts index 685ed2e5b4e..5e1adc0f27c 100644 --- a/test/integrations/destinations/snapchat_conversion/router/data.ts +++ b/test/integrations/destinations/snapchat_conversion/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { FEATURES, IMPLEMENTATIONS, MODULES } from '../../../../../src/v0/util/tags'; export const data = [ @@ -74,7 +75,7 @@ export const data = [ destination: { Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, }, @@ -141,7 +142,7 @@ export const data = [ destination: { Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, }, @@ -208,7 +209,7 @@ export const data = [ destination: { Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, }, @@ -230,14 +231,65 @@ export const data = [ endpoint: 'https://tr.snapchat.com/v2/conversion', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { JSON: {}, JSON_ARRAY: { - batch: - '[{"search_string":"t-shirts","event_type":"SEARCH","user_agent":"mozilla/5.0 (macintosh; intel mac os x 10_15_2) applewebkit/537.36 (khtml, like gecko) chrome/79.0.3945.88 safari/537.36","hashed_email":"73062d872926c2a556f17b36f50e328ddf9bff9d403939bd14b6c3b7f5a33fc2","hashed_phone_number":"bc77d64d7045fe44795ed926df37231a0cfb6ec6b74588c512790e9f143cc492","hashed_idfv":"54bd0b26a3d39dad90f5149db49b9fd9ba885f8e35d1d94cae69273f5e657b9f","hashed_mobile_ad_id":"f9779d734aaee50f16ee0011260bae7048f1d9a128c62b6a661077875701edd2","timestamp":"1650625078","event_conversion_type":"OFFLINE","pixel_id":"dummyPixelId"},{"search_string":"t-shirts","event_type":"SEARCH","user_agent":"mozilla/5.0 (macintosh; intel mac os x 10_15_2) applewebkit/537.36 (khtml, like gecko) chrome/79.0.3945.88 safari/537.36","hashed_email":"73062d872926c2a556f17b36f50e328ddf9bff9d403939bd14b6c3b7f5a33fc2","hashed_phone_number":"bc77d64d7045fe44795ed926df37231a0cfb6ec6b74588c512790e9f143cc492","hashed_idfv":"54bd0b26a3d39dad90f5149db49b9fd9ba885f8e35d1d94cae69273f5e657b9f","hashed_mobile_ad_id":"f9779d734aaee50f16ee0011260bae7048f1d9a128c62b6a661077875701edd2","timestamp":"1650625078","event_conversion_type":"OFFLINE","pixel_id":"dummyPixelId"},{"search_string":"t-shirts","event_type":"SEARCH","user_agent":"mozilla/5.0 (macintosh; intel mac os x 10_15_2) applewebkit/537.36 (khtml, like gecko) chrome/79.0.3945.88 safari/537.36","hashed_email":"73062d872926c2a556f17b36f50e328ddf9bff9d403939bd14b6c3b7f5a33fc2","hashed_phone_number":"bc77d64d7045fe44795ed926df37231a0cfb6ec6b74588c512790e9f143cc492","hashed_idfv":"54bd0b26a3d39dad90f5149db49b9fd9ba885f8e35d1d94cae69273f5e657b9f","hashed_mobile_ad_id":"f9779d734aaee50f16ee0011260bae7048f1d9a128c62b6a661077875701edd2","timestamp":"1650625078","event_conversion_type":"OFFLINE","pixel_id":"dummyPixelId"}]', + batch: JSON.stringify([ + { + search_string: 't-shirts', + event_type: 'SEARCH', + user_agent: + 'mozilla/5.0 (macintosh; intel mac os x 10_15_2) applewebkit/537.36 (khtml, like gecko) chrome/79.0.3945.88 safari/537.36', + hashed_email: + '73062d872926c2a556f17b36f50e328ddf9bff9d403939bd14b6c3b7f5a33fc2', + hashed_phone_number: + 'bc77d64d7045fe44795ed926df37231a0cfb6ec6b74588c512790e9f143cc492', + hashed_idfv: + '54bd0b26a3d39dad90f5149db49b9fd9ba885f8e35d1d94cae69273f5e657b9f', + hashed_mobile_ad_id: + 'f9779d734aaee50f16ee0011260bae7048f1d9a128c62b6a661077875701edd2', + timestamp: '1650625078', + event_conversion_type: 'OFFLINE', + pixel_id: 'dummyPixelId', + }, + { + search_string: 't-shirts', + event_type: 'SEARCH', + user_agent: + 'mozilla/5.0 (macintosh; intel mac os x 10_15_2) applewebkit/537.36 (khtml, like gecko) chrome/79.0.3945.88 safari/537.36', + hashed_email: + '73062d872926c2a556f17b36f50e328ddf9bff9d403939bd14b6c3b7f5a33fc2', + hashed_phone_number: + 'bc77d64d7045fe44795ed926df37231a0cfb6ec6b74588c512790e9f143cc492', + hashed_idfv: + '54bd0b26a3d39dad90f5149db49b9fd9ba885f8e35d1d94cae69273f5e657b9f', + hashed_mobile_ad_id: + 'f9779d734aaee50f16ee0011260bae7048f1d9a128c62b6a661077875701edd2', + timestamp: '1650625078', + event_conversion_type: 'OFFLINE', + pixel_id: 'dummyPixelId', + }, + { + search_string: 't-shirts', + event_type: 'SEARCH', + user_agent: + 'mozilla/5.0 (macintosh; intel mac os x 10_15_2) applewebkit/537.36 (khtml, like gecko) chrome/79.0.3945.88 safari/537.36', + hashed_email: + '73062d872926c2a556f17b36f50e328ddf9bff9d403939bd14b6c3b7f5a33fc2', + hashed_phone_number: + 'bc77d64d7045fe44795ed926df37231a0cfb6ec6b74588c512790e9f143cc492', + hashed_idfv: + '54bd0b26a3d39dad90f5149db49b9fd9ba885f8e35d1d94cae69273f5e657b9f', + hashed_mobile_ad_id: + 'f9779d734aaee50f16ee0011260bae7048f1d9a128c62b6a661077875701edd2', + timestamp: '1650625078', + event_conversion_type: 'OFFLINE', + pixel_id: 'dummyPixelId', + }, + ]), }, XML: {}, FORM: {}, @@ -263,7 +315,7 @@ export const data = [ destination: { Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, }, }, }, @@ -392,7 +444,7 @@ export const data = [ destination: { Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, appId: 'jahsdfjk-5487-asdfa-9957-7c74eb8d3e80', snapAppId: '', enableDeduplication: false, @@ -436,7 +488,7 @@ export const data = [ destination: { Config: { pixelId: 'dummyPixelId', - apiKey: 'dummyApiKey', + apiKey: secret1, appId: 'jahsdfjk-5487-asdfa-9957-7c74eb8d3e80', snapAppId: '', enableDeduplication: false, diff --git a/test/integrations/destinations/snapchat_custom_audience/dataDelivery/business.ts b/test/integrations/destinations/snapchat_custom_audience/dataDelivery/business.ts index 4ee646bedbf..5bdfd09bada 100644 --- a/test/integrations/destinations/snapchat_custom_audience/dataDelivery/business.ts +++ b/test/integrations/destinations/snapchat_custom_audience/dataDelivery/business.ts @@ -4,9 +4,10 @@ import { generateProxyV0Payload, generateProxyV1Payload, } from '../../../testUtils'; +import { authHeader1 } from '../maskedSecrets'; const commonHeaders = { - Authorization: 'Bearer abcd123', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }; diff --git a/test/integrations/destinations/snapchat_custom_audience/dataDelivery/oauth.ts b/test/integrations/destinations/snapchat_custom_audience/dataDelivery/oauth.ts index e4bf5d45882..9a2de350410 100644 --- a/test/integrations/destinations/snapchat_custom_audience/dataDelivery/oauth.ts +++ b/test/integrations/destinations/snapchat_custom_audience/dataDelivery/oauth.ts @@ -4,9 +4,10 @@ import { generateProxyV0Payload, generateProxyV1Payload, } from '../../../testUtils'; +import { authHeader1 } from '../maskedSecrets'; const commonHeaders = { - Authorization: 'Bearer abcd123', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }; @@ -23,19 +24,6 @@ const commonRequestParameters = { }, }; -const commonDeleteRequestParameters = { - headers: commonHeaders, - JSON: { - users: [ - { - id: '123456', - schema: ['EMAIL_SHA256'], - data: [['938758751f5af66652a118e26503af824404bc13acd1cb7642ddff99916f0e1c']], - }, - ], - }, -}; - const retryStatTags = { destType: 'SNAPCHAT_CUSTOM_AUDIENCE', errorCategory: 'network', diff --git a/test/integrations/destinations/snapchat_custom_audience/dataDelivery/other.ts b/test/integrations/destinations/snapchat_custom_audience/dataDelivery/other.ts index 90508c2481c..b9fe80c0470 100644 --- a/test/integrations/destinations/snapchat_custom_audience/dataDelivery/other.ts +++ b/test/integrations/destinations/snapchat_custom_audience/dataDelivery/other.ts @@ -38,8 +38,13 @@ export const otherScenariosV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"message":"Service Unavailable","description":"The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later."}}', + error: JSON.stringify({ + error: { + message: 'Service Unavailable', + description: + 'The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later.', + }, + }), statusCode: 503, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/snapchat_custom_audience/maskedSecrets.ts b/test/integrations/destinations/snapchat_custom_audience/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/snapchat_custom_audience/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/snapchat_custom_audience/network.ts b/test/integrations/destinations/snapchat_custom_audience/network.ts index 39bd46122dd..09659d4c2b2 100644 --- a/test/integrations/destinations/snapchat_custom_audience/network.ts +++ b/test/integrations/destinations/snapchat_custom_audience/network.ts @@ -1,3 +1,5 @@ +import { authHeader1 } from './maskedSecrets'; + export const networkCallsData = [ { httpReq: { @@ -12,7 +14,7 @@ export const networkCallsData = [ }, params: { destination: 'snapchat_custom_audience' }, headers: { - Authorization: 'Bearer abcd123', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -41,7 +43,7 @@ export const networkCallsData = [ }, params: { destination: 'snapchat_custom_audience' }, headers: { - Authorization: 'Bearer abcd123', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -63,7 +65,7 @@ export const networkCallsData = [ }, params: { destination: 'snapchat_custom_audience' }, headers: { - Authorization: 'Bearer abcd123', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, @@ -94,7 +96,7 @@ export const networkCallsData = [ }, params: { destination: 'snapchat_custom_audience' }, headers: { - Authorization: 'Bearer abcd123', + Authorization: authHeader1, 'Content-Type': 'application/json', 'User-Agent': 'RudderLabs', }, diff --git a/test/integrations/destinations/snapchat_custom_audience/processor/data.ts b/test/integrations/destinations/snapchat_custom_audience/processor/data.ts index 546f056fa43..188cf16b268 100644 --- a/test/integrations/destinations/snapchat_custom_audience/processor/data.ts +++ b/test/integrations/destinations/snapchat_custom_audience/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'snapchat_custom_audience', @@ -11,7 +12,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -66,7 +67,7 @@ export const data = [ method: 'POST', endpoint: 'https://adsapi.snapchat.com/v1/segments/123/users', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -88,7 +89,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -111,7 +112,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -166,7 +167,7 @@ export const data = [ method: 'DELETE', endpoint: 'https://adsapi.snapchat.com/v1/segments/123/users', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -189,7 +190,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -212,7 +213,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -277,7 +278,7 @@ export const data = [ method: 'POST', endpoint: 'https://adsapi.snapchat.com/v1/segments/123/users', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -299,7 +300,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -313,7 +314,7 @@ export const data = [ method: 'DELETE', endpoint: 'https://adsapi.snapchat.com/v1/segments/123/users', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -336,7 +337,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -359,7 +360,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -422,7 +423,7 @@ export const data = [ method: 'POST', endpoint: 'https://adsapi.snapchat.com/v1/segments/123/users', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -447,7 +448,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -470,7 +471,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -533,7 +534,7 @@ export const data = [ method: 'DELETE', endpoint: 'https://adsapi.snapchat.com/v1/segments/123/users', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -559,7 +560,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -582,7 +583,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -633,7 +634,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -665,7 +666,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -715,7 +716,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -747,7 +748,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -783,7 +784,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -815,7 +816,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -854,7 +855,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -886,7 +887,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -928,7 +929,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -961,7 +962,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -1019,7 +1020,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -1051,7 +1052,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -1113,7 +1114,7 @@ export const data = [ method: 'DELETE', endpoint: 'https://adsapi.snapchat.com/v1/segments/123/users', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1136,7 +1137,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -1159,7 +1160,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -1214,7 +1215,7 @@ export const data = [ method: 'POST', endpoint: 'https://adsapi.snapchat.com/v1/segments/123/users', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1236,7 +1237,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -1259,7 +1260,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -1315,7 +1316,7 @@ export const data = [ method: 'POST', endpoint: 'https://adsapi.snapchat.com/v1/segments/123/users', headers: { - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, 'Content-Type': 'application/json', }, params: {}, @@ -1337,7 +1338,7 @@ export const data = [ }, metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, diff --git a/test/integrations/destinations/snapchat_custom_audience/router/data.ts b/test/integrations/destinations/snapchat_custom_audience/router/data.ts index 44fdb4b47b2..b4c9a823655 100644 --- a/test/integrations/destinations/snapchat_custom_audience/router/data.ts +++ b/test/integrations/destinations/snapchat_custom_audience/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'snapchat_custom_audience', @@ -12,7 +13,7 @@ export const data = [ { metadata: { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, refresh_token: 'dummyRefreshToken', developer_token: 'dummyDeveloperToken', }, @@ -62,7 +63,7 @@ export const data = [ endpoint: 'https://adsapi.snapchat.com/v1/segments/123/users', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyAccessToken', + Authorization: authHeader1, }, params: {}, body: { @@ -86,7 +87,7 @@ export const data = [ metadata: [ { secret: { - access_token: 'dummyAccessToken', + access_token: secret1, developer_token: 'dummyDeveloperToken', refresh_token: 'dummyRefreshToken', }, diff --git a/test/integrations/destinations/splitio/maskedSecrets.ts b/test/integrations/destinations/splitio/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/splitio/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/splitio/processor/data.ts b/test/integrations/destinations/splitio/processor/data.ts index d4c3e39794e..2656ff23d0f 100644 --- a/test/integrations/destinations/splitio/processor/data.ts +++ b/test/integrations/destinations/splitio/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'splitio', @@ -41,7 +42,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'staging', trafficType: 'anonymous', }, @@ -62,7 +63,7 @@ export const data = [ endpoint: 'https://events.split.io/api/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer abcde', + Authorization: authHeader1, }, params: {}, body: { @@ -142,7 +143,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'staging', trafficType: 'user', }, @@ -163,7 +164,7 @@ export const data = [ endpoint: 'https://events.split.io/api/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer abcde', + Authorization: authHeader1, }, params: {}, body: { @@ -244,7 +245,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'production', trafficType: 'anonymous', }, @@ -265,7 +266,7 @@ export const data = [ endpoint: 'https://events.split.io/api/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer abcde', + Authorization: authHeader1, }, params: {}, body: { @@ -334,7 +335,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'production', trafficType: 'user', }, @@ -355,7 +356,7 @@ export const data = [ endpoint: 'https://events.split.io/api/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer abcde', + Authorization: authHeader1, }, params: {}, body: { @@ -418,7 +419,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'staging', trafficType: 'user', }, @@ -439,7 +440,7 @@ export const data = [ endpoint: 'https://events.split.io/api/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer abcde', + Authorization: authHeader1, }, params: {}, body: { @@ -506,7 +507,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'staging', trafficType: 'user', }, @@ -527,7 +528,7 @@ export const data = [ endpoint: 'https://events.split.io/api/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer abcde', + Authorization: authHeader1, }, params: {}, body: { @@ -590,7 +591,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'staging', trafficType: 'user', }, @@ -652,7 +653,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'staging', trafficType: 'user', }, @@ -713,7 +714,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'production', trafficType: 'user', }, @@ -775,7 +776,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'production', trafficType: 'user', }, @@ -796,7 +797,7 @@ export const data = [ endpoint: 'https://events.split.io/api/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer abcde', + Authorization: authHeader1, }, params: {}, body: { @@ -859,7 +860,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'abcde', + apiKey: secret1, environment: 'staging', trafficType: 'anonymous', }, @@ -880,7 +881,7 @@ export const data = [ endpoint: 'https://events.split.io/api/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer abcde', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/splitio/router/data.ts b/test/integrations/destinations/splitio/router/data.ts index 47f8ad5cff1..43ec89f2467 100644 --- a/test/integrations/destinations/splitio/router/data.ts +++ b/test/integrations/destinations/splitio/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'splitio', @@ -36,7 +37,7 @@ export const data = [ }, metadata: { jobId: 1, userId: 'u1' }, destination: { - Config: { apiKey: 'abcde', environment: 'staging', trafficType: 'user' }, + Config: { apiKey: secret1, environment: 'staging', trafficType: 'user' }, }, }, ], @@ -56,7 +57,7 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://events.split.io/api/events', - headers: { 'Content-Type': 'application/json', Authorization: 'Bearer abcde' }, + headers: { 'Content-Type': 'application/json', Authorization: authHeader1 }, params: {}, body: { JSON: { @@ -77,7 +78,7 @@ export const data = [ batched: false, statusCode: 200, destination: { - Config: { apiKey: 'abcde', environment: 'staging', trafficType: 'user' }, + Config: { apiKey: secret1, environment: 'staging', trafficType: 'user' }, }, }, ], @@ -119,7 +120,7 @@ export const data = [ }, metadata: { jobId: 2, userId: 'u1' }, destination: { - Config: { apiKey: 'abcde', environment: 'staging', trafficType: 'user' }, + Config: { apiKey: secret1, environment: 'staging', trafficType: 'user' }, }, }, ], @@ -139,7 +140,7 @@ export const data = [ type: 'REST', method: 'POST', endpoint: 'https://events.split.io/api/events', - headers: { 'Content-Type': 'application/json', Authorization: 'Bearer abcde' }, + headers: { 'Content-Type': 'application/json', Authorization: authHeader1 }, params: {}, body: { JSON: { @@ -160,7 +161,7 @@ export const data = [ batched: false, statusCode: 200, destination: { - Config: { apiKey: 'abcde', environment: 'staging', trafficType: 'user' }, + Config: { apiKey: secret1, environment: 'staging', trafficType: 'user' }, }, }, ], diff --git a/test/integrations/destinations/sprig/deleteUsers/data.ts b/test/integrations/destinations/sprig/deleteUsers/data.ts index 7ab5620e66c..db5af989150 100644 --- a/test/integrations/destinations/sprig/deleteUsers/data.ts +++ b/test/integrations/destinations/sprig/deleteUsers/data.ts @@ -1,3 +1,5 @@ +import { secret1, secretInvalid } from '../maskedSecrets'; + export const data = [ { name: 'sprig', @@ -57,7 +59,7 @@ export const data = [ }, ], config: { - apiKey: 'invalidApiKey', + apiKey: secretInvalid, }, }, ], @@ -119,7 +121,7 @@ export const data = [ }, ], config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, ], @@ -154,7 +156,7 @@ export const data = [ }, ], config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, ], @@ -196,7 +198,7 @@ export const data = [ }, ], config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, ], diff --git a/test/integrations/destinations/sprig/maskedSecrets.ts b/test/integrations/destinations/sprig/maskedSecrets.ts new file mode 100644 index 00000000000..b0273d7671f --- /dev/null +++ b/test/integrations/destinations/sprig/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secretInvalid = path.basename(__dirname) + 2; +export const authHeader1 = `API-Key ${secret1}`; +export const authHeaderInvalid = `API-Key ${secretInvalid}`; diff --git a/test/integrations/destinations/sprig/network.ts b/test/integrations/destinations/sprig/network.ts index e5f2ff23b1e..67f3e877102 100644 --- a/test/integrations/destinations/sprig/network.ts +++ b/test/integrations/destinations/sprig/network.ts @@ -1,3 +1,5 @@ +import { authHeader1, authHeaderInvalid } from './maskedSecrets'; + const deleteNwData = [ { httpReq: { @@ -8,7 +10,7 @@ const deleteNwData = [ }, headers: { Accept: 'application/json', - Authorization: 'API-Key invalidApiKey', + Authorization: authHeaderInvalid, 'Content-Type': 'application/json', }, }, @@ -26,7 +28,7 @@ const deleteNwData = [ }, headers: { Accept: 'application/json', - Authorization: 'API-Key testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, }, @@ -44,7 +46,7 @@ const deleteNwData = [ }, headers: { Accept: 'application/json', - Authorization: 'API-Key testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, }, @@ -64,7 +66,7 @@ const deleteNwData = [ }, headers: { Accept: 'application/json', - Authorization: 'API-Key testApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, }, diff --git a/test/integrations/destinations/sprig/processor/data.ts b/test/integrations/destinations/sprig/processor/data.ts index 6b99e5e13b6..cadddaecf9c 100644 --- a/test/integrations/destinations/sprig/processor/data.ts +++ b/test/integrations/destinations/sprig/processor/data.ts @@ -1,3 +1,5 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; + export const data = [ { name: 'sprig', @@ -29,7 +31,7 @@ export const data = [ }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, metadata: { @@ -97,7 +99,7 @@ export const data = [ }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, metadata: { @@ -227,7 +229,7 @@ export const data = [ }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, metadata: { @@ -293,7 +295,7 @@ export const data = [ }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, metadata: { @@ -317,7 +319,7 @@ export const data = [ endpoint: 'https://api.sprig.com/v2/users', headers: { accept: 'application/json', - authorization: 'API-Key testApiKey', + authorization: authHeader1, 'content-type': 'application/json', }, body: { @@ -379,7 +381,7 @@ export const data = [ }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, metadata: { @@ -447,7 +449,7 @@ export const data = [ }, }, Config: { - apiKey: 'testApiKey', + apiKey: secret1, }, }, metadata: { @@ -471,7 +473,7 @@ export const data = [ endpoint: 'https://api.sprig.com/v2/users', headers: { accept: 'application/json', - authorization: 'API-Key testApiKey', + authorization: authHeader1, 'content-type': 'application/json', }, body: { diff --git a/test/integrations/destinations/stormly/maskedSecrets.ts b/test/integrations/destinations/stormly/maskedSecrets.ts new file mode 100644 index 00000000000..c5a4dc839e8 --- /dev/null +++ b/test/integrations/destinations/stormly/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${secret1}`; diff --git a/test/integrations/destinations/stormly/processor/data.ts b/test/integrations/destinations/stormly/processor/data.ts index 52356ba9e09..2c5b4ee3804 100644 --- a/test/integrations/destinations/stormly/processor/data.ts +++ b/test/integrations/destinations/stormly/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'stormly', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, ID: 'stormly123', }, @@ -64,7 +65,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, ID: 'stormly123', }, @@ -100,7 +101,7 @@ export const data = [ endpoint: 'https://rudderstack.t.stormly.com/webhook/rudderstack/identify', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -138,7 +139,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, ID: 'stormly123', }, @@ -193,7 +194,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, ID: 'stormly123', }, @@ -228,7 +229,7 @@ export const data = [ endpoint: 'https://rudderstack.t.stormly.com/webhook/rudderstack/track', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -268,7 +269,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, ID: 'stormly123', }, @@ -297,7 +298,7 @@ export const data = [ endpoint: 'https://rudderstack.t.stormly.com/webhook/rudderstack/track', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -331,7 +332,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, ID: 'stormly123', }, @@ -367,7 +368,7 @@ export const data = [ endpoint: 'https://rudderstack.t.stormly.com/webhook/rudderstack/track', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -410,7 +411,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, ID: 'stormly123', }, @@ -453,7 +454,7 @@ export const data = [ endpoint: 'https://rudderstack.t.stormly.com/webhook/rudderstack/track', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -496,7 +497,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, }, ID: 'stormly123', }, @@ -533,7 +534,7 @@ export const data = [ endpoint: 'https://rudderstack.t.stormly.com/webhook/rudderstack/group', headers: { 'Content-Type': 'application/json', - Authorization: 'Basic dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/stormly/router/data.ts b/test/integrations/destinations/stormly/router/data.ts index 1973173795d..fb12d71db8a 100644 --- a/test/integrations/destinations/stormly/router/data.ts +++ b/test/integrations/destinations/stormly/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'stormly', @@ -10,7 +11,7 @@ export const data = [ body: { input: [ { - destination: { Config: { apiKey: 'dummyApiKey' }, ID: 'stormly123' }, + destination: { Config: { apiKey: secret1 }, ID: 'stormly123' }, metadata: { jobId: 1, userId: 'u1' }, message: { type: 'identify', @@ -24,7 +25,7 @@ export const data = [ }, }, { - destination: { Config: { apiKey: 'dummyApiKey' }, ID: 'stormly123' }, + destination: { Config: { apiKey: secret1 }, ID: 'stormly123' }, metadata: { jobId: 2, userId: 'u1' }, message: { type: 'track', @@ -68,18 +69,18 @@ export const data = [ }, endpoint: 'https://rudderstack.t.stormly.com/webhook/rudderstack/identify', files: {}, - headers: { Authorization: 'Basic dummyApiKey', 'Content-Type': 'application/json' }, + headers: { Authorization: authHeader1, 'Content-Type': 'application/json' }, method: 'POST', params: {}, type: 'REST', version: '1', }, - destination: { Config: { apiKey: 'dummyApiKey' }, ID: 'stormly123' }, + destination: { Config: { apiKey: secret1 }, ID: 'stormly123' }, metadata: [{ jobId: 1, userId: 'u1' }], statusCode: 200, }, { - destination: { Config: { apiKey: 'dummyApiKey' }, ID: 'stormly123' }, + destination: { Config: { apiKey: secret1 }, ID: 'stormly123' }, batched: false, error: 'Missing required value from "userIdOnly"', metadata: [{ jobId: 2, userId: 'u1' }], diff --git a/test/integrations/destinations/the_trade_desk/delivery/business.ts b/test/integrations/destinations/the_trade_desk/delivery/business.ts index 0406a5f0bc7..26336b60b4f 100644 --- a/test/integrations/destinations/the_trade_desk/delivery/business.ts +++ b/test/integrations/destinations/the_trade_desk/delivery/business.ts @@ -159,8 +159,9 @@ export const businessProxyV1: ProxyV1TestData[] = [ 'Request failed with status: 200 due to {"FailedLines":[{"ErrorCode":"MissingUserId","Message":"Invalid UID2, item #2"}]}', response: [ { - error: - '{"FailedLines":[{"ErrorCode":"MissingUserId","Message":"Invalid UID2, item #2"}]}', + error: JSON.stringify({ + FailedLines: [{ ErrorCode: 'MissingUserId', Message: 'Invalid UID2, item #2' }], + }), metadata: generateMetadata(1), statusCode: 400, }, diff --git a/test/integrations/destinations/the_trade_desk/delivery/other.ts b/test/integrations/destinations/the_trade_desk/delivery/other.ts index bed10e6ec58..51f8dd51a5f 100644 --- a/test/integrations/destinations/the_trade_desk/delivery/other.ts +++ b/test/integrations/destinations/the_trade_desk/delivery/other.ts @@ -107,8 +107,13 @@ export const otherProxyV1: ProxyV1TestData[] = [ output: { response: [ { - error: - '{"error":{"message":"Service Unavailable","description":"The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later."}}', + error: JSON.stringify({ + error: { + message: 'Service Unavailable', + description: + 'The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later.', + }, + }), statusCode: 503, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/tiktok_ads/dataDelivery/business.ts b/test/integrations/destinations/tiktok_ads/dataDelivery/business.ts index 895188fa3f6..865764cef3f 100644 --- a/test/integrations/destinations/tiktok_ads/dataDelivery/business.ts +++ b/test/integrations/destinations/tiktok_ads/dataDelivery/business.ts @@ -101,7 +101,7 @@ export const V1BusinessTestScenarion: ProxyV1TestData[] = [ message: '[TIKTOK_ADS Response Handler] - Request Processed Successfully', response: [ { - error: '{"code":0,"message":"OK"}', + error: JSON.stringify({ code: 0, message: 'OK' }), statusCode: 200, metadata: generateMetadata(1234), }, @@ -168,8 +168,10 @@ export const V1BusinessTestScenarion: ProxyV1TestData[] = [ response: [ { statusCode: 400, - error: - '{"code":40002,"message":"Batch.0.properties.contents.0.content_id: Not a valid string"}', + error: JSON.stringify({ + code: 40002, + message: 'Batch.0.properties.contents.0.content_id: Not a valid string', + }), metadata: generateMetadata(1234), }, ], @@ -235,8 +237,11 @@ export const V1BusinessTestScenarion: ProxyV1TestData[] = [ response: [ { statusCode: 400, - error: - '{"code":40001,"message":"No permission to operate pixel code: BU35TSQHT2A1QT375OMG. You must be an admin or operator of this advertiser account."}', + error: JSON.stringify({ + code: 40001, + message: + 'No permission to operate pixel code: BU35TSQHT2A1QT375OMG. You must be an admin or operator of this advertiser account.', + }), metadata: generateMetadata(1234), }, ], diff --git a/test/integrations/destinations/tiktok_ads/dataDelivery/other.ts b/test/integrations/destinations/tiktok_ads/dataDelivery/other.ts index 0675ebcd051..48c59c3ff90 100644 --- a/test/integrations/destinations/tiktok_ads/dataDelivery/other.ts +++ b/test/integrations/destinations/tiktok_ads/dataDelivery/other.ts @@ -57,7 +57,10 @@ export const v1OtherScenarios: ProxyV1TestData[] = [ message: 'Request failed with status: 40100', response: [ { - error: '{"code":40100,"message":"Too many requests. Please retry in some time."}', + error: JSON.stringify({ + code: 40100, + message: 'Too many requests. Please retry in some time.', + }), statusCode: 429, metadata: generateMetadata(1234), }, @@ -157,8 +160,13 @@ export const v1OtherScenarios: ProxyV1TestData[] = [ message: 'Request failed with status: 503', response: [ { - error: - '{"error":{"message":"Service Unavailable","description":"The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later."}}', + error: JSON.stringify({ + error: { + message: 'Service Unavailable', + description: + 'The server is currently unable to handle the request due to temporary overloading or maintenance of the server. Please try again later.', + }, + }), statusCode: 503, metadata: generateMetadata(1234), }, diff --git a/test/integrations/destinations/tiktok_ads_offline_events/processor/data.ts b/test/integrations/destinations/tiktok_ads_offline_events/processor/data.ts index 81e125eacab..0f0559e7dd8 100644 --- a/test/integrations/destinations/tiktok_ads_offline_events/processor/data.ts +++ b/test/integrations/destinations/tiktok_ads_offline_events/processor/data.ts @@ -543,8 +543,18 @@ export const data = [ properties: { phone: 'c4994d14e724936f1169147dddf1673a09af69b55cc54bc695dbe246bd093b05', value: 32.839999999999996, - emails: - '["efaaf5c8803af4fbf305d7a110c832673d89ed40983770329092fd04b0ba7900","078d6c8e19f24093368d1712d7801970467f59216f7ccc087bf81b91e0e1f68f","","","","","","","",""]', + emails: JSON.stringify([ + 'efaaf5c8803af4fbf305d7a110c832673d89ed40983770329092fd04b0ba7900', + '078d6c8e19f24093368d1712d7801970467f59216f7ccc087bf81b91e0e1f68f', + '', + '', + '', + '', + '', + '', + '', + '', + ]), eventId: '8965fb56-090f-47a5-aa7f-bbab22d9ec90', currency: 'USD', order_id: 60241286212, @@ -667,8 +677,18 @@ export const data = [ properties: { phone: 'c4994d14e724936f1169147dddf1673a09af69b55cc54bc695dbe246bd093b05', value: 32.839999999999996, - emails: - '["efaaf5c8803af4fbf305d7a110c832673d89ed40983770329092fd04b0ba7900","078d6c8e19f24093368d1712d7801970467f59216f7ccc087bf81b91e0e1f68f","","","","","","","",""]', + emails: JSON.stringify([ + 'efaaf5c8803af4fbf305d7a110c832673d89ed40983770329092fd04b0ba7900', + '078d6c8e19f24093368d1712d7801970467f59216f7ccc087bf81b91e0e1f68f', + '', + '', + '', + '', + '', + '', + '', + '', + ]), eventId: '8965fb56-090f-47a5-aa7f-bbab22d9ec90', currency: 'USD', order_id: 60241286212, @@ -787,8 +807,18 @@ export const data = [ properties: { phone: 'c4994d14e724936f1169147dddf1673a09af69b55cc54bc695dbe246bd093b05', value: 32.839999999999996, - emails: - '["efaaf5c8803af4fbf305d7a110c832673d89ed40983770329092fd04b0ba7900","078d6c8e19f24093368d1712d7801970467f59216f7ccc087bf81b91e0e1f68f","","","","","","","",""]', + emails: JSON.stringify([ + 'efaaf5c8803af4fbf305d7a110c832673d89ed40983770329092fd04b0ba7900', + '078d6c8e19f24093368d1712d7801970467f59216f7ccc087bf81b91e0e1f68f', + '', + '', + '', + '', + '', + '', + '', + '', + ]), eventId: '8965fb56-090f-47a5-aa7f-bbab22d9ec90', currency: 'USD', order_id: 60241286212, diff --git a/test/integrations/destinations/topsort/maskedSecrets.ts b/test/integrations/destinations/topsort/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/topsort/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/topsort/processor/trackClicksTestData.ts b/test/integrations/destinations/topsort/processor/trackClicksTestData.ts index 2cfd4589053..418f40bb919 100644 --- a/test/integrations/destinations/topsort/processor/trackClicksTestData.ts +++ b/test/integrations/destinations/topsort/processor/trackClicksTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { @@ -19,7 +20,7 @@ const destination: Destination = { }, }, Config: { - apiKey: 'test-api', + apiKey: secret1, connectionMode: { web: 'cloud', }, @@ -97,6 +98,7 @@ export const trackClicksTestData: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -109,7 +111,7 @@ export const trackClicksTestData: ProcessorTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, userId: '', @@ -216,6 +218,7 @@ export const trackClicksTestData: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -228,7 +231,7 @@ export const trackClicksTestData: ProcessorTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, userId: '', @@ -356,6 +359,7 @@ export const trackClicksTestData: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -477,6 +481,7 @@ export const trackClicksTestData: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -489,7 +494,7 @@ export const trackClicksTestData: ProcessorTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, userId: '', diff --git a/test/integrations/destinations/topsort/processor/trackImpressionsTestData.ts b/test/integrations/destinations/topsort/processor/trackImpressionsTestData.ts index 2f1fc60571c..c71bc855380 100644 --- a/test/integrations/destinations/topsort/processor/trackImpressionsTestData.ts +++ b/test/integrations/destinations/topsort/processor/trackImpressionsTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { @@ -19,7 +20,7 @@ const destination: Destination = { }, }, Config: { - apiKey: 'test-api', + apiKey: secret1, connectionMode: { web: 'cloud', }, @@ -93,6 +94,7 @@ export const trackImpressionsTestData: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -105,7 +107,7 @@ export const trackImpressionsTestData: ProcessorTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, userId: '', @@ -212,6 +214,7 @@ export const trackImpressionsTestData: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -224,7 +227,7 @@ export const trackImpressionsTestData: ProcessorTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, userId: '', @@ -352,6 +355,7 @@ export const trackImpressionsTestData: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/topsort/processor/trackPurchasesTestData.ts b/test/integrations/destinations/topsort/processor/trackPurchasesTestData.ts index a4736fb471b..db2fc6dcc69 100644 --- a/test/integrations/destinations/topsort/processor/trackPurchasesTestData.ts +++ b/test/integrations/destinations/topsort/processor/trackPurchasesTestData.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { ProcessorTestData } from '../../../testTypes'; import { @@ -19,7 +20,7 @@ const destination: Destination = { }, }, Config: { - apiKey: 'test-api', + apiKey: secret1, connectionMode: { web: 'cloud', }, @@ -93,6 +94,7 @@ export const trackPurchasesTestData: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -105,7 +107,7 @@ export const trackPurchasesTestData: ProcessorTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, userId: '', @@ -212,6 +214,7 @@ export const trackPurchasesTestData: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -224,7 +227,7 @@ export const trackPurchasesTestData: ProcessorTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, userId: '', @@ -355,6 +358,7 @@ export const trackPurchasesTestData: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -367,7 +371,7 @@ export const trackPurchasesTestData: ProcessorTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, userId: '', @@ -411,7 +415,7 @@ export const trackPurchasesTestData: ProcessorTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, userId: '', diff --git a/test/integrations/destinations/topsort/router/data.ts b/test/integrations/destinations/topsort/router/data.ts index 0cabdcbac8d..7314df2c68d 100644 --- a/test/integrations/destinations/topsort/router/data.ts +++ b/test/integrations/destinations/topsort/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; import { Destination } from '../../../../../src/types'; import { RouterTestData } from '../../../testTypes'; import { generateMetadata } from '../../../testUtils'; @@ -14,7 +15,7 @@ const destination: Destination = { }, }, Config: { - apiKey: 'test-api', + apiKey: secret1, connectionMode: { web: 'cloud', }, @@ -97,6 +98,7 @@ export const data: RouterTestData[] = [ ], destType: 'topsort', }, + method: 'POST', }, }, output: { @@ -112,7 +114,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, body: { @@ -228,6 +230,7 @@ export const data: RouterTestData[] = [ ], destType: 'topsort', }, + method: 'POST', }, }, output: { @@ -243,7 +246,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, body: { @@ -353,6 +356,7 @@ export const data: RouterTestData[] = [ ], destType: 'topsort', }, + method: 'POST', }, }, output: { @@ -368,7 +372,7 @@ export const data: RouterTestData[] = [ endpoint: 'https://api.topsort.com/v2/events', headers: { 'content-type': 'application/json', - Authorization: 'Bearer test-api', + Authorization: authHeader1, }, params: {}, body: { diff --git a/test/integrations/destinations/trengo/maskedSecrets.ts b/test/integrations/destinations/trengo/maskedSecrets.ts new file mode 100644 index 00000000000..61db9ef38a9 --- /dev/null +++ b/test/integrations/destinations/trengo/maskedSecrets.ts @@ -0,0 +1,6 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const authHeader1 = `Bearer ${secret1}`; +export const authHeader2 = `Bearer ${secret2}`; diff --git a/test/integrations/destinations/trengo/network.ts b/test/integrations/destinations/trengo/network.ts index 62b50165580..caf798abe8b 100644 --- a/test/integrations/destinations/trengo/network.ts +++ b/test/integrations/destinations/trengo/network.ts @@ -1,8 +1,9 @@ +import { authHeader1, authHeader2 } from './maskedSecrets'; export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -80,7 +81,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -110,7 +111,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -140,7 +141,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -152,7 +153,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -182,7 +183,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -194,7 +195,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -319,7 +320,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -453,7 +454,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -587,7 +588,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -712,7 +713,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -846,7 +847,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -980,7 +981,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -1114,7 +1115,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -1248,7 +1249,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, method: 'GET', @@ -1326,7 +1327,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Bearer wrong_trengo_integration_test_api_token', + Authorization: authHeader2, }, method: 'GET', diff --git a/test/integrations/destinations/trengo/processor/data.ts b/test/integrations/destinations/trengo/processor/data.ts index 6772a1b940c..0efa45ab551 100644 --- a/test/integrations/destinations/trengo/processor/data.ts +++ b/test/integrations/destinations/trengo/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; export const data = [ { name: 'trengo', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_email_channel', channelIdentifier: 'email', enableDedup: true, @@ -71,7 +72,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -105,7 +106,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_email_channel', channelIdentifier: 'phone', enableDedup: true, @@ -186,7 +187,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'phone', enableDedup: true, @@ -246,7 +247,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -280,7 +281,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'phone', enableDedup: true, @@ -361,7 +362,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'phone', enableDedup: true, @@ -441,7 +442,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'phone', enableDedup: false, @@ -501,7 +502,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -535,7 +536,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_email_channel', channelIdentifier: 'email', enableDedup: false, @@ -600,7 +601,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -634,7 +635,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_email_channel', channelIdentifier: 'email', enableDedup: false, @@ -695,7 +696,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -729,7 +730,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'phone', enableDedup: false, @@ -811,7 +812,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'email', enableDedup: false, @@ -878,7 +879,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -912,7 +913,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'email', enableDedup: false, @@ -979,7 +980,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -1009,7 +1010,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'email', enableDedup: false, @@ -1076,7 +1077,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -1106,7 +1107,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'email', enableDedup: false, @@ -1173,7 +1174,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -1207,7 +1208,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'email', enableDedup: false, @@ -1293,7 +1294,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'phone', enableDedup: true, @@ -1353,7 +1354,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { JSON: { name: 'Thalmor Bretz 2' }, XML: {}, JSON_ARRAY: {}, FORM: {} }, @@ -1378,7 +1379,7 @@ export const data = [ { destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'email', enableDedup: false, @@ -1443,7 +1444,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -1474,7 +1475,7 @@ export const data = [ { destination: { Config: { - apiToken: 'wrong_trengo_integration_test_api_token', + apiToken: secret2, channelId: 'trengo_phone_channel', channelIdentifier: 'email', enableDedup: false, @@ -1528,8 +1529,13 @@ export const data = [ body: [ { // though we are getting undefined as statusText through mocked response but we are getting that from actual response - error: - '{"message":"Inside lookupContact, failed to make request: undefined","destinationResponse":{"response":{"message":"Unauthenticated.","errors":[]},"status":401}}', + error: JSON.stringify({ + message: 'Inside lookupContact, failed to make request: undefined', + destinationResponse: { + response: { message: 'Unauthenticated.', errors: [] }, + status: 401, + }, + }), statTags: { destType: 'TRENGO', errorCategory: 'network', diff --git a/test/integrations/destinations/trengo/router/data.ts b/test/integrations/destinations/trengo/router/data.ts index f7b50220363..6e1f956e488 100644 --- a/test/integrations/destinations/trengo/router/data.ts +++ b/test/integrations/destinations/trengo/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'trengo', @@ -48,7 +49,7 @@ export const data = [ metadata: { jobId: 2, userId: 'u1' }, destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'phone', enableDedup: true, @@ -125,7 +126,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -141,7 +142,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_phone_channel', channelIdentifier: 'phone', enableDedup: true, @@ -245,7 +246,7 @@ export const data = [ metadata: { jobId: 2, userId: 'u1' }, destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_email_channel', channelIdentifier: 'email', enableDedup: true, @@ -322,7 +323,7 @@ export const data = [ headers: { 'Content-Type': 'application/json', Accept: 'application/json', - Authorization: 'Bearer trengo_integration_test_api_token', + Authorization: authHeader1, }, params: {}, body: { @@ -342,7 +343,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiToken: 'trengo_integration_test_api_token', + apiToken: secret1, channelId: 'trengo_email_channel', channelIdentifier: 'email', enableDedup: true, diff --git a/test/integrations/destinations/tune/processor/trackTestData.ts b/test/integrations/destinations/tune/processor/trackTestData.ts index d9bfab54e39..d42c4136b67 100644 --- a/test/integrations/destinations/tune/processor/trackTestData.ts +++ b/test/integrations/destinations/tune/processor/trackTestData.ts @@ -78,6 +78,7 @@ export const trackTestdata: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -140,6 +141,7 @@ export const trackTestdata: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { @@ -198,6 +200,7 @@ export const trackTestdata: ProcessorTestData[] = [ destination, }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/tune/router/data.ts b/test/integrations/destinations/tune/router/data.ts index 4aee5b89673..488655a41fc 100644 --- a/test/integrations/destinations/tune/router/data.ts +++ b/test/integrations/destinations/tune/router/data.ts @@ -78,6 +78,7 @@ export const data: RouterTestData[] = [ ], destType: 'tune', }, + method: 'POST', }, }, output: { @@ -134,7 +135,6 @@ export const data: RouterTestData[] = [ destination, metadata: generateMetadata(1), message: { - type: 123, event: 'Product added', anonymousId: 'sampath', channel: 'web', @@ -156,6 +156,7 @@ export const data: RouterTestData[] = [ ], destType: 'tune', }, + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/twitter_ads/processor/data.ts b/test/integrations/destinations/twitter_ads/processor/data.ts index 0ae21ffc98e..61a03fc64b4 100644 --- a/test/integrations/destinations/twitter_ads/processor/data.ts +++ b/test/integrations/destinations/twitter_ads/processor/data.ts @@ -137,12 +137,12 @@ export const data = [ contents: [ { content_id: '12', - content_price: 123.3345, + content_price: '123.3345', num_items: 12, }, { content_id: '4', - content_price: 200, + content_price: '200.00', num_items: 11, }, ], @@ -292,7 +292,7 @@ export const data = [ }, statusCode: 400, error: - '[TWITTER ADS]: one of twclid, phone, email, ip_address or user_agent must be present in properties.', + '[TWITTER ADS]: one of twclid, phone, email or ip_address with user_agent must be present in properties.', statTags: { errorCategory: 'dataValidation', errorType: 'instrumentation', @@ -851,12 +851,12 @@ export const data = [ contents: [ { content_id: '12', - content_price: 123.3345, + content_price: '123.3345', num_items: 12, }, { content_id: '4', - content_price: 200, + content_price: '200.00', num_items: 11, }, ], @@ -969,6 +969,192 @@ export const data = [ ], }, }, + output: { + response: { + status: 200, + body: [ + { + error: + '[TWITTER ADS]: one of twclid, phone, email or ip_address with user_agent must be present in properties.', + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'TWITTER_ADS', + module: 'destination', + implementation: 'native', + feature: 'processor', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for track event with user_agent as an identifier', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Home Page Viewed', + channel: 'web', + context: { + source: 'test', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + }, + }, + properties: { + affiliation: 'Google Store', + user_agent: + ' Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36.', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + secret: { + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + rudderAccountId: '2EOknn1JNH7WK1MfNku4fGYKkRK', + twitterAdsEventNames: [ + { + rudderEventName: 'ABC Searched', + twitterEventId: 'tw-234234324234', + }, + { + rudderEventName: 'Home Page Viewed', + twitterEventId: 'tw-odt2o-odt2q', + }, + ], + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + error: + '[TWITTER ADS]: one of twclid, phone, email or ip_address with user_agent must be present in properties.', + metadata: { + secret: { + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'TWITTER_ADS', + module: 'destination', + implementation: 'native', + feature: 'processor', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for track event with ip_address and user_agent as an identifier', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Home Page Viewed', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + }, + device: { + advertisingId: 'abc123', + }, + library: { + name: 'rudder-sdk-ruby-sync', + version: '1.0.6', + }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + ip_address: '8.25.197.25', + user_agent: + ' Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36.', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + rudderAccountId: '2EOknn1JNH7WK1MfNku4fGYKkRK', + twitterAdsEventNames: [ + { + rudderEventName: 'ABC Searched', + twitterEventId: 'tw-234234324234', + }, + { + rudderEventName: 'Home Page Viewed', + twitterEventId: 'tw-odt2o-odt2q', + }, + ], + }, + }, + }, + ], + }, + }, output: { response: { status: 200, @@ -994,6 +1180,8 @@ export const data = [ identifiers: [ { ip_address: '8.25.197.25', + user_agent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36.', }, ], }, @@ -1022,7 +1210,7 @@ export const data = [ }, { name: 'twitter_ads', - description: 'Test case for track event with user_agent as an identifier', + description: 'Test case for track event with email and ip_address as an identifier', feature: 'processor', module: 'destination', version: 'v0', @@ -1036,17 +1224,28 @@ export const data = [ channel: 'web', context: { source: 'test', + userAgent: 'chrome', traits: { anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', email: 'abc@gmail.com', phone: '+1234589947', ge: 'male', }, + device: { + advertisingId: 'abc123', + }, + library: { + name: 'rudder-sdk-ruby-sync', + version: '1.0.6', + }, }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', properties: { affiliation: 'Google Store', - user_agent: - ' Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36.', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + ip_address: '8.25.197.25', + email: 'abc@ax.com', }, anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', integrations: { @@ -1055,6 +1254,9 @@ export const data = [ }, metadata: { secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', accessTokenSecret: 'testAccessTokenSecret', }, }, @@ -1097,11 +1299,14 @@ export const data = [ JSON: { conversions: [ { + conversion_time: '2020-08-14T05:30:30.118Z', + user_agent: 'chrome', event_id: 'tw-odt2o-odt2q', identifiers: [ { - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36.', + hashed_email: + '4c3c8a8cba2f3bb1e9e617301f85d1f68e816a01c7b716f482f2ab9adb8181fb', + ip_address: '8.25.197.25', }, ], }, @@ -1116,6 +1321,1076 @@ export const data = [ }, metadata: { secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for track event with phone and user_agent as an identifier', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Home Page Viewed', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + }, + device: { + advertisingId: 'abc123', + }, + library: { + name: 'rudder-sdk-ruby-sync', + version: '1.0.6', + }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + user_agent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36.', + phone: '+919927455678', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + rudderAccountId: '2EOknn1JNH7WK1MfNku4fGYKkRK', + twitterAdsEventNames: [ + { + rudderEventName: 'ABC Searched', + twitterEventId: 'tw-234234324234', + }, + { + rudderEventName: 'Home Page Viewed', + twitterEventId: 'tw-odt2o-odt2q', + }, + ], + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ads-api.twitter.com/12/measurement/conversions/dummyPixelId', + headers: { + Authorization: authHeaderConstant, + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + conversions: [ + { + conversion_time: '2020-08-14T05:30:30.118Z', + user_agent: 'chrome', + event_id: 'tw-odt2o-odt2q', + identifiers: [ + { + hashed_phone_number: + 'b308962b96b40cce7981493a372db9478edae79f83c2d8ca6cd15a39566f8c56', + user_agent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36.', + }, + ], + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: + 'Test case for track event with twclid and ip_address with user_agent as an identifier', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Home Page Viewed', + channel: 'web', + context: { + source: 'test', + userAgent: 'chrome', + traits: { + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + email: 'abc@gmail.com', + phone: '+1234589947', + ge: 'male', + }, + device: { + advertisingId: 'abc123', + }, + library: { + name: 'rudder-sdk-ruby-sync', + version: '1.0.6', + }, + }, + messageId: '7208bbb6-2c4e-45bb-bf5b-ad426f3593e9', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + affiliation: 'Google Store', + checkout_id: 'fksdjfsdjfisjf9sdfjsd9f', + twclid: '543', + ip_address: '8.25.197.25', + user_agent: + ' Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36.', + }, + anonymousId: '50be5c78-6c3f-4b60-be84-97805a316fb1', + integrations: { + All: true, + }, + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + rudderAccountId: '2EOknn1JNH7WK1MfNku4fGYKkRK', + twitterAdsEventNames: [ + { + rudderEventName: 'ABC Searched', + twitterEventId: 'tw-234234324234', + }, + { + rudderEventName: 'Home Page Viewed', + twitterEventId: 'tw-odt2o-odt2q', + }, + ], + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ads-api.twitter.com/12/measurement/conversions/dummyPixelId', + headers: { + Authorization: authHeaderConstant, + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + conversions: [ + { + conversion_time: '2020-08-14T05:30:30.118Z', + user_agent: 'chrome', + event_id: 'tw-odt2o-odt2q', + identifiers: [ + { + twclid: '543', + }, + { + ip_address: '8.25.197.25', + user_agent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36.', + }, + ], + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for email with only ip_address (no user_agent)', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Home Page Viewed', + properties: { + email: 'test@example.com', + ip_address: '8.25.197.25', + // user_agent is intentionally missing + }, + timestamp: '2020-08-14T05:30:30.118Z', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { + rudderEventName: 'Home Page Viewed', + twitterEventId: 'tw-odt2o-odt2q', + }, + ], + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ads-api.twitter.com/12/measurement/conversions/dummyPixelId', + headers: { + Authorization: authHeaderConstant, + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + conversions: [ + { + conversion_time: '2020-08-14T05:30:30.118Z', + event_id: 'tw-odt2o-odt2q', + identifiers: [ + { + hashed_email: + '973dfe463ec85785f5f95af5ba3906eedb2d931c24e69824a89ea65dba4e813b', + ip_address: '8.25.197.25', + }, + ], + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for email with only user_agent (no ip_address)', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Home Page Viewed', + properties: { + email: 'test@example.com', + user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)', + // ip_address is intentionally missing + }, + timestamp: '2020-08-14T05:30:30.118Z', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { + rudderEventName: 'Home Page Viewed', + twitterEventId: 'tw-odt2o-odt2q', + }, + ], + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ads-api.twitter.com/12/measurement/conversions/dummyPixelId', + headers: { + Authorization: authHeaderConstant, + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + conversions: [ + { + conversion_time: '2020-08-14T05:30:30.118Z', + event_id: 'tw-odt2o-odt2q', + identifiers: [ + { + hashed_email: + '973dfe463ec85785f5f95af5ba3906eedb2d931c24e69824a89ea65dba4e813b', + user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)', + }, + ], + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for content transformations with missing price and quantity', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + email: 'abc@ax.com', + contents: [ + { + // No price or quantity + id: '12', + name: 'Product 1', + type: 'physical', + groupId: 'group1', + }, + { + // Only price, no quantity + id: '13', + price: '200', + name: 'Product 2', + type: 'digital', + }, + { + // Only quantity, no price + id: '14', + quantity: '3', + name: 'Product 3', + groupId: 'group2', + }, + ], + }, + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { + rudderEventName: 'ABC Searched', + twitterEventId: 'tw-234234324234', + }, + ], + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ads-api.twitter.com/12/measurement/conversions/dummyPixelId', + headers: { + Authorization: authHeaderConstant, + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + conversions: [ + { + conversion_time: '2020-08-14T05:30:30.118Z', + event_id: 'tw-234234324234', + identifiers: [ + { + hashed_email: + '4c3c8a8cba2f3bb1e9e617301f85d1f68e816a01c7b716f482f2ab9adb8181fb', + }, + ], + contents: [ + { + content_id: '12', + content_name: 'Product 1', + content_type: 'physical', + content_group_id: 'group1', + }, + { + content_id: '13', + content_name: 'Product 2', + content_type: 'digital', + content_price: '200.00', + }, + { + content_id: '14', + content_name: 'Product 3', + content_group_id: 'group2', + num_items: 3, + }, + ], + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for content with no mappable fields', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + email: 'abc@ax.com', + contents: [ + { + // No mappable fields - should be filtered out + someOtherField: 'value', + anotherField: 123, + }, + { + // Valid content - should be included + id: '13', + name: 'Product 2', + }, + ], + }, + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { + rudderEventName: 'ABC Searched', + twitterEventId: 'tw-234234324234', + }, + ], + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ads-api.twitter.com/12/measurement/conversions/dummyPixelId', + headers: { + Authorization: authHeaderConstant, + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + conversions: [ + { + conversion_time: '2020-08-14T05:30:30.118Z', + event_id: 'tw-234234324234', + identifiers: [ + { + hashed_email: + '4c3c8a8cba2f3bb1e9e617301f85d1f68e816a01c7b716f482f2ab9adb8181fb', + }, + ], + contents: [ + { + content_id: '13', + content_name: 'Product 2', + }, + ], + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for missing eventNameToIdMappings in config', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'Product Viewed', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + email: 'test@example.com', + ip_address: '8.25.197.25', + user_agent: 'Mozilla/5.0', + }, + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + // twitterAdsEventNames is intentionally missing + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + statusCode: 400, + error: + "[TWITTER ADS]: Event - 'Product Viewed' do not have a corresponding eventId in configuration. Aborting", + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statTags: { + errorCategory: 'dataValidation', + errorType: 'configuration', + destType: 'TWITTER_ADS', + module: 'destination', + implementation: 'native', + feature: 'processor', + }, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for empty string identifiers', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + email: '', + phone: '', + twclid: '', + ip_address: '', + user_agent: '', + // All identifier fields present but empty + }, + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { + rudderEventName: 'ABC Searched', + twitterEventId: 'tw-234234324234', + }, + ], + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + statusCode: 400, + error: + '[TWITTER ADS]: one of twclid, phone, email or ip_address with user_agent must be present in properties.', + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'TWITTER_ADS', + module: 'destination', + implementation: 'native', + feature: 'processor', + }, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for all invalid contents', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + email: 'test@example.com', + value: '100', + currency: 'USD', + contents: [ + { + // No valid mappable fields + invalidField1: 'value1', + invalidField2: 'value2', + }, + { + // Another invalid content + someField: 123, + otherField: true, + }, + ], + }, + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { + rudderEventName: 'ABC Searched', + twitterEventId: 'tw-234234324234', + }, + ], + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ads-api.twitter.com/12/measurement/conversions/dummyPixelId', + headers: { + Authorization: authHeaderConstant, + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + conversions: [ + { + conversion_time: '2020-08-14T05:30:30.118Z', + event_id: 'tw-234234324234', + value: '100', + price_currency: 'USD', + identifiers: [ + { + hashed_email: + '973dfe463ec85785f5f95af5ba3906eedb2d931c24e69824a89ea65dba4e813b', + }, + ], + // contents field should not be present as all contents were invalid + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for content transformations with invalid content price', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + message: { + type: 'track', + event: 'ABC Searched', + timestamp: '2020-08-14T05:30:30.118Z', + properties: { + email: 'abc@ax.com', + contents: [ + { + // invalid price + id: '12', + price: 'random-price-string', + name: 'Product 1', + type: 'physical', + groupId: 'group1', + }, + { + // valid price + id: '13', + price: '0', + name: 'Product 2', + type: 'digital', + }, + ], + }, + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { + rudderEventName: 'ABC Searched', + twitterEventId: 'tw-234234324234', + }, + ], + }, + }, + }, + ], + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://ads-api.twitter.com/12/measurement/conversions/dummyPixelId', + headers: { + Authorization: authHeaderConstant, + 'Content-Type': 'application/json', + }, + params: {}, + body: { + JSON: { + conversions: [ + { + conversion_time: '2020-08-14T05:30:30.118Z', + event_id: 'tw-234234324234', + identifiers: [ + { + hashed_email: + '4c3c8a8cba2f3bb1e9e617301f85d1f68e816a01c7b716f482f2ab9adb8181fb', + }, + ], + contents: [ + { + content_id: '12', + content_name: 'Product 1', + content_type: 'physical', + content_group_id: 'group1', + }, + { + content_id: '13', + content_name: 'Product 2', + content_type: 'digital', + content_price: '0.00', + }, + ], + }, + ], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', accessTokenSecret: 'testAccessTokenSecret', }, }, diff --git a/test/integrations/destinations/twitter_ads/router/data.ts b/test/integrations/destinations/twitter_ads/router/data.ts index 7e8061dd7e5..900387a654b 100644 --- a/test/integrations/destinations/twitter_ads/router/data.ts +++ b/test/integrations/destinations/twitter_ads/router/data.ts @@ -127,8 +127,8 @@ export const data = [ conversions: [ { contents: [ - { content_id: '12', content_price: 123.3345, num_items: 12 }, - { content_id: '4', content_price: 200, num_items: 11 }, + { content_id: '12', content_price: '123.3345', num_items: 12 }, + { content_id: '4', content_price: '200.00', num_items: 11 }, ], conversion_id: '213123', conversion_time: '2023-06-01T06:03:08.739Z', @@ -193,6 +193,229 @@ export const data = [ }, }, }, + { + name: 'twitter_ads', + description: 'Test case for missing properties in message', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + type: 'track', + event: 'Home Page Viewed', + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { + rudderEventName: 'Home Page Viewed', + twitterEventId: 'tw-odt2o-odt2q', + }, + ], + }, + }, + }, + ], + destType: 'twitter_ads', + }, + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batched: false, + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { rudderEventName: 'Home Page Viewed', twitterEventId: 'tw-odt2o-odt2q' }, + ], + }, + }, + statusCode: 400, + error: '[TWITTER ADS]: properties must be present in event. Aborting message', + metadata: [ + { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + ], + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'TWITTER_ADS', + module: 'destination', + implementation: 'native', + feature: 'router', + }, + }, + ], + }, + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for missing OAuth secret', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + type: 'track', + event: 'Home Page Viewed', + properties: { + email: 'test@test.com', + }, + }, + metadata: {}, // Missing secret + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { + rudderEventName: 'Home Page Viewed', + twitterEventId: 'tw-odt2o-odt2q', + }, + ], + }, + }, + }, + ], + destType: 'twitter_ads', + }, + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batched: false, + destination: { + Config: { + pixelId: 'dummyPixelId', + twitterAdsEventNames: [ + { rudderEventName: 'Home Page Viewed', twitterEventId: 'tw-odt2o-odt2q' }, + ], + }, + }, + statusCode: 500, + error: '[TWITTER ADS]:: OAuth - access keys not found', + metadata: [{}], + statTags: { + errorCategory: 'platform', + errorType: 'oAuthSecret', + destType: 'TWITTER_ADS', + module: 'destination', + implementation: 'native', + feature: 'router', + }, + }, + ], + }, + }, + }, + }, + { + name: 'twitter_ads', + description: 'Test case for unsupported message type', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + type: 'identify', // Unsupported message type + properties: { + email: 'test@test.com', + }, + }, + metadata: { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + destination: { + Config: { + pixelId: 'dummyPixelId', + }, + }, + }, + ], + destType: 'twitter_ads', + }, + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batched: false, + destination: { + Config: { + pixelId: 'dummyPixelId', + }, + }, + statusCode: 400, + error: 'Message type identify not supported', + metadata: [ + { + secret: { + consumerKey: 'qwe', + consumerSecret: 'fdghv', + accessToken: 'dummyAccessToken', + accessTokenSecret: 'testAccessTokenSecret', + }, + }, + ], + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'TWITTER_ADS', + module: 'destination', + implementation: 'native', + feature: 'router', + }, + }, + ], + }, + }, + }, + }, ].map((tc) => ({ ...tc, mockFns: (_) => { diff --git a/test/integrations/destinations/user/maskedSecrets.ts b/test/integrations/destinations/user/maskedSecrets.ts new file mode 100644 index 00000000000..35f0f387449 --- /dev/null +++ b/test/integrations/destinations/user/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Token ${secret1}`; diff --git a/test/integrations/destinations/user/network.ts b/test/integrations/destinations/user/network.ts index dff2e0726d8..d0a89b22821 100644 --- a/test/integrations/destinations/user/network.ts +++ b/test/integrations/destinations/user/network.ts @@ -1,8 +1,9 @@ +import { authHeader1 } from './maskedSecrets'; export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, @@ -44,7 +45,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, @@ -92,7 +93,7 @@ export const networkCallsData = [ user_custom_id: 'user@123', }, headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, @@ -130,7 +131,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, @@ -167,7 +168,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, @@ -204,7 +205,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, @@ -241,7 +242,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, @@ -277,7 +278,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, @@ -313,7 +314,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, @@ -355,7 +356,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, @@ -403,7 +404,7 @@ export const networkCallsData = [ user_custom_id: 'user@123', }, headers: { - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, diff --git a/test/integrations/destinations/user/processor/data.ts b/test/integrations/destinations/user/processor/data.ts index ef8ddebfd58..a6a195d8934 100644 --- a/test/integrations/destinations/user/processor/data.ts +++ b/test/integrations/destinations/user/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'user', @@ -22,7 +23,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appSubdomain: 'commander', userEvents: [{ rsEventName: 'login', userEventName: 'product viewed' }], companyAttributesMapping: [ @@ -87,7 +88,7 @@ export const data = [ traits: { googleUrl: 'www.google.com' }, }, destination: { - Config: { apiKey: 'dummyApiKey', appSubdomain: 'commander' }, + Config: { apiKey: secret1, appSubdomain: 'commander' }, }, }, ], @@ -133,7 +134,7 @@ export const data = [ timestamp: '2020-02-02T00:23:09.544Z', }, destination: { - Config: { apiKey: 'dummyApiKey', appSubdomain: 'commander' }, + Config: { apiKey: secret1, appSubdomain: 'commander' }, }, }, ], @@ -198,7 +199,7 @@ export const data = [ userId: 'user@123', }, destination: { - Config: { apiKey: 'dummyApiKey', appSubdomain: 'commander' }, + Config: { apiKey: secret1, appSubdomain: 'commander' }, }, }, ], @@ -258,7 +259,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appSubdomain: 'commander', userAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], }, @@ -297,7 +298,7 @@ export const data = [ files: {}, headers: { Accept: '*/*;version=2', - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'PUT', @@ -344,7 +345,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appSubdomain: 'commander', userAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], }, @@ -385,7 +386,7 @@ export const data = [ headers: { Accept: '*/*;version=2', 'Content-Type': 'application/json', - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://commander.user.com/api/public/users/59/', @@ -441,7 +442,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appSubdomain: 'commander', userAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], userEvents: [ @@ -482,7 +483,7 @@ export const data = [ headers: { Accept: '*/*;version=2', 'Content-Type': 'application/json', - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://commander.user.com/api/public/events/', @@ -551,7 +552,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appSubdomain: 'commander', userAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], userEvents: [ @@ -592,7 +593,7 @@ export const data = [ headers: { Accept: '*/*;version=2', 'Content-Type': 'application/json', - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://commander.user.com/api/public/site-views/', @@ -643,7 +644,7 @@ export const data = [ }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appSubdomain: 'commander', userAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], userEvents: [ @@ -683,7 +684,7 @@ export const data = [ headers: { Accept: '*/*;version=2', 'Content-Type': 'application/json', - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://commander.user.com/api/public/companies/21/add_member/', diff --git a/test/integrations/destinations/user/router/data.ts b/test/integrations/destinations/user/router/data.ts index acdb5c953e4..9ad050db38b 100644 --- a/test/integrations/destinations/user/router/data.ts +++ b/test/integrations/destinations/user/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'user', @@ -40,7 +41,7 @@ export const data = [ metadata: { jobId: 1, userId: 'u1' }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appSubdomain: 'commander', userAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], userEvents: [ @@ -83,7 +84,7 @@ export const data = [ headers: { Accept: '*/*;version=2', 'Content-Type': 'application/json', - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://commander.user.com/api/public/companies/21/add_member/', @@ -93,7 +94,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appSubdomain: 'commander', userAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], userEvents: [ @@ -149,7 +150,7 @@ export const data = [ metadata: { jobId: 2, userId: 'u1' }, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appSubdomain: 'commander', userAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], userEvents: [ @@ -204,7 +205,7 @@ export const data = [ headers: { Accept: '*/*;version=2', 'Content-Type': 'application/json', - Authorization: 'Token dummyApiKey', + Authorization: authHeader1, }, version: '1', endpoint: 'https://commander.user.com/api/public/users/59/', @@ -214,7 +215,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, appSubdomain: 'commander', userAttributesMapping: [{ from: 'useroccupation', to: 'occupation' }], userEvents: [ diff --git a/test/integrations/destinations/variance/maskedSecrets.ts b/test/integrations/destinations/variance/maskedSecrets.ts new file mode 100644 index 00000000000..74d160ff192 --- /dev/null +++ b/test/integrations/destinations/variance/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${base64Convertor(secret1)}`; diff --git a/test/integrations/destinations/variance/processor/data.ts b/test/integrations/destinations/variance/processor/data.ts index f4f3054296c..591d5a92503 100644 --- a/test/integrations/destinations/variance/processor/data.ts +++ b/test/integrations/destinations/variance/processor/data.ts @@ -1,3 +1,5 @@ +import { authHeader1 } from '../maskedSecrets'; + export const data = [ { name: 'variance', @@ -109,7 +111,7 @@ export const data = [ }, Config: { webhookUrl: 'http://6b0e6a60.ngrok.io', - authHeader: 'Basic MVA4dUtGOF=', + authHeader: authHeader1, }, }, metadata: { @@ -131,7 +133,7 @@ export const data = [ method: 'POST', endpoint: 'http://6b0e6a60.ngrok.io', headers: { - authorization: 'Basic MVA4dUtGOF=', + authorization: authHeader1, 'content-type': 'application/json', }, params: {}, diff --git a/test/integrations/destinations/vitally/maskedSecrets.ts b/test/integrations/destinations/vitally/maskedSecrets.ts new file mode 100644 index 00000000000..c5a4dc839e8 --- /dev/null +++ b/test/integrations/destinations/vitally/maskedSecrets.ts @@ -0,0 +1,5 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Basic ${secret1}`; diff --git a/test/integrations/destinations/vitally/processor/data.ts b/test/integrations/destinations/vitally/processor/data.ts index 2c3fdd32979..eee043de65f 100644 --- a/test/integrations/destinations/vitally/processor/data.ts +++ b/test/integrations/destinations/vitally/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'vitally', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - apiKeyVitally: 'abc123', + apiKeyVitally: secret1, }, DestinationDefinition: { Config: { @@ -66,7 +67,7 @@ export const data = [ method: 'POST', userId: '', headers: { - authorization: 'Basic abc123', + authorization: authHeader1, 'content-type': 'application/json', }, }, @@ -92,7 +93,7 @@ export const data = [ { destination: { Config: { - apiKeyVitally: 'abc123', + apiKeyVitally: secret1, }, DestinationDefinition: { Config: { @@ -145,7 +146,7 @@ export const data = [ method: 'POST', userId: '', headers: { - authorization: 'Basic abc123', + authorization: authHeader1, 'content-type': 'application/json', }, }, @@ -171,7 +172,7 @@ export const data = [ { destination: { Config: { - apiKeyVitally: 'abc123', + apiKeyVitally: secret1, }, DestinationDefinition: { Config: { @@ -220,7 +221,7 @@ export const data = [ method: 'POST', userId: '', headers: { - authorization: 'Basic abc123', + authorization: authHeader1, 'content-type': 'application/json', }, }, @@ -247,7 +248,7 @@ export const data = [ { destination: { Config: { - apiKeyVitally: 'abc123', + apiKeyVitally: secret1, }, DestinationDefinition: { Config: { diff --git a/test/integrations/destinations/webengage/maskedSecrets.ts b/test/integrations/destinations/webengage/maskedSecrets.ts new file mode 100644 index 00000000000..2feea9882d7 --- /dev/null +++ b/test/integrations/destinations/webengage/maskedSecrets.ts @@ -0,0 +1,4 @@ +import path from 'path'; + +export const secret1 = path.basename(__dirname) + 1; +export const authHeader1 = `Bearer ${secret1}`; diff --git a/test/integrations/destinations/webengage/processor/data.ts b/test/integrations/destinations/webengage/processor/data.ts index e4cc9bfd3df..62d43e98ce6 100644 --- a/test/integrations/destinations/webengage/processor/data.ts +++ b/test/integrations/destinations/webengage/processor/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1 } from '../maskedSecrets'; export const data = [ { name: 'webengage', @@ -11,7 +12,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -86,7 +87,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -141,7 +142,7 @@ export const data = [ endpoint: 'https://api.in.webengage.com/v1/accounts/3bjsjdbh7/events', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -202,7 +203,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -256,7 +257,7 @@ export const data = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -318,7 +319,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -372,7 +373,7 @@ export const data = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -434,7 +435,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -489,7 +490,7 @@ export const data = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -552,7 +553,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -645,7 +646,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', @@ -670,7 +671,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -763,7 +764,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', @@ -788,7 +789,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -880,7 +881,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', @@ -905,7 +906,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -959,7 +960,7 @@ export const data = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1022,7 +1023,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -1096,7 +1097,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -1170,7 +1171,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -1243,7 +1244,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'standard', }, @@ -1316,7 +1317,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'standard', }, @@ -1370,7 +1371,7 @@ export const data = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1433,7 +1434,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'standard', }, @@ -1486,7 +1487,7 @@ export const data = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1548,7 +1549,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -1632,7 +1633,7 @@ export const data = [ method: 'POST', params: {}, headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, version: '1', @@ -1657,7 +1658,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -1724,7 +1725,7 @@ export const data = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1764,7 +1765,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -1835,7 +1836,7 @@ export const data = [ method: 'POST', headers: { 'Content-Type': 'application/json', - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, }, params: {}, body: { @@ -1878,7 +1879,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -1954,7 +1955,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -2029,7 +2030,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -2118,7 +2119,7 @@ export const data = [ { destination: { Config: { - apiKey: 'dummyApiKey', + apiKey: secret1, licenseCode: '3bjsjdbh7', dataCenter: 'ind', }, @@ -2205,7 +2206,7 @@ export const data = [ endpoint: 'https://api.in.webengage.com/v1/accounts/3bjsjdbh7/events', files: {}, headers: { - Authorization: 'Bearer dummyApiKey', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', diff --git a/test/integrations/destinations/webhook/processor/data.ts b/test/integrations/destinations/webhook/processor/data.ts index 7720bc683c8..c4e29e30fc7 100644 --- a/test/integrations/destinations/webhook/processor/data.ts +++ b/test/integrations/destinations/webhook/processor/data.ts @@ -1939,7 +1939,7 @@ export const data = [ test2: 'value2', dynamic_header_key_string: 'dynamic_header_value_string', dynamic_header_key_num: '10', - dynamic_header_key_object: '{"k1":"v1"}', + dynamic_header_key_object: JSON.stringify({ k1: 'v1' }), }, params: {}, files: {}, @@ -3355,9 +3355,14 @@ export const data = [ files: {}, headers: { 'content-type': 'application/json', - ijkl: '{"int":1234,"string":"abcd","array":[1,2,"a",true],"object":{"key1":"value"}}', + ijkl: JSON.stringify({ + int: 1234, + string: 'abcd', + array: [1, 2, 'a', true], + object: { key1: 'value' }, + }), key1: 'abcd', - key2: '{"key1":"","key2":""}', + key2: JSON.stringify({ key1: '', key2: '' }), key3: 'true', key4: 'null', key5: 'undefined', diff --git a/test/integrations/destinations/wootric/maskedSecrets.ts b/test/integrations/destinations/wootric/maskedSecrets.ts new file mode 100644 index 00000000000..4fcad9f777b --- /dev/null +++ b/test/integrations/destinations/wootric/maskedSecrets.ts @@ -0,0 +1,10 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secretPassword = path.basename(__dirname) + 1; +export const secretAccountToken = path.basename(__dirname) + 2; +export const secretInvalidToken = path.basename(__dirname) + 3; +export const secretAccessToken = path.basename(__dirname) + 4; +export const secretRefreshToken = path.basename(__dirname) + 5; + +export const authHeaderAccessToken = `Bearer ${secretAccessToken}`; diff --git a/test/integrations/destinations/wootric/network.ts b/test/integrations/destinations/wootric/network.ts index 1b51cc700c2..5b89680b365 100644 --- a/test/integrations/destinations/wootric/network.ts +++ b/test/integrations/destinations/wootric/network.ts @@ -1,3 +1,10 @@ +import { + secretInvalidToken, + secretAccountToken, + secretAccessToken, + secretRefreshToken, +} from './maskedSecrets'; + export const networkCallsData = [ { httpReq: { @@ -134,15 +141,15 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://api.wootric.com/oauth/token?account_token=NPS-dummyToken', + url: `https://api.wootric.com/oauth/token?account_token=${secretAccountToken}`, method: 'POST', }, httpRes: { data: { - access_token: '2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + access_token: secretAccessToken, token_type: 'Bearer', expires_in: 7200, - refresh_token: 'f4033a61742e84405a5ef8b2e09b82395dc041f0259fd5fb715fc196a1b9cd52', + refresh_token: secretRefreshToken, scope: 'delete_account admin respond export read survey invalidate_response', created_at: 1660292389, }, @@ -169,7 +176,7 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://api.wootric.com/oauth/token?account_token=NPS-dummyToken12', + url: `https://api.wootric.com/oauth/token?account_token=${secretInvalidToken}`, method: 'POST', }, httpRes: { diff --git a/test/integrations/destinations/wootric/processor/data.ts b/test/integrations/destinations/wootric/processor/data.ts index ae747e982d5..94d005e6261 100644 --- a/test/integrations/destinations/wootric/processor/data.ts +++ b/test/integrations/destinations/wootric/processor/data.ts @@ -1,3 +1,10 @@ +import { + secretPassword, + secretAccountToken, + authHeaderAccessToken, + secretInvalidToken, +} from '../maskedSecrets'; + export const data = [ { name: 'wootric', @@ -12,8 +19,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken12', + password: secretPassword, + accountToken: secretInvalidToken, }, ID: 'wootric-1234', }, @@ -40,8 +47,11 @@ export const data = [ status: 200, body: [ { - error: - '{"message":"Access token could not be generated due to {\\"error\\":\\"Not found\\",\\"status\\":404}","destinationResponse":{"response":{"error":"Not found","status":404},"status":500}}', + error: JSON.stringify({ + message: + 'Access token could not be generated due to {"error":"Not found","status":404}', + destinationResponse: { response: { error: 'Not found', status: 404 }, status: 500 }, + }), statTags: { destType: 'WOOTRIC', errorCategory: 'network', @@ -69,8 +79,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -151,8 +161,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -194,8 +203,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -275,8 +284,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -317,8 +325,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -398,8 +406,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -440,8 +447,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -533,8 +540,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -634,8 +641,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -716,8 +723,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users/490635419', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -756,8 +762,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -832,8 +838,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users/486438462', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -871,8 +876,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -950,8 +955,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users/486438462', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -989,8 +993,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -1078,8 +1082,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users/486438462/responses', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -1121,8 +1124,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -1222,8 +1225,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -1329,8 +1332,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -1430,8 +1433,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -1509,8 +1512,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users/486438462/declines', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -1543,8 +1545,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -1643,8 +1645,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, @@ -1754,8 +1756,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: 'wootric-1234', }, diff --git a/test/integrations/destinations/wootric/router/data.ts b/test/integrations/destinations/wootric/router/data.ts index 9af28f4f483..1c29dcfae24 100644 --- a/test/integrations/destinations/wootric/router/data.ts +++ b/test/integrations/destinations/wootric/router/data.ts @@ -1,3 +1,5 @@ +import { secretPassword, secretAccountToken, authHeaderAccessToken } from '../maskedSecrets'; + export const data = [ { name: 'wootric', @@ -13,8 +15,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -77,8 +79,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -140,8 +142,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -203,8 +205,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -257,8 +259,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -319,8 +321,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -374,8 +376,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -429,8 +431,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -490,8 +492,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -558,8 +560,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -617,8 +619,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -676,8 +678,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -734,8 +736,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -792,8 +794,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -861,8 +863,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -942,8 +944,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -972,8 +973,8 @@ export const data = [ ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, }, }, @@ -985,8 +986,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -1014,8 +1014,8 @@ export const data = [ ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, }, }, @@ -1027,8 +1027,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -1056,8 +1055,8 @@ export const data = [ ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, }, }, @@ -1065,8 +1064,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -1087,8 +1086,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -1113,8 +1112,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users/486438462', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -1132,8 +1130,8 @@ export const data = [ ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, }, }, @@ -1145,8 +1143,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users/486438462', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -1164,8 +1161,8 @@ export const data = [ ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, }, }, @@ -1177,8 +1174,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users/486438462', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -1203,8 +1199,8 @@ export const data = [ ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, }, }, @@ -1216,8 +1212,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users/486438462/responses', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -1246,8 +1241,8 @@ export const data = [ ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, }, }, @@ -1256,8 +1251,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -1277,8 +1272,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -1303,8 +1298,7 @@ export const data = [ endpoint: 'https://api.wootric.com/v1/end_users/486438462/declines', headers: { 'Content-Type': 'application/x-www-form-urlencoded', - Authorization: - 'Bearer 2fe581c1c72851e73d60f4191f720be93e5d3e8a6147e37c4e8e852b1a8f506c', + Authorization: authHeaderAccessToken, }, params: {}, body: { @@ -1324,8 +1318,8 @@ export const data = [ ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, }, }, @@ -1333,8 +1327,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -1355,8 +1349,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, @@ -1378,8 +1372,8 @@ export const data = [ destination: { Config: { username: 'wootricfakeuser@example.com', - password: 'password@123', - accountToken: 'NPS-dummyToken', + password: secretPassword, + accountToken: secretAccountToken, }, ID: '2D7TqLto9tnkBuR1ciMrbiA4cbG', }, diff --git a/test/integrations/destinations/wunderkind/processor/validation.ts b/test/integrations/destinations/wunderkind/processor/validation.ts index aeabdd497b0..38c94ecef1e 100644 --- a/test/integrations/destinations/wunderkind/processor/validation.ts +++ b/test/integrations/destinations/wunderkind/processor/validation.ts @@ -30,6 +30,7 @@ export const validation: ProcessorTestData[] = [ metadata: generateMetadata(1), }, ], + method: 'POST', }, }, output: { diff --git a/test/integrations/destinations/wunderkind/router/data.ts b/test/integrations/destinations/wunderkind/router/data.ts index 8081bdf456f..8597901dd4d 100644 --- a/test/integrations/destinations/wunderkind/router/data.ts +++ b/test/integrations/destinations/wunderkind/router/data.ts @@ -111,8 +111,127 @@ export const data = [ }, { batchedRequest: { - payload: - '{"account":{"account_id":"test-account-id","account_settings":{"instance_id":"test-instance-id","key":"test-api-key"}},"type":"event_processing_request","id":"a2a5575b-d3b0-4a14-96a5-79f8e38b0778","timestamp_ms":1718893923387,"source_id":"test-source-id","source_channel":"native","device_application_stamp":"test-device-application-stamp","user_identities":[{"type":"customer","encoding":"raw","value":"eb3f565d-49bd-418c-ae31-801f25da0ce2"},{"type":"email","encoding":"raw","value":"johndoe@gmail.com"},{"type":"other","encoding":"raw","value":"7c2c3abd-62bf-473e-998d-034df0f25ea3"}],"user_attribute_lists":{},"runtime_environment":{"sdk_version":"8.8.0","type":"ios","identities":[{"type":"apple_push_notification_token","encoding":"raw","value":"9e3dba8db39f9d130f3d1584c8aab674e9f4b06d0b1b52867e128d3e7b1130f1"},{"type":"ios_vendor_id","encoding":"raw","value":"78c53c15-32a1-4b65-adac-bec2d7bb8fab"}],"build_id":"20E12","brand":"iPhone14,7","product":"iPhone14,7","name":"iPhone","manufacturer":"Apple","os_version":"16.3.1","model":"iPhone14,7","screen_height":2532,"screen_width":1170,"locale_language":"en-US","locale_country":"US","network_country":"us","network_carrier":"Verizon","network_code":"480","network_mobile_country_code":"311","timezone_offset":-7,"timezone_name":"America/Phoenix","cpu_architecture":"arm64","radio_access_technology":"LTE","application_name":"Abc.com - New Account","application_version":"8.8.0","application_package":"com.abc","apple_search_ads_attribution":{},"client_ip_address":"192.0.2.0"},"user_attributes":{"firstName":"john","lastName":"doe"},"events":[{"screen_name":"shopping/vehicle-details","type":"custom_event","id":"1393f120-53b8-4126-8deb-874c26b5b06d","timestamp_ms":1703685306737,"source_id":"test-source-id","session_id":1688982077105115000,"name":"srp-screen-view","custom_event_type":"other","attributes":{"profileLoginType":"logged-in","launchType":"organic","platform":"iphone-app","fuelType":"Gasoline","makeName":"Volvo","vehicleAdCategory":"multi_cat","searchInstanceId":"test-search-instance-id","customerId":"test-customer-id","drivetrain":"All-wheel Drive","year":"2024","canonical_mmt":"volvo:xc90:b5_core_bright_theme","mileage":"5","make":"volvo","pushNotification":"disabled","advertiserId":"00000000-0000-0000-0000-000000000000","exteriorColor":"Crystal White","adobeId":"test-adobe-id","pageChannel":"shopping","bodyStyle":"suv","tripId":"test-trip-id","stockType":"new","makeModelTrim":"volvo:xc90:b5_core_bright_theme","pageName":"shopping/vehicle-details","model":"xc90","deviceType":"mobile","listingId":"test-listing-id","dealerZip":"30341","cpoIndicator":"false","trim":"b5_core_bright_theme","canonical_mmty":"volvo:xc90:b5_core_bright_theme:2024","sellerType":"franchise","price":"56002","vin":"test-vin","resultSelected":"89","zip":"85381","stockSubStock":"new","profileUserId":"test-profile-user-id","pageKey":"vehicle-details","badges":"homeDelivery,virtualAppointment","modelName":"XC90"}}]}', + payload: JSON.stringify({ + account: { + account_id: 'test-account-id', + account_settings: { instance_id: 'test-instance-id', key: 'test-api-key' }, + }, + type: 'event_processing_request', + id: 'a2a5575b-d3b0-4a14-96a5-79f8e38b0778', + timestamp_ms: 1718893923387, + source_id: 'test-source-id', + source_channel: 'native', + device_application_stamp: 'test-device-application-stamp', + user_identities: [ + { + type: 'customer', + encoding: 'raw', + value: 'eb3f565d-49bd-418c-ae31-801f25da0ce2', + }, + { type: 'email', encoding: 'raw', value: 'johndoe@gmail.com' }, + { + type: 'other', + encoding: 'raw', + value: '7c2c3abd-62bf-473e-998d-034df0f25ea3', + }, + ], + user_attribute_lists: {}, + runtime_environment: { + sdk_version: '8.8.0', + type: 'ios', + identities: [ + { + type: 'apple_push_notification_token', + encoding: 'raw', + value: '9e3dba8db39f9d130f3d1584c8aab674e9f4b06d0b1b52867e128d3e7b1130f1', + }, + { + type: 'ios_vendor_id', + encoding: 'raw', + value: '78c53c15-32a1-4b65-adac-bec2d7bb8fab', + }, + ], + build_id: '20E12', + brand: 'iPhone14,7', + product: 'iPhone14,7', + name: 'iPhone', + manufacturer: 'Apple', + os_version: '16.3.1', + model: 'iPhone14,7', + screen_height: 2532, + screen_width: 1170, + locale_language: 'en-US', + locale_country: 'US', + network_country: 'us', + network_carrier: 'Verizon', + network_code: '480', + network_mobile_country_code: '311', + timezone_offset: -7, + timezone_name: 'America/Phoenix', + cpu_architecture: 'arm64', + radio_access_technology: 'LTE', + application_name: 'Abc.com - New Account', + application_version: '8.8.0', + application_package: 'com.abc', + apple_search_ads_attribution: {}, + client_ip_address: '192.0.2.0', + }, + user_attributes: { firstName: 'john', lastName: 'doe' }, + events: [ + { + screen_name: 'shopping/vehicle-details', + type: 'custom_event', + id: '1393f120-53b8-4126-8deb-874c26b5b06d', + timestamp_ms: 1703685306737, + source_id: 'test-source-id', + session_id: 1688982077105115000, + name: 'srp-screen-view', + custom_event_type: 'other', + attributes: { + profileLoginType: 'logged-in', + launchType: 'organic', + platform: 'iphone-app', + fuelType: 'Gasoline', + makeName: 'Volvo', + vehicleAdCategory: 'multi_cat', + searchInstanceId: 'test-search-instance-id', + customerId: 'test-customer-id', + drivetrain: 'All-wheel Drive', + year: '2024', + canonical_mmt: 'volvo:xc90:b5_core_bright_theme', + mileage: '5', + make: 'volvo', + pushNotification: 'disabled', + advertiserId: '00000000-0000-0000-0000-000000000000', + exteriorColor: 'Crystal White', + adobeId: 'test-adobe-id', + pageChannel: 'shopping', + bodyStyle: 'suv', + tripId: 'test-trip-id', + stockType: 'new', + makeModelTrim: 'volvo:xc90:b5_core_bright_theme', + pageName: 'shopping/vehicle-details', + model: 'xc90', + deviceType: 'mobile', + listingId: 'test-listing-id', + dealerZip: '30341', + cpoIndicator: 'false', + trim: 'b5_core_bright_theme', + canonical_mmty: 'volvo:xc90:b5_core_bright_theme:2024', + sellerType: 'franchise', + price: '56002', + vin: 'test-vin', + resultSelected: '89', + zip: '85381', + stockSubStock: 'new', + profileUserId: 'test-profile-user-id', + pageKey: 'vehicle-details', + badges: 'homeDelivery,virtualAppointment', + modelName: 'XC90', + }, + }, + ], + }), }, metadata: [generateMetadata(2)], destination, diff --git a/test/integrations/destinations/x_audience/common.ts b/test/integrations/destinations/x_audience/common.ts index 547e04ba848..8a16c8c6fc2 100644 --- a/test/integrations/destinations/x_audience/common.ts +++ b/test/integrations/destinations/x_audience/common.ts @@ -2,7 +2,7 @@ export const authHeaderConstant = 'OAuth oauth_consumer_key="qwe", oauth_nonce="V1kMh028kZLLhfeYozuL0B45Pcx6LvuW", oauth_signature="Di4cuoGv4PnCMMEeqfWTcqhvdwc%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1685603652", oauth_token="dummyAccessToken", oauth_version="1.0"'; export const destination = { Config: { - accountId: '{"Dummy Name":"1234"}', + accountId: JSON.stringify({ 'Dummy Name': '1234' }), audienceId: 'dummyId', }, ID: 'xpixel-1234', diff --git a/test/integrations/destinations/zendesk/maskedSecrets.ts b/test/integrations/destinations/zendesk/maskedSecrets.ts new file mode 100644 index 00000000000..472f605b9c5 --- /dev/null +++ b/test/integrations/destinations/zendesk/maskedSecrets.ts @@ -0,0 +1,13 @@ +import path from 'path'; +import { base64Convertor } from '@rudderstack/integrations-lib'; + +export const secret1 = path.basename(__dirname) + 1; +export const secret2 = path.basename(__dirname) + 2; +export const secret3 = path.basename(__dirname) + 3; +export const secret4 = path.basename(__dirname) + 4; +export const authHeader1 = `Basic ${base64Convertor('myDummyUserName1/token' + ':' + secret1)}`; +export const authHeader2 = `Basic ${base64Convertor('rudderlabtest2@email.com/token' + ':' + secret2)}`; +export const authHeader3 = `Basic ${base64Convertor('test@rudder.com/token' + ':' + secret1)}`; +export const authHeader4 = `Basic ${base64Convertor('test@rudder.com/token' + ':' + secret3)}`; +export const authHeader5 = `Basic ${base64Convertor('myDummyUserName2/token' + ':' + secret4)}`; +export const authHeader6 = `Basic ${base64Convertor('rudderlabtest1@email.com/token' + ':' + secret2)}`; diff --git a/test/integrations/destinations/zendesk/network.ts b/test/integrations/destinations/zendesk/network.ts index bc80f0cd0a7..8e015f313cf 100644 --- a/test/integrations/destinations/zendesk/network.ts +++ b/test/integrations/destinations/zendesk/network.ts @@ -1,8 +1,16 @@ +import { + authHeader1, + authHeader2, + authHeader3, + authHeader4, + authHeader5, + authHeader6, +} from './maskedSecrets'; export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -70,7 +78,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -114,7 +122,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -145,7 +153,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -205,7 +213,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -216,7 +224,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic cnVkZGVybGFidGVzdDJAZW1haWwuY29tL3Rva2VuOmR1bW15QXBpVG9rZW4=', + Authorization: authHeader2, 'Content-Type': 'application/json', }, method: 'GET', @@ -235,7 +243,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Basic cnVkZGVybGFidGVzdDJAZW1haWwuY29tL3Rva2VuOmR1bW15QXBpVG9rZW4=', + Authorization: authHeader2, 'Content-Type': 'application/json', }, method: 'POST', @@ -246,7 +254,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -314,7 +322,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -382,7 +390,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -426,7 +434,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'POST', @@ -457,7 +465,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -517,7 +525,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -528,7 +536,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -588,7 +596,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -656,7 +664,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -716,7 +724,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -745,7 +753,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -813,7 +821,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -873,7 +881,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -902,7 +910,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjQ=', + Authorization: authHeader3, 'Content-Type': 'application/json', }, method: 'GET', @@ -973,7 +981,7 @@ export const networkCallsData = [ user_field: { active: true, description: 'country', key: 'country', title: 'country' }, }, headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjQ=', + Authorization: authHeader3, 'Content-Type': 'application/json', }, method: 'POST', @@ -1041,7 +1049,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjQ=', + Authorization: authHeader3, 'Content-Type': 'application/json', }, method: 'GET', @@ -1112,7 +1120,7 @@ export const networkCallsData = [ user_field: { active: true, description: 'country', key: 'country', title: 'country' }, }, headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjQ=', + Authorization: authHeader3, 'Content-Type': 'application/json', }, method: 'POST', @@ -1180,7 +1188,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjQ=', + Authorization: authHeader3, 'Content-Type': 'application/json', }, method: 'GET', @@ -1251,7 +1259,7 @@ export const networkCallsData = [ user_field: { active: true, description: 'country', key: 'country', title: 'country' }, }, headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjQ=', + Authorization: authHeader3, 'Content-Type': 'application/json', }, method: 'POST', @@ -1319,7 +1327,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjQ=', + Authorization: authHeader3, 'Content-Type': 'application/json', }, method: 'GET', @@ -1338,7 +1346,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjM=', + Authorization: authHeader4, 'Content-Type': 'application/json', }, method: 'POST', @@ -1393,7 +1401,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjM=', + Authorization: authHeader4, 'Content-Type': 'application/json', }, method: 'GET', @@ -1412,7 +1420,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjM=', + Authorization: authHeader4, 'Content-Type': 'application/json', }, method: 'POST', @@ -1467,7 +1475,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMi90b2tlbjpteUR1bW15QXBpVG9rZW4y', + Authorization: authHeader5, 'Content-Type': 'application/json', }, method: 'GET', @@ -1478,7 +1486,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -1546,7 +1554,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -1614,7 +1622,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -1675,7 +1683,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', }, method: 'GET', @@ -1721,7 +1729,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic cnVkZGVybGFidGVzdDFAZW1haWwuY29tL3Rva2VuOmR1bW15QXBpVG9rZW4=', + Authorization: authHeader6, 'Content-Type': 'application/json', }, method: 'GET', @@ -1740,7 +1748,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Basic cnVkZGVybGFidGVzdDFAZW1haWwuY29tL3Rva2VuOmR1bW15QXBpVG9rZW4=', + Authorization: authHeader6, 'Content-Type': 'application/json', }, method: 'POST', @@ -1795,7 +1803,7 @@ export const networkCallsData = [ { httpReq: { headers: { - Authorization: 'Basic cnVkZGVybGFidGVzdDJAZW1haWwuY29tL3Rva2VuOmR1bW15QXBpVG9rZW4=', + Authorization: authHeader2, 'Content-Type': 'application/json', }, method: 'GET', @@ -1814,7 +1822,7 @@ export const networkCallsData = [ }, }, headers: { - Authorization: 'Basic cnVkZGVybGFidGVzdDJAZW1haWwuY29tL3Rva2VuOmR1bW15QXBpVG9rZW4=', + Authorization: authHeader2, 'Content-Type': 'application/json', }, method: 'POST', @@ -1822,4 +1830,351 @@ export const networkCallsData = [ }, httpRes: { data: { user: {} }, status: 200 }, }, + // network call to get id for userId = test-user-id + { + httpReq: { + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + }, + method: 'GET', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/search.json?query=test-user-id', + }, + httpRes: { + data: { + count: 1, + facets: null, + next_page: null, + previous_page: null, + users: [ + { + active: true, + alias: null, + created_at: '2022-11-24T09:03:54Z', + custom_role_id: null, + default_group_id: null, + details: null, + email: 'test1000@email.com', + external_id: 'test-user-id', + iana_time_zone: 'Asia/Kolkata', + id: 911113780483, + last_login_at: null, + locale: 'en-US', + locale_id: 1, + moderator: false, + name: 'name-1000 user', + notes: null, + only_private_comments: false, + organization_id: null, + phone: null, + photo: null, + report_csv: false, + restricted_agent: true, + result_type: 'user', + role: 'end-user', + role_type: null, + shared: false, + shared_agent: false, + shared_phone_number: null, + signature: null, + suspended: false, + tags: [], + ticket_restriction: 'requested', + time_zone: 'Asia/Kolkata', + two_factor_auth_enabled: false, + updated_at: '2022-11-24T09:03:54Z', + url: 'https://rudderstack6787.zendesk.com/api/v2/users/10865192864273.json', + user_fields: {}, + verified: true, + }, + ], + }, + status: 200, + }, + }, + // network call to get identities for user test-user-id + { + httpReq: { + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + }, + method: 'GET', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/911113780483/identities', + }, + httpRes: { + data: { + count: 2, + identities: [ + { + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/7533979645597/identities/25465855449501.json', + id: 25465855449501, + user_id: 25465855448733, + type: 'phone_number', + value: '+910123456789', + verified: true, + primary: true, + created_at: '2025-02-27T14:14:58Z', + updated_at: '2025-02-27T14:14:58Z', + }, + { + created_at: '2022-11-02T08:03:28Z', + deliverable_state: 'deliverable', + id: 7535981118877, + primary: false, + type: 'email', + undeliverable_count: 0, + updated_at: '2022-11-02T10:23:28Z', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/7533979645597/identities/7535981118877.json', + user_id: 900113780483, + value: 'example119@email.com', + verified: false, + }, + { + created_at: '2022-11-02T04:23:46Z', + deliverable_state: 'deliverable', + id: 7534173321117, + primary: true, + type: 'email', + undeliverable_count: 0, + updated_at: '2022-11-02T10:23:28Z', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/7533979645597/identities/7534173321117.json', + user_id: 900113780483, + value: 'example115@email.com', + verified: true, + }, + ], + next_page: null, + previous_page: null, + }, + status: 200, + }, + }, + // network call to get id for user-id = test-user-id-no-primary-email + { + httpReq: { + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + }, + method: 'GET', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/search.json?query=test-user-id-no-primary-email', + }, + httpRes: { + data: { + count: 1, + facets: null, + next_page: null, + previous_page: null, + users: [ + { + active: true, + alias: null, + created_at: '2022-11-24T09:03:54Z', + custom_role_id: null, + default_group_id: null, + details: null, + email: 'test1000@email.com', + external_id: 'test-user-id', + iana_time_zone: 'Asia/Kolkata', + id: 911113781483, + last_login_at: null, + locale: 'en-US', + locale_id: 1, + moderator: false, + name: 'name-1000 user', + notes: null, + only_private_comments: false, + organization_id: null, + phone: null, + photo: null, + report_csv: false, + restricted_agent: true, + result_type: 'user', + role: 'end-user', + role_type: null, + shared: false, + shared_agent: false, + shared_phone_number: null, + signature: null, + suspended: false, + tags: [], + ticket_restriction: 'requested', + time_zone: 'Asia/Kolkata', + two_factor_auth_enabled: false, + updated_at: '2022-11-24T09:03:54Z', + url: 'https://rudderstack6787.zendesk.com/api/v2/users/10865192864273.json', + user_fields: {}, + verified: true, + }, + ], + }, + status: 200, + }, + }, + // network call to get identities for user test-user-id-no-primary-email + { + httpReq: { + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + }, + method: 'GET', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/911113781483/identities', + }, + httpRes: { + data: { + count: 2, + identities: [ + { + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/7533979645597/identities/25465855449501.json', + id: 25465855449501, + user_id: 25465855448733, + type: 'phone_number', + value: '+910123456789', + verified: true, + primary: true, + created_at: '2025-02-27T14:14:58Z', + updated_at: '2025-02-27T14:14:58Z', + }, + { + created_at: '2022-11-02T08:03:28Z', + deliverable_state: 'deliverable', + id: 7535981118877, + primary: false, + type: 'email', + undeliverable_count: 0, + updated_at: '2022-11-02T10:23:28Z', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/7533979645597/identities/7535981118877.json', + user_id: 900113780483, + value: 'example119@email.com', + verified: false, + }, + ], + next_page: null, + previous_page: null, + }, + status: 200, + }, + }, + // network call to get id for user-id = test-user-id-with-same-primary-email + { + httpReq: { + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + }, + method: 'GET', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/search.json?query=test-user-id-with-same-primary-email', + }, + httpRes: { + data: { + count: 1, + facets: null, + next_page: null, + previous_page: null, + users: [ + { + active: true, + alias: null, + created_at: '2022-11-24T09:03:54Z', + custom_role_id: null, + default_group_id: null, + details: null, + email: 'test1000@email.com', + external_id: 'test-user-id', + iana_time_zone: 'Asia/Kolkata', + id: 911113781481, + last_login_at: null, + locale: 'en-US', + locale_id: 1, + moderator: false, + name: 'name-1000 user', + notes: null, + only_private_comments: false, + organization_id: null, + phone: null, + photo: null, + report_csv: false, + restricted_agent: true, + result_type: 'user', + role: 'end-user', + role_type: null, + shared: false, + shared_agent: false, + shared_phone_number: null, + signature: null, + suspended: false, + tags: [], + ticket_restriction: 'requested', + time_zone: 'Asia/Kolkata', + two_factor_auth_enabled: false, + updated_at: '2022-11-24T09:03:54Z', + url: 'https://rudderstack6787.zendesk.com/api/v2/users/10865192864273.json', + user_fields: {}, + verified: true, + }, + ], + }, + status: 200, + }, + }, + // network call to get identities for user test-user-id-with-same-primary-email + { + httpReq: { + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + }, + method: 'GET', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/911113781481/identities', + }, + httpRes: { + data: { + count: 2, + identities: [ + { + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/7533979645597/identities/25465855449501.json', + id: 25465855449501, + user_id: 25465855448733, + type: 'phone_number', + value: '+910123456789', + verified: true, + primary: true, + created_at: '2025-02-27T14:14:58Z', + updated_at: '2025-02-27T14:14:58Z', + }, + { + created_at: '2022-11-02T08:03:28Z', + deliverable_state: 'deliverable', + id: 7535981118877, + primary: true, + type: 'email', + undeliverable_count: 0, + updated_at: '2022-11-02T10:23:28Z', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/7533979645597/identities/7535981118877.json', + user_id: 900113780483, + value: 'example@email.com', + verified: false, + }, + { + created_at: '2022-11-02T08:03:28Z', + deliverable_state: 'deliverable', + id: 7535981118877, + primary: false, + type: 'email', + undeliverable_count: 0, + updated_at: '2022-11-02T10:23:28Z', + url: 'https://rudderlabshelp.zendesk.com/api/v2/users/7533979645597/identities/7535981118877.json', + user_id: 900113780483, + value: 'example119@email.com', + verified: false, + }, + ], + next_page: null, + previous_page: null, + }, + status: 200, + }, + }, ]; diff --git a/test/integrations/destinations/zendesk/processor/data.ts b/test/integrations/destinations/zendesk/processor/data.ts index d84cdba15a7..be0907026c4 100644 --- a/test/integrations/destinations/zendesk/processor/data.ts +++ b/test/integrations/destinations/zendesk/processor/data.ts @@ -1,3 +1,14 @@ +import { + authHeader1, + secret1, + authHeader3, + authHeader4, + secret3, + authHeader5, + secret4, + authHeader6, + secret2, +} from '../maskedSecrets'; export const data = [ { name: 'zendesk', @@ -11,7 +22,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -183,7 +194,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiToken: 'myDummyApiToken3', + apiToken: secret3, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'test@rudder.com', @@ -244,7 +255,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -307,7 +318,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Name': 'RudderStack', @@ -349,7 +360,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -418,7 +429,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/organization_memberships.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Name': 'RudderStack', @@ -454,7 +465,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -520,7 +531,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/900113780483/events', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Name': 'RudderStack', @@ -566,7 +577,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -631,7 +642,7 @@ export const data = [ endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/900113780483/organization_memberships/900004877903.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Name': 'RudderStack', @@ -651,7 +662,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Name': 'RudderStack', @@ -693,7 +704,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -758,7 +769,7 @@ export const data = [ endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/900113780483/organization_memberships/900004877903.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Name': 'RudderStack', @@ -778,7 +789,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Name': 'RudderStack', @@ -906,7 +917,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: false, domain: 'rudderlabshelp', email: 'test@rudder.com', @@ -935,7 +946,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjQ=', + Authorization: authHeader3, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-Name': 'RudderStack', 'X-Zendesk-Marketplace-Organization-Id': '3339', @@ -1073,7 +1084,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: false, domain: 'rudderlabshelp', email: 'test@rudder.com', @@ -1102,7 +1113,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjQ=', + Authorization: authHeader3, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-Name': 'RudderStack', 'X-Zendesk-Marketplace-Organization-Id': '3339', @@ -1240,7 +1251,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'test@rudder.com', @@ -1269,7 +1280,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjQ=', + Authorization: authHeader3, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-Name': 'RudderStack', 'X-Zendesk-Marketplace-Organization-Id': '3339', @@ -1414,7 +1425,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiToken: 'myDummyApiToken3', + apiToken: secret3, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'test@rudder.com', @@ -1464,7 +1475,7 @@ export const data = [ endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/900113780483/events', files: {}, headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjM=', + Authorization: authHeader4, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Name': 'RudderStack', @@ -1597,7 +1608,7 @@ export const data = [ ResponseRules: {}, }, Config: { - apiToken: 'myDummyApiToken3', + apiToken: secret3, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'test@rudder.com', @@ -1647,7 +1658,7 @@ export const data = [ endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/900113780483/events', files: {}, headers: { - Authorization: 'Basic dGVzdEBydWRkZXIuY29tL3Rva2VuOm15RHVtbXlBcGlUb2tlbjM=', + Authorization: authHeader4, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Name': 'RudderStack', @@ -1687,7 +1698,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken2', + apiToken: secret4, createUsersAsVerified: true, domain: 'blendohelp', email: 'myDummyUserName2', @@ -1776,7 +1787,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken2', + apiToken: secret4, createUsersAsVerified: true, domain: 'blendohelp', email: 'myDummyUserName2', @@ -1865,7 +1876,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken2', + apiToken: secret4, createUsersAsVerified: true, domain: 'blendohelp', email: 'myDummyUserName2', @@ -1933,7 +1944,7 @@ export const data = [ method: 'POST', endpoint: 'https://blendohelp.zendesk.com/api/v2/organizations/create_or_update.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMi90b2tlbjpteUR1bW15QXBpVG9rZW4y', + Authorization: authHeader5, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-Name': 'RudderStack', 'X-Zendesk-Marketplace-Organization-Id': '3339', @@ -1974,7 +1985,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -2037,7 +2048,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-Name': 'RudderStack', 'X-Zendesk-Marketplace-Organization-Id': '3339', @@ -2078,7 +2089,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -2144,7 +2155,7 @@ export const data = [ params: {}, headers: { 'Content-Type': 'application/json', - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'X-Zendesk-Marketplace-Name': 'RudderStack', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Organization-Id': '3339', @@ -2163,7 +2174,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-Name': 'RudderStack', 'X-Zendesk-Marketplace-Organization-Id': '3339', @@ -2233,7 +2244,7 @@ export const data = [ ID: 'xxxXXXXXXXXXXXxxxxxxxxxorpz', Name: 'Zendesk', Config: { - apiToken: 'dummyApiToken', + apiToken: secret2, createUsersAsVerified: true, domain: 'rudderlabtest1', email: 'rudderlabtest1@email.com', @@ -2278,7 +2289,7 @@ export const data = [ endpoint: 'https://rudderlabtest1.zendesk.com/api/v2/users/900113780483/events', files: {}, headers: { - Authorization: 'Basic cnVkZGVybGFidGVzdDFAZW1haWwuY29tL3Rva2VuOmR1bW15QXBpVG9rZW4=', + Authorization: authHeader6, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-App-Id': '263241', 'X-Zendesk-Marketplace-Name': 'RudderStack', @@ -2336,7 +2347,7 @@ export const data = [ ID: 'xxxXXXXXXXXXXXxxxxxxxxxorpz', Name: 'Zendesk', Config: { - apiToken: 'dummyApiToken', + apiToken: secret2, createUsersAsVerified: true, domain: 'rudderlabtest2', email: 'rudderlabtest2@email.com', @@ -2382,7 +2393,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -2455,4 +2466,336 @@ export const data = [ }, }, }, + { + name: 'zendesk', + description: + 'scenario when searchByExternalId (Update user’s primary email) is true and there are different primary key i.e. phone, email', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + apiToken: secret1, + createUsersAsVerified: true, + domain: 'rudderlabshelp', + email: 'myDummyUserName1', + password: 'myDummyPwd1', + removeUsersFromOrganization: true, + sendGroupCallsWithoutUserId: true, + searchByExternalId: true, + }, + DestinationDefinition: { + DisplayName: 'Zendesk', + ID: '1YknZ1ENqB8UurJQJE2VrEA61tr', + Name: 'ZENDESK', + }, + Enabled: true, + ID: 'xxxxxxxxxxxxxxxxxxxxxxxO51P', + Name: 'zendesk', + Transformations: [], + }, + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.1.0-beta.2', + }, + ip: '0.0.0.0', + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.0-beta.2' }, + locale: 'en-GB', + os: { name: '', version: '' }, + screen: { density: 2 }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', + }, + integrations: { All: true }, + messageId: '0bab70e8-bf2f-449a-a19b-ca6e3bfed9b7', + request_ip: '[::1]:51573', + type: 'identify', + userId: 'test-user-id', + traits: { email: 'example@email.com', name: 'test-user-name' }, + }, + }, + ], + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + body: { + XML: {}, + FORM: {}, + JSON: { identity: { type: 'email', value: 'example@email.com' } }, + JSON_ARRAY: {}, + }, + type: 'REST', + files: {}, + method: 'PUT', + params: {}, + headers: { + 'Content-Type': 'application/json', + Authorization: authHeader1, + 'X-Zendesk-Marketplace-Name': 'RudderStack', + 'X-Zendesk-Marketplace-App-Id': '263241', + 'X-Zendesk-Marketplace-Organization-Id': '3339', + }, + version: '1', + endpoint: + 'https://rudderlabshelp.zendesk.com/api/v2/users/911113780483/identities/7534173321117', + userId: '', + }, + statusCode: 200, + }, + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + 'X-Zendesk-Marketplace-Name': 'RudderStack', + 'X-Zendesk-Marketplace-Organization-Id': '3339', + 'X-Zendesk-Marketplace-App-Id': '263241', + }, + params: {}, + body: { + JSON: { + user: { + email: 'example@email.com', + name: 'test-user-name', + external_id: 'test-user-id', + user_fields: { id: 'test-user-id' }, + verified: true, + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'zendesk', + description: + 'scenario when searchByExternalId (Update user’s primary email) is true and there are no primary email', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + apiToken: secret1, + createUsersAsVerified: true, + domain: 'rudderlabshelp', + email: 'myDummyUserName1', + password: 'myDummyPwd1', + removeUsersFromOrganization: true, + sendGroupCallsWithoutUserId: true, + searchByExternalId: true, + }, + DestinationDefinition: { + DisplayName: 'Zendesk', + ID: '1YknZ1ENqB8UurJQJE2VrEA61tr', + Name: 'ZENDESK', + }, + Enabled: true, + ID: 'xxxxxxxxxxxxxxxxxxxxxxxO51P', + Name: 'zendesk', + Transformations: [], + }, + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.1.0-beta.2', + }, + ip: '0.0.0.0', + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.0-beta.2' }, + locale: 'en-GB', + os: { name: '', version: '' }, + screen: { density: 2 }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', + }, + integrations: { All: true }, + messageId: '0bab70e8-bf2f-449a-a19b-ca6e3bfed9b7', + request_ip: '[::1]:51573', + type: 'identify', + userId: 'test-user-id-no-primary-email', + traits: { email: 'example@email.com', name: 'test-user-name' }, + }, + }, + ], + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + 'X-Zendesk-Marketplace-Name': 'RudderStack', + 'X-Zendesk-Marketplace-Organization-Id': '3339', + 'X-Zendesk-Marketplace-App-Id': '263241', + }, + params: {}, + body: { + JSON: { + user: { + email: 'example@email.com', + name: 'test-user-name', + external_id: 'test-user-id-no-primary-email', + user_fields: { id: 'test-user-id-no-primary-email' }, + verified: true, + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, + { + name: 'zendesk', + description: + 'scenario when searchByExternalId (Update user’s primary email) is true and primary email is same', + feature: 'processor', + module: 'destination', + version: 'v0', + input: { + request: { + body: [ + { + destination: { + Config: { + apiToken: secret1, + createUsersAsVerified: true, + domain: 'rudderlabshelp', + email: 'myDummyUserName1', + password: 'myDummyPwd1', + removeUsersFromOrganization: true, + sendGroupCallsWithoutUserId: true, + searchByExternalId: true, + }, + DestinationDefinition: { + DisplayName: 'Zendesk', + ID: '1YknZ1ENqB8UurJQJE2VrEA61tr', + Name: 'ZENDESK', + }, + Enabled: true, + ID: 'xxxxxxxxxxxxxxxxxxxxxxxO51P', + Name: 'zendesk', + Transformations: [], + }, + message: { + channel: 'web', + context: { + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.1.0-beta.2', + }, + ip: '0.0.0.0', + library: { name: 'RudderLabs JavaScript SDK', version: '1.1.0-beta.2' }, + locale: 'en-GB', + os: { name: '', version: '' }, + screen: { density: 2 }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', + }, + integrations: { All: true }, + messageId: '0bab70e8-bf2f-449a-a19b-ca6e3bfed9b7', + request_ip: '[::1]:51573', + type: 'identify', + userId: 'test-user-id-with-same-primary-email', + traits: { email: 'example@email.com', name: 'test-user-name' }, + }, + }, + ], + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: [ + { + output: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', + headers: { + Authorization: authHeader1, + 'Content-Type': 'application/json', + 'X-Zendesk-Marketplace-Name': 'RudderStack', + 'X-Zendesk-Marketplace-Organization-Id': '3339', + 'X-Zendesk-Marketplace-App-Id': '263241', + }, + params: {}, + body: { + JSON: { + user: { + email: 'example@email.com', + name: 'test-user-name', + external_id: 'test-user-id-with-same-primary-email', + user_fields: { id: 'test-user-id-with-same-primary-email' }, + verified: true, + }, + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + userId: '', + }, + statusCode: 200, + }, + ], + }, + }, + }, ]; diff --git a/test/integrations/destinations/zendesk/router/data.ts b/test/integrations/destinations/zendesk/router/data.ts index 4e7aacd1d1f..371b256b077 100644 --- a/test/integrations/destinations/zendesk/router/data.ts +++ b/test/integrations/destinations/zendesk/router/data.ts @@ -1,3 +1,4 @@ +import { authHeader1, secret1, secret2 } from '../maskedSecrets'; export const data = [ { name: 'zendesk', @@ -12,7 +13,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -80,7 +81,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/users/create_or_update.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-Name': 'RudderStack', 'X-Zendesk-Marketplace-Organization-Id': '3339', @@ -110,7 +111,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -147,7 +148,7 @@ export const data = [ { destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -220,7 +221,7 @@ export const data = [ method: 'POST', endpoint: 'https://rudderlabshelp.zendesk.com/api/v2/organization_memberships.json', headers: { - Authorization: 'Basic bXlEdW1teVVzZXJOYW1lMS90b2tlbjpteUR1bW15QXBpVG9rZW40', + Authorization: authHeader1, 'Content-Type': 'application/json', 'X-Zendesk-Marketplace-Name': 'RudderStack', 'X-Zendesk-Marketplace-Organization-Id': '3339', @@ -246,7 +247,7 @@ export const data = [ statusCode: 200, destination: { Config: { - apiToken: 'myDummyApiToken4', + apiToken: secret1, createUsersAsVerified: true, domain: 'rudderlabshelp', email: 'myDummyUserName1', @@ -283,7 +284,7 @@ export const data = [ { destination: { Config: { - apiToken: 'dummyApiToken', + apiToken: secret2, createUsersAsVerified: true, domain: 'rudderlabtest2', email: 'rudderlabtest2@email.com', @@ -355,7 +356,7 @@ export const data = [ batched: false, destination: { Config: { - apiToken: 'dummyApiToken', + apiToken: secret2, createUsersAsVerified: true, domain: 'rudderlabtest2', email: 'rudderlabtest2@email.com', diff --git a/test/integrations/destinations/zoho/common.ts b/test/integrations/destinations/zoho/common.ts index 1d89dbce6d7..272040ce118 100644 --- a/test/integrations/destinations/zoho/common.ts +++ b/test/integrations/destinations/zoho/common.ts @@ -1,4 +1,4 @@ -import { Destination } from '../../../../src/types'; +import { Destination, Connection } from '../../../../src/types'; const destType = 'zoho'; const destTypeInUpperCase = 'ZOHO'; @@ -13,7 +13,7 @@ const deletionPayload1 = { externalId: [ { type: 'ZOHO-Leads', - identifierType: 'email', + identifierType: 'Email', }, ], mappedToDestination: 'true', @@ -34,6 +34,55 @@ const deletionPayload1 = { type: 'record', }; +const deletionPayload2 = { + action: 'delete', + context: { + externalId: [ + { + type: 'ZOHO-Contacts', + identifierType: 'Email', + }, + ], + mappedToDestination: 'true', + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + Email: 'tobedeleted@gmail.com', + First_Name: 'subcribed', + Last_Name: ' User', + }, + type: 'record', +}; + +const deletionPayload1V2 = { + action: 'delete', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + First_Name: 'subcribed', + Last_Name: ' User', + }, + identifiers: { + Email: 'tobedeleted@gmail.com', + }, + type: 'record', +}; + const commonDeletionDestConfig: Destination = { ID: '345', Name: 'Test', @@ -68,6 +117,65 @@ const commonDeletionDestConfig: Destination = { }, }; +const commonDeletionDestConfig2: Destination = { + ID: '345', + Name: 'Test', + Enabled: true, + WorkspaceID: '', + Transformations: [], + DestinationDefinition: { + ID: '345', + Name: 'Test', + DisplayName: 'ZOHO', + Config: { + cdkV2Enabled: true, + excludeKeys: [], + includeKeys: [], + }, + }, + Config: { + region: 'IN', + module: 'Contacts', + trigger: 'None', + addDefaultDuplicateCheck: true, + multiSelectFieldLevelDecision: [ + { + from: 'multi-language', + to: 'true', + }, + { + from: 'multi class', + to: 'false', + }, + ], + }, +}; + +const commonDeletionConnectionConfigV2: Connection = { + sourceId: '2t1wMHLftBHKN1XzcfU4v7JTQTg', + destinationId: '2tCmPNvYHqCUgcRva2XN52ZaYHk', + enabled: true, + processorEnabled: true, + config: { + destination: { + object: 'Leads', + trigger: 'None', + schemaVersion: '1.1', + identifierMappings: [ + { + from: 'email', + to: 'Email', + }, + ], + addDefaultDuplicateCheck: true, + multiSelectFieldLevelDecision: [ + { from: 'multi-language', to: 'true' }, + { from: 'multi class', to: 'false' }, + ], + }, + }, +}; + const upsertPayload1 = { action: 'insert', context: { @@ -95,6 +203,28 @@ const upsertPayload1 = { type: 'record', }; +const upsertPayload1V2 = { + action: 'insert', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + First_Name: 'subcribed', + Last_Name: ' User', + }, + identifiers: { + Email: 'subscribed@eewrfrd.com', + }, + type: 'record', +}; + const upsertPayload2 = { action: 'insert', context: { @@ -123,6 +253,29 @@ const upsertPayload2 = { type: 'record', }; +const upsertPayload2V2 = { + action: 'insert', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + First_Name: 'subcribed', + Last_Name: ' User', + 'multi-language': 'Bengali', + }, + identifiers: { + Email: 'subscribed@eewrfrd.com', + }, + type: 'record', +}; + const upsertPayload3 = { action: 'insert', context: { @@ -150,6 +303,28 @@ const upsertPayload3 = { type: 'record', }; +const upsertPayload3V2 = { + action: 'insert', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + First_Name: 'subcribed', + Last_Name: ' User', + }, + identifiers: { + Email: 'subscribed@eewrfrd.com', + }, + type: 'record', +}; + const commonUpsertDestConfig: Destination = { ID: '345', Name: 'Test', @@ -289,6 +464,127 @@ const commonOutput1 = { trigger: ['workflow'], }; +const commonConnectionConfigV2: Connection = { + sourceId: '2t1wMHLftBHKN1XzcfU4v7JTQTg', + destinationId: '2tCmPNvYHqCUgcRva2XN52ZaYHk', + enabled: true, + processorEnabled: true, + config: { + destination: { + object: 'Leads', + trigger: 'workflow', + schemaVersion: '1.1', + addDefaultDuplicateCheck: true, + identifierMappings: [ + { + from: 'email', + to: 'email', + }, + ], + multiSelectFieldLevelDecision: [ + { from: 'multi-language', to: 'true' }, + { from: 'multi class', to: 'false' }, + ], + }, + }, +}; + +const commonConnectionConfigV2_2: Connection = { + sourceId: '2t1wMHLftBHKN1XzcfU4v7JTQTg', + destinationId: '2tCmPNvYHqCUgcRva2XN52ZaYHk', + enabled: true, + processorEnabled: true, + config: { + destination: { + object: 'Leads', + trigger: 'None', + schemaVersion: '1.1', + addDefaultDuplicateCheck: true, + identifierMappings: [ + { + from: 'email', + to: 'email', + }, + ], + multiSelectFieldLevelDecision: [ + { from: 'multi-language', to: 'true' }, + { from: 'multi class', to: 'false' }, + ], + }, + }, +}; + +const commonConnectionConfigCustomModuleV2: Connection = { + sourceId: '2t1wMHLftBHKN1XzcfU4v7JTQTg', + destinationId: '2tCmPNvYHqCUgcRva2XN52ZaYHk', + enabled: true, + processorEnabled: true, + config: { + destination: { + object: 'CUSTOM', + trigger: 'None', + schemaVersion: '1.1', + addDefaultDuplicateCheck: true, + identifierMappings: [ + { + from: 'email', + to: 'Email', + }, + ], + multiSelectFieldLevelDecision: [ + { from: 'multi-language', to: 'true' }, + { from: 'multi class', to: 'false' }, + ], + }, + }, +}; + +const commonConnectionConfigV2_3: Connection = { + sourceId: '2t1wMHLftBHKN1XzcfU4v7JTQTg', + destinationId: '2tCmPNvYHqCUgcRva2XN52ZaYHk', + enabled: true, + processorEnabled: true, + config: { + destination: { + object: 'Leads', + trigger: 'workflow', + schemaVersion: '1.1', + addDefaultDuplicateCheck: true, + identifierMappings: [ + { + from: 'email', + to: 'Email', + }, + ], + }, + }, +}; + +const commonConnectionConfigV2_4: Connection = { + sourceId: '2t1wMHLftBHKN1XzcfU4v7JTQTg', + destinationId: '2tCmPNvYHqCUgcRva2XN52ZaYHk', + enabled: true, + processorEnabled: true, + config: { + destination: { + object: 'Contacts', + trigger: 'None', + schemaVersion: '1.1', + addDefaultDuplicateCheck: true, + identifierMappings: [ + { + from: 'email', + to: 'email', + }, + ], + multiSelectFieldLevelDecision: [ + { from: 'multi-language', to: 'true' }, + { from: 'multi class', to: 'false' }, + ], + }, + }, +}; + export { destType, destTypeInUpperCase, @@ -297,13 +593,25 @@ export { segmentName, leadUpsertEndpoint, deletionPayload1, + deletionPayload2, + deletionPayload1V2, commonDeletionDestConfig, + commonDeletionDestConfig2, upsertPayload1, + upsertPayload1V2, upsertPayload2, + upsertPayload2V2, upsertPayload3, + upsertPayload3V2, commonUpsertDestConfig, commonUpsertDestConfig2, commonOutput1, commonUpsertDestConfig3, commonUpsertDestConfig2CustomModule, + commonConnectionConfigV2, + commonConnectionConfigV2_2, + commonConnectionConfigV2_3, + commonConnectionConfigV2_4, + commonConnectionConfigCustomModuleV2, + commonDeletionConnectionConfigV2, }; diff --git a/test/integrations/destinations/zoho/dataDelivery/business.ts b/test/integrations/destinations/zoho/dataDelivery/business.ts index 89c3ca214b1..003c8f3d538 100644 --- a/test/integrations/destinations/zoho/dataDelivery/business.ts +++ b/test/integrations/destinations/zoho/dataDelivery/business.ts @@ -1,5 +1,6 @@ import { generateMetadata, generateProxyV1Payload } from '../../../testUtils'; import { ProxyV1TestData } from '../../../testTypes'; +import { defaultAccessToken } from '../../../common/secrets'; export const headerBlockWithCorrectAccessToken = { 'Content-Type': 'application/json', @@ -39,7 +40,7 @@ export const metadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -51,7 +52,7 @@ export const metadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -63,7 +64,7 @@ export const metadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -78,7 +79,7 @@ export const singleMetadata = [ workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }, @@ -236,8 +237,12 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ { statusCode: 400, metadata: generateMetadata(1), - error: - '{"code":"INVALID_MODULE","details":{"resource_path_index":0},"message":"the module name given seems to be invalid","status":"error"}', + error: JSON.stringify({ + code: 'INVALID_MODULE', + details: { resource_path_index: 0 }, + message: 'the module name given seems to be invalid', + status: 'error', + }), }, ], }, @@ -278,8 +283,12 @@ export const testScenariosForV1API: ProxyV1TestData[] = [ authErrorCategory: 'REFRESH_TOKEN', response: [ { - error: - '{"code":"INVALID_TOKEN","details":{},"message":"invalid oauth token","status":"error"}', + error: JSON.stringify({ + code: 'INVALID_TOKEN', + details: {}, + message: 'invalid oauth token', + status: 'error', + }), statusCode: 500, metadata: generateMetadata(1), }, diff --git a/test/integrations/destinations/zoho/network.ts b/test/integrations/destinations/zoho/network.ts index b37a56d1239..2324fb364dd 100644 --- a/test/integrations/destinations/zoho/network.ts +++ b/test/integrations/destinations/zoho/network.ts @@ -212,109 +212,106 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://www.zohoapis.in/crm/v6/Leads/search?criteria=(Email:equals:tobedeleted3%40gmail.com)and(First_Name:equals:subcribed3)and(Last_Name:equals:%20User3)', + url: 'https://www.zohoapis.in/crm/v6/coql', headers: { Authorization: 'Zoho-oauthtoken correct-access-token', }, - method: 'GET', + data: { + select_query: "SELECT id FROM Leads WHERE Email = 'tobedeleted@gmail.com'", + }, + method: 'POST', }, httpRes: { data: { - data: '', + data: [ + { + id: '', + }, + ], }, + status: 200, + statusText: 'OK', + }, + }, + { + httpReq: { + url: 'https://www.zohoapis.in/crm/v6/coql', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + data: { + select_query: "SELECT id FROM Leads WHERE Email = 'tobedeleted2@gmail.com'", + }, + method: 'POST', + }, + httpRes: { + data: { + data: [ + { + id: '', + }, + ], + }, + status: 200, + statusText: 'OK', + }, + }, + { + httpReq: { + url: 'https://www.zohoapis.in/crm/v6/coql', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + data: { + select_query: "SELECT id FROM Leads WHERE Email = 'tobedeleted3@gmail.com'", + }, + method: 'POST', + }, + httpRes: { + data: '', status: 204, statusText: 'OK', }, }, { httpReq: { - url: 'https://www.zohoapis.in/crm/v6/Leads/search?criteria=(Email:equals:tobedeleted%40gmail.com)and(First_Name:equals:subcribed)and(Last_Name:equals:%20User)', + url: 'https://www.zohoapis.in/crm/v6/coql', + headers: { + Authorization: 'Zoho-oauthtoken expired-access-token', + }, + data: { + select_query: "SELECT id FROM Leads WHERE Email = 'tobedeleted3@gmail.com'", + }, + method: 'POST', + }, + httpRes: { + data: { + code: 'INVALID_TOKEN', + details: {}, + message: 'invalid oauth token', + status: 'error', + }, + status: 401, + statusText: 'Bad Request', + }, + }, + { + httpReq: { + url: 'https://www.zohoapis.in/crm/v6/coql', headers: { Authorization: 'Zoho-oauthtoken correct-access-token', }, - method: 'GET', + data: { + select_query: + "SELECT id FROM Leads WHERE ((Email = 'tobedeleted2@gmail.com' AND First_Name = 'subcribed2') AND Last_Name = ' User2')", + }, + method: 'POST', }, httpRes: { data: { data: [ { - Owner: { - name: 'dummy-user', - id: '724445000000323001', - email: 'dummy@gmail.com', - }, - Company: null, - Email: 'tobedeleted@gmail.com', - $currency_symbol: '$', - $field_states: null, - $sharing_permission: 'full_access', - Last_Activity_Time: '2024-07-18T23:55:42+05:30', - Industry: null, - Unsubscribed_Mode: null, - $process_flow: false, - Street: null, - Zip_Code: null, - id: '', - $approval: { - delegate: false, - approve: false, - reject: false, - resubmit: false, - }, - Created_Time: '2024-07-18T19:34:50+05:30', - $editable: true, - City: null, - No_of_Employees: null, - Converted_Account: null, - State: null, - Country: null, - Created_By: { - name: 'dummy-user', - id: '724445000000323001', - email: 'dummy@gmail.com', - }, - $zia_owner_assignment: 'owner_recommendation_unavailable', - Annual_Revenue: null, - Secondary_Email: null, - Description: null, - Rating: null, - $review_process: { - approve: false, - reject: false, - resubmit: false, - }, - Website: null, - Twitter: null, - Salutation: null, - First_Name: 'subcribed', - Full_Name: 'subcribed User', - Lead_Status: null, - Record_Image: null, - Modified_By: { - name: 'dummy-user', - id: '724445000000323001', - email: 'dummy@gmail.com', - }, - Converted_Deal: null, - $review: null, - Lead_Conversion_Time: null, - Skype_ID: null, - Phone: null, - Email_Opt_Out: false, - $zia_visions: null, - Designation: null, - Modified_Time: '2024-07-18T23:55:42+05:30', - $converted_detail: {}, - Unsubscribed_Time: null, - Converted_Contact: null, - Mobile: null, - $orchestration: null, - Last_Name: 'User', - $in_merge: false, - Lead_Source: null, - Fax: null, - $approval_state: 'approved', - $pathfinder: null, + id: '', }, ], }, @@ -324,93 +321,20 @@ export const networkCallsData = [ }, { httpReq: { - url: 'https://www.zohoapis.in/crm/v6/Leads/search?criteria=(Email:equals:tobedeleted2%40gmail.com)and(First_Name:equals:subcribed2)and(Last_Name:equals:%20User2)', + url: 'https://www.zohoapis.in/crm/v6/coql', headers: { Authorization: 'Zoho-oauthtoken correct-access-token', }, - method: 'GET', + data: { + select_query: "SELECT id FROM Contacts WHERE Email = 'tobedeleted2@gmail.com'", + }, + method: 'POST', }, httpRes: { data: { data: [ { - Owner: { - name: 'dummy-user', - id: '724445000000323001', - email: 'dummy@gmail.com', - }, - Company: null, - Email: 'tobedeleted2@gmail.com', - $currency_symbol: '$', - $field_states: null, - $sharing_permission: 'full_access', - Last_Activity_Time: '2024-07-18T23:55:42+05:30', - Industry: null, - Unsubscribed_Mode: null, - $process_flow: false, - Street: null, - Zip_Code: null, id: '', - $approval: { - delegate: false, - approve: false, - reject: false, - resubmit: false, - }, - Created_Time: '2024-07-18T19:34:50+05:30', - $editable: true, - City: null, - No_of_Employees: null, - Converted_Account: null, - State: null, - Country: null, - Created_By: { - name: 'dummy-user', - id: '724445000000323001', - email: 'dummy@gmail.com', - }, - $zia_owner_assignment: 'owner_recommendation_unavailable', - Annual_Revenue: null, - Secondary_Email: null, - Description: null, - Rating: null, - $review_process: { - approve: false, - reject: false, - resubmit: false, - }, - Website: null, - Twitter: null, - Salutation: null, - First_Name: 'subcribed2', - Full_Name: 'subcribed2 User', - Lead_Status: null, - Record_Image: null, - Modified_By: { - name: 'dummy-user', - id: '724445000000323001', - email: 'dummy@gmail.com', - }, - Converted_Deal: null, - $review: null, - Lead_Conversion_Time: null, - Skype_ID: null, - Phone: null, - Email_Opt_Out: false, - $zia_visions: null, - Designation: null, - Modified_Time: '2024-07-18T23:55:42+05:30', - $converted_detail: {}, - Unsubscribed_Time: null, - Converted_Contact: null, - Mobile: null, - $orchestration: null, - Last_Name: 'User2', - $in_merge: false, - Lead_Source: null, - Fax: null, - $approval_state: 'approved', - $pathfinder: null, }, ], }, diff --git a/test/integrations/destinations/zoho/router/deletion.ts b/test/integrations/destinations/zoho/router/deletion.ts index 5e922bc7944..50bd66a45a2 100644 --- a/test/integrations/destinations/zoho/router/deletion.ts +++ b/test/integrations/destinations/zoho/router/deletion.ts @@ -1,5 +1,13 @@ import { defaultMockFns } from '../mocks'; -import { commonDeletionDestConfig, deletionPayload1, destType } from '../common'; +import { + commonDeletionDestConfig, + commonDeletionDestConfig2, + deletionPayload1, + deletionPayload1V2, + commonDeletionConnectionConfigV2, + commonConnectionConfigV2_4, + destType, +} from '../common'; export const deleteData = [ { @@ -118,8 +126,8 @@ export const deleteData = [ }, { name: destType, - id: 'zoho_deletion_2', - description: 'Batch containing already existing and non existing records for deletion', + id: 'zoho_deletion_1', + description: 'Happy flow record deletion with Contacts module', feature: 'router', module: 'destination', version: 'v0', @@ -128,7 +136,195 @@ export const deleteData = [ body: { input: [ { - message: deletionPayload1, + message: { + action: 'delete', + context: { + externalId: [ + { + type: 'ZOHO-Contacts', + identifierType: 'Email', + }, + ], + mappedToDestination: 'true', + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + Email: 'tobedeleted2@gmail.com', + First_Name: 'subcribed2', + Last_Name: ' User2', + }, + type: 'record', + }, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonDeletionDestConfig2, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'DELETE', + endpoint: + 'https://www.zohoapis.in/crm/v6/Contacts?ids=&wf_trigger=false', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonDeletionDestConfig2, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + name: destType, + id: 'zoho_deletion_1', + description: 'Happy flow record deletion with Contacts module V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + action: 'delete', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + identifiers: { + Email: 'tobedeleted2@gmail.com', + }, + fields: { + First_Name: 'subcribed2', + Last_Name: ' User2', + }, + type: 'record', + }, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonDeletionDestConfig2, + connection: commonConnectionConfigV2_4, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'DELETE', + endpoint: + 'https://www.zohoapis.in/crm/v6/Contacts?ids=&wf_trigger=false', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonDeletionDestConfig2, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + name: destType, + id: 'zoho_deletion_1_v2', + description: 'Happy flow record deletion with Leads module V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: deletionPayload1V2, metadata: { jobId: 1, userId: 'u1', @@ -137,18 +333,12 @@ export const deleteData = [ }, }, destination: commonDeletionDestConfig, + connection: commonDeletionConnectionConfigV2, }, { message: { action: 'delete', context: { - externalId: [ - { - type: 'ZOHO-Leads', - identifierType: 'email', - }, - ], - mappedToDestination: 'true', sources: { job_run_id: 'cgiiurt8um7k7n5dq480', task_run_id: 'cgiiurt8um7k7n5dq48g', @@ -159,9 +349,11 @@ export const deleteData = [ recordId: '2', rudderId: '2', fields: { - Email: 'tobedeleted3@gmail.com', - First_Name: 'subcribed3', - Last_Name: ' User3', + First_Name: 'subcribed2', + Last_Name: ' User2', + }, + identifiers: { + Email: 'tobedeleted2@gmail.com', }, type: 'record', }, @@ -173,6 +365,7 @@ export const deleteData = [ }, }, destination: commonDeletionDestConfig, + connection: commonDeletionConnectionConfigV2, }, ], destType, @@ -190,7 +383,8 @@ export const deleteData = [ version: '1', type: 'REST', method: 'DELETE', - endpoint: 'https://www.zohoapis.in/crm/v6/Leads?ids=&wf_trigger=false', + endpoint: + 'https://www.zohoapis.in/crm/v6/Leads?ids=,&wf_trigger=false', headers: { Authorization: 'Zoho-oauthtoken correct-access-token', }, @@ -211,11 +405,588 @@ export const deleteData = [ accessToken: 'correct-access-token', }, }, + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, ], batched: true, statusCode: 200, destination: commonDeletionDestConfig, }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + name: destType, + id: 'zoho_deletion_2', + description: 'Batch containing already existing and non existing records for deletion', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: deletionPayload1, + metadata: { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonDeletionDestConfig, + }, + { + message: { + action: 'delete', + context: { + externalId: [ + { + type: 'ZOHO-Leads', + identifierType: 'Email', + }, + ], + mappedToDestination: 'true', + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + Email: 'tobedeleted3@gmail.com', + First_Name: 'subcribed3', + Last_Name: ' User3', + }, + type: 'record', + }, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonDeletionDestConfig, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'DELETE', + endpoint: 'https://www.zohoapis.in/crm/v6/Leads?ids=&wf_trigger=false', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonDeletionDestConfig, + }, + { + metadata: [ + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: false, + statusCode: 400, + error: + 'failed to fetch zoho id for record for "No Leads is found with record details"', + statTags: { + errorCategory: 'dataValidation', + errorType: 'configuration', + destType: 'ZOHO', + module: 'destination', + implementation: 'cdkV2', + feature: 'router', + }, + destination: commonDeletionDestConfig, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + name: destType, + id: 'zoho_deletion_2_v2', + description: 'Batch containing already existing and non existing records for deletion V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: deletionPayload1V2, + metadata: { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonDeletionDestConfig, + connection: commonDeletionConnectionConfigV2, + }, + { + message: { + action: 'delete', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + First_Name: 'subcribed3', + Last_Name: ' User3', + }, + identifiers: { + Email: 'tobedeleted3@gmail.com', + }, + type: 'record', + }, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonDeletionDestConfig, + connection: commonDeletionConnectionConfigV2, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'DELETE', + endpoint: 'https://www.zohoapis.in/crm/v6/Leads?ids=&wf_trigger=false', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: {}, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonDeletionDestConfig, + }, + { + metadata: [ + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: false, + statusCode: 400, + error: + 'failed to fetch zoho id for record for "No Leads is found with record details"', + statTags: { + errorCategory: 'dataValidation', + errorType: 'configuration', + destType: 'ZOHO', + module: 'destination', + implementation: 'cdkV2', + feature: 'router', + }, + destination: commonDeletionDestConfig, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + name: destType, + id: 'zoho_deletion_2_v2', + description: 'Delete with invalid access token V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + action: 'delete', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + First_Name: 'subcribed3', + Last_Name: 'User3', + }, + identifiers: { + Email: 'tobedeleted3@gmail.com', + }, + type: 'record', + }, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'expired-access-token', + }, + }, + destination: commonDeletionDestConfig, + connection: commonDeletionConnectionConfigV2, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batched: false, + authErrorCategory: 'REFRESH_TOKEN', + statusCode: 500, + error: `{\"message\":\"[Zoho]:: {\\\"code\\\":\\\"INVALID_TOKEN\\\",\\\"details\\\":{},\\\"message\\\":\\\"invalid oauth token\\\",\\\"status\\\":\\\"error\\\"} during zoho record search\",\"destinationResponse\":{\"code\":\"INVALID_TOKEN\",\"details\":{},\"message\":\"invalid oauth token\",\"status\":\"error\"}}`, + destination: commonDeletionDestConfig, + metadata: [ + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'expired-access-token', + }, + }, + ], + statTags: { + errorType: 'retryable', + errorCategory: 'network', + destType: 'ZOHO', + module: 'destination', + implementation: 'cdkV2', + feature: 'router', + }, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + name: destType, + id: 'zoho_deletion_2_v2', + description: 'Test empty identifier in deletion payload V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + action: 'delete', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + First_Name: 'subcribed3', + Last_Name: ' User3', + }, + identifiers: {}, + type: 'record', + }, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonDeletionDestConfig, + connection: commonDeletionConnectionConfigV2, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + metadata: [ + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: false, + statusCode: 400, + error: '`identifiers` cannot be empty', + statTags: { + errorCategory: 'dataValidation', + errorType: 'instrumentation', + destType: 'ZOHO', + module: 'destination', + implementation: 'cdkV2', + feature: 'router', + }, + destination: commonDeletionDestConfig, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + name: destType, + id: 'zoho_deletion_1_v2', + description: 'Instrumentation error when the identifiers are empty in the payload V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + action: 'delete', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + First_Name: 'subcribed2', + Last_Name: ' User2', + }, + identifiers: { + Email: '', + }, + type: 'record', + }, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonDeletionDestConfig, + connection: commonDeletionConnectionConfigV2, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + metadata: [ + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: false, + statusCode: 400, + error: + 'failed to fetch zoho id for record for "Identifier values are not provided for Leads"', + statTags: { + errorCategory: 'dataValidation', + errorType: 'configuration', + destType: 'ZOHO', + module: 'destination', + implementation: 'cdkV2', + feature: 'router', + }, + destination: commonDeletionDestConfig, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + name: destType, + id: 'zoho_deletion_2', + description: 'Instrumentation error when the identifiers are empty in the payload', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + action: 'delete', + context: { + externalId: [ + { + type: 'ZOHO-Leads', + identifierType: 'Email', + }, + ], + mappedToDestination: 'true', + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + Email: '', + First_Name: 'subcribed3', + Last_Name: ' User3', + }, + type: 'record', + }, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonDeletionDestConfig, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ { metadata: [ { @@ -229,7 +1000,7 @@ export const deleteData = [ batched: false, statusCode: 400, error: - 'failed to fetch zoho id for record for "No contact is found with record details"', + 'failed to fetch zoho id for record for "Identifier values are not provided for Leads"', statTags: { errorCategory: 'dataValidation', errorType: 'configuration', diff --git a/test/integrations/destinations/zoho/router/upsert.ts b/test/integrations/destinations/zoho/router/upsert.ts index a2b898970d4..1b5d584f7ab 100644 --- a/test/integrations/destinations/zoho/router/upsert.ts +++ b/test/integrations/destinations/zoho/router/upsert.ts @@ -2,13 +2,20 @@ import { defaultMockFns } from '../mocks'; import { commonOutput1, commonUpsertDestConfig, + commonConnectionConfigV2, + commonConnectionConfigV2_2, + commonConnectionConfigV2_3, + commonConnectionConfigCustomModuleV2, commonUpsertDestConfig2, commonUpsertDestConfig2CustomModule, commonUpsertDestConfig3, destType, upsertPayload1, + upsertPayload1V2, upsertPayload2, + upsertPayload2V2, upsertPayload3, + upsertPayload3V2, } from '../common'; export const upsertData = [ @@ -119,6 +126,115 @@ export const upsertData = [ }, mockFns: defaultMockFns, }, + { + name: destType, + description: 'Happy flow with Leads module V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: upsertPayload1V2, + metadata: { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig, + connection: commonConnectionConfigV2, + }, + { + message: upsertPayload2V2, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig, + connection: commonConnectionConfigV2, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://www.zohoapis.com/crm/v6/Leads/upsert', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: { + duplicate_check_fields: ['email', 'Email'], + data: [ + { + Email: 'subscribed@eewrfrd.com', + First_Name: 'subcribed', + Last_Name: ' User', + }, + { + Email: 'subscribed@eewrfrd.com', + First_Name: 'subcribed', + Last_Name: ' User', + 'multi-language': ['Bengali'], + }, + ], + $append_values: { + 'multi-language': 'true', + 'multi class': 'false', + }, + trigger: ['workflow'], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonUpsertDestConfig, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, { name: destType, description: 'Happy flow with Trigger None', @@ -226,6 +342,115 @@ export const upsertData = [ }, mockFns: defaultMockFns, }, + { + name: destType, + description: 'Happy flow with Trigger None V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: upsertPayload1V2, + metadata: { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig2, + connection: commonConnectionConfigV2_2, + }, + { + message: upsertPayload2V2, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig2, + connection: commonConnectionConfigV2_2, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://www.zohoapis.com/crm/v6/Leads/upsert', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: { + duplicate_check_fields: ['email', 'Email'], + data: [ + { + Email: 'subscribed@eewrfrd.com', + First_Name: 'subcribed', + Last_Name: ' User', + }, + { + Email: 'subscribed@eewrfrd.com', + First_Name: 'subcribed', + Last_Name: ' User', + 'multi-language': ['Bengali'], + }, + ], + $append_values: { + 'multi-language': 'true', + 'multi class': 'false', + }, + trigger: [], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonUpsertDestConfig2, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, { name: destType, description: 'Happy flow with custom Module', @@ -390,7 +615,7 @@ export const upsertData = [ }, { name: destType, - description: 'If module specific mandatory field is absent, event will fail', + description: 'Happy flow with custom Module V2', feature: 'router', module: 'destination', version: 'v0', @@ -402,12 +627,6 @@ export const upsertData = [ message: { action: 'insert', context: { - externalId: [ - { - type: 'ZOHO-Leads', - identifierType: 'Email', - }, - ], mappedToDestination: 'true', sources: { job_run_id: 'cgiiurt8um7k7n5dq480', @@ -419,9 +638,12 @@ export const upsertData = [ recordId: '2', rudderId: '2', fields: { - Email: 'subscribed@eewrfrd.com', First_Name: 'subcribed', Last_Name: ' User', + Name: 'ABC', + }, + identifiers: { + Email: 'subscribed@eewrfrd.com', }, type: 'record', }, @@ -432,18 +654,13 @@ export const upsertData = [ accessToken: 'correct-access-token', }, }, - destination: commonUpsertDestConfig, + destination: commonUpsertDestConfig2CustomModule, + connection: commonConnectionConfigCustomModuleV2, }, { message: { action: 'insert', context: { - externalId: [ - { - type: 'ZOHO-Leads', - identifierType: 'Email', - }, - ], mappedToDestination: 'true', sources: { job_run_id: 'cgiiurt8um7k7n5dq480', @@ -455,7 +672,13 @@ export const upsertData = [ recordId: '2', rudderId: '2', fields: { + First_Name: 'subcribed', + Last_Name: ' User', 'multi-language': 'Bengali', + Name: 'ABC', + }, + identifiers: { + Email: 'subscribed@eewrfrd.com', }, type: 'record', }, @@ -466,7 +689,8 @@ export const upsertData = [ accessToken: 'correct-access-token', }, }, - destination: commonUpsertDestConfig, + destination: commonUpsertDestConfig2, + connection: commonConnectionConfigCustomModuleV2, }, ], destType, @@ -484,26 +708,34 @@ export const upsertData = [ version: '1', type: 'REST', method: 'POST', - endpoint: 'https://www.zohoapis.com/crm/v6/Leads/upsert', + endpoint: 'https://www.zohoapis.com/crm/v6/CUSTOM/upsert', headers: { Authorization: 'Zoho-oauthtoken correct-access-token', }, params: {}, body: { JSON: { - duplicate_check_fields: ['Email'], + duplicate_check_fields: ['Email', 'Name'], data: [ { Email: 'subscribed@eewrfrd.com', First_Name: 'subcribed', Last_Name: ' User', + Name: 'ABC', + }, + { + Email: 'subscribed@eewrfrd.com', + First_Name: 'subcribed', + Last_Name: ' User', + 'multi-language': ['Bengali'], + Name: 'ABC', }, ], $append_values: { 'multi-language': 'true', 'multi class': 'false', }, - trigger: ['workflow'], + trigger: [], }, JSON_ARRAY: {}, XML: {}, @@ -511,7 +743,6 @@ export const upsertData = [ }, files: {}, }, - metadata: [ { jobId: 1, @@ -520,13 +751,324 @@ export const upsertData = [ accessToken: 'correct-access-token', }, }, - ], - batched: true, - statusCode: 200, - destination: commonUpsertDestConfig, - }, - { - metadata: [ + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonUpsertDestConfig2CustomModule, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + name: destType, + description: 'If module specific mandatory field is absent, event will fail', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + action: 'insert', + context: { + externalId: [ + { + type: 'ZOHO-Leads', + identifierType: 'Email', + }, + ], + mappedToDestination: 'true', + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + Email: 'subscribed@eewrfrd.com', + First_Name: 'subcribed', + Last_Name: ' User', + }, + type: 'record', + }, + metadata: { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig, + }, + { + message: { + action: 'insert', + context: { + externalId: [ + { + type: 'ZOHO-Leads', + identifierType: 'Email', + }, + ], + mappedToDestination: 'true', + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + 'multi-language': 'Bengali', + }, + type: 'record', + }, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://www.zohoapis.com/crm/v6/Leads/upsert', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: { + duplicate_check_fields: ['Email'], + data: [ + { + Email: 'subscribed@eewrfrd.com', + First_Name: 'subcribed', + Last_Name: ' User', + }, + ], + $append_values: { + 'multi-language': 'true', + 'multi class': 'false', + }, + trigger: ['workflow'], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + + metadata: [ + { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonUpsertDestConfig, + }, + { + metadata: [ + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: false, + statusCode: 400, + error: 'Leads object must have the Last_Name property(ies).', + statTags: { + errorCategory: 'dataValidation', + errorType: 'configuration', + destType: 'ZOHO', + module: 'destination', + implementation: 'cdkV2', + feature: 'router', + }, + destination: commonUpsertDestConfig, + }, + ], + }, + }, + }, + }, + { + name: destType, + description: 'If module specific mandatory field is absent, event will fail V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: { + action: 'insert', + context: { + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + First_Name: 'subcribed', + Last_Name: ' User', + }, + type: 'record', + identifiers: { + Email: 'subscribed@eewrfrd.com', + }, + }, + metadata: { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig, + connection: commonConnectionConfigV2, + }, + { + message: { + action: 'insert', + context: { + mappedToDestination: 'true', + sources: { + job_run_id: 'cgiiurt8um7k7n5dq480', + task_run_id: 'cgiiurt8um7k7n5dq48g', + job_id: '2MUWghI7u85n91dd1qzGyswpZan', + version: '895/merge', + }, + }, + recordId: '2', + rudderId: '2', + fields: { + 'multi-language': 'Bengali', + First_Name: 'subcribed', + Last_Name: null, + }, + identifiers: { + email: 'subscribed@eewrfrd.com', + }, + type: 'record', + }, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig, + connection: commonConnectionConfigV2, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://www.zohoapis.com/crm/v6/Leads/upsert', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: { + duplicate_check_fields: ['email', 'Email'], + data: [ + { + Email: 'subscribed@eewrfrd.com', + First_Name: 'subcribed', + Last_Name: ' User', + }, + ], + $append_values: { + 'multi-language': 'true', + 'multi class': 'false', + }, + trigger: ['workflow'], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + + metadata: [ + { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonUpsertDestConfig, + }, + { + metadata: [ { jobId: 2, userId: 'u1', @@ -546,17 +1088,87 @@ export const upsertData = [ implementation: 'cdkV2', feature: 'router', }, - destination: commonUpsertDestConfig, + destination: commonUpsertDestConfig, + }, + ], + }, + }, + }, + }, + { + name: destType, + description: + 'If multiselect key decision is not set from UI, Rudderstack will consider those as normal fields', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: upsertPayload3, + metadata: { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig3, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://www.zohoapis.com/crm/v6/Leads/upsert', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: commonOutput1, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonUpsertDestConfig3, }, ], }, }, }, + mockFns: defaultMockFns, }, { name: destType, description: - 'If multiselect key decision is not set from UI, Rudderstack will consider those as normal fields', + 'If multiselect key decision is not set from UI, Rudderstack will consider those as normal fields V2', feature: 'router', module: 'destination', version: 'v0', @@ -565,7 +1177,7 @@ export const upsertData = [ body: { input: [ { - message: upsertPayload3, + message: upsertPayload3V2, metadata: { jobId: 1, userId: 'u1', @@ -574,6 +1186,7 @@ export const upsertData = [ }, }, destination: commonUpsertDestConfig3, + connection: commonConnectionConfigV2_3, }, ], destType, @@ -768,4 +1381,249 @@ export const upsertData = [ }, mockFns: defaultMockFns, }, + { + name: destType, + description: 'Test Batching V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: upsertPayload3V2, + metadata: { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig3, + connection: commonConnectionConfigV2_3, + }, + { + message: upsertPayload3V2, + metadata: { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig3, + connection: commonConnectionConfigV2_3, + }, + { + message: upsertPayload3V2, + metadata: { + jobId: 3, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig3, + connection: commonConnectionConfigV2_3, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://www.zohoapis.com/crm/v6/Leads/upsert', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: { + duplicate_check_fields: ['Email'], + data: [ + { + Email: 'subscribed@eewrfrd.com', + First_Name: 'subcribed', + Last_Name: ' User', + }, + { + Email: 'subscribed@eewrfrd.com', + First_Name: 'subcribed', + Last_Name: ' User', + }, + ], + $append_values: {}, + trigger: ['workflow'], + }, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + { + jobId: 2, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonUpsertDestConfig3, + }, + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://www.zohoapis.com/crm/v6/Leads/upsert', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: commonOutput1, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 3, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonUpsertDestConfig3, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, + { + name: destType, + description: 'Test fields can be empty V2', + feature: 'router', + module: 'destination', + version: 'v0', + input: { + request: { + body: { + input: [ + { + message: upsertPayload3V2, + metadata: { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + destination: commonUpsertDestConfig3, + connection: commonConnectionConfigV2_3, + }, + { + message: { + action: 'insert', + context: {}, + fields: {}, + identifiers: {}, + type: 'record', + }, + metadata: {}, + destination: commonUpsertDestConfig, + connection: commonConnectionConfigV2_3, + }, + ], + destType, + }, + method: 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: [ + { + batchedRequest: { + version: '1', + type: 'REST', + method: 'POST', + endpoint: 'https://www.zohoapis.com/crm/v6/Leads/upsert', + headers: { + Authorization: 'Zoho-oauthtoken correct-access-token', + }, + params: {}, + body: { + JSON: commonOutput1, + JSON_ARRAY: {}, + XML: {}, + FORM: {}, + }, + files: {}, + }, + metadata: [ + { + jobId: 1, + userId: 'u1', + secret: { + accessToken: 'correct-access-token', + }, + }, + ], + batched: true, + statusCode: 200, + destination: commonUpsertDestConfig3, + }, + { + batched: false, + destination: commonUpsertDestConfig, + error: '`fields` cannot be empty', + metadata: [{}], + statTags: { + destType: 'ZOHO', + errorCategory: 'dataValidation', + errorType: 'instrumentation', + feature: 'router', + implementation: 'cdkV2', + module: 'destination', + }, + statusCode: 400, + }, + ], + }, + }, + }, + mockFns: defaultMockFns, + }, ]; diff --git a/test/integrations/sources/adjust/data.ts b/test/integrations/sources/adjust/data.ts index 107bb444c43..bb81450e9d5 100644 --- a/test/integrations/sources/adjust/data.ts +++ b/test/integrations/sources/adjust/data.ts @@ -10,29 +10,32 @@ export const data = [ name: 'adjust', description: 'Simple track call', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - id: 'adjust', - query_parameters: { - gps_adid: ['38400000-8cf0-11bd-b23e-10b96e40000d'], - adid: ['18546f6171f67e29d1cb983322ad1329'], - tracker_token: ['abc'], - custom: ['custom'], - tracker_name: ['dummy'], - created_at: ['1404214665'], - event_name: ['Click'], + request: { + body: JSON.stringify({ + id: 'adjust', + updated_at: '2023-02-10T12:16:07.251Z', + created_at: '2023-02-10T12:05:04.402Z', + }), + query_parameters: { + gps_adid: ['38400000-8cf0-11bd-b23e-10b96e40000d'], + adid: ['18546f6171f67e29d1cb983322ad1329'], + tracker_token: ['abc'], + custom: ['custom'], + tracker_name: ['dummy'], + created_at: ['1404214665'], + event_name: ['Click'], + }, }, - updated_at: '2023-02-10T12:16:07.251Z', - created_at: '2023-02-10T12:05:04.402Z', + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -46,20 +49,11 @@ export const data = [ { anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'Adjust', - }, - device: { - 'id ': '18546f6171f67e29d1cb983322ad1329', - }, - }, - integrations: { - Adjust: false, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'Adjust' }, + device: { 'id ': '18546f6171f67e29d1cb983322ad1329' }, }, + integrations: { Adjust: false }, type: 'track', event: 'Click', originalTimestamp: '2014-07-01T11:37:45.000Z', @@ -85,21 +79,25 @@ export const data = [ name: 'adjust', description: 'Simple track call with no query parameters', module: 'source', - version: 'v0', + version: 'v2', skipGo: 'FIXME', input: { request: { body: [ { - id: 'adjust', - updated_at: '2023-02-10T12:16:07.251Z', - created_at: '2023-02-10T12:05:04.402Z', + request: { + body: JSON.stringify({ + id: 'adjust', + updated_at: '2023-02-10T12:16:07.251Z', + created_at: '2023-02-10T12:05:04.402Z', + }), + query_parameters: undefined, + }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -114,6 +112,7 @@ export const data = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'adjust', workspaceId: 'Non determinable', }, statusCode: 400, @@ -129,30 +128,33 @@ export const data = [ name: 'adjust', description: 'Simple track call with wrong created at', module: 'source', - version: 'v0', + version: 'v2', skipGo: 'FIXME', input: { request: { body: [ { - id: 'adjust', - query_parameters: { - gps_adid: ['38400000-8cf0-11bd-b23e-10b96e40000d'], - adid: ['18546f6171f67e29d1cb983322ad1329'], - tracker_token: ['abc'], - custom: ['custom'], - tracker_name: ['dummy'], - created_at: ['test'], - event_name: ['Click'], + request: { + body: JSON.stringify({ + id: 'adjust', + updated_at: '2023-02-10T12:16:07.251Z', + created_at: 'test', + }), + query_parameters: { + gps_adid: ['38400000-8cf0-11bd-b23e-10b96e40000d'], + adid: ['18546f6171f67e29d1cb983322ad1329'], + tracker_token: ['abc'], + custom: ['custom'], + tracker_name: ['dummy'], + created_at: ['test'], + event_name: ['Click'], + }, }, - updated_at: '2023-02-10T12:16:07.251Z', - created_at: 'test', + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -167,6 +169,7 @@ export const data = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'adjust', workspaceId: 'Non determinable', }, statusCode: 400, diff --git a/test/integrations/sources/appcenter/data.ts b/test/integrations/sources/appcenter/data.ts index 0342b622d2a..79f1b8ef7b4 100644 --- a/test/integrations/sources/appcenter/data.ts +++ b/test/integrations/sources/appcenter/data.ts @@ -5,14 +5,19 @@ export const data = [ name: 'appcenter', description: 'test-0', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - text: 'Hello from your abc-test app in App Center!', - sent_at: '2023-01-02T07: 53: 28.3117824Z', - url: 'https://appcenter.ms/users/abc-rudderstack.com/apps/abc-test', + request: { + body: JSON.stringify({ + text: 'Hello from your abc-test app in App Center!', + sent_at: '2023-01-02T07: 53: 28.3117824Z', + url: 'https://appcenter.ms/users/abc-rudderstack.com/apps/abc-test', + }), + }, + source: {}, }, ], method: 'POST', @@ -39,26 +44,31 @@ export const data = [ name: 'appcenter', description: 'test-1', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - app_name: 'MSAppCenterTesting', - branch: 'master', - build_status: 'Succeeded', - build_id: '1', - build_link: - 'https://appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/build/branches/master/builds/1', - build_reason: 'manual', - finish_time: '2021-03-02T16:41:29.891411Z', - icon_link: null, - notification_settings_link: - 'https://appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/settings/notifications', - os: 'Android', - start_time: '2021-03-02T16:34:13.9184874Z', - source_version: '7ed5c7b279316f19e9a0c45bb0fb49c0655471af', - sent_at: '2021-03-02T16:41:55.8819564Z', + request: { + body: JSON.stringify({ + app_name: 'MSAppCenterTesting', + branch: 'master', + build_status: 'Succeeded', + build_id: '1', + build_link: + 'https://appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/build/branches/master/builds/1', + build_reason: 'manual', + finish_time: '2021-03-02T16:41:29.891411Z', + icon_link: null, + notification_settings_link: + 'https://appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/settings/notifications', + os: 'Android', + start_time: '2021-03-02T16:34:13.9184874Z', + source_version: '7ed5c7b279316f19e9a0c45bb0fb49c0655471af', + sent_at: '2021-03-02T16:41:55.8819564Z', + }), + }, + source: {}, }, ], method: 'POST', @@ -117,26 +127,31 @@ export const data = [ name: 'appcenter', description: 'test-2', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - app_name: 'MSAppCenterTesting', - branch: 'master', - build_status: 'Broken', - build_id: '2', - build_link: - 'https://appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/build/branches/master/builds/2', - build_reason: 'automatic', - finish_time: '2021-03-02T16:52:04.2587506Z', - icon_link: null, - notification_settings_link: - 'https://appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/settings/notifications', - os: 'Android', - start_time: '2021-03-02T16:50:52.2584107Z', - source_version: '0624e1e3e48eaf2371c37316208ff83bdd5c123b', - sent_at: '2021-03-02T16:52:35.8848052Z', + request: { + body: JSON.stringify({ + app_name: 'MSAppCenterTesting', + branch: 'master', + build_status: 'Broken', + build_id: '2', + build_link: + 'https://appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/build/branches/master/builds/2', + build_reason: 'automatic', + finish_time: '2021-03-02T16:52:04.2587506Z', + icon_link: null, + notification_settings_link: + 'https://appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/settings/notifications', + os: 'Android', + start_time: '2021-03-02T16:50:52.2584107Z', + source_version: '0624e1e3e48eaf2371c37316208ff83bdd5c123b', + sent_at: '2021-03-02T16:52:35.8848052Z', + }), + }, + source: {}, }, ], method: 'POST', @@ -195,34 +210,39 @@ export const data = [ name: 'appcenter', description: 'test-3', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - app_name: 'MSAppCenterTesting', - app_display_name: 'MSAppCenterTesting', - release_id: '1', - platform: 'Android', - uploaded_at: '2021-03-02T17:49:35.463Z', - fingerprint: '9cbdc86d96c5359d2af3972fdda46624', - release_notes: 'Degraded to 4.0.0', - version: '1614707021', - short_version: '1.0', - min_os: '7.1', - mandatory_update: true, - size: 2919106, - provisioning_profile_name: null, - provisioning_profile_type: null, - bundle_identifier: 'tech.desusai.msappcentertesting', - install_link: - 'https://install.appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/releases/1?source=email', - icon_link: - 'https://appcenter-filemanagement-distrib2ede6f06e.azureedge.net/dbbd3d57-9c09-448b-9782-0d57200f7c9b/ic_launcher.png?sv=2019-02-02&sr=c&sig=BNzQcMcvTbwf4fv59ByGiYXsr%2BA9PYDFyGJCqsE2RO0%3D&se=2021-03-09T17%3A49%3A35Z&sp=r', - distribution_group_id: '00000000-0000-0000-0000-000000000000', - installable: true, - sent_at: '2021-03-02T17:49:37.127635Z', - app_id: 'ce8b5280-4605-4c1c-8c48-bd54c8fdda31', + request: { + body: JSON.stringify({ + app_name: 'MSAppCenterTesting', + app_display_name: 'MSAppCenterTesting', + release_id: '1', + platform: 'Android', + uploaded_at: '2021-03-02T17:49:35.463Z', + fingerprint: '9cbdc86d96c5359d2af3972fdda46624', + release_notes: 'Degraded to 4.0.0', + version: '1614707021', + short_version: '1.0', + min_os: '7.1', + mandatory_update: true, + size: 2919106, + provisioning_profile_name: null, + provisioning_profile_type: null, + bundle_identifier: 'tech.desusai.msappcentertesting', + install_link: + 'https://install.appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/releases/1?source=email', + icon_link: + 'https://appcenter-filemanagement-distrib2ede6f06e.azureedge.net/dbbd3d57-9c09-448b-9782-0d57200f7c9b/ic_launcher.png?sv=2019-02-02&sr=c&sig=BNzQcMcvTbwf4fv59ByGiYXsr%2BA9PYDFyGJCqsE2RO0%3D&se=2021-03-09T17%3A49%3A35Z&sp=r', + distribution_group_id: '00000000-0000-0000-0000-000000000000', + installable: true, + sent_at: '2021-03-02T17:49:37.127635Z', + app_id: 'ce8b5280-4605-4c1c-8c48-bd54c8fdda31', + }), + }, + source: {}, }, ], method: 'POST', @@ -292,27 +312,32 @@ export const data = [ name: 'appcenter', description: 'test-4', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - id: '1139624368u', - name: 'tech.desusai.msappcentertesting.MainActivity$1.onClick (MainActivity.java:25)', - reason: 'java.lang.ArithmeticException: divide by zero', - file_name: null, - line_number: null, - url: 'https://appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/crashes/errors/1139624368u', - app_display_name: 'MSAppCenterTesting', - app_platform: 'Java', - app_version: '1.0(1)', - stack_trace: [ - 'tech.desusai.msappcentertesting.MainActivity$1.onClick (MainActivity.java:25);', - ], - affected_users: 0, - crash_count: 0, - sent_at: '2021-03-02T18:14:33.9713246Z', - app_id: 'ce8b5280-4605-4c1c-8c48-bd54c8fdda31', + request: { + body: JSON.stringify({ + id: '1139624368u', + name: 'tech.desusai.msappcentertesting.MainActivity$1.onClick (MainActivity.java:25)', + reason: 'java.lang.ArithmeticException: divide by zero', + file_name: null, + line_number: null, + url: 'https://appcenter.ms/users/venkat-rudderstack.com/apps/MSAppCenterTesting/crashes/errors/1139624368u', + app_display_name: 'MSAppCenterTesting', + app_platform: 'Java', + app_version: '1.0(1)', + stack_trace: [ + 'tech.desusai.msappcentertesting.MainActivity$1.onClick (MainActivity.java:25);', + ], + affected_users: 0, + crash_count: 0, + sent_at: '2021-03-02T18:14:33.9713246Z', + app_id: 'ce8b5280-4605-4c1c-8c48-bd54c8fdda31', + }), + }, + source: {}, }, ], method: 'POST', diff --git a/test/integrations/sources/appsflyer/data.ts b/test/integrations/sources/appsflyer/data.ts index 5ec64a07a87..7f84fc0577f 100644 --- a/test/integrations/sources/appsflyer/data.ts +++ b/test/integrations/sources/appsflyer/data.ts @@ -9,123 +9,128 @@ export const data = [ name: 'appsflyer', description: 'test-0', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', - device_category: 'phone', - af_sub1: null, - customer_user_id: 'hi.from@appsflyer.example.com', - is_lat: null, - contributor_2_af_prt: null, - bundle_id: 'com.appsflyer.AppsFlyer', - gp_broadcast_referrer: '', - contributor_2_touch_time: null, - contributor_3_touch_type: null, - event_source: 'SDK', - af_cost_value: null, - contributor_1_match_type: null, - app_version: '1.4.1', - contributor_3_af_prt: null, - custom_data: null, - contributor_2_touch_type: null, - gp_install_begin: null, - city: 'Khu Pho Binh Hoa', - amazon_aid: null, - gp_referrer: null, - af_cost_model: null, - af_c_id: null, - attributed_touch_time_selected_timezone: null, - selected_currency: 'USD', - app_name: 'AppsFlyer', - install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - postal_code: '823941', - wifi: true, - install_time: '2019-01-20 04:51:16.000', - operator: null, - attributed_touch_type: null, - af_attribution_lookback: null, - campaign_type: null, - keyword_match_type: null, - af_adset_id: null, - device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - contributor_2_media_source: null, - conversion_type: null, - contributor_2_match_type: null, - api_version: '2.0', - attributed_touch_time: null, - revenue_in_selected_currency: null, - is_retargeting: false, - country_code: 'VN', - gp_click_time: null, - contributor_1_af_prt: null, - match_type: null, - appsflyer_id: '1547985076649-5309999', - dma: 'None', - http_referrer: null, - af_sub5: null, - af_prt: null, - event_revenue_currency: 'USD', - store_reinstall: null, - install_app_store: null, - media_source: 'organic', - deeplink_url: null, - campaign: null, - af_keywords: null, - region: 'AS', - cost_in_selected_currency: null, - event_value: '{}', - ip: '1.1.1.1', - oaid: null, - event_time: '2020-01-15 14:57:24.898', - is_receipt_validated: null, - contributor_1_campaign: null, - af_sub4: null, - imei: null, - contributor_3_campaign: null, - event_revenue_usd: null, - af_sub2: null, - original_url: null, - contributor_2_campaign: null, - android_id: null, - contributor_3_media_source: null, - af_adset: null, - af_ad: null, - state: '57', - network_account_id: null, - device_type: 'iPhoneXR', - idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', - retargeting_conversion_type: null, - af_channel: null, - af_cost_currency: null, - contributor_1_media_source: null, - keyword_id: null, - device_download_time: '2019-01-20 04:51:16.000', - contributor_1_touch_type: null, - af_reengagement_window: null, - af_siteid: null, - language: 'en-US', - app_id: 'id1217828636', - contributor_1_touch_time: null, - event_revenue: null, - af_ad_type: null, - carrier: null, - event_name: 'My Apps', - af_sub_siteid: null, - advertising_id: null, - os_version: '12.3.1', - platform: 'ios', - af_sub3: null, - contributor_3_match_type: null, - selected_timezone: 'UTC', - af_ad_id: null, - contributor_3_touch_time: null, - user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', - is_primary_attribution: true, - sdk_version: 'v4.10.0', - event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + request: { + body: JSON.stringify({ + idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', + device_category: 'phone', + af_sub1: null, + customer_user_id: 'hi.from@appsflyer.example.com', + is_lat: null, + contributor_2_af_prt: null, + bundle_id: 'com.appsflyer.AppsFlyer', + gp_broadcast_referrer: '', + contributor_2_touch_time: null, + contributor_3_touch_type: null, + event_source: 'SDK', + af_cost_value: null, + contributor_1_match_type: null, + app_version: '1.4.1', + contributor_3_af_prt: null, + custom_data: null, + contributor_2_touch_type: null, + gp_install_begin: null, + city: 'Khu Pho Binh Hoa', + amazon_aid: null, + gp_referrer: null, + af_cost_model: null, + af_c_id: null, + attributed_touch_time_selected_timezone: null, + selected_currency: 'USD', + app_name: 'AppsFlyer', + install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + postal_code: '823941', + wifi: true, + install_time: '2019-01-20 04:51:16.000', + operator: null, + attributed_touch_type: null, + af_attribution_lookback: null, + campaign_type: null, + keyword_match_type: null, + af_adset_id: null, + device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + contributor_2_media_source: null, + conversion_type: null, + contributor_2_match_type: null, + api_version: '2.0', + attributed_touch_time: null, + revenue_in_selected_currency: null, + is_retargeting: false, + country_code: 'VN', + gp_click_time: null, + contributor_1_af_prt: null, + match_type: null, + appsflyer_id: '1547985076649-5309999', + dma: 'None', + http_referrer: null, + af_sub5: null, + af_prt: null, + event_revenue_currency: 'USD', + store_reinstall: null, + install_app_store: null, + media_source: 'organic', + deeplink_url: null, + campaign: null, + af_keywords: null, + region: 'AS', + cost_in_selected_currency: null, + event_value: '{}', + ip: '1.1.1.1', + oaid: null, + event_time: '2020-01-15 14:57:24.898', + is_receipt_validated: null, + contributor_1_campaign: null, + af_sub4: null, + imei: null, + contributor_3_campaign: null, + event_revenue_usd: null, + af_sub2: null, + original_url: null, + contributor_2_campaign: null, + android_id: null, + contributor_3_media_source: null, + af_adset: null, + af_ad: null, + state: '57', + network_account_id: null, + device_type: 'iPhoneXR', + idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', + retargeting_conversion_type: null, + af_channel: null, + af_cost_currency: null, + contributor_1_media_source: null, + keyword_id: null, + device_download_time: '2019-01-20 04:51:16.000', + contributor_1_touch_type: null, + af_reengagement_window: null, + af_siteid: null, + language: 'en-US', + app_id: 'id1217828636', + contributor_1_touch_time: null, + event_revenue: null, + af_ad_type: null, + carrier: null, + event_name: 'My Apps', + af_sub_siteid: null, + advertising_id: null, + os_version: '12.3.1', + platform: 'ios', + af_sub3: null, + contributor_3_match_type: null, + selected_timezone: 'UTC', + af_ad_id: null, + contributor_3_touch_time: null, + user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', + is_primary_attribution: true, + sdk_version: 'v4.10.0', + event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + }), + }, + source: {}, }, ], method: 'POST', @@ -160,10 +165,19 @@ export const data = [ network: { wifi: true }, os: { name: 'ios', version: '12.3.1' }, traits: { - address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' }, + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, userId: 'hi.from@appsflyer.example.com', }, - externalId: [{ type: 'appsflyerExternalId', value: '1547985076649-5309999' }], + externalId: [ + { + type: 'appsflyerExternalId', + value: '1547985076649-5309999', + }, + ], }, integrations: { AF: false }, properties: { @@ -267,7 +281,13 @@ export const data = [ timestamp: '2020-01-15 14:57:24.898', originalTimestamp: '2020-01-15 14:57:24.898', platform: 'ios', - traits: { address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' } }, + traits: { + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], @@ -281,123 +301,128 @@ export const data = [ name: 'appsflyer', description: 'test-1', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', - device_category: 'phone', - af_sub1: null, - customer_user_id: 'hi.from@appsflyer.example.com', - is_lat: null, - contributor_2_af_prt: null, - bundle_id: 'com.appsflyer.AppsFlyer', - gp_broadcast_referrer: '', - contributor_2_touch_time: null, - contributor_3_touch_type: null, - event_source: 'SDK', - af_cost_value: null, - contributor_1_match_type: null, - app_version: '1.4.1', - contributor_3_af_prt: null, - custom_data: null, - contributor_2_touch_type: null, - gp_install_begin: null, - city: 'Khu Pho Binh Hoa', - amazon_aid: null, - gp_referrer: null, - af_cost_model: null, - af_c_id: null, - attributed_touch_time_selected_timezone: null, - selected_currency: 'USD', - app_name: 'AppsFlyer', - install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - postal_code: '823941', - wifi: true, - install_time: '2019-01-20 04:51:16.000', - operator: null, - attributed_touch_type: null, - af_attribution_lookback: null, - campaign_type: null, - keyword_match_type: null, - af_adset_id: null, - device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - contributor_2_media_source: null, - conversion_type: null, - contributor_2_match_type: null, - api_version: '2.0', - attributed_touch_time: null, - revenue_in_selected_currency: null, - is_retargeting: false, - country_code: 'VN', - gp_click_time: null, - contributor_1_af_prt: null, - match_type: null, - appsflyer_id: '1547985076649-5309999', - dma: 'None', - http_referrer: null, - af_sub5: null, - af_prt: null, - event_revenue_currency: 'USD', - store_reinstall: null, - install_app_store: null, - media_source: 'organic', - deeplink_url: null, - campaign: null, - af_keywords: null, - region: 'AS', - cost_in_selected_currency: null, - event_value: '{}', - ip: '1.1.1.1', - oaid: null, - event_time: '2020-01-15 14:57:24.898', - is_receipt_validated: null, - contributor_1_campaign: null, - af_sub4: null, - imei: null, - contributor_3_campaign: null, - event_revenue_usd: null, - af_sub2: null, - original_url: null, - contributor_2_campaign: null, - android_id: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', - contributor_3_media_source: null, - af_adset: null, - af_ad: null, - state: '57', - network_account_id: null, - device_type: 'Nokia 5.3', - idfa: null, - retargeting_conversion_type: null, - af_channel: null, - af_cost_currency: null, - contributor_1_media_source: null, - keyword_id: null, - device_download_time: '2019-01-20 04:51:16.000', - contributor_1_touch_type: null, - af_reengagement_window: null, - af_siteid: null, - language: 'en-US', - app_id: 'id1217828636', - contributor_1_touch_time: null, - event_revenue: null, - af_ad_type: null, - carrier: null, - event_name: 'My Apps', - af_sub_siteid: null, - advertising_id: null, - os_version: '12.3.1', - platform: 'android', - af_sub3: null, - contributor_3_match_type: null, - selected_timezone: 'UTC', - af_ad_id: null, - contributor_3_touch_time: null, - user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', - is_primary_attribution: true, - sdk_version: 'v4.10.0', - event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + request: { + body: JSON.stringify({ + idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', + device_category: 'phone', + af_sub1: null, + customer_user_id: 'hi.from@appsflyer.example.com', + is_lat: null, + contributor_2_af_prt: null, + bundle_id: 'com.appsflyer.AppsFlyer', + gp_broadcast_referrer: '', + contributor_2_touch_time: null, + contributor_3_touch_type: null, + event_source: 'SDK', + af_cost_value: null, + contributor_1_match_type: null, + app_version: '1.4.1', + contributor_3_af_prt: null, + custom_data: null, + contributor_2_touch_type: null, + gp_install_begin: null, + city: 'Khu Pho Binh Hoa', + amazon_aid: null, + gp_referrer: null, + af_cost_model: null, + af_c_id: null, + attributed_touch_time_selected_timezone: null, + selected_currency: 'USD', + app_name: 'AppsFlyer', + install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + postal_code: '823941', + wifi: true, + install_time: '2019-01-20 04:51:16.000', + operator: null, + attributed_touch_type: null, + af_attribution_lookback: null, + campaign_type: null, + keyword_match_type: null, + af_adset_id: null, + device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + contributor_2_media_source: null, + conversion_type: null, + contributor_2_match_type: null, + api_version: '2.0', + attributed_touch_time: null, + revenue_in_selected_currency: null, + is_retargeting: false, + country_code: 'VN', + gp_click_time: null, + contributor_1_af_prt: null, + match_type: null, + appsflyer_id: '1547985076649-5309999', + dma: 'None', + http_referrer: null, + af_sub5: null, + af_prt: null, + event_revenue_currency: 'USD', + store_reinstall: null, + install_app_store: null, + media_source: 'organic', + deeplink_url: null, + campaign: null, + af_keywords: null, + region: 'AS', + cost_in_selected_currency: null, + event_value: '{}', + ip: '1.1.1.1', + oaid: null, + event_time: '2020-01-15 14:57:24.898', + is_receipt_validated: null, + contributor_1_campaign: null, + af_sub4: null, + imei: null, + contributor_3_campaign: null, + event_revenue_usd: null, + af_sub2: null, + original_url: null, + contributor_2_campaign: null, + android_id: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', + contributor_3_media_source: null, + af_adset: null, + af_ad: null, + state: '57', + network_account_id: null, + device_type: 'Nokia 5.3', + idfa: null, + retargeting_conversion_type: null, + af_channel: null, + af_cost_currency: null, + contributor_1_media_source: null, + keyword_id: null, + device_download_time: '2019-01-20 04:51:16.000', + contributor_1_touch_type: null, + af_reengagement_window: null, + af_siteid: null, + language: 'en-US', + app_id: 'id1217828636', + contributor_1_touch_time: null, + event_revenue: null, + af_ad_type: null, + carrier: null, + event_name: 'My Apps', + af_sub_siteid: null, + advertising_id: null, + os_version: '12.3.1', + platform: 'android', + af_sub3: null, + contributor_3_match_type: null, + selected_timezone: 'UTC', + af_ad_id: null, + contributor_3_touch_time: null, + user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', + is_primary_attribution: true, + sdk_version: 'v4.10.0', + event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + }), + }, + source: {}, }, ], method: 'POST', @@ -432,10 +457,19 @@ export const data = [ network: { wifi: true }, os: { name: 'android', version: '12.3.1' }, traits: { - address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' }, + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, userId: 'hi.from@appsflyer.example.com', }, - externalId: [{ type: 'appsflyerExternalId', value: '1547985076649-5309999' }], + externalId: [ + { + type: 'appsflyerExternalId', + value: '1547985076649-5309999', + }, + ], }, integrations: { AF: false }, properties: { @@ -539,7 +573,13 @@ export const data = [ timestamp: '2020-01-15 14:57:24.898', originalTimestamp: '2020-01-15 14:57:24.898', platform: 'android', - traits: { address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' } }, + traits: { + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], @@ -553,122 +593,127 @@ export const data = [ name: 'appsflyer', description: 'test-2', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', - device_category: 'phone', - af_sub1: null, - customer_user_id: 'hi.from@appsflyer.example.com', - is_lat: null, - contributor_2_af_prt: null, - bundle_id: 'com.appsflyer.AppsFlyer', - gp_broadcast_referrer: '', - contributor_2_touch_time: null, - contributor_3_touch_type: null, - event_source: 'SDK', - af_cost_value: null, - contributor_1_match_type: null, - app_version: '1.4.1', - contributor_3_af_prt: null, - custom_data: null, - contributor_2_touch_type: null, - gp_install_begin: null, - city: 'Khu Pho Binh Hoa', - amazon_aid: null, - gp_referrer: null, - af_cost_model: null, - af_c_id: null, - attributed_touch_time_selected_timezone: null, - selected_currency: 'USD', - app_name: 'AppsFlyer', - install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - postal_code: '823941', - wifi: true, - install_time: '2019-01-20 04:51:16.000', - operator: null, - attributed_touch_type: null, - af_attribution_lookback: null, - campaign_type: null, - keyword_match_type: null, - af_adset_id: null, - device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - contributor_2_media_source: null, - conversion_type: null, - contributor_2_match_type: null, - api_version: '2.0', - attributed_touch_time: null, - revenue_in_selected_currency: null, - is_retargeting: false, - country_code: 'VN', - gp_click_time: null, - contributor_1_af_prt: null, - match_type: null, - appsflyer_id: '1547985076649-5309999', - dma: 'None', - http_referrer: null, - af_sub5: null, - af_prt: null, - event_revenue_currency: 'USD', - store_reinstall: null, - install_app_store: null, - media_source: 'organic', - deeplink_url: null, - campaign: null, - af_keywords: null, - region: 'AS', - cost_in_selected_currency: null, - event_value: '{}', - ip: '1.1.1.1', - oaid: null, - event_time: '2020-01-15 14:57:24.898', - is_receipt_validated: null, - contributor_1_campaign: null, - af_sub4: null, - imei: null, - contributor_3_campaign: null, - event_revenue_usd: null, - af_sub2: null, - original_url: null, - contributor_2_campaign: null, - android_id: null, - contributor_3_media_source: null, - af_adset: null, - af_ad: null, - state: '57', - network_account_id: null, - device_type: 'iPhoneXR', - idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', - retargeting_conversion_type: null, - af_channel: null, - af_cost_currency: null, - contributor_1_media_source: null, - keyword_id: null, - device_download_time: '2019-01-20 04:51:16.000', - contributor_1_touch_type: null, - af_reengagement_window: null, - af_siteid: null, - language: 'en-US', - app_id: 'id1217828636', - contributor_1_touch_time: null, - event_revenue: null, - af_ad_type: null, - carrier: null, - af_sub_siteid: null, - advertising_id: null, - os_version: '12.3.1', - platform: 'ios', - af_sub3: null, - contributor_3_match_type: null, - selected_timezone: 'UTC', - af_ad_id: null, - contributor_3_touch_time: null, - user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', - is_primary_attribution: true, - sdk_version: 'v4.10.0', - event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + request: { + body: JSON.stringify({ + idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', + device_category: 'phone', + af_sub1: null, + customer_user_id: 'hi.from@appsflyer.example.com', + is_lat: null, + contributor_2_af_prt: null, + bundle_id: 'com.appsflyer.AppsFlyer', + gp_broadcast_referrer: '', + contributor_2_touch_time: null, + contributor_3_touch_type: null, + event_source: 'SDK', + af_cost_value: null, + contributor_1_match_type: null, + app_version: '1.4.1', + contributor_3_af_prt: null, + custom_data: null, + contributor_2_touch_type: null, + gp_install_begin: null, + city: 'Khu Pho Binh Hoa', + amazon_aid: null, + gp_referrer: null, + af_cost_model: null, + af_c_id: null, + attributed_touch_time_selected_timezone: null, + selected_currency: 'USD', + app_name: 'AppsFlyer', + install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + postal_code: '823941', + wifi: true, + install_time: '2019-01-20 04:51:16.000', + operator: null, + attributed_touch_type: null, + af_attribution_lookback: null, + campaign_type: null, + keyword_match_type: null, + af_adset_id: null, + device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + contributor_2_media_source: null, + conversion_type: null, + contributor_2_match_type: null, + api_version: '2.0', + attributed_touch_time: null, + revenue_in_selected_currency: null, + is_retargeting: false, + country_code: 'VN', + gp_click_time: null, + contributor_1_af_prt: null, + match_type: null, + appsflyer_id: '1547985076649-5309999', + dma: 'None', + http_referrer: null, + af_sub5: null, + af_prt: null, + event_revenue_currency: 'USD', + store_reinstall: null, + install_app_store: null, + media_source: 'organic', + deeplink_url: null, + campaign: null, + af_keywords: null, + region: 'AS', + cost_in_selected_currency: null, + event_value: '{}', + ip: '1.1.1.1', + oaid: null, + event_time: '2020-01-15 14:57:24.898', + is_receipt_validated: null, + contributor_1_campaign: null, + af_sub4: null, + imei: null, + contributor_3_campaign: null, + event_revenue_usd: null, + af_sub2: null, + original_url: null, + contributor_2_campaign: null, + android_id: null, + contributor_3_media_source: null, + af_adset: null, + af_ad: null, + state: '57', + network_account_id: null, + device_type: 'iPhoneXR', + idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', + retargeting_conversion_type: null, + af_channel: null, + af_cost_currency: null, + contributor_1_media_source: null, + keyword_id: null, + device_download_time: '2019-01-20 04:51:16.000', + contributor_1_touch_type: null, + af_reengagement_window: null, + af_siteid: null, + language: 'en-US', + app_id: 'id1217828636', + contributor_1_touch_time: null, + event_revenue: null, + af_ad_type: null, + carrier: null, + af_sub_siteid: null, + advertising_id: null, + os_version: '12.3.1', + platform: 'ios', + af_sub3: null, + contributor_3_match_type: null, + selected_timezone: 'UTC', + af_ad_id: null, + contributor_3_touch_time: null, + user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', + is_primary_attribution: true, + sdk_version: 'v4.10.0', + event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + }), + }, + source: {}, }, ], method: 'POST', @@ -687,6 +732,7 @@ export const data = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'appsflyer', workspaceId: 'Non determinable', }, statusCode: 400, @@ -699,122 +745,127 @@ export const data = [ name: 'appsflyer', description: 'test-3', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', - device_category: 'phone', - af_sub1: null, - is_lat: null, - contributor_2_af_prt: null, - bundle_id: 'com.appsflyer.AppsFlyer', - gp_broadcast_referrer: '', - contributor_2_touch_time: null, - contributor_3_touch_type: null, - event_source: 'SDK', - af_cost_value: null, - contributor_1_match_type: null, - app_version: '1.4.1', - contributor_3_af_prt: null, - custom_data: null, - contributor_2_touch_type: null, - gp_install_begin: null, - city: 'Khu Pho Binh Hoa', - amazon_aid: null, - gp_referrer: null, - af_cost_model: null, - af_c_id: null, - attributed_touch_time_selected_timezone: null, - selected_currency: 'USD', - app_name: 'AppsFlyer', - install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - postal_code: '823941', - wifi: true, - install_time: '2019-01-20 04:51:16.000', - operator: null, - attributed_touch_type: null, - af_attribution_lookback: null, - campaign_type: null, - keyword_match_type: null, - af_adset_id: null, - device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - contributor_2_media_source: null, - conversion_type: null, - contributor_2_match_type: null, - api_version: '2.0', - attributed_touch_time: null, - revenue_in_selected_currency: null, - is_retargeting: false, - country_code: 'VN', - gp_click_time: null, - contributor_1_af_prt: null, - match_type: null, - appsflyer_id: '1547985076649-5309999', - dma: 'None', - http_referrer: null, - af_sub5: null, - af_prt: null, - event_revenue_currency: 'USD', - store_reinstall: null, - install_app_store: null, - media_source: 'organic', - deeplink_url: null, - campaign: null, - af_keywords: null, - region: 'AS', - cost_in_selected_currency: null, - event_value: '{}', - ip: '1.1.1.1', - oaid: null, - event_time: '2020-01-15 14:57:24.898', - is_receipt_validated: null, - contributor_1_campaign: null, - af_sub4: null, - imei: null, - contributor_3_campaign: null, - event_revenue_usd: null, - af_sub2: null, - original_url: null, - contributor_2_campaign: null, - android_id: null, - contributor_3_media_source: null, - af_adset: null, - af_ad: null, - state: '57', - network_account_id: null, - device_type: 'iPhoneXR', - idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', - retargeting_conversion_type: null, - af_channel: null, - af_cost_currency: null, - contributor_1_media_source: null, - keyword_id: null, - device_download_time: '2019-01-20 04:51:16.000', - contributor_1_touch_type: null, - af_reengagement_window: null, - af_siteid: null, - language: 'en-US', - app_id: 'id1217828636', - contributor_1_touch_time: null, - event_revenue: null, - af_ad_type: null, - carrier: null, - event_name: 'My Apps', - af_sub_siteid: null, - advertising_id: null, - os_version: '12.3.1', - platform: 'ios', - af_sub3: null, - contributor_3_match_type: null, - selected_timezone: 'UTC', - af_ad_id: null, - contributor_3_touch_time: null, - user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', - is_primary_attribution: true, - sdk_version: 'v4.10.0', - event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + request: { + body: JSON.stringify({ + idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', + device_category: 'phone', + af_sub1: null, + is_lat: null, + contributor_2_af_prt: null, + bundle_id: 'com.appsflyer.AppsFlyer', + gp_broadcast_referrer: '', + contributor_2_touch_time: null, + contributor_3_touch_type: null, + event_source: 'SDK', + af_cost_value: null, + contributor_1_match_type: null, + app_version: '1.4.1', + contributor_3_af_prt: null, + custom_data: null, + contributor_2_touch_type: null, + gp_install_begin: null, + city: 'Khu Pho Binh Hoa', + amazon_aid: null, + gp_referrer: null, + af_cost_model: null, + af_c_id: null, + attributed_touch_time_selected_timezone: null, + selected_currency: 'USD', + app_name: 'AppsFlyer', + install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + postal_code: '823941', + wifi: true, + install_time: '2019-01-20 04:51:16.000', + operator: null, + attributed_touch_type: null, + af_attribution_lookback: null, + campaign_type: null, + keyword_match_type: null, + af_adset_id: null, + device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + contributor_2_media_source: null, + conversion_type: null, + contributor_2_match_type: null, + api_version: '2.0', + attributed_touch_time: null, + revenue_in_selected_currency: null, + is_retargeting: false, + country_code: 'VN', + gp_click_time: null, + contributor_1_af_prt: null, + match_type: null, + appsflyer_id: '1547985076649-5309999', + dma: 'None', + http_referrer: null, + af_sub5: null, + af_prt: null, + event_revenue_currency: 'USD', + store_reinstall: null, + install_app_store: null, + media_source: 'organic', + deeplink_url: null, + campaign: null, + af_keywords: null, + region: 'AS', + cost_in_selected_currency: null, + event_value: '{}', + ip: '1.1.1.1', + oaid: null, + event_time: '2020-01-15 14:57:24.898', + is_receipt_validated: null, + contributor_1_campaign: null, + af_sub4: null, + imei: null, + contributor_3_campaign: null, + event_revenue_usd: null, + af_sub2: null, + original_url: null, + contributor_2_campaign: null, + android_id: null, + contributor_3_media_source: null, + af_adset: null, + af_ad: null, + state: '57', + network_account_id: null, + device_type: 'iPhoneXR', + idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', + retargeting_conversion_type: null, + af_channel: null, + af_cost_currency: null, + contributor_1_media_source: null, + keyword_id: null, + device_download_time: '2019-01-20 04:51:16.000', + contributor_1_touch_type: null, + af_reengagement_window: null, + af_siteid: null, + language: 'en-US', + app_id: 'id1217828636', + contributor_1_touch_time: null, + event_revenue: null, + af_ad_type: null, + carrier: null, + event_name: 'My Apps', + af_sub_siteid: null, + advertising_id: null, + os_version: '12.3.1', + platform: 'ios', + af_sub3: null, + contributor_3_match_type: null, + selected_timezone: 'UTC', + af_ad_id: null, + contributor_3_touch_time: null, + user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', + is_primary_attribution: true, + sdk_version: 'v4.10.0', + event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + }), + }, + source: {}, }, ], method: 'POST', @@ -848,8 +899,19 @@ export const data = [ }, network: { wifi: true }, os: { name: 'ios', version: '12.3.1' }, - traits: { address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' } }, - externalId: [{ type: 'appsflyerExternalId', value: '1547985076649-5309999' }], + traits: { + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, + }, + externalId: [ + { + type: 'appsflyerExternalId', + value: '1547985076649-5309999', + }, + ], }, integrations: { AF: false }, type: 'track', @@ -952,7 +1014,13 @@ export const data = [ timestamp: '2020-01-15 14:57:24.898', originalTimestamp: '2020-01-15 14:57:24.898', platform: 'ios', - traits: { address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' } }, + traits: { + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], @@ -966,122 +1034,127 @@ export const data = [ name: 'appsflyer', description: 'test-4', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', - device_category: 'phone', - af_sub1: null, - customer_user_id: 'hi.from@appsflyer.example.com', - is_lat: null, - contributor_2_af_prt: null, - bundle_id: 'com.appsflyer.AppsFlyer', - gp_broadcast_referrer: '', - contributor_2_touch_time: null, - contributor_3_touch_type: null, - event_source: 'SDK', - af_cost_value: null, - contributor_1_match_type: null, - app_version: '1.4.1', - contributor_3_af_prt: null, - custom_data: null, - contributor_2_touch_type: null, - gp_install_begin: null, - city: 'Khu Pho Binh Hoa', - amazon_aid: null, - gp_referrer: null, - af_cost_model: null, - af_c_id: null, - attributed_touch_time_selected_timezone: null, - selected_currency: 'USD', - app_name: 'AppsFlyer', - install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - postal_code: '823941', - wifi: true, - install_time: '2019-01-20 04:51:16.000', - operator: null, - attributed_touch_type: null, - af_attribution_lookback: null, - campaign_type: null, - keyword_match_type: null, - af_adset_id: null, - device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - contributor_2_media_source: null, - conversion_type: null, - contributor_2_match_type: null, - api_version: '2.0', - attributed_touch_time: null, - revenue_in_selected_currency: null, - is_retargeting: false, - country_code: 'VN', - gp_click_time: null, - contributor_1_af_prt: null, - match_type: null, - appsflyer_id: '1547985076649-5309999', - dma: 'None', - http_referrer: null, - af_sub5: null, - af_prt: null, - event_revenue_currency: 'USD', - store_reinstall: null, - install_app_store: null, - media_source: 'organic', - deeplink_url: null, - campaign: null, - af_keywords: null, - region: 'AS', - cost_in_selected_currency: null, - event_value: '{}', - ip: '1.1.1.1', - oaid: null, - event_time: '2020-01-15 14:57:24.898', - is_receipt_validated: null, - contributor_1_campaign: null, - af_sub4: null, - imei: null, - contributor_3_campaign: null, - event_revenue_usd: null, - af_sub2: null, - original_url: null, - contributor_2_campaign: null, - android_id: null, - contributor_3_media_source: null, - af_adset: null, - af_ad: null, - state: '57', - network_account_id: null, - idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', - retargeting_conversion_type: null, - af_channel: null, - af_cost_currency: null, - contributor_1_media_source: null, - keyword_id: null, - device_download_time: '2019-01-20 04:51:16.000', - contributor_1_touch_type: null, - af_reengagement_window: null, - af_siteid: null, - language: 'en-US', - app_id: 'id1217828636', - contributor_1_touch_time: null, - event_revenue: null, - af_ad_type: null, - carrier: null, - event_name: 'My Apps', - af_sub_siteid: null, - advertising_id: null, - os_version: '12.3.1', - platform: 'ios', - af_sub3: null, - contributor_3_match_type: null, - selected_timezone: 'UTC', - af_ad_id: null, - contributor_3_touch_time: null, - user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', - is_primary_attribution: true, - sdk_version: 'v4.10.0', - event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + request: { + body: JSON.stringify({ + idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', + device_category: 'phone', + af_sub1: null, + customer_user_id: 'hi.from@appsflyer.example.com', + is_lat: null, + contributor_2_af_prt: null, + bundle_id: 'com.appsflyer.AppsFlyer', + gp_broadcast_referrer: '', + contributor_2_touch_time: null, + contributor_3_touch_type: null, + event_source: 'SDK', + af_cost_value: null, + contributor_1_match_type: null, + app_version: '1.4.1', + contributor_3_af_prt: null, + custom_data: null, + contributor_2_touch_type: null, + gp_install_begin: null, + city: 'Khu Pho Binh Hoa', + amazon_aid: null, + gp_referrer: null, + af_cost_model: null, + af_c_id: null, + attributed_touch_time_selected_timezone: null, + selected_currency: 'USD', + app_name: 'AppsFlyer', + install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + postal_code: '823941', + wifi: true, + install_time: '2019-01-20 04:51:16.000', + operator: null, + attributed_touch_type: null, + af_attribution_lookback: null, + campaign_type: null, + keyword_match_type: null, + af_adset_id: null, + device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + contributor_2_media_source: null, + conversion_type: null, + contributor_2_match_type: null, + api_version: '2.0', + attributed_touch_time: null, + revenue_in_selected_currency: null, + is_retargeting: false, + country_code: 'VN', + gp_click_time: null, + contributor_1_af_prt: null, + match_type: null, + appsflyer_id: '1547985076649-5309999', + dma: 'None', + http_referrer: null, + af_sub5: null, + af_prt: null, + event_revenue_currency: 'USD', + store_reinstall: null, + install_app_store: null, + media_source: 'organic', + deeplink_url: null, + campaign: null, + af_keywords: null, + region: 'AS', + cost_in_selected_currency: null, + event_value: '{}', + ip: '1.1.1.1', + oaid: null, + event_time: '2020-01-15 14:57:24.898', + is_receipt_validated: null, + contributor_1_campaign: null, + af_sub4: null, + imei: null, + contributor_3_campaign: null, + event_revenue_usd: null, + af_sub2: null, + original_url: null, + contributor_2_campaign: null, + android_id: null, + contributor_3_media_source: null, + af_adset: null, + af_ad: null, + state: '57', + network_account_id: null, + idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', + retargeting_conversion_type: null, + af_channel: null, + af_cost_currency: null, + contributor_1_media_source: null, + keyword_id: null, + device_download_time: '2019-01-20 04:51:16.000', + contributor_1_touch_type: null, + af_reengagement_window: null, + af_siteid: null, + language: 'en-US', + app_id: 'id1217828636', + contributor_1_touch_time: null, + event_revenue: null, + af_ad_type: null, + carrier: null, + event_name: 'My Apps', + af_sub_siteid: null, + advertising_id: null, + os_version: '12.3.1', + platform: 'ios', + af_sub3: null, + contributor_3_match_type: null, + selected_timezone: 'UTC', + af_ad_id: null, + contributor_3_touch_time: null, + user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', + is_primary_attribution: true, + sdk_version: 'v4.10.0', + event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + }), + }, + source: {}, }, ], method: 'POST', @@ -1115,10 +1188,19 @@ export const data = [ network: { wifi: true }, os: { name: 'ios', version: '12.3.1' }, traits: { - address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' }, + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, userId: 'hi.from@appsflyer.example.com', }, - externalId: [{ type: 'appsflyerExternalId', value: '1547985076649-5309999' }], + externalId: [ + { + type: 'appsflyerExternalId', + value: '1547985076649-5309999', + }, + ], }, integrations: { AF: false }, properties: { @@ -1222,7 +1304,13 @@ export const data = [ timestamp: '2020-01-15 14:57:24.898', originalTimestamp: '2020-01-15 14:57:24.898', platform: 'ios', - traits: { address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' } }, + traits: { + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], @@ -1236,122 +1324,127 @@ export const data = [ name: 'appsflyer', description: 'test-5', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', - device_category: 'phone', - af_sub1: null, - customer_user_id: 'hi.from@appsflyer.example.com', - is_lat: null, - contributor_2_af_prt: null, - bundle_id: 'com.appsflyer.AppsFlyer', - gp_broadcast_referrer: '', - contributor_2_touch_time: null, - contributor_3_touch_type: null, - event_source: 'SDK', - af_cost_value: null, - contributor_1_match_type: null, - app_version: '1.4.1', - contributor_3_af_prt: null, - custom_data: null, - contributor_2_touch_type: null, - gp_install_begin: null, - city: 'Khu Pho Binh Hoa', - amazon_aid: null, - gp_referrer: null, - af_cost_model: null, - af_c_id: null, - attributed_touch_time_selected_timezone: null, - selected_currency: 'USD', - app_name: 'AppsFlyer', - install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - postal_code: '823941', - wifi: true, - install_time: '2019-01-20 04:51:16.000', - operator: null, - attributed_touch_type: null, - af_attribution_lookback: null, - campaign_type: null, - keyword_match_type: null, - af_adset_id: null, - device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - contributor_2_media_source: null, - conversion_type: null, - contributor_2_match_type: null, - api_version: '2.0', - attributed_touch_time: null, - revenue_in_selected_currency: null, - is_retargeting: false, - country_code: 'VN', - gp_click_time: null, - contributor_1_af_prt: null, - match_type: null, - appsflyer_id: '1547985076649-5309999', - dma: 'None', - http_referrer: null, - af_sub5: null, - af_prt: null, - event_revenue_currency: 'USD', - store_reinstall: null, - install_app_store: null, - media_source: 'organic', - deeplink_url: null, - campaign: null, - af_keywords: null, - region: 'AS', - cost_in_selected_currency: null, - event_value: '{}', - ip: '1.1.1.1', - oaid: null, - event_time: '2020-01-15 14:57:24.898', - is_receipt_validated: null, - contributor_1_campaign: null, - af_sub4: null, - imei: null, - contributor_3_campaign: null, - event_revenue_usd: null, - af_sub2: null, - original_url: null, - contributor_2_campaign: null, - android_id: null, - contributor_3_media_source: null, - af_adset: null, - af_ad: null, - state: '57', - network_account_id: null, - idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', - retargeting_conversion_type: null, - af_channel: null, - af_cost_currency: null, - contributor_1_media_source: null, - keyword_id: null, - device_download_time: '2019-01-20 04:51:16.000', - contributor_1_touch_type: null, - af_reengagement_window: null, - af_siteid: null, - language: 'en-US', - app_id: 'id1217828636', - contributor_1_touch_time: null, - event_revenue: null, - af_ad_type: null, - carrier: null, - event_name: 'My Apps', - af_sub_siteid: null, - advertising_id: null, - os_version: '12.3.1', - platform: 'watchos', - af_sub3: null, - contributor_3_match_type: null, - selected_timezone: 'UTC', - af_ad_id: null, - contributor_3_touch_time: null, - user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', - is_primary_attribution: true, - sdk_version: 'v4.10.0', - event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + request: { + body: JSON.stringify({ + idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', + device_category: 'phone', + af_sub1: null, + customer_user_id: 'hi.from@appsflyer.example.com', + is_lat: null, + contributor_2_af_prt: null, + bundle_id: 'com.appsflyer.AppsFlyer', + gp_broadcast_referrer: '', + contributor_2_touch_time: null, + contributor_3_touch_type: null, + event_source: 'SDK', + af_cost_value: null, + contributor_1_match_type: null, + app_version: '1.4.1', + contributor_3_af_prt: null, + custom_data: null, + contributor_2_touch_type: null, + gp_install_begin: null, + city: 'Khu Pho Binh Hoa', + amazon_aid: null, + gp_referrer: null, + af_cost_model: null, + af_c_id: null, + attributed_touch_time_selected_timezone: null, + selected_currency: 'USD', + app_name: 'AppsFlyer', + install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + postal_code: '823941', + wifi: true, + install_time: '2019-01-20 04:51:16.000', + operator: null, + attributed_touch_type: null, + af_attribution_lookback: null, + campaign_type: null, + keyword_match_type: null, + af_adset_id: null, + device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + contributor_2_media_source: null, + conversion_type: null, + contributor_2_match_type: null, + api_version: '2.0', + attributed_touch_time: null, + revenue_in_selected_currency: null, + is_retargeting: false, + country_code: 'VN', + gp_click_time: null, + contributor_1_af_prt: null, + match_type: null, + appsflyer_id: '1547985076649-5309999', + dma: 'None', + http_referrer: null, + af_sub5: null, + af_prt: null, + event_revenue_currency: 'USD', + store_reinstall: null, + install_app_store: null, + media_source: 'organic', + deeplink_url: null, + campaign: null, + af_keywords: null, + region: 'AS', + cost_in_selected_currency: null, + event_value: '{}', + ip: '1.1.1.1', + oaid: null, + event_time: '2020-01-15 14:57:24.898', + is_receipt_validated: null, + contributor_1_campaign: null, + af_sub4: null, + imei: null, + contributor_3_campaign: null, + event_revenue_usd: null, + af_sub2: null, + original_url: null, + contributor_2_campaign: null, + android_id: null, + contributor_3_media_source: null, + af_adset: null, + af_ad: null, + state: '57', + network_account_id: null, + idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', + retargeting_conversion_type: null, + af_channel: null, + af_cost_currency: null, + contributor_1_media_source: null, + keyword_id: null, + device_download_time: '2019-01-20 04:51:16.000', + contributor_1_touch_type: null, + af_reengagement_window: null, + af_siteid: null, + language: 'en-US', + app_id: 'id1217828636', + contributor_1_touch_time: null, + event_revenue: null, + af_ad_type: null, + carrier: null, + event_name: 'My Apps', + af_sub_siteid: null, + advertising_id: null, + os_version: '12.3.1', + platform: 'watchos', + af_sub3: null, + contributor_3_match_type: null, + selected_timezone: 'UTC', + af_ad_id: null, + contributor_3_touch_time: null, + user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', + is_primary_attribution: true, + sdk_version: 'v4.10.0', + event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + }), + }, + source: {}, }, ], method: 'POST', @@ -1385,10 +1478,19 @@ export const data = [ network: { wifi: true }, os: { name: 'watchos', version: '12.3.1' }, traits: { - address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' }, + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, userId: 'hi.from@appsflyer.example.com', }, - externalId: [{ type: 'appsflyerExternalId', value: '1547985076649-5309999' }], + externalId: [ + { + type: 'appsflyerExternalId', + value: '1547985076649-5309999', + }, + ], }, integrations: { AF: false }, properties: { @@ -1492,7 +1594,13 @@ export const data = [ timestamp: '2020-01-15 14:57:24.898', originalTimestamp: '2020-01-15 14:57:24.898', platform: 'watchos', - traits: { address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' } }, + traits: { + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], @@ -1506,122 +1614,127 @@ export const data = [ name: 'appsflyer', description: 'test-6', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', - device_category: 'phone', - af_sub1: null, - customer_user_id: 'hi.from@appsflyer.example.com', - is_lat: null, - contributor_2_af_prt: null, - bundle_id: 'com.appsflyer.AppsFlyer', - gp_broadcast_referrer: '', - contributor_2_touch_time: null, - contributor_3_touch_type: null, - event_source: 'SDK', - af_cost_value: null, - contributor_1_match_type: null, - app_version: '1.4.1', - contributor_3_af_prt: null, - custom_data: null, - contributor_2_touch_type: null, - gp_install_begin: null, - city: 'Khu Pho Binh Hoa', - amazon_aid: null, - gp_referrer: null, - af_cost_model: null, - af_c_id: null, - attributed_touch_time_selected_timezone: null, - selected_currency: 'USD', - app_name: 'AppsFlyer', - install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - postal_code: '823941', - wifi: true, - install_time: '2019-01-20 04:51:16.000', - operator: null, - attributed_touch_type: null, - af_attribution_lookback: null, - campaign_type: null, - keyword_match_type: null, - af_adset_id: null, - device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - contributor_2_media_source: null, - conversion_type: null, - contributor_2_match_type: null, - api_version: '2.0', - attributed_touch_time: null, - revenue_in_selected_currency: null, - is_retargeting: false, - country_code: 'VN', - gp_click_time: null, - contributor_1_af_prt: null, - match_type: null, - appsflyer_id: '1547985076649-5309999', - dma: 'None', - http_referrer: null, - af_sub5: null, - af_prt: null, - event_revenue_currency: 'USD', - store_reinstall: null, - install_app_store: null, - media_source: 'organic', - deeplink_url: null, - campaign: null, - af_keywords: null, - region: 'AS', - cost_in_selected_currency: null, - event_value: '{}', - ip: '1.1.1.1', - oaid: null, - event_time: '2020-01-15 14:57:24.898', - is_receipt_validated: null, - contributor_1_campaign: null, - af_sub4: null, - imei: null, - contributor_3_campaign: null, - event_revenue_usd: null, - af_sub2: null, - original_url: null, - contributor_2_campaign: null, - android_id: null, - contributor_3_media_source: null, - af_adset: null, - af_ad: null, - state: '57', - network_account_id: null, - idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', - retargeting_conversion_type: null, - af_channel: null, - af_cost_currency: null, - contributor_1_media_source: null, - keyword_id: null, - device_download_time: '2019-01-20 04:51:16.000', - contributor_1_touch_type: null, - af_reengagement_window: null, - af_siteid: null, - language: 'en-US', - app_id: 'id1217828636', - contributor_1_touch_time: null, - event_revenue: null, - af_ad_type: null, - carrier: null, - event_name: 'My Apps', - af_sub_siteid: null, - advertising_id: null, - os_version: '12.3.1', - platform: 'ipados', - af_sub3: null, - contributor_3_match_type: null, - selected_timezone: 'UTC', - af_ad_id: null, - contributor_3_touch_time: null, - user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', - is_primary_attribution: true, - sdk_version: 'v4.10.0', - event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + request: { + body: JSON.stringify({ + idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', + device_category: 'phone', + af_sub1: null, + customer_user_id: 'hi.from@appsflyer.example.com', + is_lat: null, + contributor_2_af_prt: null, + bundle_id: 'com.appsflyer.AppsFlyer', + gp_broadcast_referrer: '', + contributor_2_touch_time: null, + contributor_3_touch_type: null, + event_source: 'SDK', + af_cost_value: null, + contributor_1_match_type: null, + app_version: '1.4.1', + contributor_3_af_prt: null, + custom_data: null, + contributor_2_touch_type: null, + gp_install_begin: null, + city: 'Khu Pho Binh Hoa', + amazon_aid: null, + gp_referrer: null, + af_cost_model: null, + af_c_id: null, + attributed_touch_time_selected_timezone: null, + selected_currency: 'USD', + app_name: 'AppsFlyer', + install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + postal_code: '823941', + wifi: true, + install_time: '2019-01-20 04:51:16.000', + operator: null, + attributed_touch_type: null, + af_attribution_lookback: null, + campaign_type: null, + keyword_match_type: null, + af_adset_id: null, + device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + contributor_2_media_source: null, + conversion_type: null, + contributor_2_match_type: null, + api_version: '2.0', + attributed_touch_time: null, + revenue_in_selected_currency: null, + is_retargeting: false, + country_code: 'VN', + gp_click_time: null, + contributor_1_af_prt: null, + match_type: null, + appsflyer_id: '1547985076649-5309999', + dma: 'None', + http_referrer: null, + af_sub5: null, + af_prt: null, + event_revenue_currency: 'USD', + store_reinstall: null, + install_app_store: null, + media_source: 'organic', + deeplink_url: null, + campaign: null, + af_keywords: null, + region: 'AS', + cost_in_selected_currency: null, + event_value: '{}', + ip: '1.1.1.1', + oaid: null, + event_time: '2020-01-15 14:57:24.898', + is_receipt_validated: null, + contributor_1_campaign: null, + af_sub4: null, + imei: null, + contributor_3_campaign: null, + event_revenue_usd: null, + af_sub2: null, + original_url: null, + contributor_2_campaign: null, + android_id: null, + contributor_3_media_source: null, + af_adset: null, + af_ad: null, + state: '57', + network_account_id: null, + idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', + retargeting_conversion_type: null, + af_channel: null, + af_cost_currency: null, + contributor_1_media_source: null, + keyword_id: null, + device_download_time: '2019-01-20 04:51:16.000', + contributor_1_touch_type: null, + af_reengagement_window: null, + af_siteid: null, + language: 'en-US', + app_id: 'id1217828636', + contributor_1_touch_time: null, + event_revenue: null, + af_ad_type: null, + carrier: null, + event_name: 'My Apps', + af_sub_siteid: null, + advertising_id: null, + os_version: '12.3.1', + platform: 'ipados', + af_sub3: null, + contributor_3_match_type: null, + selected_timezone: 'UTC', + af_ad_id: null, + contributor_3_touch_time: null, + user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', + is_primary_attribution: true, + sdk_version: 'v4.10.0', + event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + }), + }, + source: {}, }, ], method: 'POST', @@ -1655,10 +1768,19 @@ export const data = [ network: { wifi: true }, os: { name: 'ipados', version: '12.3.1' }, traits: { - address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' }, + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, userId: 'hi.from@appsflyer.example.com', }, - externalId: [{ type: 'appsflyerExternalId', value: '1547985076649-5309999' }], + externalId: [ + { + type: 'appsflyerExternalId', + value: '1547985076649-5309999', + }, + ], }, integrations: { AF: false }, properties: { @@ -1762,7 +1884,13 @@ export const data = [ timestamp: '2020-01-15 14:57:24.898', originalTimestamp: '2020-01-15 14:57:24.898', platform: 'ipados', - traits: { address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' } }, + traits: { + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], @@ -1776,122 +1904,127 @@ export const data = [ name: 'appsflyer', description: 'test-7', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', - device_category: 'phone', - af_sub1: null, - customer_user_id: 'hi.from@appsflyer.example.com', - is_lat: null, - contributor_2_af_prt: null, - bundle_id: 'com.appsflyer.AppsFlyer', - gp_broadcast_referrer: '', - contributor_2_touch_time: null, - contributor_3_touch_type: null, - event_source: 'SDK', - af_cost_value: null, - contributor_1_match_type: null, - app_version: '1.4.1', - contributor_3_af_prt: null, - custom_data: null, - contributor_2_touch_type: null, - gp_install_begin: null, - city: 'Khu Pho Binh Hoa', - amazon_aid: null, - gp_referrer: null, - af_cost_model: null, - af_c_id: null, - attributed_touch_time_selected_timezone: null, - selected_currency: 'USD', - app_name: 'AppsFlyer', - install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - postal_code: '823941', - wifi: true, - install_time: '2019-01-20 04:51:16.000', - operator: null, - attributed_touch_type: null, - af_attribution_lookback: null, - campaign_type: null, - keyword_match_type: null, - af_adset_id: null, - device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', - contributor_2_media_source: null, - conversion_type: null, - contributor_2_match_type: null, - api_version: '2.0', - attributed_touch_time: null, - revenue_in_selected_currency: null, - is_retargeting: false, - country_code: 'VN', - gp_click_time: null, - contributor_1_af_prt: null, - match_type: null, - appsflyer_id: '1547985076649-5309999', - dma: 'None', - http_referrer: null, - af_sub5: null, - af_prt: null, - event_revenue_currency: 'USD', - store_reinstall: null, - install_app_store: null, - media_source: 'organic', - deeplink_url: null, - campaign: null, - af_keywords: null, - region: 'AS', - cost_in_selected_currency: null, - event_value: '{}', - ip: '1.1.1.1', - oaid: null, - event_time: '2020-01-15 14:57:24.898', - is_receipt_validated: null, - contributor_1_campaign: null, - af_sub4: null, - imei: null, - contributor_3_campaign: null, - event_revenue_usd: null, - af_sub2: null, - original_url: null, - contributor_2_campaign: null, - android_id: null, - contributor_3_media_source: null, - af_adset: null, - af_ad: null, - state: '57', - network_account_id: null, - idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', - retargeting_conversion_type: null, - af_channel: null, - af_cost_currency: null, - contributor_1_media_source: null, - keyword_id: null, - device_download_time: '2019-01-20 04:51:16.000', - contributor_1_touch_type: null, - af_reengagement_window: null, - af_siteid: null, - language: 'en-US', - app_id: 'id1217828636', - contributor_1_touch_time: null, - event_revenue: null, - af_ad_type: null, - carrier: null, - event_name: 'My Apps', - af_sub_siteid: null, - advertising_id: null, - os_version: '12.3.1', - platform: 'tvos', - af_sub3: null, - contributor_3_match_type: null, - selected_timezone: 'UTC', - af_ad_id: null, - contributor_3_touch_time: null, - user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', - is_primary_attribution: true, - sdk_version: 'v4.10.0', - event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + request: { + body: JSON.stringify({ + idfv: '868049A3-4B2F-4A11-9B00-CFFC362XXXXX', + device_category: 'phone', + af_sub1: null, + customer_user_id: 'hi.from@appsflyer.example.com', + is_lat: null, + contributor_2_af_prt: null, + bundle_id: 'com.appsflyer.AppsFlyer', + gp_broadcast_referrer: '', + contributor_2_touch_time: null, + contributor_3_touch_type: null, + event_source: 'SDK', + af_cost_value: null, + contributor_1_match_type: null, + app_version: '1.4.1', + contributor_3_af_prt: null, + custom_data: null, + contributor_2_touch_type: null, + gp_install_begin: null, + city: 'Khu Pho Binh Hoa', + amazon_aid: null, + gp_referrer: null, + af_cost_model: null, + af_c_id: null, + attributed_touch_time_selected_timezone: null, + selected_currency: 'USD', + app_name: 'AppsFlyer', + install_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + postal_code: '823941', + wifi: true, + install_time: '2019-01-20 04:51:16.000', + operator: null, + attributed_touch_type: null, + af_attribution_lookback: null, + campaign_type: null, + keyword_match_type: null, + af_adset_id: null, + device_download_time_selected_timezone: '2019-01-20 04:51:16.000+0000', + contributor_2_media_source: null, + conversion_type: null, + contributor_2_match_type: null, + api_version: '2.0', + attributed_touch_time: null, + revenue_in_selected_currency: null, + is_retargeting: false, + country_code: 'VN', + gp_click_time: null, + contributor_1_af_prt: null, + match_type: null, + appsflyer_id: '1547985076649-5309999', + dma: 'None', + http_referrer: null, + af_sub5: null, + af_prt: null, + event_revenue_currency: 'USD', + store_reinstall: null, + install_app_store: null, + media_source: 'organic', + deeplink_url: null, + campaign: null, + af_keywords: null, + region: 'AS', + cost_in_selected_currency: null, + event_value: '{}', + ip: '1.1.1.1', + oaid: null, + event_time: '2020-01-15 14:57:24.898', + is_receipt_validated: null, + contributor_1_campaign: null, + af_sub4: null, + imei: null, + contributor_3_campaign: null, + event_revenue_usd: null, + af_sub2: null, + original_url: null, + contributor_2_campaign: null, + android_id: null, + contributor_3_media_source: null, + af_adset: null, + af_ad: null, + state: '57', + network_account_id: null, + idfa: 'A7071198-3848-40A5-B3D0-94578D9BZZZZ', + retargeting_conversion_type: null, + af_channel: null, + af_cost_currency: null, + contributor_1_media_source: null, + keyword_id: null, + device_download_time: '2019-01-20 04:51:16.000', + contributor_1_touch_type: null, + af_reengagement_window: null, + af_siteid: null, + language: 'en-US', + app_id: 'id1217828636', + contributor_1_touch_time: null, + event_revenue: null, + af_ad_type: null, + carrier: null, + event_name: 'My Apps', + af_sub_siteid: null, + advertising_id: null, + os_version: '12.3.1', + platform: 'tvos', + af_sub3: null, + contributor_3_match_type: null, + selected_timezone: 'UTC', + af_ad_id: null, + contributor_3_touch_time: null, + user_agent: 'AppsFlyer/1 CFNetwork/978.0.7 Darwin/18.6.0', + is_primary_attribution: true, + sdk_version: 'v4.10.0', + event_time_selected_timezone: '2020-01-15 14:57:24.898+0000', + }), + }, + source: {}, }, ], method: 'POST', @@ -1925,10 +2058,19 @@ export const data = [ network: { wifi: true }, os: { name: 'tvos', version: '12.3.1' }, traits: { - address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' }, + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, userId: 'hi.from@appsflyer.example.com', }, - externalId: [{ type: 'appsflyerExternalId', value: '1547985076649-5309999' }], + externalId: [ + { + type: 'appsflyerExternalId', + value: '1547985076649-5309999', + }, + ], }, integrations: { AF: false }, properties: { @@ -2032,7 +2174,13 @@ export const data = [ timestamp: '2020-01-15 14:57:24.898', originalTimestamp: '2020-01-15 14:57:24.898', platform: 'tvos', - traits: { address: { city: 'Khu Pho Binh Hoa', zip: '823941', country: 'VN' } }, + traits: { + address: { + city: 'Khu Pho Binh Hoa', + zip: '823941', + country: 'VN', + }, + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], diff --git a/test/integrations/sources/auth0/data.ts b/test/integrations/sources/auth0/data.ts index b012887bc43..0772311d81a 100644 --- a/test/integrations/sources/auth0/data.ts +++ b/test/integrations/sources/auth0/data.ts @@ -9,240 +9,116 @@ export const data = [ name: 'auth0', description: 'successful signup', module: 'source', - version: 'v0', - + version: 'v2', input: { request: { body: [ { - log_id: '90020221031055712103169676686005480714681762668315934738', - data: { - date: '2022-10-31T05:57:06.859Z', - type: 'ss', - description: '', - connection: 'Username-Password-Authentication', - connection_id: 'con_djwCjiwyID0vZy1S', - client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', - client_name: 'All Applications', - ip: '35.166.202.113', - user_agent: 'unknown', - details: { - body: { - email: 'testRudderlabs+21@gmail.com', - tenant: 'dev-cu4jy2zgao6yx15x', - password: 'dummyPassword', - client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + request: { + body: JSON.stringify({ + log_id: '90020221031055712103169676686005480714681762668315934738', + data: { + date: '2022-10-31T05:57:06.859Z', + type: 'ss', + description: '', connection: 'Username-Password-Authentication', + connection_id: 'con_djwCjiwyID0vZy1S', + client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + client_name: 'All Applications', + ip: '35.166.202.113', + user_agent: 'unknown', + details: { + body: { + email: 'testRudderlabs+21@gmail.com', + tenant: 'dev-cu4jy2zgao6yx15x', + password: 'dummyPassword', + client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + connection: 'Username-Password-Authentication', + }, + }, + user_id: 'auth0|dummyPassword', + user_name: 'testRudderlabs+21@gmail.com', + strategy: 'auth0', + strategy_type: 'database', + log_id: '90020221031055712103169676686005480714681762668315934738', }, - }, - user_id: 'auth0|dummyPassword', - user_name: 'testRudderlabs+21@gmail.com', - strategy: 'auth0', - strategy_type: 'database', - log_id: '90020221031055712103169676686005480714681762668315934738', + }), }, + source: {}, }, { - log_id: '90020221031055712103169676686007898566320991926665347090', - data: { - date: '2022-10-31T05:57:06.874Z', - type: 'sapi', - description: 'Create a User', - client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', - client_name: '', - ip: '35.166.202.113', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', - details: { - request: { + request: { + body: JSON.stringify({ + log_id: '90020221031055712103169676686007898566320991926665347090', + data: { + date: '2022-10-31T05:57:06.874Z', + type: 'sapi', + description: 'Create a User', + client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + client_name: '', ip: '35.166.202.113', - auth: { - user: { - name: 'rudder test', - email: 'test@rudderstack.com', - user_id: 'auth0|dummyPassword', - }, - strategy: 'jwt', - credentials: { - jti: '571921bf7833a97efabf08d765a0ec8f', - scopes: [ - 'create:actions', - 'create:actions_log_sessions', - 'create:client_credentials', - 'create:client_grants', - 'create:clients', - 'create:connections', - 'create:custom_domains', - 'create:email_provider', - 'create:email_templates', - 'create:guardian_enrollment_tickets', - 'create:integrations', - 'create:log_streams', - 'create:organization_connections', - 'create:organization_invitations', - 'create:organization_member_roles', - 'create:organization_members', - 'create:organizations', - 'create:requested_scopes', - 'create:resource_servers', - 'create:roles', - 'create:rules', - 'create:shields', - 'create:signing_keys', - 'create:tenant_invitations', - 'create:test_email_dispatch', - 'create:users', - 'delete:actions', - 'delete:anomaly_blocks', - 'delete:branding', - 'delete:client_credentials', - 'delete:client_grants', - 'delete:clients', - 'delete:connections', - 'delete:custom_domains', - 'delete:device_credentials', - 'delete:email_provider', - 'delete:email_templates', - 'delete:grants', - 'delete:guardian_enrollments', - 'delete:integrations', - 'delete:log_streams', - 'delete:organization_connections', - 'delete:organization_invitations', - 'delete:organization_member_roles', - 'delete:organization_members', - 'delete:organizations', - 'delete:owners', - 'delete:requested_scopes', - 'delete:resource_servers', - 'delete:roles', - 'delete:rules', - 'delete:rules_configs', - 'delete:shields', - 'delete:tenant_invitations', - 'delete:tenant_members', - 'delete:tenants', - 'delete:users', - 'read:actions', - 'read:anomaly_blocks', - 'read:attack_protection', - 'read:branding', - 'read:checks', - 'read:client_credentials', - 'read:client_grants', - 'read:client_keys', - 'read:clients', - 'read:connections', - 'read:custom_domains', - 'read:device_credentials', - 'read:email_provider', - 'read:email_templates', - 'read:email_triggers', - 'read:entity_counts', - 'read:grants', - 'read:guardian_factors', - 'read:insights', - 'read:integrations', - 'read:log_streams', - 'read:logs', - 'read:mfa_policies', - 'read:organization_connections', - 'read:organization_invitations', - 'read:organization_member_roles', - 'read:organization_members', - 'read:organizations', - 'read:prompts', - 'read:requested_scopes', - 'read:resource_servers', - 'read:roles', - 'read:rules', - 'read:rules_configs', - 'read:shields', - 'read:signing_keys', - 'read:stats', - 'read:tenant_invitations', - 'read:tenant_members', - 'read:tenant_settings', - 'read:triggers', - 'read:users', - 'run:checks', - 'update:actions', - 'update:attack_protection', - 'update:branding', - 'update:client_credentials', - 'update:client_grants', - 'update:client_keys', - 'update:clients', - 'update:connections', - 'update:custom_domains', - 'update:email_provider', - 'update:email_templates', - 'update:email_triggers', - 'update:guardian_factors', - 'update:integrations', - 'update:log_streams', - 'update:mfa_policies', - 'update:organization_connections', - 'update:organizations', - 'update:prompts', - 'update:requested_scopes', - 'update:resource_servers', - 'update:roles', - 'update:rules', - 'update:rules_configs', - 'update:shields', - 'update:signing_keys', - 'update:tenant_members', - 'update:tenant_settings', - 'update:triggers', - 'update:users', - ], - }, - }, - body: { - email: 'testRudderlabs+21@gmail.com', - password: 'dummyPassword', - connection: 'Username-Password-Authentication', - }, - path: '/api/v2/users', - query: {}, - method: 'post', - channel: 'https://manage.auth0.com/', - userAgent: + user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', - }, - response: { - body: { - name: 'testRudderlabs+21@gmail.com', - email: 'testRudderlabs+21@gmail.com', - picture: - 'https://s.gravatar.com/avatar/0902f9d02b92aed9f0ac59aaf9475b60?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fbh.png', - user_id: 'auth0|dummyPassword', - nickname: 'testRudderlabs+21', - created_at: '2022-10-31T05:57:06.864Z', - identities: [ - { - user_id: 'auth0|dummyPassword', - isSocial: false, - provider: 'auth0', + details: { + request: { + ip: '35.166.202.113', + auth: { + user: { + name: 'rudder test', + email: 'test@rudderstack.com', + user_id: 'auth0|dummyPassword', + }, + strategy: 'jwt', + credentials: { + jti: '571921bf7833a97efabf08d765a0ec8f', + scopes: ['create:actions'], + }, + }, + body: { + email: 'testRudderlabs+21@gmail.com', + password: 'dummyPassword', connection: 'Username-Password-Authentication', }, - ], - updated_at: '2022-10-31T05:57:06.864Z', - email_verified: false, + path: '/api/v2/users', + query: {}, + method: 'post', + channel: 'https://manage.auth0.com/', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', + }, + response: { + body: { + name: 'testRudderlabs+21@gmail.com', + email: 'testRudderlabs+21@gmail.com', + picture: + 'https://s.gravatar.com/avatar/0902f9d02b92aed9f0ac59aaf9475b60?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fbh.png', + user_id: 'auth0|dummyPassword', + nickname: 'testRudderlabs+21', + created_at: '2022-10-31T05:57:06.864Z', + identities: [ + { + user_id: 'auth0|dummyPassword', + isSocial: false, + provider: 'auth0', + connection: 'Username-Password-Authentication', + }, + ], + updated_at: '2022-10-31T05:57:06.864Z', + email_verified: false, + }, + statusCode: 201, + }, }, - statusCode: 201, + user_id: 'auth0|dummyPassword', + log_id: '90020221031055712103169676686007898566320991926665347090', }, - }, - user_id: 'auth0|dummyPassword', - log_id: '90020221031055712103169676686007898566320991926665347090', + }), }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -267,15 +143,10 @@ export const data = [ userId: 'auth0|dummyPassword', user_name: 'testRudderlabs+21@gmail.com', }, - library: { - name: 'unknown', - version: 'unknown', - }, + library: { name: 'unknown', version: 'unknown' }, userAgent: 'unknown', request_ip: '35.166.202.113', - integration: { - name: 'Auth0', - }, + integration: { name: 'Auth0' }, }, properties: { log_id: '90020221031055712103169676686005480714681762668315934738', @@ -293,9 +164,7 @@ export const data = [ description: '', source_type: 'ss', }, - integrations: { - Auth0: false, - }, + integrations: { Auth0: false }, originalTimestamp: '2022-10-31T05:57:06.859Z', }, ], @@ -311,19 +180,12 @@ export const data = [ userId: 'auth0|dummyPassword', anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', context: { - library: { - name: 'unknown', - version: 'unknown', - }, - traits: { - userId: 'auth0|dummyPassword', - }, + library: { name: 'unknown', version: 'unknown' }, + traits: { userId: 'auth0|dummyPassword' }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', request_ip: '35.166.202.113', - integration: { - name: 'Auth0', - }, + integration: { name: 'Auth0' }, }, properties: { log_id: '90020221031055712103169676686007898566320991926665347090', @@ -339,138 +201,7 @@ export const data = [ strategy: 'jwt', credentials: { jti: '571921bf7833a97efabf08d765a0ec8f', - scopes: [ - 'create:actions', - 'create:actions_log_sessions', - 'create:client_credentials', - 'create:client_grants', - 'create:clients', - 'create:connections', - 'create:custom_domains', - 'create:email_provider', - 'create:email_templates', - 'create:guardian_enrollment_tickets', - 'create:integrations', - 'create:log_streams', - 'create:organization_connections', - 'create:organization_invitations', - 'create:organization_member_roles', - 'create:organization_members', - 'create:organizations', - 'create:requested_scopes', - 'create:resource_servers', - 'create:roles', - 'create:rules', - 'create:shields', - 'create:signing_keys', - 'create:tenant_invitations', - 'create:test_email_dispatch', - 'create:users', - 'delete:actions', - 'delete:anomaly_blocks', - 'delete:branding', - 'delete:client_credentials', - 'delete:client_grants', - 'delete:clients', - 'delete:connections', - 'delete:custom_domains', - 'delete:device_credentials', - 'delete:email_provider', - 'delete:email_templates', - 'delete:grants', - 'delete:guardian_enrollments', - 'delete:integrations', - 'delete:log_streams', - 'delete:organization_connections', - 'delete:organization_invitations', - 'delete:organization_member_roles', - 'delete:organization_members', - 'delete:organizations', - 'delete:owners', - 'delete:requested_scopes', - 'delete:resource_servers', - 'delete:roles', - 'delete:rules', - 'delete:rules_configs', - 'delete:shields', - 'delete:tenant_invitations', - 'delete:tenant_members', - 'delete:tenants', - 'delete:users', - 'read:actions', - 'read:anomaly_blocks', - 'read:attack_protection', - 'read:branding', - 'read:checks', - 'read:client_credentials', - 'read:client_grants', - 'read:client_keys', - 'read:clients', - 'read:connections', - 'read:custom_domains', - 'read:device_credentials', - 'read:email_provider', - 'read:email_templates', - 'read:email_triggers', - 'read:entity_counts', - 'read:grants', - 'read:guardian_factors', - 'read:insights', - 'read:integrations', - 'read:log_streams', - 'read:logs', - 'read:mfa_policies', - 'read:organization_connections', - 'read:organization_invitations', - 'read:organization_member_roles', - 'read:organization_members', - 'read:organizations', - 'read:prompts', - 'read:requested_scopes', - 'read:resource_servers', - 'read:roles', - 'read:rules', - 'read:rules_configs', - 'read:shields', - 'read:signing_keys', - 'read:stats', - 'read:tenant_invitations', - 'read:tenant_members', - 'read:tenant_settings', - 'read:triggers', - 'read:users', - 'run:checks', - 'update:actions', - 'update:attack_protection', - 'update:branding', - 'update:client_credentials', - 'update:client_grants', - 'update:client_keys', - 'update:clients', - 'update:connections', - 'update:custom_domains', - 'update:email_provider', - 'update:email_templates', - 'update:email_triggers', - 'update:guardian_factors', - 'update:integrations', - 'update:log_streams', - 'update:mfa_policies', - 'update:organization_connections', - 'update:organizations', - 'update:prompts', - 'update:requested_scopes', - 'update:resource_servers', - 'update:roles', - 'update:rules', - 'update:rules_configs', - 'update:shields', - 'update:signing_keys', - 'update:tenant_members', - 'update:tenant_settings', - 'update:triggers', - 'update:users', - ], + scopes: ['create:actions'], }, }, body: { @@ -513,9 +244,7 @@ export const data = [ description: 'Create a User', source_type: 'sapi', }, - integrations: { - Auth0: false, - }, + integrations: { Auth0: false }, originalTimestamp: '2022-10-31T05:57:06.874Z', }, ], @@ -524,68 +253,60 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'auth0', description: 'add member to an organization', module: 'source', - version: 'v0', - + version: 'v2', input: { request: { body: [ { - log_id: '90020221031061004280169676882609459981150114445973782546', - data: { - date: '2022-10-31T06:09:59.135Z', - type: 'sapi', - description: 'Add members to an organization', - client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', - client_name: '', - ip: '35.167.74.121', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', - details: { - request: { + request: { + body: JSON.stringify({ + log_id: '90020221031061004280169676882609459981150114445973782546', + data: { + date: '2022-10-31T06:09:59.135Z', + type: 'sapi', + description: 'Add members to an organization', + client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + client_name: '', ip: '35.167.74.121', - auth: { - user: { - name: 'rudder test', - email: 'test@rudderstack.com', - user_id: 'google-oauth2|123456', - }, - strategy: 'jwt', - credentials: { - jti: '571921bf7833a97efabf08d765a0ec8f', - }, - }, - body: { - members: ['auth0|123456'], - }, - path: '/api/v2/organizations/org_eoe8p2atZ7furBxg/members', - query: {}, - method: 'post', - channel: 'https://manage.auth0.com/', - userAgent: + user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', + details: { + request: { + ip: '35.167.74.121', + auth: { + user: { + name: 'rudder test', + email: 'test@rudderstack.com', + user_id: 'google-oauth2|123456', + }, + strategy: 'jwt', + credentials: { jti: '571921bf7833a97efabf08d765a0ec8f' }, + }, + body: { members: ['auth0|123456'] }, + path: '/api/v2/organizations/org_eoe8p2atZ7furBxg/members', + query: {}, + method: 'post', + channel: 'https://manage.auth0.com/', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', + }, + response: { body: {}, statusCode: 204 }, + }, + user_id: 'google-oauth2|123456', + log_id: '90020221031061004280169676882609459981150114445973782546', }, - response: { - body: {}, - statusCode: 204, - }, - }, - user_id: 'google-oauth2|123456', - log_id: '90020221031061004280169676882609459981150114445973782546', + }), }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -602,19 +323,12 @@ export const data = [ userId: 'google-oauth2|123456', anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', context: { - library: { - name: 'unknown', - version: 'unknown', - }, - traits: { - userId: 'google-oauth2|123456', - }, + library: { name: 'unknown', version: 'unknown' }, + traits: { userId: 'google-oauth2|123456' }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', request_ip: '35.167.74.121', - integration: { - name: 'Auth0', - }, + integration: { name: 'Auth0' }, }, groupId: 'org_eoe8p2atZ7furBxg', properties: { @@ -629,13 +343,9 @@ export const data = [ user_id: 'google-oauth2|123456', }, strategy: 'jwt', - credentials: { - jti: '571921bf7833a97efabf08d765a0ec8f', - }, - }, - body: { - members: ['auth0|123456'], + credentials: { jti: '571921bf7833a97efabf08d765a0ec8f' }, }, + body: { members: ['auth0|123456'] }, path: '/api/v2/organizations/org_eoe8p2atZ7furBxg/members', query: {}, method: 'post', @@ -643,19 +353,14 @@ export const data = [ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', }, - response: { - body: {}, - statusCode: 204, - }, + response: { body: {}, statusCode: 204 }, }, client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', client_name: '', description: 'Add members to an organization', source_type: 'sapi', }, - integrations: { - Auth0: false, - }, + integrations: { Auth0: false }, originalTimestamp: '2022-10-31T06:09:59.135Z', }, ], @@ -664,272 +369,132 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'auth0', description: 'update tenant settings', module: 'source', - version: 'v0', - + version: 'v2', input: { request: { body: [ { - log_id: '90020221031061527239169676960191065529099349299958906898', - data: { - date: '2022-10-31T06:15:25.201Z', - type: 'sapi', - description: 'Update tenant settings', - client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', - client_name: '', - ip: '35.160.3.103', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', - details: { - request: { + request: { + body: JSON.stringify({ + log_id: '90020221031061527239169676960191065529099349299958906898', + data: { + date: '2022-10-31T06:15:25.201Z', + type: 'sapi', + description: 'Update tenant settings', + client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + client_name: '', ip: '35.160.3.103', - auth: { - user: { - name: 'rudder test', - email: 'test@rudderstack.com', - user_id: 'google-oauth2|123456', - }, - strategy: 'jwt', - credentials: { - jti: '571921bf7833a97efabf08d765a0ec8f', - scopes: [ - 'create:actions', - 'create:actions_log_sessions', - 'create:client_credentials', - 'create:client_grants', - 'create:clients', - 'create:connections', - 'create:custom_domains', - 'create:email_provider', - 'create:email_templates', - 'create:guardian_enrollment_tickets', - 'create:integrations', - 'create:log_streams', - 'create:organization_connections', - 'create:organization_invitations', - 'create:organization_member_roles', - 'create:organization_members', - 'create:organizations', - 'create:requested_scopes', - 'create:resource_servers', - 'create:roles', - 'create:rules', - 'create:shields', - 'create:signing_keys', - 'create:tenant_invitations', - 'create:test_email_dispatch', - 'create:users', - 'delete:actions', - 'delete:anomaly_blocks', - 'delete:branding', - 'delete:client_credentials', - 'delete:client_grants', - 'delete:clients', - 'delete:connections', - 'delete:custom_domains', - 'delete:device_credentials', - 'delete:email_provider', - 'delete:email_templates', - 'delete:grants', - 'delete:guardian_enrollments', - 'delete:integrations', - 'delete:log_streams', - 'delete:organization_connections', - 'delete:organization_invitations', - 'delete:organization_member_roles', - 'delete:organization_members', - 'delete:organizations', - 'delete:owners', - 'delete:requested_scopes', - 'delete:resource_servers', - 'delete:roles', - 'delete:rules', - 'delete:rules_configs', - 'delete:shields', - 'delete:tenant_invitations', - 'delete:tenant_members', - 'delete:tenants', - 'delete:users', - 'read:actions', - 'read:anomaly_blocks', - 'read:attack_protection', - 'read:branding', - 'read:checks', - 'read:client_credentials', - 'read:client_grants', - 'read:client_keys', - 'read:clients', - 'read:connections', - 'read:custom_domains', - 'read:device_credentials', - 'read:email_provider', - 'read:email_templates', - 'read:email_triggers', - 'read:entity_counts', - 'read:grants', - 'read:guardian_factors', - 'read:insights', - 'read:integrations', - 'read:log_streams', - 'read:logs', - 'read:mfa_policies', - 'read:organization_connections', - 'read:organization_invitations', - 'read:organization_member_roles', - 'read:organization_members', - 'read:organizations', - 'read:prompts', - 'read:requested_scopes', - 'read:resource_servers', - 'read:roles', - 'read:rules', - 'read:rules_configs', - 'read:shields', - 'read:signing_keys', - 'read:stats', - 'read:tenant_invitations', - 'read:tenant_members', - 'read:tenant_settings', - 'read:triggers', - 'read:users', - 'run:checks', - 'update:actions', - 'update:attack_protection', - 'update:branding', - 'update:client_credentials', - 'update:client_grants', - 'update:client_keys', - 'update:clients', - 'update:connections', - 'update:custom_domains', - 'update:email_provider', - 'update:email_templates', - 'update:email_triggers', - 'update:guardian_factors', - 'update:integrations', - 'update:log_streams', - 'update:mfa_policies', - 'update:organization_connections', - 'update:organizations', - 'update:prompts', - 'update:requested_scopes', - 'update:resource_servers', - 'update:roles', - 'update:rules', - 'update:rules_configs', - 'update:shields', - 'update:signing_keys', - 'update:tenant_members', - 'update:tenant_settings', - 'update:triggers', - 'update:users', - ], - }, - }, - body: { - picture_url: '', - support_url: '', - friendly_name: 'mecro-action', - support_email: 'support@test.com', - }, - path: '/api/v2/tenants/settings', - query: {}, - method: 'patch', - channel: 'https://manage.auth0.com/', - userAgent: + user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', - }, - response: { - body: { - flags: { - enable_sso: true, - universal_login: true, - disable_impersonation: true, - allow_changing_enable_sso: false, - revoke_refresh_token_grant: false, - disable_clickjack_protection_headers: false, - new_universal_login_experience_enabled: true, - enforce_client_authentication_on_passwordless_start: true, - cannot_change_enforce_client_authentication_on_passwordless_start: true, + details: { + request: { + ip: '35.160.3.103', + auth: { + user: { + name: 'rudder test', + email: 'test@rudderstack.com', + user_id: 'google-oauth2|123456', + }, + strategy: 'jwt', + credentials: { + jti: '571921bf7833a97efabf08d765a0ec8f', + scopes: ['create:actions'], + }, + }, + body: { + picture_url: '', + support_url: '', + friendly_name: 'mecro-action', + support_email: 'support@test.com', + }, + path: '/api/v2/tenants/settings', + query: {}, + method: 'patch', + channel: 'https://manage.auth0.com/', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', + }, + response: { + body: { + flags: { + enable_sso: true, + universal_login: true, + disable_impersonation: true, + allow_changing_enable_sso: false, + revoke_refresh_token_grant: false, + disable_clickjack_protection_headers: false, + new_universal_login_experience_enabled: true, + enforce_client_authentication_on_passwordless_start: true, + cannot_change_enforce_client_authentication_on_passwordless_start: true, + }, + picture_url: '', + support_url: '', + friendly_name: 'mecro-action', + support_email: 'support@test.com', + enabled_locales: ['en'], + sandbox_version: '16', + universal_login: {}, + }, + statusCode: 200, }, - picture_url: '', - support_url: '', - friendly_name: 'mecro-action', - support_email: 'support@test.com', - enabled_locales: ['en'], - sandbox_version: '16', - universal_login: {}, }, - statusCode: 200, + user_id: 'google-oauth2|123456', + log_id: '90020221031061527239169676960191065529099349299958906898', }, - }, - user_id: 'google-oauth2|123456', - log_id: '90020221031061527239169676960191065529099349299958906898', + }), }, + source: {}, }, { - log_id: '90020221031061530247169676961198100736838335677367058450', - data: { - date: '2022-10-31T06:15:25.196Z', - type: 'gd_tenant_update', - description: 'Guardian - Updates tenant settings', - ip: '35.160.3.103', - details: { - request: { + request: { + body: JSON.stringify({ + log_id: '90020221031061530247169676961198100736838335677367058450', + data: { + date: '2022-10-31T06:15:25.196Z', + type: 'gd_tenant_update', + description: 'Guardian - Updates tenant settings', ip: '35.160.3.103', - auth: { - scopes: [ - 'read:authenticators', - 'remove:authenticators', - 'update:authenticators', - 'create:authenticators', - 'read:enrollments', - 'delete:enrollments', - 'read:factors', - 'update:factors', - 'update:tenant_settings', - 'update:users', - 'create:enrollment_tickets', - 'create:users', - ], - subject: 'google-oauth2|123456', - strategy: 'jwt_api2_internal_token', - }, - body: { - picture_url: '[REDACTED]', - friendly_name: '[REDACTED]', - }, - path: '/api/tenants/settings', - query: {}, - method: 'PATCH', - }, - response: { - body: { - name: 'dev-cu4jy2zgao6yx15x', - picture_url: '[REDACTED]', - friendly_name: '[REDACTED]', - guardian_mfa_page: '[REDACTED]', + details: { + request: { + ip: '35.160.3.103', + auth: { + scopes: ['read:authenticators'], + subject: 'google-oauth2|123456', + strategy: 'jwt_api2_internal_token', + }, + body: { + picture_url: '[REDACTED]', + friendly_name: '[REDACTED]', + }, + path: '/api/tenants/settings', + query: {}, + method: 'PATCH', + }, + response: { + body: { + name: 'dev-cu4jy2zgao6yx15x', + picture_url: '[REDACTED]', + friendly_name: '[REDACTED]', + guardian_mfa_page: '[REDACTED]', + }, + statusCode: 200, + }, }, - statusCode: 200, + user_id: 'google-oauth2|123456', + log_id: '90020221031061530247169676961198100736838335677367058450', }, - }, - user_id: 'google-oauth2|123456', - log_id: '90020221031061530247169676961198100736838335677367058450', + }), }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -947,19 +512,12 @@ export const data = [ userId: 'google-oauth2|123456', anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', context: { - library: { - name: 'unknown', - version: 'unknown', - }, - traits: { - userId: 'google-oauth2|123456', - }, + library: { name: 'unknown', version: 'unknown' }, + traits: { userId: 'google-oauth2|123456' }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', request_ip: '35.160.3.103', - integration: { - name: 'Auth0', - }, + integration: { name: 'Auth0' }, }, properties: { log_id: '90020221031061527239169676960191065529099349299958906898', @@ -975,138 +533,7 @@ export const data = [ strategy: 'jwt', credentials: { jti: '571921bf7833a97efabf08d765a0ec8f', - scopes: [ - 'create:actions', - 'create:actions_log_sessions', - 'create:client_credentials', - 'create:client_grants', - 'create:clients', - 'create:connections', - 'create:custom_domains', - 'create:email_provider', - 'create:email_templates', - 'create:guardian_enrollment_tickets', - 'create:integrations', - 'create:log_streams', - 'create:organization_connections', - 'create:organization_invitations', - 'create:organization_member_roles', - 'create:organization_members', - 'create:organizations', - 'create:requested_scopes', - 'create:resource_servers', - 'create:roles', - 'create:rules', - 'create:shields', - 'create:signing_keys', - 'create:tenant_invitations', - 'create:test_email_dispatch', - 'create:users', - 'delete:actions', - 'delete:anomaly_blocks', - 'delete:branding', - 'delete:client_credentials', - 'delete:client_grants', - 'delete:clients', - 'delete:connections', - 'delete:custom_domains', - 'delete:device_credentials', - 'delete:email_provider', - 'delete:email_templates', - 'delete:grants', - 'delete:guardian_enrollments', - 'delete:integrations', - 'delete:log_streams', - 'delete:organization_connections', - 'delete:organization_invitations', - 'delete:organization_member_roles', - 'delete:organization_members', - 'delete:organizations', - 'delete:owners', - 'delete:requested_scopes', - 'delete:resource_servers', - 'delete:roles', - 'delete:rules', - 'delete:rules_configs', - 'delete:shields', - 'delete:tenant_invitations', - 'delete:tenant_members', - 'delete:tenants', - 'delete:users', - 'read:actions', - 'read:anomaly_blocks', - 'read:attack_protection', - 'read:branding', - 'read:checks', - 'read:client_credentials', - 'read:client_grants', - 'read:client_keys', - 'read:clients', - 'read:connections', - 'read:custom_domains', - 'read:device_credentials', - 'read:email_provider', - 'read:email_templates', - 'read:email_triggers', - 'read:entity_counts', - 'read:grants', - 'read:guardian_factors', - 'read:insights', - 'read:integrations', - 'read:log_streams', - 'read:logs', - 'read:mfa_policies', - 'read:organization_connections', - 'read:organization_invitations', - 'read:organization_member_roles', - 'read:organization_members', - 'read:organizations', - 'read:prompts', - 'read:requested_scopes', - 'read:resource_servers', - 'read:roles', - 'read:rules', - 'read:rules_configs', - 'read:shields', - 'read:signing_keys', - 'read:stats', - 'read:tenant_invitations', - 'read:tenant_members', - 'read:tenant_settings', - 'read:triggers', - 'read:users', - 'run:checks', - 'update:actions', - 'update:attack_protection', - 'update:branding', - 'update:client_credentials', - 'update:client_grants', - 'update:client_keys', - 'update:clients', - 'update:connections', - 'update:custom_domains', - 'update:email_provider', - 'update:email_templates', - 'update:email_triggers', - 'update:guardian_factors', - 'update:integrations', - 'update:log_streams', - 'update:mfa_policies', - 'update:organization_connections', - 'update:organizations', - 'update:prompts', - 'update:requested_scopes', - 'update:resource_servers', - 'update:roles', - 'update:rules', - 'update:rules_configs', - 'update:shields', - 'update:signing_keys', - 'update:tenant_members', - 'update:tenant_settings', - 'update:triggers', - 'update:users', - ], + scopes: ['create:actions'], }, }, body: { @@ -1151,9 +578,7 @@ export const data = [ description: 'Update tenant settings', source_type: 'sapi', }, - integrations: { - Auth0: false, - }, + integrations: { Auth0: false }, originalTimestamp: '2022-10-31T06:15:25.201Z', }, ], @@ -1169,17 +594,10 @@ export const data = [ userId: 'google-oauth2|123456', anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', context: { - library: { - name: 'unknown', - version: 'unknown', - }, - traits: { - userId: 'google-oauth2|123456', - }, + library: { name: 'unknown', version: 'unknown' }, + traits: { userId: 'google-oauth2|123456' }, request_ip: '35.160.3.103', - integration: { - name: 'Auth0', - }, + integration: { name: 'Auth0' }, }, properties: { log_id: '90020221031061530247169676961198100736838335677367058450', @@ -1187,20 +605,7 @@ export const data = [ request: { ip: '35.160.3.103', auth: { - scopes: [ - 'read:authenticators', - 'remove:authenticators', - 'update:authenticators', - 'create:authenticators', - 'read:enrollments', - 'delete:enrollments', - 'read:factors', - 'update:factors', - 'update:tenant_settings', - 'update:users', - 'create:enrollment_tickets', - 'create:users', - ], + scopes: ['read:authenticators'], subject: 'google-oauth2|123456', strategy: 'jwt_api2_internal_token', }, @@ -1225,9 +630,7 @@ export const data = [ description: 'Guardian - Updates tenant settings', source_type: 'gd_tenant_update', }, - integrations: { - Auth0: false, - }, + integrations: { Auth0: false }, originalTimestamp: '2022-10-31T06:15:25.196Z', }, ], @@ -1236,52 +639,51 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'auth0', description: 'missing userId', module: 'source', - version: 'v0', - + version: 'v2', input: { request: { body: [ { - log_id: '90020221031055712103169676686005480714681762668315934738', - data: { - date: '2022-10-31T05:57:06.859Z', - type: 'ss', - description: '', - connection: 'Username-Password-Authentication', - connection_id: 'con_djwCjiwyID0vZy1S', - client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', - client_name: 'All Applications', - ip: '35.166.202.113', - user_agent: 'unknown', - details: { - body: { - email: 'testRudderlabs+21@gmail.com', - tenant: 'dev-cu4jy2zgao6yx15x', - password: 'dummyPassword', - client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + request: { + body: JSON.stringify({ + log_id: '90020221031055712103169676686005480714681762668315934738', + data: { + date: '2022-10-31T05:57:06.859Z', + type: 'ss', + description: '', connection: 'Username-Password-Authentication', + connection_id: 'con_djwCjiwyID0vZy1S', + client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + client_name: 'All Applications', + ip: '35.166.202.113', + user_agent: 'unknown', + details: { + body: { + email: 'testRudderlabs+21@gmail.com', + tenant: 'dev-cu4jy2zgao6yx15x', + password: 'dummyPassword', + client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + connection: 'Username-Password-Authentication', + }, + }, + user_id: '', + user_name: 'testRudderlabs+21@gmail.com', + strategy: 'auth0', + strategy_type: 'database', + log_id: '90020221031055712103169676686005480714681762668315934738', }, - }, - user_id: '', - user_name: 'testRudderlabs+21@gmail.com', - strategy: 'auth0', - strategy_type: 'database', - log_id: '90020221031055712103169676686005480714681762668315934738', + }), }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -1306,15 +708,10 @@ export const data = [ userId: '', user_name: 'testRudderlabs+21@gmail.com', }, - library: { - name: 'unknown', - version: 'unknown', - }, + library: { name: 'unknown', version: 'unknown' }, userAgent: 'unknown', request_ip: '35.166.202.113', - integration: { - name: 'Auth0', - }, + integration: { name: 'Auth0' }, }, properties: { log_id: '90020221031055712103169676686005480714681762668315934738', @@ -1332,9 +729,7 @@ export const data = [ description: '', source_type: 'ss', }, - integrations: { - Auth0: false, - }, + integrations: { Auth0: false }, originalTimestamp: '2022-10-31T05:57:06.859Z', }, ], @@ -1343,66 +738,70 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'auth0', description: 'missing userId for all the requests in a batch', module: 'source', - version: 'v0', - + version: 'v2', input: { request: { body: [ { - log_id: '90020221031055712103169676686005480714681762668315934738', - data: { - date: '2022-10-31T05:57:06.859Z', - type: 'ss', - description: '', - connection: 'Username-Password-Authentication', - connection_id: 'con_djwCjiwyID0vZy1S', - client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', - client_name: 'All Applications', - ip: '35.166.202.113', - user_agent: 'unknown', - details: { - body: { - email: 'testRudderlabs+21@gmail.com', - tenant: 'dev-cu4jy2zgao6yx15x', - password: 'dummyPassword', - client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + request: { + body: JSON.stringify({ + log_id: '90020221031055712103169676686005480714681762668315934738', + data: { + date: '2022-10-31T05:57:06.859Z', + type: 'ss', + description: '', connection: 'Username-Password-Authentication', + connection_id: 'con_djwCjiwyID0vZy1S', + client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + client_name: 'All Applications', + ip: '35.166.202.113', + user_agent: 'unknown', + details: { + body: { + email: 'testRudderlabs+21@gmail.com', + tenant: 'dev-cu4jy2zgao6yx15x', + password: 'dummyPassword', + client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + connection: 'Username-Password-Authentication', + }, + }, + user_id: '', + user_name: 'testRudderlabs+21@gmail.com', + strategy: 'auth0', + strategy_type: 'database', + log_id: '90020221031055712103169676686005480714681762668315934738', }, - }, - user_id: '', - user_name: 'testRudderlabs+21@gmail.com', - strategy: 'auth0', - strategy_type: 'database', - log_id: '90020221031055712103169676686005480714681762668315934738', + }), }, + source: {}, }, { - log_id: '90020221031055712103169676686007898566320991926665347090', - data: { - date: '2022-10-31T05:57:06.874Z', - type: 'sapi', - description: 'Create a User', - client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', - client_name: '', - ip: '35.166.202.113', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', - log_id: '90020221031055712103169676686007898566320991926665347090', + request: { + body: JSON.stringify({ + log_id: '90020221031055712103169676686007898566320991926665347090', + data: { + date: '2022-10-31T05:57:06.874Z', + type: 'sapi', + description: 'Create a User', + client_id: 'vQcJNDTxsM1W72eHFonRJdzyOvawlwIt', + client_name: '', + ip: '35.166.202.113', + user_agent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', + log_id: '90020221031055712103169676686007898566320991926665347090', + }, + }), }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -1427,15 +826,10 @@ export const data = [ userId: '', user_name: 'testRudderlabs+21@gmail.com', }, - library: { - name: 'unknown', - version: 'unknown', - }, + library: { name: 'unknown', version: 'unknown' }, userAgent: 'unknown', request_ip: '35.166.202.113', - integration: { - name: 'Auth0', - }, + integration: { name: 'Auth0' }, }, properties: { log_id: '90020221031055712103169676686005480714681762668315934738', @@ -1453,9 +847,7 @@ export const data = [ description: '', source_type: 'ss', }, - integrations: { - Auth0: false, - }, + integrations: { Auth0: false }, originalTimestamp: '2022-10-31T05:57:06.859Z', }, ], @@ -1470,16 +862,11 @@ export const data = [ sentAt: '2022-10-31T05:57:06.874Z', anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', context: { - library: { - name: 'unknown', - version: 'unknown', - }, + library: { name: 'unknown', version: 'unknown' }, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36', request_ip: '35.166.202.113', - integration: { - name: 'Auth0', - }, + integration: { name: 'Auth0' }, }, properties: { log_id: '90020221031055712103169676686007898566320991926665347090', @@ -1488,9 +875,7 @@ export const data = [ description: 'Create a User', source_type: 'sapi', }, - integrations: { - Auth0: false, - }, + integrations: { Auth0: false }, originalTimestamp: '2022-10-31T05:57:06.874Z', }, ], @@ -1499,34 +884,26 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'auth0', description: 'empty batch', module: 'source', - version: 'v0', + version: 'v2', skipGo: 'Created this case manually', input: { request: { body: [], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, - output: { - response: { - status: 200, - body: [], - }, - }, - mockFns: () => { - defaultMockFns(); - }, + output: { response: { status: 200, body: [] } }, + }, +].map((tc) => ({ + ...tc, + mockFns: () => { + defaultMockFns(); }, -]; +})); diff --git a/test/integrations/sources/braze/data.ts b/test/integrations/sources/braze/data.ts index a4031e1bd04..d3642099aaa 100644 --- a/test/integrations/sources/braze/data.ts +++ b/test/integrations/sources/braze/data.ts @@ -10,25 +10,25 @@ export const data = [ name: 'braze', description: 'event mapping done in UI', module: 'source', - version: 'v1', + version: 'v2', skipGo: 'Custom source config', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.messages.inappmessage.Click', - properties: { - device_model: 'samsung', - }, - user: { - user_id: 'user_id', - external_user_id: 'externalUserId', + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.messages.inappmessage.Click', + properties: { device_model: 'samsung' }, + user: { + user_id: 'user_id', + external_user_id: 'externalUserId', + }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -48,9 +48,7 @@ export const data = [ }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -64,21 +62,12 @@ export const data = [ { anonymousId: 'user_id', context: { - device: { - model: 'samsung', - }, - integration: { - name: 'Braze', - }, - library: { - name: 'unknown', - version: 'unknown', - }, + device: { model: 'samsung' }, + integration: { name: 'Braze' }, + library: { name: 'unknown', version: 'unknown' }, }, event: 'In-App Message Clicked', - integrations: { - Braze: false, - }, + integrations: { Braze: false }, type: 'track', userId: 'externalUserId', }, @@ -93,25 +82,24 @@ export const data = [ name: 'braze', description: 'The event is not mapped in the UI', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.messages.inappmessage.Click', - properties: { - device_model: 'samsung', - }, - user: { - user_id: 'user_id', - external_user_id: 'externalUserId', + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.messages.inappmessage.Click', + properties: { device_model: 'samsung' }, + user: { + user_id: 'user_id', + external_user_id: 'externalUserId', + }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -119,21 +107,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -147,21 +128,12 @@ export const data = [ { anonymousId: 'user_id', context: { - device: { - model: 'samsung', - }, - integration: { - name: 'Braze', - }, - library: { - name: 'unknown', - version: 'unknown', - }, + device: { model: 'samsung' }, + integration: { name: 'Braze' }, + library: { name: 'unknown', version: 'unknown' }, }, event: 'users.messages.inappmessage.Click', - integrations: { - Braze: false, - }, + integrations: { Braze: false }, type: 'track', userId: 'externalUserId', }, @@ -176,37 +148,38 @@ export const data = [ name: 'braze', description: 'users.messages.inappmessage.Click event', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.messages.inappmessage.Click', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1607988752, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - device_id: 'fedcba87-6543-210f-edc-ba9876543210', - timezone: 'America/Chicago', - }, - properties: { - app_id: '01234567-89ab-cdef-0123-456789abcdef', - campaign_id: '11234567-89ab-cdef-0123-456789abcdef', - campaign_name: 'Test Campaign', - message_variation_id: 'c1234567-89ab-cdef-0123-456789abcdef', - platform: 'android', - os_version: 'Android (N)', - device_model: 'Nexus 5X', - button_id: '0', - send_id: 'f123456789abcdef01234567', + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.messages.inappmessage.Click', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1607988752, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + device_id: 'fedcba87-6543-210f-edc-ba9876543210', + timezone: 'America/Chicago', + }, + properties: { + app_id: '01234567-89ab-cdef-0123-456789abcdef', + campaign_id: '11234567-89ab-cdef-0123-456789abcdef', + campaign_name: 'Test Campaign', + message_variation_id: 'c1234567-89ab-cdef-0123-456789abcdef', + platform: 'android', + os_version: 'Android (N)', + device_model: 'Nexus 5X', + button_id: '0', + send_id: 'f123456789abcdef01234567', + }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -214,21 +187,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -277,35 +243,36 @@ export const data = [ name: 'braze', description: 'users.messages.pushnotification.Send event', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.messages.pushnotification.Send', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1477502783, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - device_id: 'fedcba87-6543-210f-edc-ba9876543210', - timezone: 'America/Chicago', - }, - properties: { - app_id: '01234567-89ab-cdef-0123-456789abcdef', - platform: 'ios', - campaign_id: '11234567-89ab-cdef-0123-456789abcdef', - campaign_name: 'Test Campaign', - message_variation_id: 'c1234567-89ab-cdef-0123-456789abcdef', - send_id: 'f123456789abcdef01234567', - dispatch_id: '01234567-89ab-cdef-0123-456789abcdef', + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.messages.pushnotification.Send', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1477502783, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + device_id: 'fedcba87-6543-210f-edc-ba9876543210', + timezone: 'America/Chicago', + }, + properties: { + app_id: '01234567-89ab-cdef-0123-456789abcdef', + platform: 'ios', + campaign_id: '11234567-89ab-cdef-0123-456789abcdef', + campaign_name: 'Test Campaign', + message_variation_id: 'c1234567-89ab-cdef-0123-456789abcdef', + send_id: 'f123456789abcdef01234567', + dispatch_id: '01234567-89ab-cdef-0123-456789abcdef', + }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -313,21 +280,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -373,35 +333,36 @@ export const data = [ name: 'braze', description: 'users.messages.email.Open event', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.messages.email.Open', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1477502783, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - timezone: 'America/Chicago', - }, - properties: { - campaign_id: '11234567-89ab-cdef-0123-456789abcdef', - campaign_name: 'Test Campaign', - dispatch_id: '12345qwert', - message_variation_id: 'c1234567-89ab-cdef-0123-456789abcdef', - email_address: 'test@test.com', - send_id: 'f123456789abcdef01234567', - user_agent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36', + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.messages.email.Open', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1477502783, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + timezone: 'America/Chicago', + }, + properties: { + campaign_id: '11234567-89ab-cdef-0123-456789abcdef', + campaign_name: 'Test Campaign', + dispatch_id: '12345qwert', + message_variation_id: 'c1234567-89ab-cdef-0123-456789abcdef', + email_address: 'test@test.com', + send_id: 'f123456789abcdef01234567', + user_agent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36', + }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -409,21 +370,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -469,34 +423,35 @@ export const data = [ name: 'braze', description: 'users.messages.sms.Delivery send', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.messages.sms.Delivery', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1477502783, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - timezone: 'America/Chicago', - }, - properties: { - campaign_id: '11234567-89ab-cdef-0123-456789abcdef', - campaign_name: 'Test Campaign', - dispatch_id: '12345qwert', - message_variation_id: 'c1234567-89ab-cdef-0123-456789abcdef', - to_phone_number: '+16462345678', - subscription_group_id: '41234567-89ab-cdef-0123-456789abcdef', - from_phone_number: '+12123470922', + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.messages.sms.Delivery', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1477502783, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + timezone: 'America/Chicago', + }, + properties: { + campaign_id: '11234567-89ab-cdef-0123-456789abcdef', + campaign_name: 'Test Campaign', + dispatch_id: '12345qwert', + message_variation_id: 'c1234567-89ab-cdef-0123-456789abcdef', + to_phone_number: '+16462345678', + subscription_group_id: '41234567-89ab-cdef-0123-456789abcdef', + from_phone_number: '+12123470922', + }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -504,21 +459,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -563,38 +511,39 @@ export const data = [ name: 'braze', description: 'users.messages.inappmessage.Click event', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.messages.inappmessage.Click', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1477502783, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - device_id: 'fedcba87-6543-210f-edc-ba9876543210', - timezone: 'America/Chicago', - }, - properties: { - app_id: '01234567-89ab-cdef-0123-456789abcdef', - canvas_id: '11234567-89ab-cdef-0123-456789abcdef', - canvas_name: 'My Cool Campaign', - canvas_variation_id: '31234567-89ab-cdef-0123-456789abcdef', - canvas_step_id: '41234567-89ab-cdef-0123-456789abcdef', - platform: 'android', - os_version: 'Android (N)', - device_model: 'Nexus 5X', - button_id: '0', - send_id: 'f123456789abcdef01234567', + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.messages.inappmessage.Click', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1477502783, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + device_id: 'fedcba87-6543-210f-edc-ba9876543210', + timezone: 'America/Chicago', + }, + properties: { + app_id: '01234567-89ab-cdef-0123-456789abcdef', + canvas_id: '11234567-89ab-cdef-0123-456789abcdef', + canvas_name: 'My Cool Campaign', + canvas_variation_id: '31234567-89ab-cdef-0123-456789abcdef', + canvas_step_id: '41234567-89ab-cdef-0123-456789abcdef', + platform: 'android', + os_version: 'Android (N)', + device_model: 'Nexus 5X', + button_id: '0', + send_id: 'f123456789abcdef01234567', + }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -602,21 +551,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -666,36 +608,37 @@ export const data = [ name: 'braze', description: 'users.messages.pushnotification.Send event', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.messages.pushnotification.Send', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1477502783, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - device_id: 'fedcba87-6543-210f-edc-ba9876543210', - timezone: 'America/Chicago', - }, - properties: { - app_id: '01234567-89ab-cdef-0123-456789abcdef', - platform: 'ios', - canvas_id: '11234567-89ab-cdef-0123-456789abcdef', - canvas_name: 'My Cool Campaign', - canvas_variation_id: '31234567-89ab-cdef-0123-456789abcdef', - canvas_step_id: '41234567-89ab-cdef-0123-456789abcdef', - send_id: 'f123456789abcdef01234567', - dispatch_id: '01234567-89ab-cdef-0123-456789abcdef', + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.messages.pushnotification.Send', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1477502783, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + device_id: 'fedcba87-6543-210f-edc-ba9876543210', + timezone: 'America/Chicago', + }, + properties: { + app_id: '01234567-89ab-cdef-0123-456789abcdef', + platform: 'ios', + canvas_id: '11234567-89ab-cdef-0123-456789abcdef', + canvas_name: 'My Cool Campaign', + canvas_variation_id: '31234567-89ab-cdef-0123-456789abcdef', + canvas_step_id: '41234567-89ab-cdef-0123-456789abcdef', + send_id: 'f123456789abcdef01234567', + dispatch_id: '01234567-89ab-cdef-0123-456789abcdef', + }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -703,21 +646,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -764,36 +700,37 @@ export const data = [ name: 'braze', description: 'users.messages.email.Open event', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.messages.email.Open', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1477502783, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - timezone: 'America/Chicago', - }, - properties: { - canvas_id: '11234567-89ab-cdef-0123-456789abcdef', - canvas_name: 'My Cool Canvas', - canvas_variation_id: '31234567-89ab-cdef-0123-456789abcdef', - canvas_step_id: '41234567-89ab-cdef-0123-456789abcdef', - dispatch_id: '12345qwert', - email_address: 'test@test.com', - send_id: 'f123456789abcdef01234567', - user_agent: - 'Mozilla/5.0(Macintosh;IntelMacOSX10_13_5)AppleWebKit/537.36(KHTML,likeGecko)Chrome/67.0.3396.99Safari/537.36', + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.messages.email.Open', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1477502783, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + timezone: 'America/Chicago', + }, + properties: { + canvas_id: '11234567-89ab-cdef-0123-456789abcdef', + canvas_name: 'My Cool Canvas', + canvas_variation_id: '31234567-89ab-cdef-0123-456789abcdef', + canvas_step_id: '41234567-89ab-cdef-0123-456789abcdef', + dispatch_id: '12345qwert', + email_address: 'test@test.com', + send_id: 'f123456789abcdef01234567', + user_agent: + 'Mozilla/5.0(Macintosh;IntelMacOSX10_13_5)AppleWebKit/537.36(KHTML,likeGecko)Chrome/67.0.3396.99Safari/537.36', + }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -801,21 +738,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -862,35 +792,36 @@ export const data = [ name: 'braze', description: 'users.messages.sms.Delivery event', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.messages.sms.Delivery', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1477502783, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - timezone: 'America/Chicago', - }, - properties: { - canvas_id: '11234567-89ab-cdef-0123-456789abcdef', - canvas_name: 'MyCoolCanvas', - canvas_variation_id: '31234567-89ab-cdef-0123-456789abcdef', - canvas_step_id: '41234567-89ab-cdef-0123-456789abcdef', - dispatch_id: '12345qwert', - to_phone_number: '+16462345678', - subscription_group_id: '41234567-89ab-cdef-0123-456789abcdef', - from_phone_number: '+12123470922', + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.messages.sms.Delivery', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1477502783, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + timezone: 'America/Chicago', + }, + properties: { + canvas_id: '11234567-89ab-cdef-0123-456789abcdef', + canvas_name: 'MyCoolCanvas', + canvas_variation_id: '31234567-89ab-cdef-0123-456789abcdef', + canvas_step_id: '41234567-89ab-cdef-0123-456789abcdef', + dispatch_id: '12345qwert', + to_phone_number: '+16462345678', + subscription_group_id: '41234567-89ab-cdef-0123-456789abcdef', + from_phone_number: '+12123470922', + }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -898,21 +829,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -958,41 +882,42 @@ export const data = [ name: 'braze', description: 'users.behaviors.CustomEvent any custom event', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.behaviors.CustomEvent', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1477502783, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - device_id: 'fedcba87-6543-210f-edc-ba9876543210', - timezone: 'America/Chicago', - }, - properties: { - app_id: '01234567-89ab-cdef-0123-456789abcdef', - platform: 'ios', - os_version: 'iOS10.3.1', - device_model: 'iPhone7Plus', - name: 'customeventname', - ad_id: '01234567-89ab-cdef-0123-456789abcdef', - ad_id_type: 'roku_ad_id', - ad_tracking_enabled: true, - custom_properties: { - stringpropertyname: 'a', - numberpropertyname: 1, - listpropertyname: ['a', 'b'], + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.behaviors.CustomEvent', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1477502783, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + device_id: 'fedcba87-6543-210f-edc-ba9876543210', + timezone: 'America/Chicago', + }, + properties: { + app_id: '01234567-89ab-cdef-0123-456789abcdef', + platform: 'ios', + os_version: 'iOS10.3.1', + device_model: 'iPhone7Plus', + name: 'customeventname', + ad_id: '01234567-89ab-cdef-0123-456789abcdef', + ad_id_type: 'roku_ad_id', + ad_tracking_enabled: true, + custom_properties: { + stringpropertyname: 'a', + numberpropertyname: 1, + listpropertyname: ['a', 'b'], + }, }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -1000,21 +925,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -1067,43 +985,44 @@ export const data = [ name: 'braze', description: 'users.behaviors.Purchase event', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ - { - event_type: 'users.behaviors.Purchase', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1477502783, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - device_id: 'fedcba87-6543-210f-edc-ba9876543210', - timezone: 'America/Chicago', - }, - properties: { - app_id: '01234567-89ab-cdef-0123-456789abcdef', - platform: 'ios', - os_version: 'iOS10.3.1', - device_model: 'iPhone7Plus', - product_id: '1234', - price: 12.34, - currency: 'AED', - ad_id: '01234567-89ab-cdef-0123-456789abcdef', - ad_id_type: 'roku_ad_id', - ad_tracking_enabled: true, - purchase_properties: { - stringpropertyname: 'a', - numberpropertyname: 1, - listpropertyname: ['a', 'b'], + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.behaviors.Purchase', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1477502783, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + device_id: 'fedcba87-6543-210f-edc-ba9876543210', + timezone: 'America/Chicago', + }, + properties: { + app_id: '01234567-89ab-cdef-0123-456789abcdef', + platform: 'ios', + os_version: 'iOS10.3.1', + device_model: 'iPhone7Plus', + product_id: '1234', + price: 12.34, + currency: 'AED', + ad_id: '01234567-89ab-cdef-0123-456789abcdef', + ad_id_type: 'roku_ad_id', + ad_tracking_enabled: true, + purchase_properties: { + stringpropertyname: 'a', + numberpropertyname: 1, + listpropertyname: ['a', 'b'], + }, }, }, - }, - ], + ], + }), }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', @@ -1111,21 +1030,14 @@ export const data = [ Name: 'Braze source', SourceDefinition: commonSourceDefinition, Config: { - customMapping: [ - { - from: 'randomEvent', - to: 'In-App Message Clicked', - }, - ], + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], }, ...commonSourceConfigProperties, }, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -1180,33 +1092,155 @@ export const data = [ name: 'braze', description: 'users.behaviors.app.SessionStart event', module: 'source', - version: 'v1', - + version: 'v2', input: { request: { body: [ { - event: { - events: [ + request: { + body: JSON.stringify({ + events: [ + { + event_type: 'users.behaviors.app.SessionStart', + id: 'a1234567-89ab-cdef-0123-456789abcdef', + time: 1477502783, + user: { + user_id: '0123456789abcdef01234567', + external_user_id: 'user_id', + device_id: 'fedcba87-6543-210f-edc-ba9876543210', + }, + properties: { + app_id: '01234567-89ab-cdef-0123-456789abcdef', + platform: 'ios', + os_version: 'iOS10.3.1', + device_model: 'iPhone7Plus', + session_id: 'b1234567-89ab-cdef-0123-456789abcdef', + }, + }, + ], + }), + }, + source: { + ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', + OriginalID: '', + Name: 'Braze source', + SourceDefinition: commonSourceDefinition, + Config: { + customMapping: [{ from: 'randomEvent', to: 'In-App Message Clicked' }], + }, + ...commonSourceConfigProperties, + }, + }, + ], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + batch: [ { - event_type: 'users.behaviors.app.SessionStart', - id: 'a1234567-89ab-cdef-0123-456789abcdef', - time: 1477502783, - user: { - user_id: '0123456789abcdef01234567', - external_user_id: 'user_id', - device_id: 'fedcba87-6543-210f-edc-ba9876543210', + context: { + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'Braze' }, + device: { + id: 'fedcba87-6543-210f-edc-ba9876543210', + model: 'iPhone7Plus', + }, + os: { version: 'iOS10.3.1', name: 'ios' }, }, + integrations: { Braze: false }, + type: 'track', + event: 'users.behaviors.app.SessionStart', + messageId: 'a1234567-89ab-cdef-0123-456789abcdef', + anonymousId: '0123456789abcdef01234567', + userId: 'user_id', properties: { app_id: '01234567-89ab-cdef-0123-456789abcdef', - platform: 'ios', - os_version: 'iOS10.3.1', - device_model: 'iPhone7Plus', session_id: 'b1234567-89ab-cdef-0123-456789abcdef', }, + timestamp: '2016-10-26T17:26:23.000Z', }, ], }, + }, + ], + }, + }, + }, + { + name: 'braze', + description: 'event.events is not available in required format', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify({}), + }, + source: { + ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', + OriginalID: '', + Name: 'Braze source', + SourceDefinition: commonSourceDefinition, + Config: { + customMapping: [ + { + from: 'randomEvent', + to: 'In-App Message Clicked', + }, + ], + }, + ...commonSourceConfigProperties, + }, + }, + ], + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'eventList should be an array', + statTags: { + destinationId: 'Non determinable', + errorCategory: 'transformation', + implementation: 'native', + module: 'source', + srcType: 'braze', + workspaceId: 'Non determinable', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'braze', + description: 'event is null in request', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify(null), + }, source: { ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', OriginalID: '', @@ -1231,6 +1265,238 @@ export const data = [ }, pathSuffix: '', }, + output: { + response: { + status: 200, + body: [ + { + error: 'eventList should be an array', + statTags: { + destinationId: 'Non determinable', + errorCategory: 'transformation', + implementation: 'native', + module: 'source', + srcType: 'braze', + workspaceId: 'Non determinable', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'braze', + description: 'event is empty array in request', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify([]), + }, + source: { + ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', + OriginalID: '', + Name: 'Braze source', + SourceDefinition: commonSourceDefinition, + Config: { + customMapping: [ + { + from: 'randomEvent', + to: 'In-App Message Clicked', + }, + ], + }, + ...commonSourceConfigProperties, + }, + }, + ], + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'eventList should be an array', + statTags: { + destinationId: 'Non determinable', + errorCategory: 'transformation', + implementation: 'native', + module: 'source', + srcType: 'braze', + workspaceId: 'Non determinable', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'braze', + description: 'event[0] is null/undefined in request', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify([null]), + }, + source: { + ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', + OriginalID: '', + Name: 'Braze source', + SourceDefinition: commonSourceDefinition, + Config: { + customMapping: [ + { + from: 'randomEvent', + to: 'In-App Message Clicked', + }, + ], + }, + ...commonSourceConfigProperties, + }, + }, + ], + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'eventList should be an array', + statTags: { + destinationId: 'Non determinable', + errorCategory: 'transformation', + implementation: 'native', + module: 'source', + srcType: 'braze', + workspaceId: 'Non determinable', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'braze', + description: 'event[0].events is undefined or null', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify([{}]), + }, + source: { + ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', + OriginalID: '', + Name: 'Braze source', + SourceDefinition: commonSourceDefinition, + Config: { + customMapping: [ + { + from: 'randomEvent', + to: 'In-App Message Clicked', + }, + ], + }, + ...commonSourceConfigProperties, + }, + }, + ], + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'eventList should be an array', + statTags: { + destinationId: 'Non determinable', + errorCategory: 'transformation', + implementation: 'native', + module: 'source', + srcType: 'braze', + workspaceId: 'Non determinable', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'braze', + description: 'success scenario when event[0].events is valid request', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify([ + { + events: [ + { + event_type: 'users.messages.inappmessage.Click', + properties: { device_model: 'samsung' }, + user: { + user_id: 'user_id', + external_user_id: 'externalUserId', + }, + }, + ], + }, + ]), + }, + source: { + ID: '2hgvYyU5TYaFvVzBge6tF2UKoeG', + OriginalID: '', + Name: 'Braze source', + SourceDefinition: commonSourceDefinition, + Config: { + customMapping: [], + }, + ...commonSourceConfigProperties, + }, + }, + ], + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, + pathSuffix: '', + }, output: { response: { status: 200, @@ -1239,26 +1505,16 @@ export const data = [ output: { batch: [ { + anonymousId: 'user_id', context: { - library: { name: 'unknown', version: 'unknown' }, + device: { model: 'samsung' }, integration: { name: 'Braze' }, - device: { - id: 'fedcba87-6543-210f-edc-ba9876543210', - model: 'iPhone7Plus', - }, - os: { version: 'iOS10.3.1', name: 'ios' }, + library: { name: 'unknown', version: 'unknown' }, }, + event: 'users.messages.inappmessage.Click', integrations: { Braze: false }, type: 'track', - event: 'users.behaviors.app.SessionStart', - messageId: 'a1234567-89ab-cdef-0123-456789abcdef', - anonymousId: '0123456789abcdef01234567', - userId: 'user_id', - properties: { - app_id: '01234567-89ab-cdef-0123-456789abcdef', - session_id: 'b1234567-89ab-cdef-0123-456789abcdef', - }, - timestamp: '2016-10-26T17:26:23.000Z', + userId: 'externalUserId', }, ], }, diff --git a/test/integrations/sources/canny/data.ts b/test/integrations/sources/canny/data.ts index ac471904f93..de626abf19f 100644 --- a/test/integrations/sources/canny/data.ts +++ b/test/integrations/sources/canny/data.ts @@ -9,50 +9,61 @@ export const data = [ name: 'canny', description: 'test-0', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-28T10:52:46.294Z', - object: { - author: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 13, - url: 'https://rudder.canny.io/admin/board/features', - }, - by: null, - category: null, - commentCount: 0, - created: '2022-07-28T10:52:46.172Z', - customFields: [{ id: '62e13820d7949d44b92d3876', name: 'abc', value: '123' }], - details: 'Array of images', - eta: null, - id: '62e26a7e1d4ea13c124337bd', - imageURLs: [ - 'https://canny.io/images/6371453a825c79351c52a6063c3af476.jpg', - 'https://canny.io/images/47db6ee5035bfb45ea87a74f2eb17928.jpg', - ], - owner: null, - score: 1, - status: 'open', - tags: [], - title: 'Custom Fields Testing', - url: 'https://rudder.canny.io/admin/board/features/p/custom-fields-testing', + request: { + body: JSON.stringify({ + created: '2022-07-28T10:52:46.294Z', + object: { + author: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 13, + url: 'https://rudder.canny.io/admin/board/features', + }, + by: null, + category: null, + commentCount: 0, + created: '2022-07-28T10:52:46.172Z', + customFields: [ + { + id: '62e13820d7949d44b92d3876', + name: 'abc', + value: '123', + }, + ], + details: 'Array of images', + eta: null, + id: '62e26a7e1d4ea13c124337bd', + imageURLs: [ + 'https://canny.io/images/6371453a825c79351c52a6063c3af476.jpg', + 'https://canny.io/images/47db6ee5035bfb45ea87a74f2eb17928.jpg', + ], + owner: null, + score: 1, + status: 'open', + tags: [], + title: 'Custom Fields Testing', + url: 'https://rudder.canny.io/admin/board/features/p/custom-fields-testing', + }, + objectType: 'post', + type: 'post.created', + }), }, - objectType: 'post', - type: 'post.created', + source: {}, }, ], method: 'POST', @@ -81,7 +92,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-28T10:52:46.294Z', originalTimestamp: '2022-07-28T10:52:46.294Z', @@ -98,7 +114,13 @@ export const data = [ category: null, commentCount: 0, created: '2022-07-28T10:52:46.172Z', - customFields: [{ id: '62e13820d7949d44b92d3876', name: 'abc', value: '123' }], + customFields: [ + { + id: '62e13820d7949d44b92d3876', + name: 'abc', + value: '123', + }, + ], details: 'Array of images', eta: null, id: '62e26a7e1d4ea13c124337bd', @@ -126,55 +148,60 @@ export const data = [ name: 'canny', description: 'test-1', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-26T10:35:16.390Z', - object: { - author: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 10, - url: 'https://rudder.canny.io/admin/board/features', - }, - by: null, - category: null, - commentCount: 0, - created: '2022-07-26T08:18:52.459Z', - deletedBy: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - details: "This is the post's details", - eta: null, - id: '62dfa36c9950e94655320fe7', - imageURLs: [], - owner: null, - score: 1, - status: 'open', - tags: [], - title: 'Post Title', - url: 'https://rudder.canny.io/admin/board/features/p/post-title-4', + request: { + body: JSON.stringify({ + created: '2022-07-26T10:35:16.390Z', + object: { + author: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 10, + url: 'https://rudder.canny.io/admin/board/features', + }, + by: null, + category: null, + commentCount: 0, + created: '2022-07-26T08:18:52.459Z', + deletedBy: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + details: "This is the post's details", + eta: null, + id: '62dfa36c9950e94655320fe7', + imageURLs: [], + owner: null, + score: 1, + status: 'open', + tags: [], + title: 'Post Title', + url: 'https://rudder.canny.io/admin/board/features/p/post-title-4', + }, + objectType: 'post', + type: 'post.deleted', + }), }, - objectType: 'post', - type: 'post.deleted', + source: {}, }, ], method: 'POST', @@ -203,7 +230,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-26T10:35:16.390Z', originalTimestamp: '2022-07-26T10:35:16.390Z', @@ -253,55 +285,62 @@ export const data = [ name: 'canny', description: 'test-2', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-26T18:32:28.337Z', - object: { - author: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - by: null, - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 12, - url: 'https://rudder.canny.io/admin/board/features', - }, - category: null, - commentCount: 0, - created: '2022-07-26T10:43:43.752Z', - details: "This is the post's details", - eta: null, - id: '62dfc55ffe7f6f465b9b4568', - imageURLs: [], - issue: { - description: - "This is the post's details\n\nhttps://rudder.canny.io/admin/board/features/p/post-title-8", - id: '10001', - key: 'TES-2', - status: 'To Do', - summary: 'Canny Source Testing', - url: 'https://rudderstack-user.atlassian.net/browse/TES-2', - }, - owner: null, - score: 2, - status: 'open', - tags: [], - title: 'Post Title', - url: 'https://rudder.canny.io/admin/board/features/p/post-title-8', + request: { + body: JSON.stringify({ + created: '2022-07-26T18:32:28.337Z', + object: { + author: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + by: null, + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 12, + url: 'https://rudder.canny.io/admin/board/features', + }, + category: null, + commentCount: 0, + created: '2022-07-26T10:43:43.752Z', + details: "This is the post's details", + eta: null, + id: '62dfc55ffe7f6f465b9b4568', + imageURLs: [], + issue: { + description: + "This is the post's details\n" + + '\n' + + 'https://rudder.canny.io/admin/board/features/p/post-title-8', + id: '10001', + key: 'TES-2', + status: 'To Do', + summary: 'Canny Source Testing', + url: 'https://rudderstack-user.atlassian.net/browse/TES-2', + }, + owner: null, + score: 2, + status: 'open', + tags: [], + title: 'Post Title', + url: 'https://rudder.canny.io/admin/board/features/p/post-title-8', + }, + objectType: 'post', + type: 'post.jira_issue_linked', + }), }, - objectType: 'post', - type: 'post.jira_issue_linked', + source: {}, }, ], method: 'POST', @@ -330,7 +369,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-26T18:32:28.337Z', originalTimestamp: '2022-07-26T18:32:28.337Z', @@ -353,7 +397,9 @@ export const data = [ imageURLs: [], issue: { description: - "This is the post's details\n\nhttps://rudder.canny.io/admin/board/features/p/post-title-8", + "This is the post's details\n" + + '\n' + + 'https://rudder.canny.io/admin/board/features/p/post-title-8', id: '10001', key: 'TES-2', status: 'To Do', @@ -380,55 +426,62 @@ export const data = [ name: 'canny', description: 'test-3', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-27T04:08:24.377Z', - object: { - author: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - by: null, - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 12, - url: 'https://rudder.canny.io/admin/board/features', - }, - category: null, - commentCount: 0, - created: '2022-07-26T11:32:31.228Z', - details: 'Array of images', - eta: null, - id: '62dfd0cfb2870d468c9618dd', - imageURLs: [], - issue: { - description: - 'Array of images\n\nhttps://rudder.canny.io/admin/board/features/p/images-testing-2', - id: '10002', - key: 'TES-3', - status: 'To Do', - summary: 'Images testing', - url: 'https://rudderstack-user.atlassian.net/browse/TES-3', - }, - owner: null, - score: 1, - status: 'open', - tags: [], - title: 'Images testing', - url: 'https://rudder.canny.io/admin/board/features/p/images-testing-2', + request: { + body: JSON.stringify({ + created: '2022-07-27T04:08:24.377Z', + object: { + author: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + by: null, + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 12, + url: 'https://rudder.canny.io/admin/board/features', + }, + category: null, + commentCount: 0, + created: '2022-07-26T11:32:31.228Z', + details: 'Array of images', + eta: null, + id: '62dfd0cfb2870d468c9618dd', + imageURLs: [], + issue: { + description: + 'Array of images\n' + + '\n' + + 'https://rudder.canny.io/admin/board/features/p/images-testing-2', + id: '10002', + key: 'TES-3', + status: 'To Do', + summary: 'Images testing', + url: 'https://rudderstack-user.atlassian.net/browse/TES-3', + }, + owner: null, + score: 1, + status: 'open', + tags: [], + title: 'Images testing', + url: 'https://rudder.canny.io/admin/board/features/p/images-testing-2', + }, + objectType: 'post', + type: 'post.jira_issue_unlinked', + }), }, - objectType: 'post', - type: 'post.jira_issue_unlinked', + source: {}, }, ], method: 'POST', @@ -457,7 +510,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-27T04:08:24.377Z', originalTimestamp: '2022-07-27T04:08:24.377Z', @@ -481,7 +539,9 @@ export const data = [ imageURLs: [], issue: { description: - 'Array of images\n\nhttps://rudder.canny.io/admin/board/features/p/images-testing-2', + 'Array of images\n' + + '\n' + + 'https://rudder.canny.io/admin/board/features/p/images-testing-2', id: '10002', key: 'TES-3', status: 'To Do', @@ -507,63 +567,68 @@ export const data = [ name: 'canny', description: 'test-4', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-26T18:07:03.143Z', - object: { - author: { - avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 12, - url: 'https://rudder.canny.io/admin/board/features', - }, - by: null, - category: null, - changeComment: { - imageURLs: ['https://canny.io/images/0a4b1c6a967ad9fc17f0c71dc11d1de2.webp'], - value: '', - }, - changedAt: '2022-07-26T18:07:03.143Z', - changer: { - avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - commentCount: 1, - created: '2022-07-26T08:22:31.089Z', - details: "This is the post's details", - eta: null, - id: '62dfa4479950e9465532a31e', - imageURLs: [], - jira: { linkedIssues: [], linkedIssueIDs: [] }, - owner: null, - score: 2, - status: 'planned', - tags: [], - title: 'Post Title', - url: 'https://rudder.canny.io/admin/board/features/p/post-title-7', + request: { + body: JSON.stringify({ + created: '2022-07-26T18:07:03.143Z', + object: { + author: { + avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 12, + url: 'https://rudder.canny.io/admin/board/features', + }, + by: null, + category: null, + changeComment: { + imageURLs: ['https://canny.io/images/0a4b1c6a967ad9fc17f0c71dc11d1de2.webp'], + value: '', + }, + changedAt: '2022-07-26T18:07:03.143Z', + changer: { + avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + commentCount: 1, + created: '2022-07-26T08:22:31.089Z', + details: "This is the post's details", + eta: null, + id: '62dfa4479950e9465532a31e', + imageURLs: [], + jira: { linkedIssues: [], linkedIssueIDs: [] }, + owner: null, + score: 2, + status: 'planned', + tags: [], + title: 'Post Title', + url: 'https://rudder.canny.io/admin/board/features/p/post-title-7', + }, + objectType: 'post', + type: 'post.status_changed', + }), }, - objectType: 'post', - type: 'post.status_changed', + source: {}, }, ], method: 'POST', @@ -593,7 +658,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-26T18:07:03.143Z', originalTimestamp: '2022-07-26T18:07:03.143Z', @@ -650,64 +720,69 @@ export const data = [ name: 'canny', description: 'test-5', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-26T10:52:17.712Z', - object: { - author: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 11, - url: 'https://rudder.canny.io/admin/board/features', - }, - created: '2022-07-26T10:52:17.618Z', - id: '62dfc761af6e2b467381b103', - imageURLs: ['https://canny.io/images/59ef1b731f87d1c84bbdc078d0b9221e.webp'], - internal: true, - mentions: [], - parentID: null, - post: { - author: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, + request: { + body: JSON.stringify({ + created: '2022-07-26T10:52:17.712Z', + object: { + author: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 11, + url: 'https://rudder.canny.io/admin/board/features', + }, + created: '2022-07-26T10:52:17.618Z', + id: '62dfc761af6e2b467381b103', + imageURLs: ['https://canny.io/images/59ef1b731f87d1c84bbdc078d0b9221e.webp'], + internal: true, + mentions: [], + parentID: null, + post: { + author: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + by: null, + category: null, + commentCount: 1, + details: "This is the post's details", + eta: null, + id: '62dfa4479950e9465532a31e', + imageURLs: [], + owner: null, + score: 2, + status: 'open', + tags: [], + title: 'Post Title', + url: 'https://rudder.canny.io/admin/board/features/p/post-title-7', + }, + private: false, + value: 'webhook-test', }, - by: null, - category: null, - commentCount: 1, - details: "This is the post's details", - eta: null, - id: '62dfa4479950e9465532a31e', - imageURLs: [], - owner: null, - score: 2, - status: 'open', - tags: [], - title: 'Post Title', - url: 'https://rudder.canny.io/admin/board/features/p/post-title-7', - }, - private: false, - value: 'webhook-test', + objectType: 'comment', + type: 'comment.created', + }), }, - objectType: 'comment', - type: 'comment.created', + source: {}, }, ], method: 'POST', @@ -736,7 +811,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-26T10:52:17.712Z', originalTimestamp: '2022-07-26T10:52:17.712Z', @@ -795,62 +875,67 @@ export const data = [ name: 'canny', description: 'test-6', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-27T04:12:09.290Z', - object: { - author: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 12, - url: 'https://rudder.canny.io/admin/board/features', - }, - created: '2022-07-27T04:11:59.942Z', - id: '62e0bb0faf6e2b467328b133', - imageURLs: [], - parentID: null, - post: { - author: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, + request: { + body: JSON.stringify({ + created: '2022-07-27T04:12:09.290Z', + object: { + author: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 12, + url: 'https://rudder.canny.io/admin/board/features', + }, + created: '2022-07-27T04:11:59.942Z', + id: '62e0bb0faf6e2b467328b133', + imageURLs: [], + parentID: null, + post: { + author: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + by: null, + category: null, + commentCount: 0, + details: 'Array of images', + eta: null, + id: '62dfd0cfb2870d468c9618dd', + imageURLs: [], + owner: null, + score: 1, + status: 'open', + tags: [], + title: 'Images testing', + url: 'https://rudder.canny.io/admin/board/features/p/images-testing-2', + }, + private: false, + value: 'good', }, - by: null, - category: null, - commentCount: 0, - details: 'Array of images', - eta: null, - id: '62dfd0cfb2870d468c9618dd', - imageURLs: [], - owner: null, - score: 1, - status: 'open', - tags: [], - title: 'Images testing', - url: 'https://rudder.canny.io/admin/board/features/p/images-testing-2', - }, - private: false, - value: 'good', + objectType: 'comment', + type: 'comment.deleted', + }), }, - objectType: 'comment', - type: 'comment.deleted', + source: {}, }, ], method: 'POST', @@ -879,7 +964,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-27T04:12:09.290Z', originalTimestamp: '2022-07-27T04:12:09.290Z', @@ -936,62 +1026,67 @@ export const data = [ name: 'canny', description: 'test-7', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-26T11:32:31.378Z', - object: { - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 12, - url: 'https://rudder.canny.io/admin/board/features', - }, - by: null, - created: '2022-07-26T11:32:31.263Z', - id: '62dfd0cfb2870d468c9618f5', - post: { - author: { - avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, + request: { + body: JSON.stringify({ + created: '2022-07-26T11:32:31.378Z', + object: { + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 12, + url: 'https://rudder.canny.io/admin/board/features', + }, + by: null, + created: '2022-07-26T11:32:31.263Z', + id: '62dfd0cfb2870d468c9618f5', + post: { + author: { + avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + by: null, + category: null, + commentCount: 0, + details: 'Array of images', + eta: null, + id: '62dfd0cfb2870d468c9618dd', + imageURLs: [], + owner: null, + score: 1, + status: 'open', + tags: [], + title: 'Images testing', + url: 'https://rudder.canny.io/admin/board/features/p/images-testing-2', + }, + score: 1, + voter: { + avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, }, - by: null, - category: null, - commentCount: 0, - details: 'Array of images', - eta: null, - id: '62dfd0cfb2870d468c9618dd', - imageURLs: [], - owner: null, - score: 1, - status: 'open', - tags: [], - title: 'Images testing', - url: 'https://rudder.canny.io/admin/board/features/p/images-testing-2', - }, - score: 1, - voter: { - avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, + objectType: 'vote', + type: 'vote.created', + }), }, - objectType: 'vote', - type: 'vote.created', + source: {}, }, ], method: 'POST', @@ -1021,7 +1116,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-26T11:32:31.378Z', originalTimestamp: '2022-07-26T11:32:31.378Z', @@ -1077,69 +1177,74 @@ export const data = [ name: 'canny', description: 'test-8', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-26T18:09:27.358Z', - object: { - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 12, - url: 'https://rudder.canny.io/admin/board/features', - }, - by: null, - created: '2022-07-26T08:22:31.109Z', - id: '62dfa4479950e9465532a338', - post: { - author: { - avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - by: null, - category: null, - commentCount: 1, - details: "This is the post's details", - eta: null, - id: '62dfa4479950e9465532a31e', - imageURLs: [], - owner: null, - score: 1, - status: 'planned', - tags: [ - { - id: '62e02db67ad24c46bc175f56', - name: 'abc-tag', - postCount: 1, - url: 'https://rudder.canny.io/admin/board/features?tags=abc-tag', + request: { + body: JSON.stringify({ + created: '2022-07-26T18:09:27.358Z', + object: { + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 12, + url: 'https://rudder.canny.io/admin/board/features', }, - ], - title: 'Post Title', - url: 'https://rudder.canny.io/admin/board/features/p/post-title-7', - }, - score: 0, - voter: { - avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, + by: null, + created: '2022-07-26T08:22:31.109Z', + id: '62dfa4479950e9465532a338', + post: { + author: { + avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + by: null, + category: null, + commentCount: 1, + details: "This is the post's details", + eta: null, + id: '62dfa4479950e9465532a31e', + imageURLs: [], + owner: null, + score: 1, + status: 'planned', + tags: [ + { + id: '62e02db67ad24c46bc175f56', + name: 'abc-tag', + postCount: 1, + url: 'https://rudder.canny.io/admin/board/features?tags=abc-tag', + }, + ], + title: 'Post Title', + url: 'https://rudder.canny.io/admin/board/features/p/post-title-7', + }, + score: 0, + voter: { + avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + }, + objectType: 'vote', + type: 'vote.deleted', + }), }, - objectType: 'vote', - type: 'vote.deleted', + source: {}, }, ], method: 'POST', @@ -1169,7 +1274,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-26T18:09:27.358Z', originalTimestamp: '2022-07-26T18:09:27.358Z', @@ -1232,50 +1342,61 @@ export const data = [ name: 'canny', description: 'test-9', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-28T10:52:46.294Z', - object: { - author: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: 'sampleuserId', - }, - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 13, - url: 'https://rudder.canny.io/admin/board/features', - }, - by: null, - category: null, - commentCount: 0, - created: '2022-07-28T10:52:46.172Z', - customFields: [{ id: '62e13820d7949d44b92d3876', name: 'abc', value: '123' }], - details: 'Array of images', - eta: null, - id: '62e26a7e1d4ea13c124337bd', - imageURLs: [ - 'https://canny.io/images/6371453a825c79351c52a6063c3af476.jpg', - 'https://canny.io/images/47db6ee5035bfb45ea87a74f2eb17928.jpg', - ], - owner: null, - score: 1, - status: 'open', - tags: [], - title: 'Custom Fields Testing', - url: 'https://rudder.canny.io/admin/board/features/p/custom-fields-testing', + request: { + body: JSON.stringify({ + created: '2022-07-28T10:52:46.294Z', + object: { + author: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: 'sampleuserId', + }, + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 13, + url: 'https://rudder.canny.io/admin/board/features', + }, + by: null, + category: null, + commentCount: 0, + created: '2022-07-28T10:52:46.172Z', + customFields: [ + { + id: '62e13820d7949d44b92d3876', + name: 'abc', + value: '123', + }, + ], + details: 'Array of images', + eta: null, + id: '62e26a7e1d4ea13c124337bd', + imageURLs: [ + 'https://canny.io/images/6371453a825c79351c52a6063c3af476.jpg', + 'https://canny.io/images/47db6ee5035bfb45ea87a74f2eb17928.jpg', + ], + owner: null, + score: 1, + status: 'open', + tags: [], + title: 'Custom Fields Testing', + url: 'https://rudder.canny.io/admin/board/features/p/custom-fields-testing', + }, + objectType: 'post', + type: 'post.created', + }), }, - objectType: 'post', - type: 'post.created', + source: {}, }, ], method: 'POST', @@ -1304,7 +1425,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-28T10:52:46.294Z', originalTimestamp: '2022-07-28T10:52:46.294Z', @@ -1321,7 +1447,13 @@ export const data = [ category: null, commentCount: 0, created: '2022-07-28T10:52:46.172Z', - customFields: [{ id: '62e13820d7949d44b92d3876', name: 'abc', value: '123' }], + customFields: [ + { + id: '62e13820d7949d44b92d3876', + name: 'abc', + value: '123', + }, + ], details: 'Array of images', eta: null, id: '62e26a7e1d4ea13c124337bd', @@ -1349,62 +1481,67 @@ export const data = [ name: 'canny', description: 'test-10', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-26T11:32:31.378Z', - object: { - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 12, - url: 'https://rudder.canny.io/admin/board/features', - }, - by: null, - created: '2022-07-26T11:32:31.263Z', - id: '62dfd0cfb2870d468c9618f5', - post: { - author: { - avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, + request: { + body: JSON.stringify({ + created: '2022-07-26T11:32:31.378Z', + object: { + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 12, + url: 'https://rudder.canny.io/admin/board/features', + }, + by: null, + created: '2022-07-26T11:32:31.263Z', + id: '62dfd0cfb2870d468c9618f5', + post: { + author: { + avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + by: null, + category: null, + commentCount: 0, + details: 'Array of images', + eta: null, + id: '62dfd0cfb2870d468c9618dd', + imageURLs: [], + owner: null, + score: 1, + status: 'open', + tags: [], + title: 'Images testing', + url: 'https://rudder.canny.io/admin/board/features/p/images-testing-2', + }, + score: 1, + voter: { + avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: '123', + }, }, - by: null, - category: null, - commentCount: 0, - details: 'Array of images', - eta: null, - id: '62dfd0cfb2870d468c9618dd', - imageURLs: [], - owner: null, - score: 1, - status: 'open', - tags: [], - title: 'Images testing', - url: 'https://rudder.canny.io/admin/board/features/p/images-testing-2', - }, - score: 1, - voter: { - avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: '123', - }, + objectType: 'vote', + type: 'vote.created', + }), }, - objectType: 'vote', - type: 'vote.created', + source: {}, }, ], method: 'POST', @@ -1434,7 +1571,12 @@ export const data = [ name: 'Rudder Test', url: 'https://rudder.canny.io/admin/users/dummyUser', }, - externalId: [{ type: 'cannyUserId', id: '62d14c90fff7c80d0ec08375' }], + externalId: [ + { + type: 'cannyUserId', + id: '62d14c90fff7c80d0ec08375', + }, + ], }, timestamp: '2022-07-26T11:32:31.378Z', originalTimestamp: '2022-07-26T11:32:31.378Z', @@ -1490,69 +1632,74 @@ export const data = [ name: 'canny', description: 'test-11', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-26T18:09:27.358Z', - object: { - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 12, - url: 'https://rudder.canny.io/admin/board/features', - }, - by: null, - created: '2022-07-26T08:22:31.109Z', - id: '62dfa4479950e9465532a338', - post: { - author: { - avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - by: null, - category: null, - commentCount: 1, - details: "This is the post's details", - eta: null, - id: '62dfa4479950e9465532a31e', - imageURLs: [], - owner: null, - score: 1, - status: 'planned', - tags: [ - { - id: '62e02db67ad24c46bc175f56', - name: 'abc-tag', - postCount: 1, - url: 'https://rudder.canny.io/admin/board/features?tags=abc-tag', + request: { + body: JSON.stringify({ + created: '2022-07-26T18:09:27.358Z', + object: { + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 12, + url: 'https://rudder.canny.io/admin/board/features', }, - ], - title: 'Post Title', - url: 'https://rudder.canny.io/admin/board/features/p/post-title-7', - }, - score: 0, - voter: { - avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', - created: '2022-07-15T11:16:32.648Z', - email: null, - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, + by: null, + created: '2022-07-26T08:22:31.109Z', + id: '62dfa4479950e9465532a338', + post: { + author: { + avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + by: null, + category: null, + commentCount: 1, + details: "This is the post's details", + eta: null, + id: '62dfa4479950e9465532a31e', + imageURLs: [], + owner: null, + score: 1, + status: 'planned', + tags: [ + { + id: '62e02db67ad24c46bc175f56', + name: 'abc-tag', + postCount: 1, + url: 'https://rudder.canny.io/admin/board/features?tags=abc-tag', + }, + ], + title: 'Post Title', + url: 'https://rudder.canny.io/admin/board/features/p/post-title-7', + }, + score: 0, + voter: { + avatarURL: 'https://canny.io/images/cddfd145056cd4bc04132ee0e7de04ee.png', + created: '2022-07-15T11:16:32.648Z', + email: null, + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + }, + objectType: 'vote', + type: 'vote.deleted', + }), }, - objectType: 'vote', - type: 'vote.deleted', + source: {}, }, ], method: 'POST', @@ -1573,6 +1720,7 @@ export const data = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'canny', workspaceId: 'Non determinable', }, }, @@ -1584,53 +1732,58 @@ export const data = [ name: 'canny', description: 'test-12', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - created: '2022-07-26T10:35:16.390Z', - object: { - author: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - board: { - created: '2022-07-25T12:11:19.895Z', - id: '62de88676bc28b44aaaf25cc', - name: 'features', - postCount: 10, - url: 'https://rudder.canny.io/admin/board/features', - }, - by: null, - category: null, - commentCount: 0, - created: '2022-07-26T08:18:52.459Z', - deletedBy: { - created: '2022-07-15T11:16:32.648Z', - email: 'test@rudderstack.com', - id: '62d14c90fff7c80d0ec08375', - isAdmin: true, - name: 'Rudder Test', - url: 'https://rudder.canny.io/admin/users/dummyUser', - userID: null, - }, - details: "This is the post's details", - eta: null, - id: '62dfa36c9950e94655320fe7', - imageURLs: [], - owner: null, - score: 1, - status: 'open', - tags: [], - title: 'Post Title', - url: 'https://rudder.canny.io/admin/board/features/p/post-title-4', + request: { + body: JSON.stringify({ + created: '2022-07-26T10:35:16.390Z', + object: { + author: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + board: { + created: '2022-07-25T12:11:19.895Z', + id: '62de88676bc28b44aaaf25cc', + name: 'features', + postCount: 10, + url: 'https://rudder.canny.io/admin/board/features', + }, + by: null, + category: null, + commentCount: 0, + created: '2022-07-26T08:18:52.459Z', + deletedBy: { + created: '2022-07-15T11:16:32.648Z', + email: 'test@rudderstack.com', + id: '62d14c90fff7c80d0ec08375', + isAdmin: true, + name: 'Rudder Test', + url: 'https://rudder.canny.io/admin/users/dummyUser', + userID: null, + }, + details: "This is the post's details", + eta: null, + id: '62dfa36c9950e94655320fe7', + imageURLs: [], + owner: null, + score: 1, + status: 'open', + tags: [], + title: 'Post Title', + url: 'https://rudder.canny.io/admin/board/features/p/post-title-4', + }, + objectType: 'post', + }), }, - objectType: 'post', + source: {}, }, ], method: 'POST', @@ -1650,6 +1803,7 @@ export const data = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'canny', workspaceId: 'Non determinable', }, }, diff --git a/test/integrations/sources/close_crm/data.ts b/test/integrations/sources/close_crm/data.ts index 08b9d13a1b0..66c8841d1eb 100644 --- a/test/integrations/sources/close_crm/data.ts +++ b/test/integrations/sources/close_crm/data.ts @@ -9,78 +9,78 @@ export const data = [ name: 'close_crm', description: 'lead update', module: 'source', - version: 'v1', + version: 'v2', input: { request: { body: [ { - event: { - event: { - date_created: '2019-01-15T12:48:23.395000', - meta: { - request_method: 'PUT', - request_path: '/api/v1/opportunity/object_id/', - }, - id: 'ev_123', - action: 'updated', - date_updated: '2019-01-15T12:48:23.395000', - changed_fields: [ - 'confidence', - 'date_updated', - 'status_id', - 'status_label', - 'status_type', - ], - previous_data: { - status_type: 'active', - confidence: 70, - date_updated: '2019-01-15T12:47:39.873000+00:00', - status_id: 'stat_123', - status_label: 'Active', - }, - organization_id: 'orga_123', - data: { - contact_name: 'Mr. Jones', - user_name: 'Joe Kemp', - value_period: 'one_time', - updated_by_name: 'Joe Kemp', - date_created: '2019-01-15T12:41:24.496000+00:00', - user_id: 'user_123', - updated_by: 'user_123', - value_currency: 'USD', + request: { + body: JSON.stringify({ + event: { + date_created: '2019-01-15T12:48:23.395000', + meta: { + request_method: 'PUT', + request_path: '/api/v1/opportunity/object_id/', + }, + id: 'ev_123', + action: 'updated', + date_updated: '2019-01-15T12:48:23.395000', + changed_fields: [ + 'confidence', + 'date_updated', + 'status_id', + 'status_label', + 'status_type', + ], + previous_data: { + status_type: 'active', + confidence: 70, + date_updated: '2019-01-15T12:47:39.873000+00:00', + status_id: 'stat_123', + status_label: 'Active', + }, organization_id: 'orga_123', - status_label: 'Won', - contact_id: 'cont_123', - status_type: 'won', - created_by_name: 'Joe Kemp', - id: 'id_12', - lead_name: 'KLine', - date_lost: null, - note: '', - date_updated: '2019-01-15T12:48:23.392000+00:00', - status_id: 'stat_12', - value: 100000, - created_by: 'user_123', - value_formatted: '$1,000', - date_won: '2019-01-15', + data: { + contact_name: 'Mr. Jones', + user_name: 'Joe Kemp', + value_period: 'one_time', + updated_by_name: 'Joe Kemp', + date_created: '2019-01-15T12:41:24.496000+00:00', + user_id: 'user_123', + updated_by: 'user_123', + value_currency: 'USD', + organization_id: 'orga_123', + status_label: 'Won', + contact_id: 'cont_123', + status_type: 'won', + created_by_name: 'Joe Kemp', + id: 'id_12', + lead_name: 'KLine', + date_lost: null, + note: '', + date_updated: '2019-01-15T12:48:23.392000+00:00', + status_id: 'stat_12', + value: 100000, + created_by: 'user_123', + value_formatted: '$1,000', + date_won: '2019-01-15', + lead_id: 'lead_123', + confidence: 100, + }, + request_id: 'req_123', + object_id: 'object_id', + user_id: 'user_123', + object_type: 'opportunity', lead_id: 'lead_123', - confidence: 100, }, - request_id: 'req_123', - object_id: 'object_id', - user_id: 'user_123', - object_type: 'opportunity', - lead_id: 'lead_123', - }, - subscription_id: 'whsub_123', + subscription_id: 'whsub_123', + }), }, source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -93,17 +93,10 @@ export const data = [ batch: [ { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'CloseCRM', - }, - }, - integrations: { - CloseCRM: false, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'CloseCRM' }, }, + integrations: { CloseCRM: false }, type: 'track', event: 'opportunity updated', messageId: 'ev_123', @@ -159,59 +152,52 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'close_crm', description: 'group creation', module: 'source', - version: 'v1', + version: 'v2', input: { request: { body: [ { - event: { - subscription_id: 'whsub_123', - event: { - id: 'ev_123', - date_created: '2024-06-13T03:53:33.917000', - date_updated: '2024-06-13T03:53:33.917000', - organization_id: 'orga_123', - user_id: 'user_123', - request_id: 'req_123', - api_key_id: null, - oauth_client_id: null, - oauth_scope: null, - object_type: 'group', - object_id: 'group_123', - lead_id: null, - action: 'created', - changed_fields: [], - meta: { - request_path: '/api/v1/graphql/', - request_method: 'POST', - }, - data: { - id: 'group_123', - name: 'Test group', - members: [ - { - user_id: 'user_123', - }, - ], + request: { + body: JSON.stringify({ + subscription_id: 'whsub_123', + event: { + id: 'ev_123', + date_created: '2024-06-13T03:53:33.917000', + date_updated: '2024-06-13T03:53:33.917000', + organization_id: 'orga_123', + user_id: 'user_123', + request_id: 'req_123', + api_key_id: null, + oauth_client_id: null, + oauth_scope: null, + object_type: 'group', + object_id: 'group_123', + lead_id: null, + action: 'created', + changed_fields: [], + meta: { + request_path: '/api/v1/graphql/', + request_method: 'POST', + }, + data: { + id: 'group_123', + name: 'Test group', + members: [{ user_id: 'user_123' }], + }, + previous_data: {}, }, - previous_data: {}, - }, + }), }, source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -225,29 +211,18 @@ export const data = [ { anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', context: { - integration: { - name: 'CloseCRM', - }, - library: { - name: 'unknown', - version: 'unknown', - }, + integration: { name: 'CloseCRM' }, + library: { name: 'unknown', version: 'unknown' }, }, event: 'group created', - integrations: { - CloseCRM: false, - }, + integrations: { CloseCRM: false }, messageId: 'ev_123', originalTimestamp: '2024-06-ThT03:53:33.917+00:00', properties: { action: 'created', data: { id: 'group_123', - members: [ - { - user_id: 'user_123', - }, - ], + members: [{ user_id: 'user_123' }], name: 'Test group', }, date_created: '2024-06-13T03:53:33.917000', @@ -272,68 +247,65 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'close_crm', description: 'lead deletion', module: 'source', - version: 'v1', + version: 'v2', input: { request: { body: [ { - event: { - subscription_id: 'whsub_123', - event: { - id: 'ev_123', - date_created: '2024-06-14T05:16:04.138000', - date_updated: '2024-06-14T05:16:04.138000', - organization_id: 'orga_123', - user_id: 'user_123', - request_id: 'req_123', - api_key_id: 'api_123', - oauth_client_id: null, - oauth_scope: null, - object_type: 'lead', - object_id: 'lead_123', - lead_id: 'lead_123', - action: 'deleted', - changed_fields: [], - meta: { - request_path: '/api/v1/lead/lead_123/', - request_method: 'DELETE', - }, - data: {}, - previous_data: { - created_by_name: 'Rudder User', - addresses: [], - description: '', - url: null, - date_created: '2024-06-14T05:13:42.239000+00:00', - status_id: 'stat_123', - contact_ids: ['cont_123'], - id: 'lead_12', - date_updated: '2024-06-14T05:13:42.262000+00:00', - updated_by_name: 'Rudder User', - status_label: 'Potential', - name: 'test name', - display_name: 'test name', + request: { + body: JSON.stringify({ + subscription_id: 'whsub_123', + event: { + id: 'ev_123', + date_created: '2024-06-14T05:16:04.138000', + date_updated: '2024-06-14T05:16:04.138000', organization_id: 'orga_123', - updated_by: 'user_123', - created_by: 'user_123', + user_id: 'user_123', + request_id: 'req_123', + api_key_id: 'api_123', + oauth_client_id: null, + oauth_scope: null, + object_type: 'lead', + object_id: 'lead_123', + lead_id: 'lead_123', + action: 'deleted', + changed_fields: [], + meta: { + request_path: '/api/v1/lead/lead_123/', + request_method: 'DELETE', + }, + data: {}, + previous_data: { + created_by_name: 'Rudder User', + addresses: [], + description: '', + url: null, + date_created: '2024-06-14T05:13:42.239000+00:00', + status_id: 'stat_123', + contact_ids: ['cont_123'], + id: 'lead_12', + date_updated: '2024-06-14T05:13:42.262000+00:00', + updated_by_name: 'Rudder User', + status_label: 'Potential', + name: 'test name', + display_name: 'test name', + organization_id: 'orga_123', + updated_by: 'user_123', + created_by: 'user_123', + }, }, - }, + }), }, source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -346,17 +318,10 @@ export const data = [ batch: [ { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'CloseCRM', - }, - }, - integrations: { - CloseCRM: false, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'CloseCRM' }, }, + integrations: { CloseCRM: false }, type: 'track', event: 'lead deleted', userId: 'lead_123', @@ -388,8 +353,10 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, -]; +].map((tc) => ({ + ...tc, + mockFns: () => { + defaultMockFns(); + }, +})); diff --git a/test/integrations/sources/cordial/data.ts b/test/integrations/sources/cordial/data.ts index acb02e9fbfc..4da265a9ca2 100644 --- a/test/integrations/sources/cordial/data.ts +++ b/test/integrations/sources/cordial/data.ts @@ -9,61 +9,59 @@ export const data = [ name: 'cordial', description: 'Simple Single object Input event with normal channel and action', module: 'source', - version: 'v1', + version: 'v2', input: { request: { body: [ { - event: { - contact: { - _id: '6690fe3655e334xx028xxx', - channels: { - email: { - address: 'jondoe@example.com', - subscribeStatus: 'subscribed', - subscribedAt: '2024-07-12T09:58:14+0000', + request: { + body: JSON.stringify({ + contact: { + _id: '6690fe3655e334xx028xxx', + channels: { + email: { + address: 'jondoe@example.com', + subscribeStatus: 'subscribed', + subscribedAt: '2024-07-12T09:58:14+0000', + }, }, + createdAt: '2024-07-12T09:58:14+0000', + address: { city: 'San Miego' }, + first_name: 'John', + last_name: 'Doe', + lastUpdateSource: 'api', + lastModified: '2024-07-12T13:00:49+0000', + cID: '6690fe3655e334xx028xxx', }, - createdAt: '2024-07-12T09:58:14+0000', - address: { - city: 'San Miego', - }, - first_name: 'John', - last_name: 'Doe', - lastUpdateSource: 'api', - lastModified: '2024-07-12T13:00:49+0000', - cID: '6690fe3655e334xx028xxx', - }, - event: { - _id: '669141857b8cxxx1ba0da2xx', - cID: '6690fe3655e334xx028xxx', - ts: '2024-07-12T14:45:25+00:00', - ats: '2024-07-12T14:45:25+0000', - a: 'browse', - tzo: -7, - rl: 'a', - UID: '4934ee07118197xx3f74d5xxxx7b0076', - time: '2024-07-12T14:45:25+0000', - action: 'browse', - bmID: '', - first: 0, - properties: { - category: 'Shirts', - url: 'http://example.com/shirts', - description: 'A really cool khaki shirt.', - price: 9.99, - title: 'Khaki Shirt', - test_key: 'value', + event: { + _id: '669141857b8cxxx1ba0da2xx', + cID: '6690fe3655e334xx028xxx', + ts: '2024-07-12T14:45:25+00:00', + ats: '2024-07-12T14:45:25+0000', + a: 'browse', + tzo: -7, + rl: 'a', + UID: '4934ee07118197xx3f74d5xxxx7b0076', + time: '2024-07-12T14:45:25+0000', + action: 'browse', + bmID: '', + first: 0, + properties: { + category: 'Shirts', + url: 'http://example.com/shirts', + description: 'A really cool khaki shirt.', + price: 9.99, + title: 'Khaki Shirt', + test_key: 'value', + }, }, - }, + }), }, source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -76,13 +74,8 @@ export const data = [ batch: [ { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'Cordial', - }, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'Cordial' }, traits: { userId: '6690fe3655e334xx028xxx', email: 'jondoe@example.com', @@ -95,20 +88,21 @@ export const data = [ }, }, createdAt: '2024-07-12T09:58:14+0000', - address: { - city: 'San Miego', - }, + address: { city: 'San Miego' }, first_name: 'John', last_name: 'Doe', lastUpdateSource: 'api', lastModified: '2024-07-12T13:00:49+0000', cID: '6690fe3655e334xx028xxx', }, - externalId: [{ id: '6690fe3655e334xx028xxx', type: 'cordialContactId' }], - }, - integrations: { - Cordial: false, + externalId: [ + { + id: '6690fe3655e334xx028xxx', + type: 'cordialContactId', + }, + ], }, + integrations: { Cordial: false }, type: 'track', event: 'browse', originalTimestamp: '2024-07-12T14:45:25+00:00', @@ -142,154 +136,147 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'cordial', description: 'Multiple object Input event with batched payload', module: 'source', - version: 'v1', + version: 'v2', input: { request: { body: [ { - event: [ - { - contact: { - _id: '633b2fd70a12be027e0b0xxx', - lang_locale: 'EN-US', - channels: { - email: { - address: 'johndoe@example.com', - subscribeStatus: 'none', + request: { + body: JSON.stringify([ + { + contact: { + _id: '633b2fd70a12be027e0b0xxx', + lang_locale: 'EN-US', + channels: { + email: { + address: 'johndoe@example.com', + subscribeStatus: 'none', + }, }, + createdAt: '2022-10-03T18:54:15+0000', + email_sha256_hash: + 'f959bdf883831ebb96612eb9xxxx1e0c9481780adf5f70xxx862155531bf61df', + first_name: 'john', + last_name: 'doe', + lastUpdateSource: 'cordial', + lastModified: '2024-07-24T07:52:46+0000', + cID: '633b2fd70a12be027e0b0xxx', }, - createdAt: '2022-10-03T18:54:15+0000', - email_sha256_hash: - 'f959bdf883831ebb96612eb9xxxx1e0c9481780adf5f70xxx862155531bf61df', - first_name: 'john', - last_name: 'doe', - lastUpdateSource: 'cordial', - lastModified: '2024-07-24T07:52:46+0000', - cID: '633b2fd70a12be027e0b0xxx', - }, - event: { - _id: '66a0b2ce5344b55fxxxc5a64', - cID: '633b2fd70a12be027e0b0xxx', - ts: '2024-07-24T07:52:46+00:00', - ats: '2024-07-24T07:52:39+0000', - g: { - countryISO: 'PL', - country: 'Poland', - state: 'MZ', - city: 'Warszawa', - postalCode: '00-686', - geoLoc: { - lat: 52.22744369506836, - lon: 21.009017944335938, + event: { + _id: '66a0b2ce5344b55fxxxc5a64', + cID: '633b2fd70a12be027e0b0xxx', + ts: '2024-07-24T07:52:46+00:00', + ats: '2024-07-24T07:52:39+0000', + g: { + countryISO: 'PL', + country: 'Poland', + state: 'MZ', + city: 'Warszawa', + postalCode: '00-686', + geoLoc: { + lat: 52.22744369506836, + lon: 21.009017944335938, + }, + tz: 'Europe/Warsaw', }, - tz: 'Europe/Warsaw', - }, - d: { - type: 'computer', - device: 'Macintosh', - platform: 'OS X', - browser: 'Chrome', - robot: false, - }, - a: 'browse', - UID: '471af949fffe749c2ebfxxx950ea73c', - sp: { - bid: 'cf6de7f1-cce5-40xx-ac9c-7c82a2xxc09e', - }, - tzo: -7, - rl: '6', - time: '2024-07-24T07:52:39+0000', - action: 'browse', - bmID: '', - first: 0, - properties: { - url: 'https://aaff-008.dx.commercecloud.salesforce.com/s/UGG-US/cart', - product_item_group_id: ['1094269'], - product_category: ['allproducts'], - product_name: ['wtp ab'], - product_group: ['women'], - }, - }, - }, - { - contact: { - _id: '633b2fd12312be027e0b0xxx', - lang_locale: 'EN-US', - channels: { - email: { - address: 'johndoe1@example.com', - subscribeStatus: 'none', + d: { + type: 'computer', + device: 'Macintosh', + platform: 'OS X', + browser: 'Chrome', + robot: false, + }, + a: 'browse', + UID: '471af949fffe749c2ebfxxx950ea73c', + sp: { bid: 'cf6de7f1-cce5-40xx-ac9c-7c82a2xxc09e' }, + tzo: -7, + rl: '6', + time: '2024-07-24T07:52:39+0000', + action: 'browse', + bmID: '', + first: 0, + properties: { + url: 'https://aaff-008.dx.commercecloud.salesforce.com/s/UGG-US/cart', + product_item_group_id: ['1094269'], + product_category: ['allproducts'], + product_name: ['wtp ab'], + product_group: ['women'], }, }, - createdAt: '2022-10-03T18:54:15+0000', - email_sha256_hash: - 'f95912b883831eab11612eb9xxxx1e0c9481780ad45770xxx862155531bf61df', - first_name: 'john', - last_name: 'doe', - lastUpdateSource: 'cordial', - lastModified: '2024-07-24T07:52:46+0000', - cID: '633b2fd12312be027e0b0xxx', }, - event: { - _id: '66aku0b2ce527b55fx1xc5a64', - cID: '633b2fd12312be027e0b0xxx', - ts: '2024-07-24T07:52:46+00:00', - ats: '2024-07-24T07:52:39+0000', - g: { - countryISO: 'PL', - country: 'Poland', - state: 'MZ', - city: 'Warszawa', - postalCode: '00-686', - geoLoc: { - lat: 52.22744369506836, - lon: 21.009017944335938, + { + contact: { + _id: '633b2fd12312be027e0b0xxx', + lang_locale: 'EN-US', + channels: { + email: { + address: 'johndoe1@example.com', + subscribeStatus: 'none', + }, }, - tz: 'Europe/Warsaw', - }, - d: { - type: 'computer', - device: 'Macintosh', - platform: 'OS X', - browser: 'Chrome', - robot: false, - }, - a: 'browse', - UID: '471af949fffe74sdh382ebfxxx950ea73c', - sp: { - bid: 'cf6de7f1-123ce5-20xx-ac9c-7c82a2xxc09e', + createdAt: '2022-10-03T18:54:15+0000', + email_sha256_hash: + 'f95912b883831eab11612eb9xxxx1e0c9481780ad45770xxx862155531bf61df', + first_name: 'john', + last_name: 'doe', + lastUpdateSource: 'cordial', + lastModified: '2024-07-24T07:52:46+0000', + cID: '633b2fd12312be027e0b0xxx', }, - tzo: -7, - rl: '6', - time: '2024-07-24T07:52:39+0000', - action: 'browse', - bmID: '', - first: 0, - properties: { - url: 'https://aaff-008.dx.commercecloud.salesforce.com/s/UGG-US/cart', - product_item_group_id: ['1094269'], - product_category: ['allproducts'], - product_name: ['wtp ab'], - product_group: ['women'], + event: { + _id: '66aku0b2ce527b55fx1xc5a64', + cID: '633b2fd12312be027e0b0xxx', + ts: '2024-07-24T07:52:46+00:00', + ats: '2024-07-24T07:52:39+0000', + g: { + countryISO: 'PL', + country: 'Poland', + state: 'MZ', + city: 'Warszawa', + postalCode: '00-686', + geoLoc: { + lat: 52.22744369506836, + lon: 21.009017944335938, + }, + tz: 'Europe/Warsaw', + }, + d: { + type: 'computer', + device: 'Macintosh', + platform: 'OS X', + browser: 'Chrome', + robot: false, + }, + a: 'browse', + UID: '471af949fffe74sdh382ebfxxx950ea73c', + sp: { bid: 'cf6de7f1-123ce5-20xx-ac9c-7c82a2xxc09e' }, + tzo: -7, + rl: '6', + time: '2024-07-24T07:52:39+0000', + action: 'browse', + bmID: '', + first: 0, + properties: { + url: 'https://aaff-008.dx.commercecloud.salesforce.com/s/UGG-US/cart', + product_item_group_id: ['1094269'], + product_category: ['allproducts'], + product_name: ['wtp ab'], + product_group: ['women'], + }, }, }, - }, - ], + ]), + }, source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -302,13 +289,8 @@ export const data = [ batch: [ { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'Cordial', - }, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'Cordial' }, traits: { userId: '633b2fd70a12be027e0b0xxx', email: 'johndoe@example.com', @@ -336,11 +318,14 @@ export const data = [ browser: 'Chrome', robot: false, }, - externalId: [{ id: '633b2fd70a12be027e0b0xxx', type: 'cordialContactId' }], - }, - integrations: { - Cordial: false, + externalId: [ + { + id: '633b2fd70a12be027e0b0xxx', + type: 'cordialContactId', + }, + ], }, + integrations: { Cordial: false }, type: 'track', event: 'browse', properties: { @@ -367,9 +352,7 @@ export const data = [ }, a: 'browse', UID: '471af949fffe749c2ebfxxx950ea73c', - sp: { - bid: 'cf6de7f1-cce5-40xx-ac9c-7c82a2xxc09e', - }, + sp: { bid: 'cf6de7f1-cce5-40xx-ac9c-7c82a2xxc09e' }, tzo: -7, rl: '6', time: '2024-07-24T07:52:39+0000', @@ -384,13 +367,8 @@ export const data = [ }, { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'Cordial', - }, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'Cordial' }, traits: { userId: '633b2fd12312be027e0b0xxx', email: 'johndoe1@example.com', @@ -418,11 +396,14 @@ export const data = [ browser: 'Chrome', robot: false, }, - externalId: [{ id: '633b2fd12312be027e0b0xxx', type: 'cordialContactId' }], - }, - integrations: { - Cordial: false, + externalId: [ + { + id: '633b2fd12312be027e0b0xxx', + type: 'cordialContactId', + }, + ], }, + integrations: { Cordial: false }, type: 'track', event: 'browse', properties: { @@ -449,9 +430,7 @@ export const data = [ }, a: 'browse', UID: '471af949fffe74sdh382ebfxxx950ea73c', - sp: { - bid: 'cf6de7f1-123ce5-20xx-ac9c-7c82a2xxc09e', - }, + sp: { bid: 'cf6de7f1-123ce5-20xx-ac9c-7c82a2xxc09e' }, tzo: -7, rl: '6', time: '2024-07-24T07:52:39+0000', @@ -470,74 +449,69 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'cordial', description: 'Simple Single object Input event with no CId', module: 'source', - version: 'v1', + version: 'v2', input: { request: { body: [ { - event: { - contact: { - _id: '6690fe3655e334xx028xx1', - channels: { - email: { - address: 'jondoe@example.com', - subscribeStatus: 'subscribed', - subscribedAt: '2024-07-12T09:58:14+0000', + request: { + body: JSON.stringify({ + contact: { + _id: '6690fe3655e334xx028xx1', + channels: { + email: { + address: 'jondoe@example.com', + subscribeStatus: 'subscribed', + subscribedAt: '2024-07-12T09:58:14+0000', + }, }, + createdAt: '2024-07-12T09:58:14+0000', + address: { city: 'San Miego' }, + first_name: 'John', + last_name: 'Doe', + lastUpdateSource: 'api', + lastModified: '2024-07-12T13:00:49+0000', }, - createdAt: '2024-07-12T09:58:14+0000', - address: { - city: 'San Miego', - }, - first_name: 'John', - last_name: 'Doe', - lastUpdateSource: 'api', - lastModified: '2024-07-12T13:00:49+0000', - }, - event: { - _id: '669141857b8cxxx1ba0da2x1', - ts: '2024-07-12T14:45:25+00:00', - ats: '2024-07-12T14:45:25+0000', - d: { - type: 'computer', - device: false, - platform: false, - browser: false, - robot: true, - }, - a: 'browse', - tzo: -7, - rl: 'a', - UID: '4934ee07197xx3f74d5xxxx7b0076', - time: '2024-07-12T14:45:25+0000', - action: 'browse', - bmID: '', - first: 0, - properties: { - category: 'Shirts', - url: 'http://example.com/shirts', - description: 'A really cool khaki shirt.', - price: 9.99, - title: 'Khaki Shirt', - test_key: 'value', + event: { + _id: '669141857b8cxxx1ba0da2x1', + ts: '2024-07-12T14:45:25+00:00', + ats: '2024-07-12T14:45:25+0000', + d: { + type: 'computer', + device: false, + platform: false, + browser: false, + robot: true, + }, + a: 'browse', + tzo: -7, + rl: 'a', + UID: '4934ee07197xx3f74d5xxxx7b0076', + time: '2024-07-12T14:45:25+0000', + action: 'browse', + bmID: '', + first: 0, + properties: { + category: 'Shirts', + url: 'http://example.com/shirts', + description: 'A really cool khaki shirt.', + price: 9.99, + title: 'Khaki Shirt', + test_key: 'value', + }, }, - }, + }), }, source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -550,13 +524,8 @@ export const data = [ batch: [ { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'Cordial', - }, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'Cordial' }, traits: { userId: '6690fe3655e334xx028xx1', email: 'jondoe@example.com', @@ -569,9 +538,7 @@ export const data = [ }, }, createdAt: '2024-07-12T09:58:14+0000', - address: { - city: 'San Miego', - }, + address: { city: 'San Miego' }, first_name: 'John', last_name: 'Doe', lastUpdateSource: 'api', @@ -586,9 +553,7 @@ export const data = [ }, externalId: [], }, - integrations: { - Cordial: false, - }, + integrations: { Cordial: false }, type: 'track', event: 'browse', originalTimestamp: '2024-07-12T14:45:25+00:00', @@ -621,8 +586,10 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, -]; +].map((tc) => ({ + ...tc, + mockFns: () => { + defaultMockFns(); + }, +})); diff --git a/test/integrations/sources/customerio/data.ts b/test/integrations/sources/customerio/data.ts index b831b1d0b07..ee4df648619 100644 --- a/test/integrations/sources/customerio/data.ts +++ b/test/integrations/sources/customerio/data.ts @@ -9,20 +9,25 @@ export const data = [ name: 'customerio', description: 'test-0', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - customer_id: '0200102', - identifiers: { id: '0200102' }, - email_address: 'test@example.com', + request: { + body: JSON.stringify({ + data: { + customer_id: '0200102', + identifiers: { id: '0200102' }, + email_address: 'test@example.com', + }, + event_id: '01E4C4CT6YDC7Y5M7FE1GWWPQJ', + object_type: 'customer', + metric: 'subscribed', + timestamp: 'abc', + }), }, - event_id: '01E4C4CT6YDC7Y5M7FE1GWWPQJ', - object_type: 'customer', - metric: 'subscribed', - timestamp: 'abc', + source: {}, }, ], method: 'POST', @@ -60,20 +65,25 @@ export const data = [ name: 'customerio', description: 'test-1', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - customer_id: '0200102', - identifiers: { id: '0200102' }, - email_address: 'test@example.com', + request: { + body: JSON.stringify({ + data: { + customer_id: '0200102', + identifiers: { id: '0200102' }, + email_address: 'test@example.com', + }, + event_id: '01E4C4CT6YDC7Y5M7FE1GWWPQJ', + object_type: 'customer', + metric: 'subscribed', + timestamp: '1585250199', + }), }, - event_id: '01E4C4CT6YDC7Y5M7FE1GWWPQJ', - object_type: 'customer', - metric: 'subscribed', - timestamp: '1585250199', + source: {}, }, ], method: 'POST', @@ -111,20 +121,25 @@ export const data = [ name: 'customerio', description: 'test-2', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - customer_id: '0200102', - identifiers: { id: '0200102' }, - email_address: 'test@example.com', + request: { + body: JSON.stringify({ + data: { + customer_id: '0200102', + identifiers: { id: '0200102' }, + email_address: 'test@example.com', + }, + event_id: '01E4C4CT6YDC7Y5M7FE1GWWPQJ', + object_type: 'customer', + metric: 'subscribed', + timestamp: 1585250199, + }), }, - event_id: '01E4C4CT6YDC7Y5M7FE1GWWPQJ', - object_type: 'customer', - metric: 'subscribed', - timestamp: 1585250199, + source: {}, }, ], method: 'POST', @@ -164,20 +179,25 @@ export const data = [ name: 'customerio', description: 'test-3', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - customer_id: '0200102', - identifiers: { id: '0200102' }, - email_address: 'test@example.com', + request: { + body: JSON.stringify({ + data: { + customer_id: '0200102', + identifiers: { id: '0200102' }, + email_address: 'test@example.com', + }, + event_id: '01E4C4C6P79C12J5A6KPE6XNFD', + object_type: 'customer', + metric: 'unsubscribed', + timestamp: 1585250179, + }), }, - event_id: '01E4C4C6P79C12J5A6KPE6XNFD', - object_type: 'customer', - metric: 'unsubscribed', - timestamp: 1585250179, + source: {}, }, ], method: 'POST', @@ -217,22 +237,27 @@ export const data = [ name: 'customerio', description: 'test-4', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 36, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgABcRhIBqSp7kiPekGBIeVh', + request: { + body: JSON.stringify({ + data: { + action_id: 36, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgABcRhIBqSp7kiPekGBIeVh', + }, + event_id: '01E4C4G1S0AMNG0XVF2M7RPH5S', + object_type: 'email', + metric: 'drafted', + timestamp: 1585250305, + }), }, - event_id: '01E4C4G1S0AMNG0XVF2M7RPH5S', - object_type: 'email', - metric: 'drafted', - timestamp: 1585250305, + source: {}, }, ], method: 'POST', @@ -276,25 +301,30 @@ export const data = [ name: 'customerio', description: 'test-5', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - content_id: 1146, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RMehBAAAAXE7r_ONUGXly9DBGkpq1JS31=', - failure_message: '550 5.5.0 Requested action not taken: mailbox unavailable', - newsletter_id: 736, - recipient: 'test@example.com', - subject: 'Thanks for joining!', + request: { + body: JSON.stringify({ + data: { + content_id: 1146, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RMehBAAAAXE7r_ONUGXly9DBGkpq1JS31=', + failure_message: '550 5.5.0 Requested action not taken: mailbox unavailable', + newsletter_id: 736, + recipient: 'test@example.com', + subject: 'Thanks for joining!', + }, + event_id: '12ASDG7S9P6MAZPTJ78DAND9GDC', + object_type: 'email', + metric: 'bounced', + timestamp: 1234567890, + }), }, - event_id: '12ASDG7S9P6MAZPTJ78DAND9GDC', - object_type: 'email', - metric: 'bounced', - timestamp: 1234567890, + source: {}, }, ], method: 'POST', @@ -341,26 +371,31 @@ export const data = [ name: 'customerio', description: 'test-6', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 36, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgABcRhIBqSp7kiPekGBIeVh', - href: 'http://google.com', - link_id: 1, - recipient: 'test@example.com', - subject: 'hello', + request: { + body: JSON.stringify({ + data: { + action_id: 36, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgABcRhIBqSp7kiPekGBIeVh', + href: 'http://google.com', + link_id: 1, + recipient: 'test@example.com', + subject: 'hello', + }, + event_id: '01E4C8BES5XT87ZWRJFTB35YJ3', + object_type: 'email', + metric: 'clicked', + timestamp: 1585254348, + }), }, - event_id: '01E4C8BES5XT87ZWRJFTB35YJ3', - object_type: 'email', - metric: 'clicked', - timestamp: 1585254348, + source: {}, }, ], method: 'POST', @@ -407,26 +442,31 @@ export const data = [ name: 'customerio', description: 'test-7', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 42, - campaign_id: 23, - content: 'Welcome to the club, we are with you.', - customer_id: 'user-123', - delivery_id: 'RAECAAFwnUSneIa0ZXkmq8EdkAM==', - headers: { 'Custom-Header': ['custom-value'] }, - identifiers: { id: 'user-123' }, - recipient: 'test@example.com', - subject: 'Thanks for signing up', + request: { + body: JSON.stringify({ + data: { + action_id: 42, + campaign_id: 23, + content: 'Welcome to the club, we are with you.', + customer_id: 'user-123', + delivery_id: 'RAECAAFwnUSneIa0ZXkmq8EdkAM==', + headers: { 'Custom-Header': ['custom-value'] }, + identifiers: { id: 'user-123' }, + recipient: 'test@example.com', + subject: 'Thanks for signing up', + }, + event_id: '01E2EMRMM6TZ12TF9WGZN0WJQT', + metric: 'sent', + object_type: 'email', + timestamp: 1644227937, + }), }, - event_id: '01E2EMRMM6TZ12TF9WGZN0WJQT', - metric: 'sent', - object_type: 'email', - timestamp: 1644227937, + source: {}, }, ], method: 'POST', @@ -473,23 +513,28 @@ export const data = [ name: 'customerio', description: 'test-8', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - customer_id: 'user-123', - delivery_id: 'REAC4wUAAYYJgQgkyRqwwEPeOA6Nfv==', - identifiers: { cio_id: '7ef807109981', id: 'user-123' }, - recipient: 'test@example.com', - subject: 'Thanks for signing up', - transactional_message_id: 2, + request: { + body: JSON.stringify({ + data: { + customer_id: 'user-123', + delivery_id: 'REAC4wUAAYYJgQgkyRqwwEPeOA6Nfv==', + identifiers: { cio_id: '7ef807109981', id: 'user-123' }, + recipient: 'test@example.com', + subject: 'Thanks for signing up', + transactional_message_id: 2, + }, + event_id: '01ER4R5WB62QWCNREKFB4DYXGR', + metric: 'delivered', + object_type: 'email', + timestamp: 1675196819, + }), }, - event_id: '01ER4R5WB62QWCNREKFB4DYXGR', - metric: 'delivered', - object_type: 'email', - timestamp: 1675196819, + source: {}, }, ], method: 'POST', @@ -508,7 +553,10 @@ export const data = [ context: { library: { name: 'unknown', version: 'unknown' }, integration: { name: 'Customer.io' }, - traits: { cioId: '7ef807109981', email: 'test@example.com' }, + traits: { + cioId: '7ef807109981', + email: 'test@example.com', + }, }, integrations: { 'Customer.io': false }, type: 'track', @@ -534,23 +582,28 @@ export const data = [ name: 'customerio', description: 'test-9', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 38, - campaign_id: 6, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RAEABQFxN56fWzydfV4_EGvfobI=', - failure_message: 'NoDevicesSynced', + request: { + body: JSON.stringify({ + data: { + action_id: 38, + campaign_id: 6, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RAEABQFxN56fWzydfV4_EGvfobI=', + failure_message: 'NoDevicesSynced', + }, + event_id: '01E4VSX8SZ0T9AQMH4Q16NRB89', + object_type: 'push', + metric: 'attempted', + timestamp: 1585776075, + }), }, - event_id: '01E4VSX8SZ0T9AQMH4Q16NRB89', - object_type: 'push', - metric: 'attempted', - timestamp: 1585776075, + source: {}, }, ], method: 'POST', @@ -595,29 +648,34 @@ export const data = [ name: 'customerio', description: 'test-10', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 37, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgUBcRhIBqSfeiIwdIYJKxTY', - recipients: [ - { - device_id: - 'eeC2XC_NVPo:APA91bEYRSgmu-dAZcOWi7RzKBbT9gdY3WJACOpLQEMAmAOsChJMAZWirvSlSF3EuHxb7qdwlYeOyCWtbsnR14Vyx5nwBmg5J3SyPxfNn-ey1tNgXIj5UOq8IBk2VwzMApk-xzD4JJof', - device_platform: 'android', + request: { + body: JSON.stringify({ + data: { + action_id: 37, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgUBcRhIBqSfeiIwdIYJKxTY', + recipients: [ + { + device_id: + 'eeC2XC_NVPo:APA91bEYRSgmu-dAZcOWi7RzKBbT9gdY3WJACOpLQEMAmAOsChJMAZWirvSlSF3EuHxb7qdwlYeOyCWtbsnR14Vyx5nwBmg5J3SyPxfNn-ey1tNgXIj5UOq8IBk2VwzMApk-xzD4JJof', + device_platform: 'android', + }, + ], }, - ], + event_id: '01E4C4HDQ7P1X9KTKF0ZX7PWHE', + object_type: 'push', + metric: 'sent', + timestamp: 1585250350, + }), }, - event_id: '01E4C4HDQ7P1X9KTKF0ZX7PWHE', - object_type: 'push', - metric: 'sent', - timestamp: 1585250350, + source: {}, }, ], method: 'POST', @@ -668,30 +726,35 @@ export const data = [ name: 'customerio', description: 'test-11', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 37, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgUBcRhIBqSfeiIwdIYJKxTY', - href: 'ciosas://product/2', - link_id: 1, - recipients: [ - { - device_id: - 'eeC2XC_NVPo:APA91bEYRSgmu-dAZcOWi7RzKBbT9gdY3WJACOpLQEMAmAOsChJMAZWirvSlSF3EuHxb7qdwlYeOyCWtbsnR14Vyx5nwBmg5J3SyPxfNn-ey1tNgXIj5UOq8IBk2VwzMApk-xzD4JJof', + request: { + body: JSON.stringify({ + data: { + action_id: 37, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgUBcRhIBqSfeiIwdIYJKxTY', + href: 'ciosas://product/2', + link_id: 1, + recipients: [ + { + device_id: + 'eeC2XC_NVPo:APA91bEYRSgmu-dAZcOWi7RzKBbT9gdY3WJACOpLQEMAmAOsChJMAZWirvSlSF3EuHxb7qdwlYeOyCWtbsnR14Vyx5nwBmg5J3SyPxfNn-ey1tNgXIj5UOq8IBk2VwzMApk-xzD4JJof', + }, + ], }, - ], + event_id: '01E4V2SBHYK4TNTG8WKMP39G9R', + object_type: 'push', + metric: 'clicked', + timestamp: 1585751829, + }), }, - event_id: '01E4V2SBHYK4TNTG8WKMP39G9R', - object_type: 'push', - metric: 'clicked', - timestamp: 1585751829, + source: {}, }, ], method: 'POST', @@ -742,24 +805,29 @@ export const data = [ name: 'customerio', description: 'test-12', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 41, - campaign_id: 7, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'ROk1AAIBcR4iT6mueuxiDtzO8HXv', - failure_message: - "Twilio Error 21408: Permission to send an SMS has not been enabled for the region indicated by the 'To' number: +18008675309.", + request: { + body: JSON.stringify({ + data: { + action_id: 41, + campaign_id: 7, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'ROk1AAIBcR4iT6mueuxiDtzO8HXv', + failure_message: + "Twilio Error 21408: Permission to send an SMS has not been enabled for the region indicated by the 'To' number: +18008675309.", + }, + event_id: '01E4F3DCS83P8HT7R3E6DWQN1X', + object_type: 'sms', + metric: 'attempted', + timestamp: 1234567890, + }), }, - event_id: '01E4F3DCS83P8HT7R3E6DWQN1X', - object_type: 'sms', - metric: 'attempted', - timestamp: 1234567890, + source: {}, }, ], method: 'POST', @@ -805,25 +873,30 @@ export const data = [ name: 'customerio', description: 'test-13', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 38, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgIBcRh6qzHz-8gKvscP2UZa', - href: 'https://app.com/verify', - link_id: 1, - recipient: '+18008675309', + request: { + body: JSON.stringify({ + data: { + action_id: 38, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgIBcRh6qzHz-8gKvscP2UZa', + href: 'https://app.com/verify', + link_id: 1, + recipient: '+18008675309', + }, + event_id: '01E4XXPN42JDF4B1ATQKTZ8WHV', + object_type: 'sms', + metric: 'clicked', + timestamp: 1585847161, + }), }, - event_id: '01E4XXPN42JDF4B1ATQKTZ8WHV', - object_type: 'sms', - metric: 'clicked', - timestamp: 1585847161, + source: {}, }, ], method: 'POST', @@ -869,23 +942,28 @@ export const data = [ name: 'customerio', description: 'test-14', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 39, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgQBcRhNAufb0s30bmz5HD7Y', - recipient: '#signups', + request: { + body: JSON.stringify({ + data: { + action_id: 39, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgQBcRhNAufb0s30bmz5HD7Y', + recipient: '#signups', + }, + event_id: '01E4C4TQKD6KJ274870J5DE2HB', + object_type: 'slack', + metric: 'sent', + timestamp: 1585250655, + }), }, - event_id: '01E4C4TQKD6KJ274870J5DE2HB', - object_type: 'slack', - metric: 'sent', - timestamp: 1585250655, + source: {}, }, ], method: 'POST', @@ -930,25 +1008,30 @@ export const data = [ name: 'customerio', description: 'test-15', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 39, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgQBcRhocpCJE3mFfwvRzNe6', - href: 'http://bing.com', - link_id: 1, - recipient: '#signups', + request: { + body: JSON.stringify({ + data: { + action_id: 39, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgQBcRhocpCJE3mFfwvRzNe6', + href: 'http://bing.com', + link_id: 1, + recipient: '#signups', + }, + event_id: '01E4C6HJTBNDX18XC4B88M3Y2G', + object_type: 'slack', + metric: 'clicked', + timestamp: 1585252451, + }), }, - event_id: '01E4C6HJTBNDX18XC4B88M3Y2G', - object_type: 'slack', - metric: 'clicked', - timestamp: 1585252451, + source: {}, }, ], method: 'POST', @@ -994,23 +1077,28 @@ export const data = [ name: 'customerio', description: 'test-16', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 39, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgQBcRhIBqRiZAc0fyQiLvkC', - failure_message: 'value passed for channel was invalid', + request: { + body: JSON.stringify({ + data: { + action_id: 39, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgQBcRhIBqRiZAc0fyQiLvkC', + failure_message: 'value passed for channel was invalid', + }, + event_id: '01E4C4HDQ77BCN0X23Z3WBE764', + object_type: 'slack', + metric: 'failed', + timestamp: 1585250350, + }), }, - event_id: '01E4C4HDQ77BCN0X23Z3WBE764', - object_type: 'slack', - metric: 'failed', - timestamp: 1585250350, + source: {}, }, ], method: 'POST', @@ -1055,22 +1143,27 @@ export const data = [ name: 'customerio', description: 'test-17', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 40, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgEBcRhIBqSrYcXDr2ks6Pj9', + request: { + body: JSON.stringify({ + data: { + action_id: 40, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgEBcRhIBqSrYcXDr2ks6Pj9', + }, + event_id: '01E4C4G1S04QCV1NASF4NWMQNR', + object_type: 'webhook', + metric: 'drafted', + timestamp: 1585250305, + }), }, - event_id: '01E4C4G1S04QCV1NASF4NWMQNR', - object_type: 'webhook', - metric: 'drafted', - timestamp: 1585250305, + source: {}, }, ], method: 'POST', @@ -1114,23 +1207,28 @@ export const data = [ name: 'customerio', description: 'test-18', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 38, - broadcast_id: 6, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RAECAQFxNeUBx6LqgjqrN1j-BJc=', - failure_message: "Variable 'customer.test' is missing", + request: { + body: JSON.stringify({ + data: { + action_id: 38, + broadcast_id: 6, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RAECAQFxNeUBx6LqgjqrN1j-BJc=', + failure_message: "Variable 'customer.test' is missing", + }, + event_id: '01E4TYA2KA9T0XGHCRJ784B774', + object_type: 'webhook', + metric: 'attempted', + timestamp: 1585747134, + }), }, - event_id: '01E4TYA2KA9T0XGHCRJ784B774', - object_type: 'webhook', - metric: 'attempted', - timestamp: 1585747134, + source: {}, }, ], method: 'POST', @@ -1175,23 +1273,28 @@ export const data = [ name: 'customerio', description: 'test-19', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 40, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgEBcRhNAufr2aU82jtDZEh6', - recipient: 'https://test.example.com/process', + request: { + body: JSON.stringify({ + data: { + action_id: 40, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgEBcRhNAufr2aU82jtDZEh6', + recipient: 'https://test.example.com/process', + }, + event_id: '01E4C6EP0HCKRHKFARMZ5XEH7A', + object_type: 'webhook', + metric: 'sent', + timestamp: 1585252357, + }), }, - event_id: '01E4C6EP0HCKRHKFARMZ5XEH7A', - object_type: 'webhook', - metric: 'sent', - timestamp: 1585252357, + source: {}, }, ], method: 'POST', @@ -1236,25 +1339,30 @@ export const data = [ name: 'customerio', description: 'test-20', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 40, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgEBcRhNAufr2aU82jtDZEh6', - href: 'http://bing.com', - link_id: 1, - recipient: 'https://test.example.com/process', + request: { + body: JSON.stringify({ + data: { + action_id: 40, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgEBcRhNAufr2aU82jtDZEh6', + href: 'http://bing.com', + link_id: 1, + recipient: 'https://test.example.com/process', + }, + event_id: '01E4C6F5N1Y54TVGJTN64Y1ZS9', + object_type: 'webhook', + metric: 'clicked', + timestamp: 1585252373, + }), }, - event_id: '01E4C6F5N1Y54TVGJTN64Y1ZS9', - object_type: 'webhook', - metric: 'clicked', - timestamp: 1585252373, + source: {}, }, ], method: 'POST', @@ -1300,23 +1408,28 @@ export const data = [ name: 'customerio', description: 'test-21', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 38, - broadcast_id: 6, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RAECAQFxNeK3bC4SYqhQqFGBQrQ=', - failure_message: 'HTTP 404 Not Found []', + request: { + body: JSON.stringify({ + data: { + action_id: 38, + broadcast_id: 6, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RAECAQFxNeK3bC4SYqhQqFGBQrQ=', + failure_message: 'HTTP 404 Not Found []', + }, + event_id: '01E4TY5FVB0ZQ4KVDKRME0XSYZ', + object_type: 'webhook', + metric: 'failed', + timestamp: 1585746984, + }), }, - event_id: '01E4TY5FVB0ZQ4KVDKRME0XSYZ', - object_type: 'webhook', - metric: 'failed', - timestamp: 1585746984, + source: {}, }, ], method: 'POST', @@ -1361,30 +1474,35 @@ export const data = [ name: 'customerio', description: 'test-22', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - action_id: 37, - broadcast_id: 9, - customer_id: '0200102', - identifiers: { id: '0200102' }, - delivery_id: 'RPILAgUBcRhIBqSfeiIwdIYJKxTY', - href: 'ciosas://product/2', - link_id: 1, - recipients: [ - { - device_id: - 'eeC2XC_NVPo:APA91bEYRSgmu-dAZcOWi7RzKBbT9gdY3WJACOpLQEMAmAOsChJMAZWirvSlSF3EuHxb7qdwlYeOyCWtbsnR14Vyx5nwBmg5J3SyPxfNn-ey1tNgXIj5UOq8IBk2VwzMApk-xzD4JJof', + request: { + body: JSON.stringify({ + data: { + action_id: 37, + broadcast_id: 9, + customer_id: '0200102', + identifiers: { id: '0200102' }, + delivery_id: 'RPILAgUBcRhIBqSfeiIwdIYJKxTY', + href: 'ciosas://product/2', + link_id: 1, + recipients: [ + { + device_id: + 'eeC2XC_NVPo:APA91bEYRSgmu-dAZcOWi7RzKBbT9gdY3WJACOpLQEMAmAOsChJMAZWirvSlSF3EuHxb7qdwlYeOyCWtbsnR14Vyx5nwBmg5J3SyPxfNn-ey1tNgXIj5UOq8IBk2VwzMApk-xzD4JJof', + }, + ], }, - ], + event_id: '01E4V2SBHYK4TNTG8WKMP39G9S', + object_type: 'push', + metric: 'delivered', + timestamp: 1585751830, + }), }, - event_id: '01E4V2SBHYK4TNTG8WKMP39G9S', - object_type: 'push', - metric: 'delivered', - timestamp: 1585751830, + source: {}, }, ], method: 'POST', @@ -1435,20 +1553,25 @@ export const data = [ name: 'customerio', description: 'test-23: email subscribed', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - data: { - customer_id: '0200102', - identifiers: { id: '0200102' }, - email_address: 'test@example.com', + request: { + body: JSON.stringify({ + data: { + customer_id: '0200102', + identifiers: { id: '0200102' }, + email_address: 'test@example.com', + }, + event_id: '01E4C4C6P79C12J5A6KPE6XNFD', + object_type: 'email', + metric: 'subscribed', + timestamp: 1585250179, + }), }, - event_id: '01E4C4C6P79C12J5A6KPE6XNFD', - object_type: 'email', - metric: 'subscribed', - timestamp: 1585250179, + source: {}, }, ], method: 'POST', diff --git a/test/integrations/sources/facebook_lead_ads/data.ts b/test/integrations/sources/facebook_lead_ads/data.ts new file mode 100644 index 00000000000..e54d0662426 --- /dev/null +++ b/test/integrations/sources/facebook_lead_ads/data.ts @@ -0,0 +1,608 @@ +import utils from '../../../../src/v0/util'; + +const defaultMockFns = () => { + jest.spyOn(utils, 'generateUUID').mockReturnValue('dummy-anonymous-id-0-0'); +}; + +export const data = [ + { + name: 'facebook_lead_ads', + description: 'facebook lead ads with facebook_lead_id', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify({ + available_at_this_time: ['2025-02-01T00:00:00+0530'], + city: ['Bengaluru'], + conditional_question_1: ['Sweatshirt'], + conditional_question_2: ['Black'], + conditional_question_3: ['Medium'], + country: ['IN'], + created_time: ['02/01/2025 10:20'], + date_of_birth: ['01/01/2000'], + facebook_lead_id: ['3960271960958574'], + first_name: ['Dummy'], + last_name: ['Name'], + military_status: ['na'], + phone_number: ['+910123456789'], + post_code: [200000], + relationship_status: ['na'], + 'short_answer_ques_1?': ['dummy short answer'], + state: ['Dummy State'], + street_address: ['Dummy Street'], + 'test_ques_1?': ['test ques'], + }), + }, + source: {}, + }, + ], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + batch: [ + { + context: { + integration: { + name: 'FacebookLeadAds', + }, + library: { + name: 'unknown', + version: 'unknown', + }, + traits: { + address: { + city: 'Bengaluru', + country: 'IN', + postalCode: 200000, + state: 'Dummy State', + street: 'Dummy Street', + }, + available_at_this_time: '2025-02-01T00:00:00+0530', + birthday: '01/01/2000', + city: 'Bengaluru', + conditional_question_1: 'Sweatshirt', + conditional_question_2: 'Black', + conditional_question_3: 'Medium', + country: 'IN', + created_time: '02/01/2025 10:20', + date_of_birth: '01/01/2000', + facebook_lead_id: '3960271960958574', + firstName: 'Dummy', + first_name: 'Dummy', + lastName: 'Name', + last_name: 'Name', + military_status: 'na', + phone: '+910123456789', + phone_number: '+910123456789', + post_code: 200000, + relationship_status: 'na', + 'short_answer_ques_1?': 'dummy short answer', + state: 'Dummy State', + street_address: 'Dummy Street', + 'test_ques_1?': 'test ques', + }, + }, + integrations: { + FacebookLeadAds: false, + }, + originalTimestamp: '2025-02-01T10:20:00.000Z', + type: 'identify', + userId: '3960271960958574', + }, + ], + }, + }, + ], + }, + }, + }, + { + name: 'facebook_lead_ads', + description: 'facebook lead ads with valid created_time', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify({ + available_at_this_time: ['2025-02-01T00:00:00+0530'], + city: ['Bengaluru'], + conditional_question_1: ['Sweatshirt'], + conditional_question_2: ['Black'], + conditional_question_3: ['Medium'], + country: ['IN'], + created_time: ['02/01/2025 10:20'], + date_of_birth: ['01/01/2000'], + facebook_lead_id: ['3960271960958574'], + first_name: ['Dummy'], + id: ['3960271960958574'], + last_name: ['Name'], + military_status: ['na'], + phone_number: ['+910123456789'], + post_code: ['200000'], + relationship_status: ['na'], + 'short_answer_ques_1?': ['dummy short answer'], + state: ['Dummy State'], + street_address: ['Dummy Street'], + 'test_ques_1?': ['test ques'], + }), + }, + source: {}, + }, + ], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + batch: [ + { + context: { + integration: { + name: 'FacebookLeadAds', + }, + library: { + name: 'unknown', + version: 'unknown', + }, + traits: { + address: { + city: 'Bengaluru', + country: 'IN', + postalCode: '200000', + state: 'Dummy State', + street: 'Dummy Street', + }, + available_at_this_time: '2025-02-01T00:00:00+0530', + birthday: '01/01/2000', + city: 'Bengaluru', + conditional_question_1: 'Sweatshirt', + conditional_question_2: 'Black', + conditional_question_3: 'Medium', + country: 'IN', + created_time: '02/01/2025 10:20', + date_of_birth: '01/01/2000', + facebook_lead_id: '3960271960958574', + firstName: 'Dummy', + first_name: 'Dummy', + id: '3960271960958574', + lastName: 'Name', + last_name: 'Name', + military_status: 'na', + phone: '+910123456789', + phone_number: '+910123456789', + post_code: '200000', + relationship_status: 'na', + 'short_answer_ques_1?': 'dummy short answer', + state: 'Dummy State', + street_address: 'Dummy Street', + 'test_ques_1?': 'test ques', + }, + }, + integrations: { + FacebookLeadAds: false, + }, + originalTimestamp: '2025-02-01T10:20:00.000Z', + type: 'identify', + userId: '3960271960958574', + }, + ], + }, + }, + ], + }, + }, + }, + { + name: 'facebook_lead_ads', + description: 'facebook lead ads without userId', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify({ + available_at_this_time: ['2025-02-01T00:00:00+0530'], + city: ['Bengaluru'], + conditional_question_1: ['Sweatshirt'], + conditional_question_2: ['Black'], + conditional_question_3: ['Medium'], + country: ['IN'], + created_time: ['02/01/2025 10:20'], + date_of_birth: ['01/01/2000'], + first_name: ['Dummy'], + last_name: ['Name'], + military_status: ['na'], + phone_number: ['+910123456789'], + post_code: ['200000'], + relationship_status: ['na'], + 'short_answer_ques_1?': ['dummy short answer'], + state: ['Dummy State'], + street_address: ['Dummy Street'], + 'test_ques_1?': ['test ques'], + }), + }, + source: {}, + }, + ], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + batch: [ + { + context: { + integration: { + name: 'FacebookLeadAds', + }, + library: { + name: 'unknown', + version: 'unknown', + }, + traits: { + address: { + city: 'Bengaluru', + country: 'IN', + postalCode: '200000', + state: 'Dummy State', + street: 'Dummy Street', + }, + available_at_this_time: '2025-02-01T00:00:00+0530', + birthday: '01/01/2000', + city: 'Bengaluru', + conditional_question_1: 'Sweatshirt', + conditional_question_2: 'Black', + conditional_question_3: 'Medium', + country: 'IN', + created_time: '02/01/2025 10:20', + date_of_birth: '01/01/2000', + firstName: 'Dummy', + first_name: 'Dummy', + lastName: 'Name', + last_name: 'Name', + military_status: 'na', + phone: '+910123456789', + phone_number: '+910123456789', + post_code: '200000', + relationship_status: 'na', + 'short_answer_ques_1?': 'dummy short answer', + state: 'Dummy State', + street_address: 'Dummy Street', + 'test_ques_1?': 'test ques', + }, + }, + integrations: { + FacebookLeadAds: false, + }, + originalTimestamp: '2025-02-01T10:20:00.000Z', + anonymousId: 'dummy-anonymous-id-0-0', + type: 'identify', + }, + ], + }, + }, + ], + }, + }, + }, + { + name: 'facebook_lead_ads', + description: 'facebook lead ads with invalid created_time', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify({ + available_at_this_time: ['2025-02-01T00:00:00+0530'], + city: ['Bengaluru'], + conditional_question_1: ['Sweatshirt'], + conditional_question_2: ['Black'], + conditional_question_3: ['Medium'], + country: ['IN'], + created_time: ['02/01/2025 invalid 10:20'], + date_of_birth: ['01/01/2000'], + facebook_lead_id: ['3960271960958574'], + first_name: ['Dummy'], + id: ['3960271960958574'], + last_name: ['Name'], + military_status: ['na'], + phone_number: ['+910123456789'], + post_code: ['200000'], + relationship_status: ['na'], + 'short_answer_ques_1?': ['dummy short answer'], + state: ['Dummy State'], + street_address: ['Dummy Street'], + 'test_ques_1?': ['test ques'], + }), + }, + source: {}, + }, + ], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + batch: [ + { + context: { + integration: { + name: 'FacebookLeadAds', + }, + library: { + name: 'unknown', + version: 'unknown', + }, + traits: { + address: { + city: 'Bengaluru', + country: 'IN', + postalCode: '200000', + state: 'Dummy State', + street: 'Dummy Street', + }, + available_at_this_time: '2025-02-01T00:00:00+0530', + birthday: '01/01/2000', + city: 'Bengaluru', + conditional_question_1: 'Sweatshirt', + conditional_question_2: 'Black', + conditional_question_3: 'Medium', + country: 'IN', + created_time: '02/01/2025 invalid 10:20', + date_of_birth: '01/01/2000', + facebook_lead_id: '3960271960958574', + firstName: 'Dummy', + first_name: 'Dummy', + id: '3960271960958574', + lastName: 'Name', + last_name: 'Name', + military_status: 'na', + phone: '+910123456789', + phone_number: '+910123456789', + post_code: '200000', + relationship_status: 'na', + 'short_answer_ques_1?': 'dummy short answer', + state: 'Dummy State', + street_address: 'Dummy Street', + 'test_ques_1?': 'test ques', + }, + }, + integrations: { + FacebookLeadAds: false, + }, + type: 'identify', + userId: '3960271960958574', + }, + ], + }, + }, + ], + }, + }, + }, + { + name: 'facebook_lead_ads', + description: 'facebook lead ads with unavailable/null created_time', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify({ + available_at_this_time: ['2025-02-01T00:00:00+0530'], + city: ['Bengaluru'], + conditional_question_1: ['Sweatshirt'], + conditional_question_2: ['Black'], + conditional_question_3: ['Medium'], + country: ['IN'], + date_of_birth: ['01/01/2000'], + facebook_lead_id: ['3960271960958574'], + first_name: ['Dummy'], + id: ['3960271960958574'], + last_name: ['Name'], + military_status: ['na'], + phone_number: ['+910123456789'], + post_code: ['200000'], + relationship_status: ['na'], + 'short_answer_ques_1?': ['dummy short answer'], + state: ['Dummy State'], + street_address: ['Dummy Street'], + 'test_ques_1?': ['test ques'], + }), + }, + source: {}, + }, + ], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + batch: [ + { + context: { + integration: { + name: 'FacebookLeadAds', + }, + library: { + name: 'unknown', + version: 'unknown', + }, + traits: { + address: { + city: 'Bengaluru', + country: 'IN', + postalCode: '200000', + state: 'Dummy State', + street: 'Dummy Street', + }, + available_at_this_time: '2025-02-01T00:00:00+0530', + birthday: '01/01/2000', + city: 'Bengaluru', + conditional_question_1: 'Sweatshirt', + conditional_question_2: 'Black', + conditional_question_3: 'Medium', + country: 'IN', + date_of_birth: '01/01/2000', + facebook_lead_id: '3960271960958574', + firstName: 'Dummy', + first_name: 'Dummy', + id: '3960271960958574', + lastName: 'Name', + last_name: 'Name', + military_status: 'na', + phone: '+910123456789', + phone_number: '+910123456789', + post_code: '200000', + relationship_status: 'na', + 'short_answer_ques_1?': 'dummy short answer', + state: 'Dummy State', + street_address: 'Dummy Street', + 'test_ques_1?': 'test ques', + }, + }, + integrations: { + FacebookLeadAds: false, + }, + type: 'identify', + userId: '3960271960958574', + }, + ], + }, + }, + ], + }, + }, + }, + { + name: 'facebook_lead_ads', + description: 'facebook lead ads with null payload', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify(null), + }, + source: {}, + }, + ], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'input event must have at least one field', + statTags: { + destinationId: 'Non determinable', + errorCategory: 'transformation', + implementation: 'native', + module: 'source', + srcType: 'facebook_lead_ads', + workspaceId: 'Non determinable', + }, + statusCode: 400, + }, + ], + }, + }, + }, + { + name: 'facebook_lead_ads', + description: 'facebook lead ads with empty payload', + module: 'source', + version: 'v2', + input: { + request: { + body: [ + { + request: { + body: JSON.stringify({}), + }, + source: {}, + }, + ], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + error: 'input event must have at least one field', + statTags: { + destinationId: 'Non determinable', + errorCategory: 'transformation', + implementation: 'native', + module: 'source', + srcType: 'facebook_lead_ads', + workspaceId: 'Non determinable', + }, + statusCode: 400, + }, + ], + }, + }, + }, +].map((tc) => ({ + ...tc, + mockFns: () => { + defaultMockFns(); + }, +})); diff --git a/test/integrations/sources/formsort/data.ts b/test/integrations/sources/formsort/data.ts index ef275f6c1c4..854ba8a72e5 100644 --- a/test/integrations/sources/formsort/data.ts +++ b/test/integrations/sources/formsort/data.ts @@ -3,23 +3,28 @@ export const data = [ name: 'formsort', description: 'when we receive finalized as false', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - answers: { - yes: true, - enter_email: 'test@user.com', - enter_name: '2022-11-17', - yes_or_no: false, + request: { + body: JSON.stringify({ + answers: { + yes: true, + enter_email: 'test@user.com', + enter_name: '2022-11-17', + yes_or_no: false, + }, + responder_uuid: '66a8e5bb-67e1-47ec-b55f-a26fd4be2dc7', + flow_label: 'new-flow-2022-11-25', + variant_label: 'main', + variant_uuid: '0828efa7-7215-4e7d-a7ab-6c1079010cea', + finalized: false, + created_at: '2022-11-25T14:41:22+00:00', + }), }, - responder_uuid: '66a8e5bb-67e1-47ec-b55f-a26fd4be2dc7', - flow_label: 'new-flow-2022-11-25', - variant_label: 'main', - variant_uuid: '0828efa7-7215-4e7d-a7ab-6c1079010cea', - finalized: false, - created_at: '2022-11-25T14:41:22+00:00', + source: {}, }, ], method: 'POST', @@ -65,23 +70,28 @@ export const data = [ name: 'formsort', description: 'when we receive finalized as true', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - answers: { - yes: true, - enter_email: 'test@user.com', - enter_name: '2022-11-17', - yes_or_no: false, + request: { + body: JSON.stringify({ + answers: { + yes: true, + enter_email: 'test@user.com', + enter_name: '2022-11-17', + yes_or_no: false, + }, + responder_uuid: '66a8e5bb-67e1-47ec-b55f-a26fd4be2dc7', + flow_label: 'new-flow-2022-11-25', + variant_label: 'main', + variant_uuid: '0828efa7-7215-4e7d-a7ab-6c1079010cea', + finalized: true, + created_at: '2022-11-25T14:41:22+00:00', + }), }, - responder_uuid: '66a8e5bb-67e1-47ec-b55f-a26fd4be2dc7', - flow_label: 'new-flow-2022-11-25', - variant_label: 'main', - variant_uuid: '0828efa7-7215-4e7d-a7ab-6c1079010cea', - finalized: true, - created_at: '2022-11-25T14:41:22+00:00', + source: {}, }, ], method: 'POST', diff --git a/test/integrations/sources/gainsightpx/data.ts b/test/integrations/sources/gainsightpx/data.ts index b0380015800..6f3bd56ee4a 100644 --- a/test/integrations/sources/gainsightpx/data.ts +++ b/test/integrations/sources/gainsightpx/data.ts @@ -3,95 +3,100 @@ export const data = [ name: 'gainsightpx', description: 'Identify Call', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - user: { - aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', - identifyId: 'New!', - type: 'USER', - gender: 'EMPTY_GENDER', - email: 'userEmail@address.com', - firstName: 'test', - lastName: 'rudderlabs', - lastSeenDate: 1665582808669, - signUpDate: 1665582791753, - firstVisitDate: 1665582791753, - title: 'Mr.', - phone: '', - score: 0, - role: '', - subscriptionId: '', - accountId: 'IBM', - numberOfVisits: 1, - location: { - countryName: 'India', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665582808376, - lastModifiedDate: 1665582808717, - customAttributes: null, - globalUnsubscribe: false, - sfdcContactId: '', - lastVisitedUserAgentData: null, - id: 'New!', - lastInferredLocation: null, - }, - account: { - id: 'IBM', - name: 'International Business Machine', - trackedSubscriptionId: '', - sfdcId: '', - lastSeenDate: 1665582808669, - dunsNumber: '', - industry: '', - numberOfEmployees: 0, - sicCode: '', - website: '', - naicsCode: '', - plan: '', - location: { - countryName: '', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - numberOfUsers: 0, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665578567565, - lastModifiedDate: 1665582808669, - customAttributes: null, - parentGroupId: '', - }, - event: { - eventType: 'SIGN_UP', - eventId: '1283c08b-f290-4bc4-9deb-75c7867d69ee', - propertyKey: 'AP-EOXPSEZGC5LA-2-1', - date: 1665582808376, - sessionId: 'AP-EOXPSEZGC5LA-2-1665582441084-16821368', - globalContext: {}, - userType: 'USER', + request: { + body: JSON.stringify({ + user: { + aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', + identifyId: 'New!', + type: 'USER', + gender: 'EMPTY_GENDER', + email: 'userEmail@address.com', + firstName: 'test', + lastName: 'rudderlabs', + lastSeenDate: 1665582808669, + signUpDate: 1665582791753, + firstVisitDate: 1665582791753, + title: 'Mr.', + phone: '', + score: 0, + role: '', + subscriptionId: '', + accountId: 'IBM', + numberOfVisits: 1, + location: { + countryName: 'India', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665582808376, + lastModifiedDate: 1665582808717, + customAttributes: null, + globalUnsubscribe: false, + sfdcContactId: '', + lastVisitedUserAgentData: null, + id: 'New!', + lastInferredLocation: null, + }, + account: { + id: 'IBM', + name: 'International Business Machine', + trackedSubscriptionId: '', + sfdcId: '', + lastSeenDate: 1665582808669, + dunsNumber: '', + industry: '', + numberOfEmployees: 0, + sicCode: '', + website: '', + naicsCode: '', + plan: '', + location: { + countryName: '', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + numberOfUsers: 0, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665578567565, + lastModifiedDate: 1665582808669, + customAttributes: null, + parentGroupId: '', + }, + event: { + eventType: 'SIGN_UP', + eventId: '1283c08b-f290-4bc4-9deb-75c7867d69ee', + propertyKey: 'AP-EOXPSEZGC5LA-2-1', + date: 1665582808376, + sessionId: 'AP-EOXPSEZGC5LA-2-1665582441084-16821368', + globalContext: {}, + userType: 'USER', + }, + configId: '32f07727-d231-4c9d-881e-fb50b80bad63', + }), }, - configId: '32f07727-d231-4c9d-881e-fb50b80bad63', + source: {}, }, ], method: 'POST', @@ -155,105 +160,110 @@ export const data = [ name: 'gainsightpx', description: 'Custom Track Call ', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - user: { - aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', - identifyId: 'New!', - type: 'USER', - gender: 'EMPTY_GENDER', - email: 'userEmail@address.com', - firstName: 'test', - lastName: 'rudderlabs', - lastSeenDate: 1665582808669, - signUpDate: 1665582791753, - firstVisitDate: 1665582791753, - title: 'Mr.', - phone: '', - score: 0, - role: '', - subscriptionId: '', - accountId: 'IBM', - numberOfVisits: 1, - location: { - countryName: 'India', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665582808376, - lastModifiedDate: 1665582808717, - customAttributes: null, - globalUnsubscribe: false, - sfdcContactId: '', - lastVisitedUserAgentData: null, - id: 'New!', - lastInferredLocation: null, - }, - account: { - id: 'IBM', - name: 'International Business Machine', - trackedSubscriptionId: '', - sfdcId: '', - lastSeenDate: 1665582808669, - dunsNumber: '', - industry: '', - numberOfEmployees: 0, - sicCode: '', - website: '', - naicsCode: '', - plan: '', - location: { - countryName: '', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - numberOfUsers: 0, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665578567565, - lastModifiedDate: 1665582808669, - customAttributes: null, - parentGroupId: '', - }, - event: { - eventType: 'CUSTOM', - eventId: 'df58cbd6-2736-4f8a-ad26-6049eac2e150', - propertyKey: 'AP-EOXPSEZGC5LA-2-1', - date: 1665656881448, - sessionId: 'AP-EOXPSEZGC5LA-2-1665656622955-48127533', - globalContext: {}, - userType: 'USER', - eventName: 'Product Clicked', - attributes: { - 'Audience Size': 5000, - name: 'TESTing TRACK CALL FIRST', - 'Launched date': 1520532660000, - Launched: true, - }, - url: 'http://127.0.0.1:5501/GPXTEST2.html', - referrer: '', - remoteHost: '122.161.66.140', + request: { + body: JSON.stringify({ + user: { + aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', + identifyId: 'New!', + type: 'USER', + gender: 'EMPTY_GENDER', + email: 'userEmail@address.com', + firstName: 'test', + lastName: 'rudderlabs', + lastSeenDate: 1665582808669, + signUpDate: 1665582791753, + firstVisitDate: 1665582791753, + title: 'Mr.', + phone: '', + score: 0, + role: '', + subscriptionId: '', + accountId: 'IBM', + numberOfVisits: 1, + location: { + countryName: 'India', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665582808376, + lastModifiedDate: 1665582808717, + customAttributes: null, + globalUnsubscribe: false, + sfdcContactId: '', + lastVisitedUserAgentData: null, + id: 'New!', + lastInferredLocation: null, + }, + account: { + id: 'IBM', + name: 'International Business Machine', + trackedSubscriptionId: '', + sfdcId: '', + lastSeenDate: 1665582808669, + dunsNumber: '', + industry: '', + numberOfEmployees: 0, + sicCode: '', + website: '', + naicsCode: '', + plan: '', + location: { + countryName: '', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + numberOfUsers: 0, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665578567565, + lastModifiedDate: 1665582808669, + customAttributes: null, + parentGroupId: '', + }, + event: { + eventType: 'CUSTOM', + eventId: 'df58cbd6-2736-4f8a-ad26-6049eac2e150', + propertyKey: 'AP-EOXPSEZGC5LA-2-1', + date: 1665656881448, + sessionId: 'AP-EOXPSEZGC5LA-2-1665656622955-48127533', + globalContext: {}, + userType: 'USER', + eventName: 'Product Clicked', + attributes: { + 'Audience Size': 5000, + name: 'TESTing TRACK CALL FIRST', + 'Launched date': 1520532660000, + Launched: true, + }, + url: 'http://127.0.0.1:5501/GPXTEST2.html', + referrer: '', + remoteHost: '122.161.66.140', + }, + configId: '32f07727-d231-4c9d-881e-fb50b80bad63', + }), }, - configId: '32f07727-d231-4c9d-881e-fb50b80bad63', + source: {}, }, ], method: 'POST', @@ -329,101 +339,106 @@ export const data = [ name: 'gainsightpx', description: 'Feedback Track Call ', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - user: { - aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', - identifyId: 'New!', - type: 'USER', - gender: 'EMPTY_GENDER', - email: 'userEmail@address.com', - firstName: 'test', - lastName: 'rudderlabs', - lastSeenDate: 1665582808669, - signUpDate: 1665582791753, - firstVisitDate: 1665582791753, - title: 'Mr.', - phone: '', - score: 0, - role: '', - subscriptionId: '', - accountId: 'IBM', - numberOfVisits: 1, - location: { - countryName: 'India', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665582808376, - lastModifiedDate: 1665582808717, - customAttributes: null, - globalUnsubscribe: false, - sfdcContactId: '', - lastVisitedUserAgentData: null, - id: 'New!', - lastInferredLocation: null, - }, - account: { - id: 'IBM', - name: 'International Business Machine', - trackedSubscriptionId: '', - sfdcId: '', - lastSeenDate: 1665582808669, - dunsNumber: '', - industry: '', - numberOfEmployees: 0, - sicCode: '', - website: '', - naicsCode: '', - plan: '', - location: { - countryName: '', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - numberOfUsers: 0, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665578567565, - lastModifiedDate: 1665582808669, - customAttributes: null, - parentGroupId: '', - }, - event: { - eventType: 'FEEDBACK', - eventId: 'd007bd76-decb-4a77-8456-d84fb15c6a83', - propertyKey: 'AP-E9VUBBLZ6BIS-2-1', - date: 1665415753621, - sessionId: 'AP-E9VUBBLZ6BIS-2-1665415678379-45445457', - globalContext: null, - userType: 'USER', - subject: 'feedback title', - category: 'Labels test', - description: 'feedback body', - labels: ['492120f5-3573-11ec-bef0-42010a800545'], - remoteHost: '122.161.66.140', - source: 'Knowledge Center Bot', + request: { + body: JSON.stringify({ + user: { + aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', + identifyId: 'New!', + type: 'USER', + gender: 'EMPTY_GENDER', + email: 'userEmail@address.com', + firstName: 'test', + lastName: 'rudderlabs', + lastSeenDate: 1665582808669, + signUpDate: 1665582791753, + firstVisitDate: 1665582791753, + title: 'Mr.', + phone: '', + score: 0, + role: '', + subscriptionId: '', + accountId: 'IBM', + numberOfVisits: 1, + location: { + countryName: 'India', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665582808376, + lastModifiedDate: 1665582808717, + customAttributes: null, + globalUnsubscribe: false, + sfdcContactId: '', + lastVisitedUserAgentData: null, + id: 'New!', + lastInferredLocation: null, + }, + account: { + id: 'IBM', + name: 'International Business Machine', + trackedSubscriptionId: '', + sfdcId: '', + lastSeenDate: 1665582808669, + dunsNumber: '', + industry: '', + numberOfEmployees: 0, + sicCode: '', + website: '', + naicsCode: '', + plan: '', + location: { + countryName: '', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + numberOfUsers: 0, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665578567565, + lastModifiedDate: 1665582808669, + customAttributes: null, + parentGroupId: '', + }, + event: { + eventType: 'FEEDBACK', + eventId: 'd007bd76-decb-4a77-8456-d84fb15c6a83', + propertyKey: 'AP-E9VUBBLZ6BIS-2-1', + date: 1665415753621, + sessionId: 'AP-E9VUBBLZ6BIS-2-1665415678379-45445457', + globalContext: null, + userType: 'USER', + subject: 'feedback title', + category: 'Labels test', + description: 'feedback body', + labels: ['492120f5-3573-11ec-bef0-42010a800545'], + remoteHost: '122.161.66.140', + source: 'Knowledge Center Bot', + }, + configId: '32f07727-d231-4c9d-881e-fb50b80bad63', + }), }, - configId: '32f07727-d231-4c9d-881e-fb50b80bad63', + source: {}, }, ], method: 'POST', @@ -500,96 +515,102 @@ export const data = [ name: 'gainsightpx', description: 'Feature Match Track Call ', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - user: { - aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', - identifyId: 'New!', - type: 'USER', - gender: 'EMPTY_GENDER', - email: 'userEmail@address.com', - firstName: 'test', - lastName: 'rudderlabs', - lastSeenDate: 1665582808669, - signUpDate: 1665582791753, - firstVisitDate: 1665582791753, - title: 'Mr.', - phone: '', - score: 0, - role: '', - subscriptionId: '', - accountId: 'IBM', - numberOfVisits: 1, - location: { - countryName: 'India', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665582808376, - lastModifiedDate: 1665582808717, - customAttributes: null, - globalUnsubscribe: false, - sfdcContactId: '', - lastVisitedUserAgentData: null, - id: 'New!', - lastInferredLocation: null, - }, - account: { - id: 'IBM', - name: 'International Business Machine', - trackedSubscriptionId: '', - sfdcId: '', - lastSeenDate: 1665582808669, - dunsNumber: '', - industry: '', - numberOfEmployees: 0, - sicCode: '', - website: '', - naicsCode: '', - plan: '', - location: { - countryName: '', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - numberOfUsers: 0, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665578567565, - lastModifiedDate: 1665582808669, - customAttributes: null, - parentGroupId: '', - }, - event: { - eventType: 'FEATURE_MATCH', - eventId: 'ae1e5538-1736-4088-86d1-e90a10ffe901-05951b40-944f-4052-9a4a-51c74683f658', - propertyKey: 'AP-8MF5LPSWUBFW-2-1', - date: 1665582808376, - sessionId: 'AP-8MF5LPSWUBFW-2-1601303023809-98881162', - globalContext: { role: 'Admin' }, - userType: 'USER', - featureId: '05951b40-944f-4052-9a4a-51c74683f658', - featureName: 'Charts', + request: { + body: JSON.stringify({ + user: { + aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', + identifyId: 'New!', + type: 'USER', + gender: 'EMPTY_GENDER', + email: 'userEmail@address.com', + firstName: 'test', + lastName: 'rudderlabs', + lastSeenDate: 1665582808669, + signUpDate: 1665582791753, + firstVisitDate: 1665582791753, + title: 'Mr.', + phone: '', + score: 0, + role: '', + subscriptionId: '', + accountId: 'IBM', + numberOfVisits: 1, + location: { + countryName: 'India', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665582808376, + lastModifiedDate: 1665582808717, + customAttributes: null, + globalUnsubscribe: false, + sfdcContactId: '', + lastVisitedUserAgentData: null, + id: 'New!', + lastInferredLocation: null, + }, + account: { + id: 'IBM', + name: 'International Business Machine', + trackedSubscriptionId: '', + sfdcId: '', + lastSeenDate: 1665582808669, + dunsNumber: '', + industry: '', + numberOfEmployees: 0, + sicCode: '', + website: '', + naicsCode: '', + plan: '', + location: { + countryName: '', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + numberOfUsers: 0, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665578567565, + lastModifiedDate: 1665582808669, + customAttributes: null, + parentGroupId: '', + }, + event: { + eventType: 'FEATURE_MATCH', + eventId: + 'ae1e5538-1736-4088-86d1-e90a10ffe901-05951b40-944f-4052-9a4a-51c74683f658', + propertyKey: 'AP-8MF5LPSWUBFW-2-1', + date: 1665582808376, + sessionId: 'AP-8MF5LPSWUBFW-2-1601303023809-98881162', + globalContext: { role: 'Admin' }, + userType: 'USER', + featureId: '05951b40-944f-4052-9a4a-51c74683f658', + featureName: 'Charts', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -660,95 +681,100 @@ export const data = [ name: 'gainsightpx', description: 'Segment Match Track Call and no userId and yes anonymousId as event.sessionId', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - user: { - aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', - type: 'USER', - gender: 'EMPTY_GENDER', - email: 'userEmail@address.com', - firstName: 'test', - lastName: 'rudderlabs', - lastSeenDate: 1665582808669, - signUpDate: 1665582791753, - firstVisitDate: 1665582791753, - title: 'Mr.', - phone: '', - score: 0, - role: '', - subscriptionId: '', - accountId: 'IBM', - numberOfVisits: 1, - location: { - countryName: 'India', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665582808376, - lastModifiedDate: 1665582808717, - customAttributes: null, - globalUnsubscribe: false, - sfdcContactId: '', - lastVisitedUserAgentData: null, - id: 'New!', - lastInferredLocation: null, - }, - account: { - id: 'IBM', - name: 'International Business Machine', - trackedSubscriptionId: '', - sfdcId: '', - lastSeenDate: 1665582808669, - dunsNumber: '', - industry: '', - numberOfEmployees: 0, - sicCode: '', - website: '', - naicsCode: '', - plan: '', - location: { - countryName: '', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - numberOfUsers: 0, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665578567565, - lastModifiedDate: 1665582808669, - customAttributes: null, - parentGroupId: '', - }, - event: { - eventType: 'SEGMENT', - eventId: 'ddb9ca94-beb1-449c-bdcd-b53190f8e784', - propertyKey: 'AP-8MF5LPSWUBFW-2-1', - date: 1665582808376, - sessionId: 'AP-8MF5LPSWUBFW-2-1601303023809-98881162', - globalContext: { role: 'Admin' }, - userType: 'USER', - segmentId: 'e3ab2e48-24f9-4602-ab92-b9f1f4343845', - segmentName: 'Linux User', + request: { + body: JSON.stringify({ + user: { + aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', + type: 'USER', + gender: 'EMPTY_GENDER', + email: 'userEmail@address.com', + firstName: 'test', + lastName: 'rudderlabs', + lastSeenDate: 1665582808669, + signUpDate: 1665582791753, + firstVisitDate: 1665582791753, + title: 'Mr.', + phone: '', + score: 0, + role: '', + subscriptionId: '', + accountId: 'IBM', + numberOfVisits: 1, + location: { + countryName: 'India', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665582808376, + lastModifiedDate: 1665582808717, + customAttributes: null, + globalUnsubscribe: false, + sfdcContactId: '', + lastVisitedUserAgentData: null, + id: 'New!', + lastInferredLocation: null, + }, + account: { + id: 'IBM', + name: 'International Business Machine', + trackedSubscriptionId: '', + sfdcId: '', + lastSeenDate: 1665582808669, + dunsNumber: '', + industry: '', + numberOfEmployees: 0, + sicCode: '', + website: '', + naicsCode: '', + plan: '', + location: { + countryName: '', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + numberOfUsers: 0, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665578567565, + lastModifiedDate: 1665582808669, + customAttributes: null, + parentGroupId: '', + }, + event: { + eventType: 'SEGMENT', + eventId: 'ddb9ca94-beb1-449c-bdcd-b53190f8e784', + propertyKey: 'AP-8MF5LPSWUBFW-2-1', + date: 1665582808376, + sessionId: 'AP-8MF5LPSWUBFW-2-1601303023809-98881162', + globalContext: { role: 'Admin' }, + userType: 'USER', + segmentId: 'e3ab2e48-24f9-4602-ab92-b9f1f4343845', + segmentName: 'Linux User', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -819,22 +845,27 @@ export const data = [ name: 'gainsightpx', description: 'No Match Track Call ', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - eventType: 'Unavailable', - eventId: 'ddb9ca94-beb1-449c-bdcd-b53190f8e784', - propertyKey: 'AP-8MF5LPSWUBFW-2-1', - date: 1601303075964, - sessionId: 'AP-8MF5LPSWUBFW-2-1601303023809-98881162', - globalContext: { role: 'Admin' }, - userType: 'USER', - segmentId: 'e3ab2e48-24f9-4602-ab92-b9f1f4343845', - segmentName: 'Linux User', + request: { + body: JSON.stringify({ + event: { + eventType: 'Unavailable', + eventId: 'ddb9ca94-beb1-449c-bdcd-b53190f8e784', + propertyKey: 'AP-8MF5LPSWUBFW-2-1', + date: 1601303075964, + sessionId: 'AP-8MF5LPSWUBFW-2-1601303023809-98881162', + globalContext: { role: 'Admin' }, + userType: 'USER', + segmentId: 'e3ab2e48-24f9-4602-ab92-b9f1f4343845', + segmentName: 'Linux User', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -853,6 +884,7 @@ export const data = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'gainsightpx', workspaceId: 'Non determinable', }, statusCode: 400, @@ -865,115 +897,120 @@ export const data = [ name: 'gainsightpx', description: 'Survey Track Call -> Multi Question Survey ', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - user: { - aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', - identifyId: 'New!', - type: 'USER', - gender: 'EMPTY_GENDER', - email: 'userEmail@address.com', - firstName: 'test', - lastName: 'rudderlabs', - lastSeenDate: 1665582808669, - signUpDate: 1665582791753, - firstVisitDate: 1665582791753, - title: 'Mr.', - phone: '', - score: 0, - role: '', - subscriptionId: '', - accountId: 'IBM', - numberOfVisits: 1, - location: { - countryName: 'India', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665582808376, - lastModifiedDate: 1665582808717, - customAttributes: null, - globalUnsubscribe: false, - sfdcContactId: '', - lastVisitedUserAgentData: null, - id: 'New!', - lastInferredLocation: null, - }, - account: { - id: 'IBM', - name: 'International Business Machine', - trackedSubscriptionId: '', - sfdcId: '', - lastSeenDate: 1665582808669, - dunsNumber: '', - industry: '', - numberOfEmployees: 0, - sicCode: '', - website: '', - naicsCode: '', - plan: '', - location: { - countryName: '', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - numberOfUsers: 0, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665578567565, - lastModifiedDate: 1665582808669, - customAttributes: null, - parentGroupId: '', - }, - event: { - eventType: 'SURVEY', - eventId: 'c9883e3b-05d4-4f96-8b9c-e2ce10430493', - propertyKey: 'AP-N6SV00EVMR1E-2-1', - date: 1601303075964, - sessionId: 'AP-N6SV00EVMR1E-2-1605265939566-23853426', - globalContext: { role: 'Admin' }, - userType: 'EMPTY_USER_TYPE', - contentType: 'IN_APP_MULTIPLE_QUESTION_SURVEY', - engagementId: 'e5362226-75da-4ef6-999a-823727e3d7a7', - engagementName: 'Quarterly Survey', - surveyType: 'Multi Question', - interaction: 'SINGLE_STEP_SURVEY_RESPONDED', - score: 0, - activation: 'Auto', - executionId: '1ad2d383-d1fa-425d-84f0-2a531e17a5d9', - executionDate: 1605265939965, - questionType: 'Multi choice', - questionId: 'de9e6bf1-351c-46ec-907d-c985bd420c2b', - questionHtml: - '
Favorite travel destinations
', - questionText: 'Favorite travel destinations', - answers: [ - { - answerId: '563e2103-2906-4088-869f-bcccd185f288', - answerHtml: '
Europe
', - answerText: 'Europe', + request: { + body: JSON.stringify({ + user: { + aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', + identifyId: 'New!', + type: 'USER', + gender: 'EMPTY_GENDER', + email: 'userEmail@address.com', + firstName: 'test', + lastName: 'rudderlabs', + lastSeenDate: 1665582808669, + signUpDate: 1665582791753, + firstVisitDate: 1665582791753, + title: 'Mr.', + phone: '', + score: 0, + role: '', + subscriptionId: '', + accountId: 'IBM', + numberOfVisits: 1, + location: { + countryName: 'India', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665582808376, + lastModifiedDate: 1665582808717, + customAttributes: null, + globalUnsubscribe: false, + sfdcContactId: '', + lastVisitedUserAgentData: null, + id: 'New!', + lastInferredLocation: null, }, - ], + account: { + id: 'IBM', + name: 'International Business Machine', + trackedSubscriptionId: '', + sfdcId: '', + lastSeenDate: 1665582808669, + dunsNumber: '', + industry: '', + numberOfEmployees: 0, + sicCode: '', + website: '', + naicsCode: '', + plan: '', + location: { + countryName: '', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + numberOfUsers: 0, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665578567565, + lastModifiedDate: 1665582808669, + customAttributes: null, + parentGroupId: '', + }, + event: { + eventType: 'SURVEY', + eventId: 'c9883e3b-05d4-4f96-8b9c-e2ce10430493', + propertyKey: 'AP-N6SV00EVMR1E-2-1', + date: 1601303075964, + sessionId: 'AP-N6SV00EVMR1E-2-1605265939566-23853426', + globalContext: { role: 'Admin' }, + userType: 'EMPTY_USER_TYPE', + contentType: 'IN_APP_MULTIPLE_QUESTION_SURVEY', + engagementId: 'e5362226-75da-4ef6-999a-823727e3d7a7', + engagementName: 'Quarterly Survey', + surveyType: 'Multi Question', + interaction: 'SINGLE_STEP_SURVEY_RESPONDED', + score: 0, + activation: 'Auto', + executionId: '1ad2d383-d1fa-425d-84f0-2a531e17a5d9', + executionDate: 1605265939965, + questionType: 'Multi choice', + questionId: 'de9e6bf1-351c-46ec-907d-c985bd420c2b', + questionHtml: + '
Favorite travel destinations
', + questionText: 'Favorite travel destinations', + answers: [ + { + answerId: '563e2103-2906-4088-869f-bcccd185f288', + answerHtml: '
Europe
', + answerText: 'Europe', + }, + ], + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1063,110 +1100,119 @@ export const data = [ name: 'gainsightpx', description: 'Survey Track Call -> NPS ', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - user: { - aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', - identifyId: 'New!', - type: 'USER', - gender: 'EMPTY_GENDER', - email: 'userEmail@address.com', - firstName: 'test', - lastName: 'rudderlabs', - lastSeenDate: 1665582808669, - signUpDate: 1665582791753, - firstVisitDate: 1665582791753, - title: 'Mr.', - phone: '', - score: 0, - role: '', - subscriptionId: '', - accountId: 'IBM', - numberOfVisits: 1, - location: { - countryName: 'India', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665582808376, - lastModifiedDate: 1665582808717, - customAttributes: null, - globalUnsubscribe: false, - sfdcContactId: '', - lastVisitedUserAgentData: null, - id: 'New!', - lastInferredLocation: null, - }, - account: { - id: 'IBM', - name: 'International Business Machine', - trackedSubscriptionId: '', - sfdcId: '', - lastSeenDate: 1665582808669, - dunsNumber: '', - industry: '', - numberOfEmployees: 0, - sicCode: '', - website: '', - naicsCode: '', - plan: '', - location: { - countryName: '', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - numberOfUsers: 0, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665578567565, - lastModifiedDate: 1665582808669, - customAttributes: null, - parentGroupId: '', - }, - event: { - eventType: 'SURVEY', - eventId: 'c9883e3b-05d4-4f96-8b9c-e2ce10430493', - propertyKey: 'AP-N6SV00EVMR1E-2-1', - date: 1601303075964, - sessionId: 'AP-N6SV00EVMR1E-2-1605265939566-23853426', - globalContext: { role: 'Admin' }, - userType: 'EMPTY_USER_TYPE', - contentType: 'IN_APP_MULTIPLE_QUESTION_SURVEY', - engagementId: 'e5362226-75da-4ef6-999a-823727e3d7a7', - engagementName: 'Quarterly Survey', - surveyType: 'Multi Question', - interaction: 'SINGLE_STEP_SURVEY_RESPONDED', - score: 0, - scoreType: null, - stepNumber: null, - userInput: 'I like new features', - activation: 'Auto', - executionId: '1ad2d383-d1fa-425d-84f0-2a531e17a5d9', - executionDate: 1605265939965, - questionType: 'Open text question', - questionHtml: - '
\n
\n How was your experience?\n
\n
\n', - questionText: 'How was your experience?', + request: { + body: JSON.stringify({ + user: { + aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', + identifyId: 'New!', + type: 'USER', + gender: 'EMPTY_GENDER', + email: 'userEmail@address.com', + firstName: 'test', + lastName: 'rudderlabs', + lastSeenDate: 1665582808669, + signUpDate: 1665582791753, + firstVisitDate: 1665582791753, + title: 'Mr.', + phone: '', + score: 0, + role: '', + subscriptionId: '', + accountId: 'IBM', + numberOfVisits: 1, + location: { + countryName: 'India', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665582808376, + lastModifiedDate: 1665582808717, + customAttributes: null, + globalUnsubscribe: false, + sfdcContactId: '', + lastVisitedUserAgentData: null, + id: 'New!', + lastInferredLocation: null, + }, + account: { + id: 'IBM', + name: 'International Business Machine', + trackedSubscriptionId: '', + sfdcId: '', + lastSeenDate: 1665582808669, + dunsNumber: '', + industry: '', + numberOfEmployees: 0, + sicCode: '', + website: '', + naicsCode: '', + plan: '', + location: { + countryName: '', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + numberOfUsers: 0, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665578567565, + lastModifiedDate: 1665582808669, + customAttributes: null, + parentGroupId: '', + }, + event: { + eventType: 'SURVEY', + eventId: 'c9883e3b-05d4-4f96-8b9c-e2ce10430493', + propertyKey: 'AP-N6SV00EVMR1E-2-1', + date: 1601303075964, + sessionId: 'AP-N6SV00EVMR1E-2-1605265939566-23853426', + globalContext: { role: 'Admin' }, + userType: 'EMPTY_USER_TYPE', + contentType: 'IN_APP_MULTIPLE_QUESTION_SURVEY', + engagementId: 'e5362226-75da-4ef6-999a-823727e3d7a7', + engagementName: 'Quarterly Survey', + surveyType: 'Multi Question', + interaction: 'SINGLE_STEP_SURVEY_RESPONDED', + score: 0, + scoreType: null, + stepNumber: null, + userInput: 'I like new features', + activation: 'Auto', + executionId: '1ad2d383-d1fa-425d-84f0-2a531e17a5d9', + executionDate: 1605265939965, + questionType: 'Open text question', + questionHtml: + '
\n' + + '
\n' + + ' How was your experience?\n' + + '
\n' + + '
\n', + questionText: 'How was your experience?', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1228,7 +1274,11 @@ export const data = [ questionType: 'Open text question', score: 0, questionHtml: - '
\n
\n How was your experience?\n
\n
\n', + '
\n' + + '
\n' + + ' How was your experience?\n' + + '
\n' + + '
\n', questionText: 'How was your experience?', }, }, @@ -1249,103 +1299,108 @@ export const data = [ name: 'gainsightpx', description: 'Engagement Track Call ', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - user: { - aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', - identifyId: 'New!', - type: 'USER', - gender: 'EMPTY_GENDER', - email: 'userEmail@address.com', - firstName: 'test', - lastName: 'rudderlabs', - lastSeenDate: 1665582808669, - signUpDate: 1665582791753, - firstVisitDate: 1665582791753, - title: 'Mr.', - phone: '', - score: 0, - role: '', - subscriptionId: '', - accountId: 'IBM', - numberOfVisits: 1, - location: { - countryName: 'India', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665582808376, - lastModifiedDate: 1665582808717, - customAttributes: null, - globalUnsubscribe: false, - sfdcContactId: '', - lastVisitedUserAgentData: null, - id: 'New!', - lastInferredLocation: null, - }, - account: { - id: 'IBM', - name: 'International Business Machine', - trackedSubscriptionId: '', - sfdcId: '', - lastSeenDate: 1665582808669, - dunsNumber: '', - industry: '', - numberOfEmployees: 0, - sicCode: '', - website: '', - naicsCode: '', - plan: '', - location: { - countryName: '', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - numberOfUsers: 0, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665578567565, - lastModifiedDate: 1665582808669, - customAttributes: null, - parentGroupId: '', - }, - event: { - eventType: 'ENGAGEMENT', - eventId: '6494e73a-976b-4ee5-b8a8-de9effff7e80', - propertyKey: 'AP-N6SV00EVMR1E-2-1', - date: 1605262539389, - sessionId: 'AP-N6SV00EVMR1E-2-1605262502068-24197555', - globalContext: { role: 'Admin' }, - userType: 'EMPTY_USER_TYPE', - contentType: 'IN_APP_DIALOG', - engagementId: '83c30d4e-88c3-4054-a0fa-33451a6ea7fc', - engagementType: 'Dialog', - engagementName: 'Release Announcement', - interaction: 'VIEWED', - stepNumber: 1, - activation: 'Auto', - executionId: 'b633945f-d4a5-404a-ae39-5ced5b542240', - executionDate: 1605262539389, + request: { + body: JSON.stringify({ + user: { + aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', + identifyId: 'New!', + type: 'USER', + gender: 'EMPTY_GENDER', + email: 'userEmail@address.com', + firstName: 'test', + lastName: 'rudderlabs', + lastSeenDate: 1665582808669, + signUpDate: 1665582791753, + firstVisitDate: 1665582791753, + title: 'Mr.', + phone: '', + score: 0, + role: '', + subscriptionId: '', + accountId: 'IBM', + numberOfVisits: 1, + location: { + countryName: 'India', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665582808376, + lastModifiedDate: 1665582808717, + customAttributes: null, + globalUnsubscribe: false, + sfdcContactId: '', + lastVisitedUserAgentData: null, + id: 'New!', + lastInferredLocation: null, + }, + account: { + id: 'IBM', + name: 'International Business Machine', + trackedSubscriptionId: '', + sfdcId: '', + lastSeenDate: 1665582808669, + dunsNumber: '', + industry: '', + numberOfEmployees: 0, + sicCode: '', + website: '', + naicsCode: '', + plan: '', + location: { + countryName: '', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + numberOfUsers: 0, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665578567565, + lastModifiedDate: 1665582808669, + customAttributes: null, + parentGroupId: '', + }, + event: { + eventType: 'ENGAGEMENT', + eventId: '6494e73a-976b-4ee5-b8a8-de9effff7e80', + propertyKey: 'AP-N6SV00EVMR1E-2-1', + date: 1605262539389, + sessionId: 'AP-N6SV00EVMR1E-2-1605262502068-24197555', + globalContext: { role: 'Admin' }, + userType: 'EMPTY_USER_TYPE', + contentType: 'IN_APP_DIALOG', + engagementId: '83c30d4e-88c3-4054-a0fa-33451a6ea7fc', + engagementType: 'Dialog', + engagementName: 'Release Announcement', + interaction: 'VIEWED', + stepNumber: 1, + activation: 'Auto', + executionId: 'b633945f-d4a5-404a-ae39-5ced5b542240', + executionDate: 1605262539389, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1420,120 +1475,125 @@ export const data = [ name: 'gainsightpx', description: 'SegmentIO S2S Track Call ', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - user: { - aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', - identifyId: 'New!', - type: 'USER', - gender: 'EMPTY_GENDER', - email: 'userEmail@address.com', - firstName: 'test', - lastName: 'rudderlabs', - lastSeenDate: 1665582808669, - signUpDate: 1665582791753, - firstVisitDate: 1665582791753, - title: 'Mr.', - phone: '', - score: 0, - role: '', - subscriptionId: '', - accountId: 'IBM', - numberOfVisits: 1, - location: { - countryName: 'India', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665582808376, - lastModifiedDate: 1665582808717, - customAttributes: null, - globalUnsubscribe: false, - sfdcContactId: '', - lastVisitedUserAgentData: null, - id: 'New!', - lastInferredLocation: null, - }, - account: { - id: 'IBM', - name: 'International Business Machine', - trackedSubscriptionId: '', - sfdcId: '', - lastSeenDate: 1665582808669, - dunsNumber: '', - industry: '', - numberOfEmployees: 0, - sicCode: '', - website: '', - naicsCode: '', - plan: '', - location: { - countryName: '', - countryCode: '', - stateName: '', - stateCode: '', - city: '', - street: '', - postalCode: '', - continent: '', - regionName: '', - timeZone: '', - coordinates: { latitude: 0, longitude: 0 }, - }, - numberOfUsers: 0, - propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], - createDate: 1665578567565, - lastModifiedDate: 1665582808669, - customAttributes: null, - parentGroupId: '', - }, - event: { - eventType: 'SEGMENT_IO', - eventId: 'ajs-next-69810a17571dc115ccead5281cc3fb7d', - propertyKey: 'AP-EOXPSEZGC5LA-2-1', - date: 1666687235178, - sessionId: '31a524fa-1490-48db-9600-adfb1fa95333', - globalContext: {}, - userType: 'USER', - segmentIOEvent: { - pxPropertyKey: 'AP-EOXPSEZGC5LA-2', - type: 'group', - userId: '1001', - anonymousId: 'a4303a13-eb10-46d8-8935-d787daf1cfbd', - context: { - ip: '122.161.67.121', - library: { name: 'analytics.js', version: 'next-1.45.0' }, - locale: 'en-GB', - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', - page: { - path: '/abc.html', - title: 'Engage Testing', - url: 'http://127.0.0.1:5501/abc.html', + request: { + body: JSON.stringify({ + user: { + aptrinsicId: 'cab9c469-8602-4933-acdb-68338fbb9ab1', + identifyId: 'New!', + type: 'USER', + gender: 'EMPTY_GENDER', + email: 'userEmail@address.com', + firstName: 'test', + lastName: 'rudderlabs', + lastSeenDate: 1665582808669, + signUpDate: 1665582791753, + firstVisitDate: 1665582791753, + title: 'Mr.', + phone: '', + score: 0, + role: '', + subscriptionId: '', + accountId: 'IBM', + numberOfVisits: 1, + location: { + countryName: 'India', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665582808376, + lastModifiedDate: 1665582808717, + customAttributes: null, + globalUnsubscribe: false, + sfdcContactId: '', + lastVisitedUserAgentData: null, + id: 'New!', + lastInferredLocation: null, + }, + account: { + id: 'IBM', + name: 'International Business Machine', + trackedSubscriptionId: '', + sfdcId: '', + lastSeenDate: 1665582808669, + dunsNumber: '', + industry: '', + numberOfEmployees: 0, + sicCode: '', + website: '', + naicsCode: '', + plan: '', + location: { + countryName: '', + countryCode: '', + stateName: '', + stateCode: '', + city: '', + street: '', + postalCode: '', + continent: '', + regionName: '', + timeZone: '', + coordinates: { latitude: 0, longitude: 0 }, + }, + numberOfUsers: 0, + propertyKeys: ['AP-EOXPSEZGC5LA-2-1'], + createDate: 1665578567565, + lastModifiedDate: 1665582808669, + customAttributes: null, + parentGroupId: '', + }, + event: { + eventType: 'SEGMENT_IO', + eventId: 'ajs-next-69810a17571dc115ccead5281cc3fb7d', + propertyKey: 'AP-EOXPSEZGC5LA-2-1', + date: 1666687235178, + sessionId: '31a524fa-1490-48db-9600-adfb1fa95333', + globalContext: {}, + userType: 'USER', + segmentIOEvent: { + pxPropertyKey: 'AP-EOXPSEZGC5LA-2', + type: 'group', + userId: '1001', + anonymousId: 'a4303a13-eb10-46d8-8935-d787daf1cfbd', + context: { + ip: '122.161.67.121', + library: { name: 'analytics.js', version: 'next-1.45.0' }, + locale: 'en-GB', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', + page: { + path: '/abc.html', + title: 'Engage Testing', + url: 'http://127.0.0.1:5501/abc.html', + }, + }, + messageId: 'ajs-next-69810a17571dc115ccead5281cc3fb7d', + receivedAt: '2022-10-25T08:40:35.184Z', + sentAt: '2022-10-25T08:40:34.809Z', + timestamp: '2022-10-25T08:40:35.178Z', + traits: { name: 'International Business Machine' }, + version: 2, + channel: 'client', + groupId: 'IBM', }, }, - messageId: 'ajs-next-69810a17571dc115ccead5281cc3fb7d', - receivedAt: '2022-10-25T08:40:35.184Z', - sentAt: '2022-10-25T08:40:34.809Z', - timestamp: '2022-10-25T08:40:35.178Z', - traits: { name: 'International Business Machine' }, - version: 2, - channel: 'client', - groupId: 'IBM', - }, + }), }, + source: {}, }, ], method: 'POST', diff --git a/test/integrations/sources/iterable/data.ts b/test/integrations/sources/iterable/data.ts index 8912c83434a..1f38695e5a0 100644 --- a/test/integrations/sources/iterable/data.ts +++ b/test/integrations/sources/iterable/data.ts @@ -3,23 +3,28 @@ export const data = [ name: 'iterable', description: 'test-0', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'test@rudderstack.com', - eventName: 'emailSubscribe', - dataFields: { - profileUpdatedAt: '2022-04-19 03:33:50 +00:00', - publicIdString: 'ad474bf7-e785-480f-b9d0-861b85ab5bf5', - signupSource: 'WebForm', - email: 'test@rudderstack.com', - createdAt: '2022-04-19 03:33:50 +00:00', - messageTypeIds: [], - emailListIds: [1589748], - channelIds: [], + request: { + body: JSON.stringify({ + email: 'test@rudderstack.com', + eventName: 'emailSubscribe', + dataFields: { + profileUpdatedAt: '2022-04-19 03:33:50 +00:00', + publicIdString: 'ad474bf7-e785-480f-b9d0-861b85ab5bf5', + signupSource: 'WebForm', + email: 'test@rudderstack.com', + createdAt: '2022-04-19 03:33:50 +00:00', + messageTypeIds: [], + emailListIds: [1589748], + channelIds: [], + }, + }), }, + source: {}, }, ], method: 'POST', @@ -67,22 +72,27 @@ export const data = [ name: 'iterable', description: 'test-1', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventName: 'emailSubscribe', - dataFields: { - profileUpdatedAt: '2022-04-19 03:33:50 +00:00', - publicIdString: 'ad474bf7-e785-480f-b9d0-861b85ab5bf5', - signupSource: 'WebForm', - email: 'test@abcd.com', - createdAt: '2022-04-19 03:33:50 +00:00', - messageTypeIds: [], - emailListIds: [1589748], - channelIds: [], + request: { + body: JSON.stringify({ + eventName: 'emailSubscribe', + dataFields: { + profileUpdatedAt: '2022-04-19 03:33:50 +00:00', + publicIdString: 'ad474bf7-e785-480f-b9d0-861b85ab5bf5', + signupSource: 'WebForm', + email: 'test@abcd.com', + createdAt: '2022-04-19 03:33:50 +00:00', + messageTypeIds: [], + emailListIds: [1589748], + channelIds: [], + }, + }), }, + source: {}, }, ], method: 'POST', @@ -101,6 +111,7 @@ export const data = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'iterable', workspaceId: 'Non determinable', }, statusCode: 400, @@ -113,20 +124,25 @@ export const data = [ name: 'iterable', description: 'test-2', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'test@ruddstack.com', - eventTitle: 'smsReceived', - dataFields: { - fromPhoneNumber: '+16503926753', - toPhoneNumber: '+14155824541', - smsMessage: 'Message text', - email: 'docs@iterable.com', - createdAt: '2016-12-05 22:51:25 +00:00', + request: { + body: JSON.stringify({ + email: 'test@ruddstack.com', + eventTitle: 'smsReceived', + dataFields: { + fromPhoneNumber: '+16503926753', + toPhoneNumber: '+14155824541', + smsMessage: 'Message text', + email: 'docs@iterable.com', + createdAt: '2016-12-05 22:51:25 +00:00', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -145,6 +161,7 @@ export const data = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'iterable', workspaceId: 'Non determinable', }, statusCode: 400, @@ -157,10 +174,20 @@ export const data = [ name: 'iterable', description: 'test-3', module: 'source', - version: 'v0', + version: 'v2', input: { request: { - body: [{ email: 'test@rudderstack.com', eventName: 'inAppSendSkip' }], + body: [ + { + request: { + body: JSON.stringify({ + email: 'test@rudderstack.com', + eventName: 'inAppSendSkip', + }), + }, + source: {}, + }, + ], method: 'POST', headers: { 'Content-Type': 'application/json' }, }, @@ -195,30 +222,35 @@ export const data = [ name: 'iterable', description: 'test-4', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'test@rudderstack.com', - eventName: 'emailSend', - dataFields: { - contentId: 331201, - email: 'test@rudderstack.com', - createdAt: '2016-12-02 20:21:04 +00:00', - campaignId: 59667, - templateId: 93849, - messageId: 'd0aa7801f91f4824997a631f3ed583c3', - emailSubject: 'My subject', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 3420, - messageTypeId: 3866, - experimentId: null, - emailId: 'c59667:t93849:docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'test@rudderstack.com', + eventName: 'emailSend', + dataFields: { + contentId: 331201, + email: 'test@rudderstack.com', + createdAt: '2016-12-02 20:21:04 +00:00', + campaignId: 59667, + templateId: 93849, + messageId: 'd0aa7801f91f4824997a631f3ed583c3', + emailSubject: 'My subject', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 3420, + messageTypeId: 3866, + experimentId: null, + emailId: 'c59667:t93849:docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -273,30 +305,35 @@ export const data = [ name: 'iterable', description: 'test-5', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'invalid_email@iterable.com', - eventName: 'emailBounce', - dataFields: { - emailSubject: 'My subject', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 2598, - messageTypeId: 2870, - experimentId: null, - recipientState: 'HardBounce', - templateId: 167484, - email: 'invalid_email@iterable.com', - createdAt: '2017-05-15 23:59:47 +00:00', - campaignId: 114746, - messageId: 'd0aa7801f91f4824997a631f3ed583c3', - emailId: 'c114746:t167484:invalid_email@iterable.com', + request: { + body: JSON.stringify({ + email: 'invalid_email@iterable.com', + eventName: 'emailBounce', + dataFields: { + emailSubject: 'My subject', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 2598, + messageTypeId: 2870, + experimentId: null, + recipientState: 'HardBounce', + templateId: 167484, + email: 'invalid_email@iterable.com', + createdAt: '2017-05-15 23:59:47 +00:00', + campaignId: 114746, + messageId: 'd0aa7801f91f4824997a631f3ed583c3', + emailId: 'c114746:t167484:invalid_email@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -351,39 +388,44 @@ export const data = [ name: 'iterable', description: 'test-6', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'emailClick', - dataFields: { - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36', - ip: '162.245.22.184', - templateId: 93849, - userAgentDevice: 'Mac', - url: 'https://www.iterable.com', - canonicalUrlId: '3145668988', - city: 'San Francisco', - region: 'CA', - email: 'docs@iterable.com', - createdAt: '2016-12-02 20:31:39 +00:00', - campaignId: 59667, - messageId: 'd0aa7801f91f4824997a631f3ed583c3', - emailSubject: 'My subject', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 3420, - messageTypeId: 3866, - experimentId: null, - linkUrl: 'https://www.iterable.com', - linkId: '3145668988', - emailId: 'c59667:t93849:docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'emailClick', + dataFields: { + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36', + ip: '162.245.22.184', + templateId: 93849, + userAgentDevice: 'Mac', + url: 'https://www.iterable.com', + canonicalUrlId: '3145668988', + city: 'San Francisco', + region: 'CA', + email: 'docs@iterable.com', + createdAt: '2016-12-02 20:31:39 +00:00', + campaignId: 59667, + messageId: 'd0aa7801f91f4824997a631f3ed583c3', + emailSubject: 'My subject', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 3420, + messageTypeId: 3866, + experimentId: null, + linkUrl: 'https://www.iterable.com', + linkId: '3145668988', + emailId: 'c59667:t93849:docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -447,30 +489,35 @@ export const data = [ name: 'iterable', description: 'test-7', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'emailComplaint', - dataFields: { - recipientState: 'Complaint', - templateId: 79190, - email: 'docs@iterable.com', - createdAt: '2016-12-09 18:52:19 +00:00', - campaignId: 49313, - messageId: 'd3c44d47b4994306b4db8d16a94db025', - emailSubject: 'My subject', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'test template', - channelId: 3420, - messageTypeId: 3866, - experimentId: null, - emailId: 'c49313:t79190:docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'emailComplaint', + dataFields: { + recipientState: 'Complaint', + templateId: 79190, + email: 'docs@iterable.com', + createdAt: '2016-12-09 18:52:19 +00:00', + campaignId: 49313, + messageId: 'd3c44d47b4994306b4db8d16a94db025', + emailSubject: 'My subject', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'test template', + channelId: 3420, + messageTypeId: 3866, + experimentId: null, + emailId: 'c49313:t79190:docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -525,34 +572,39 @@ export const data = [ name: 'iterable', description: 'test-8', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'emailOpen', - dataFields: { - userAgent: - 'Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)', - proxySource: 'Gmail', - ip: '66.249.84.204', - templateId: 79190, - device: 'Gmail', - email: 'docs@iterable.com', - createdAt: '2016-12-02 18:51:45 +00:00', - campaignId: 49313, - messageId: '210badf49fe54f2591d64ad0d055f4fb', - emailSubject: 'My subject', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 3420, - messageTypeId: 3866, - experimentId: null, - emailId: 'c49313:t79190:docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'emailOpen', + dataFields: { + userAgent: + 'Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)', + proxySource: 'Gmail', + ip: '66.249.84.204', + templateId: 79190, + device: 'Gmail', + email: 'docs@iterable.com', + createdAt: '2016-12-02 18:51:45 +00:00', + campaignId: 49313, + messageId: '210badf49fe54f2591d64ad0d055f4fb', + emailSubject: 'My subject', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 3420, + messageTypeId: 3866, + experimentId: null, + emailId: 'c49313:t79190:docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -611,20 +663,25 @@ export const data = [ name: 'iterable', description: 'test-9', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'emailSendSkip', - dataFields: { - createdAt: '2019-08-07 18:56:10 +00:00', - reason: 'DuplicateMarketingMessage', - campaignId: 721398, - messageId: '98430abe1b9842c991ce221010121553', - email: 'docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'emailSendSkip', + dataFields: { + createdAt: '2019-08-07 18:56:10 +00:00', + reason: 'DuplicateMarketingMessage', + campaignId: 721398, + messageId: '98430abe1b9842c991ce221010121553', + email: 'docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -669,23 +726,28 @@ export const data = [ name: 'iterable', description: 'test-10', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'test@rudderstack.com', - eventName: 'emailSubscribe', - dataFields: { - profileUpdatedAt: '2022-04-19 03:33:50 +00:00', - publicIdString: 'ad474bf7-e785-480f-b9d0-861b85ab5bf5', - signupSource: 'WebForm', - email: 'test@abcd.com', - createdAt: '2022-04-19 03:33:50 +00:00', - messageTypeIds: [], - emailListIds: [1589748], - channelIds: [], + request: { + body: JSON.stringify({ + email: 'test@rudderstack.com', + eventName: 'emailSubscribe', + dataFields: { + profileUpdatedAt: '2022-04-19 03:33:50 +00:00', + publicIdString: 'ad474bf7-e785-480f-b9d0-861b85ab5bf5', + signupSource: 'WebForm', + email: 'test@abcd.com', + createdAt: '2022-04-19 03:33:50 +00:00', + messageTypeIds: [], + emailListIds: [1589748], + channelIds: [], + }, + }), }, + source: {}, }, ], method: 'POST', @@ -733,35 +795,40 @@ export const data = [ name: 'iterable', description: 'test-11', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'emailUnSubscribe', - dataFields: { - campaignId: 1089024, - messageId: 'bf008db8ab194b65816398c05bf30f99', - emailId: 'c1089024:t1526112:docs@iterable.com', - workflowName: 'My test workflow', - messageTypeIds: [], - locale: null, - templateId: 1526112, - emailSubject: 'Upcoming events!', - labels: [], - unsubSource: 'EmailLink', - createdAt: '2020-03-20 23:34:15 +00:00', - templateName: 'My test template', - emailListIds: [], - messageTypeId: 31082, - experimentId: null, - channelIds: [27447], - campaignName: 'My test campaign', - workflowId: 76786, - email: 'docs@iterable.com', - channelId: 27447, + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'emailUnSubscribe', + dataFields: { + campaignId: 1089024, + messageId: 'bf008db8ab194b65816398c05bf30f99', + emailId: 'c1089024:t1526112:docs@iterable.com', + workflowName: 'My test workflow', + messageTypeIds: [], + locale: null, + templateId: 1526112, + emailSubject: 'Upcoming events!', + labels: [], + unsubSource: 'EmailLink', + createdAt: '2020-03-20 23:34:15 +00:00', + templateName: 'My test template', + emailListIds: [], + messageTypeId: 31082, + experimentId: null, + channelIds: [27447], + campaignName: 'My test campaign', + workflowId: 76786, + email: 'docs@iterable.com', + channelId: 27447, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -821,40 +888,45 @@ export const data = [ name: 'iterable', description: 'test-12', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - userId: '1', - eventName: 'hostedUnsubscribeClick', - dataFields: { - country: 'United States', - city: 'San Jose', - campaignId: 1074721, - ip: '192.168.0.1', - userAgentDevice: 'Mac', - messageId: 'ceb3d4d929fc406ca93b28a0ef1efff1', - emailId: 'c1074721:t1506266:docs@iterable.com', - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', - workflowName: 'My workflow', - locale: null, - templateId: 1506266, - emailSubject: 'My email subject', - url: 'https://iterable.com', - labels: [], - createdAt: '2020-03-21 00:24:08 +00:00', - templateName: 'My email template', - messageTypeId: 13406, - experimentId: null, - region: 'CA', - campaignName: 'My email campaign', - workflowId: 60102, - email: 'docs@iterable.com', - channelId: 12466, + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + userId: '1', + eventName: 'hostedUnsubscribeClick', + dataFields: { + country: 'United States', + city: 'San Jose', + campaignId: 1074721, + ip: '192.168.0.1', + userAgentDevice: 'Mac', + messageId: 'ceb3d4d929fc406ca93b28a0ef1efff1', + emailId: 'c1074721:t1506266:docs@iterable.com', + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', + workflowName: 'My workflow', + locale: null, + templateId: 1506266, + emailSubject: 'My email subject', + url: 'https://iterable.com', + labels: [], + createdAt: '2020-03-21 00:24:08 +00:00', + templateName: 'My email template', + messageTypeId: 13406, + experimentId: null, + region: 'CA', + campaignName: 'My email campaign', + workflowId: 60102, + email: 'docs@iterable.com', + channelId: 12466, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -918,18 +990,23 @@ export const data = [ name: 'iterable', description: 'test-13', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'inAppClick', - dataFields: { - email: 'docs@iterable.com', - createdAt: '2018-03-27 00:44:40 +00:00', - campaignId: 269450, + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'inAppClick', + dataFields: { + email: 'docs@iterable.com', + createdAt: '2018-03-27 00:44:40 +00:00', + campaignId: 269450, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -953,7 +1030,10 @@ export const data = [ }, event: 'inAppClick', integrations: { Iterable: false }, - properties: { createdAt: '2018-03-27 00:44:40 +00:00', campaignId: 269450 }, + properties: { + createdAt: '2018-03-27 00:44:40 +00:00', + campaignId: 269450, + }, receivedAt: '2018-03-27T00:44:40.000Z', timestamp: '2018-03-27T00:44:40.000Z', type: 'track', @@ -969,18 +1049,23 @@ export const data = [ name: 'iterable', description: 'test-14', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'inAppOpen', - dataFields: { - email: 'docs@iterable.com', - createdAt: '2018-03-27 00:44:30 +00:00', - campaignId: 269450, + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'inAppOpen', + dataFields: { + email: 'docs@iterable.com', + createdAt: '2018-03-27 00:44:30 +00:00', + campaignId: 269450, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1004,7 +1089,10 @@ export const data = [ }, event: 'inAppOpen', integrations: { Iterable: false }, - properties: { createdAt: '2018-03-27 00:44:30 +00:00', campaignId: 269450 }, + properties: { + createdAt: '2018-03-27 00:44:30 +00:00', + campaignId: 269450, + }, receivedAt: '2018-03-27T00:44:30.000Z', timestamp: '2018-03-27T00:44:30.000Z', type: 'track', @@ -1020,34 +1108,39 @@ export const data = [ name: 'iterable', description: 'test-15', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'inAppSend', - dataFields: { - messageContext: { saveToInbox: false, trigger: 'immediate' }, - campaignId: 732678, - contentId: 18997, - messageId: 'vA16d48VVi4LQ5hMuZuquKzL0BXTdQJJUMJRjKnL1', - workflowName: null, - emailId: 'c732678:t1032729:docs@iterable.com', - locale: null, - templateId: 1032729, - inAppBody: '', - email: 'docs@iterable.com', - createdAt: '2016-12-10 01:00:38 +00:00', - campaignId: 74768, - templateId: 113554, - pushMessage: 'Push message text', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 2203, - messageTypeId: 2439, - experimentId: null, - payload: { path: 'yourpath/subpath' }, - sound: '', - badge: null, - contentAvailable: false, - deeplink: null, - locale: null, + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'pushBounce', + dataFields: { + platformEndpoint: '', + email: 'docs@iterable.com', + createdAt: '2016-12-10 01:00:38 +00:00', + campaignId: 74768, + templateId: 113554, + pushMessage: 'Push message text', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 2203, + messageTypeId: 2439, + experimentId: null, + payload: { path: 'yourpath/subpath' }, + sound: '', + badge: null, + contentAvailable: false, + deeplink: null, + locale: null, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1278,34 +1381,39 @@ export const data = [ name: 'iterable', description: 'test-18', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'pushOpen', - dataFields: { - appAlreadyRunning: false, - email: 'docs@iterable.com', - createdAt: '2016-12-08 01:25:22 +00:00', - campaignId: 74768, - templateId: 113554, - pushMessage: 'Push message text', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 2203, - messageTypeId: 2439, - experimentId: null, - payload: { path: 'shop_home' }, - sound: null, - badge: null, - contentAvailable: false, - deeplink: null, - locale: null, + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'pushOpen', + dataFields: { + appAlreadyRunning: false, + email: 'docs@iterable.com', + createdAt: '2016-12-08 01:25:22 +00:00', + campaignId: 74768, + templateId: 113554, + pushMessage: 'Push message text', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 2203, + messageTypeId: 2439, + experimentId: null, + payload: { path: 'shop_home' }, + sound: null, + badge: null, + contentAvailable: false, + deeplink: null, + locale: null, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1364,36 +1472,41 @@ export const data = [ name: 'iterable', description: 'test-19', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'pushSend', - dataFields: { - contentId: 6724, - platformEndpoint: '', - email: 'docs@iterable.com', - createdAt: '2016-12-08 00:53:11 +00:00', - campaignId: 74758, - templateId: 113541, - messageId: '73f2d3f13cd04db0b56c6143b179adc5', - pushMessage: 'Push message text', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 1744, - messageTypeId: 1759, - experimentId: null, - payload: { a: '2' }, - sound: '', - badge: '', - contentAvailable: false, - deeplink: null, - locale: null, + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'pushSend', + dataFields: { + contentId: 6724, + platformEndpoint: '', + email: 'docs@iterable.com', + createdAt: '2016-12-08 00:53:11 +00:00', + campaignId: 74758, + templateId: 113541, + messageId: '73f2d3f13cd04db0b56c6143b179adc5', + pushMessage: 'Push message text', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 1744, + messageTypeId: 1759, + experimentId: null, + payload: { a: '2' }, + sound: '', + badge: '', + contentAvailable: false, + deeplink: null, + locale: null, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1454,20 +1567,25 @@ export const data = [ name: 'iterable', description: 'test-20', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'pushSendSkip', - dataFields: { - createdAt: '2019-08-07 22:28:51 +00:00', - reason: 'DuplicateMarketingMessage', - campaignId: 732667, - messageId: '8306ae0c74324635b7554947c5ec0e56', - email: 'docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'pushSendSkip', + dataFields: { + createdAt: '2019-08-07 22:28:51 +00:00', + reason: 'DuplicateMarketingMessage', + campaignId: 732667, + messageId: '8306ae0c74324635b7554947c5ec0e56', + email: 'docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1512,36 +1630,41 @@ export const data = [ name: 'iterable', description: 'test-21', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'pushUninstall', - dataFields: { - isGhostPush: false, - platformEndpoint: '', - email: 'docs@iterable.com', - createdAt: '2016-12-09 20:50:54 +00:00', - campaignId: 74768, - templateId: 113554, - messageId: '73f2d3f13cd04db0b56c6143b179adc5', - pushMessage: 'Push message text', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 2203, - messageTypeId: 2439, - experimentId: null, - payload: { path: 'your_folder/30' }, - sound: '', - badge: null, - contentAvailable: false, - deeplink: null, - locale: null, + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'pushUninstall', + dataFields: { + isGhostPush: false, + platformEndpoint: '', + email: 'docs@iterable.com', + createdAt: '2016-12-09 20:50:54 +00:00', + campaignId: 74768, + templateId: 113554, + messageId: '73f2d3f13cd04db0b56c6143b179adc5', + pushMessage: 'Push message text', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 2203, + messageTypeId: 2439, + experimentId: null, + payload: { path: 'your_folder/30' }, + sound: '', + badge: null, + contentAvailable: false, + deeplink: null, + locale: null, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1602,38 +1725,43 @@ export const data = [ name: 'iterable', description: 'test-22', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'smsBounce', - dataFields: { - smsProviderResponse: { - status: 404, - message: - 'The requested resource /2010-04-01/Accounts/ACCOUNT_NUMBER/Messages.json was not found', - code: 20404, - more_info: 'https://www.twilio.com/docs/errors/20404', - }, - email: 'docs@iterable.com', - createdAt: '2016-12-05 22:43:24 +00:00', - campaignId: 74003, - templateId: 112561, - smsMessage: "Here is example message, please respond with 'received'", - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 4270, - messageTypeId: 4769, - experimentId: null, - fromPhoneNumberId: 268, - imageUrl: null, - locale: null, - emailId: 'c74003:t112561:docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'smsBounce', + dataFields: { + smsProviderResponse: { + status: 404, + message: + 'The requested resource /2010-04-01/Accounts/ACCOUNT_NUMBER/Messages.json was not found', + code: 20404, + more_info: 'https://www.twilio.com/docs/errors/20404', + }, + email: 'docs@iterable.com', + createdAt: '2016-12-05 22:43:24 +00:00', + campaignId: 74003, + templateId: 112561, + smsMessage: "Here is example message, please respond with 'received'", + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 4270, + messageTypeId: 4769, + experimentId: null, + fromPhoneNumberId: 268, + imageUrl: null, + locale: null, + emailId: 'c74003:t112561:docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1696,34 +1824,39 @@ export const data = [ name: 'iterable', description: 'test-23', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'smsClick', - dataFields: { - campaignId: 1234567, - campaignName: 'My test campaign', - workflowId: null, - workflowName: null, - templateName: 'My template', - locale: null, - channelId: 98765, - messageTypeId: 43210, - experimentId: null, - labels: [], - smsMessage: 'Test SMS! https://www.example.com', - fromPhoneNumberId: 1234, - imageUrl: null, - clickedUrl: 'https://www.example.com', - email: 'docs@iterable.com', - createdAt: '2022-03-10 05:00:14 +00:00', - templateId: 1112222, - messageId: 'ebd8f3cfc1f74353b423c5e0f3dd8b39', - emailId: 'c1234567:t9876543:docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'smsClick', + dataFields: { + campaignId: 1234567, + campaignName: 'My test campaign', + workflowId: null, + workflowName: null, + templateName: 'My template', + locale: null, + channelId: 98765, + messageTypeId: 43210, + experimentId: null, + labels: [], + smsMessage: 'Test SMS! https://www.example.com', + fromPhoneNumberId: 1234, + imageUrl: null, + clickedUrl: 'https://www.example.com', + email: 'docs@iterable.com', + createdAt: '2022-03-10 05:00:14 +00:00', + templateId: 1112222, + messageId: 'ebd8f3cfc1f74353b423c5e0f3dd8b39', + emailId: 'c1234567:t9876543:docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1782,20 +1915,25 @@ export const data = [ name: 'iterable', description: 'test-24', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'smsReceived', - dataFields: { - fromPhoneNumber: '+16503926753', - toPhoneNumber: '+14155824541', - smsMessage: 'Message text', - email: 'docs@iterable.com', - createdAt: '2016-12-05 22:51:25 +00:00', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'smsReceived', + dataFields: { + fromPhoneNumber: '+16503926753', + toPhoneNumber: '+14155824541', + smsMessage: 'Message text', + email: 'docs@iterable.com', + createdAt: '2016-12-05 22:51:25 +00:00', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1840,34 +1978,39 @@ export const data = [ name: 'iterable', description: 'test-25', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'smsSend', - dataFields: { - toPhoneNumber: '+16503926753', - fromSMSSenderId: 258, - contentId: 2086, - email: 'docs@iterable.com', - createdAt: '2016-12-05 21:50:32 +00:00', - campaignId: 73974, - templateId: 112523, - smsMessage: 'Message text', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 4270, - messageTypeId: 4769, - experimentId: null, - fromPhoneNumberId: 258, - imageUrl: null, - locale: null, - emailId: 'c73974:t112523:docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'smsSend', + dataFields: { + toPhoneNumber: '+16503926753', + fromSMSSenderId: 258, + contentId: 2086, + email: 'docs@iterable.com', + createdAt: '2016-12-05 21:50:32 +00:00', + campaignId: 73974, + templateId: 112523, + smsMessage: 'Message text', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 4270, + messageTypeId: 4769, + experimentId: null, + fromPhoneNumberId: 258, + imageUrl: null, + locale: null, + emailId: 'c73974:t112523:docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1926,20 +2069,25 @@ export const data = [ name: 'iterable', description: 'test-26', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'smsSendSkip', - dataFields: { - createdAt: '2019-08-07 18:49:48 +00:00', - reason: 'DuplicateMarketingMessage', - campaignId: 729390, - messageId: '2c780bf42f26485db0fc6571d2e0f6a0', - email: 'docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'smsSendSkip', + dataFields: { + createdAt: '2019-08-07 18:49:48 +00:00', + reason: 'DuplicateMarketingMessage', + campaignId: 729390, + messageId: '2c780bf42f26485db0fc6571d2e0f6a0', + email: 'docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -1984,34 +2132,39 @@ export const data = [ name: 'iterable', description: 'test-27', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'emailSend', - dataFields: { - contentId: 274222, - email: 'docs@iterable.com', - createdAt: '2016-12-02 18:51:40 +00:00', - campaignId: 49313, - transactionalData: { - __comment: - 'transactionalData lists the fields contained in the dataFields property of the API call or event used to trigger the email, campaign, or workflow. transactionalData must contain no more than 12k characters in total.', - }, - templateId: 79190, - messageId: '210badf49fe54f2591d64ad0d055f4fb', - emailSubject: 'My subject', - campaignName: 'My campaign name', - workflowId: null, - workflowName: null, - templateName: 'My template name', - channelId: 3420, - messageTypeId: 3866, - experimentId: null, - emailId: 'c49313:t79190:docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'emailSend', + dataFields: { + contentId: 274222, + email: 'docs@iterable.com', + createdAt: '2016-12-02 18:51:40 +00:00', + campaignId: 49313, + transactionalData: { + __comment: + 'transactionalData lists the fields contained in the dataFields property of the API call or event used to trigger the email, campaign, or workflow. transactionalData must contain no more than 12k characters in total.', + }, + templateId: 79190, + messageId: '210badf49fe54f2591d64ad0d055f4fb', + emailSubject: 'My subject', + campaignName: 'My campaign name', + workflowId: null, + workflowName: null, + templateName: 'My template name', + channelId: 3420, + messageTypeId: 3866, + experimentId: null, + emailId: 'c49313:t79190:docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -2070,37 +2223,42 @@ export const data = [ name: 'iterable', description: 'test-28', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'webPushSend', - dataFields: { - campaignId: 723636, - browserToken: - 'cZn_inqLGPk:APA91bHsn5jo0-4V55RB38eCeLHj8ZXVJYciU7k6Kipbit3lrRlEe2Dt6bNzR4lSf6r2YNVdWY8l90hV0jmb_Y7y5ufcJ68xNI7wbsH6Q2jbEghA_Qo4kWbtu6A4NZN4gxc1xsEbyh7b', - contentId: 3681, - messageId: 'af4c726ae76b48c7871b6d0d7760d47c', - workflowName: 'My workflow name', - emailId: 'c723636:t1020396:docs@iterable.com', - locale: null, - webPushIcon: null, - templateId: 1020396, - labels: [], - createdAt: '2019-08-07 23:43:02 +00:00', - templateName: 'My template name', - webPushMessage: '', - messageTypeId: 9106, - webPushBody: null, - experimentId: null, - webPushClickAction: null, - campaignName: 'My campaign name', - workflowId: 53505, - channelId: 8539, - email: 'docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'webPushSend', + dataFields: { + campaignId: 723636, + browserToken: + 'cZn_inqLGPk:APA91bHsn5jo0-4V55RB38eCeLHj8ZXVJYciU7k6Kipbit3lrRlEe2Dt6bNzR4lSf6r2YNVdWY8l90hV0jmb_Y7y5ufcJ68xNI7wbsH6Q2jbEghA_Qo4kWbtu6A4NZN4gxc1xsEbyh7b', + contentId: 3681, + messageId: 'af4c726ae76b48c7871b6d0d7760d47c', + workflowName: 'My workflow name', + emailId: 'c723636:t1020396:docs@iterable.com', + locale: null, + webPushIcon: null, + templateId: 1020396, + labels: [], + createdAt: '2019-08-07 23:43:02 +00:00', + templateName: 'My template name', + webPushMessage: '', + messageTypeId: 9106, + webPushBody: null, + experimentId: null, + webPushClickAction: null, + campaignName: 'My campaign name', + workflowId: 53505, + channelId: 8539, + email: 'docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -2162,20 +2320,25 @@ export const data = [ name: 'iterable', description: 'test-29', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - email: 'docs@iterable.com', - eventName: 'webPushSendSkip', - dataFields: { - createdAt: '2019-08-07 23:43:48 +00:00', - reason: 'DuplicateMarketingMessage', - campaignId: 723636, - messageId: '4238c918b20a41dfbe9a910275b76f12', - email: 'docs@iterable.com', + request: { + body: JSON.stringify({ + email: 'docs@iterable.com', + eventName: 'webPushSendSkip', + dataFields: { + createdAt: '2019-08-07 23:43:48 +00:00', + reason: 'DuplicateMarketingMessage', + campaignId: 723636, + messageId: '4238c918b20a41dfbe9a910275b76f12', + email: 'docs@iterable.com', + }, + }), }, + source: {}, }, ], method: 'POST', diff --git a/test/integrations/sources/mailjet/data.ts b/test/integrations/sources/mailjet/data.ts index 2a8f3eaf460..2654edb8055 100644 --- a/test/integrations/sources/mailjet/data.ts +++ b/test/integrations/sources/mailjet/data.ts @@ -3,25 +3,30 @@ export const data = [ name: 'mailjet', description: 'MailJet email open event', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: 'open', - time: 1664443614, - MessageID: 94857068804950690, - Message_GUID: '54d6cdec-f659-4547-8926-13d9c4126b82', - email: 'test@rudderstack.com', - mj_campaign_id: 108760, - mj_contact_id: 399962859, - customcampaign: 'mj.nl=58424', - ip: '66.249.84.231', - geo: 'US', - agent: - 'Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)', - CustomID: '', - Payload: '', + request: { + body: JSON.stringify({ + event: 'open', + time: 1664443614, + MessageID: 94857068804950690, + Message_GUID: '54d6cdec-f659-4547-8926-13d9c4126b82', + email: 'test@rudderstack.com', + mj_campaign_id: 108760, + mj_contact_id: 399962859, + customcampaign: 'mj.nl=58424', + ip: '66.249.84.231', + geo: 'US', + agent: + 'Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)', + CustomID: '', + Payload: '', + }), + }, + source: {}, }, ], method: 'POST', @@ -69,23 +74,28 @@ export const data = [ name: 'mailjet', description: 'MailJet email bounce event where input event is of type ', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: 'bounce', - time: 1664444171, - MessageID: 55169098999352350, - Message_GUID: '447d7eab-3335-4aba-9a51-09454bc14b81', - email: 'test@rudderstack.com', - mj_campaign_id: 108892, - mj_contact_id: 373142816, - customcampaign: 'mj.nl=58486', - blocked: false, - hard_bounce: false, - error_related_to: 'system', - error: 'connection issue', + request: { + body: JSON.stringify({ + event: 'bounce', + time: 1664444171, + MessageID: 55169098999352350, + Message_GUID: '447d7eab-3335-4aba-9a51-09454bc14b81', + email: 'test@rudderstack.com', + mj_campaign_id: 108892, + mj_contact_id: 373142816, + customcampaign: 'mj.nl=58486', + blocked: false, + hard_bounce: false, + error_related_to: 'system', + error: 'connection issue', + }), + }, + source: {}, }, ], method: 'POST', @@ -110,7 +120,10 @@ export const data = [ integrations: { MailJet: false }, type: 'track', event: 'bounce', - properties: { customcampaign: 'mj.nl=58486', mj_campaign_id: 108892 }, + properties: { + customcampaign: 'mj.nl=58486', + mj_campaign_id: 108892, + }, originalTimestamp: '2022-09-29T09:36:11.000Z', userId: '5b6a3426dba2cb24e4f0aeec43bee9d7', }, @@ -125,21 +138,26 @@ export const data = [ name: 'mailjet', description: 'MailJet email sent event', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: 'sent', - time: 1664444171, - MessageID: 92886743924596480, - Message_GUID: '0230c73a-2b77-4aea-8ef2-ed15d0edc5fd', - email: 'test@rudderstack.com', - mj_campaign_id: 108892, - mj_contact_id: 372651182, - customcampaign: 'mj.nl=58486', - smtp_reply: - '250 2.0.0 OK DMARC:Quarantine 1664444171 u17-20020adfdd51000000b0022cc3f2bf13si3225188wrm.271 - gsmtp', + request: { + body: JSON.stringify({ + event: 'sent', + time: 1664444171, + MessageID: 92886743924596480, + Message_GUID: '0230c73a-2b77-4aea-8ef2-ed15d0edc5fd', + email: 'test@rudderstack.com', + mj_campaign_id: 108892, + mj_contact_id: 372651182, + customcampaign: 'mj.nl=58486', + smtp_reply: + '250 2.0.0 OK DMARC:Quarantine 1664444171 u17-20020adfdd51000000b0022cc3f2bf13si3225188wrm.271 - gsmtp', + }), + }, + source: {}, }, ], method: 'POST', @@ -164,7 +182,10 @@ export const data = [ integrations: { MailJet: false }, type: 'track', event: 'sent', - properties: { customcampaign: 'mj.nl=58486', mj_campaign_id: 108892 }, + properties: { + customcampaign: 'mj.nl=58486', + mj_campaign_id: 108892, + }, originalTimestamp: '2022-09-29T09:36:11.000Z', userId: '5b6a3426dba2cb24e4f0aeec43bee9d7', }, @@ -179,23 +200,28 @@ export const data = [ name: 'mailjet', description: 'MailJet email bounce event', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: 'bounce', - time: 1664444170, - MessageID: 56013522696710744, - Message_GUID: 'dbe4f0a3-4a5a-4784-a724-a9794d3c0444', - email: 'test@rudderstack.com', - mj_campaign_id: 108892, - mj_contact_id: 373142182, - customcampaign: 'mj.nl=58486', - blocked: false, - hard_bounce: false, - error_related_to: 'system', - error: 'connection issue', + request: { + body: JSON.stringify({ + event: 'bounce', + time: 1664444170, + MessageID: 56013522696710744, + Message_GUID: 'dbe4f0a3-4a5a-4784-a724-a9794d3c0444', + email: 'test@rudderstack.com', + mj_campaign_id: 108892, + mj_contact_id: 373142182, + customcampaign: 'mj.nl=58486', + blocked: false, + hard_bounce: false, + error_related_to: 'system', + error: 'connection issue', + }), + }, + source: {}, }, ], method: 'POST', @@ -220,7 +246,10 @@ export const data = [ integrations: { MailJet: false }, type: 'track', event: 'bounce', - properties: { customcampaign: 'mj.nl=58486', mj_campaign_id: 108892 }, + properties: { + customcampaign: 'mj.nl=58486', + mj_campaign_id: 108892, + }, originalTimestamp: '2022-09-29T09:36:10.000Z', userId: '5b6a3426dba2cb24e4f0aeec43bee9d7', }, @@ -235,23 +264,28 @@ export const data = [ name: 'mailjet', description: 'MailJet when no email is present', module: 'source', - version: 'v0', + version: 'v2', skipGo: 'FIXME', input: { request: { body: [ { - event: 'bounce', - time: 1664444170, - MessageID: 56013522696710744, - Message_GUID: 'dbe4f0a3-4a5a-4784-a724-a9794d3c0444', - mj_campaign_id: 108892, - mj_contact_id: 373142182, - customcampaign: 'mj.nl=58486', - blocked: false, - hard_bounce: false, - error_related_to: 'system', - error: 'connection issue', + request: { + body: JSON.stringify({ + event: 'bounce', + time: 1664444170, + MessageID: 56013522696710744, + Message_GUID: 'dbe4f0a3-4a5a-4784-a724-a9794d3c0444', + mj_campaign_id: 108892, + mj_contact_id: 373142182, + customcampaign: 'mj.nl=58486', + blocked: false, + hard_bounce: false, + error_related_to: 'system', + error: 'connection issue', + }), + }, + source: {}, }, ], method: 'POST', @@ -275,7 +309,10 @@ export const data = [ integrations: { MailJet: false }, type: 'track', event: 'bounce', - properties: { customcampaign: 'mj.nl=58486', mj_campaign_id: 108892 }, + properties: { + customcampaign: 'mj.nl=58486', + mj_campaign_id: 108892, + }, originalTimestamp: '2022-09-29T09:36:10.000Z', }, ], @@ -289,37 +326,44 @@ export const data = [ name: 'mailjet', description: 'MailJet Multiple payloads in single request', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: 'open', - time: 1704458040, - MessageID: 987654, - Message_GUID: '876r-oihugyf-7tfygh', - email: 'abc@r.com', - mj_campaign_id: 321, - mj_contact_id: 123, - customcampaign: 'test_campaign', - url: 'https://www.example.com/', - ip: 'ip_info', - geo: 'some geo info', - agent: 'mailjet api test', - }, - { - event: 'click', - time: 1704458041, - MessageID: 12345234567, - Message_GUID: '12345-kjhgfd-2efv', - email: 'abc@r.com', - mj_campaign_id: 12, - mj_contact_id: 32532, - customcampaign: 'test_campaign', - url: 'https://www.example.com/', - ip: 'ip_info', - geo: 'some geo info', - agent: 'mailjet api test', + request: { + body: JSON.stringify([ + { + event: 'open', + time: 1704458040, + MessageID: 987654, + Message_GUID: '876r-oihugyf-7tfygh', + email: 'abc@r.com', + mj_campaign_id: 321, + mj_contact_id: 123, + customcampaign: 'test_campaign', + url: 'https://www.example.com/', + ip: 'ip_info', + geo: 'some geo info', + agent: 'mailjet api test', + }, + { + event: 'click', + time: 1704458041, + MessageID: 12345234567, + Message_GUID: '12345-kjhgfd-2efv', + email: 'abc@r.com', + mj_campaign_id: 12, + mj_contact_id: 32532, + customcampaign: 'test_campaign', + url: 'https://www.example.com/', + ip: 'ip_info', + geo: 'some geo info', + agent: 'mailjet api test', + }, + ]), + }, + source: {}, }, ], method: 'POST', @@ -356,12 +400,6 @@ export const data = [ userId: '593a5aff0b445b3b77a6d9676b7ec86e', originalTimestamp: '2024-01-05T12:34:00.000Z', }, - ], - }, - }, - { - output: { - batch: [ { context: { library: { name: 'unknown', version: 'unknown' }, diff --git a/test/integrations/sources/mailmodo/data.ts b/test/integrations/sources/mailmodo/data.ts index aa34363831c..0b6d857dcf0 100644 --- a/test/integrations/sources/mailmodo/data.ts +++ b/test/integrations/sources/mailmodo/data.ts @@ -3,21 +3,26 @@ export const data = [ name: 'mailmodo', description: 'test-0', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - triggerData: { - data: {}, - triggerSource: 'CsvList', - email: 'gouhgc@mailmodo.com', - triggerDetails: - 'file:1a69df39hfbfg4e0b-8b5c-73776157aa37/7647792f-4ebc-4f9d-ac79-05fb0356137e', - userId: 'd3775892hvh4f2f-b9d5-e49810eb2cae', - journeyId: '1a69df39hgvh4e0b-8b5c-73776157aa37', - eventProperty: {}, + request: { + body: JSON.stringify({ + triggerData: { + data: {}, + triggerSource: 'CsvList', + email: 'gouhgc@mailmodo.com', + triggerDetails: + 'file:1a69df39hfbfg4e0b-8b5c-73776157aa37/7647792f-4ebc-4f9d-ac79-05fb0356137e', + userId: 'd3775892hvh4f2f-b9d5-e49810eb2cae', + journeyId: '1a69df39hgvh4e0b-8b5c-73776157aa37', + eventProperty: {}, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -36,7 +41,10 @@ export const data = [ anonymousId: 'f43848cce166e51b097cbed2851adc16ed9d4c341928f1c790215c50cefb59b0', context: { externalId: [ - { id: 'd3775892hvh4f2f-b9d5-e49810eb2cae', type: 'mailmodoUserId' }, + { + id: 'd3775892hvh4f2f-b9d5-e49810eb2cae', + type: 'mailmodoUserId', + }, ], traits: { email: 'gouhgc@mailmodo.com' }, integration: { name: 'Mailmodo', version: '1.0.0' }, @@ -63,27 +71,37 @@ export const data = [ name: 'mailmodo', description: 'test-1', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - fuuid: '27905', - 'next-step-id': 'success', - 'total-steps': '3', - responseId: 'b9a5d224-cc5a-4e64-9800-5a3db9515fdf', - recipientEmail: 'test.rudderlabs21997@gmail.com', - formId: 'formosztd5', - recordedAt: { ts: 1662695704, date: '2022-09-09', hour: 9, minute: 25 }, - submissionSource: 'amp', - elementjbtz42: 'Everything ', - element8jzo13: ['Reliable', 'High Quality', 'Useful'], - recipientData: { email: 'test.rudderlabs21997@gmail.com' }, - recommend: '9', - liking: 'upvote', - satisfaction: '4', - campaignId: '0b53e1bf-84ae-4198-9184-8a4d6e1fa3dd', - campaignName: 'Campaign-testing', + request: { + body: JSON.stringify({ + fuuid: '27905', + 'next-step-id': 'success', + 'total-steps': '3', + responseId: 'b9a5d224-cc5a-4e64-9800-5a3db9515fdf', + recipientEmail: 'test.rudderlabs21997@gmail.com', + formId: 'formosztd5', + recordedAt: { + ts: 1662695704, + date: '2022-09-09', + hour: 9, + minute: 25, + }, + submissionSource: 'amp', + elementjbtz42: 'Everything ', + element8jzo13: ['Reliable', 'High Quality', 'Useful'], + recipientData: { email: 'test.rudderlabs21997@gmail.com' }, + recommend: '9', + liking: 'upvote', + satisfaction: '4', + campaignId: '0b53e1bf-84ae-4198-9184-8a4d6e1fa3dd', + campaignName: 'Campaign-testing', + }), + }, + source: {}, }, ], method: 'POST', @@ -138,19 +156,24 @@ export const data = [ name: 'mailmodo', description: 'test-2', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - triggerData: { - data: {}, - triggerSource: 'Manual Add To List', - email: 'gou****@mailmodo.com', - userId: 'd3775892-****-4f2f-b9d5-e49810eb2cae', - journeyId: '349e986e-f56c-****-bc3b-b5f13c3e34da', - eventProperty: {}, + request: { + body: JSON.stringify({ + triggerData: { + data: {}, + triggerSource: 'Manual Add To List', + email: 'gou****@mailmodo.com', + userId: 'd3775892-****-4f2f-b9d5-e49810eb2cae', + journeyId: '349e986e-f56c-****-bc3b-b5f13c3e34da', + eventProperty: {}, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -169,7 +192,10 @@ export const data = [ anonymousId: '26c9ad4b531287858155ffa834be13dddc2c45df6e29af7230408953d732dd92', context: { externalId: [ - { id: 'd3775892-****-4f2f-b9d5-e49810eb2cae', type: 'mailmodoUserId' }, + { + id: 'd3775892-****-4f2f-b9d5-e49810eb2cae', + type: 'mailmodoUserId', + }, ], traits: { email: 'gou****@mailmodo.com' }, integration: { name: 'Mailmodo', version: '1.0.0' }, @@ -194,19 +220,24 @@ export const data = [ name: 'mailmodo', description: 'test-3', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - triggerData: { - data: {}, - triggerSource: 'Dashboard-change in property: first_name', - email: 'gou****@mailmodo.com', - userId: 'cc56708d-****-****-8c07-a4bfa5a7b79b', - journeyId: 'a78d7221-de34-47d8-81c6-5ad70cf4ee38', - eventProperty: {}, + request: { + body: JSON.stringify({ + triggerData: { + data: {}, + triggerSource: 'Dashboard-change in property: first_name', + email: 'gou****@mailmodo.com', + userId: 'cc56708d-****-****-8c07-a4bfa5a7b79b', + journeyId: 'a78d7221-de34-47d8-81c6-5ad70cf4ee38', + eventProperty: {}, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -225,7 +256,10 @@ export const data = [ anonymousId: '26c9ad4b531287858155ffa834be13dddc2c45df6e29af7230408953d732dd92', context: { externalId: [ - { id: 'cc56708d-****-****-8c07-a4bfa5a7b79b', type: 'mailmodoUserId' }, + { + id: 'cc56708d-****-****-8c07-a4bfa5a7b79b', + type: 'mailmodoUserId', + }, ], traits: { email: 'gou****@mailmodo.com' }, integration: { name: 'Mailmodo', version: '1.0.0' }, @@ -250,31 +284,41 @@ export const data = [ name: 'mailmodo', description: 'test-4', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - triggerData: { - data: {}, - formSubmissionData: { - element6ehxt3: 'Te**', - element6jkcy4: 'Bang****', - fuuid: '47949', - 'next-step-id': 'step7tr7n2', - 'total-steps': '3', - responseId: '4a8bfda7-****-4a8c-9cd1-a30d30a6dab9', - recipientEmail: 'gou****@mailmodo.com', - formId: 'formmqxnu2', - recordedAt: { ts: 1657097786, date: '2022-07-06', hour: 14, minute: 26 }, - submissionSource: 'amp', - }, - email: 'gou****@mailmodo.com', - triggerSource: 'form submission', - userId: '11bff3e8-****-4e93-a533-fd8f9defc768', - journeyId: '03664747-****-412e-8790-de9e9abe96a5', - eventProperty: {}, + request: { + body: JSON.stringify({ + triggerData: { + data: {}, + formSubmissionData: { + element6ehxt3: 'Te**', + element6jkcy4: 'Bang****', + fuuid: '47949', + 'next-step-id': 'step7tr7n2', + 'total-steps': '3', + responseId: '4a8bfda7-****-4a8c-9cd1-a30d30a6dab9', + recipientEmail: 'gou****@mailmodo.com', + formId: 'formmqxnu2', + recordedAt: { + ts: 1657097786, + date: '2022-07-06', + hour: 14, + minute: 26, + }, + submissionSource: 'amp', + }, + email: 'gou****@mailmodo.com', + triggerSource: 'form submission', + userId: '11bff3e8-****-4e93-a533-fd8f9defc768', + journeyId: '03664747-****-412e-8790-de9e9abe96a5', + eventProperty: {}, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -293,7 +337,10 @@ export const data = [ anonymousId: '26c9ad4b531287858155ffa834be13dddc2c45df6e29af7230408953d732dd92', context: { externalId: [ - { id: '11bff3e8-****-4e93-a533-fd8f9defc768', type: 'mailmodoUserId' }, + { + id: '11bff3e8-****-4e93-a533-fd8f9defc768', + type: 'mailmodoUserId', + }, ], traits: { email: 'gou****@mailmodo.com' }, integration: { name: 'Mailmodo', version: '1.0.0' }, @@ -328,25 +375,30 @@ export const data = [ name: 'mailmodo', description: 'test-5', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - triggerData: { - data: {}, - eventProperty: { - Name: 'APPLE iPhone 13 (Blue, 128 GB)', - Category: 'Mobiles', - 'Is Purchased': 'false', - Price: '829', - Currency: 'USD', - }, - triggerSource: 'New Custom Event Trigger - Product Viewed', - email: 'gou****@mailmodo.com', - userId: 'd3775892-****-4f2f-b9d5-e49810eb2cae', - journeyId: '3f135bf7-****-4e31-b265-f61cfe1bd423', + request: { + body: JSON.stringify({ + triggerData: { + data: {}, + eventProperty: { + Name: 'APPLE iPhone 13 (Blue, 128 GB)', + Category: 'Mobiles', + 'Is Purchased': 'false', + Price: '829', + Currency: 'USD', + }, + triggerSource: 'New Custom Event Trigger - Product Viewed', + email: 'gou****@mailmodo.com', + userId: 'd3775892-****-4f2f-b9d5-e49810eb2cae', + journeyId: '3f135bf7-****-4e31-b265-f61cfe1bd423', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -365,7 +417,10 @@ export const data = [ anonymousId: '26c9ad4b531287858155ffa834be13dddc2c45df6e29af7230408953d732dd92', context: { externalId: [ - { id: 'd3775892-****-4f2f-b9d5-e49810eb2cae', type: 'mailmodoUserId' }, + { + id: 'd3775892-****-4f2f-b9d5-e49810eb2cae', + type: 'mailmodoUserId', + }, ], traits: { email: 'gou****@mailmodo.com' }, integration: { name: 'Mailmodo', version: '1.0.0' }, @@ -395,19 +450,24 @@ export const data = [ name: 'mailmodo', description: 'test-6', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - triggerData: { - email: 'gou****@mailmodo.com', - data: {}, - userId: 'd3775892-****-4f2f-b9d5-e49810eb2cae', - journeyId: 'b1ee6bf6-****-4b5a-b7b5-0637853cd8c3', - triggerSource: 'Api', - eventProperty: {}, + request: { + body: JSON.stringify({ + triggerData: { + email: 'gou****@mailmodo.com', + data: {}, + userId: 'd3775892-****-4f2f-b9d5-e49810eb2cae', + journeyId: 'b1ee6bf6-****-4b5a-b7b5-0637853cd8c3', + triggerSource: 'Api', + eventProperty: {}, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -426,7 +486,10 @@ export const data = [ anonymousId: '26c9ad4b531287858155ffa834be13dddc2c45df6e29af7230408953d732dd92', context: { externalId: [ - { id: 'd3775892-****-4f2f-b9d5-e49810eb2cae', type: 'mailmodoUserId' }, + { + id: 'd3775892-****-4f2f-b9d5-e49810eb2cae', + type: 'mailmodoUserId', + }, ], traits: { email: 'gou****@mailmodo.com' }, integration: { name: 'Mailmodo', version: '1.0.0' }, @@ -451,24 +514,29 @@ export const data = [ name: 'mailmodo', description: 'test-7', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventData: { type: 'html' }, - triggerData: { - data: {}, - triggerSource: 'CsvList', - email: 'gou****@mailmodo.com', - triggerDetails: - 'file:5d31c2b4-****-4a84-acd3-834cae80231b/5a61e0b8-b6f6-4d7d-abf2-90357d6638af', - userId: 'cc56708d-****-4fea-8c07-a4bfa5a7b79b', - journeyId: '5d31c2b4-****-4a84-acd3-834cae80231b', - eventProperty: {}, + request: { + body: JSON.stringify({ + eventData: { type: 'html' }, + triggerData: { + data: {}, + triggerSource: 'CsvList', + email: 'gou****@mailmodo.com', + triggerDetails: + 'file:5d31c2b4-****-4a84-acd3-834cae80231b/5a61e0b8-b6f6-4d7d-abf2-90357d6638af', + userId: 'cc56708d-****-4fea-8c07-a4bfa5a7b79b', + journeyId: '5d31c2b4-****-4a84-acd3-834cae80231b', + eventProperty: {}, + }, + lastCampaignEmailRef: '064c76e7-****-4780-a001-226c066aaa12', + lastCampaignId: '31422f76-****-4a72-a630-dd6f9f615bc3', + }), }, - lastCampaignEmailRef: '064c76e7-****-4780-a001-226c066aaa12', - lastCampaignId: '31422f76-****-4a72-a630-dd6f9f615bc3', + source: {}, }, ], method: 'POST', @@ -487,7 +555,10 @@ export const data = [ anonymousId: '26c9ad4b531287858155ffa834be13dddc2c45df6e29af7230408953d732dd92', context: { externalId: [ - { id: 'cc56708d-****-4fea-8c07-a4bfa5a7b79b', type: 'mailmodoUserId' }, + { + id: 'cc56708d-****-4fea-8c07-a4bfa5a7b79b', + type: 'mailmodoUserId', + }, ], traits: { email: 'gou****@mailmodo.com' }, integration: { name: 'Mailmodo', version: '1.0.0' }, @@ -517,27 +588,37 @@ export const data = [ name: 'mailmodo', description: 'test-8', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - fuuid: '98255', - 'next-step-id': 'success', - 'total-steps': '3', - responseId: 'ad20a980-4fce-44b6-887d-2236df514a76', - recipientEmail: 'test@rudderstack.com', - formId: 'formosztd5', - recordedAt: { ts: 1662695887, date: '2022-09-09', hour: 9, minute: 28 }, - submissionSource: 'amp', - elementjbtz42: 'peace', - element8jzo13: ['Useful'], - recipientData: { email: 'test@rudderstack.com', first_name: 'abcda' }, - recommend: '1', - liking: 'downvote', - satisfaction: '1', - campaignId: '0b53e1bf-84ae-4198-9184-8a4d6e1fa3dd', - campaignName: 'Campaign-testing', + request: { + body: JSON.stringify({ + fuuid: '98255', + 'next-step-id': 'success', + 'total-steps': '3', + responseId: 'ad20a980-4fce-44b6-887d-2236df514a76', + recipientEmail: 'test@rudderstack.com', + formId: 'formosztd5', + recordedAt: { + ts: 1662695887, + date: '2022-09-09', + hour: 9, + minute: 28, + }, + submissionSource: 'amp', + elementjbtz42: 'peace', + element8jzo13: ['Useful'], + recipientData: { email: 'test@rudderstack.com', first_name: 'abcda' }, + recommend: '1', + liking: 'downvote', + satisfaction: '1', + campaignId: '0b53e1bf-84ae-4198-9184-8a4d6e1fa3dd', + campaignName: 'Campaign-testing', + }), + }, + source: {}, }, ], method: 'POST', @@ -557,7 +638,10 @@ export const data = [ context: { integration: { name: 'Mailmodo', version: '1.0.0' }, library: { name: 'unknown', version: 'unknown' }, - traits: { email: 'test@rudderstack.com', first_name: 'abcda' }, + traits: { + email: 'test@rudderstack.com', + first_name: 'abcda', + }, }, event: 'Form Submitted', integrations: { Mailmodo: false }, diff --git a/test/integrations/sources/moengage/data.ts b/test/integrations/sources/moengage/data.ts index c307959121f..50c127f4830 100644 --- a/test/integrations/sources/moengage/data.ts +++ b/test/integrations/sources/moengage/data.ts @@ -1,132 +1,126 @@ -const data = [ +export const data = [ { name: 'moengage', description: 'Simple track call', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', - channel: 'web', - context: { - timezone: 'Wrong/Timezone', - app: { - build: '1.0.0', - name: 'RudderLabs JavaScript SDK', - namespace: 'com.rudderlabs.javascript', - version: '1.1.6', - }, - library: { - name: 'RudderLabs JavaScript SDK', - version: '1.1.6', - }, - locale: 'en-GB', - os: { - name: '', - version: '', - }, - page: { - path: '/testing/script-test.html', - referrer: '', - search: '', - title: '', - url: 'http://localhost:3243/testing/script-test.html', - }, - screen: { - density: 2, - }, - traits: { - company: { - id: 'abc123', - }, - createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', - email: 'rudderTest@gmail.com', - name: 'Rudder Test', - plan: 'Enterprise', - }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36', - }, - event: 'Order Completed', - integrations: { - All: true, - }, - messageId: 'a0adfab9-baf7-4e09-a2ce-bbe2844c324a', - originalTimestamp: '2020-10-16T08:10:12.782Z', - properties: { - checkout_id: 'what is checkout id here??', - coupon: 'APPARELSALE', - currency: 'GBP', - order_id: 'transactionId', - products: [ - { - brand: '', - category: 'Merch', - currency: 'GBP', - image_url: 'https://www.example.com/product/bacon-jam.jpg', - name: 'Food/Drink', - position: 1, - price: 3, - product_id: 'product-bacon-jam', - quantity: 2, - sku: 'sku-1', - typeOfProduct: 'Food', - url: 'https://www.example.com/product/bacon-jam', - value: 6, - variant: 'Extra topped', - }, - { - brand: 'Levis', - category: 'Merch', - currency: 'GBP', - image_url: 'https://www.example.com/product/t-shirt.jpg', - name: 'T-Shirt', - position: 2, - price: 12.99, - product_id: 'product-t-shirt', - quantity: 1, - sku: 'sku-2', - typeOfProduct: 'Shirt', - url: 'https://www.example.com/product/t-shirt', - value: 12.99, - variant: 'White', + request: { + body: JSON.stringify({ + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + timezone: 'Wrong/Timezone', + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.1.6', + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.6', + }, + locale: 'en-GB', + os: { name: '', version: '' }, + page: { + path: '/testing/script-test.html', + referrer: '', + search: '', + title: '', + url: 'http://localhost:3243/testing/script-test.html', + }, + screen: { density: 2 }, + traits: { + company: { id: 'abc123' }, + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36', }, - { - brand: 'Levis', - category: 'Merch', + event: 'Order Completed', + integrations: { All: true }, + messageId: 'a0adfab9-baf7-4e09-a2ce-bbe2844c324a', + originalTimestamp: '2020-10-16T08:10:12.782Z', + properties: { + checkout_id: 'what is checkout id here??', coupon: 'APPARELSALE', currency: 'GBP', - image_url: 'https://www.example.com/product/offer-t-shirt.jpg', - name: 'T-Shirt-on-offer', - position: 1, - price: 12.99, - product_id: 'offer-t-shirt', - quantity: 1, - sku: 'sku-3', - typeOfProduct: 'Shirt', - url: 'https://www.example.com/product/offer-t-shirt', - value: 12.99, - variant: 'Black', + order_id: 'transactionId', + products: [ + { + brand: '', + category: 'Merch', + currency: 'GBP', + image_url: 'https://www.example.com/product/bacon-jam.jpg', + name: 'Food/Drink', + position: 1, + price: 3, + product_id: 'product-bacon-jam', + quantity: 2, + sku: 'sku-1', + typeOfProduct: 'Food', + url: 'https://www.example.com/product/bacon-jam', + value: 6, + variant: 'Extra topped', + }, + { + brand: 'Levis', + category: 'Merch', + currency: 'GBP', + image_url: 'https://www.example.com/product/t-shirt.jpg', + name: 'T-Shirt', + position: 2, + price: 12.99, + product_id: 'product-t-shirt', + quantity: 1, + sku: 'sku-2', + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/t-shirt', + value: 12.99, + variant: 'White', + }, + { + brand: 'Levis', + category: 'Merch', + coupon: 'APPARELSALE', + currency: 'GBP', + image_url: 'https://www.example.com/product/offer-t-shirt.jpg', + name: 'T-Shirt-on-offer', + position: 1, + price: 12.99, + product_id: 'offer-t-shirt', + quantity: 1, + sku: 'sku-3', + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/offer-t-shirt', + value: 12.99, + variant: 'Black', + }, + ], + revenue: 31.98, + shipping: 4, + value: 31.98, }, - ], - revenue: 31.98, - shipping: 4, - value: 31.98, + receivedAt: '2020-10-16T13:40:12.792+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T08:10:12.783Z', + timestamp: '2020-10-16T13:40:12.791+05:30', + type: 'track', + userId: 'rudder123', + }), }, - receivedAt: '2020-10-16T13:40:12.792+05:30', - request_ip: '[::1]', - sentAt: '2020-10-16T08:10:12.783Z', - timestamp: '2020-10-16T13:40:12.791+05:30', - type: 'track', - userId: 'rudder123', + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -153,10 +147,7 @@ const data = [ version: '1.1.6', }, locale: 'en-GB', - os: { - name: '', - version: '', - }, + os: { name: '', version: '' }, page: { path: '/testing/script-test.html', referrer: '', @@ -164,13 +155,9 @@ const data = [ title: '', url: 'http://localhost:3243/testing/script-test.html', }, - screen: { - density: 2, - }, + screen: { density: 2 }, traits: { - company: { - id: 'abc123', - }, + company: { id: 'abc123' }, createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', email: 'rudderTest@gmail.com', name: 'Rudder Test', @@ -180,9 +167,7 @@ const data = [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36', }, event: 'Order Completed', - integrations: { - All: true, - }, + integrations: { All: true }, messageId: 'a0adfab9-baf7-4e09-a2ce-bbe2844c324a', originalTimestamp: '2020-10-16T08:10:12.782Z', properties: { @@ -263,204 +248,196 @@ const data = [ name: 'moengage', description: 'Batch of events', module: 'source', - version: 'v0', + version: 'v2', overrideReceivedAt: true, overrideRequestIP: true, input: { request: { body: [ { - batch: [ - { - type: 'page', - event: 'home', - sentAt: '2020-11-12T21:12:54.117Z', - userId: 'sajal', - channel: 'mobile', - context: { - traits: {}, - library: { - name: 'rudder-sdk-ruby-sync', - version: '1.0.7', - }, - page: { - path: '/Rectified.html', - referrer: 'http://localhost:1112/', - search: '', - title: '', - url: 'http://localhost:1112/Rectified.html', - }, - userAgent: - 'Dalvik/2.1.0 (Linux; U; Android 10; Redmi K20 Pro MIUI/V12.0.3.0.QFKINXM)', - }, - rudderId: 'asdfasdfsadf', - properties: { - name: 'asdfsadf', - }, - timestamp: '2020-11-12T21:12:41.320Z', - anonymousId: '123123123123', - }, - { - anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', - channel: 'web', - context: { - timezone: 'Asia/Tokyo', - app: { - build: '1.0.0', - name: 'RudderLabs JavaScript SDK', - namespace: 'com.rudderlabs.javascript', - version: '1.1.6', - }, - library: { - name: 'RudderLabs JavaScript SDK', - version: '1.1.6', - }, - locale: 'en-GB', - os: { - name: '', - version: '', - }, - page: { - path: '/testing/script-test.html', - referrer: '', - search: '', - title: '', - url: 'http://localhost:3243/testing/script-test.html', - }, - screen: { - density: 2, - }, - traits: { - company: { - id: 'abc123', + request: { + body: JSON.stringify({ + batch: [ + { + type: 'page', + event: 'home', + sentAt: '2020-11-12T21:12:54.117Z', + userId: 'sajal', + channel: 'mobile', + context: { + traits: {}, + library: { + name: 'rudder-sdk-ruby-sync', + version: '1.0.7', + }, + page: { + path: '/Rectified.html', + referrer: 'http://localhost:1112/', + search: '', + title: '', + url: 'http://localhost:1112/Rectified.html', + }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 10; Redmi K20 Pro MIUI/V12.0.3.0.QFKINXM)', }, - createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', - email: 'rudderTest@gmail.com', - name: 'Rudder Test', - plan: 'Enterprise', + rudderId: 'asdfasdfsadf', + properties: { name: 'asdfsadf' }, + timestamp: '2020-11-12T21:12:41.320Z', + anonymousId: '123123123123', }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36', - }, - event: 'Order Completed', - integrations: { - All: true, - }, - messageId: 'a0adfab9-baf7-4e09-a2ce-bbe2844c324a', - originalTimestamp: '2020-10-16T08:10:12.782Z', - properties: { - checkout_id: 'what is checkout id here??', - coupon: 'APPARELSALE', - currency: 'GBP', - order_id: 'transactionId', - category: 'some category', - originalArray: [ - { - nested_field: 'nested value', - tags: ['tag_1', 'tag_2', 'tag_3'], - }, - { - nested_field: 'nested value', - tags: ['tag_1', 'tag_2', 'tag_3'], - }, - { - nested_field: 'nested value', - tags: ['tag_1', 'tag_2', 'tag_3'], - }, - { - nested_field: 'nested value', - tags: ['tag_1', 'tag_2', 'tag_3'], - }, - { - nested_field: 'nested value', - tags: ['tag_1', 'tag_2', 'tag_3'], - }, - { - nested_field: 'nested value', - tags: ['tag_1', 'tag_2', 'tag_3'], - }, - { - nested_field: 'nested value', - tags: ['tag_1', 'tag_2', 'tag_3'], - }, - { - nested_field: 'nested value', - tags: ['tag_1', 'tag_2', 'tag_3'], - }, - { - nested_field: 'nested value', - tags: ['tag_1', 'tag_2', 'tag_3'], - }, - ], - products: [ - { - brand: '', - category: 'Merch', - currency: 'GBP', - image_url: 'https://www.example.com/product/bacon-jam.jpg', - name: 'Food/Drink', - position: 1, - price: 3, - product_id: 'product-bacon-jam', - quantity: 2, - sku: 'sku-1', - typeOfProduct: 'Food', - url: 'https://www.example.com/product/bacon-jam', - value: 6, - variant: 'Extra topped', - }, - { - brand: 'Levis', - category: 'Merch', - currency: 'GBP', - image_url: 'https://www.example.com/product/t-shirt.jpg', - name: 'T-Shirt', - position: 2, - price: 12.99, - product_id: 'product-t-shirt', - quantity: 1, - sku: 'sku-2', - typeOfProduct: 'Shirt', - url: 'https://www.example.com/product/t-shirt', - value: 12.99, - variant: 'White', + { + anonymousId: '4eb021e9-a2af-4926-ae82-fe996d12f3c5', + channel: 'web', + context: { + timezone: 'Asia/Tokyo', + app: { + build: '1.0.0', + name: 'RudderLabs JavaScript SDK', + namespace: 'com.rudderlabs.javascript', + version: '1.1.6', + }, + library: { + name: 'RudderLabs JavaScript SDK', + version: '1.1.6', + }, + locale: 'en-GB', + os: { name: '', version: '' }, + page: { + path: '/testing/script-test.html', + referrer: '', + search: '', + title: '', + url: 'http://localhost:3243/testing/script-test.html', + }, + screen: { density: 2 }, + traits: { + company: { id: 'abc123' }, + createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', + email: 'rudderTest@gmail.com', + name: 'Rudder Test', + plan: 'Enterprise', + }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36', }, - { - brand: 'Levis', - category: 'Merch', + event: 'Order Completed', + integrations: { All: true }, + messageId: 'a0adfab9-baf7-4e09-a2ce-bbe2844c324a', + originalTimestamp: '2020-10-16T08:10:12.782Z', + properties: { + checkout_id: 'what is checkout id here??', coupon: 'APPARELSALE', currency: 'GBP', - image_url: 'https://www.example.com/product/offer-t-shirt.jpg', - name: 'T-Shirt-on-offer', - position: 1, - price: 12.99, - product_id: 'offer-t-shirt', - quantity: 1, - sku: 'sku-3', - typeOfProduct: 'Shirt', - url: 'https://www.example.com/product/offer-t-shirt', - value: 12.99, - variant: 'Black', + order_id: 'transactionId', + category: 'some category', + originalArray: [ + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3'], + }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3'], + }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3'], + }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3'], + }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3'], + }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3'], + }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3'], + }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3'], + }, + { + nested_field: 'nested value', + tags: ['tag_1', 'tag_2', 'tag_3'], + }, + ], + products: [ + { + brand: '', + category: 'Merch', + currency: 'GBP', + image_url: 'https://www.example.com/product/bacon-jam.jpg', + name: 'Food/Drink', + position: 1, + price: 3, + product_id: 'product-bacon-jam', + quantity: 2, + sku: 'sku-1', + typeOfProduct: 'Food', + url: 'https://www.example.com/product/bacon-jam', + value: 6, + variant: 'Extra topped', + }, + { + brand: 'Levis', + category: 'Merch', + currency: 'GBP', + image_url: 'https://www.example.com/product/t-shirt.jpg', + name: 'T-Shirt', + position: 2, + price: 12.99, + product_id: 'product-t-shirt', + quantity: 1, + sku: 'sku-2', + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/t-shirt', + value: 12.99, + variant: 'White', + }, + { + brand: 'Levis', + category: 'Merch', + coupon: 'APPARELSALE', + currency: 'GBP', + image_url: 'https://www.example.com/product/offer-t-shirt.jpg', + name: 'T-Shirt-on-offer', + position: 1, + price: 12.99, + product_id: 'offer-t-shirt', + quantity: 1, + sku: 'sku-3', + typeOfProduct: 'Shirt', + url: 'https://www.example.com/product/offer-t-shirt', + value: 12.99, + variant: 'Black', + }, + ], + revenue: 31.98, + shipping: 4, + value: 31.98, }, - ], - revenue: 31.98, - shipping: 4, - value: 31.98, - }, - receivedAt: '2020-10-16T13:40:12.792+05:30', - request_ip: '[::1]', - sentAt: '2020-10-16T08:10:12.783Z', - timestamp: '2020-10-16T13:40:12.791+05:30', - type: 'track', - userId: 'rudder123', - }, - ], + receivedAt: '2020-10-16T13:40:12.792+05:30', + request_ip: '[::1]', + sentAt: '2020-10-16T08:10:12.783Z', + timestamp: '2020-10-16T13:40:12.791+05:30', + type: 'track', + userId: 'rudder123', + }, + ], + }), + }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -479,10 +456,7 @@ const data = [ channel: 'mobile', context: { traits: {}, - library: { - name: 'rudder-sdk-ruby-sync', - version: '1.0.7', - }, + library: { name: 'rudder-sdk-ruby-sync', version: '1.0.7' }, page: { path: '/Rectified.html', referrer: 'http://localhost:1112/', @@ -494,9 +468,7 @@ const data = [ 'Dalvik/2.1.0 (Linux; U; Android 10; Redmi K20 Pro MIUI/V12.0.3.0.QFKINXM)', }, rudderId: 'asdfasdfsadf', - properties: { - name: 'asdfsadf', - }, + properties: { name: 'asdfsadf' }, timestamp: '2020-11-12T21:12:41.320Z', anonymousId: '123123123123', }, @@ -516,10 +488,7 @@ const data = [ version: '1.1.6', }, locale: 'en-GB', - os: { - name: '', - version: '', - }, + os: { name: '', version: '' }, page: { path: '/testing/script-test.html', referrer: '', @@ -527,13 +496,9 @@ const data = [ title: '', url: 'http://localhost:3243/testing/script-test.html', }, - screen: { - density: 2, - }, + screen: { density: 2 }, traits: { - company: { - id: 'abc123', - }, + company: { id: 'abc123' }, createdAt: 'Thu Mar 24 2016 17:46:45 GMT+0000 (UTC)', email: 'rudderTest@gmail.com', name: 'Rudder Test', @@ -543,9 +508,7 @@ const data = [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.80 Safari/537.36', }, event: 'Order Completed', - integrations: { - All: true, - }, + integrations: { All: true }, messageId: 'a0adfab9-baf7-4e09-a2ce-bbe2844c324a', originalTimestamp: '2020-10-16T08:10:12.782Z', properties: { @@ -662,7 +625,3 @@ const data = [ }, }, ]; - -module.exports = { - data, -}; diff --git a/test/integrations/sources/monday/data.ts b/test/integrations/sources/monday/data.ts index 1bb26930901..a57794ca40d 100644 --- a/test/integrations/sources/monday/data.ts +++ b/test/integrations/sources/monday/data.ts @@ -3,28 +3,33 @@ export const data = [ name: 'monday', description: 'test-0', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - userId: 33556506, - originalTriggerUuid: null, - boardId: 3139815405, - pulseId: 3160188786, - pulseName: 'New Sprint Item', - groupId: 'topics', - groupName: 'Group Title', - groupColor: '#579bfc', - isTopGroup: true, - columnValues: {}, - app: 'monday', - type: 'create_pulse', - triggerTime: '2022-08-30T09:02:39.191Z', - subscriptionId: 150881106, - triggerUuid: '049869226bf6711705c62e301a2c3eee', + request: { + body: JSON.stringify({ + event: { + userId: 33556506, + originalTriggerUuid: null, + boardId: 3139815405, + pulseId: 3160188786, + pulseName: 'New Sprint Item', + groupId: 'topics', + groupName: 'Group Title', + groupColor: '#579bfc', + isTopGroup: true, + columnValues: {}, + app: 'monday', + type: 'create_pulse', + triggerTime: '2022-08-30T09:02:39.191Z', + subscriptionId: 150881106, + triggerUuid: '049869226bf6711705c62e301a2c3eee', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -78,23 +83,28 @@ export const data = [ name: 'monday', description: 'test-1', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - userId: 33556506, - originalTriggerUuid: null, - boardId: 3139815405, - itemId: 3160188786, - itemName: 'New Sprint Item', - app: 'monday', - type: 'delete_pulse', - triggerTime: '2022-08-30T09:06:09.176Z', - subscriptionId: 150882006, - triggerUuid: '4e4f87c8255c4ba4ba2f5e9934cb6d40', + request: { + body: JSON.stringify({ + event: { + userId: 33556506, + originalTriggerUuid: null, + boardId: 3139815405, + itemId: 3160188786, + itemName: 'New Sprint Item', + app: 'monday', + type: 'delete_pulse', + triggerTime: '2022-08-30T09:06:09.176Z', + subscriptionId: 150882006, + triggerUuid: '4e4f87c8255c4ba4ba2f5e9934cb6d40', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -143,39 +153,48 @@ export const data = [ name: 'monday', description: 'test-2', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - userId: 33556506, - originalTriggerUuid: null, - boardId: 3139815405, - groupId: 'topics', - pulseId: 3160181387, - pulseName: 'New Sprint Item', - columnId: 'status', - columnType: 'color', - columnTitle: 'Status', - value: { - label: { - index: 1, - text: 'Done', - style: { color: '#00c875', border: '#00B461', var_name: 'green-shadow' }, - is_done: true, + request: { + body: JSON.stringify({ + event: { + userId: 33556506, + originalTriggerUuid: null, + boardId: 3139815405, + groupId: 'topics', + pulseId: 3160181387, + pulseName: 'New Sprint Item', + columnId: 'status', + columnType: 'color', + columnTitle: 'Status', + value: { + label: { + index: 1, + text: 'Done', + style: { + color: '#00c875', + border: '#00B461', + var_name: 'green-shadow', + }, + is_done: true, + }, + post_id: null, + }, + previousValue: null, + changedAt: 1661859406.8970098, + isTopGroup: true, + app: 'monday', + type: 'update_column_value', + triggerTime: '2022-08-30T11:36:47.406Z', + subscriptionId: 150894742, + triggerUuid: '51730730740a9d00ec45203bd392a9bd', }, - post_id: null, - }, - previousValue: null, - changedAt: 1661859406.8970098, - isTopGroup: true, - app: 'monday', - type: 'update_column_value', - triggerTime: '2022-08-30T11:36:47.406Z', - subscriptionId: 150894742, - triggerUuid: '51730730740a9d00ec45203bd392a9bd', + }), }, + source: {}, }, ], method: 'POST', @@ -206,7 +225,11 @@ export const data = [ label: { text: 'Done', index: 1, - style: { color: '#00c875', border: '#00B461', var_name: 'green-shadow' }, + style: { + color: '#00c875', + border: '#00B461', + var_name: 'green-shadow', + }, is_done: true, }, post_id: null, @@ -240,25 +263,30 @@ export const data = [ name: 'monday', description: 'test-3', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - userId: 33556506, - originalTriggerUuid: null, - boardId: 3139815405, - groupId: 'topics', - pulseId: 3160181387, - value: { name: 'New Sprint Item renamed' }, - previousValue: { name: 'New Sprint Item' }, - app: 'monday', - type: 'update_name', - triggerTime: '2022-08-30T11:40:17.351Z', - subscriptionId: 150910867, - triggerUuid: '05ce13d32d0256c4fb7dd5de25b1a1ba', + request: { + body: JSON.stringify({ + event: { + userId: 33556506, + originalTriggerUuid: null, + boardId: 3139815405, + groupId: 'topics', + pulseId: 3160181387, + value: { name: 'New Sprint Item renamed' }, + previousValue: { name: 'New Sprint Item' }, + app: 'monday', + type: 'update_name', + triggerTime: '2022-08-30T11:40:17.351Z', + subscriptionId: 150910867, + triggerUuid: '05ce13d32d0256c4fb7dd5de25b1a1ba', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -309,31 +337,36 @@ export const data = [ name: 'monday', description: 'test-4', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - userId: 33556506, - originalTriggerUuid: null, - boardId: 3160805239, - pulseId: 3161163765, - pulseName: 'new subitem', - groupId: 'topics', - groupName: 'Subitems', - groupColor: '#579bfc', - isTopGroup: true, - columnValues: {}, - app: 'monday', - type: 'create_pulse', - triggerTime: '2022-08-30T12:56:27.281Z', - subscriptionId: 150911592, - triggerUuid: '70a2219427804e47a508a91b5c244543', - parentItemId: '3160181387', - parentItemBoardId: '3139815405', - itemId: 3161163765, + request: { + body: JSON.stringify({ + event: { + userId: 33556506, + originalTriggerUuid: null, + boardId: 3160805239, + pulseId: 3161163765, + pulseName: 'new subitem', + groupId: 'topics', + groupName: 'Subitems', + groupColor: '#579bfc', + isTopGroup: true, + columnValues: {}, + app: 'monday', + type: 'create_pulse', + triggerTime: '2022-08-30T12:56:27.281Z', + subscriptionId: 150911592, + triggerUuid: '70a2219427804e47a508a91b5c244543', + parentItemId: '3160181387', + parentItemBoardId: '3139815405', + itemId: 3161163765, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -390,23 +423,28 @@ export const data = [ name: 'monday', description: 'test-5', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - userId: 33556506, - originalTriggerUuid: null, - boardId: 3139815405, - itemId: 3160181387, - itemName: 'New Sprint Item renamed', - app: 'monday', - type: 'archive_pulse', - triggerTime: '2022-08-30T12:58:15.844Z', - subscriptionId: 150925947, - triggerUuid: 'aa8bd5dbb6fd592aedd57322dd776379', + request: { + body: JSON.stringify({ + event: { + userId: 33556506, + originalTriggerUuid: null, + boardId: 3139815405, + itemId: 3160181387, + itemName: 'New Sprint Item renamed', + app: 'monday', + type: 'archive_pulse', + triggerTime: '2022-08-30T12:58:15.844Z', + subscriptionId: 150925947, + triggerUuid: 'aa8bd5dbb6fd592aedd57322dd776379', + }, + }), }, + source: {}, }, ], method: 'POST', diff --git a/test/integrations/sources/olark/data.ts b/test/integrations/sources/olark/data.ts index 3486e849076..f3262dc1a28 100644 --- a/test/integrations/sources/olark/data.ts +++ b/test/integrations/sources/olark/data.ts @@ -3,34 +3,42 @@ export const data = [ name: 'olark', description: 'Olark webhook response', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - kind: 'Conversation', - id: 'ho6HrHxoabmm6q0G103JU0JFaor0BobA', - manuallySubmitted: false, - items: [ - { - kind: 'OfflineMessage', - timestamp: '1669285628.796693', - body: 'name: test rudderlabs\nemail: ruddertest@gmail.com\nMessage: I am Fine', - }, - ], - tags: [], - visitor: { - kind: 'Visitor', - id: '45WjM9eMYwJ7cJMo103JU0JaForAA6Db', - fullName: 'test', - emailAddress: 'ruddertest@gmail.com', - ip: '', - country: 'India', - countryCode: 'IN', - browser: 'Chrome 105.0.0.0', - operatingSystem: 'Macintosh', - conversationBeginPage: 'http://localhost:5503/', + request: { + body: JSON.stringify({ + kind: 'Conversation', + id: 'ho6HrHxoabmm6q0G103JU0JFaor0BobA', + manuallySubmitted: false, + items: [ + { + kind: 'OfflineMessage', + timestamp: '1669285628.796693', + body: + 'name: test rudderlabs\n' + + 'email: ruddertest@gmail.com\n' + + 'Message: I am Fine', + }, + ], + tags: [], + visitor: { + kind: 'Visitor', + id: '45WjM9eMYwJ7cJMo103JU0JaForAA6Db', + fullName: 'test', + emailAddress: 'ruddertest@gmail.com', + ip: '', + country: 'India', + countryCode: 'IN', + browser: 'Chrome 105.0.0.0', + operatingSystem: 'Macintosh', + conversationBeginPage: 'http://localhost:5503/', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -53,7 +61,11 @@ export const data = [ context: { os: { name: 'Macintosh' }, page: { url: 'http://localhost:5503/' }, - traits: { name: 'test', email: 'ruddertest@gmail.com', country: 'India' }, + traits: { + name: 'test', + email: 'ruddertest@gmail.com', + country: 'India', + }, browser: { name: 'Chrome', version: '105.0.0.0' }, library: { name: 'unknown', version: 'unknown' }, integration: { name: 'Olark' }, @@ -62,7 +74,10 @@ export const data = [ tags: [], items: [ { - body: 'name: test rudderlabs\nemail: ruddertest@gmail.com\nMessage: I am Fine', + body: + 'name: test rudderlabs\n' + + 'email: ruddertest@gmail.com\n' + + 'Message: I am Fine', kind: 'OfflineMessage', timestamp: '1669285628.796693', }, @@ -81,58 +96,68 @@ export const data = [ name: 'olark', description: 'Olark webhook response', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - kind: 'Conversation', - id: 'NOTAREALTRANSCRIPT5LGcbVTa3hKBRB', - manuallySubmitted: false, - items: [ - { - kind: 'MessageToVisitor', - nickname: 'Olark operator', - operatorId: '6208911878914048', - timestamp: '1473774819.263083', - body: 'Hi from an operator', - }, - { - kind: 'MessageToOperator', - nickname: 'Returning Visitor | USA (San Francisco, CA) #7617', - timestamp: '1473774821.411154', - body: 'Hi from a visitor', - visitor_nickname: 'Olark Visitor', - }, - ], - tags: ['test_example'], - visitor: { - kind: 'Visitor', - id: 'NOTAREALVISITORIDS5LGl6QUrK2OaPP', - fullName: 'Olark', - phoneNumber: '5555555555', - emailAddress: 'support+integrationtest@olark.com', - ip: '', - city: 'San Francisco', - region: 'CA', - country: 'United States', - countryCode: 'US', - organization: 'Visitor Organization', - browser: 'Internet Explorer 11', - operatingSystem: 'Windows', - referrer: 'http://www.olark.com', - conversationBeginPage: 'http://www.olark.com', - chat_feedback: { overall_chat: 4, responsiveness: 5, knowledge: 4, friendliness: 5 }, - }, - operators: { - '6208911878914048': { - kind: 'Operator', - id: '6208911878914048', - nickname: 'integration', - emailAddress: 'integration-accounts@rudderstack.com', - username: 'integration-accounts-92750bc547', - }, + request: { + body: JSON.stringify({ + kind: 'Conversation', + id: 'NOTAREALTRANSCRIPT5LGcbVTa3hKBRB', + manuallySubmitted: false, + items: [ + { + kind: 'MessageToVisitor', + nickname: 'Olark operator', + operatorId: '6208911878914048', + timestamp: '1473774819.263083', + body: 'Hi from an operator', + }, + { + kind: 'MessageToOperator', + nickname: 'Returning Visitor | USA (San Francisco, CA) #7617', + timestamp: '1473774821.411154', + body: 'Hi from a visitor', + visitor_nickname: 'Olark Visitor', + }, + ], + tags: ['test_example'], + visitor: { + kind: 'Visitor', + id: 'NOTAREALVISITORIDS5LGl6QUrK2OaPP', + fullName: 'Olark', + phoneNumber: '5555555555', + emailAddress: 'support+integrationtest@olark.com', + ip: '', + city: 'San Francisco', + region: 'CA', + country: 'United States', + countryCode: 'US', + organization: 'Visitor Organization', + browser: 'Internet Explorer 11', + operatingSystem: 'Windows', + referrer: 'http://www.olark.com', + conversationBeginPage: 'http://www.olark.com', + chat_feedback: { + overall_chat: 4, + responsiveness: 5, + knowledge: 4, + friendliness: 5, + }, + }, + operators: { + '6208911878914048': { + kind: 'Operator', + id: '6208911878914048', + nickname: 'integration', + emailAddress: 'integration-accounts@rudderstack.com', + username: 'integration-accounts-92750bc547', + }, + }, + }), }, + source: {}, }, ], method: 'POST', @@ -162,7 +187,10 @@ export const data = [ userId: 'NOTAREALVISITORIDS5LGl6QUrK2OaPP', context: { os: { name: 'Windows' }, - page: { url: 'http://www.olark.com', referrer: 'http://www.olark.com' }, + page: { + url: 'http://www.olark.com', + referrer: 'http://www.olark.com', + }, traits: { city: 'San Francisco', name: 'Olark', @@ -207,35 +235,47 @@ export const data = [ name: 'olark', description: 'Olark webhook response', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - kind: 'Conversation', - id: 'ho6HrHxoabmm6q0G103JU0JFaor0BobA', - manuallySubmitted: false, - items: [ - { - kind: 'OfflineMessage', - timestamp: '1669288532.567071', - body: 'name: test rudderstack\nemail: rudder14@gmail.com\nMessage: veavv', - }, - ], - tags: [], - groups: [{ kind: 'Group', id: 'ca77f4296fb7568909ad864aebf48201', name: 'Group 1' }], - visitor: { - kind: 'Visitor', - id: '45WjM9eMYwJ7cJMo103JU0JaForAA6Db', - fullName: 'test rudderstack', - emailAddress: 'rudder14@gmail.com', - ip: '', - country: 'India', - countryCode: 'IN', - browser: 'Chrome 105.0.0.0', - operatingSystem: 'Macintosh', - conversationBeginPage: 'http://localhost:5503/', + request: { + body: JSON.stringify({ + kind: 'Conversation', + id: 'ho6HrHxoabmm6q0G103JU0JFaor0BobA', + manuallySubmitted: false, + items: [ + { + kind: 'OfflineMessage', + timestamp: '1669288532.567071', + body: + 'name: test rudderstack\n' + 'email: rudder14@gmail.com\n' + 'Message: veavv', + }, + ], + tags: [], + groups: [ + { + kind: 'Group', + id: 'ca77f4296fb7568909ad864aebf48201', + name: 'Group 1', + }, + ], + visitor: { + kind: 'Visitor', + id: '45WjM9eMYwJ7cJMo103JU0JaForAA6Db', + fullName: 'test rudderstack', + emailAddress: 'rudder14@gmail.com', + ip: '', + country: 'India', + countryCode: 'IN', + browser: 'Chrome 105.0.0.0', + operatingSystem: 'Macintosh', + conversationBeginPage: 'http://localhost:5503/', + }, + }), }, + source: {}, }, ], method: 'POST', @@ -271,7 +311,10 @@ export const data = [ tags: [], items: [ { - body: 'name: test rudderstack\nemail: rudder14@gmail.com\nMessage: veavv', + body: + 'name: test rudderstack\n' + + 'email: rudder14@gmail.com\n' + + 'Message: veavv', kind: 'OfflineMessage', timestamp: '1669288532.567071', }, diff --git a/test/integrations/sources/ortto/data.ts b/test/integrations/sources/ortto/data.ts index 6feed3f43a3..a46351d8103 100644 --- a/test/integrations/sources/ortto/data.ts +++ b/test/integrations/sources/ortto/data.ts @@ -9,33 +9,36 @@ export const data = [ name: 'ortto', description: 'Simple track call', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - activity: { - id: '00651b946bfef7e80478efee', - field_id: 'act::s-all', - created: '2023-10-03T04:11:23Z', - attr: { - 'str::is': 'API', - 'str::s-ctx': 'Subscribed via API', - }, - }, - contact: { - contact_id: '00651b946baa9be6b2edad00', - email: 'abhi@example.com', + request: { + body: JSON.stringify({ + activity: { + id: '00651b946bfef7e80478efee', + field_id: 'act::s-all', + created: '2023-10-03T04:11:23Z', + attr: { + 'str::is': 'API', + 'str::s-ctx': 'Subscribed via API', + }, + }, + contact: { + contact_id: '00651b946baa9be6b2edad00', + email: 'abhi@example.com', + }, + id: '00651b946cef87c7af64f4f3', + time: '2023-10-03T04:11:24.25726779Z', + webhook_id: '651b8aec8002153e16319fd3', + }), }, - id: '00651b946cef87c7af64f4f3', - time: '2023-10-03T04:11:24.25726779Z', - webhook_id: '651b8aec8002153e16319fd3', + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -78,65 +81,62 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'ortto', description: 'Simple track call', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - activity: { - id: '00651b946bfef7e80478efee', - field_id: 'act::s-all', - created: '2023-10-03T04:11:23Z', - attr: { - 'str::is': 'API', - 'str::s-ctx': 'Subscribed via API', - }, - }, - contact: { - external_id: 'user_x', - city: { - name: 'Kolkata', - id: 0, - lat: 37751000, - lng: -97822000, - }, - country: { - name: 'United States', - id: 6252001, - lat: 0, - lng: 0, - }, - email: 'xyz@email.com', - first_name: 'Ujjwal', - last_name: 'Ujjwal', - birthday: { - year: 1980, - month: 12, - day: 11, - timezone: 'Australia/Sydney', - }, - phone_number: { - c: '91', - n: '401234567', - }, + request: { + body: JSON.stringify({ + activity: { + id: '00651b946bfef7e80478efee', + field_id: 'act::s-all', + created: '2023-10-03T04:11:23Z', + attr: { + 'str::is': 'API', + 'str::s-ctx': 'Subscribed via API', + }, + }, + contact: { + external_id: 'user_x', + city: { + name: 'Kolkata', + id: 0, + lat: 37751000, + lng: -97822000, + }, + country: { + name: 'United States', + id: 6252001, + lat: 0, + lng: 0, + }, + email: 'xyz@email.com', + first_name: 'Ujjwal', + last_name: 'Ujjwal', + birthday: { + year: 1980, + month: 12, + day: 11, + timezone: 'Australia/Sydney', + }, + phone_number: { c: '91', n: '401234567' }, + }, + id: '00651b946cef87c7af64f4f3', + time: '2023-10-03T04:11:24.25726779Z', + webhook_id: '651b8aec8002153e16319fd3', + }), }, - id: '00651b946cef87c7af64f4f3', - time: '2023-10-03T04:11:24.25726779Z', - webhook_id: '651b8aec8002153e16319fd3', + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -158,10 +158,7 @@ export const data = [ firstName: 'Ujjwal', lastName: 'Ujjwal', phone: '91401234567', - address: { - city: 'Kolkata', - country: 'United States', - }, + address: { city: 'Kolkata', country: 'United States' }, }, }, event: 'Resubscribe globally', @@ -190,66 +187,63 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'ortto', description: 'Simple track call with unknown field id', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - activity: { - id: '00651b946bfef7e80478efee', - field_id: 'act::s-ccc', - created: '2023-10-03T04:11:23Z', - attr: { - 'str::is': 'API', - 'str::s-ctx': 'Subscribed via API', - }, - }, - contact: { - external_id: 'user_x', - city: { - name: 'Kolkata', - id: 0, - lat: 37751000, - lng: -97822000, - }, - contact_id: '006524f0b8d370050056e400', - country: { - name: 'United States', - id: 6252001, - lat: 0, - lng: 0, - }, - email: 'xyz@email.com', - first_name: 'Ujjwal', - last_name: 'Ujjwal', - birthday: { - year: 1980, - month: 3, - day: 4, - timezone: 'Australia/Sydney', - }, - phone_number: { - c: '91', - n: '401234567', - }, + request: { + body: JSON.stringify({ + activity: { + id: '00651b946bfef7e80478efee', + field_id: 'act::s-ccc', + created: '2023-10-03T04:11:23Z', + attr: { + 'str::is': 'API', + 'str::s-ctx': 'Subscribed via API', + }, + }, + contact: { + external_id: 'user_x', + city: { + name: 'Kolkata', + id: 0, + lat: 37751000, + lng: -97822000, + }, + contact_id: '006524f0b8d370050056e400', + country: { + name: 'United States', + id: 6252001, + lat: 0, + lng: 0, + }, + email: 'xyz@email.com', + first_name: 'Ujjwal', + last_name: 'Ujjwal', + birthday: { + year: 1980, + month: 3, + day: 4, + timezone: 'Australia/Sydney', + }, + phone_number: { c: '91', n: '401234567' }, + }, + id: '00651b946cef87c7af64f4f3', + time: '2023-10-03T04:11:24.25726779Z', + webhook_id: '651b8aec8002153e16319fd3', + }), }, - id: '00651b946cef87c7af64f4f3', - time: '2023-10-03T04:11:24.25726779Z', - webhook_id: '651b8aec8002153e16319fd3', + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -277,10 +271,7 @@ export const data = [ firstName: 'Ujjwal', lastName: 'Ujjwal', phone: '91401234567', - address: { - city: 'Kolkata', - country: 'United States', - }, + address: { city: 'Kolkata', country: 'United States' }, }, }, event: 'custom event triggered', @@ -309,66 +300,63 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'ortto', description: 'Simple track call with unknown field id', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - activity: { - id: '00651b946bfef7e80478efee', - field_id: 'act::test_webhook', - created: '2023-10-03T04:11:23Z', - attr: { - 'str::is': 'API', - 'str::s-ctx': 'Subscribed via API', - }, - }, - contact: { - external_id: 'user_x', - city: { - name: 'Kolkata', - id: 0, - lat: 37751000, - lng: -97822000, - }, - contact_id: '006524f0b8d370050056e400', - country: { - name: 'United States', - id: 6252001, - lat: 0, - lng: 0, - }, - email: 'xyz@email.com', - first_name: 'Ujjwal', - last_name: 'Ujjwal', - birthday: { - year: 1980, - month: 3, - day: 4, - timezone: 'Australia/Sydney', - }, - phone_number: { - c: '91', - n: '401234567', - }, + request: { + body: JSON.stringify({ + activity: { + id: '00651b946bfef7e80478efee', + field_id: 'act::test_webhook', + created: '2023-10-03T04:11:23Z', + attr: { + 'str::is': 'API', + 'str::s-ctx': 'Subscribed via API', + }, + }, + contact: { + external_id: 'user_x', + city: { + name: 'Kolkata', + id: 0, + lat: 37751000, + lng: -97822000, + }, + contact_id: '006524f0b8d370050056e400', + country: { + name: 'United States', + id: 6252001, + lat: 0, + lng: 0, + }, + email: 'xyz@email.com', + first_name: 'Ujjwal', + last_name: 'Ujjwal', + birthday: { + year: 1980, + month: 3, + day: 4, + timezone: 'Australia/Sydney', + }, + phone_number: { c: '91', n: '401234567' }, + }, + id: '00651b946cef87c7af64f4f3', + time: '2023-10-03T04:11:24.25726779Z', + webhook_id: '651b8aec8002153e16319fd3', + }), }, - id: '00651b946cef87c7af64f4f3', - time: '2023-10-03T04:11:24.25726779Z', - webhook_id: '651b8aec8002153e16319fd3', + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -386,8 +374,10 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, -]; +].map((testCase) => ({ + ...testCase, + mockFns: () => { + defaultMockFns(); + }, +})); diff --git a/test/integrations/sources/pagerduty/data.ts b/test/integrations/sources/pagerduty/data.ts index fdfee6fc0d4..171dabf45b8 100644 --- a/test/integrations/sources/pagerduty/data.ts +++ b/test/integrations/sources/pagerduty/data.ts @@ -3,70 +3,78 @@ export const data = [ name: 'pagerduty', description: 'Incident Triggered', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - id: '01DEN0V2VIFEN5871PQGX72URP', - event_type: 'incident.triggered', - resource_type: 'incident', - occurred_at: '2022-12-07T10:56:52.337Z', - agent: { - html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', - id: 'PXZZD2E', - self: 'https://api.pagerduty.com/users/user@1', - summary: 'rudder test', - type: 'user_reference', - }, - client: { name: 'Monitoring Service', url: 'https://monitoring.service.com' }, - data: { - id: 'Q3S7IX2U5KTCOY', - type: 'incident', - self: 'https://api.pagerduty.com/incidents/Q3S7IX2U5KTCOY', - html_url: 'https://rudderlabs-com.pagerduty.com/incidents/Q3S7IX2U5KTCOY', - number: 2, - status: 'triggered', - incident_key: 'faaecfc0aca04b6ea07154188b5d3c6c', - created_at: '2022-12-07T10:56:52Z', - title: 'Server Crashed', - service: { - html_url: 'https://rudderlabs-com.pagerduty.com/services/PAJBUTT', - id: 'PAJBUTT', - self: 'https://api.pagerduty.com/services/PAJBUTT', - summary: 'Database', - type: 'service_reference', - }, - assignees: [ - { + request: { + body: JSON.stringify({ + event: { + id: '01DEN0V2VIFEN5871PQGX72URP', + event_type: 'incident.triggered', + resource_type: 'incident', + occurred_at: '2022-12-07T10:56:52.337Z', + agent: { html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', id: 'PXZZD2E', self: 'https://api.pagerduty.com/users/user@1', summary: 'rudder test', type: 'user_reference', }, - ], - escalation_policy: { - html_url: 'https://rudderlabs-com.pagerduty.com/escalation_policies/PB7HKU4', - id: 'PB7HKU4', - self: 'https://api.pagerduty.com/escalation_policies/PB7HKU4', - summary: 'Default', - type: 'escalation_policy_reference', - }, - teams: [], - priority: { - html_url: 'https://rudderlabs-com.pagerduty.com/account/incident_priorities', - id: 'PPMNDVQ', - self: 'https://api.pagerduty.com/priorities/PPMNDVQ', - summary: 'P1', - type: 'priority_reference', + client: { + name: 'Monitoring Service', + url: 'https://monitoring.service.com', + }, + data: { + id: 'Q3S7IX2U5KTCOY', + type: 'incident', + self: 'https://api.pagerduty.com/incidents/Q3S7IX2U5KTCOY', + html_url: 'https://rudderlabs-com.pagerduty.com/incidents/Q3S7IX2U5KTCOY', + number: 2, + status: 'triggered', + incident_key: 'faaecfc0aca04b6ea07154188b5d3c6c', + created_at: '2022-12-07T10:56:52Z', + title: 'Server Crashed', + service: { + html_url: 'https://rudderlabs-com.pagerduty.com/services/PAJBUTT', + id: 'PAJBUTT', + self: 'https://api.pagerduty.com/services/PAJBUTT', + summary: 'Database', + type: 'service_reference', + }, + assignees: [ + { + html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', + id: 'PXZZD2E', + self: 'https://api.pagerduty.com/users/user@1', + summary: 'rudder test', + type: 'user_reference', + }, + ], + escalation_policy: { + html_url: 'https://rudderlabs-com.pagerduty.com/escalation_policies/PB7HKU4', + id: 'PB7HKU4', + self: 'https://api.pagerduty.com/escalation_policies/PB7HKU4', + summary: 'Default', + type: 'escalation_policy_reference', + }, + teams: [], + priority: { + html_url: 'https://rudderlabs-com.pagerduty.com/account/incident_priorities', + id: 'PPMNDVQ', + self: 'https://api.pagerduty.com/priorities/PPMNDVQ', + summary: 'P1', + type: 'priority_reference', + }, + urgency: 'high', + conference_bridge: null, + resolve_reason: null, + }, }, - urgency: 'high', - conference_bridge: null, - resolve_reason: null, - }, + }), }, + source: {}, }, ], method: 'POST', @@ -145,7 +153,10 @@ export const data = [ 'https://rudderlabs-com.pagerduty.com/escalation_policies/PB7HKU4', }, }, - client: { url: 'https://monitoring.service.com', name: 'Monitoring Service' }, + client: { + url: 'https://monitoring.service.com', + name: 'Monitoring Service', + }, resourceType: 'incident', }, integrations: { PagerDuty: false }, @@ -162,70 +173,75 @@ export const data = [ name: 'pagerduty', description: 'Incident Priority Updated', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - id: '01DFU6P4VDDZCIHVQ5Q0ME99OE', - event_type: 'incident.priority_updated', - resource_type: 'incident', - occurred_at: '2022-12-20T11:43:24.342Z', - agent: { - html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', - id: 'PXZZD2E', - self: 'https://api.pagerduty.com/users/user@1', - summary: 'rudder test', - type: 'user_reference', - }, - client: null, - data: { - id: 'Q1KRTY75EUMGM0', - type: 'incident', - self: 'https://api.pagerduty.com/incidents/Q1KRTY75EUMGM0', - html_url: 'https://rudderlabs-com.pagerduty.com/incidents/Q1KRTY75EUMGM0', - number: 7, - status: 'acknowledged', - incident_key: 'a3e0e442f8b74a8c94298f19de0dcbed', - created_at: '2022-12-20T11:37:19Z', - title: 'Event Stream Failure', - service: { - html_url: 'https://rudderlabs-com.pagerduty.com/services/PAJBUTT', - id: 'PAJBUTT', - self: 'https://api.pagerduty.com/services/PAJBUTT', - summary: 'Database', - type: 'service_reference', - }, - assignees: [ - { + request: { + body: JSON.stringify({ + event: { + id: '01DFU6P4VDDZCIHVQ5Q0ME99OE', + event_type: 'incident.priority_updated', + resource_type: 'incident', + occurred_at: '2022-12-20T11:43:24.342Z', + agent: { html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', id: 'PXZZD2E', self: 'https://api.pagerduty.com/users/user@1', summary: 'rudder test', type: 'user_reference', }, - ], - escalation_policy: { - html_url: 'https://rudderlabs-com.pagerduty.com/escalation_policies/PB7HKU4', - id: 'PB7HKU4', - self: 'https://api.pagerduty.com/escalation_policies/PB7HKU4', - summary: 'Default', - type: 'escalation_policy_reference', - }, - teams: [], - priority: { - html_url: 'https://rudderlabs-com.pagerduty.com/account/incident_priorities', - id: 'PPMNDVQ', - self: 'https://api.pagerduty.com/priorities/PPMNDVQ', - summary: 'P1', - type: 'priority_reference', + client: null, + data: { + id: 'Q1KRTY75EUMGM0', + type: 'incident', + self: 'https://api.pagerduty.com/incidents/Q1KRTY75EUMGM0', + html_url: 'https://rudderlabs-com.pagerduty.com/incidents/Q1KRTY75EUMGM0', + number: 7, + status: 'acknowledged', + incident_key: 'a3e0e442f8b74a8c94298f19de0dcbed', + created_at: '2022-12-20T11:37:19Z', + title: 'Event Stream Failure', + service: { + html_url: 'https://rudderlabs-com.pagerduty.com/services/PAJBUTT', + id: 'PAJBUTT', + self: 'https://api.pagerduty.com/services/PAJBUTT', + summary: 'Database', + type: 'service_reference', + }, + assignees: [ + { + html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', + id: 'PXZZD2E', + self: 'https://api.pagerduty.com/users/user@1', + summary: 'rudder test', + type: 'user_reference', + }, + ], + escalation_policy: { + html_url: 'https://rudderlabs-com.pagerduty.com/escalation_policies/PB7HKU4', + id: 'PB7HKU4', + self: 'https://api.pagerduty.com/escalation_policies/PB7HKU4', + summary: 'Default', + type: 'escalation_policy_reference', + }, + teams: [], + priority: { + html_url: 'https://rudderlabs-com.pagerduty.com/account/incident_priorities', + id: 'PPMNDVQ', + self: 'https://api.pagerduty.com/priorities/PPMNDVQ', + summary: 'P1', + type: 'priority_reference', + }, + urgency: 'high', + conference_bridge: null, + resolve_reason: null, + }, }, - urgency: 'high', - conference_bridge: null, - resolve_reason: null, - }, + }), }, + source: {}, }, ], method: 'POST', @@ -320,45 +336,50 @@ export const data = [ name: 'pagerduty', description: 'Incident Responder Added', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - id: '01DFU6Z1ZCLMV9SEK3X5JZ5WLW', - event_type: 'incident.responder.added', - resource_type: 'incident', - occurred_at: '2022-12-20T11:46:44.213Z', - agent: { - html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', - id: 'PXZZD2E', - self: 'https://api.pagerduty.com/users/user@1', - summary: 'rudder test', - type: 'user_reference', - }, - client: null, - data: { - incident: { - html_url: 'https://rudderlabs-com.pagerduty.com/incidents/Q1KRTY75EUMGM0', - id: 'Q1KRTY75EUMGM0', - self: 'https://api.pagerduty.com/incidents/Q1KRTY75EUMGM0', - summary: 'Event Stream Failure', - type: 'incident_reference', - }, - user: { - html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', - id: 'PXZZD2E', - self: 'https://api.pagerduty.com/users/user@1', - summary: 'rudder test', - type: 'user_reference', + request: { + body: JSON.stringify({ + event: { + id: '01DFU6Z1ZCLMV9SEK3X5JZ5WLW', + event_type: 'incident.responder.added', + resource_type: 'incident', + occurred_at: '2022-12-20T11:46:44.213Z', + agent: { + html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', + id: 'PXZZD2E', + self: 'https://api.pagerduty.com/users/user@1', + summary: 'rudder test', + type: 'user_reference', + }, + client: null, + data: { + incident: { + html_url: 'https://rudderlabs-com.pagerduty.com/incidents/Q1KRTY75EUMGM0', + id: 'Q1KRTY75EUMGM0', + self: 'https://api.pagerduty.com/incidents/Q1KRTY75EUMGM0', + summary: 'Event Stream Failure', + type: 'incident_reference', + }, + user: { + html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', + id: 'PXZZD2E', + self: 'https://api.pagerduty.com/users/user@1', + summary: 'rudder test', + type: 'user_reference', + }, + escalation_policy: null, + message: 'Please help with "Event Stream Failure"', + state: 'pending', + type: 'incident_responder', + }, }, - escalation_policy: null, - message: 'Please help with "Event Stream Failure"', - state: 'pending', - type: 'incident_responder', - }, + }), }, + source: {}, }, ], method: 'POST', @@ -426,70 +447,75 @@ export const data = [ name: 'pagerduty', description: 'Incident Escalated', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - id: '01DFU77KTKK9UUYX779UX0N1ZP', - event_type: 'incident.escalated', - resource_type: 'incident', - occurred_at: '2022-12-20T11:49:35.385Z', - agent: { - html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', - id: 'PXZZD2E', - self: 'https://api.pagerduty.com/users/user@1', - summary: 'rudder test', - type: 'user_reference', - }, - client: null, - data: { - id: 'Q1KRTY75EUMGM0', - type: 'incident', - self: 'https://api.pagerduty.com/incidents/Q1KRTY75EUMGM0', - html_url: 'https://rudderlabs-com.pagerduty.com/incidents/Q1KRTY75EUMGM0', - number: 7, - status: 'triggered', - incident_key: 'a3e0e442f8b74a8c94298f19de0dcbed', - created_at: '2022-12-20T11:37:19Z', - title: 'Event Stream Failure', - service: { - html_url: 'https://rudderlabs-com.pagerduty.com/services/PAJBUTT', - id: 'PAJBUTT', - self: 'https://api.pagerduty.com/services/PAJBUTT', - summary: 'Database', - type: 'service_reference', - }, - assignees: [ - { + request: { + body: JSON.stringify({ + event: { + id: '01DFU77KTKK9UUYX779UX0N1ZP', + event_type: 'incident.escalated', + resource_type: 'incident', + occurred_at: '2022-12-20T11:49:35.385Z', + agent: { html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', id: 'PXZZD2E', self: 'https://api.pagerduty.com/users/user@1', summary: 'rudder test', type: 'user_reference', }, - ], - escalation_policy: { - html_url: 'https://rudderlabs-com.pagerduty.com/escalation_policies/PB7HKU4', - id: 'PB7HKU4', - self: 'https://api.pagerduty.com/escalation_policies/PB7HKU4', - summary: 'Default', - type: 'escalation_policy_reference', - }, - teams: [], - priority: { - html_url: 'https://rudderlabs-com.pagerduty.com/account/incident_priorities', - id: 'PPMNDVQ', - self: 'https://api.pagerduty.com/priorities/PPMNDVQ', - summary: 'P1', - type: 'priority_reference', + client: null, + data: { + id: 'Q1KRTY75EUMGM0', + type: 'incident', + self: 'https://api.pagerduty.com/incidents/Q1KRTY75EUMGM0', + html_url: 'https://rudderlabs-com.pagerduty.com/incidents/Q1KRTY75EUMGM0', + number: 7, + status: 'triggered', + incident_key: 'a3e0e442f8b74a8c94298f19de0dcbed', + created_at: '2022-12-20T11:37:19Z', + title: 'Event Stream Failure', + service: { + html_url: 'https://rudderlabs-com.pagerduty.com/services/PAJBUTT', + id: 'PAJBUTT', + self: 'https://api.pagerduty.com/services/PAJBUTT', + summary: 'Database', + type: 'service_reference', + }, + assignees: [ + { + html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', + id: 'PXZZD2E', + self: 'https://api.pagerduty.com/users/user@1', + summary: 'rudder test', + type: 'user_reference', + }, + ], + escalation_policy: { + html_url: 'https://rudderlabs-com.pagerduty.com/escalation_policies/PB7HKU4', + id: 'PB7HKU4', + self: 'https://api.pagerduty.com/escalation_policies/PB7HKU4', + summary: 'Default', + type: 'escalation_policy_reference', + }, + teams: [], + priority: { + html_url: 'https://rudderlabs-com.pagerduty.com/account/incident_priorities', + id: 'PPMNDVQ', + self: 'https://api.pagerduty.com/priorities/PPMNDVQ', + summary: 'P1', + type: 'priority_reference', + }, + urgency: 'high', + conference_bridge: null, + resolve_reason: null, + }, }, - urgency: 'high', - conference_bridge: null, - resolve_reason: null, - }, + }), }, + source: {}, }, ], method: 'POST', @@ -584,62 +610,67 @@ export const data = [ name: 'pagerduty', description: 'Incident Resolved', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - id: '01DEN1HNLBC1VITK192ETJ1MPJ', - event_type: 'incident.resolved', - resource_type: 'incident', - occurred_at: '2022-12-07T11:04:27.459Z', - agent: { - html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', - id: 'PXZZD2E', - self: 'https://api.pagerduty.com/users/user@1', - summary: 'rudder test', - type: 'user_reference', - }, - client: null, - data: { - id: 'Q3S7IX2U5KTCOY', - type: 'incident', - self: 'https://api.pagerduty.com/incidents/Q3S7IX2U5KTCOY', - html_url: 'https://rudderlabs-com.pagerduty.com/incidents/Q3S7IX2U5KTCOY', - number: 2, - status: 'resolved', - incident_key: 'faaecfc0aca04b6ea07154188b5d3c6c', - created_at: '2022-12-07T10:56:52Z', - title: 'Server Crashed', - service: { - html_url: 'https://rudderlabs-com.pagerduty.com/services/PAJBUTT', - id: 'PAJBUTT', - self: 'https://api.pagerduty.com/services/PAJBUTT', - summary: 'Database', - type: 'service_reference', - }, - assignees: [], - escalation_policy: { - html_url: 'https://rudderlabs-com.pagerduty.com/escalation_policies/PB7HKU4', - id: 'PB7HKU4', - self: 'https://api.pagerduty.com/escalation_policies/PB7HKU4', - summary: 'Default', - type: 'escalation_policy_reference', - }, - teams: [], - priority: { - html_url: 'https://rudderlabs-com.pagerduty.com/account/incident_priorities', - id: 'P5DBC3A', - self: 'https://api.pagerduty.com/priorities/P5DBC3A', - summary: 'P3', - type: 'priority_reference', + request: { + body: JSON.stringify({ + event: { + id: '01DEN1HNLBC1VITK192ETJ1MPJ', + event_type: 'incident.resolved', + resource_type: 'incident', + occurred_at: '2022-12-07T11:04:27.459Z', + agent: { + html_url: 'https://rudderlabs-com.pagerduty.com/users/PXZZD2E', + id: 'PXZZD2E', + self: 'https://api.pagerduty.com/users/user@1', + summary: 'rudder test', + type: 'user_reference', + }, + client: null, + data: { + id: 'Q3S7IX2U5KTCOY', + type: 'incident', + self: 'https://api.pagerduty.com/incidents/Q3S7IX2U5KTCOY', + html_url: 'https://rudderlabs-com.pagerduty.com/incidents/Q3S7IX2U5KTCOY', + number: 2, + status: 'resolved', + incident_key: 'faaecfc0aca04b6ea07154188b5d3c6c', + created_at: '2022-12-07T10:56:52Z', + title: 'Server Crashed', + service: { + html_url: 'https://rudderlabs-com.pagerduty.com/services/PAJBUTT', + id: 'PAJBUTT', + self: 'https://api.pagerduty.com/services/PAJBUTT', + summary: 'Database', + type: 'service_reference', + }, + assignees: [], + escalation_policy: { + html_url: 'https://rudderlabs-com.pagerduty.com/escalation_policies/PB7HKU4', + id: 'PB7HKU4', + self: 'https://api.pagerduty.com/escalation_policies/PB7HKU4', + summary: 'Default', + type: 'escalation_policy_reference', + }, + teams: [], + priority: { + html_url: 'https://rudderlabs-com.pagerduty.com/account/incident_priorities', + id: 'P5DBC3A', + self: 'https://api.pagerduty.com/priorities/P5DBC3A', + summary: 'P3', + type: 'priority_reference', + }, + urgency: 'high', + conference_bridge: { conference_number: '', conference_url: '' }, + resolve_reason: null, + }, }, - urgency: 'high', - conference_bridge: { conference_number: '', conference_url: '' }, - resolve_reason: null, - }, + }), }, + source: {}, }, ], method: 'POST', diff --git a/test/integrations/sources/pipedream/data.ts b/test/integrations/sources/pipedream/data.ts index a4b5c33e0d5..a77cdea848b 100644 --- a/test/integrations/sources/pipedream/data.ts +++ b/test/integrations/sources/pipedream/data.ts @@ -3,15 +3,20 @@ export const data = [ name: 'pipedream', description: 'No type or userId is given', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - anonymousId: '63767499ca6fb1b7c988d5bb', - artist: 'Gautam', - genre: 'Jazz', - song: 'Take Five', + request: { + body: JSON.stringify({ + anonymousId: '63767499ca6fb1b7c988d5bb', + artist: 'Gautam', + genre: 'Jazz', + song: 'Take Five', + }), + }, + source: {}, }, ], method: 'POST', @@ -53,10 +58,22 @@ export const data = [ name: 'pipedream', description: 'No type or anonymousId is given', module: 'source', - version: 'v0', + version: 'v2', input: { request: { - body: [{ userId: '12', artist: 'Gautam', genre: 'Jazz', song: 'Take Five' }], + body: [ + { + request: { + body: JSON.stringify({ + userId: '12', + artist: 'Gautam', + genre: 'Jazz', + song: 'Take Five', + }), + }, + source: {}, + }, + ], method: 'POST', headers: { 'Content-Type': 'application/json' }, }, @@ -78,7 +95,12 @@ export const data = [ }, integrations: { PIPEDREAM: false }, type: 'track', - properties: { userId: '12', artist: 'Gautam', genre: 'Jazz', song: 'Take Five' }, + properties: { + userId: '12', + artist: 'Gautam', + genre: 'Jazz', + song: 'Take Five', + }, }, ], }, @@ -91,29 +113,39 @@ export const data = [ name: 'pipedream', description: 'Track Call -> type and userId is given', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: 'Song Played', - userId: 'R1234', - context: { - library: { name: 'unknown', version: 'unknown' }, - traits: { - createdAt: '2022-10-15T05:41:06.016Z', - custom: { key1: 'v1', key2: 'V2' }, - email: 'john@doe.com', - name: 'John Doe', - userDeleted: false, - }, - locale: 'en', - location: { country: 'IN', countryName: 'India', short: 'India', long: 'India' }, - device: { os: 'macOS', type: 'desktop' }, - page: { referrer: 'http://127.0.0.1:5500/testSm.html' }, + request: { + body: JSON.stringify({ + event: 'Song Played', + userId: 'R1234', + context: { + library: { name: 'unknown', version: 'unknown' }, + traits: { + createdAt: '2022-10-15T05:41:06.016Z', + custom: { key1: 'v1', key2: 'V2' }, + email: 'john@doe.com', + name: 'John Doe', + userDeleted: false, + }, + locale: 'en', + location: { + country: 'IN', + countryName: 'India', + short: 'India', + long: 'India', + }, + device: { os: 'macOS', type: 'desktop' }, + page: { referrer: 'http://127.0.0.1:5500/testSm.html' }, + }, + type: 'track', + properties: { artist: 'John', Album: 'ABCD' }, + }), }, - type: 'track', - properties: { artist: 'John', Album: 'ABCD' }, + source: {}, }, ], method: 'POST', @@ -164,24 +196,29 @@ export const data = [ name: 'pipedream', description: 'Identify type -> type and userId is given', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - userId: '1', - originalTimestamp: '2020-09-28T19:53:31.900Z', - traits: { - firstName: 'John', - lastName: 'doe', - email: 'John@r.com', - hasPurchased: 'yes', - address: { Home: { city: 'iudcb' }, Office: { abc: 'jbc' } }, - state: 'Delhi', - title: 'Mr', + request: { + body: JSON.stringify({ + userId: '1', + originalTimestamp: '2020-09-28T19:53:31.900Z', + traits: { + firstName: 'John', + lastName: 'doe', + email: 'John@r.com', + hasPurchased: 'yes', + address: { Home: { city: 'iudcb' }, Office: { abc: 'jbc' } }, + state: 'Delhi', + title: 'Mr', + }, + timestamp: '2020-09-29T14:50:29.907+05:30', + type: 'identify', + }), }, - timestamp: '2020-09-29T14:50:29.907+05:30', - type: 'identify', + source: {}, }, ], method: 'POST', @@ -223,16 +260,21 @@ export const data = [ name: 'pipedream', description: 'Group type -> type and userId is given', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - userId: 'user123', - groupId: '17', - context: {}, - traits: { operation: 'add' }, - type: 'group', + request: { + body: JSON.stringify({ + userId: 'user123', + groupId: '17', + context: {}, + traits: { operation: 'add' }, + type: 'group', + }), + }, + source: {}, }, ], method: 'POST', @@ -265,24 +307,32 @@ export const data = [ name: 'pipedream', description: 'Page type -> type and userId is given', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - anonymousId: '21e13f4bc7ceddad', - channel: 'mobile', - context: { - os: { name: 'Android', version: '9' }, - timezone: 'Asia/Kolkata', - traits: { customProp: 'customValue' }, - userAgent: - 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', + request: { + body: JSON.stringify({ + anonymousId: '21e13f4bc7ceddad', + channel: 'mobile', + context: { + os: { name: 'Android', version: '9' }, + timezone: 'Asia/Kolkata', + traits: { customProp: 'customValue' }, + userAgent: + 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', + }, + name: 'Home', + properties: { + title: 'Home | RudderStack', + url: 'http://www.rudderstack.com', + }, + receivedAt: '2020-09-29T14:50:43.005+05:30', + type: 'page', + }), }, - name: 'Home', - properties: { title: 'Home | RudderStack', url: 'http://www.rudderstack.com' }, - receivedAt: '2020-09-29T14:50:43.005+05:30', - type: 'page', + source: {}, }, ], method: 'POST', @@ -308,7 +358,10 @@ export const data = [ 'Dalvik/2.1.0 (Linux; U; Android 9; AOSP on IA Emulator Build/PSR1.180720.117)', }, name: 'Home', - properties: { title: 'Home | RudderStack', url: 'http://www.rudderstack.com' }, + properties: { + title: 'Home | RudderStack', + url: 'http://www.rudderstack.com', + }, receivedAt: '2020-09-29T14:50:43.005+05:30', type: 'page', }, @@ -323,10 +376,21 @@ export const data = [ name: 'pipedream', description: 'Alias type -> type and userId is given', module: 'source', - version: 'v0', + version: 'v2', input: { request: { - body: [{ type: 'alias', previousId: 'name@surname.com', userId: '12345' }], + body: [ + { + request: { + body: JSON.stringify({ + type: 'alias', + previousId: 'name@surname.com', + userId: '12345', + }), + }, + source: {}, + }, + ], method: 'POST', headers: { 'Content-Type': 'application/json' }, }, @@ -339,7 +403,12 @@ export const data = [ { output: { batch: [ - { type: 'alias', previousId: 'name@surname.com', userId: '12345', context: {} }, + { + type: 'alias', + previousId: 'name@surname.com', + userId: '12345', + context: {}, + }, ], }, }, diff --git a/test/integrations/sources/refiner/data.ts b/test/integrations/sources/refiner/data.ts index 255004322c3..6986b847d97 100644 --- a/test/integrations/sources/refiner/data.ts +++ b/test/integrations/sources/refiner/data.ts @@ -3,106 +3,114 @@ export const data = [ name: 'refiner', description: 'Refiner webhook response', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - uuid: 'd769e130-49cf-11ed-968d-936a69fadf81', - project_uuid: '0d8759d0-401c-11ed-8ded-9757c4929b55', - remote_id: 'user@17', - email: 'test17@user.com', - display_name: 'test user', - first_seen_at: '2022-10-12T01:47:33.000000Z', - last_seen_at: '2022-10-12T02:00:00.000000Z', - attributes: { - address: null, - address_city: null, - address_state: null, - age: null, - another_attribute: null, - city: null, - country: null, - created_at: null, - email: 'test17@user.com', - event: null, - first_name: null, - first_seen_at: '2022-10-12T01:47:33.000000Z', - form_submissions_count: '1', - form_views_count: '2', - gender: null, - last_form_submission_at: '2022-10-12T02:05:55.000000Z', - last_form_view_at: '2022-10-12T02:03:46.000000Z', - last_name: null, - last_seen_at: '2022-10-12T02:00:00.000000Z', - name: 'test user', - phone: null, - some_attribute: null, - status: null, - student: null, - tag: null, - trait1: null, - trait2: null, - trait3: null, - url: null, - user_address_city: null, - user_address_state: null, - user_country: null, - user_id: null, - username: null, - useroccupation: null, - why_did_you_cancel_your_subscription: 'Pricing', - }, - segments: [ - { - uuid: '0d91d7a0-401c-11ed-8898-bb1ee0c23ae5', - name: 'All Users', - created_at: '2022-10-12T01:47:34.000000Z', - updated_at: '2022-10-12T01:47:34.000000Z', - }, - { - uuid: 'f71ad940-455c-11ed-85e0-bf25f168b224', - name: 'test-segment', - created_at: '2022-10-12T01:47:34.000000Z', - updated_at: '2022-10-12T01:47:34.000000Z', - }, - ], - account: { - uuid: 'd76c9e80-49cf-11ed-a783-6317eca951a6', - remote_id: 'ACCOUNT-ID-ABC-1', - domain: null, - display_name: 'Awesome Inc.', - first_seen_at: '2022-10-12T01:47:33.000000Z', - last_seen_at: '2022-10-12T02:00:00.000000Z', - attributes: { - a_date_at: '2022-10-01T00:00:00.000000Z', - business_email: null, - company: null, - email: null, - isfunded: null, - name: 'Awesome Inc.', - revenue: null, - some_account_data: 'something', - trait1: null, - trait2: null, - trait3: null, - }, - }, - triggered_event: 'Completed Survey', - form: { uuid: '0d94c790-401c-11ed-bb27-e31f6832c5ae', name: 'Customer Churn Survey' }, - response: { - uuid: 'eb117cb0-49cf-11ed-b050-03a44b32151c', - first_shown_at: '2022-10-12T01:48:06.000000Z', - last_shown_at: '2022-10-12T02:03:46.000000Z', - show_counter: null, - first_data_reception_at: '2022-10-12T02:05:55.000000Z', - last_data_reception_at: '2022-10-12T02:05:55.000000Z', - completed_at: '2022-10-12T02:05:55.000000Z', - dismissed_at: null, - received_at: '2022-10-12T02:05:55.000000Z', - data: { why_did_you_cancel_your_subscription: 'Pricing' }, - tags: [], + request: { + body: JSON.stringify({ + uuid: 'd769e130-49cf-11ed-968d-936a69fadf81', + project_uuid: '0d8759d0-401c-11ed-8ded-9757c4929b55', + remote_id: 'user@17', + email: 'test17@user.com', + display_name: 'test user', + first_seen_at: '2022-10-12T01:47:33.000000Z', + last_seen_at: '2022-10-12T02:00:00.000000Z', + attributes: { + address: null, + address_city: null, + address_state: null, + age: null, + another_attribute: null, + city: null, + country: null, + created_at: null, + email: 'test17@user.com', + event: null, + first_name: null, + first_seen_at: '2022-10-12T01:47:33.000000Z', + form_submissions_count: '1', + form_views_count: '2', + gender: null, + last_form_submission_at: '2022-10-12T02:05:55.000000Z', + last_form_view_at: '2022-10-12T02:03:46.000000Z', + last_name: null, + last_seen_at: '2022-10-12T02:00:00.000000Z', + name: 'test user', + phone: null, + some_attribute: null, + status: null, + student: null, + tag: null, + trait1: null, + trait2: null, + trait3: null, + url: null, + user_address_city: null, + user_address_state: null, + user_country: null, + user_id: null, + username: null, + useroccupation: null, + why_did_you_cancel_your_subscription: 'Pricing', + }, + segments: [ + { + uuid: '0d91d7a0-401c-11ed-8898-bb1ee0c23ae5', + name: 'All Users', + created_at: '2022-10-12T01:47:34.000000Z', + updated_at: '2022-10-12T01:47:34.000000Z', + }, + { + uuid: 'f71ad940-455c-11ed-85e0-bf25f168b224', + name: 'test-segment', + created_at: '2022-10-12T01:47:34.000000Z', + updated_at: '2022-10-12T01:47:34.000000Z', + }, + ], + account: { + uuid: 'd76c9e80-49cf-11ed-a783-6317eca951a6', + remote_id: 'ACCOUNT-ID-ABC-1', + domain: null, + display_name: 'Awesome Inc.', + first_seen_at: '2022-10-12T01:47:33.000000Z', + last_seen_at: '2022-10-12T02:00:00.000000Z', + attributes: { + a_date_at: '2022-10-01T00:00:00.000000Z', + business_email: null, + company: null, + email: null, + isfunded: null, + name: 'Awesome Inc.', + revenue: null, + some_account_data: 'something', + trait1: null, + trait2: null, + trait3: null, + }, + }, + triggered_event: 'Completed Survey', + form: { + uuid: '0d94c790-401c-11ed-bb27-e31f6832c5ae', + name: 'Customer Churn Survey', + }, + response: { + uuid: 'eb117cb0-49cf-11ed-b050-03a44b32151c', + first_shown_at: '2022-10-12T01:48:06.000000Z', + last_shown_at: '2022-10-12T02:03:46.000000Z', + show_counter: null, + first_data_reception_at: '2022-10-12T02:05:55.000000Z', + last_data_reception_at: '2022-10-12T02:05:55.000000Z', + completed_at: '2022-10-12T02:05:55.000000Z', + dismissed_at: null, + received_at: '2022-10-12T02:05:55.000000Z', + data: { why_did_you_cancel_your_subscription: 'Pricing' }, + tags: [], + }, + }), }, + source: {}, }, ], method: 'POST', @@ -159,7 +167,9 @@ export const data = [ }, properties: { response: { - data: { why_did_you_cancel_your_subscription: 'Pricing' }, + data: { + why_did_you_cancel_your_subscription: 'Pricing', + }, tags: [], uuid: 'eb117cb0-49cf-11ed-b050-03a44b32151c', received_at: '2022-10-12T02:05:55.000000Z', @@ -202,113 +212,123 @@ export const data = [ name: 'refiner', description: 'Refiner webhook response', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - uuid: '69b83e20-4ea2-11ed-941c-e1cb6c7a3870', - cookie_uuid: '2f9b7e6a-9ba8-1c68-d474-48d719d92a60', - project_uuid: '0d8759d0-401c-11ed-8ded-9757c4929b55', - remote_id: 'sdk@30', - email: 'sdk30@gmail.com', - display_name: '', - first_seen_at: '2022-10-18T05:04:58.000000Z', - last_seen_at: '2022-10-18T05:04:58.000000Z', - attributes: { - address: null, - address_city: null, - address_state: null, - age: null, - another_attribute: null, - city: null, - country: null, - created_at: null, - email: 'sdk30@gmail.com', - event: null, - first_name: null, - first_seen_at: '2022-10-18T05:04:58.000000Z', - form_submissions_count: '1', - form_views_count: '1', - gender: null, - last_form_submission_at: '2022-10-18T05:05:45.000000Z', - last_form_view_at: '2022-10-18T05:05:29.000000Z', - last_name: null, - last_seen_at: '2022-10-18T05:04:58.000000Z', - name: null, - phone: null, - some_attribute: null, - status: null, - student: null, - tag: null, - trait1: null, - trait2: null, - trait3: null, - url: null, - user_address_city: null, - user_address_state: null, - user_country: null, - user_id: null, - username: null, - useroccupation: null, - why_did_you_cancel_your_subscription: 'Missing features', - }, - segments: [ - { - uuid: '0d91d7a0-401c-11ed-8898-bb1ee0c23ae5', - name: 'All Users', - created_at: '2022-10-18T05:04:58.000000Z', - updated_at: '2022-10-18T05:04:58.000000Z', - }, - { - uuid: 'f71ad940-455c-11ed-85e0-bf25f168b224', - name: 'test-segment', - created_at: '2022-10-18T05:04:58.000000Z', - updated_at: '2022-10-18T05:04:58.000000Z', - }, - ], - account: { - uuid: '69ba2030-4ea2-11ed-adfc-595e70c7ab07', - remote_id: null, - domain: null, - display_name: '', - first_seen_at: '2022-10-18T05:04:58.000000Z', - last_seen_at: '2022-10-18T05:04:58.000000Z', - attributes: { - '1': null, - '2': null, - '3': null, - '4': null, - a_date_at: null, - business_email: null, - company: null, - email: null, - isfunded: null, - location: null, - name: null, - revenue: null, - some_account_data: null, - trait1: null, - trait2: null, - trait3: null, - user_id: null, - }, - }, - triggered_event: 'Completed Survey', - form: { uuid: '0d94c790-401c-11ed-bb27-e31f6832c5ae', name: 'Customer Churn Survey' }, - response: { - uuid: '7c508c60-4ea2-11ed-9302-57708fe11d26', - first_shown_at: '2022-10-18T05:05:29.000000Z', - last_shown_at: '2022-10-18T05:05:29.000000Z', - show_counter: null, - first_data_reception_at: '2022-10-18T05:05:45.000000Z', - last_data_reception_at: '2022-10-18T05:05:45.000000Z', - completed_at: '2022-10-18T05:05:45.000000Z', - dismissed_at: null, - received_at: '2022-10-18T05:05:45.000000Z', - data: { why_did_you_cancel_your_subscription: 'Missing features' }, - tags: [], + request: { + body: JSON.stringify({ + uuid: '69b83e20-4ea2-11ed-941c-e1cb6c7a3870', + cookie_uuid: '2f9b7e6a-9ba8-1c68-d474-48d719d92a60', + project_uuid: '0d8759d0-401c-11ed-8ded-9757c4929b55', + remote_id: 'sdk@30', + email: 'sdk30@gmail.com', + display_name: '', + first_seen_at: '2022-10-18T05:04:58.000000Z', + last_seen_at: '2022-10-18T05:04:58.000000Z', + attributes: { + address: null, + address_city: null, + address_state: null, + age: null, + another_attribute: null, + city: null, + country: null, + created_at: null, + email: 'sdk30@gmail.com', + event: null, + first_name: null, + first_seen_at: '2022-10-18T05:04:58.000000Z', + form_submissions_count: '1', + form_views_count: '1', + gender: null, + last_form_submission_at: '2022-10-18T05:05:45.000000Z', + last_form_view_at: '2022-10-18T05:05:29.000000Z', + last_name: null, + last_seen_at: '2022-10-18T05:04:58.000000Z', + name: null, + phone: null, + some_attribute: null, + status: null, + student: null, + tag: null, + trait1: null, + trait2: null, + trait3: null, + url: null, + user_address_city: null, + user_address_state: null, + user_country: null, + user_id: null, + username: null, + useroccupation: null, + why_did_you_cancel_your_subscription: 'Missing features', + }, + segments: [ + { + uuid: '0d91d7a0-401c-11ed-8898-bb1ee0c23ae5', + name: 'All Users', + created_at: '2022-10-18T05:04:58.000000Z', + updated_at: '2022-10-18T05:04:58.000000Z', + }, + { + uuid: 'f71ad940-455c-11ed-85e0-bf25f168b224', + name: 'test-segment', + created_at: '2022-10-18T05:04:58.000000Z', + updated_at: '2022-10-18T05:04:58.000000Z', + }, + ], + account: { + uuid: '69ba2030-4ea2-11ed-adfc-595e70c7ab07', + remote_id: null, + domain: null, + display_name: '', + first_seen_at: '2022-10-18T05:04:58.000000Z', + last_seen_at: '2022-10-18T05:04:58.000000Z', + attributes: { + '1': null, + '2': null, + '3': null, + '4': null, + a_date_at: null, + business_email: null, + company: null, + email: null, + isfunded: null, + location: null, + name: null, + revenue: null, + some_account_data: null, + trait1: null, + trait2: null, + trait3: null, + user_id: null, + }, + }, + triggered_event: 'Completed Survey', + form: { + uuid: '0d94c790-401c-11ed-bb27-e31f6832c5ae', + name: 'Customer Churn Survey', + }, + response: { + uuid: '7c508c60-4ea2-11ed-9302-57708fe11d26', + first_shown_at: '2022-10-18T05:05:29.000000Z', + last_shown_at: '2022-10-18T05:05:29.000000Z', + show_counter: null, + first_data_reception_at: '2022-10-18T05:05:45.000000Z', + last_data_reception_at: '2022-10-18T05:05:45.000000Z', + completed_at: '2022-10-18T05:05:45.000000Z', + dismissed_at: null, + received_at: '2022-10-18T05:05:45.000000Z', + data: { + why_did_you_cancel_your_subscription: 'Missing features', + }, + tags: [], + }, + }), }, + source: {}, }, ], method: 'POST', @@ -325,7 +345,9 @@ export const data = [ batch: [ { type: 'identify', - traits: { why_did_you_cancel_your_subscription: 'Missing features' }, + traits: { + why_did_you_cancel_your_subscription: 'Missing features', + }, userId: 'sdk@30', context: { traits: { @@ -365,7 +387,9 @@ export const data = [ }, properties: { response: { - data: { why_did_you_cancel_your_subscription: 'Missing features' }, + data: { + why_did_you_cancel_your_subscription: 'Missing features', + }, tags: [], uuid: '7c508c60-4ea2-11ed-9302-57708fe11d26', received_at: '2022-10-18T05:05:45.000000Z', diff --git a/test/integrations/sources/revenuecat/data.ts b/test/integrations/sources/revenuecat/data.ts index 2762bac5b27..e61c57fc8a5 100644 --- a/test/integrations/sources/revenuecat/data.ts +++ b/test/integrations/sources/revenuecat/data.ts @@ -9,67 +9,67 @@ export const data = [ name: 'revenuecat', description: 'Simple track call', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - api_version: '1.0', - event: { - aliases: [ - 'f8e14f51-0c76-49ba-8d67-c229f1875dd9', - '389ad6dd-bb40-4c03-9471-1353da2d55ec', - ], - app_user_id: 'f8e14f51-0c76-49ba-8d67-c229f1875dd9', - commission_percentage: null, - country_code: 'US', - currency: null, - entitlement_id: null, - entitlement_ids: null, - environment: 'SANDBOX', - event_timestamp_ms: 1698617217232, - expiration_at_ms: 1698624417232, - id: '8CF0CD6C-CAF3-41FB-968A-661938235AF0', - is_family_share: null, - offer_code: null, - original_app_user_id: 'f8e14f51-0c76-49ba-8d67-c229f1875dd9', - original_transaction_id: null, - period_type: 'NORMAL', - presented_offering_id: null, - price: null, - price_in_purchased_currency: null, - product_id: 'test_product', - purchased_at_ms: 1698617217232, - store: 'APP_STORE', - subscriber_attributes: { - $displayName: { - updated_at_ms: 1698617217232, - value: 'Mister Mistoffelees', - }, - $email: { - updated_at_ms: 1698617217232, - value: 'tuxedo@revenuecat.com', - }, - $phoneNumber: { - updated_at_ms: 1698617217232, - value: '+19795551234', - }, - my_custom_attribute_1: { - updated_at_ms: 1698617217232, - value: 'catnip', + request: { + body: JSON.stringify({ + api_version: '1.0', + event: { + aliases: [ + 'f8e14f51-0c76-49ba-8d67-c229f1875dd9', + '389ad6dd-bb40-4c03-9471-1353da2d55ec', + ], + app_user_id: 'f8e14f51-0c76-49ba-8d67-c229f1875dd9', + commission_percentage: null, + country_code: 'US', + currency: null, + entitlement_id: null, + entitlement_ids: null, + environment: 'SANDBOX', + event_timestamp_ms: 1698617217232, + expiration_at_ms: 1698624417232, + id: '8CF0CD6C-CAF3-41FB-968A-661938235AF0', + is_family_share: null, + offer_code: null, + original_app_user_id: 'f8e14f51-0c76-49ba-8d67-c229f1875dd9', + original_transaction_id: null, + period_type: 'NORMAL', + presented_offering_id: null, + price: null, + price_in_purchased_currency: null, + product_id: 'test_product', + purchased_at_ms: 1698617217232, + store: 'APP_STORE', + subscriber_attributes: { + $displayName: { + updated_at_ms: 1698617217232, + value: 'Mister Mistoffelees', + }, + $email: { + updated_at_ms: 1698617217232, + value: 'tuxedo@revenuecat.com', + }, + $phoneNumber: { + updated_at_ms: 1698617217232, + value: '+19795551234', + }, + my_custom_attribute_1: { updated_at_ms: 1698617217232, value: 'catnip' }, + }, + takehome_percentage: null, + tax_percentage: null, + transaction_id: null, + type: 'TEST', }, - }, - takehome_percentage: null, - tax_percentage: null, - transaction_id: null, - type: 'TEST', + }), }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -82,13 +82,8 @@ export const data = [ batch: [ { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'RevenueCat', - }, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'RevenueCat' }, externalId: [ { type: 'revenuecatAppUserId', @@ -96,9 +91,7 @@ export const data = [ }, ], }, - integrations: { - RevenueCat: false, - }, + integrations: { RevenueCat: false }, type: 'track', properties: { aliases: [ @@ -139,10 +132,7 @@ export const data = [ updated_at_ms: 1698617217232, value: '+19795551234', }, - my_custom_attribute_1: { - updated_at_ms: 1698617217232, - value: 'catnip', - }, + my_custom_attribute_1: { updated_at_ms: 1698617217232, value: 'catnip' }, }, takehomePercentage: null, taxPercentage: null, @@ -161,61 +151,58 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'revenuecat', description: 'Initial purchase event', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - api_version: '1.0', - event: { - aliases: ['yourCustomerAliasedID', 'yourCustomerAliasedID'], - app_id: 'yourAppID', - app_user_id: 'yourCustomerAppUserID', - commission_percentage: 0.3, - country_code: 'US', - currency: 'USD', - entitlement_id: 'pro_cat', - entitlement_ids: ['pro_cat'], - environment: 'PRODUCTION', - event_timestamp_ms: 1591121855319, - expiration_at_ms: 1591726653000, - id: 'UniqueIdentifierOfEvent', - is_family_share: false, - offer_code: 'free_month', - original_app_user_id: 'OriginalAppUserID', - original_transaction_id: '1530648507000', - period_type: 'NORMAL', - presented_offering_id: 'OfferingID', - price: 2.49, - price_in_purchased_currency: 2.49, - product_id: 'onemonth_no_trial', - purchased_at_ms: 1591121853000, - store: 'APP_STORE', - subscriber_attributes: { - '$Favorite Cat': { - updated_at_ms: 1581121853000, - value: 'Garfield', + request: { + body: JSON.stringify({ + api_version: '1.0', + event: { + aliases: ['yourCustomerAliasedID', 'yourCustomerAliasedID'], + app_id: 'yourAppID', + app_user_id: 'yourCustomerAppUserID', + commission_percentage: 0.3, + country_code: 'US', + currency: 'USD', + entitlement_id: 'pro_cat', + entitlement_ids: ['pro_cat'], + environment: 'PRODUCTION', + event_timestamp_ms: 1591121855319, + expiration_at_ms: 1591726653000, + id: 'UniqueIdentifierOfEvent', + is_family_share: false, + offer_code: 'free_month', + original_app_user_id: 'OriginalAppUserID', + original_transaction_id: '1530648507000', + period_type: 'NORMAL', + presented_offering_id: 'OfferingID', + price: 2.49, + price_in_purchased_currency: 2.49, + product_id: 'onemonth_no_trial', + purchased_at_ms: 1591121853000, + store: 'APP_STORE', + subscriber_attributes: { + '$Favorite Cat': { updated_at_ms: 1581121853000, value: 'Garfield' }, + }, + takehome_percentage: 0.7, + tax_percentage: 0.3, + transaction_id: '170000869511114', + type: 'INITIAL_PURCHASE', }, - }, - takehome_percentage: 0.7, - tax_percentage: 0.3, - transaction_id: '170000869511114', - type: 'INITIAL_PURCHASE', + }), }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -228,13 +215,8 @@ export const data = [ batch: [ { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'RevenueCat', - }, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'RevenueCat' }, externalId: [ { type: 'revenuecatAppUserId', @@ -242,9 +224,7 @@ export const data = [ }, ], }, - integrations: { - RevenueCat: false, - }, + integrations: { RevenueCat: false }, type: 'track', properties: { aliases: ['yourCustomerAliasedID', 'yourCustomerAliasedID'], @@ -293,59 +273,56 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, { name: 'revenuecat', description: 'Purchase event with anonymous user', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - api_version: '1.0', - event: { - aliases: ['yourCustomerAliasedID', 'yourCustomerAliasedID'], - app_id: 'yourAppID', - commission_percentage: 0.3, - country_code: 'US', - currency: 'USD', - entitlement_id: 'pro_cat', - entitlement_ids: ['pro_cat'], - environment: 'PRODUCTION', - event_timestamp_ms: 1591121855319, - expiration_at_ms: 1591726653000, - id: 'UniqueIdentifierOfEvent', - is_family_share: false, - offer_code: 'free_month', - original_transaction_id: '1530648507000', - period_type: 'NORMAL', - presented_offering_id: 'OfferingID', - price: 2.49, - price_in_purchased_currency: 2.49, - product_id: 'onemonth_no_trial', - purchased_at_ms: 1591121853000, - store: 'APP_STORE', - subscriber_attributes: { - '$Favorite Cat': { - updated_at_ms: 1581121853000, - value: 'Garfield', + request: { + body: JSON.stringify({ + api_version: '1.0', + event: { + aliases: ['yourCustomerAliasedID', 'yourCustomerAliasedID'], + app_id: 'yourAppID', + commission_percentage: 0.3, + country_code: 'US', + currency: 'USD', + entitlement_id: 'pro_cat', + entitlement_ids: ['pro_cat'], + environment: 'PRODUCTION', + event_timestamp_ms: 1591121855319, + expiration_at_ms: 1591726653000, + id: 'UniqueIdentifierOfEvent', + is_family_share: false, + offer_code: 'free_month', + original_transaction_id: '1530648507000', + period_type: 'NORMAL', + presented_offering_id: 'OfferingID', + price: 2.49, + price_in_purchased_currency: 2.49, + product_id: 'onemonth_no_trial', + purchased_at_ms: 1591121853000, + store: 'APP_STORE', + subscriber_attributes: { + '$Favorite Cat': { updated_at_ms: 1581121853000, value: 'Garfield' }, + }, + takehome_percentage: 0.7, + tax_percentage: 0.3, + transaction_id: '170000869511114', + type: 'INITIAL_PURCHASE', }, - }, - takehome_percentage: 0.7, - tax_percentage: 0.3, - transaction_id: '170000869511114', - type: 'INITIAL_PURCHASE', + }), }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -358,17 +335,10 @@ export const data = [ batch: [ { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'RevenueCat', - }, - }, - integrations: { - RevenueCat: false, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'RevenueCat' }, }, + integrations: { RevenueCat: false }, type: 'track', properties: { aliases: ['yourCustomerAliasedID', 'yourCustomerAliasedID'], @@ -416,8 +386,10 @@ export const data = [ ], }, }, - mockFns: () => { - defaultMockFns(); - }, }, -]; +].map((testCase) => ({ + ...testCase, + mockFns: () => { + defaultMockFns(); + }, +})); diff --git a/test/integrations/sources/satismeter/data.ts b/test/integrations/sources/satismeter/data.ts index 713f527f2c9..625284ad027 100644 --- a/test/integrations/sources/satismeter/data.ts +++ b/test/integrations/sources/satismeter/data.ts @@ -3,108 +3,113 @@ export const data = [ name: 'satismeter', description: ' All fields Check with event as completed', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - response: { - id: '63767499ca6fb1b7c988d5bb', - created: '2022-11-17T17:51:21.764Z', - rating: 5, - feedback: 'Many things to imporve\n', - dismissed: false, - pending: false, - answers: [ - { - label: 'How likely are you to recommend us to your friends and colleagues?', - id: '7ddb22b0-64a8-11ed-a4c7-b3bed73771cd', - value: 5, - name: 'SM_rating', - type: 'scale', - metric: 'nps', - }, - { - label: 'What could we do to improve?', - id: '7ddb22b1-64a8-11ed-a4c7-b3bed73771cd', - value: 'Many things to imporve\n', - name: 'SM_comment', - type: 'long-text', - }, - { - label: 'The company made it easy for me to handle my issue.', - id: '1dc53f60-66a0-11ed-856c-6f39711bf041', - value: 4, - name: null, - type: 'scale', - metric: 'ces', - }, - { - label: 'How satisfied were you with the service you received?', - id: '24c5b290-66a0-11ed-856c-6f39711bf041', - value: 4, - name: null, - type: 'smiley', - metric: 'csat', - }, - { - label: 'How you like to rate the surevy?', - id: '27b3d1d0-66a0-11ed-856c-6f39711bf041', - value: 4, - type: 'scale', - }, - { - label: 'Your Name (Single Answer)', - id: '37a8c000-66a0-11ed-856c-6f39711bf041', - value: 'a', - type: 'single-choice', - }, - { - label: 'Your Name (Multiple Answer)', - id: '4b435da0-66a0-11ed-856c-6f39711bf041', - value: ['a1', 'b1'], - type: 'multiple-choice', + request: { + body: JSON.stringify({ + response: { + id: '63767499ca6fb1b7c988d5bb', + created: '2022-11-17T17:51:21.764Z', + rating: 5, + feedback: 'Many things to imporve\n', + dismissed: false, + pending: false, + answers: [ + { + label: 'How likely are you to recommend us to your friends and colleagues?', + id: '7ddb22b0-64a8-11ed-a4c7-b3bed73771cd', + value: 5, + name: 'SM_rating', + type: 'scale', + metric: 'nps', + }, + { + label: 'What could we do to improve?', + id: '7ddb22b1-64a8-11ed-a4c7-b3bed73771cd', + value: 'Many things to imporve\n', + name: 'SM_comment', + type: 'long-text', + }, + { + label: 'The company made it easy for me to handle my issue.', + id: '1dc53f60-66a0-11ed-856c-6f39711bf041', + value: 4, + name: null, + type: 'scale', + metric: 'ces', + }, + { + label: 'How satisfied were you with the service you received?', + id: '24c5b290-66a0-11ed-856c-6f39711bf041', + value: 4, + name: null, + type: 'smiley', + metric: 'csat', + }, + { + label: 'How you like to rate the surevy?', + id: '27b3d1d0-66a0-11ed-856c-6f39711bf041', + value: 4, + type: 'scale', + }, + { + label: 'Your Name (Single Answer)', + id: '37a8c000-66a0-11ed-856c-6f39711bf041', + value: 'a', + type: 'single-choice', + }, + { + label: 'Your Name (Multiple Answer)', + id: '4b435da0-66a0-11ed-856c-6f39711bf041', + value: ['a1', 'b1'], + type: 'multiple-choice', + }, + ], + category: 'detractor', + score: -100, + user: { + id: '63766fbb7ac7b72676145338', + name: 'John Doe', + email: 'john@doe.com', + userId: 'No response', + deleted: false, + groups: { group1: 'grooupId' }, + traits: { + createdAt: '2022-10-15T05:41:06.016Z', + custom: { key1: 'v1', key2: 'V2' }, + email: 'john@doe.com', + name: 'John Doe', + }, + }, + device: { os: 'macOS', type: 'desktop' }, + location: { + country: 'IN', + countryName: 'India', + region: '', + city: '', + short: 'India', + long: 'India', + }, + referrer: 'http://127.0.0.1:5500/testSm.html', + method: 'In-app', + language: 'en', + project: '6372247a764986ebee62bf66', + campaign: '6373271b764986ebee62bfca', }, - ], - category: 'detractor', - score: -100, - user: { - id: '63766fbb7ac7b72676145338', - name: 'John Doe', - email: 'john@doe.com', - userId: 'No response', - deleted: false, - groups: { group1: 'grooupId' }, traits: { createdAt: '2022-10-15T05:41:06.016Z', custom: { key1: 'v1', key2: 'V2' }, email: 'john@doe.com', name: 'John Doe', }, - }, - device: { os: 'macOS', type: 'desktop' }, - location: { - country: 'IN', - countryName: 'India', - region: '', - city: '', - short: 'India', - long: 'India', - }, - referrer: 'http://127.0.0.1:5500/testSm.html', - method: 'In-app', - language: 'en', - project: '6372247a764986ebee62bf66', - campaign: '6373271b764986ebee62bfca', - }, - traits: { - createdAt: '2022-10-15T05:41:06.016Z', - custom: { key1: 'v1', key2: 'V2' }, - email: 'john@doe.com', - name: 'John Doe', + campaign: { id: '6373271b764986ebee62bfca', name: 'NPS Survey' }, + event: 'completed', + }), }, - campaign: { id: '6373271b764986ebee62bfca', name: 'NPS Survey' }, - event: 'completed', + source: {}, }, ], method: 'POST', @@ -132,7 +137,10 @@ export const data = [ userDeleted: false, }, locale: 'en', - campaign: { id: '6373271b764986ebee62bfca', name: 'NPS Survey' }, + campaign: { + id: '6373271b764986ebee62bfca', + name: 'NPS Survey', + }, integration: { name: 'SATISMETER' }, location: { country: 'IN', @@ -217,106 +225,111 @@ export const data = [ description: ' Neither reponse.user.id or response.user.userId is provided in payload then mapping response.id to anonymousId', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - response: { - id: '63767499ca6fb1b7c988d5bb', - created: '2022-11-17T17:51:21.764Z', - rating: 5, - feedback: 'Many things to imporve\n', - dismissed: false, - pending: false, - answers: [ - { - label: 'How likely are you to recommend us to your friends and colleagues?', - id: '7ddb22b0-64a8-11ed-a4c7-b3bed73771cd', - value: 5, - name: 'SM_rating', - type: 'scale', - metric: 'nps', - }, - { - label: 'What could we do to improve?', - id: '7ddb22b1-64a8-11ed-a4c7-b3bed73771cd', - value: 'Many things to imporve\n', - name: 'SM_comment', - type: 'long-text', - }, - { - label: 'The company made it easy for me to handle my issue.', - id: '1dc53f60-66a0-11ed-856c-6f39711bf041', - value: 4, - name: null, - type: 'scale', - metric: 'ces', - }, - { - label: 'How satisfied were you with the service you received?', - id: '24c5b290-66a0-11ed-856c-6f39711bf041', - value: 4, - name: null, - type: 'smiley', - metric: 'csat', - }, - { - label: 'How you like to rate the surevy?', - id: '27b3d1d0-66a0-11ed-856c-6f39711bf041', - value: 4, - type: 'scale', - }, - { - label: 'Your Name (Single Answer)', - id: '37a8c000-66a0-11ed-856c-6f39711bf041', - value: 'a', - type: 'single-choice', - }, - { - label: 'Your Name (Multiple Answer)', - id: '4b435da0-66a0-11ed-856c-6f39711bf041', - value: ['a1', 'b1'], - type: 'multiple-choice', + request: { + body: JSON.stringify({ + response: { + id: '63767499ca6fb1b7c988d5bb', + created: '2022-11-17T17:51:21.764Z', + rating: 5, + feedback: 'Many things to imporve\n', + dismissed: false, + pending: false, + answers: [ + { + label: 'How likely are you to recommend us to your friends and colleagues?', + id: '7ddb22b0-64a8-11ed-a4c7-b3bed73771cd', + value: 5, + name: 'SM_rating', + type: 'scale', + metric: 'nps', + }, + { + label: 'What could we do to improve?', + id: '7ddb22b1-64a8-11ed-a4c7-b3bed73771cd', + value: 'Many things to imporve\n', + name: 'SM_comment', + type: 'long-text', + }, + { + label: 'The company made it easy for me to handle my issue.', + id: '1dc53f60-66a0-11ed-856c-6f39711bf041', + value: 4, + name: null, + type: 'scale', + metric: 'ces', + }, + { + label: 'How satisfied were you with the service you received?', + id: '24c5b290-66a0-11ed-856c-6f39711bf041', + value: 4, + name: null, + type: 'smiley', + metric: 'csat', + }, + { + label: 'How you like to rate the surevy?', + id: '27b3d1d0-66a0-11ed-856c-6f39711bf041', + value: 4, + type: 'scale', + }, + { + label: 'Your Name (Single Answer)', + id: '37a8c000-66a0-11ed-856c-6f39711bf041', + value: 'a', + type: 'single-choice', + }, + { + label: 'Your Name (Multiple Answer)', + id: '4b435da0-66a0-11ed-856c-6f39711bf041', + value: ['a1', 'b1'], + type: 'multiple-choice', + }, + ], + category: 'detractor', + score: -100, + user: { + name: 'John Doe', + email: 'john@doe.com', + deleted: false, + groups: { group1: 'grooupId' }, + traits: { + createdAt: '2022-10-15T05:41:06.016Z', + custom: { key1: 'v1', key2: 'V2' }, + email: 'john@doe.com', + name: 'John Doe', + }, + }, + device: { os: 'macOS', type: 'desktop' }, + location: { + country: 'IN', + countryName: 'India', + region: '', + city: '', + short: 'India', + long: 'India', + }, + referrer: 'http://127.0.0.1:5500/testSm.html', + method: 'In-app', + language: 'en', + project: '6372247a764986ebee62bf66', + campaign: '6373271b764986ebee62bfca', }, - ], - category: 'detractor', - score: -100, - user: { - name: 'John Doe', - email: 'john@doe.com', - deleted: false, - groups: { group1: 'grooupId' }, traits: { createdAt: '2022-10-15T05:41:06.016Z', custom: { key1: 'v1', key2: 'V2' }, email: 'john@doe.com', name: 'John Doe', }, - }, - device: { os: 'macOS', type: 'desktop' }, - location: { - country: 'IN', - countryName: 'India', - region: '', - city: '', - short: 'India', - long: 'India', - }, - referrer: 'http://127.0.0.1:5500/testSm.html', - method: 'In-app', - language: 'en', - project: '6372247a764986ebee62bf66', - campaign: '6373271b764986ebee62bfca', - }, - traits: { - createdAt: '2022-10-15T05:41:06.016Z', - custom: { key1: 'v1', key2: 'V2' }, - email: 'john@doe.com', - name: 'John Doe', + campaign: { id: '6373271b764986ebee62bfca', name: 'NPS Survey' }, + event: 'completed', + }), }, - campaign: { id: '6373271b764986ebee62bfca', name: 'NPS Survey' }, - event: 'completed', + source: {}, }, ], method: 'POST', @@ -344,7 +357,10 @@ export const data = [ userDeleted: false, }, locale: 'en', - campaign: { id: '6373271b764986ebee62bfca', name: 'NPS Survey' }, + campaign: { + id: '6373271b764986ebee62bfca', + name: 'NPS Survey', + }, integration: { name: 'SATISMETER' }, location: { country: 'IN', diff --git a/test/integrations/sources/segment/data.ts b/test/integrations/sources/segment/data.ts index 780a65c1195..a7567af3a55 100644 --- a/test/integrations/sources/segment/data.ts +++ b/test/integrations/sources/segment/data.ts @@ -10,92 +10,128 @@ export const data: SrcTestCaseData[] = [ name: 'segment', description: 'test-0', module: 'source', - version: 'v0', + version: 'v2', skipGo: 'NoAnonID error', input: { request: { body: [ { - date: '2020-07-10T07:43:07.766Z', - type: 's', - connection_id: '', - client_id: '********************************', - client_name: 'My App', - ip: '47.15.6.58', - user_agent: 'Chrome Mobile 69.0.3497 / Android 0.0.0', - details: { - prompts: [], - completedAt: 1594366987765, - elapsedTime: null, - session_id: '**************_***************', + request: { + body: JSON.stringify({ + date: '2020-07-10T07:43:07.766Z', + type: 's', + connection_id: '', + client_id: '********************************', + client_name: 'My App', + ip: '47.15.6.58', + user_agent: 'Chrome Mobile 69.0.3497 / Android 0.0.0', + details: { + prompts: [], + completedAt: 1594366987765, + elapsedTime: null, + session_id: '**************_***************', + }, + hostname: '************.us.auth0.com', + user_id: 'auth0|************************', + user_name: 'example@test.com', + auth0_client: { + name: 'Auth0.Android', + env: { android: '28' }, + version: '1.23.0', + }, + log_id: '********************************************************', + _id: '********************************************************', + isMobile: true, + }), }, - hostname: '************.us.auth0.com', - user_id: 'auth0|************************', - user_name: 'example@test.com', - auth0_client: { name: 'Auth0.Android', env: { android: '28' }, version: '1.23.0' }, - log_id: '********************************************************', - _id: '********************************************************', - isMobile: true, + source: {}, }, { - date: '2020-07-10T07:43:09.620Z', - type: 'seacft', - description: '', - connection_id: '', - client_id: '********************************', - client_name: 'My App', - ip: '47.15.6.58', - user_agent: 'okhttp 2.7.5 / Other 0.0.0', - details: { code: '*************Xst' }, - hostname: '************.us.auth0.com', - user_id: 'auth0|************************', - user_name: 'example@test.com', - auth0_client: { name: 'Auth0.Android', env: { android: '28' }, version: '1.23.0' }, - log_id: '********************************************************', - _id: '********************************************************', - isMobile: false, + request: { + body: JSON.stringify({ + date: '2020-07-10T07:43:09.620Z', + type: 'seacft', + description: '', + connection_id: '', + client_id: '********************************', + client_name: 'My App', + ip: '47.15.6.58', + user_agent: 'okhttp 2.7.5 / Other 0.0.0', + details: { code: '*************Xst' }, + hostname: '************.us.auth0.com', + user_id: 'auth0|************************', + user_name: 'example@test.com', + auth0_client: { + name: 'Auth0.Android', + env: { android: '28' }, + version: '1.23.0', + }, + log_id: '********************************************************', + _id: '********************************************************', + isMobile: false, + }), + }, + source: {}, }, { - date: '2020-07-10T07:43:07.766Z', - connection_id: '', - client_id: '********************************', - client_name: 'My App', - ip: '47.15.6.58', - user_agent: 'Chrome Mobile 69.0.3497 / Android 0.0.0', - details: { - prompts: [], - completedAt: 1594366987765, - elapsedTime: null, - session_id: '**************_***************', + request: { + body: JSON.stringify({ + date: '2020-07-10T07:43:07.766Z', + connection_id: '', + client_id: '********************************', + client_name: 'My App', + ip: '47.15.6.58', + user_agent: 'Chrome Mobile 69.0.3497 / Android 0.0.0', + details: { + prompts: [], + completedAt: 1594366987765, + elapsedTime: null, + session_id: '**************_***************', + }, + hostname: '************.us.auth0.com', + user_id: 'auth0|************************', + user_name: 'example@test.com', + auth0_client: { + name: 'Auth0.Android', + env: { android: '28' }, + version: '1.23.0', + }, + log_id: '********************************************************', + _id: '********************************************************', + isMobile: true, + }), }, - hostname: '************.us.auth0.com', - user_id: 'auth0|************************', - user_name: 'example@test.com', - auth0_client: { name: 'Auth0.Android', env: { android: '28' }, version: '1.23.0' }, - log_id: '********************************************************', - _id: '********************************************************', - isMobile: true, + source: {}, }, { - type: 's', - connection_id: '', - client_id: '********************************', - client_name: 'My App', - ip: '47.15.6.58', - user_agent: 'Chrome Mobile 69.0.3497 / Android 0.0.0', - details: { - prompts: [], - completedAt: 1594366987765, - elapsedTime: null, - session_id: '**************_***************', + request: { + body: JSON.stringify({ + type: 's', + connection_id: '', + client_id: '********************************', + client_name: 'My App', + ip: '47.15.6.58', + user_agent: 'Chrome Mobile 69.0.3497 / Android 0.0.0', + details: { + prompts: [], + completedAt: 1594366987765, + elapsedTime: null, + session_id: '**************_***************', + }, + hostname: '************.us.auth0.com', + user_id: 'auth0|************************', + user_name: 'example@test.com', + auth0_client: { + name: 'Auth0.Android', + env: { android: '28' }, + version: '1.23.0', + }, + log_id: '********************************************************', + _id: '********************************************************', + isMobile: true, + }), }, - hostname: '************.us.auth0.com', - user_id: 'auth0|************************', - user_name: 'example@test.com', - auth0_client: { name: 'Auth0.Android', env: { android: '28' }, version: '1.23.0' }, - log_id: '********************************************************', - _id: '********************************************************', - isMobile: true, + source: {}, }, ], method: 'POST', diff --git a/test/integrations/sources/shopify/constants.ts b/test/integrations/sources/shopify/constants.ts index af53a3180e8..cd362adaec3 100644 --- a/test/integrations/sources/shopify/constants.ts +++ b/test/integrations/sources/shopify/constants.ts @@ -1,3 +1,58 @@ +const dummyResponseCommonPayload = { + navigator: { + language: 'en-US', + cookieEnabled: true, + languages: ['en-US', 'en'], + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36', + }, + window: { + innerHeight: 1028, + innerWidth: 1362, + outerHeight: 1080, + outerWidth: 1728, + pageXOffset: 0, + pageYOffset: 0, + location: { + href: 'https://store.myshopify.com/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU', + hash: '', + host: 'store.myshopify.com', + hostname: 'store.myshopify.com', + origin: 'https://store.myshopify.com', + pathname: '/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU', + port: '', + protocol: 'https:', + search: '', + }, + origin: 'https://store.myshopify.com', + screen: { + height: 1117, + width: 1728, + }, + screenX: 0, + screenY: 37, + scrollX: 0, + scrollY: 0, + }, + page: { + title: 'Checkout - pixel-testing-rs', + url: 'https://store.myshopify.com/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU', + path: '/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU', + search: '', + }, + userAgent: + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36', + screen: { + height: 1117, + width: 1728, + }, + library: { + name: 'RudderStack Shopify Cloud', + eventOrigin: 'client', + version: '2.0.0', + }, +}; + export const dummySourceConfig = { ID: 'dummy-source-id', OriginalID: '', @@ -83,25 +138,10 @@ export const dummyContext = { }, }; -export const note_attributes = [ - { - name: 'cartId', - value: '9c623f099fc8819aa4d6a958b65dfe7d', - }, - { - name: 'cartToken', - value: 'Z2NwLXVzLWVhc3QxOjAxSkQzNUFXVEI4VkVUNUpTTk1LSzBCMzlF', - }, - { - name: 'rudderAnonymousId', - value: '50ead33e-d763-4854-b0ab-765859ef05cb', - }, -]; - -export const responseDummyContext = { +export const dummyContextwithCampaign = { document: { location: { - href: 'https://store.myshopify.com/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU', + href: 'https://store.myshopify.com/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU?checkout%5Bpayment_gateway%5D=shopify_payments&utm_campaign=shopifySale&utm_medium=checkout&utm_term=term_checkout&utm_content=web&utm_custom1=customutm&tag=tag', hash: '', host: 'store.myshopify.com', hostname: 'store.myshopify.com', @@ -150,21 +190,60 @@ export const responseDummyContext = { scrollX: 0, scrollY: 0, }, - page: { - title: 'Checkout - pixel-testing-rs', - url: 'https://store.myshopify.com/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU', - path: '/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU', - search: '', +}; + +export const note_attributes = [ + { + name: 'cartId', + value: '9c623f099fc8819aa4d6a958b65dfe7d', }, - userAgent: - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36', - screen: { - height: 1117, - width: 1728, + { + name: 'cartToken', + value: 'Z2NwLXVzLWVhc3QxOjAxSkQzNUFXVEI4VkVUNUpTTk1LSzBCMzlF', }, - library: { - name: 'RudderStack Shopify Cloud', - eventOrigin: 'client', - version: '2.0.0', + { + name: 'rudderAnonymousId', + value: '50ead33e-d763-4854-b0ab-765859ef05cb', + }, +]; + +export const responseDummyContext = { + document: { + location: { + href: 'https://store.myshopify.com/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU', + hash: '', + host: 'store.myshopify.com', + hostname: 'store.myshopify.com', + origin: 'https://store.myshopify.com', + pathname: '/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU', + port: '', + protocol: 'https:', + search: '', + }, + referrer: 'https://store.myshopify.com/cart', + characterSet: 'UTF-8', + title: 'Checkout - pixel-testing-rs', + }, + ...dummyResponseCommonPayload, +}; + +export const responseDummyContextwithCampaign = { + document: { + location: { + href: 'https://store.myshopify.com/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU?checkout%5Bpayment_gateway%5D=shopify_payments&utm_campaign=shopifySale&utm_medium=checkout&utm_term=term_checkout&utm_content=web&utm_custom1=customutm&tag=tag', + hash: '', + host: 'store.myshopify.com', + hostname: 'store.myshopify.com', + origin: 'https://store.myshopify.com', + pathname: '/checkouts/cn/Z2NwLXVzLWVhc3QxOjAxSjY5OVpIRURQNERFMDBKUTVaRkI4UzdU', + port: '', + protocol: 'https:', + search: '', + }, + referrer: 'https://store.myshopify.com/cart', + title: 'Checkout - pixel-testing-rs', + characterSet: 'UTF-8', }, + // title: 'Checkout - pixel-testing-rs', + ...dummyResponseCommonPayload, }; diff --git a/test/integrations/sources/shopify/data.ts b/test/integrations/sources/shopify/data.ts index d4498e089c9..1cc10371daf 100644 --- a/test/integrations/sources/shopify/data.ts +++ b/test/integrations/sources/shopify/data.ts @@ -11,18 +11,21 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Track Call -> carts_create ', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - id: 'shopify_test3', - query_parameters: { topic: ['carts_create'] }, - token: 'shopify_test3', - line_items: [], - note: null, - updated_at: '2023-02-10T12:16:07.251Z', - created_at: '2023-02-10T12:05:04.402Z', + event: { + id: 'shopify_test3', + query_parameters: { topic: ['carts_create'] }, + token: 'shopify_test3', + line_items: [], + note: null, + updated_at: '2023-02-10T12:16:07.251Z', + created_at: '2023-02-10T12:05:04.402Z', + }, + source: {}, }, ], method: 'POST', @@ -41,10 +44,14 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'No Query Parameters', module: 'source', - version: 'v0', + version: 'v1', skipGo: 'not possible', input: { - request: { body: [{}], method: 'POST', headers: { 'Content-Type': 'application/json' } }, + request: { + body: [{ event: {}, source: {} }], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, pathSuffix: '', }, output: { @@ -58,6 +65,7 @@ const serverSideEventsScenarios = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'shopify', workspaceId: 'Non determinable', }, statusCode: 400, @@ -70,11 +78,16 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Invalid topic', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ - { query_parameters: { signature: ['rudderstack'], writeKey: ['sample-write-key'] } }, + { + event: { + query_parameters: { signature: ['rudderstack'], writeKey: ['sample-write-key'] }, + }, + source: {}, + }, ], method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -92,6 +105,7 @@ const serverSideEventsScenarios = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'shopify', workspaceId: 'Non determinable', }, statusCode: 400, @@ -104,17 +118,20 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Topic Not found', module: 'source', - version: 'v0', + version: 'v1', skipGo: 'not possible', input: { request: { body: [ { - query_parameters: { - topic: [], - signature: ['rudderstack'], - writeKey: ['sample-write-key'], + event: { + query_parameters: { + topic: [], + signature: ['rudderstack'], + writeKey: ['sample-write-key'], + }, }, + source: {}, }, ], method: 'POST', @@ -133,6 +150,7 @@ const serverSideEventsScenarios = [ errorCategory: 'transformation', implementation: 'native', module: 'source', + srcType: 'shopify', workspaceId: 'Non determinable', }, statusCode: 400, @@ -145,16 +163,19 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Unsupported Event Type', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - query_parameters: { - topic: ['random_event'], - signature: ['rudderstack'], - writeKey: ['sample-write-key'], + event: { + query_parameters: { + topic: ['random_event'], + signature: ['rudderstack'], + writeKey: ['sample-write-key'], + }, }, + source: {}, }, ], method: 'POST', @@ -173,37 +194,68 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Identify Call for customers create event', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - query_parameters: { - topic: ['customers_create'], - signature: ['rudderstack'], - writeKey: ['sample-write-key'], - }, - id: 5747017285820, - email: 'anuraj@rudderstack.com', - accepts_marketing: false, - created_at: '2021-12-29T15:15:19+05:30', - updated_at: '2021-12-29T15:15:20+05:30', - first_name: 'Anuraj', - last_name: 'Guha', - orders_count: 0, - state: 'disabled', - total_spent: '0.00', - last_order_id: null, - note: '', - verified_email: true, - multipass_identifier: null, - tax_exempt: false, - phone: '+919876543210', - tags: '', - last_order_name: null, - currency: 'INR', - addresses: [ - { + event: { + query_parameters: { + topic: ['customers_create'], + signature: ['rudderstack'], + writeKey: ['sample-write-key'], + }, + id: 5747017285820, + email: 'anuraj@rudderstack.com', + accepts_marketing: false, + created_at: '2021-12-29T15:15:19+05:30', + updated_at: '2021-12-29T15:15:20+05:30', + first_name: 'Anuraj', + last_name: 'Guha', + orders_count: 0, + state: 'disabled', + total_spent: '0.00', + last_order_id: null, + note: '', + verified_email: true, + multipass_identifier: null, + tax_exempt: false, + phone: '+919876543210', + tags: '', + last_order_name: null, + currency: 'INR', + addresses: [ + { + id: 6947581821116, + customer_id: 5747017285820, + first_name: 'Anuraj', + last_name: 'Guha', + company: 'Rudderstack', + address1: 'Home', + address2: 'Apartment', + city: 'Kolkata', + province: 'West Bengal', + country: 'India', + zip: '708091', + phone: '+919876543210', + name: 'Anuraj Guha', + province_code: 'WB', + country_code: 'IN', + country_name: 'India', + default: true, + }, + ], + accepts_marketing_updated_at: '2021-12-29T15:15:20+05:30', + marketing_opt_in_level: null, + tax_exemptions: [], + sms_marketing_consent: { + state: 'not_subscribed', + opt_in_level: 'single_opt_in', + consent_updated_at: null, + consent_collected_from: 'SHOPIFY', + }, + admin_graphql_api_id: 'gid://shopify/Customer/5747017285820', + default_address: { id: 6947581821116, customer_id: 5747017285820, first_name: 'Anuraj', @@ -222,36 +274,8 @@ const serverSideEventsScenarios = [ country_name: 'India', default: true, }, - ], - accepts_marketing_updated_at: '2021-12-29T15:15:20+05:30', - marketing_opt_in_level: null, - tax_exemptions: [], - sms_marketing_consent: { - state: 'not_subscribed', - opt_in_level: 'single_opt_in', - consent_updated_at: null, - consent_collected_from: 'SHOPIFY', - }, - admin_graphql_api_id: 'gid://shopify/Customer/5747017285820', - default_address: { - id: 6947581821116, - customer_id: 5747017285820, - first_name: 'Anuraj', - last_name: 'Guha', - company: 'Rudderstack', - address1: 'Home', - address2: 'Apartment', - city: 'Kolkata', - province: 'West Bengal', - country: 'India', - zip: '708091', - phone: '+919876543210', - name: 'Anuraj Guha', - province_code: 'WB', - country_code: 'IN', - country_name: 'India', - default: true, }, + source: {}, }, ], method: 'POST', @@ -352,40 +376,44 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Unsupported checkout event', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - query_parameters: { - topic: ['checkout_delete'], - writeKey: ['sample-write-key'], - signature: ['rudderstack'], + event: { + query_parameters: { + topic: ['checkout_delete'], + writeKey: ['sample-write-key'], + signature: ['rudderstack'], + }, + admin_graphql_api_id: 'gid://shopify/Fulfillment/4124667937024', + created_at: '2022-01-05T18:13:02+05:30', + destination: null, + id: 4124667937024, + line_items: [], + customer: { email: 'test_person@email.com', first_name: 'Test', last_name: 'Person' }, + billing_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, + shipping_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, + location_id: 66855371008, + name: '#1002.1', + order_id: 4617255092480, + origin_address: null, + receipt: {}, + service: 'manual', + shipment_status: null, + status: 'success', + tracking_company: 'Amazon Logistics UK', + tracking_number: 'Sample001test', + tracking_numbers: ['Sample001test'], + tracking_url: + 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', + tracking_urls: [ + 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', + ], + updated_at: '2022-01-05T18:16:48+05:30', }, - admin_graphql_api_id: 'gid://shopify/Fulfillment/4124667937024', - created_at: '2022-01-05T18:13:02+05:30', - destination: null, - id: 4124667937024, - line_items: [], - customer: { email: 'test_person@email.com', first_name: 'Test', last_name: 'Person' }, - billing_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, - shipping_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, - location_id: 66855371008, - name: '#1002.1', - order_id: 4617255092480, - origin_address: null, - receipt: {}, - service: 'manual', - shipment_status: null, - status: 'success', - tracking_company: 'Amazon Logistics UK', - tracking_number: 'Sample001test', - tracking_numbers: ['Sample001test'], - tracking_url: 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', - tracking_urls: [ - 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', - ], - updated_at: '2022-01-05T18:16:48+05:30', + source: {}, }, ], method: 'POST', @@ -404,97 +432,101 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Track Call -> Fullfillments updated event', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - query_parameters: { - topic: ['fulfillments_update'], - writeKey: ['sample-write-key'], - signature: ['rudderstack'], - }, - shipping_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, - billing_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, - admin_graphql_api_id: 'gid://shopify/Fulfillment/4124667937024', - created_at: '2022-01-05T18:13:02+05:30', - destination: null, - email: 'test_person@email.com', - id: 4124667937024, - line_items: [ - { - admin_graphql_api_id: 'gid://shopify/LineItem/11896203149568', - discount_allocations: [], - duties: [], - fulfillable_quantity: 0, - fulfillment_service: 'manual', - fulfillment_status: 'fulfilled', - gift_card: false, - grams: 0, - id: 11896203149568, - name: 'p1', - origin_location: { - address1: '74 CC/7, Anupama Housing Estate - II', - address2: '', - city: 'Kolkatta', - country_code: 'IN', - id: 3373642219776, - name: '74 CC/7, Anupama Housing Estate - II', - province_code: 'WB', - zip: '700052', - }, - price: '5000.00', - price_set: { - presentment_money: { amount: '5000.00', currency_code: 'INR' }, - shop_money: { amount: '5000.00', currency_code: 'INR' }, - }, - product_exists: true, - product_id: 7510929801472, - properties: [], - quantity: 1, - requires_shipping: true, - sku: '15', - tax_lines: [ - { - channel_liable: false, - price: '900.00', - price_set: { - presentment_money: { amount: '900.00', currency_code: 'INR' }, - shop_money: { amount: '900.00', currency_code: 'INR' }, + event: { + query_parameters: { + topic: ['fulfillments_update'], + writeKey: ['sample-write-key'], + signature: ['rudderstack'], + }, + shipping_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, + billing_address: { address1: '11 Rani Sankari Lane Patuapara Bhowanipore' }, + admin_graphql_api_id: 'gid://shopify/Fulfillment/4124667937024', + created_at: '2022-01-05T18:13:02+05:30', + destination: null, + email: 'test_person@email.com', + id: 4124667937024, + line_items: [ + { + admin_graphql_api_id: 'gid://shopify/LineItem/11896203149568', + discount_allocations: [], + duties: [], + fulfillable_quantity: 0, + fulfillment_service: 'manual', + fulfillment_status: 'fulfilled', + gift_card: false, + grams: 0, + id: 11896203149568, + name: 'p1', + origin_location: { + address1: '74 CC/7, Anupama Housing Estate - II', + address2: '', + city: 'Kolkatta', + country_code: 'IN', + id: 3373642219776, + name: '74 CC/7, Anupama Housing Estate - II', + province_code: 'WB', + zip: '700052', + }, + price: '5000.00', + price_set: { + presentment_money: { amount: '5000.00', currency_code: 'INR' }, + shop_money: { amount: '5000.00', currency_code: 'INR' }, + }, + product_exists: true, + product_id: 7510929801472, + properties: [], + quantity: 1, + requires_shipping: true, + sku: '15', + tax_lines: [ + { + channel_liable: false, + price: '900.00', + price_set: { + presentment_money: { amount: '900.00', currency_code: 'INR' }, + shop_money: { amount: '900.00', currency_code: 'INR' }, + }, + rate: 0.18, + title: 'IGST', }, - rate: 0.18, - title: 'IGST', + ], + taxable: true, + title: 'p1', + total_discount: '0.00', + total_discount_set: { + presentment_money: { amount: '0.00', currency_code: 'INR' }, + shop_money: { amount: '0.00', currency_code: 'INR' }, }, - ], - taxable: true, - title: 'p1', - total_discount: '0.00', - total_discount_set: { - presentment_money: { amount: '0.00', currency_code: 'INR' }, - shop_money: { amount: '0.00', currency_code: 'INR' }, + variant_id: 42211160228096, + variant_inventory_management: 'shopify', + variant_title: '', + vendor: 'rudderstack-store', }, - variant_id: 42211160228096, - variant_inventory_management: 'shopify', - variant_title: '', - vendor: 'rudderstack-store', - }, - ], - location_id: 66855371008, - name: '#1002.1', - order_id: 4617255092480, - origin_address: null, - receipt: {}, - service: 'manual', - shipment_status: null, - status: 'success', - tracking_company: 'Amazon Logistics UK', - tracking_number: 'Sample001test', - tracking_numbers: ['Sample001test'], - tracking_url: 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', - tracking_urls: [ - 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', - ], - updated_at: '2022-01-05T18:16:48+05:30', + ], + location_id: 66855371008, + name: '#1002.1', + order_id: 4617255092480, + origin_address: null, + receipt: {}, + service: 'manual', + shipment_status: null, + status: 'success', + tracking_company: 'Amazon Logistics UK', + tracking_number: 'Sample001test', + tracking_numbers: ['Sample001test'], + tracking_url: + 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', + tracking_urls: [ + 'https://www.amazon.co.uk/gp/help/customer/display.html?nodeId=201910530', + ], + updated_at: '2022-01-05T18:16:48+05:30', + }, + source: {}, }, ], method: 'POST', @@ -616,407 +648,410 @@ const serverSideEventsScenarios = [ name: 'shopify', description: 'Track Call -> Order Partially Fulfilled event', module: 'source', - version: 'v0', + version: 'v1', input: { request: { body: [ { - query_parameters: { - topic: ['orders_partially_fulfilled'], - writeKey: ['sample-write-key'], - signature: ['rudderstack'], - }, - id: 820982911946154508, - admin_graphql_api_id: 'gid://shopify/Order/820982911946154508', - app_id: null, - browser_ip: null, - buyer_accepts_marketing: true, - cancel_reason: 'customer', - cancelled_at: '2021-12-31T19:00:00-05:00', - cart_token: null, - checkout_id: null, - checkout_token: null, - client_details: null, - closed_at: null, - confirmation_number: null, - confirmed: false, - contact_email: 'jon@example.com', - created_at: '2021-12-31T19:00:00-05:00', - currency: 'USD', - current_subtotal_price: '398.00', - current_subtotal_price_set: { - shop_money: { - amount: '398.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '398.00', - currency_code: 'USD', - }, - }, - current_total_additional_fees_set: null, - current_total_discounts: '0.00', - current_total_discounts_set: { - shop_money: { - amount: '0.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '0.00', - currency_code: 'USD', - }, - }, - current_total_duties_set: null, - current_total_price: '398.00', - current_total_price_set: { - shop_money: { - amount: '398.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '398.00', - currency_code: 'USD', - }, - }, - current_total_tax: '0.00', - current_total_tax_set: { - shop_money: { - amount: '0.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '0.00', - currency_code: 'USD', - }, - }, - customer_locale: 'en', - device_id: null, - discount_codes: [], - email: 'jon@example.com', - estimated_taxes: false, - financial_status: 'voided', - fulfillment_status: 'pending', - landing_site: null, - landing_site_ref: null, - location_id: null, - merchant_of_record_app_id: null, - name: '#9999', - note: null, - note_attributes: [], - number: 234, - order_number: 1234, - order_status_url: - 'https://jsmith.myshopify.com/548380009/orders/123456abcd/authenticate?key=abcdefg', - original_total_additional_fees_set: null, - original_total_duties_set: null, - payment_gateway_names: ['visa', 'bogus'], - phone: null, - po_number: null, - presentment_currency: 'USD', - processed_at: '2021-12-31T19:00:00-05:00', - reference: null, - referring_site: null, - source_identifier: null, - source_name: 'web', - source_url: null, - subtotal_price: '388.00', - subtotal_price_set: { - shop_money: { - amount: '388.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '388.00', - currency_code: 'USD', + event: { + query_parameters: { + topic: ['orders_partially_fulfilled'], + writeKey: ['sample-write-key'], + signature: ['rudderstack'], }, - }, - tags: 'tag1, tag2', - tax_exempt: false, - tax_lines: [], - taxes_included: false, - test: true, - token: '123456abcd', - total_discounts: '20.00', - total_discounts_set: { - shop_money: { - amount: '20.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '20.00', - currency_code: 'USD', + id: 820982911946154508, + admin_graphql_api_id: 'gid://shopify/Order/820982911946154508', + app_id: null, + browser_ip: null, + buyer_accepts_marketing: true, + cancel_reason: 'customer', + cancelled_at: '2021-12-31T19:00:00-05:00', + cart_token: null, + checkout_id: null, + checkout_token: null, + client_details: null, + closed_at: null, + confirmation_number: null, + confirmed: false, + contact_email: 'jon@example.com', + created_at: '2021-12-31T19:00:00-05:00', + currency: 'USD', + current_subtotal_price: '398.00', + current_subtotal_price_set: { + shop_money: { + amount: '398.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '398.00', + currency_code: 'USD', + }, }, - }, - total_line_items_price: '398.00', - total_line_items_price_set: { - shop_money: { - amount: '398.00', - currency_code: 'USD', + current_total_additional_fees_set: null, + current_total_discounts: '0.00', + current_total_discounts_set: { + shop_money: { + amount: '0.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '0.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '398.00', - currency_code: 'USD', + current_total_duties_set: null, + current_total_price: '398.00', + current_total_price_set: { + shop_money: { + amount: '398.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '398.00', + currency_code: 'USD', + }, }, - }, - total_outstanding: '398.00', - total_price: '388.00', - total_price_set: { - shop_money: { - amount: '388.00', - currency_code: 'USD', + current_total_tax: '0.00', + current_total_tax_set: { + shop_money: { + amount: '0.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '0.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '388.00', - currency_code: 'USD', + customer_locale: 'en', + device_id: null, + discount_codes: [], + email: 'jon@example.com', + estimated_taxes: false, + financial_status: 'voided', + fulfillment_status: 'pending', + landing_site: null, + landing_site_ref: null, + location_id: null, + merchant_of_record_app_id: null, + name: '#9999', + note: null, + note_attributes: [], + number: 234, + order_number: 1234, + order_status_url: + 'https://jsmith.myshopify.com/548380009/orders/123456abcd/authenticate?key=abcdefg', + original_total_additional_fees_set: null, + original_total_duties_set: null, + payment_gateway_names: ['visa', 'bogus'], + phone: null, + po_number: null, + presentment_currency: 'USD', + processed_at: '2021-12-31T19:00:00-05:00', + reference: null, + referring_site: null, + source_identifier: null, + source_name: 'web', + source_url: null, + subtotal_price: '388.00', + subtotal_price_set: { + shop_money: { + amount: '388.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '388.00', + currency_code: 'USD', + }, }, - }, - total_shipping_price_set: { - shop_money: { - amount: '10.00', - currency_code: 'USD', + tags: 'tag1, tag2', + tax_exempt: false, + tax_lines: [], + taxes_included: false, + test: true, + token: '123456abcd', + total_discounts: '20.00', + total_discounts_set: { + shop_money: { + amount: '20.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '20.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '10.00', - currency_code: 'USD', + total_line_items_price: '398.00', + total_line_items_price_set: { + shop_money: { + amount: '398.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '398.00', + currency_code: 'USD', + }, }, - }, - total_tax: '0.00', - total_tax_set: { - shop_money: { - amount: '0.00', - currency_code: 'USD', + total_outstanding: '398.00', + total_price: '388.00', + total_price_set: { + shop_money: { + amount: '388.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '388.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '0.00', - currency_code: 'USD', + total_shipping_price_set: { + shop_money: { + amount: '10.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '10.00', + currency_code: 'USD', + }, }, - }, - total_tip_received: '0.00', - total_weight: 0, - updated_at: '2021-12-31T19:00:00-05:00', - user_id: null, - billing_address: { - first_name: 'Steve', - address1: '123 Shipping Street', - phone: '555-555-SHIP', - city: 'Shippington', - zip: '40003', - province: 'Kentucky', - country: 'United States', - last_name: 'Shipper', - address2: null, - company: 'Shipping Company', - latitude: null, - longitude: null, - name: 'Steve Shipper', - country_code: 'US', - province_code: 'KY', - }, - customer: { - id: 115310627314723954, - email: 'john@example.com', - created_at: null, - updated_at: null, - first_name: 'John', - last_name: 'Smith', - state: 'disabled', - note: null, - verified_email: true, - multipass_identifier: null, - tax_exempt: false, - phone: null, - email_marketing_consent: { - state: 'not_subscribed', - opt_in_level: null, - consent_updated_at: null, + total_tax: '0.00', + total_tax_set: { + shop_money: { + amount: '0.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '0.00', + currency_code: 'USD', + }, }, - sms_marketing_consent: null, - tags: '', - currency: 'USD', - tax_exemptions: [], - admin_graphql_api_id: 'gid://shopify/Customer/115310627314723954', - default_address: { - id: 715243470612851245, - customer_id: 115310627314723954, - first_name: null, - last_name: null, - company: null, - address1: '123 Elm St.', + total_tip_received: '0.00', + total_weight: 0, + updated_at: '2021-12-31T19:00:00-05:00', + user_id: null, + billing_address: { + first_name: 'Steve', + address1: '123 Shipping Street', + phone: '555-555-SHIP', + city: 'Shippington', + zip: '40003', + province: 'Kentucky', + country: 'United States', + last_name: 'Shipper', address2: null, - city: 'Ottawa', - province: 'Ontario', - country: 'Canada', - zip: 'K2H7A8', - phone: '123-123-1234', - name: '', - province_code: 'ON', - country_code: 'CA', - country_name: 'Canada', - default: true, + company: 'Shipping Company', + latitude: null, + longitude: null, + name: 'Steve Shipper', + country_code: 'US', + province_code: 'KY', }, - }, - discount_applications: [], - fulfillments: [], - line_items: [ - { - id: 866550311766439020, - admin_graphql_api_id: 'gid://shopify/LineItem/866550311766439020', - attributed_staffs: [ - { - id: 'gid://shopify/StaffMember/902541635', - quantity: 1, - }, - ], - current_quantity: 1, - fulfillable_quantity: 1, - fulfillment_service: 'manual', - fulfillment_status: null, - gift_card: false, - grams: 567, - name: 'IPod Nano - 8GB', - price: '199.00', - price_set: { - shop_money: { - amount: '199.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '199.00', - currency_code: 'USD', - }, + customer: { + id: 115310627314723954, + email: 'john@example.com', + created_at: null, + updated_at: null, + first_name: 'John', + last_name: 'Smith', + state: 'disabled', + note: null, + verified_email: true, + multipass_identifier: null, + tax_exempt: false, + phone: null, + email_marketing_consent: { + state: 'not_subscribed', + opt_in_level: null, + consent_updated_at: null, }, - product_exists: true, - product_id: 632910392, - properties: [], - quantity: 1, - requires_shipping: true, - sku: 'IPOD2008PINK', - taxable: true, - title: 'IPod Nano - 8GB', - total_discount: '0.00', - total_discount_set: { - shop_money: { - amount: '0.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '0.00', - currency_code: 'USD', - }, + sms_marketing_consent: null, + tags: '', + currency: 'USD', + tax_exemptions: [], + admin_graphql_api_id: 'gid://shopify/Customer/115310627314723954', + default_address: { + id: 715243470612851245, + customer_id: 115310627314723954, + first_name: null, + last_name: null, + company: null, + address1: '123 Elm St.', + address2: null, + city: 'Ottawa', + province: 'Ontario', + country: 'Canada', + zip: 'K2H7A8', + phone: '123-123-1234', + name: '', + province_code: 'ON', + country_code: 'CA', + country_name: 'Canada', + default: true, }, - variant_id: 808950810, - variant_inventory_management: 'shopify', - variant_title: null, - vendor: null, - tax_lines: [], - duties: [], - discount_allocations: [], }, - { - id: 141249953214522974, - admin_graphql_api_id: 'gid://shopify/LineItem/141249953214522974', - attributed_staffs: [], - current_quantity: 1, - fulfillable_quantity: 1, - fulfillment_service: 'manual', - fulfillment_status: null, - gift_card: false, - grams: 567, - name: 'IPod Nano - 8GB', - price: '199.00', - price_set: { - shop_money: { - amount: '199.00', - currency_code: 'USD', + discount_applications: [], + fulfillments: [], + line_items: [ + { + id: 866550311766439020, + admin_graphql_api_id: 'gid://shopify/LineItem/866550311766439020', + attributed_staffs: [ + { + id: 'gid://shopify/StaffMember/902541635', + quantity: 1, + }, + ], + current_quantity: 1, + fulfillable_quantity: 1, + fulfillment_service: 'manual', + fulfillment_status: null, + gift_card: false, + grams: 567, + name: 'IPod Nano - 8GB', + price: '199.00', + price_set: { + shop_money: { + amount: '199.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '199.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '199.00', - currency_code: 'USD', + product_exists: true, + product_id: 632910392, + properties: [], + quantity: 1, + requires_shipping: true, + sku: 'IPOD2008PINK', + taxable: true, + title: 'IPod Nano - 8GB', + total_discount: '0.00', + total_discount_set: { + shop_money: { + amount: '0.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '0.00', + currency_code: 'USD', + }, }, + variant_id: 808950810, + variant_inventory_management: 'shopify', + variant_title: null, + vendor: null, + tax_lines: [], + duties: [], + discount_allocations: [], }, - product_exists: true, - product_id: 632910392, - properties: [], - quantity: 1, - requires_shipping: true, - sku: 'IPOD2008PINK', - taxable: true, - title: 'IPod Nano - 8GB', - total_discount: '0.00', - total_discount_set: { - shop_money: { - amount: '0.00', - currency_code: 'USD', + { + id: 141249953214522974, + admin_graphql_api_id: 'gid://shopify/LineItem/141249953214522974', + attributed_staffs: [], + current_quantity: 1, + fulfillable_quantity: 1, + fulfillment_service: 'manual', + fulfillment_status: null, + gift_card: false, + grams: 567, + name: 'IPod Nano - 8GB', + price: '199.00', + price_set: { + shop_money: { + amount: '199.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '199.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '0.00', - currency_code: 'USD', + product_exists: true, + product_id: 632910392, + properties: [], + quantity: 1, + requires_shipping: true, + sku: 'IPOD2008PINK', + taxable: true, + title: 'IPod Nano - 8GB', + total_discount: '0.00', + total_discount_set: { + shop_money: { + amount: '0.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '0.00', + currency_code: 'USD', + }, }, + variant_id: 808950810, + variant_inventory_management: 'shopify', + variant_title: null, + vendor: null, + tax_lines: [], + duties: [], + discount_allocations: [], }, - variant_id: 808950810, - variant_inventory_management: 'shopify', - variant_title: null, - vendor: null, - tax_lines: [], - duties: [], - discount_allocations: [], + ], + payment_terms: null, + refunds: [], + shipping_address: { + first_name: 'Steve', + address1: '123 Shipping Street', + phone: '555-555-SHIP', + city: 'Shippington', + zip: '40003', + province: 'Kentucky', + country: 'United States', + last_name: 'Shipper', + address2: null, + company: 'Shipping Company', + latitude: null, + longitude: null, + name: 'Steve Shipper', + country_code: 'US', + province_code: 'KY', }, - ], - payment_terms: null, - refunds: [], - shipping_address: { - first_name: 'Steve', - address1: '123 Shipping Street', - phone: '555-555-SHIP', - city: 'Shippington', - zip: '40003', - province: 'Kentucky', - country: 'United States', - last_name: 'Shipper', - address2: null, - company: 'Shipping Company', - latitude: null, - longitude: null, - name: 'Steve Shipper', - country_code: 'US', - province_code: 'KY', - }, - shipping_lines: [ - { - id: 271878346596884015, - carrier_identifier: null, - code: null, - discounted_price: '10.00', - discounted_price_set: { - shop_money: { - amount: '10.00', - currency_code: 'USD', - }, - presentment_money: { - amount: '10.00', - currency_code: 'USD', - }, - }, - is_removed: false, - phone: null, - price: '10.00', - price_set: { - shop_money: { - amount: '10.00', - currency_code: 'USD', + shipping_lines: [ + { + id: 271878346596884015, + carrier_identifier: null, + code: null, + discounted_price: '10.00', + discounted_price_set: { + shop_money: { + amount: '10.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '10.00', + currency_code: 'USD', + }, }, - presentment_money: { - amount: '10.00', - currency_code: 'USD', + is_removed: false, + phone: null, + price: '10.00', + price_set: { + shop_money: { + amount: '10.00', + currency_code: 'USD', + }, + presentment_money: { + amount: '10.00', + currency_code: 'USD', + }, }, + requested_fulfillment_service_id: null, + source: 'shopify', + title: 'Generic Shipping', + tax_lines: [], + discount_allocations: [], }, - requested_fulfillment_service_id: null, - source: 'shopify', - title: 'Generic Shipping', - tax_lines: [], - discount_allocations: [], - }, - ], + ], + }, + source: {}, }, ], method: 'POST', diff --git a/test/integrations/sources/shopify/mocks.ts b/test/integrations/sources/shopify/mocks.ts index e1895e78124..929d6e17fd3 100644 --- a/test/integrations/sources/shopify/mocks.ts +++ b/test/integrations/sources/shopify/mocks.ts @@ -1,5 +1,14 @@ import utils from '../../../../src/v0/util'; +import { RedisDB } from '../../../../src/util/redis/redisConnector'; export const mockFns = (_) => { jest.spyOn(utils, 'generateUUID').mockReturnValue('5d3e2cb6-4011-5c9c-b7ee-11bc1e905097'); + jest.spyOn(RedisDB, 'getVal').mockImplementation((key) => { + if (key === 'pixel:c7b3f99b-4d34-463b-835f-c879482a7750') { + return Promise.resolve({ userId: 'test-user-id' }); + } + return Promise.resolve({}); + }); + // Mock setVal to track anonymousId to userId mapping + jest.spyOn(RedisDB, 'setVal').mockReturnValue(Promise.resolve()); }; diff --git a/test/integrations/sources/shopify/pixelTestScenarios/CheckoutEventsTests.ts b/test/integrations/sources/shopify/pixelTestScenarios/CheckoutEventsTests.ts index ff1ea39ed13..2b04a33fb8b 100644 --- a/test/integrations/sources/shopify/pixelTestScenarios/CheckoutEventsTests.ts +++ b/test/integrations/sources/shopify/pixelTestScenarios/CheckoutEventsTests.ts @@ -336,6 +336,11 @@ export const pixelCheckoutEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', event: 'Checkout Started', @@ -775,6 +780,11 @@ export const pixelCheckoutEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', event: 'Order Completed', diff --git a/test/integrations/sources/shopify/pixelTestScenarios/CheckoutStepsTests.ts b/test/integrations/sources/shopify/pixelTestScenarios/CheckoutStepsTests.ts index 38f682ac6da..95fd2ea26bd 100644 --- a/test/integrations/sources/shopify/pixelTestScenarios/CheckoutStepsTests.ts +++ b/test/integrations/sources/shopify/pixelTestScenarios/CheckoutStepsTests.ts @@ -387,6 +387,11 @@ export const pixelCheckoutStepsScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', event: 'Checkout Address Info Submitted', @@ -921,6 +926,11 @@ export const pixelCheckoutStepsScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', event: 'Checkout Contact Info Submitted', @@ -1470,6 +1480,11 @@ export const pixelCheckoutStepsScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', event: 'Checkout Shipping Info Submitted', @@ -2035,9 +2050,14 @@ export const pixelCheckoutStepsScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', - event: 'Payment Info Submitted', + event: 'Payment Info Entered', properties: { buyerAcceptsEmailMarketing: false, buyerAcceptsSmsMarketing: false, diff --git a/test/integrations/sources/shopify/pixelTestScenarios/ProductEventsTests.ts b/test/integrations/sources/shopify/pixelTestScenarios/ProductEventsTests.ts index 46bd4f96151..1e9797bd8d8 100644 --- a/test/integrations/sources/shopify/pixelTestScenarios/ProductEventsTests.ts +++ b/test/integrations/sources/shopify/pixelTestScenarios/ProductEventsTests.ts @@ -1,5 +1,12 @@ // This file contains the test scenarios related to Shopify pixel events, emitted from web pixel on the browser. -import { dummyContext, dummySourceConfig, responseDummyContext } from '../constants'; +import { mockFns } from '../mocks'; +import { + dummyContext, + dummyContextwithCampaign, + dummySourceConfig, + responseDummyContext, + responseDummyContextwithCampaign, +} from '../constants'; export const pixelEventsTestScenarios = [ { @@ -18,7 +25,7 @@ export const pixelEventsTestScenarios = [ type: 'standard', clientId: 'c7b3f99b-4d34-463b-835f-c879482a7750', timestamp: '2024-09-15T17:24:30.373Z', - context: dummyContext, + context: dummyContextwithCampaign, pixelEventLabel: true, query_parameters: { topic: ['page_viewed'], @@ -42,7 +49,14 @@ export const pixelEventsTestScenarios = [ batch: [ { context: { - ...responseDummyContext, + ...responseDummyContextwithCampaign, + campaign: { + content: 'web', + medium: 'checkout', + name: 'shopifySale', + term: 'term_checkout', + utm_custom1: 'customutm', + }, shopifyDetails: { clientId: 'c7b3f99b-4d34-463b-835f-c879482a7750', data: {}, @@ -55,9 +69,15 @@ export const pixelEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['page.context.shopifyDetails'], + }, + }, }, name: 'Page View', type: 'page', + userId: 'test-user-id', properties: {}, anonymousId: 'c7b3f99b-4d34-463b-835f-c879482a7750', messageId: 'sh-f6b6f548-5FEF-4DAE-9CAB-39EE6F94E09B', @@ -166,8 +186,14 @@ export const pixelEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', + userId: 'test-user-id', event: 'Product Viewed', properties: { product_id: '7234590834801', @@ -330,8 +356,14 @@ export const pixelEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', + userId: 'test-user-id', event: 'Cart Viewed', properties: { products: [ @@ -555,8 +587,14 @@ export const pixelEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', + userId: 'test-user-id', event: 'Product List Viewed', properties: { cart_id: 'c7b3f99b-4d34-463b-835f-c879482a7750', @@ -725,8 +763,14 @@ export const pixelEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', + userId: 'test-user-id', event: 'Product Added', properties: { image_url: @@ -866,8 +910,14 @@ export const pixelEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', + userId: 'test-user-id', event: 'Product Removed', properties: { image_url: @@ -955,8 +1005,14 @@ export const pixelEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', + userId: 'test-user-id', event: 'Search Submitted', properties: { query: 'skate', @@ -1022,4 +1078,4 @@ export const pixelEventsTestScenarios = [ }, }, }, -]; +].map((p1) => ({ ...p1, mockFns })); diff --git a/test/integrations/sources/shopify/webhookTestScenarios/CheckoutEventsTests.ts b/test/integrations/sources/shopify/webhookTestScenarios/CheckoutEventsTests.ts index a154ccb890c..66d5e7815d3 100644 --- a/test/integrations/sources/shopify/webhookTestScenarios/CheckoutEventsTests.ts +++ b/test/integrations/sources/shopify/webhookTestScenarios/CheckoutEventsTests.ts @@ -1,5 +1,6 @@ // This file contains the test scenarios for the server-side events from the Shopify GraphQL API for // the v1 transformation flow +import { mockFns } from '../mocks'; import { dummySourceConfig, note_attributes } from '../constants'; export const checkoutEventsTestScenarios = [ @@ -100,11 +101,6 @@ export const checkoutEventsTestScenarios = [ }, }, source: dummySourceConfig, - query_parameters: { - topic: ['carts_update'], - writeKey: ['2mw9SN679HngnXXXHT4oSVVBVmb'], - version: ['pixel'], - }, }, ], method: 'POST', @@ -215,18 +211,23 @@ export const checkoutEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', - event: 'Checkout Started', + event: 'Checkout Started Webhook', properties: { - order_id: 35550298931313, - value: '600.00', - tax: '0.00', + order_id: '35550298931313', + value: 600, + tax: 0, currency: 'USD', products: [ { - product_id: 7234590408817, - price: '600.00', + product_id: '7234590408817', + price: 600.0, brand: 'Hydrogen Vendor', quantity: 1, }, @@ -235,6 +236,7 @@ export const checkoutEventsTestScenarios = [ timestamp: '2024-11-06T02:22:02.000Z', traits: { shippingAddress: [], + cart_token_hash: '9125e1da-57b9-5bdc-953e-eb2b0ded5edc', }, anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb', }, @@ -530,20 +532,24 @@ export const checkoutEventsTestScenarios = [ event: 'Checkout Updated', integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, properties: { currency: 'USD', - order_id: 35374569160817, + order_id: '35374569160817', products: [ { brand: 'pixel-testing-rs', - price: '729.95', - product_id: 7234590638193, + price: 729.95, + product_id: '7234590638193', quantity: 1, }, ], - tax: '0.00', - value: '736.85', + tax: 0, }, timestamp: '2024-09-17T07:29:02.000Z', traits: { @@ -567,6 +573,7 @@ export const checkoutEventsTestScenarios = [ province_code: 'AZ', zip: '85003', }, + cart_token_hash: '9e189f39-da46-58df-81b4-5e507d9ef64e', adminGraphqlApiId: 'gid://shopify/Customer/7188389789809', currency: 'USD', email: 'testuser101@gmail.com', @@ -599,6 +606,74 @@ export const checkoutEventsTestScenarios = [ type: 'track', userId: '7188389789809', }, + { + anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb', + context: { + integration: { + name: 'SHOPIFY', + }, + library: { + eventOrigin: 'server', + name: 'RudderStack Shopify Cloud', + version: '2.0.0', + }, + traits: { + acceptsMarketing: false, + address: { + address1: 'oakwood bridge', + address2: 'Hedgetown', + city: 'KLF', + company: null, + country: 'United States', + country_code: 'US', + country_name: 'United States', + customer_id: 7188389789809, + default: true, + first_name: 'testuser', + id: null, + last_name: 'dummy', + name: 'testuser dummy', + phone: null, + province: 'Arizona', + province_code: 'AZ', + zip: '85003', + }, + adminGraphqlApiId: 'gid://shopify/Customer/7188389789809', + currency: 'USD', + email: 'testuser101@gmail.com', + firstName: 'testuser', + lastName: 'dummy', + orderCount: 0, + shippingAddress: { + address1: 'oakwood bridge', + address2: 'Hedgetown', + city: 'KLF', + company: null, + country: 'United States', + country_code: 'US', + first_name: 'testuser', + last_name: 'dummy', + latitude: null, + longitude: null, + name: 'testuser dummy', + phone: null, + province: 'Arizona', + province_code: 'AZ', + zip: '85003', + }, + state: 'disabled', + tags: '', + taxExempt: false, + totalSpent: '0.00', + verifiedEmail: true, + }, + }, + integrations: { + SHOPIFY: true, + }, + type: 'identify', + userId: '7188389789809', + }, ], }, }, @@ -1203,19 +1278,23 @@ export const checkoutEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', event: 'Order Updated', properties: { - order_id: 5778367414385, - value: '600.00', - tax: '0.00', + order_id: '5778367414385', + tax: 0, currency: 'USD', products: [ { - product_id: 7234590408817, + product_id: '7234590408817', title: 'The Collection Snowboard: Hydrogen', - price: '600.00', + price: 600, brand: 'Hydrogen Vendor', quantity: 1, }, @@ -1245,6 +1324,7 @@ export const checkoutEventsTestScenarios = [ country_name: 'United States', default: true, }, + cart_token_hash: '9125e1da-57b9-5bdc-953e-eb2b0ded5edc', state: 'disabled', verifiedEmail: true, taxExempt: false, @@ -1290,6 +1370,89 @@ export const checkoutEventsTestScenarios = [ timestamp: '2024-11-06T02:54:50.000Z', anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb', }, + { + anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb', + context: { + integration: { + name: 'SHOPIFY', + }, + library: { + eventOrigin: 'server', + name: 'RudderStack Shopify Cloud', + version: '2.0.0', + }, + traits: { + address: { + address1: 'Yuimaru Kitchen', + address2: '6', + city: 'Johnson City', + company: null, + country: 'United States', + country_code: 'US', + country_name: 'United States', + customer_id: 7358220173425, + default: true, + first_name: 'henry', + id: 8715246862449, + last_name: 'waffles', + name: 'henry waffles', + phone: null, + province: 'Tennessee', + province_code: 'TN', + zip: '37604', + }, + adminGraphqlApiId: 'gid://shopify/Customer/7358220173425', + billingAddress: { + address1: 'Yuma Proving Ground', + address2: 'suite 001', + city: 'Yuma Proving Ground', + company: null, + country: 'United States', + country_code: 'US', + first_name: 'yodi', + last_name: 'waffles', + latitude: 33.0177811, + longitude: -114.2525392, + name: 'yodi waffles', + phone: null, + province: 'Arizona', + province_code: 'AZ', + zip: '85365', + }, + currency: 'USD', + email: 'henry@wfls.com', + firstName: 'yodi', + lastName: 'waffles', + shippingAddress: { + address1: 'Yuimaru Kitchen', + address2: '6', + city: 'Johnson City', + company: null, + country: 'United States', + country_code: 'US', + first_name: 'henry', + last_name: 'waffles', + latitude: 36.3528845, + longitude: -82.4006335, + name: 'henry waffles', + phone: null, + province: 'Tennessee', + province_code: 'TN', + zip: '37604', + }, + state: 'disabled', + tags: '', + taxExempt: false, + taxExemptions: [], + verifiedEmail: true, + }, + }, + integrations: { + SHOPIFY: true, + }, + type: 'identify', + userId: '7358220173425', + }, ], }, }, @@ -1594,19 +1757,24 @@ export const checkoutEventsTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', event: 'Order Created', properties: { - order_id: 5778367414385, - value: '600.00', - tax: '0.00', + order_id: '5778367414385', + value: 600, + tax: 0, currency: 'USD', products: [ { - product_id: 7234590408817, + product_id: '7234590408817', title: 'The Collection Snowboard: Hydrogen', - price: '600.00', + price: 600, brand: 'Hydrogen Vendor', quantity: 1, }, @@ -1636,6 +1804,7 @@ export const checkoutEventsTestScenarios = [ country_name: 'United States', default: true, }, + cart_token_hash: '9125e1da-57b9-5bdc-953e-eb2b0ded5edc', state: 'disabled', currency: 'USD', taxExemptions: [], @@ -1678,6 +1847,465 @@ export const checkoutEventsTestScenarios = [ timestamp: '2024-11-06T02:54:50.000Z', anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb', }, + { + anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb', + context: { + integration: { + name: 'SHOPIFY', + }, + library: { + eventOrigin: 'server', + name: 'RudderStack Shopify Cloud', + version: '2.0.0', + }, + traits: { + address: { + address1: 'Yuimaru Kitchen', + address2: '6', + city: 'Johnson City', + company: null, + country: 'United States', + country_code: 'US', + country_name: 'United States', + customer_id: 7358220173425, + default: true, + first_name: 'henry', + id: 8715246862449, + last_name: 'waffles', + name: 'henry waffles', + phone: null, + province: 'Tennessee', + province_code: 'TN', + zip: '37604', + }, + adminGraphqlApiId: 'gid://shopify/Customer/7358220173425', + billingAddress: { + address1: 'Yuma Proving Ground', + address2: 'suite 001', + city: 'Yuma Proving Ground', + company: null, + country: 'United States', + country_code: 'US', + first_name: 'yodi', + last_name: 'waffles', + latitude: 33.0177811, + longitude: -114.2525392, + name: 'yodi waffles', + phone: null, + province: 'Arizona', + province_code: 'AZ', + zip: '85365', + }, + currency: 'USD', + email: 'henry@wfls.com', + firstName: 'yodi', + lastName: 'waffles', + shippingAddress: { + address1: 'Yuimaru Kitchen', + address2: '6', + city: 'Johnson City', + company: null, + country: 'United States', + country_code: 'US', + first_name: 'henry', + last_name: 'waffles', + latitude: 36.3528845, + longitude: -82.4006335, + name: 'henry waffles', + phone: null, + province: 'Tennessee', + province_code: 'TN', + zip: '37604', + }, + state: 'disabled', + taxExemptions: [], + }, + }, + integrations: { + SHOPIFY: true, + }, + type: 'identify', + userId: '7358220173425', + }, + ], + }, + }, + ], + }, + }, + }, + { + id: 'c005', + name: 'shopify', + description: 'Track Call -> Order Cancelled event from Pixel app', + module: 'source', + version: 'v1', + input: { + request: { + body: [ + { + event: { + email: 'henry@wfls.com', + total_price: '600.00', + total_tax: '0.00', + updated_at: '2024-11-05T21:54:50-05:00', + line_items: [ + { + id: 14234727743601, + name: 'The Collection Snowboard: Hydrogen', + price: '600.00', + product_id: 7234590408817, + quantity: 1, + sku: '', + title: 'The Collection Snowboard: Hydrogen', + total_discount: '0.00', + variant_id: 41327142600817, + vendor: 'Hydrogen Vendor', + }, + ], + shipping_address: { + first_name: 'henry', + address1: 'Yuimaru Kitchen', + city: 'Johnson City', + zip: '37604', + }, + query_parameters: { + topic: ['orders_cancelled'], + version: ['pixel'], + writeKey: ['2mw9SN679HngnZkCHT4oSVVBVmb'], + }, + }, + source: dummySourceConfig, + }, + ], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + batch: [ + { + context: { + integration: { + name: 'SHOPIFY', + }, + library: { + eventOrigin: 'server', + name: 'RudderStack Shopify Cloud', + version: '2.0.0', + }, + shopifyDetails: { + email: 'henry@wfls.com', + line_items: [ + { + id: 14234727743601, + name: 'The Collection Snowboard: Hydrogen', + price: '600.00', + product_id: 7234590408817, + quantity: 1, + sku: '', + title: 'The Collection Snowboard: Hydrogen', + total_discount: '0.00', + variant_id: 41327142600817, + vendor: 'Hydrogen Vendor', + }, + ], + shipping_address: { + address1: 'Yuimaru Kitchen', + city: 'Johnson City', + first_name: 'henry', + zip: '37604', + }, + total_price: '600.00', + total_tax: '0.00', + updated_at: '2024-11-05T21:54:50-05:00', + }, + topic: 'orders_cancelled', + }, + event: 'Order Cancelled', + integrations: { + SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, + }, + properties: { + products: [ + { + brand: 'Hydrogen Vendor', + price: 600, + product_id: '7234590408817', + quantity: 1, + title: 'The Collection Snowboard: Hydrogen', + }, + ], + tax: 0, + value: 600, + }, + timestamp: '2024-11-06T02:54:50.000Z', + traits: { + email: 'henry@wfls.com', + shippingAddress: { + address1: 'Yuimaru Kitchen', + city: 'Johnson City', + first_name: 'henry', + zip: '37604', + }, + }, + type: 'track', + }, + ], + }, + }, + ], + }, + }, + }, + { + id: 'c001', + name: 'shopify', + description: + 'Track Call -> Checkout Started event from Pixel app, with no anonymoudId in redis. anonymousId is set as hash of cart_token (race condition scenario)', + module: 'source', + version: 'v1', + input: { + request: { + body: [ + { + event: { + id: 35550298931313, + token: '84ad78572dae52a8cbea7d55371afe89', + cart_token: 'Z2NwLXVzLWVhc3QxOjAxSkJaTUVRSjgzNUJUN1BTNjEzRFdRUFFQ', + email: null, + gateway: null, + buyer_accepts_marketing: false, + buyer_accepts_sms_marketing: false, + sms_marketing_phone: null, + created_at: '2024-11-06T02:22:00+00:00', + updated_at: '2024-11-05T21:22:02-05:00', + landing_site: '/', + note: '', + note_attributes: [], + referring_site: '', + shipping_lines: [], + shipping_address: [], + taxes_included: false, + total_weight: 0, + currency: 'USD', + completed_at: null, + phone: null, + customer_locale: 'en-US', + line_items: [ + { + key: '41327142600817', + fulfillment_service: 'manual', + gift_card: false, + grams: 0, + presentment_title: 'The Collection Snowboard: Hydrogen', + presentment_variant_title: '', + product_id: 7234590408817, + quantity: 1, + requires_shipping: true, + sku: '', + tax_lines: [], + taxable: true, + title: 'The Collection Snowboard: Hydrogen', + variant_id: 41327142600817, + variant_title: '', + variant_price: '600.00', + vendor: 'Hydrogen Vendor', + unit_price_measurement: { + measured_type: null, + quantity_value: null, + quantity_unit: null, + reference_value: null, + reference_unit: null, + }, + compare_at_price: null, + line_price: '600.00', + price: '600.00', + applied_discounts: [], + destination_location_id: null, + user_id: null, + rank: null, + origin_location_id: null, + properties: {}, + }, + ], + name: '#35550298931313', + abandoned_checkout_url: + 'https://pixel-testing-rs.myshopify.com/59026964593/checkouts/ac/Z2NwLXVzLWVhc3QxOjAxSkJaTUVRSjgzNUJUN1BTNjEzRFdRUFFQ/recover?key=0385163be3875d3a2117e982d9cc3517&locale=en-US', + discount_codes: [], + tax_lines: [], + presentment_currency: 'USD', + source_name: 'web', + total_line_items_price: '600.00', + total_tax: '0.00', + total_discounts: '0.00', + subtotal_price: '600.00', + total_price: '600.00', + total_duties: '0.00', + device_id: null, + user_id: null, + location_id: null, + source_identifier: null, + source_url: null, + source: null, + closed_at: null, + query_parameters: { + topic: ['checkouts_create'], + version: ['pixel'], + writeKey: ['2mw9SN679HngnXXXHT4oSVVBVmb'], + }, + }, + source: dummySourceConfig, + }, + ], + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + }, + pathSuffix: '', + }, + output: { + response: { + status: 200, + body: [ + { + output: { + batch: [ + { + context: { + library: { + eventOrigin: 'server', + name: 'RudderStack Shopify Cloud', + version: '2.0.0', + }, + integration: { + name: 'SHOPIFY', + }, + topic: 'checkouts_create', + cart_token: 'Z2NwLXVzLWVhc3QxOjAxSkJaTUVRSjgzNUJUN1BTNjEzRFdRUFFQ', + shopifyDetails: { + id: 35550298931313, + token: '84ad78572dae52a8cbea7d55371afe89', + cart_token: 'Z2NwLXVzLWVhc3QxOjAxSkJaTUVRSjgzNUJUN1BTNjEzRFdRUFFQ', + email: null, + gateway: null, + buyer_accepts_marketing: false, + buyer_accepts_sms_marketing: false, + sms_marketing_phone: null, + created_at: '2024-11-06T02:22:00+00:00', + updated_at: '2024-11-05T21:22:02-05:00', + landing_site: '/', + note: '', + note_attributes: [], + referring_site: '', + shipping_lines: [], + shipping_address: [], + taxes_included: false, + total_weight: 0, + currency: 'USD', + completed_at: null, + phone: null, + customer_locale: 'en-US', + line_items: [ + { + key: '41327142600817', + fulfillment_service: 'manual', + gift_card: false, + grams: 0, + presentment_title: 'The Collection Snowboard: Hydrogen', + presentment_variant_title: '', + product_id: 7234590408817, + quantity: 1, + requires_shipping: true, + sku: '', + tax_lines: [], + taxable: true, + title: 'The Collection Snowboard: Hydrogen', + variant_id: 41327142600817, + variant_title: '', + variant_price: '600.00', + vendor: 'Hydrogen Vendor', + unit_price_measurement: { + measured_type: null, + quantity_value: null, + quantity_unit: null, + reference_value: null, + reference_unit: null, + }, + compare_at_price: null, + line_price: '600.00', + price: '600.00', + applied_discounts: [], + destination_location_id: null, + user_id: null, + rank: null, + origin_location_id: null, + properties: {}, + }, + ], + name: '#35550298931313', + abandoned_checkout_url: + 'https://pixel-testing-rs.myshopify.com/59026964593/checkouts/ac/Z2NwLXVzLWVhc3QxOjAxSkJaTUVRSjgzNUJUN1BTNjEzRFdRUFFQ/recover?key=0385163be3875d3a2117e982d9cc3517&locale=en-US', + discount_codes: [], + tax_lines: [], + presentment_currency: 'USD', + source_name: 'web', + total_line_items_price: '600.00', + total_tax: '0.00', + total_discounts: '0.00', + subtotal_price: '600.00', + total_price: '600.00', + total_duties: '0.00', + device_id: null, + user_id: null, + location_id: null, + source_identifier: null, + source_url: null, + source: null, + closed_at: null, + }, + }, + integrations: { + SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, + }, + type: 'track', + event: 'Checkout Started Webhook', + properties: { + order_id: '35550298931313', + value: 600, + tax: 0, + currency: 'USD', + products: [ + { + product_id: '7234590408817', + price: 600.0, + brand: 'Hydrogen Vendor', + quantity: 1, + }, + ], + }, + timestamp: '2024-11-06T02:22:02.000Z', + traits: { + shippingAddress: [], + cart_token_hash: '9125e1da-57b9-5bdc-953e-eb2b0ded5edc', + }, + anonymousId: '9125e1da-57b9-5bdc-953e-eb2b0ded5edc', + }, ], }, }, @@ -1685,4 +2313,4 @@ export const checkoutEventsTestScenarios = [ }, }, }, -]; +].map((d1) => ({ ...d1, mockFns })); diff --git a/test/integrations/sources/shopify/webhookTestScenarios/GenericTrackTests.ts b/test/integrations/sources/shopify/webhookTestScenarios/GenericTrackTests.ts index d68d0a8f59c..25ce93aa8ce 100644 --- a/test/integrations/sources/shopify/webhookTestScenarios/GenericTrackTests.ts +++ b/test/integrations/sources/shopify/webhookTestScenarios/GenericTrackTests.ts @@ -68,6 +68,11 @@ export const genericTrackTestScenarios = [ event: 'Cart Update', integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, properties: { products: [], @@ -255,7 +260,7 @@ export const genericTrackTestScenarios = [ gift_card: false, grams: 0, name: 'The Collection Snowboard: Hydrogen', - price: '600.00', + price: 600, price_set: { shop_money: { amount: '600.00', @@ -267,7 +272,7 @@ export const genericTrackTestScenarios = [ }, }, product_exists: true, - product_id: 7234590408817, + product_id: '7234590408817', properties: [], quantity: 1, requires_shipping: true, @@ -469,7 +474,7 @@ export const genericTrackTestScenarios = [ gift_card: false, grams: 0, name: 'The Collection Snowboard: Hydrogen', - price: '600.00', + price: 600, price_set: { shop_money: { amount: '600.00', @@ -481,7 +486,7 @@ export const genericTrackTestScenarios = [ }, }, product_exists: true, - product_id: 7234590408817, + product_id: '7234590408817', properties: [], quantity: 1, requires_shipping: true, @@ -530,15 +535,20 @@ export const genericTrackTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['track.context.shopifyDetails'], + }, + }, }, type: 'track', event: 'Order Paid', properties: { products: [ { - product_id: 7234590408817, + product_id: '7234590408817', title: 'The Collection Snowboard: Hydrogen', - price: '600.00', + price: 600, brand: 'Hydrogen Vendor', quantity: 1, }, @@ -546,9 +556,30 @@ export const genericTrackTestScenarios = [ }, traits: { email: 'henry@wfls.com', + cart_token_hash: '9125e1da-57b9-5bdc-953e-eb2b0ded5edc', }, anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb', }, + { + anonymousId: '50ead33e-d763-4854-b0ab-765859ef05cb', + context: { + integration: { + name: 'SHOPIFY', + }, + library: { + eventOrigin: 'server', + name: 'RudderStack Shopify Cloud', + version: '2.0.0', + }, + traits: { + email: 'henry@wfls.com', + }, + }, + integrations: { + SHOPIFY: true, + }, + type: 'identify', + }, ], }, }, diff --git a/test/integrations/sources/shopify/webhookTestScenarios/IdentifyTests.ts b/test/integrations/sources/shopify/webhookTestScenarios/IdentifyTests.ts index b03f5635b6a..346485fe1e6 100644 --- a/test/integrations/sources/shopify/webhookTestScenarios/IdentifyTests.ts +++ b/test/integrations/sources/shopify/webhookTestScenarios/IdentifyTests.ts @@ -187,6 +187,11 @@ export const identityTestScenarios = [ }, integrations: { SHOPIFY: true, + DATA_WAREHOUSE: { + options: { + jsonPaths: ['identify.context.shopifyDetails'], + }, + }, }, type: 'identify', userId: '7358220173425', diff --git a/test/integrations/sources/signl4/data.ts b/test/integrations/sources/signl4/data.ts index b318bfb6df5..a8ca1850972 100644 --- a/test/integrations/sources/signl4/data.ts +++ b/test/integrations/sources/signl4/data.ts @@ -9,21 +9,26 @@ export const data = [ name: 'signl4', description: 'test-0', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventType: 200, - eventRaisedUtc: '2017-09-01T08:11:37.4815663Z', - subscription: { id: '0acf8014-22f2-4503-88d7-f7d05b46744f' }, - alert: { - statusCode: 1, - eventId: '2518783235949759942_fbc7b4a4-badd-47b8-9e1d-702fb6a1a0b2', - externalEventId: 'INC091210', - id: '2518981069381242800_2ab1b5e0-f1b7-4c3e-9adf-6c157eeb4685', + request: { + body: JSON.stringify({ + eventType: 200, + eventRaisedUtc: '2017-09-01T08:11:37.4815663Z', + subscription: { id: '0acf8014-22f2-4503-88d7-f7d05b46744f' }, + alert: { + statusCode: 1, + eventId: '2518783235949759942_fbc7b4a4-badd-47b8-9e1d-702fb6a1a0b2', + externalEventId: 'INC091210', + id: '2518981069381242800_2ab1b5e0-f1b7-4c3e-9adf-6c157eeb4685', + }, + id: 'dd209a2d-e037-41ee-b37d-f605cc0a39fb', + }), }, - id: 'dd209a2d-e037-41ee-b37d-f605cc0a39fb', + source: {}, }, ], method: 'POST', @@ -69,27 +74,32 @@ export const data = [ name: 'signl4', description: 'test-1', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventType: 201, - eventRaisedUtc: '2017-09-01T08:11:37.4815663Z', - subscription: { id: '0acf8014-22f2-4503-88d7-f7d05b46744f' }, - user: { - username: 'Rene', - mailaddress: 'rene@signl4.com', - id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5', - }, - alert: { - statusCode: 2, - eventId: '2518783235949759942_fbc7b4a4-badd-47b8-9e1d-702fb6a1a0b2', - externalEventId: 'Content you passed in the X-S4-ExternalID parameter', - acknowledgedUserIds: ['f0bd5063-9588-51cf-b3d9-94e5647dedc5'], - id: '2518981069381242800_2ab1b5e0-f1b7-4c3e-9adf-6c157eeb4685', + request: { + body: JSON.stringify({ + eventType: 201, + eventRaisedUtc: '2017-09-01T08:11:37.4815663Z', + subscription: { id: '0acf8014-22f2-4503-88d7-f7d05b46744f' }, + user: { + username: 'Rene', + mailaddress: 'rene@signl4.com', + id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5', + }, + alert: { + statusCode: 2, + eventId: '2518783235949759942_fbc7b4a4-badd-47b8-9e1d-702fb6a1a0b2', + externalEventId: 'Content you passed in the X-S4-ExternalID parameter', + acknowledgedUserIds: ['f0bd5063-9588-51cf-b3d9-94e5647dedc5'], + id: '2518981069381242800_2ab1b5e0-f1b7-4c3e-9adf-6c157eeb4685', + }, + id: 'dd209a2d-e037-41ee-b37d-f605cc0a39fb', + }), }, - id: 'dd209a2d-e037-41ee-b37d-f605cc0a39fb', + source: {}, }, ], method: 'POST', @@ -109,7 +119,10 @@ export const data = [ library: { name: 'unknown', version: 'unknown' }, integration: { name: 'Signl4' }, externalId: [ - { type: 'signl4UserId', id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5' }, + { + type: 'signl4UserId', + id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5', + }, ], traits: { email: 'rene@signl4.com', name: 'Rene' }, }, @@ -140,27 +153,32 @@ export const data = [ name: 'signl4', description: 'test-2', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventType: 201, - eventRaisedUtc: '2017-09-01T08:11:37.4815663Z', - subscription: { id: '0acf8014-22f2-4503-88d7-f7d05b46744f' }, - user: { - username: 'Rene', - mailaddress: 'rene@signl4.com', - id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5', - }, - alert: { - statusCode: 4, - eventId: '2518783235949759942_fbc7b4a4-badd-47b8-9e1d-702fb6a1a0b2', - externalEventId: 'Content you passed in the X-S4-ExternalID parameter', - acknowledgedUserIds: ['f0bd5063-9588-51cf-b3d9-94e5647dedc5'], - id: '2518981069381242800_2ab1b5e0-f1b7-4c3e-9adf-6c157eeb4685', + request: { + body: JSON.stringify({ + eventType: 201, + eventRaisedUtc: '2017-09-01T08:11:37.4815663Z', + subscription: { id: '0acf8014-22f2-4503-88d7-f7d05b46744f' }, + user: { + username: 'Rene', + mailaddress: 'rene@signl4.com', + id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5', + }, + alert: { + statusCode: 4, + eventId: '2518783235949759942_fbc7b4a4-badd-47b8-9e1d-702fb6a1a0b2', + externalEventId: 'Content you passed in the X-S4-ExternalID parameter', + acknowledgedUserIds: ['f0bd5063-9588-51cf-b3d9-94e5647dedc5'], + id: '2518981069381242800_2ab1b5e0-f1b7-4c3e-9adf-6c157eeb4685', + }, + id: 'dd209a2d-e037-41ee-b37d-f605cc0a39fb', + }), }, - id: 'dd209a2d-e037-41ee-b37d-f605cc0a39fb', + source: {}, }, ], method: 'POST', @@ -180,7 +198,10 @@ export const data = [ library: { name: 'unknown', version: 'unknown' }, integration: { name: 'Signl4' }, externalId: [ - { type: 'signl4UserId', id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5' }, + { + type: 'signl4UserId', + id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5', + }, ], traits: { email: 'rene@signl4.com', name: 'Rene' }, }, @@ -211,23 +232,28 @@ export const data = [ name: 'signl4', description: 'test-3', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventType: 202, - eventRaisedUtc: '2020-01-10T12:27:19Z', - subscription: { id: 'b8fdd850-e2ad-45ff-924d-9c332a063200' }, - team: { id: '0e8979f7-0c6a-472d-8918-ecfd339252f8' }, - alert: { - statusCode: 1, - eventId: '2518236416806594587_0e67b746-6c88-4ddf-8872-99690b0457d9', - externalEventId: 'INC091210', - acknowledgedUserIds: [], - id: '2518236416804564453_12ea0f6f-948c-43d0-9034-f9565d7b6bd2', + request: { + body: JSON.stringify({ + eventType: 202, + eventRaisedUtc: '2020-01-10T12:27:19Z', + subscription: { id: 'b8fdd850-e2ad-45ff-924d-9c332a063200' }, + team: { id: '0e8979f7-0c6a-472d-8918-ecfd339252f8' }, + alert: { + statusCode: 1, + eventId: '2518236416806594587_0e67b746-6c88-4ddf-8872-99690b0457d9', + externalEventId: 'INC091210', + acknowledgedUserIds: [], + id: '2518236416804564453_12ea0f6f-948c-43d0-9034-f9565d7b6bd2', + }, + id: '27283793-47c8-4da2-9767-d37be224338d', + }), }, - id: '27283793-47c8-4da2-9767-d37be224338d', + source: {}, }, ], method: 'POST', @@ -275,30 +301,35 @@ export const data = [ name: 'signl4', description: 'test-4', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventType: 203, - eventRaisedUtc: '2018-04-17T15:00:32Z', - subscription: { id: '1578ebd9-0a27-44ab-bc8e-52cd7d32e81d' }, - user: { - username: 'Rene', - mailaddress: 'rene@signl4.com', - id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5', - }, - alert: { - statusCode: 0, - eventId: '2518783235949759942_fbc7b4a4-badd-47b8-9e1d-702fb6a1a0b2', - externalEventId: 'Content you passed in the X-S4-ExternalID parameter', - id: '2518783235958846071_4e2dfab2-4717-42bc-8d37-8682402309c2', - }, - annotation: { - message: "OK, I'll take care about it.", - id: '2518783235661483318_99ebffe0-1b90-40ef-990a-fbd842484761', + request: { + body: JSON.stringify({ + eventType: 203, + eventRaisedUtc: '2018-04-17T15:00:32Z', + subscription: { id: '1578ebd9-0a27-44ab-bc8e-52cd7d32e81d' }, + user: { + username: 'Rene', + mailaddress: 'rene@signl4.com', + id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5', + }, + alert: { + statusCode: 0, + eventId: '2518783235949759942_fbc7b4a4-badd-47b8-9e1d-702fb6a1a0b2', + externalEventId: 'Content you passed in the X-S4-ExternalID parameter', + id: '2518783235958846071_4e2dfab2-4717-42bc-8d37-8682402309c2', + }, + annotation: { + message: "OK, I'll take care about it.", + id: '2518783235661483318_99ebffe0-1b90-40ef-990a-fbd842484761', + }, + id: '141c0f88-7831-4d5e-b055-f6e83c269770', + }), }, - id: '141c0f88-7831-4d5e-b055-f6e83c269770', + source: {}, }, ], method: 'POST', @@ -318,7 +349,10 @@ export const data = [ library: { name: 'unknown', version: 'unknown' }, integration: { name: 'Signl4' }, externalId: [ - { type: 'signl4UserId', id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5' }, + { + type: 'signl4UserId', + id: 'f0bd5063-9588-51cf-b3d9-94e5647dedc5', + }, ], traits: { email: 'rene@signl4.com', name: 'Rene' }, }, @@ -350,15 +384,20 @@ export const data = [ name: 'signl4', description: 'test-5', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventType: 300, - eventRaisedUtc: '2017-09-01T09:16:17.3717355Z', - team: { id: 'f1801955-4724-44de-902a-f6f02ba9e10f' }, - id: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', + request: { + body: JSON.stringify({ + eventType: 300, + eventRaisedUtc: '2017-09-01T09:16:17.3717355Z', + team: { id: 'f1801955-4724-44de-902a-f6f02ba9e10f' }, + id: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', + }), + }, + source: {}, }, ], method: 'POST', @@ -383,7 +422,10 @@ export const data = [ messageId: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', originalTimestamp: '2017-09-01T09:16:17.000Z', event: 'Duty Period Started', - properties: { eventType: 300, 'team.id': 'f1801955-4724-44de-902a-f6f02ba9e10f' }, + properties: { + eventType: 300, + 'team.id': 'f1801955-4724-44de-902a-f6f02ba9e10f', + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], @@ -397,15 +439,20 @@ export const data = [ name: 'signl4', description: 'test-6', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventType: 301, - eventRaisedUtc: '2017-09-01T09:16:17.3717355Z', - team: { id: 'f1801955-4724-44de-902a-f6f02ba9e10f' }, - id: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', + request: { + body: JSON.stringify({ + eventType: 301, + eventRaisedUtc: '2017-09-01T09:16:17.3717355Z', + team: { id: 'f1801955-4724-44de-902a-f6f02ba9e10f' }, + id: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', + }), + }, + source: {}, }, ], method: 'POST', @@ -430,7 +477,10 @@ export const data = [ messageId: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', originalTimestamp: '2017-09-01T09:16:17.000Z', event: 'Duty Period Ended', - properties: { eventType: 301, 'team.id': 'f1801955-4724-44de-902a-f6f02ba9e10f' }, + properties: { + eventType: 301, + 'team.id': 'f1801955-4724-44de-902a-f6f02ba9e10f', + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], @@ -444,16 +494,21 @@ export const data = [ name: 'signl4', description: 'test-7', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventType: 302, - eventRaisedUtc: '2017-09-01T09:16:17.3717355Z', - team: { id: 'f1801955-4724-44de-902a-f6f02ba9e10f' }, - user: { id: 'e31da15f-7e13-43f1-b4a5-1ce3b470a504' }, - id: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', + request: { + body: JSON.stringify({ + eventType: 302, + eventRaisedUtc: '2017-09-01T09:16:17.3717355Z', + team: { id: 'f1801955-4724-44de-902a-f6f02ba9e10f' }, + user: { id: 'e31da15f-7e13-43f1-b4a5-1ce3b470a504' }, + id: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', + }), + }, + source: {}, }, ], method: 'POST', @@ -473,7 +528,10 @@ export const data = [ library: { name: 'unknown', version: 'unknown' }, integration: { name: 'Signl4' }, externalId: [ - { type: 'signl4UserId', id: 'e31da15f-7e13-43f1-b4a5-1ce3b470a504' }, + { + type: 'signl4UserId', + id: 'e31da15f-7e13-43f1-b4a5-1ce3b470a504', + }, ], }, integrations: { Signl4: false }, @@ -481,7 +539,10 @@ export const data = [ messageId: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', originalTimestamp: '2017-09-01T09:16:17.000Z', event: 'Somebody Punched-In', - properties: { eventType: 302, 'team.id': 'f1801955-4724-44de-902a-f6f02ba9e10f' }, + properties: { + eventType: 302, + 'team.id': 'f1801955-4724-44de-902a-f6f02ba9e10f', + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], @@ -495,16 +556,21 @@ export const data = [ name: 'signl4', description: 'test-8', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - eventType: 303, - eventRaisedUtc: '2017-09-01T09:16:17.3717355Z', - team: { id: 'f1801955-4724-44de-902a-f6f02ba9e10f' }, - user: { id: 'e31da15f-7e13-43f1-b4a5-1ce3b470a504' }, - id: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', + request: { + body: JSON.stringify({ + eventType: 303, + eventRaisedUtc: '2017-09-01T09:16:17.3717355Z', + team: { id: 'f1801955-4724-44de-902a-f6f02ba9e10f' }, + user: { id: 'e31da15f-7e13-43f1-b4a5-1ce3b470a504' }, + id: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', + }), + }, + source: {}, }, ], method: 'POST', @@ -524,7 +590,10 @@ export const data = [ library: { name: 'unknown', version: 'unknown' }, integration: { name: 'Signl4' }, externalId: [ - { type: 'signl4UserId', id: 'e31da15f-7e13-43f1-b4a5-1ce3b470a504' }, + { + type: 'signl4UserId', + id: 'e31da15f-7e13-43f1-b4a5-1ce3b470a504', + }, ], }, integrations: { Signl4: false }, @@ -532,7 +601,10 @@ export const data = [ messageId: 'f56a6b59-1197-4e7d-8eca-8d21a4b57ec3', originalTimestamp: '2017-09-01T09:16:17.000Z', event: 'Somebody Punched-Out', - properties: { eventType: 303, 'team.id': 'f1801955-4724-44de-902a-f6f02ba9e10f' }, + properties: { + eventType: 303, + 'team.id': 'f1801955-4724-44de-902a-f6f02ba9e10f', + }, anonymousId: '97fcd7b2-cc24-47d7-b776-057b7b199513', }, ], diff --git a/test/integrations/sources/slack/data.ts b/test/integrations/sources/slack/data.ts index def8a63408b..7a4d29489cb 100644 --- a/test/integrations/sources/slack/data.ts +++ b/test/integrations/sources/slack/data.ts @@ -3,20 +3,23 @@ export const data = [ name: 'slack', description: 'Webhook url verificatin event', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - token: 'Jhj5dZrVaK7ZwHHjRyZWjbDl', - challenge: '3eZbrw1aB10FEMAGAZd4FyFQ', - type: 'url_verification', + request: { + body: JSON.stringify({ + token: 'Jhj5dZrVaK7ZwHHjRyZWjbDl', + challenge: '3eZbrw1aB10FEMAGAZd4FyFQ', + type: 'url_verification', + }), + }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -39,44 +42,47 @@ export const data = [ name: 'slack', description: 'Team joined event', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - type: 'team_join', - user: { - id: 'W012CDE', - name: 'johnd', - real_name: 'John Doe', - }, - }, - type: 'event_callback', - event_id: 'Ev06TJ0NG5', - event_time: 1709441309, - token: 'REm276ggfh72Lq', - team_id: 'T0GFJL5J7', - context_team_id: 'T0GFJL5J7', - context_enterprise_id: null, - api_app_id: 'B02SJMHRR', - authorizations: [ - { - enterprise_id: null, + request: { + body: JSON.stringify({ + event: { + type: 'team_join', + user: { + id: 'W012CDE', + name: 'johnd', + real_name: 'John Doe', + }, + }, + type: 'event_callback', + event_id: 'Ev06TJ0NG5', + event_time: 1709441309, + token: 'REm276ggfh72Lq', team_id: 'T0GFJL5J7', - user_id: 'U04G7H550', - is_bot: true, - is_enterprise_install: false, - }, - ], - is_ext_shared_channel: false, - event_context: 'eJldCI65436EUEpMSFhgfhg76joiQzAxRTRQTEIxMzUifQ', + context_team_id: 'T0GFJL5J7', + context_enterprise_id: null, + api_app_id: 'B02SJMHRR', + authorizations: [ + { + enterprise_id: null, + team_id: 'T0GFJL5J7', + user_id: 'U04G7H550', + is_bot: true, + is_enterprise_install: false, + }, + ], + is_ext_shared_channel: false, + event_context: 'eJldCI65436EUEpMSFhgfhg76joiQzAxRTRQTEIxMzUifQ', + }), + }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -89,23 +95,11 @@ export const data = [ batch: [ { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'SLACK', - }, - externalId: [ - { - type: 'slackUserId', - id: 'W012CDE', - }, - ], - }, - integrations: { - SLACK: false, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'SLACK' }, + externalId: [{ type: 'slackUserId', id: 'W012CDE' }], }, + integrations: { SLACK: false }, type: 'identify', event: 'Team Join', anonymousId: '2bc5ae2825a712d3d154cbdacb86ac16c278', @@ -131,74 +125,74 @@ export const data = [ name: 'slack', description: 'Message event', module: 'source', - version: 'v0', + version: 'v2', input: { request: { body: [ { - event: { - user: 'U04G7H550', - type: 'message', - ts: '1709441309.308399', - client_msg_id: '834r664e-ec75-445d-t5c6-b873a07y9c81', - text: 'What is the pricing of product X', - team: 'T0GFJL5J7', - thread_ts: '1709407304.839329', - parent_user_id: 'U06P6LQTPV', - blocks: [ - { - type: 'rich_text', - block_id: 'xGKJl', - elements: [ + request: { + body: JSON.stringify({ + event: { + user: 'U04G7H550', + type: 'message', + ts: '1709441309.308399', + client_msg_id: '834r664e-ec75-445d-t5c6-b873a07y9c81', + text: 'What is the pricing of product X', + team: 'T0GFJL5J7', + thread_ts: '1709407304.839329', + parent_user_id: 'U06P6LQTPV', + blocks: [ { - type: 'rich_text_section', + type: 'rich_text', + block_id: 'xGKJl', elements: [ { - type: 'text', - text: 'What is the pricing of product X', - }, - { - type: 'channel', - channel_id: 'C03CDQTPI65', - }, - { - type: 'text', - text: ' to do this', + type: 'rich_text_section', + elements: [ + { + type: 'text', + text: 'What is the pricing of product X', + }, + { + type: 'channel', + channel_id: 'C03CDQTPI65', + }, + { type: 'text', text: ' to do this' }, + ], }, ], }, ], + channel: 'C03CDQTPI65', + event_ts: '1709441309.308399', + channel_type: 'channel', }, - ], - channel: 'C03CDQTPI65', - event_ts: '1709441309.308399', - channel_type: 'channel', - }, - type: 'event_callback', - event_id: 'EvY5JTJ0NG5', - event_time: 1709441309, - token: 'REm2987dqtpi72Lq', - team_id: 'T0GFJL5J7', - context_team_id: 'T01gqtPIL5J7', - context_enterprise_id: null, - api_app_id: 'A04QTPIHRR', - authorizations: [ - { - enterprise_id: null, + type: 'event_callback', + event_id: 'EvY5JTJ0NG5', + event_time: 1709441309, + token: 'REm2987dqtpi72Lq', team_id: 'T0GFJL5J7', - user_id: 'W012CDE', - is_bot: true, - is_enterprise_install: false, - }, - ], - is_ext_shared_channel: false, - event_context: '4-wd6joiQfdgTRQTpIzdfifQ', + context_team_id: 'T01gqtPIL5J7', + context_enterprise_id: null, + api_app_id: 'A04QTPIHRR', + authorizations: [ + { + enterprise_id: null, + team_id: 'T0GFJL5J7', + user_id: 'W012CDE', + is_bot: true, + is_enterprise_install: false, + }, + ], + is_ext_shared_channel: false, + event_context: '4-wd6joiQfdgTRQTpIzdfifQ', + }), + }, + source: {}, }, ], method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, + headers: { 'Content-Type': 'application/json' }, }, pathSuffix: '', }, @@ -211,23 +205,11 @@ export const data = [ batch: [ { context: { - library: { - name: 'unknown', - version: 'unknown', - }, - integration: { - name: 'SLACK', - }, - externalId: [ - { - type: 'slackUserId', - id: 'U04G7H550', - }, - ], - }, - integrations: { - SLACK: false, + library: { name: 'unknown', version: 'unknown' }, + integration: { name: 'SLACK' }, + externalId: [{ type: 'slackUserId', id: 'U04G7H550' }], }, + integrations: { SLACK: false }, type: 'track', event: 'Message', anonymousId: '7509c04f547b05afb6838aa742f4910263d6', @@ -258,10 +240,7 @@ export const data = [ type: 'channel', channel_id: 'C03CDQTPI65', }, - { - type: 'text', - text: ' to do this', - }, + { type: 'text', text: ' to do this' }, ], }, ], diff --git a/test/integrations/testTypes.ts b/test/integrations/testTypes.ts index b11403f50a5..29d777219d7 100644 --- a/test/integrations/testTypes.ts +++ b/test/integrations/testTypes.ts @@ -1,12 +1,16 @@ import { AxiosResponse } from 'axios'; import MockAdapter from 'axios-mock-adapter'; +import { BaseTestCase } from '@rudderstack/integrations-lib'; + import { DeliveryV1Response, + Metadata, ProcessorTransformationRequest, ProcessorTransformationResponse, ProxyV1Request, RouterTransformationRequest, RouterTransformationResponse, + RudderMessage, } from '../../src/types'; export interface requestType { @@ -38,13 +42,14 @@ export interface mockType { response: responseType; } -export interface TestCaseData { +export interface TestCaseData extends BaseTestCase { id?: string; name: string; description: string; skipGo?: string; scenario?: string; successCriteria?: string; + tags?: string[]; comment?: string; feature: string; module: string; @@ -57,6 +62,14 @@ export interface TestCaseData { mockFns?: (mockAdapter: MockAdapter) => {}; } +export interface ExtendedTestCaseData { + // use this to add any new properties for dynamic test cases + // this will keep the base TestCaseData structure generic and intact + tcData: TestCaseData; + sourceTransformV2Flag?: boolean; + descriptionSuffix?: string; +} + export type MockFns = (mockAdapter: MockAdapter) => void; export interface SrcTestCaseData { @@ -92,7 +105,8 @@ export type ProcessorTestData = { version: string; input: { request: { - body: ProcessorTransformationRequest[]; + method: string; + body: ProcessorTransformationRequest, Partial>[]; }; }; output: { @@ -115,7 +129,8 @@ export type RouterTestData = { version: string; input: { request: { - body: RouterTransformationRequest; + body: RouterTransformationRequest, Partial>; + method: string; }; }; output: { @@ -128,7 +143,7 @@ export type RouterTestData = { }; }; -export type ProxyV1TestData = { +export type ProxyV1TestData = BaseTestCase & { id: string; name: string; description: string; diff --git a/test/integrations/testUtils.ts b/test/integrations/testUtils.ts index 73d08e452c2..6c234bcd0f3 100644 --- a/test/integrations/testUtils.ts +++ b/test/integrations/testUtils.ts @@ -1,10 +1,10 @@ import { globSync } from 'glob'; import { join } from 'path'; import { MockHttpCallsData, TestCaseData } from './testTypes'; -import MockAdapter from 'axios-mock-adapter'; +import MockAxiosAdapter from 'axios-mock-adapter'; import isMatch from 'lodash/isMatch'; import { OptionValues } from 'commander'; -import { removeUndefinedAndNullValues } from '@rudderstack/integrations-lib'; +import { filter, removeUndefinedAndNullValues } from '@rudderstack/integrations-lib'; import tags from '../../src/v0/util/tags'; import { existsSync, mkdirSync, writeFileSync } from 'fs'; import { Destination, ProxyMetdata, ProxyV0Request, ProxyV1Request } from '../../src/types'; @@ -18,9 +18,14 @@ import { ProxyV1RequestSchema, RouterTransformationResponseListSchema, } from '../../src/types/zodTypes'; +import { defaultAccessToken } from './common/secrets'; +import { randomBytes } from 'crypto'; -const generateAlphanumericId = (size = 36) => - [...Array(size)].map(() => ((Math.random() * size) | 0).toString(size)).join(''); +const generateAlphanumericId = (size = 36) => { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const bytes = randomBytes(size); + return Array.from(bytes, (byte) => chars[byte % chars.length]).join(''); +}; export const getTestDataFilePaths = (dirPath: string, opts: OptionValues): string[] => { const globPattern = join(dirPath, '**', 'data.ts'); let testFilePaths = globSync(globPattern); @@ -28,8 +33,9 @@ export const getTestDataFilePaths = (dirPath: string, opts: OptionValues): strin const destinationOrSource = opts.destination || opts.source; if (destinationOrSource) { - filteredTestFilePaths = testFilePaths.filter( - (testFile) => destinationOrSource && testFile.includes(`${destinationOrSource}/`), + const resources = destinationOrSource.split(','); + filteredTestFilePaths = testFilePaths.filter((testFile) => + resources.some((resource) => testFile.includes(`/${resource}/`)), ); } if (opts.feature) { @@ -41,27 +47,54 @@ export const getTestDataFilePaths = (dirPath: string, opts: OptionValues): strin }; export const getTestData = (filePath): TestCaseData[] => { - return require(filePath).data as TestCaseData[]; + const { data, skip } = require(filePath); + return skip ? [] : filter(data as TestCaseData[]); +}; + +export const getTestSecrets = (destination: string) => { + const filePath = join(__dirname, 'destinations', destination, 'maskedSecrets.ts'); + return require(filePath); }; export const getMockHttpCallsData = (filePath): MockHttpCallsData[] => { return require(filePath).networkCallsData as MockHttpCallsData[]; }; -export const getAllTestMockDataFilePaths = (dirPath: string, destination: string): string[] => { +export const registerAxiosMocks = ( + mockAdapter: MockAxiosAdapter, + axiosMocks: MockHttpCallsData[], +) => { + axiosMocks.forEach((axiosMock) => addMock(mockAdapter, axiosMock)); +}; + +export const getAllTestMockDataFilePaths = (dirPath: string, resourceName?: string): string[] => { const globPattern = join(dirPath, '**', 'network.ts'); let testFilePaths = globSync(globPattern); - if (destination) { + + if (resourceName) { + const resources = resourceName.split(','); const commonTestFilePaths = testFilePaths.filter((testFile) => testFile.includes('test/integrations/common'), ); - testFilePaths = testFilePaths.filter((testFile) => testFile.includes(destination)); + testFilePaths = testFilePaths.filter((testFile) => + resources.some((resource) => testFile.includes(`/${resource}/`)), + ); testFilePaths = [...commonTestFilePaths, ...testFilePaths]; } return testFilePaths; }; -export const addMock = (mock: MockAdapter, axiosMock: MockHttpCallsData) => { +export const getTestMockData = (resourceName?: string) => { + const allTestMockDataFilePaths = getAllTestMockDataFilePaths(__dirname, resourceName); + return allTestMockDataFilePaths + .map((currPath) => { + const mockNetworkCallsData: MockHttpCallsData[] = getMockHttpCallsData(currPath); + return mockNetworkCallsData; + }) + .flat(); +}; + +export const addMock = (mock: MockAxiosAdapter, axiosMock: MockHttpCallsData) => { const { url, method, data: reqData, params, ...opts } = axiosMock.httpReq; const { data, headers, status } = axiosMock.httpRes; @@ -98,6 +131,7 @@ export const addMock = (mock: MockAdapter, axiosMock: MockHttpCallsData) => { break; } }; + export const overrideDestination = (destination: Destination, overrideConfigValues) => { return Object.assign({}, destination, { Config: { ...destination.Config, ...overrideConfigValues }, @@ -480,7 +514,7 @@ export const generateProxyV0Payload = ( workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }; @@ -522,7 +556,7 @@ export const generateProxyV1Payload = ( workspaceId: 'default-workspaceId', sourceId: 'default-sourceId', secret: { - accessToken: payloadParameters.accessToken || 'default-accessToken', + accessToken: payloadParameters.accessToken || defaultAccessToken, }, dontBatch: false, }, @@ -604,7 +638,7 @@ export const generateMetadata = (jobId: number, userId?: string): any => { destinationId: 'default-destinationId', workspaceId: 'default-workspaceId', secret: { - accessToken: 'default-accessToken', + accessToken: defaultAccessToken, }, dontBatch: false, }; @@ -618,7 +652,7 @@ export const generateGoogleOAuthMetadata = (jobId: number): any => { destinationId: 'default-destinationId', workspaceId: 'default-workspaceId', secret: { - access_token: 'default-accessToken', // applicable for google destinations + access_token: defaultAccessToken, // applicable for google destinations }, dontBatch: false, }; diff --git a/test/scripts/migrateTest.ts b/test/scripts/migrateTest.ts new file mode 100644 index 00000000000..6757aa4bd12 --- /dev/null +++ b/test/scripts/migrateTest.ts @@ -0,0 +1,155 @@ +import fs from 'fs'; +import path from 'path'; + +import prettier from 'prettier'; +import { Command } from 'commander'; + +// Initialize command line options +const program = new Command(); +program + .option('-d, --destination ', 'Destination name to migrate') + .option('-f, --feature ', 'Feature type (processor/router/proxy)', 'processor') + // .option('-p, --path ', 'Base path for test files', path.join(__dirname, 'destinations')) + .parse(process.argv); + +const options = program.opts(); + +// Default values and utility functions from the previous example +import { + migrateProcessorTestCase, + migrateRouterTestCase, + migrateProxyTestCase, + extractCommonValues, + generateOptimizedTestFile, +} from './migrationUtils'; +import { getTestData, getTestDataFilePaths } from '../integrations/testUtils'; + +function readTestFile(filePath: string): any { + try { + const fileContent = getTestData(filePath); + return fileContent; + } catch (error) { + console.error(`Error reading test file ${filePath}:`, error); + return null; + } +} + +async function formatWithPrettier(content: string, filepath: string): Promise { + try { + // Try to load prettier config from the project + const prettierConfig = await prettier.resolveConfig(filepath); + + // Format the content using prettier with either found config or defaults + const formattedContent = await prettier.format(content, { + ...prettierConfig, + filepath, // This helps prettier determine parser based on file extension + parser: 'typescript', // Fallback to typescript parser if not determined from filepath + }); + + return formattedContent; + } catch (error) { + console.error('Error formatting file with prettier:', error); + // Return original content if formatting fails + return content; + } +} + +async function enhancedwriteTestFile( + filePath: string, + testCases: any[], + feature: string, +): Promise { + try { + // Extract common values + const commonValues = extractCommonValues(testCases); + + // Generate optimized content + const content = generateOptimizedTestFile(testCases, commonValues, feature); + + // Format with prettier + const formattedContent = await formatWithPrettier(content, filePath); + + // Write the formatted content + fs.writeFileSync(filePath, formattedContent); + } catch (error) { + console.error(`Error writing to file ${filePath}:`, error); + throw error; + } +} + +async function migrateTestFiles(): Promise { + const { destination, feature } = options; + + if (!destination) { + console.error('Please specify a destination with -d or --destination'); + process.exit(1); + } + + console.log(`Starting migration for destination: ${destination}, feature: ${feature}`); + + const basePath = path.resolve(__dirname, '..'); + + const testFiles = getTestDataFilePaths(basePath, options); + + if (testFiles.length === 0) { + console.log('No test files found matching the criteria'); + return; + } + + let migratedCount = 0; + let errorCount = 0; + + for (const filePath of testFiles) { + console.log(`\nProcessing file: ${filePath}`); + try { + const testCases = readTestFile(filePath); + if (!testCases) continue; + + const migratedTests = testCases.map((testCase: any, index: number) => { + try { + switch (feature.toLowerCase()) { + case 'processor': + return migrateProcessorTestCase(testCase, index); + case 'router': + return migrateRouterTestCase(testCase, index); + case 'proxy': + return migrateProxyTestCase(testCase, index); + default: + throw new Error(`Unsupported feature type: ${feature}`); + } + } catch (error) { + console.error(`Error migrating test case: ${testCase.name || 'unnamed'}`, error); + return testCase; + } + }); + + // Create backup of original file + const backupPath = filePath.replace('data.ts', 'data.backup.ts'); + fs.copyFileSync(filePath, backupPath); + console.log(`Created backup at: ${backupPath}`); + + // Write migrated tests + await enhancedwriteTestFile(filePath, migratedTests, feature.toLowerCase()); + console.log(`Successfully migrated ${migratedTests.length} test cases in ${filePath}`); + migratedCount += migratedTests.length; + } catch (error) { + console.error(`Error processing file ${filePath}:`, error); + errorCount++; + } + } + + console.log('\nMigration Summary:'); + console.log(`Total files processed: ${testFiles.length}`); + console.log(`Total test cases migrated: ${migratedCount}`); + console.log(`Files with errors: ${errorCount}`); +} + +// Run migration if this script is called directly +if (require.main === module) { + migrateTestFiles().catch((error) => { + console.error('Migration failed:', error); + process.exit(1); + }); +} + +export { migrateTestFiles }; diff --git a/test/scripts/migrationUtils.ts b/test/scripts/migrationUtils.ts new file mode 100644 index 00000000000..67d158a85fa --- /dev/null +++ b/test/scripts/migrationUtils.ts @@ -0,0 +1,465 @@ +import { removeUndefinedValues } from '@rudderstack/integrations-lib'; +import { + Metadata, + Destination, + ProcessorTransformationRequest, + RouterTransformationRequest, + ProxyV1Request, + ProcessorTransformationResponse, + RouterTransformationResponse, +} from '../../src/types'; + +import { + TestCaseData, + ProcessorTestData, + RouterTestData, + ProxyV1TestData, +} from '../integrations/testTypes'; + +// Default metadata to fill in missing fields +const defaultMetadata: Metadata = { + sourceId: 'default-source', + workspaceId: 'default-workspace', + namespace: 'default-namespace', + instanceId: 'default-instance', + sourceType: 'default-source-type', + sourceCategory: 'default-category', + trackingPlanId: 'default-tracking-plan', + trackingPlanVersion: 1, + sourceTpConfig: {}, + mergedTpConfig: {}, + destinationId: 'default-destination', + jobRunId: 'default-job-run', + jobId: 1, + sourceBatchId: 'default-batch', + sourceJobId: 'default-source-job', + sourceJobRunId: 'default-source-job-run', + sourceTaskId: 'default-task', + sourceTaskRunId: 'default-task-run', + recordId: {}, + destinationType: 'default-destination-type', + messageId: 'default-message-id', + oauthAccessToken: 'default-token', + messageIds: ['default-message-id'], + rudderId: 'default-rudder-id', + receivedAt: new Date().toISOString(), + eventName: 'default-event', + eventType: 'default-type', + sourceDefinitionId: 'default-source-def', + destinationDefinitionId: 'default-dest-def', + transformationId: 'default-transform', + dontBatch: false, +}; + +// Default destination configuration +const defaultDestination: Destination = { + ID: 'default-destination-id', + Name: 'Default Destination', + DestinationDefinition: { + ID: 'default-dest-def-id', + Name: 'Default Destination Definition', + DisplayName: 'Default Display Name', + Config: {}, + }, + Config: {}, + Enabled: true, + WorkspaceID: 'default-workspace', + Transformations: [], + RevisionID: 'default-revision', + IsProcessorEnabled: true, + IsConnectionEnabled: true, +}; + +// Utility function to migrate generic test cases +export function migrateTestCase(oldTestCase: any): TestCaseData { + return { + id: oldTestCase.id || `test-${Date.now()}`, + name: oldTestCase.name || 'Migrated Test Case', + description: oldTestCase.description || 'Migrated from legacy test case', + scenario: oldTestCase.scenario || 'Default scenario', + successCriteria: oldTestCase.successCriteria || 'Test should pass successfully', + feature: oldTestCase.feature || 'default-feature', + module: oldTestCase.module || 'default-module', + version: oldTestCase.version || '1.0.0', + input: { + request: { + method: oldTestCase.input?.request?.method || 'POST', + body: oldTestCase.input?.request?.body || {}, + headers: oldTestCase.input?.request?.headers || {}, + params: oldTestCase.input?.request?.params || {}, + }, + pathSuffix: oldTestCase.input?.pathSuffix, + }, + output: { + response: { + status: oldTestCase.output?.response?.status || 200, + body: oldTestCase.output?.response?.body || {}, + headers: oldTestCase.output?.response?.headers || {}, + }, + }, + }; +} + +// Utility function to migrate processor test cases +export function migrateProcessorTestCase(oldTestCase: any, index: number): ProcessorTestData { + const processorRequest: ProcessorTransformationRequest = { + message: oldTestCase.input?.request?.body[0]?.message || {}, + metadata: { ...defaultMetadata, ...oldTestCase.input?.request?.body[0]?.metadata }, + destination: { ...defaultDestination, ...oldTestCase.input?.request?.body[0]?.destination }, + }; + + const processorResponse: ProcessorTransformationResponse = { + output: oldTestCase.output?.response?.body[0]?.output, + metadata: { ...defaultMetadata, ...oldTestCase.output?.response?.body[0]?.metadata }, + statusCode: oldTestCase.output?.response?.body[0]?.statusCode || 200, + error: oldTestCase.output?.response?.body[0]?.error, + statTags: oldTestCase.output?.response?.body[0]?.statTags, + }; + + return removeUndefinedValues({ + id: oldTestCase.id || `processor-${Date.now()}`, + name: oldTestCase.name || 'Processor Test Case', + description: oldTestCase.description || 'Migrated processor test case', + scenario: oldTestCase.scenario || 'Default processor scenario', + successCriteria: oldTestCase.successCriteria || 'Processor test should pass successfully', + feature: oldTestCase.feature || 'processor', + module: oldTestCase.module || 'transformation', + version: oldTestCase.version || '1.0.0', + input: { + request: { + method: oldTestCase.input?.request?.method || 'POST', + body: [processorRequest], + }, + }, + output: { + response: { + status: 200, + body: [processorResponse], + }, + }, + mockFns: oldTestCase.mockFns ? `Add mock of index ${index}` : undefined, + }) as ProcessorTestData; +} + +// Utility function to migrate router test cases +export function migrateRouterTestCase(oldTestCase: any, index: number): RouterTestData { + const input = Array.isArray(oldTestCase.input.request.body.input) + ? oldTestCase.input.request.body.input.map((item: any) => ({ + message: item.message || {}, + metadata: { ...defaultMetadata, ...item.metadata }, + destination: { ...defaultDestination, ...item.destination }, + })) + : { + message: oldTestCase.input.request.body.input?.message || {}, + metadata: { ...defaultMetadata, ...oldTestCase.input.request.body.input?.metadata }, + destination: { + ...defaultDestination, + ...oldTestCase.input.request.body.input?.destination, + }, + }; + const routerRequest: RouterTransformationRequest = { + input: input, + destType: oldTestCase.input?.request?.body?.destType || 'default-destination-type', + }; + + const routerResponse: RouterTransformationResponse = oldTestCase.output.response.body.output.map( + (op) => { + return removeUndefinedValues({ + batchedRequest: op.batchedRequest, + metadata: op.metadata.map((m: any) => ({ ...defaultMetadata, ...m })), + statusCode: op.statusCode || 200, + destination: { ...defaultDestination, ...op.destination }, + batched: op.batched || false, + error: op.error, + statTags: op.statTags, + }); + }, + ); + + return removeUndefinedValues({ + id: oldTestCase.id || `router-${Date.now()}`, + name: oldTestCase.name || 'Router Test Case', + description: oldTestCase.description || 'Migrated router test case', + scenario: oldTestCase.scenario || 'Default router scenario', + successCriteria: oldTestCase.successCriteria || 'Router test should pass successfully', + feature: oldTestCase.feature || 'router', + module: oldTestCase.module || 'transformation', + version: oldTestCase.version || '1.0.0', + input: { + request: { + body: routerRequest, + method: oldTestCase.input?.request?.method || 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: routerResponse, + }, + }, + }, + mockFns: oldTestCase.mockFns ? `Add mock of index ${index}` : undefined, + }) as RouterTestData; +} + +// Utility function to migrate proxy test cases +export function migrateProxyTestCase(oldTestCase: any, index: number): ProxyV1TestData { + const proxyRequest: ProxyV1Request = { + version: oldTestCase.input?.request?.body?.version || '1.0.0', + type: oldTestCase.input?.request?.body?.type || 'default-type', + method: oldTestCase.input?.request?.body?.method || 'POST', + endpoint: oldTestCase.input?.request?.body?.endpoint || '/default-endpoint', + userId: oldTestCase.input?.request?.body?.userId || 'default-user', + metadata: [ + { + jobId: 1, + attemptNum: 1, + userId: 'default-user', + sourceId: 'default-source', + destinationId: 'default-destination', + workspaceId: 'default-workspace', + secret: {}, + dontBatch: false, + }, + ], + destinationConfig: {}, + }; + + return { + id: oldTestCase.id || `proxy-${Date.now()}`, + name: oldTestCase.name || 'Proxy Test Case', + description: oldTestCase.description || 'Migrated proxy test case', + scenario: oldTestCase.scenario || 'Default proxy scenario', + successCriteria: oldTestCase.successCriteria || 'Proxy test should pass successfully', + feature: oldTestCase.feature || 'proxy', + module: oldTestCase.module || 'delivery', + version: oldTestCase.version || '1.0.0', + input: { + request: { + body: proxyRequest, + method: oldTestCase.input?.request?.method || 'POST', + }, + }, + output: { + response: { + status: 200, + body: { + output: { + status: 200, + message: 'Success', + response: [ + { + error: '', + statusCode: 200, + metadata: proxyRequest.metadata[0], + }, + ], + }, + }, + }, + }, + }; +} + +interface CommonValues { + metadata?: Metadata; + destination?: Destination; + baseRequest?: { + headers?: Record; + params?: Record; + }; + commonConfig?: Record; +} + +function deepDiff(obj1: any, obj2: any): any { + const diff: any = {}; + + for (const key in obj1) { + if (typeof obj1[key] === 'object' && obj1[key] !== null) { + const nestedDiff = deepDiff(obj1[key], obj2[key] || {}); + if (Object.keys(nestedDiff).length > 0) { + diff[key] = nestedDiff; + } + } else if (obj1[key] !== obj2[key]) { + diff[key] = obj2[key]; + } + } + + return diff; +} + +export function extractCommonValues(testCases: any[]): CommonValues { + const commonValues: CommonValues = {}; + + // Only proceed if we have test cases + if (testCases.length === 0) return commonValues; + + // Extract metadata from first test case as base + const firstCase = testCases[0]; + let isMetadataCommon = true; + let isDestinationCommon = true; + let baseMetadata: Metadata | undefined; + let baseDestination: Destination | undefined; + + // For processor and router cases + if (firstCase.input?.request?.body) { + if (Array.isArray(firstCase.input.request.body)) { + baseMetadata = firstCase.input.request.body[0]?.metadata; + baseDestination = firstCase.input.request.body[0]?.destination; + } else { + baseMetadata = firstCase.input.request.body?.metadata; + baseDestination = firstCase.input.request.body?.destination; + } + } + + // Compare with other test cases + for (const testCase of testCases.slice(1)) { + let currentMetadata; + let currentDestination; + + if (testCase.input?.request?.body) { + if (Array.isArray(testCase.input.request.body)) { + currentMetadata = testCase.input.request.body[0]?.metadata; + currentDestination = testCase.input.request.body[0]?.destination; + } else { + currentMetadata = testCase.input.request.body?.metadata; + currentDestination = testCase.input.request.body?.destination; + } + } + + // Check if metadata is common + if (baseMetadata && currentMetadata) { + const metadataDiff = deepDiff(baseMetadata, currentMetadata); + if (Object.keys(metadataDiff).length > 0) { + isMetadataCommon = false; + } + } + + // Check if destination is common + if (baseDestination && currentDestination) { + const destinationDiff = deepDiff(baseDestination, currentDestination); + if (Object.keys(destinationDiff).length > 0) { + isDestinationCommon = false; + } + } + } + + if (isMetadataCommon && baseMetadata) { + commonValues.metadata = baseMetadata; + } + + if (isDestinationCommon && baseDestination) { + commonValues.destination = baseDestination; + } + + return commonValues; +} + +export function generateOptimizedTestFile( + testCases: any[], + commonValues: CommonValues, + feature: string, +): string { + const variables: string[] = []; + const imports: Set = new Set([]); + + // Add necessary imports based on common values + if (commonValues.metadata) imports.add('Metadata'); + if (commonValues.destination) imports.add('Destination'); + + // Generate common variables + if (commonValues.metadata) { + variables.push( + `const baseMetadata: Metadata = ${JSON.stringify(commonValues.metadata, null, 2)};`, + ); + } + + if (commonValues.destination) { + variables.push(` +const baseDestination: Destination = ${JSON.stringify(commonValues.destination, null, 2)};`); + } + + // Process test cases to use common variables + const processedTests = testCases.map((testCase) => { + const processedCase = { ...testCase }; + + if (commonValues.metadata && testCase.input?.request?.body) { + // Handle input metadata + if (Array.isArray(testCase.input.request.body)) { + processedCase.input.request.body = testCase.input.request.body.map((item: any) => ({ + ...item, + metadata: 'baseMetadata', // special marker + })); + } else { + processedCase.input.request.body.metadata = 'baseMetadata'; // special marker + processedCase.output.metadata = 'baseMetadata'; // special marker + } + // Handle output metadata + if (Array.isArray(testCase.output.response.body)) { + processedCase.output.response.body = testCase.output.response.body.map((item: any) => ({ + ...item, + metadata: 'baseMetadata', // special marker + })); + } else { + processedCase.output.response.body.metadata = 'baseMetadata'; // special marker + } + } + + if (commonValues.destination && testCase.input?.request?.body) { + // Handle input destination + if (Array.isArray(testCase.input.request.body)) { + processedCase.input.request.body = testCase.input.request.body.map((item: any) => ({ + ...item, + destination: 'baseDestination', // special marker + })); + } else { + processedCase.input.request.body.destination = 'baseDestination'; // special marker + } + // Handle output destination + if (Array.isArray(testCase.output.response.body)) { + processedCase.output.response.body = testCase.output.response.body.map((item: any) => ({ + ...item, + metadata: 'baseMetadata', // special marker + })); + } else { + processedCase.output.response.body.metadata = 'baseMetadata'; // special marker + } + } + + return processedCase; + }); + + // const functionReplacer = (key, value) => { + // if (typeof value === 'function') { + // return value.toString(); + // } + // return value; + // }; + + let type = ''; + if (feature === 'processor') { + type = 'ProcessorTestData'; + } else if (feature === 'router') { + type = 'RouterTestData'; + } + + // Generate the final file content + const content = `/** + * Auto-migrated and optimized test cases + * Generated on: ${new Date().toISOString()} + */ + + import { ${type} } from '../../../testTypes'; + import { ${Array.from(imports).join(', ')} } from '../../../../../src/types'; + + ${variables.join('\n')} + + export const data: ${type}[] = ${JSON.stringify(processedTests, null, 2)}; + `; + + // Replace our special markers with actual variable references + return content + .replaceAll('"baseMetadata"', 'baseMetadata') + .replaceAll('"baseDestination"', 'baseDestination'); +} diff --git a/test/scripts/removeRedundentFunctionsFromSecrets.ts b/test/scripts/removeRedundentFunctionsFromSecrets.ts new file mode 100644 index 00000000000..0419c32d68d --- /dev/null +++ b/test/scripts/removeRedundentFunctionsFromSecrets.ts @@ -0,0 +1,73 @@ +#!/usr/bin/env node +/** + * This script will: + * 1. Find all .js and .ts files (except in node_modules). + * 2. For any file with “maskedSecrets” in its path, update the export declarations: + * - Convert “export const getAuthHeader_N = () => …;” to “export const authHeaderN = …;” + * - Convert “export const getSecret_N = () => …;” to “export const secretN = …;” + * (Also update inner calls from getSecret_N() to secretN.) + * 3. For all files, update import statements and function usages. + */ + +import fs from 'fs'; +import { globSync } from 'glob'; +import path from 'path'; + +const updateFileContent = (content: string, filePath: string) => { + let newContent = content; + + // --- 1. Update export declarations in maskedSecrets files --- + if (filePath.includes('maskedSecrets')) { + // Replace getAuthHeader declarations + newContent = newContent.replace( + /export\s+const\s+getAuthHeader_(\d+)\s*=\s*\(\)\s*=>\s*(.+);/g, + (match, num, body) => { + // Update inner reference from getSecret_N() to secretN + const modifiedBody = body.replace(/getSecret_(\d+)\(\)/g, 'secret$1'); + // Remove the "get" part and also remove the underscore before the number + return `export const authHeader${num} = ${modifiedBody};`; + }, + ); + + // Replace getSecret declarations + newContent = newContent.replace( + /export\s+const\s+getSecret_(\d+)\s*=\s*\(\)\s*=>\s*(.+);/g, + (match, num, body) => { + return `export const secret${num} = ${body};`; + }, + ); + } + + // --- 2. Update import statements and usage in all files --- + // Replace function call usages: e.g. getAuthHeader_1() -> authHeader1 and getSecret_1() -> secret1 + newContent = newContent + .replace(/getAuthHeader_(\d+)\s*\(\)/g, 'authHeader$1') + .replace(/getSecret_(\d+)\s*\(\)/g, 'secret$1') + // Also update any identifier (such as in import lists) so that the "get" prefix is removed. + .replace(/\bgetAuthHeader_(\d+)\b/g, 'authHeader$1') + .replace(/\bgetSecret_(\d+)\b/g, 'secret$1'); + + return newContent; +}; + +// Find all maskedSecrets.ts files matching the pattern. +const maskedSecretsFiles = globSync( + path.join(__dirname, '..', 'integrations', 'destinations', '**', '*.ts'), +); + +maskedSecretsFiles.forEach((filePath) => { + fs.readFile(filePath, 'utf8', (err, data) => { + if (err) { + console.error('Error reading file:', filePath, err); + return; + } + const updatedContent = updateFileContent(data, filePath); + fs.writeFile(filePath, updatedContent, 'utf8', (err) => { + if (err) { + console.error('Error writing file:', filePath, err); + } else { + console.log('File updated successfully:', filePath); + } + }); + }); +}); diff --git a/test/test_reporter/allureReporter.ts b/test/test_reporter/allureReporter.ts new file mode 100644 index 00000000000..3165aaa96a7 --- /dev/null +++ b/test/test_reporter/allureReporter.ts @@ -0,0 +1,134 @@ +import * as allure from 'allure-js-commons'; +import { diff as jsonDiff } from 'jest-diff'; +import _ from 'lodash'; +import { TestCaseData } from '../integrations/testTypes'; +import { compareObjects } from '../integrations/testUtils'; + +interface TestReportData { + testCase: TestCaseData; + actualResponse: any; + status: 'passed' | 'failed'; + diff?: string; +} + +/** + * Enhanced test reporter with detailed JSON diff and Allure integration + */ +export const enhancedTestReport = { + /** + * Generate a detailed test report with JSON diff for failed cases + */ + generateDetailedReport(data: TestReportData) { + const { testCase, actualResponse, status } = data; + const expectedResponse = testCase.output.response?.body; + + // Create Allure test case details + allure.description(` + Feature: ${testCase.feature} + Description: ${testCase.description} + Success Criteria: ${testCase.successCriteria || 'N/A'} + Scenario: ${testCase.scenario || 'N/A'} + Test ID: ${testCase.id || 'N/A'} + API Version: ${testCase.version || 'N/A'} + `); + + // Add request/response as attachments + allure.attachment( + 'Request', + JSON.stringify(testCase.input.request, null, 2), + 'application/json', + ); + allure.attachment( + 'Actual Response', + JSON.stringify(actualResponse, null, 2), + 'application/json', + ); + + if (status === 'failed') { + const diffResult = jsonDiff(expectedResponse, actualResponse, { + expand: false, // Compact diff view + contextLines: 3, // Show 3 lines of context around changes + }); + + const diffKeys = compareObjects(expectedResponse, actualResponse); + + if (diffResult) { + allure.attachment( + 'Expected Response', + JSON.stringify(expectedResponse, null, 2), + 'application/json', + ); + + allure.attachment('Diff Keys', JSON.stringify(diffKeys), 'text/plain'); + } + + // Add failure details + const failureMessage = `Test failed for ${testCase.name}\nSee JSON diff for details`; + allure.step(failureMessage, () => { + throw new Error(failureMessage); + }); + } + + return status; + }, + + /** + * Validate test case response with enhanced reporting + */ + validateTestResponse(testCase: TestCaseData, response: any): boolean { + const expectedResponse = testCase.output.response?.body; + const actualResponse = response; + const status = _.isEqual(actualResponse, expectedResponse) ? 'passed' : 'failed'; + + this.generateDetailedReport({ + testCase, + actualResponse, + status, + }); + + return status === 'passed'; + }, +}; + +/** + * Enhanced test utilities with better organization + */ +export const enhancedTestUtils = { + /** + * Setup test suite with Allure reporting + */ + setupTestSuite(testData: TestCaseData) { + allure.epic(testData.name); + allure.feature(testData.module); + allure.story(testData.feature); + allure.displayName(testData.description); + if (testData.scenario) { + allure.tag(testData.scenario); + } + if (testData.tags) { + allure.tags(...testData.tags); + } + if (testData.id) { + allure.allureId(testData.id); + } + }, + + /** + * Run pre-test preparations + */ + beforeTestRun(testCase: TestCaseData) { + allure.step('Test Setup', () => { + // Setup new test + this.setupTestSuite(testCase); + }); + }, + + /** + * Run post-test cleanup and reporting + */ + afterTestRun(testCase: TestCaseData, response: any) { + allure.step('Test Verification', () => { + return enhancedTestReport.validateTestResponse(testCase, response); + }); + }, +}; diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 00000000000..44502a8a371 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "dist"], + "include": ["src/**/*.ts", "test/**/*.ts"], + "compilerOptions": { + "outDir": "./dist-test" + } +}